worker: remove ERR_CLOSED_MESSAGE_PORT

This aligns `MessagePort`s more with the web API.

Refs: https://github.com/nodejs/node/issues/26463

PR-URL: https://github.com/nodejs/node/pull/26487
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
Anna Henningsen 2019-03-07 10:18:03 +01:00
parent 6113ba96cb
commit a52aedeae0
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
4 changed files with 41 additions and 10 deletions

View File

@ -688,12 +688,6 @@ Used when a child process is being forked without specifying an IPC channel.
Used when the main process is trying to read data from the child process's Used when the main process is trying to read data from the child process's
STDERR/STDOUT, and the data's length is longer than the `maxBuffer` option. STDERR/STDOUT, and the data's length is longer than the `maxBuffer` option.
<a id="ERR_CLOSED_MESSAGE_PORT"></a>
### ERR_CLOSED_MESSAGE_PORT
There was an attempt to use a `MessagePort` instance in a closed
state, usually after `.close()` has been called.
<a id="ERR_CONSOLE_WRITABLE_STREAM"></a> <a id="ERR_CONSOLE_WRITABLE_STREAM"></a>
### ERR_CONSOLE_WRITABLE_STREAM ### ERR_CONSOLE_WRITABLE_STREAM
@ -1986,6 +1980,16 @@ A module file could not be resolved while attempting a [`require()`][] or
> Stability: 0 - Deprecated. These error codes are either inconsistent, or have > Stability: 0 - Deprecated. These error codes are either inconsistent, or have
> been removed. > been removed.
<a id="ERR_CLOSED_MESSAGE_PORT"></a>
### ERR_CLOSED_MESSAGE_PORT
<!-- YAML
added: v10.5.0
removed: REPLACEME
-->
There was an attempt to use a `MessagePort` instance in a closed
state, usually after `.close()` has been called.
<a id="ERR_HTTP2_FRAME_ERROR"></a> <a id="ERR_HTTP2_FRAME_ERROR"></a>
### ERR_HTTP2_FRAME_ERROR ### ERR_HTTP2_FRAME_ERROR
<!-- YAML <!-- YAML

View File

@ -42,7 +42,6 @@ void FatalException(v8::Isolate* isolate,
V(ERR_BUFFER_OUT_OF_BOUNDS, RangeError) \ V(ERR_BUFFER_OUT_OF_BOUNDS, RangeError) \
V(ERR_BUFFER_TOO_LARGE, Error) \ V(ERR_BUFFER_TOO_LARGE, Error) \
V(ERR_CANNOT_TRANSFER_OBJECT, TypeError) \ V(ERR_CANNOT_TRANSFER_OBJECT, TypeError) \
V(ERR_CLOSED_MESSAGE_PORT, Error) \
V(ERR_CONSTRUCT_CALL_REQUIRED, Error) \ V(ERR_CONSTRUCT_CALL_REQUIRED, Error) \
V(ERR_INVALID_ARG_VALUE, TypeError) \ V(ERR_INVALID_ARG_VALUE, TypeError) \
V(ERR_INVALID_ARG_TYPE, TypeError) \ V(ERR_INVALID_ARG_TYPE, TypeError) \
@ -86,7 +85,6 @@ void FatalException(v8::Isolate* isolate,
V(ERR_BUFFER_CONTEXT_NOT_AVAILABLE, \ V(ERR_BUFFER_CONTEXT_NOT_AVAILABLE, \
"Buffer is not available for the current Context") \ "Buffer is not available for the current Context") \
V(ERR_CANNOT_TRANSFER_OBJECT, "Cannot transfer object of unsupported type")\ V(ERR_CANNOT_TRANSFER_OBJECT, "Cannot transfer object of unsupported type")\
V(ERR_CLOSED_MESSAGE_PORT, "Cannot send data on closed MessagePort") \
V(ERR_CONSTRUCT_CALL_REQUIRED, "Cannot call constructor without `new`") \ V(ERR_CONSTRUCT_CALL_REQUIRED, "Cannot call constructor without `new`") \
V(ERR_INVALID_TRANSFER_OBJECT, "Found invalid object in transferList") \ V(ERR_INVALID_TRANSFER_OBJECT, "Found invalid object in transferList") \
V(ERR_MEMORY_ALLOCATION_FAILED, "Failed to allocate memory") \ V(ERR_MEMORY_ALLOCATION_FAILED, "Failed to allocate memory") \

View File

@ -729,7 +729,6 @@ void MessagePort::Start(const FunctionCallbackInfo<Value>& args) {
MessagePort* port; MessagePort* port;
ASSIGN_OR_RETURN_UNWRAP(&port, args.This()); ASSIGN_OR_RETURN_UNWRAP(&port, args.This());
if (!port->data_) { if (!port->data_) {
THROW_ERR_CLOSED_MESSAGE_PORT(env);
return; return;
} }
port->Start(); port->Start();
@ -741,7 +740,6 @@ void MessagePort::Stop(const FunctionCallbackInfo<Value>& args) {
CHECK(args[0]->IsObject()); CHECK(args[0]->IsObject());
ASSIGN_OR_RETURN_UNWRAP(&port, args[0].As<Object>()); ASSIGN_OR_RETURN_UNWRAP(&port, args[0].As<Object>());
if (!port->data_) { if (!port->data_) {
THROW_ERR_CLOSED_MESSAGE_PORT(env);
return; return;
} }
port->Stop(); port->Stop();

View File

@ -0,0 +1,31 @@
'use strict';
const common = require('../common');
const { MessageChannel } = require('worker_threads');
// Make sure that .start() and .stop() do not throw on closing/closed
// MessagePorts.
// Refs: https://github.com/nodejs/node/issues/26463
function dummy() {}
{
const { port1, port2 } = new MessageChannel();
port1.close(common.mustCall(() => {
port1.on('message', dummy);
port1.off('message', dummy);
port2.on('message', dummy);
port2.off('message', dummy);
}));
port1.on('message', dummy);
port1.off('message', dummy);
port2.on('message', dummy);
port2.off('message', dummy);
}
{
const { port1 } = new MessageChannel();
port1.on('message', dummy);
port1.close(common.mustCall(() => {
port1.off('message', dummy);
}));
}