diff options
author | Yael Hermon <yaelhe@wix.com> | 2019-01-04 20:02:25 +0200 |
---|---|---|
committer | Daniel Bevenius <daniel.bevenius@gmail.com> | 2019-01-18 05:39:58 +0100 |
commit | 01cd21973b26a2cbacbe143c5983cb4adf8e7681 (patch) | |
tree | 16d2712ba9e73dfdb9612acbcde6e0bd8423e097 /lib/internal | |
parent | 74562356db6964f8057ef4bd897725793e55d513 (diff) | |
download | android-node-v8-01cd21973b26a2cbacbe143c5983cb4adf8e7681.tar.gz android-node-v8-01cd21973b26a2cbacbe143c5983cb4adf8e7681.tar.bz2 android-node-v8-01cd21973b26a2cbacbe143c5983cb4adf8e7681.zip |
worker: enable passing command line flags
This PR adds the ability to provide Workers with their own
execArgv flags in replacement of the main thread's execArgv. Only
per-Isolate/per-Environment options are allowed. Per-Process options
and V8 flags are not allowed. Passing an empty execArgv array will
reset per-Isolate and per-Environment options of the Worker to their
defaults. If execArgv option is not passed, the Worker will get
the same flags as the main thread.
Usage example:
```
const worker = new Worker(__filename, {
execArgv: ['--trace-warnings'],
});
```
PR-URL: https://github.com/nodejs/node/pull/25467
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'lib/internal')
-rw-r--r-- | lib/internal/errors.js | 3 | ||||
-rw-r--r-- | lib/internal/worker.js | 13 |
2 files changed, 14 insertions, 2 deletions
diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 12b01ffb9b..b33cd27109 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -992,6 +992,9 @@ E('ERR_VM_MODULE_NOT_LINKED', E('ERR_VM_MODULE_NOT_MODULE', 'Provided module is not an instance of Module', Error); E('ERR_VM_MODULE_STATUS', 'Module status %s', Error); +E('ERR_WORKER_INVALID_EXEC_ARGV', (errors) => + `Initiated Worker with invalid execArgv flags: ${errors.join(', ')}`, + Error); E('ERR_WORKER_PATH', 'The worker script filename must be an absolute path or a relative ' + 'path starting with \'./\' or \'../\'. Received "%s"', diff --git a/lib/internal/worker.js b/lib/internal/worker.js index 2e1568a738..e20a37af8a 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -8,6 +8,8 @@ const { ERR_WORKER_PATH, ERR_WORKER_UNSERIALIZABLE_ERROR, ERR_WORKER_UNSUPPORTED_EXTENSION, + ERR_WORKER_INVALID_EXEC_ARGV, + ERR_INVALID_ARG_TYPE, } = require('internal/errors').codes; const { validateString } = require('internal/validators'); @@ -49,7 +51,11 @@ class Worker extends EventEmitter { super(); debug(`[${threadId}] create new worker`, filename, options); validateString(filename, 'filename'); - + if (options.execArgv && !Array.isArray(options.execArgv)) { + throw new ERR_INVALID_ARG_TYPE('options.execArgv', + 'array', + options.execArgv); + } if (!options.eval) { if (!path.isAbsolute(filename) && !filename.startsWith('./') && @@ -68,7 +74,10 @@ class Worker extends EventEmitter { const url = options.eval ? null : pathToFileURL(filename); // Set up the C++ handle for the worker, as well as some internal wiring. - this[kHandle] = new WorkerImpl(url); + this[kHandle] = new WorkerImpl(url, options.execArgv); + if (this[kHandle].invalidExecArgv) { + throw new ERR_WORKER_INVALID_EXEC_ARGV(this[kHandle].invalidExecArgv); + } this[kHandle].onexit = (code) => this[kOnExit](code); this[kPort] = this[kHandle].messagePort; this[kPort].on('message', (data) => this[kOnMessage](data)); |