Skip to content

Commit ee57e93

Browse files
authored
feat: support custom decode handler (#119)
1 parent 3f0b392 commit ee57e93

7 files changed

Lines changed: 149 additions & 15 deletions

File tree

.autod.conf.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ module.exports = {
1313
'istanbul',
1414
],
1515
semver: [
16+
'byte@1',
17+
'debug@3',
1618
'mocha@3',
1719
],
18-
};
20+
};

index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,8 @@ exports.encode = function encode(obj, version) {
4646
encoder.reset();
4747
return encoder.write(obj).get();
4848
};
49+
50+
var custom = require('./lib/custom_handler');
51+
52+
exports.registerDecodeHandler = custom.registerDecodeHandler;
53+
exports.deregisterDecodeHandler= custom.deregisterDecodeHandler;

lib/custom_handler.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
'use strict';
2+
3+
var assert = require('assert');
4+
5+
var handlers = {};
6+
7+
function deregisterDecodeHandler(className) {
8+
delete handlers[className];
9+
}
10+
11+
function registerDecodeHandler(className, handler) {
12+
assert(typeof handler === 'function', 'handler should be a function');
13+
handlers[className] = handler;
14+
}
15+
16+
function handle(result, withType) {
17+
var className = result.$class;
18+
var handler = handlers[className];
19+
20+
if (handler) {
21+
result = handler(result);
22+
}
23+
return withType ? result : result.$;
24+
}
25+
26+
exports.handle = handle;
27+
exports.registerDecodeHandler = registerDecodeHandler;
28+
exports.deregisterDecodeHandler = deregisterDecodeHandler;

lib/v1/decoder.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var ByteBuffer = require('byte');
55
var is = require('is-type-of');
66
var utils = require('../utils');
77
var object = require('../object');
8+
var handle = require('../custom_handler').handle;
89
var JavaExceptionError = object.JavaExceptionError;
910
var supportES6Map = require('../utils').supportES6Map;
1011

@@ -417,7 +418,7 @@ proto.readObject = function (withType) {
417418
result.$ = new JavaExceptionError(result, withType);
418419
}
419420

420-
return withType ? result : result.$;
421+
return handle(result, withType);
421422
};
422423

