Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/internal/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ class Worker extends EventEmitter {
}

postMessage(...args) {
if (this[kPublicPort] === null) return;

this[kPublicPort].postMessage(...args);
}

Expand Down Expand Up @@ -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;
}
}
Expand Down
38 changes: 38 additions & 0 deletions test/parallel/test-worker-safe-getters.js
Original file line number Diff line number Diff line change
@@ -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).
assert.doesNotThrow(() => w.postMessage('foobar'));
assert.doesNotThrow(() => w.ref());
assert.doesNotThrow(() => w.unref());

// Although not browser specific, probably wise to
// make sure the stream getters don't throw either.
assert.doesNotThrow(() => w.stdin);
assert.doesNotThrow(() => w.stdout);
assert.doesNotThrow(() => w.stderr);

// Sanity check.
assert.strictEqual(w.threadId, -1);
assert.strictEqual(w.stdin, null);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: this also checks that w.stdin does not throw. Can the one above be removed?

assert.strictEqual(w.stdout, null);
assert.strictEqual(w.stderr, null);
}));
} else {
process.exit(0);
}