Closed
Description
- Version: v10.9.0
- Platform: Darwin 17.7.0 Darwin Kernel Version 17.7.0
- Subsystem:
The problem is related to Node.js worker threads: https://nodejs.org/api/worker_threads.html
The worker thread is spawned as illustrated in the following example:
// main.js
const {Worker} = require('worker_threads')
try {
new Worker('./worker.js', {
workerData: {fn: () => {}}
})
} catch (err) {
console.log(err)
}
And then this is the actual worker:
// worker.js
const {parentPort, workerData} = require('worker_threads')
console.log(workerData)
parentPort.postMessage('ok')
Now, worker threads do not support elements such as functions and classes in worker data and an exception is thrown when main.js is launched:
$ node --experimental-worker main.js
The output is this:
$ node --experimental-worker main.js
DataCloneError: () => {} could not be cloned.
at new Worker (internal/worker.js:269:17)
at Object.<anonymous> (/Users/wilk/Projects/mine/task/main.js:22:3)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:266:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
Unfortunately, the process keeps alive instead of dying.
However, if I prepend the v8 serialization before the worker instantiation, then it terminates as expected:
// main.js
const {Worker} = require('worker_threads')
const v8 = require('v8')
try {
v8.serialize({fn: () => {}})
new Worker('./worker.js', {
workerData: {fn: () => {}}
})
} catch (err) {
console.log(err)
}
I think the issue is with v8 serialization's error handling inside the Worker's constructor.