423424
utils.addByteCodes(BYTE_CODES, [

lib/v2/decoder.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var is = require('is-type-of');
55
var debug = require('debug')('hessian:v2:decoder');
66
var DecoderV1 = require('../v1/decoder');
77
var utils = require('../utils');
8+
var handle = require('../custom_handler').handle;
89
var JavaExceptionError = require('../object').JavaExceptionError;
910
var supportES6Map = require('../utils').supportES6Map;
1011

@@ -612,7 +613,7 @@ proto.readObject = function (withType) {
612613
result.$ = new JavaExceptionError(result, withType);
613614
}
614615

615-
return withType ? result : result.$;
616+
return handle(result, withType);
616617
};
617618

618619
utils.addByteCodes(BYTE_CODES, [
@@ -777,7 +778,7 @@ proto.readHashMap = function (withType) {
777778
var result = {};
778779
this._addRef(result);
779780
this._readMap(result, withType);
780-
return result;
781+
return handle({ $class: 'java.util.HashMap', $: result }, withType);
781782
};
782783

783784
utils.addByteCodes(BYTE_CODES, [
@@ -820,7 +821,7 @@ proto.readMap = function (withType) {
820821
var map = {};
821822
this._addRef(map);
822823
this._readMap(map);
823-
return map;
824+
return handle({ $class: 'java.util.HashMap', $: map }, withType);
824825
}
825826

826827
var result = {
@@ -836,7 +837,7 @@ proto.readMap = function (withType) {
836837
result.$ = new JavaExceptionError(result);
837838
}
838839

839-
return withType ? result : result.$;
840+
return handle(result, withType);
840841
};
841842

842843
utils.addByteCodes(BYTE_CODES, [

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,20 @@
3434
},
3535
"homepage": "https://github.com/node-modules/hessian.js",
3636
"dependencies": {
37-
"byte": "^1.3.0",
38-
"debug": "^3.1.0",
39-
"is-type-of": "^1.2.0",
40-
"long": "^3.2.0",
41-
"utility": "^1.13.1"
37+
"byte": "^1.4.1",
38+
"debug": "^3.2.6",
39+
"is-type-of": "^1.2.1",
40+
"long": "^4.0.0",
41+
"utility": "^1.16.1"
4242
},
4343
"devDependencies": {
44-
"autod": "^3.0.1",
44+
"autod": "^3.1.0",
4545
"beautify-benchmark": "^0.2.4",
4646
"benchmark": "^2.1.4",
4747
"istanbul": "^0.4.5",
48-
"js-to-java": "^2.4.0",
49-
"jshint": "^2.9.5",
50-
"mm": "^2.2.0",
48+
"js-to-java": "^2.6.1",
49+
"jshint": "^2.10.2",
50+
"mm": "^2.5.0",
5151
"mocha": "^3.5.3"
5252
},
5353
"engines": {

test/custom_handler.test.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
'use strict';
2+
3+
var assert = require('assert');
4+
var hessian = require('../');
5+
var supportES6Map = require('../lib/utils').supportES6Map;
6+
7+
describe('utils.test.js', function () {
8+
describe('v1.0', function () {
9+
it('should decode with custom handler', function () {
10+
hessian.registerDecodeHandler('java.math.BigDecimal', function (result) {
11+
return {
12+
$class: result.$class,
13+
$: result.$.value,
14+
};
15+
});
16+
var o = { $class: 'java.math.BigDecimal', $: { value: '100.06' } };
17+
var buf = hessian.encode(o, '1.0');
18+
var output = hessian.decode(buf, '1.0');
19+
assert(output === '100.06');
20+
hessian.deregisterDecodeHandler('java.math.BigDecimal');
21+
output = hessian.decode(buf, '1.0');
22+
assert.deepEqual(output, { value: '100.06' });
23+
});
24+
25+
if (!supportES6Map) {
26+
return;
27+
}
28+
29+
it('should decode map with custom handler', function () {
30+
hessian.registerDecodeHandler('java.util.HashMap', function (result) {
31+
return {
32+
$class: result.$class,
33+
$: result.$.$map,
34+
};
35+
});
36+
var map = new Map();
37+
map.set(1, 'fee');
38+
map.set(2, 'fie');
39+
map.set(3, 'foe');
40+
var buf = hessian.encode({
41+
$class: 'java.util.HashMap',
42+
$: map
43+
}, '1.0');
44+
var output = hessian.decode(buf, '1.0');
45+
assert(output instanceof Map);
46+
assert(output.get(1) === 'fee');
47+
assert(output.get(2) === 'fie');
48+
assert(output.get(3) === 'foe');
49+
hessian.deregisterDecodeHandler('java.util.HashMap');
50+
});
51+
});
52+
53+
describe('v2.0', function () {
54+
it('should decode with custom handler', function () {
55+
hessian.registerDecodeHandler('java.math.BigDecimal', function (result) {
56+
return {
57+
$class: result.$class,
58+
$: result.$.value,
59+
};
60+
});
61+
var o = { $class: 'java.math.BigDecimal', $: { value: '100.06' } };
62+
var buf = hessian.encode(o, '2.0');
63+
var output = hessian.decode(buf, '2.0');
64+
assert(output === '100.06');
65+
hessian.deregisterDecodeHandler('java.math.BigDecimal');
66+
output = hessian.decode(buf, '2.0');
67+
assert.deepEqual(output, { value: '100.06' });
68+
});
69+
70+
if (!supportES6Map) {
71+
return;
72+
}
73+
74+
it('should decode map with custom handler', function () {
75+
hessian.registerDecodeHandler('java.util.HashMap', function (result) {
76+
return {
77+
$class: result.$class,
78+
$: result.$.$map,
79+
};
80+
});
81+
var map = new Map();
82+
map.set(1, 'fee');
83+
map.set(2, 'fie');
84+
map.set(3, 'foe');
85+
var buf = hessian.encode({
86+
$class: 'java.util.HashMap',
87+
$: map
88+
}, '2.0');
89+
var output = hessian.decode(buf, '2.0');
90+
assert(output instanceof Map);
91+
assert(output.get(1) === 'fee');
92+
assert(output.get(2) === 'fie');
93+
assert(output.get(3) === 'foe');
94+
hessian.deregisterDecodeHandler('java.util.HashMap');
95+
});
96+
});
97+
});

0 commit comments

Comments
 (0)