Skip to content

Hanging when using MessagePort from ES customization hooks via --import #52846

Closed
@elliotgoodrich

Description

@elliotgoodrich

Version

v21.1.0

Platform

Microsoft Windows NT 10.0.22631.0 x64

Subsystem

No response

What steps will reproduce the bug?

Running node --import ./bootstrap.mjs ./index.mjs will hang with the following code.

// hooks.mjs
export async function initialize({ port }) {
  port.postMessage('initialize');
}
// bootstrap.mjs
import { register } from 'node:module';
import { MessageChannel } from 'node:worker_threads';

const { port1, port2 } = new MessageChannel();

port1.on('message', (msg) => {
  console.log(`msg = ${msg}`);
});

register('./hooks.mjs', {
  parentURL: import.meta.url,
  data: { port: port2 },
  transferList: [port2],
});
// index.mjs
console.log('Hello World');

How often does it reproduce? Is there a required condition?

Reproducible 100% of the time.

What is the expected behavior? Why is that the expected behavior?

For node to print

$ node --import ./bootstrap.mjs ./index.mjs
msg = initialize
Hello World

and return normally.

What do you see instead?

node hangs, but prints the expected to the console

$ node --import ./bootstrap.mjs ./index.mjs
msg = initialize
Hello World

Additional information

node returns normally and no longer hangs if

  1. port.close() is added after port.postMessage('initialize');,
  2. or, removing the call to port1.on('message', ...)

This code was taken and simplified from the example in the documentation here https://nodejs.org/api/module.html#initialize.

Metadata

Metadata

Assignees

No one assigned

    Labels

    loadersIssues and PRs related to ES module loaders

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions