diff --git a/lib/v8.js b/lib/v8.js index e5b31564ad63c7..ba95c98dadc1ee 100644 --- a/lib/v8.js +++ b/lib/v8.js @@ -15,11 +15,21 @@ 'use strict'; const { Buffer } = require('buffer'); -const { Serializer, Deserializer } = process.binding('serdes'); +const { + Serializer: _Serializer, + Deserializer: _Deserializer +} = process.binding('serdes'); const { copy } = process.binding('buffer'); const { objectToString } = require('internal/util'); const { FastBuffer } = require('internal/buffer'); +// Calling exposed c++ functions directly throws exception as it expected to be +// called with new operator and caused an assert to fire. +// Creating JS wrapper so that it gets caught at JS layer. +class Serializer extends _Serializer { } + +class Deserializer extends _Deserializer { } + const { cachedDataVersionTag, setFlagsFromString, diff --git a/test/parallel/test-v8-serdes.js b/test/parallel/test-v8-serdes.js index d3a879fc225353..806cbc5fc3414d 100644 --- a/test/parallel/test-v8-serdes.js +++ b/test/parallel/test-v8-serdes.js @@ -131,3 +131,15 @@ const objects = [ assert.deepStrictEqual(v8.deserialize(buf), expectedResult); } + +{ + assert.throws( + () => { v8.Serializer(); }, + /^TypeError: Class constructor Serializer cannot be invoked without 'new'$/ + ); + + assert.throws( + () => { v8.Deserializer(); }, + /^TypeError: Class constructor Deserializer cannot be invoked without 'new'$/ + ); +}