0
0
mirror of https://github.com/nodejs/node.git synced 2024-11-30 15:30:56 +01:00

worker: no throw on property access/postMessage after termination

PR-URL: https://github.com/nodejs/node/pull/25871
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Yuta Hiroto <hello@hiroppy.me>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Christopher Jeffrey 2019-02-01 06:27:04 -08:00 committed by Anna Henningsen
parent e0a3d74135
commit 2fc759b9b8
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
2 changed files with 46 additions and 0 deletions

View File

@ -184,6 +184,8 @@ class Worker extends EventEmitter {
}
postMessage(...args) {
if (this[kPublicPort] === null) return;
this[kPublicPort].postMessage(...args);
}
@ -219,14 +221,20 @@ class Worker extends EventEmitter {
}
get stdin() {
if (this[kParentSideStdio] === null) return null;
return this[kParentSideStdio].stdin;
}
get stdout() {
if (this[kParentSideStdio] === null) return null;
return this[kParentSideStdio].stdout;
}
get stderr() {
if (this[kParentSideStdio] === null) return null;
return this[kParentSideStdio].stderr;
}
}

View File

@ -0,0 +1,38 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const { Worker, isMainThread } = require('worker_threads');
if (isMainThread) {
const w = new Worker(__filename, {
stdin: true,
stdout: true,
stderr: true
});
w.on('exit', common.mustCall((code) => {
assert.strictEqual(code, 0);
// `postMessage` should not throw after termination
// (this mimics the browser behavior).
w.postMessage('foobar');
w.ref();
w.unref();
// Although not browser specific, probably wise to
// make sure the stream getters don't throw either.
w.stdin;
w.stdout;
w.stderr;
// Sanity check.
assert.strictEqual(w.threadId, -1);
assert.strictEqual(w.stdin, null);
assert.strictEqual(w.stdout, null);
assert.strictEqual(w.stderr, null);
}));
} else {
process.exit(0);
}