From 9fd3aefa1eef0c323a793da83e9fc7b6bdee892e Mon Sep 17 00:00:00 2001 From: MK Date: Sat, 27 Sep 2025 22:06:31 +0800 Subject: [PATCH 1/5] feat: support vitest worker process --- .github/workflows/nodejs.yml | 2 +- .github/workflows/release.yml | 12 +++++++++--- src/index.ts | 16 ++++++++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index ca02190..7fbecf5 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -12,6 +12,6 @@ jobs: uses: node-modules/github-actions/.github/workflows/node-test.yml@master with: os: 'ubuntu-latest, macos-latest, windows-latest' - version: '16, 18.19.0, 18, 20, 22' + version: '16, 18.19.0, 18, 20, 22, 24' secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3263c70..e987fda 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,10 +3,16 @@ on: push: branches: [ master ] +permissions: + contents: write + deployments: write + issues: write + pull-requests: write + id-token: write + jobs: release: - name: Node.js - uses: node-modules/github-actions/.github/workflows/node-release.yml@master + name: NPM Release + uses: node-modules/github-actions/.github/workflows/npm-release.yml@master secrets: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} GIT_TOKEN: ${{ secrets.GIT_TOKEN }} diff --git a/src/index.ts b/src/index.ts index f58101d..ccb1539 100644 --- a/src/index.ts +++ b/src/index.ts @@ -54,11 +54,19 @@ export default function sendmessage(child: ChildProcessOrWorker, message: unknow } // cluster.fork(): child.process is process - // childprocess.fork(): child is process - const connected = child.process ? child.process.connected : child.connected; + if (child.process?.connected) { + debug('child is cluster.fork() process, send: %j', message); + return child.send!(message); + } - if (connected) { - debug('child is process, send: %j', message); + // childprocess.fork(): child is process + if (child.connected) { + if (process.env.VITEST === 'true' && process.env.VITEST_WORKER_ID) { + debug('child is vitest worker process, VITEST_WORKER_ID: %s, emit message: %j', + process.env.VITEST_WORKER_ID, message); + return setImmediate(child.emit.bind(child, 'message', message)); + } + debug('child is childprocess.fork() process, send: %j', message); return child.send!(message); } From 6d43f952e6dc6caa43dec3dfe9a20b52e43d44ac Mon Sep 17 00:00:00 2001 From: MK Date: Sat, 27 Sep 2025 22:25:04 +0800 Subject: [PATCH 2/5] FIXUP --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index ccb1539..f2028dd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,9 +62,9 @@ export default function sendmessage(child: ChildProcessOrWorker, message: unknow // childprocess.fork(): child is process if (child.connected) { if (process.env.VITEST === 'true' && process.env.VITEST_WORKER_ID) { - debug('child is vitest worker process, VITEST_WORKER_ID: %s, emit message: %j', + debug('child is vitest worker process, VITEST_WORKER_ID: %s, emit sendmessage-to-self: %j', process.env.VITEST_WORKER_ID, message); - return setImmediate(child.emit.bind(child, 'message', message)); + return setImmediate(child.emit.bind(child, 'sendmessage-to-self', message)); } debug('child is childprocess.fork() process, send: %j', message); return child.send!(message); From dcd4dcf0fb90be2a6de6eeaa7570d291eae906d2 Mon Sep 17 00:00:00 2001 From: MK Date: Sat, 27 Sep 2025 22:43:12 +0800 Subject: [PATCH 3/5] FIXUP --- src/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/index.ts b/src/index.ts index f2028dd..71adc78 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import { debuglog } from 'node:util'; import { isMainThread, parentPort } from 'node:worker_threads'; import { EventEmitter } from 'node:events'; +import cluster from 'node:cluster'; const debug = debuglog('sendmessage'); @@ -61,6 +62,13 @@ export default function sendmessage(child: ChildProcessOrWorker, message: unknow // childprocess.fork(): child is process if (child.connected) { + debug('child.connected: %s, cluster.isWorker: %s, cluster.isPrimary: %s', + child.connected, cluster.isWorker, cluster.isPrimary); + if (cluster.isWorker || cluster.isPrimary) { + debug('child is cluster.fork() process, send: %j', message); + return child.send!(message); + } + if (process.env.VITEST === 'true' && process.env.VITEST_WORKER_ID) { debug('child is vitest worker process, VITEST_WORKER_ID: %s, emit sendmessage-to-self: %j', process.env.VITEST_WORKER_ID, message); From 13f6f95d34a2d7ae4ebb258cd462579d294fb037 Mon Sep 17 00:00:00 2001 From: MK Date: Sat, 27 Sep 2025 22:45:29 +0800 Subject: [PATCH 4/5] FIXUP --- src/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 71adc78..eb22db0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,9 +62,8 @@ export default function sendmessage(child: ChildProcessOrWorker, message: unknow // childprocess.fork(): child is process if (child.connected) { - debug('child.connected: %s, cluster.isWorker: %s, cluster.isPrimary: %s', - child.connected, cluster.isWorker, cluster.isPrimary); - if (cluster.isWorker || cluster.isPrimary) { + debug('child.connected: %s, cluster.isWorker: %s', child.connected, cluster.isWorker); + if (cluster.isWorker) { debug('child is cluster.fork() process, send: %j', message); return child.send!(message); } From 107d83ac953bbd9cea6db594c9ec9071cdd092f3 Mon Sep 17 00:00:00 2001 From: MK Date: Sat, 27 Sep 2025 22:47:50 +0800 Subject: [PATCH 5/5] FIXUP --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index eb22db0..2174d83 100644 --- a/src/index.ts +++ b/src/index.ts @@ -71,6 +71,7 @@ export default function sendmessage(child: ChildProcessOrWorker, message: unknow if (process.env.VITEST === 'true' && process.env.VITEST_WORKER_ID) { debug('child is vitest worker process, VITEST_WORKER_ID: %s, emit sendmessage-to-self: %j', process.env.VITEST_WORKER_ID, message); + // use `sendmessage-to-self` event to send message to self, avoid vitest worker use the `message` event return setImmediate(child.emit.bind(child, 'sendmessage-to-self', message)); } debug('child is childprocess.fork() process, send: %j', message);