Worker threads: the process keeps living on exception

  • 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.