From 16f78ffa71fd4cfc8e0f2557bb0ad6c6d91cb768 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 2 Sep 2018 17:30:20 +0200 Subject: [PATCH 1/6] worker: display MessagePort status in util.inspect() --- lib/internal/worker.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/internal/worker.js b/lib/internal/worker.js index a1abcff567d424..8444368d9a3c5e 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -125,6 +125,26 @@ MessagePort.prototype.close = function(cb) { const drainMessagePort = MessagePort.prototype.drain; delete MessagePort.prototype.drain; +Object.defineProperty(MessagePort.prototype, util.inspect.custom, { + enumerable: false, + writable: false, + value: function inspect() { + let ref; + try { + // This may throw when `this` does not refer to a native object, + // e.g. when accessing the prototype directly. + ref = this.hasRef(); + } catch { return this; } + return Object.assign(Object.create(MessagePort.prototype), + ref === undefined ? { + active: false, + } : { + active: true, + refed: ref + }, this); + } +}); + function setupPortReferencing(port, eventEmitter, eventName) { // Keep track of whether there are any workerMessage listeners: // If there are some, ref() the channel so it keeps the event loop alive. From 257228ca218ef4fe553b79ae266a282e96318e19 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 2 Sep 2018 17:30:45 +0200 Subject: [PATCH 2/6] test: fix flaky test-worker-message-port-transfer-self Look at the status of the `MessagePort` rather than relying on a timeout. --- .../test-worker-message-port-transfer-self.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-worker-message-port-transfer-self.js b/test/parallel/test-worker-message-port-transfer-self.js index 1855023cdfae04..25ae0612966e7b 100644 --- a/test/parallel/test-worker-message-port-transfer-self.js +++ b/test/parallel/test-worker-message-port-transfer-self.js @@ -3,6 +3,7 @@ const common = require('../common'); const assert = require('assert'); +const util = require('util'); const { MessageChannel } = require('worker_threads'); const { port1, port2 } = new MessageChannel(); @@ -25,9 +26,22 @@ assert.throws(common.mustCall(() => { // The failed transfer should not affect the ports in anyway. port2.onmessage = common.mustCall((message) => { assert.strictEqual(message, 2); + + assert(util.inspect(port1).includes('active: true'), util.inspect(port1)); + assert(util.inspect(port2).includes('active: true'), util.inspect(port2)); + port1.close(); - setTimeout(common.mustNotCall('The communication channel is still open'), - common.platformTimeout(1000)).unref(); + tick(10, () => { + assert(util.inspect(port1).includes('active: false'), util.inspect(port1)); + assert(util.inspect(port2).includes('active: false'), util.inspect(port2)); + }); }); port1.postMessage(2); + +function tick(n, cb) { + if (--n > 0) + return setImmediate(() => tick(n-1, cb)); + else + cb(); +} From 1556ba542e6b7a79c6fd199cd7bc387f36af52fa Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 2 Sep 2018 17:46:56 +0200 Subject: [PATCH 3/6] fixup! worker: display MessagePort status in util.inspect() --- lib/internal/worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/worker.js b/lib/internal/worker.js index 8444368d9a3c5e..80e898d0bdd164 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -128,7 +128,7 @@ delete MessagePort.prototype.drain; Object.defineProperty(MessagePort.prototype, util.inspect.custom, { enumerable: false, writable: false, - value: function inspect() { + value: function inspect() { // eslint-disable-line func-name-matching let ref; try { // This may throw when `this` does not refer to a native object, From e394fb37b3f3bb200359e6a85ce3fa07a8cb98d5 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 2 Sep 2018 17:47:01 +0200 Subject: [PATCH 4/6] fixup! test: fix flaky test-worker-message-port-transfer-self --- test/parallel/test-worker-message-port-transfer-self.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/parallel/test-worker-message-port-transfer-self.js b/test/parallel/test-worker-message-port-transfer-self.js index 25ae0612966e7b..3a208ed2f1719d 100644 --- a/test/parallel/test-worker-message-port-transfer-self.js +++ b/test/parallel/test-worker-message-port-transfer-self.js @@ -41,7 +41,7 @@ port1.postMessage(2); function tick(n, cb) { if (--n > 0) - return setImmediate(() => tick(n-1, cb)); + return setImmediate(() => tick(n - 1, cb)); else cb(); } From fb70a360b06057bdac60fdcd746d274d52ee15fe Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 2 Sep 2018 21:43:11 +0200 Subject: [PATCH 5/6] fixup! worker: display MessagePort status in util.inspect() --- lib/internal/worker.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/internal/worker.js b/lib/internal/worker.js index 80e898d0bdd164..402fc30b591d2d 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -141,7 +141,8 @@ Object.defineProperty(MessagePort.prototype, util.inspect.custom, { } : { active: true, refed: ref - }, this); + }, + this); } }); From 1db359c29f10ae6387f108b6220eaae4a2858a71 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sun, 2 Sep 2018 21:43:22 +0200 Subject: [PATCH 6/6] fixup! test: fix flaky test-worker-message-port-transfer-self --- test/parallel/test-worker-message-port-transfer-self.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-worker-message-port-transfer-self.js b/test/parallel/test-worker-message-port-transfer-self.js index 3a208ed2f1719d..4fe12c0a88d81d 100644 --- a/test/parallel/test-worker-message-port-transfer-self.js +++ b/test/parallel/test-worker-message-port-transfer-self.js @@ -40,8 +40,8 @@ port2.onmessage = common.mustCall((message) => { port1.postMessage(2); function tick(n, cb) { - if (--n > 0) - return setImmediate(() => tick(n - 1, cb)); + if (n > 0) + setImmediate(() => tick(n - 1, cb)); else cb(); }