diff --git a/src/handle_wrap.h b/src/handle_wrap.h index fbcea4ae4487f5..0dba27077801fe 100644 --- a/src/handle_wrap.h +++ b/src/handle_wrap.h @@ -61,7 +61,9 @@ class HandleWrap : public AsyncWrap { static void HasRef(const v8::FunctionCallbackInfo& args); static inline bool IsAlive(const HandleWrap* wrap) { - return wrap != nullptr && wrap->state_ != kClosed; + return wrap != nullptr && + wrap->IsDoneInitializing() && + wrap->state_ != kClosed; } static inline bool HasRef(const HandleWrap* wrap) { diff --git a/test/parallel/test-worker-message-port-inspect-during-init-hook.js b/test/parallel/test-worker-message-port-inspect-during-init-hook.js new file mode 100644 index 00000000000000..30b90710a604f1 --- /dev/null +++ b/test/parallel/test-worker-message-port-inspect-during-init-hook.js @@ -0,0 +1,21 @@ +'use strict'; +const common = require('../common'); +const util = require('util'); +const assert = require('assert'); +const async_hooks = require('async_hooks'); +const { MessageChannel } = require('worker_threads'); + +// Regression test: Inspecting a `MessagePort` object before it is finished +// constructing does not crash the process. + +async_hooks.createHook({ + init: common.mustCall((id, type, triggerId, resource) => { + assert.strictEqual(util.inspect(resource), + 'MessagePort { active: true, refed: false }'); + }, 2) +}).enable(); + +const { port1 } = new MessageChannel(); +const inspection = util.inspect(port1); +assert(inspection.includes('active: true')); +assert(inspection.includes('refed: false'));