fix(ext/node): keep event loop alive for worker message listeners after unref#33076
Open
bartlomieju wants to merge 1 commit intomainfrom
Open
fix(ext/node): keep event loop alive for worker message listeners after unref#33076bartlomieju wants to merge 1 commit intomainfrom
bartlomieju wants to merge 1 commit intomainfrom
Conversation
…er unref worker.unref() was unconditionally unrefing the message receive promise, causing the event loop to exit even when there were active "message" listeners. This didn't match Node.js behavior where message listeners keep the event loop alive regardless of the worker's ref state. Track whether there are "message" listeners and keep the message promise refed as long as listeners exist. Override on/off/addListener/ removeListener/removeAllListeners to update the ref state when message listeners are added or removed. Closes #33061 Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
worker.unref()was unconditionally unrefing the message receive promise, causing the event loop to exit even when there were activemessagelistenersmessagelisteners and keeps the message promise refed as long as listeners exist, matching Node.js behavioron/off/addListener/removeListener/removeAllListenersto update the ref state when message listeners changeCloses #33061
Test plan
./x test-node worker_threads_testpassesunref()without message listeners still allows process exitonce('message')correctly unrefs after the listener fires🤖 Generated with Claude Code