Chakra napi shim: throws from class constructors are swallowed (don't surface to JS)

Open
#175 0 comments 0 reactions 1 assignee View on GitHub

@bghgary is already working on this.

Since Jun 9, 2026.

Assessment

This issue has not been assessed yet.

Description

bug

On the Chakra backend, throwing a Napi::TypeError (or any Napi::Error) from a class constructor body — i.e. inside the function passed to Napi::ObjectWrap<T> / napi_define_class's callback — does not surface as a catchable JS exception. Instead the JS-side new MyClass() resolves to a half-constructed instance, so test code like expect(() => new (File as any)()).to.throw() silently fails.

This forces polyfills with required constructor arguments (WHATWG File, future Request, etc.) to either skip the WebIDL "missing required argument → TypeError" surface on Chakra, or omit the corresponding tests on Chakra.

Repro
class Foo : public Napi::ObjectWrap<Foo> {
public:
    static Napi::Function Init(Napi::Env env) {
        return DefineClass(env, "Foo", {});
    }
    Foo(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Foo>(info) {
        throw Napi::TypeError::New(info.Env(), "always throws");
    }
};

In JS on Chakra: expect(() => new Foo()).to.throw() fails — no exception is thrown.
On V8 and JSC: throws as expected.

Current workaround

In Polyfills/File/Tests/UnitTests/Scripts/tests.ts (introduced by #169), tests that assert the constructor throws on missing/invalid arguments are commented out with a TODO pointing here. They should be re-enabled atomically when this is fixed.

Likely root cause

The Chakra napi shim's ExternalCallback::Callback (in Core/Node-API/Source/js_native_api_chakra.cc) probably needs to translate env->last_exception into a JsRT exception via JsSetException before returning to the JsRT runtime when invoked in construct mode. The function-call path likely already does this; the constructor path appears not to.

Related
  • JsRH#172 (separate JSC napi shim quirk).
  • JsRH#169 (the PR that surfaced this).
Dominant language
C++
Stars
22
Forks
23
Avg merge
6d 17h
Merged PRs (30d)
5

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from BabylonJS/JsRuntimeHost

All issues in BabylonJS/JsRuntimeHost

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.