From 87caee5bc82c40b7114a476273ccbf0c7861c3b8 Mon Sep 17 00:00:00 2001 From: "Etienne Rossignon (Sterfive)" Date: Wed, 18 May 2022 08:54:47 +0200 Subject: [PATCH] fix: callbackify resulting function should have one more argument --- test/browser/callbackify.js | 15 +++++++++++++++ test/node/callbackify.js | 26 ++++++++++++++++++++++++++ util.js | 5 +++-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/test/browser/callbackify.js b/test/browser/callbackify.js index ea05089..0f0ac26 100644 --- a/test/browser/callbackify.js +++ b/test/browser/callbackify.js @@ -167,3 +167,18 @@ test('util.callbackify non-function inputs throw', function (t) { }); t.end(); }); + +test('util.callbackify resulting function should have one more argument', function (t) { + // Test that resulting function should have one more argument + [ + function() { }, + function(a) { }, + function(a, b) { } + ].forEach(function (fct) { + + var callbackified = callbackify(fct); + t.strictEqual(callbackified.length, fct.length + 1, "callbackified function should have one more argument"); + }); + t.end(); +}); + diff --git a/test/node/callbackify.js b/test/node/callbackify.js index 8da100a..9603c10 100644 --- a/test/node/callbackify.js +++ b/test/node/callbackify.js @@ -193,3 +193,29 @@ if (false) { if (require('is-async-supported')()) { require('./callbackify-async'); } + +(function callbackify_resulting_function_should_have_one_more_argument() { + + var nodeJSVersion = parseInt(process.version.substring(1,3),10); + + console.log("Testing callbackify resulting function should have one more argument") + var original_callbackify = require('util').callbackify; + // Test that resulting function should have one more argument + [ + function(){ }, + function(a){ }, + function(a, b) { } + ].forEach(function (fct) { + + var node_callbackified = original_callbackify(fct); + var browser_callbackified = callbackify(fct); + + if (nodeJSVersion >= 12 && node_callbackified.length !== fct.length + 1) { + // this behavior is only true with node 12 and above, where the bug was fixed + throw new Error("callbackified function should have one more argument"); + } + if (browser_callbackified.length !== node_callbackified.length) { + throw new Error("callbackified function should have one more argument, like in node"); + } + }); +})(); diff --git a/util.js b/util.js index 6eea657..933c1e4 100644 --- a/util.js +++ b/util.js @@ -708,8 +708,9 @@ function callbackify(original) { } Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original)); - Object.defineProperties(callbackified, - getOwnPropertyDescriptors(original)); + const desc = getOwnPropertyDescriptors(original); + desc.length.value += 1; + Object.defineProperties(callbackified, desc); return callbackified; } exports.callbackify = callbackify;