Skip to content

Commit 38a1cfb

Browse files
zimbabaoaddaleax
authored andcommitted
v8: add a js class for Serializer/Dserializer
Calling Serializer/Deserializer without new crashes node. Adding a js class which just inherits cpp bindings. Added regression tests. Fixes: #13326 PR-URL: #13541 Reviewed-By: Refael Ackermann <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent 68c0518 commit 38a1cfb

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

lib/v8.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,21 @@
1515
'use strict';
1616

1717
const { Buffer } = require('buffer');
18-
const { Serializer, Deserializer } = process.binding('serdes');
18+
const {
19+
Serializer: _Serializer,
20+
Deserializer: _Deserializer
21+
} = process.binding('serdes');
1922
const { copy } = process.binding('buffer');
2023
const { objectToString } = require('internal/util');
2124
const { FastBuffer } = require('internal/buffer');
2225

26+
// Calling exposed c++ functions directly throws exception as it expected to be
27+
// called with new operator and caused an assert to fire.
28+
// Creating JS wrapper so that it gets caught at JS layer.
29+
class Serializer extends _Serializer { }
30+
31+
class Deserializer extends _Deserializer { }
32+
2333
const {
2434
cachedDataVersionTag,
2535
setFlagsFromString,

test/parallel/test-v8-serdes.js

+12
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,15 @@ const objects = [
131131

132132
assert.deepStrictEqual(v8.deserialize(buf), expectedResult);
133133
}
134+
135+
{
136+
assert.throws(
137+
() => { v8.Serializer(); },
138+
/^TypeError: Class constructor Serializer cannot be invoked without 'new'$/
139+
);
140+
141+
assert.throws(
142+
() => { v8.Deserializer(); },
143+
/^TypeError: Class constructor Deserializer cannot be invoked without 'new'$/
144+
);
145+
}

0 commit comments

Comments
 (0)