Skip to content

Errors emitted on worker are not native errors #48716

Open
@novemberborn

Description

@novemberborn

Version

20.4.0

Platform

Darwin user 22.5.0 Darwin Kernel Version 22.5.0: Thu Jun 8 22:22:20 PDT 2023; root:xnu-8796.121.3~7/RELEASE_ARM64_T6000 arm64 arm Darwin

Subsystem

worker_threads

What steps will reproduce the bug?

import {Worker} from 'node:worker_threads'
import {once} from 'node:events'
import types from 'node:util/types'

const worker = new Worker('setImmediate(() => { throw new Error("error"); })', {eval: true})
const [error] = await once(worker, 'message')

console.log(error instanceof Error) // true
console.log(types.isNativeError(error)) // false

How often does it reproduce? Is there a required condition?

Always, as long as the error is emitted by the error event on the worker. Any errors sent via postMessage() are identified correctly.

What is the expected behavior? Why is that the expected behavior?

types.isNativeError() returns true for the emitted error.

What do you see instead?

types.isNativeError() returns false for the emitted error.

Additional information

The problem seems to be in the error deserialization:

return ObjectCreate(ctor.prototype, properties);

Reading the code, I believe it's roughly equivalent to:

const error = Object.create(Error.prototype, {message:{value:'foo'}})

According to the spec, merely extending the error prototype does not create a native error.

Of course, because it does extend the Error prototype, error instanceof Error returns true.

I don't have the context for why the serialization is so complex, but FWIW the built-in v8 serde does result in proper native error objects.

Metadata

Metadata

Assignees

No one assigned

    Labels

    errorsIssues and PRs related to JavaScript errors originated in Node.js core.workerIssues and PRs related to Worker support.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions