synckit
0.12.3 · 11 Oct 2026MIT28.3M / weekRepositorynpmAtom feed
59 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
- 0.12.x · latest line
0.12.3
11 Oct 2026Restore the npm provenance attestation on releases.
changesets3 publishes Yarn projects withyarn npm publish, which only writes a provenance statement whennpmPublishProvenance(orpublishConfig.provenance) asks for it, so0.12.0onwards shipped without npm's "Built and signed with provenance" badge.
0.12.2
11 Oct 2026Fix workers never starting under Yarn PnP since v0.12: the failure guard (
register.cjs) was preloaded ahead of the PnP API require inherited from Yarn, but the guard lives inside the project's package archive and cannot be read until.pnp.cjshas patched module resolution. The worker then died at startup with nothing left to report it, so everycreateSyncFncall waited inAtomics.wait()until its timeout. Under PnP the worker'sNODE_OPTIONSnow opens with the PnP API require and the guard follows it; every other inherited preload still loads after the guard, and the "already inherited" check scans the whole value so a nested worker does not add a second guard.
0.12.1
7 Oct 2026Use
node-fetch-nativefor the default globalfetchshim instead ofnode-fetch: it is a dual ESM/CommonJS package that prefers the nativefetchand only falls back to its own implementation, so the shim is no longer tied to the CommonJS-onlynode-fetchv2. The shim imports the namedfetchexport, becauserequire('node-fetch-native')is the module namespace rather than the function. If you enableSYNCKIT_GLOBAL_SHIMS, installnode-fetch-nativeinstead ofnode-fetch.
0.12.0
7 Oct 2026surface worker failures and exits instead of hanging forever in
Atomics.wait()A worker that never answers no longer leaves its caller blocked: a module graph that fails to load (a missing top-level import, a syntax error, a failing global shim), a throw after a top-level
await, a runtime failure while a call is in flight, and a worker that exits — through a handler that callsprocess.exit(), or on its own — are all reported to the caller instead.The guard now reaches a worker through its own
NODE_OPTIONSrather than itsexecArgv, so it is in place before a preload the worker inherits fromNODE_OPTIONS, which run first: a failure there reaches the caller like any other instead of being left to the call's deadline, or to no deadline at all. The worker's environment is passed explicitly to do that, and itsNODE_OPTIONSkeeps whatever it inherited, after the preload. A runtime that refuses that environment — Node 18 with--openssl-legacy-provider, Node 24 with--title, the set varies by version — makes the worker fall back to the inherited environment with the guard in itsexecArgvinstead, so the guard loads after preloads inherited throughNODE_OPTIONSand a failure in one of those is reported by nothing. synckit warns once per worker that takes that path, under theSYNCKIT_GUARD_ORDERINGcode, so the caller can bound the wait themselves withSYNCKIT_TIMEOUTor a timeout passed per call.This changes the failure semantics, which is why it is a minor. A call that used to hang now throws; a worker that swallows the failure in its own handler no longer lets the call in flight return normally; and a worker that fails fatally no longer takes the process down with it — the caller gets the failure instead, and later calls keep throwing it.
A worker which reached
runAsWorkerand still has a handler for the event keeps serving later calls: the guard reports the failure and re-arms rather than deciding for that handler, so the worker stays usable — it does not mean the handler ran. For a rejection, the guard's ownunhandledRejectionlistener is what keeps the runtime from promoting it under the defaultthrowmode, so a handler listening only onuncaughtExceptionnever sees it; understrictthe runtime promotes it anyway, and that handler does see it. Otherwise the failure is fatal for that synchronous function, and later calls keep throwing it rather than waiting on a worker which never registered, or which has nothing left to keep it alive.A recoverable failure only tells the caller that the worker can still serve; it does not stop the request that was in flight. A worker whose own handler absorbs the failure may still be running that request, so a retry can overlap it — a worker module holding state across calls has to expect that.
The timeout is now a single deadline for the whole call, and each wait receives only the time left of it. Previously every wait measured its own slice, so the time spent between waits was not counted and outdated responses could push the total wait past the timeout.
The module specifiers
encodeImportModulegenerates are escaped withJSON.stringifynow — double quotes and full escaping — where a single-quoted literal escaped only backslashes and quotes, so a path carrying a newline or another control character is emitted correctly instead of breaking the generated source.Breaking: the
INT32_BYTESexport is gone. It was reachable from the public entry point —src/index.tsre-exports the whole constants module — so an import of it that compiles onmainno longer compiles here. Nothing in the package used it, and the release stays aminorunder the 0.x convention rather than amajor.The
hasFlagutility now reads the flags the runtime applies —execArgvandNODE_OPTIONS, in either the--flag=valueor--flag valueform — and no longer counts a flag that is only a script argument, which Node does not apply.NODE_OPTIONSis now read the way the runtime reads it: split on spaces, with double quotes grouping and removed and a backslash escaping inside them, so a quoted value keeps its spaces and an unset variable is `` where a naive split gave[''].DataMessage<T>is now a discriminated union whose failure arm requireserror, so a reason that is present butundefinedis still a failure rather than a result, andpropertieson that arm is typedobjectinstead ofunknown.A reported failure carries the worker's reason exactly as it was thrown, even a falsy one; when its properties cannot cross the thread boundary the error is sent bare, and only a reason that cannot be cloned at all is replaced by a synthetic error that still names it.
Resolve global shims from the worker for both CommonJS and ESM: the CommonJS eval entry rebinds
requiretocreateRequire(workerPath), and the ESM entry resolves each shim against the worker's path and export conditions —@dual-bundle/import-meta-resolveundernode_modules,pnpapiunder Yarn PnP — and imports it as an absolute URL, instead of loading a generated file under the package's ownnode_modules. Availability is judged with that same resolver, and the conditions follow the worker'sexecArgv(node-addons,module-sync,--conditions) as well as this thread's.
- 0.11.x
0.11.0 – 0.11.1314 releases without a noteShow each
- 0.11.1328 May 2026no note
- 0.11.1214 Jan 2026no note
- 0.11.1119 Jul 2025no note
- 0.11.1018 Jul 2025no note
- 0.11.918 Jul 2025no note
- 0.11.830 May 2025no note
- 0.11.730 May 2025no note
- 0.11.617 May 2025no note
- 0.11.514 May 2025no note
- 0.11.414 Apr 2025no note
- 0.11.37 Apr 2025no note
- 0.11.24 Apr 2025no note
- 0.11.12 Apr 2025no note
- 0.11.02 Apr 2025no note
- 0.10.x
0.10.0 – 0.10.45 releases without a noteShow each
- 0.10.430 May 2025no note
- 0.10.324 Mar 2025no note
- 0.10.223 Mar 2025no note
- 0.10.123 Mar 2025no note
- 0.10.020 Mar 2025no note
- 0.9.x
0.9.0 – 0.9.34 releases without a noteShow each
- 0.9.330 May 2025no note
- 0.9.27 Oct 2024no note
- 0.9.114 Jul 2024no note
- 0.9.04 Jan 2024no note
- 0.8.x
0.8.0 – 0.8.89 releases without a noteShow each
- 0.8.826 Dec 2023no note
- 0.8.726 Dec 2023no note
- 0.8.61 Dec 2023no note
- 0.8.528 Jan 2023no note
- 0.8.429 Aug 2022no note
- 0.8.310 Aug 2022no note
- 0.8.210 Aug 2022no note
- 0.8.116 Jul 2022no note
- 0.8.016 Jul 2022no note
- 0.7.x
0.7.0 – 0.7.34 releases without a noteShow each
- 0.7.315 Jul 2022no note
- 0.7.22 Jul 2022no note
- 0.7.18 May 2022no note
- 0.7.05 Apr 2022no note
- 0.6.x
0.6.0 – 0.6.23 releases without a noteShow each
- 0.6.22 Apr 2022no note
- 0.6.12 Apr 2022no note
- 0.6.015 Oct 2021no note
- 0.5.x
0.5.0
29 Aug 2021- 0.4.x
0.4.0 – 0.4.12 releases without a noteShow each
- 0.4.114 Oct 2021no note
- 0.4.029 Aug 2021no note
- 0.3.x
0.3.1 – 0.3.44 releases without a noteShow each
- 0.3.413 Jul 2021no note
- 0.3.313 Jul 2021no note
- 0.3.213 Jul 2021no note
- 0.3.113 Jul 2021no note