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..2174d83 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'); @@ -54,11 +55,26 @@ export default function sendmessage(child: ChildProcessOrWorker, message: unknow } // cluster.fork(): child.process is process + if (child.process?.connected) { + debug('child is cluster.fork() process, send: %j', message); + return child.send!(message); + } + // childprocess.fork(): child is process - const connected = child.process ? child.process.connected : child.connected; + if (child.connected) { + 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); + } - if (connected) { - debug('child is process, send: %j', 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); + // 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); return child.send!(message); }