diff --git a/lib/internal/process/next_tick.js b/lib/internal/process/next_tick.js index e458ba6e5eb748..48a8b4a4b8fd81 100644 --- a/lib/internal/process/next_tick.js +++ b/lib/internal/process/next_tick.js @@ -281,7 +281,7 @@ function setupNextTick() { if (process._exiting) return; - if (triggerAsyncId === null) { + if (!Number.isSafeInteger(triggerAsyncId) || triggerAsyncId <= 0) { triggerAsyncId = async_hooks.initTriggerId(); } diff --git a/test/async-hooks/test-internal-nexttick-default-trigger.js b/test/async-hooks/test-internal-nexttick-default-trigger.js index 90e566b7063c46..5bd38c8a3a66a0 100644 --- a/test/async-hooks/test-internal-nexttick-default-trigger.js +++ b/test/async-hooks/test-internal-nexttick-default-trigger.js @@ -26,6 +26,11 @@ internal.nextTick(null, common.mustCall(function() { assert.strictEqual(async_hooks.triggerAsyncId(), rootAsyncId); })); +// internal default +internal.nextTick(undefined, common.mustCall(function() { + assert.strictEqual(async_hooks.triggerAsyncId(), rootAsyncId); +})); + // internal internal.nextTick(rootAsyncId + 1, common.mustCall(function() { assert.strictEqual(async_hooks.triggerAsyncId(), rootAsyncId + 1); diff --git a/test/parallel/test-http-outgoing-message-inheritance.js b/test/parallel/test-http-outgoing-message-inheritance.js new file mode 100644 index 00000000000000..05a241dc8bda00 --- /dev/null +++ b/test/parallel/test-http-outgoing-message-inheritance.js @@ -0,0 +1,32 @@ +'use strict'; + +const common = require('../common'); +const { OutgoingMessage } = require('http'); +const { Writable } = require('stream'); +const assert = require('assert'); + +// check that OutgoingMessage can be used without a proper Socket +// Fixes: https://github.com/nodejs/node/issues/14386 +// Fixes: https://github.com/nodejs/node/issues/14381 + +class Response extends OutgoingMessage { + constructor() { + super({ method: 'GET', httpVersionMajor: 1, httpVersionMinor: 1 }); + } + + _implicitHeader() {} +} + +const res = new Response(); +const ws = new Writable({ + write: common.mustCall((chunk, encoding, callback) => { + assert(chunk.toString().match(/hello world/)); + setImmediate(callback); + }) +}); + +res.socket = ws; +ws._httpMessage = res; +res.connection = ws; + +res.end('hello world'); diff --git a/test/parallel/test-http-server-response-standalone.js b/test/parallel/test-http-server-response-standalone.js new file mode 100644 index 00000000000000..7025c734b3103d --- /dev/null +++ b/test/parallel/test-http-server-response-standalone.js @@ -0,0 +1,27 @@ +'use strict'; + +const common = require('../common'); +const { ServerResponse } = require('http'); +const { Writable } = require('stream'); +const assert = require('assert'); + +// check that ServerResponse can be used without a proper Socket +// Fixes: https://github.com/nodejs/node/issues/14386 +// Fixes: https://github.com/nodejs/node/issues/14381 + +const res = new ServerResponse({ + method: 'GET', + httpVersionMajor: 1, + httpVersionMinor: 1 +}); + +const ws = new Writable({ + write: common.mustCall((chunk, encoding, callback) => { + assert(chunk.toString().match(/hello world/)); + setImmediate(callback); + }) +}); + +res.assignSocket(ws); + +res.end('hello world');