fix(napi): disable reuseWorker in browser bindings (#25640)

Fixes #25610

AI assistance: Codex was used to implement this change.
This commit is contained in:
leaysgur committed 2026-08-14 11:11:20 +00:00
1 parent d55b76c7ab
commit db446518ca
16 files changed
+62 -11

No files matched your search

+17
View File
@@ -0,0 +1,17 @@
import fs from "node:fs";
const REUSED_WORKERS = "reuseWorker: { size: __asyncWorkPoolSize + __workerPoolSize },";
const DISABLED_REUSED_WORKERS = "reuseWorker: false,";
export function disableReusedWorkers(path) {
let data = fs.readFileSync(path, "utf-8");
// The pool is initialized eagerly, but browsers reject its worker URL when a binding is loaded
// from a cross-origin CDN because workers must be loaded from the page's origin.
if (data.includes(REUSED_WORKERS)) {
data = data.replace(REUSED_WORKERS, DISABLED_REUSED_WORKERS);
fs.writeFileSync(path, data);
} else if (!data.includes(DISABLED_REUSED_WORKERS)) {
throw new Error(`Could not find the reuseWorker option in ${path}`);
}
}
+1 -1
View File
@@ -565,7 +565,7 @@ try {
} = await __emnapiInstantiateNapiModule(__wasmFile, {
context: __emnapiContext,
asyncWorkPoolSize: __asyncWorkPoolSize,
reuseWorker: { size: __asyncWorkPoolSize + __workerPoolSize },
reuseWorker: false,
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],
wasi: __wasi,
onCreateWorker() {
+6 -1
View File
@@ -1,7 +1,12 @@
import fs from "node:fs";
import { join as pathJoin } from "node:path";
const path = pathJoin(import.meta.dirname, "../index.js");
import { disableReusedWorkers } from "../../disable-reused-workers.mjs";
const packageDir = pathJoin(import.meta.dirname, "..");
disableReusedWorkers(pathJoin(packageDir, "minify.wasi-browser.js"));
const path = pathJoin(packageDir, "index.js");
let data = fs.readFileSync(path, "utf-8");
data = data.replace(
+2 -1
View File
@@ -6,6 +6,7 @@ import { rolldown } from "rolldown";
// Rollup-compatible bundlers reserve `\0`-prefixed IDs for plugin virtual modules,
// so Rolldown will not try to resolve these generated `?url` asset modules as files.
const NEW_URL_ASSET_PREFIX = "\0new-url-asset:";
const WASI_BROWSER_BINDING = path.resolve("./src-js/parser.wasi-browser.js");
async function main() {
const args = parseArgs({
@@ -23,7 +24,7 @@ async function main() {
platform: "browser",
resolve: {
alias: {
"@oxc-parser/binding-wasm32-wasi": path.resolve("./src-js/parser.wasi-browser.js"),
"@oxc-parser/binding-wasm32-wasi": WASI_BROWSER_BINDING,
},
},
plugins: [
+7 -1
View File
@@ -1,6 +1,12 @@
import fs from "node:fs";
import { join as pathJoin } from "node:path";
const filename = "./src-js/bindings.js";
import { disableReusedWorkers } from "../../disable-reused-workers.mjs";
const packageDir = pathJoin(import.meta.dirname, "..");
disableReusedWorkers(pathJoin(packageDir, "src-js/parser.wasi-browser.js"));
const filename = pathJoin(packageDir, "src-js/bindings.js");
let data = fs.readFileSync(filename, "utf-8");
data = data.replace(
+1 -1
View File
@@ -565,7 +565,7 @@ try {
} = await __emnapiInstantiateNapiModule(__wasmFile, {
context: __emnapiContext,
asyncWorkPoolSize: __asyncWorkPoolSize,
reuseWorker: { size: __asyncWorkPoolSize + __workerPoolSize },
reuseWorker: false,
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],
wasi: __wasi,
onCreateWorker() {
+1
View File
@@ -28,6 +28,7 @@
"build-dev": "pnpm run build-wasm-dev && node scripts/patch.js",
"build": "pnpm run build-wasm-dev --release && node scripts/patch.js",
"build-wasm-dev": "napi build --platform --esm --target wasm32-wasip1-threads --dts playground.wasi.d.cts",
"postbuild-wasm-dev": "node scripts/patch-wasi-browser.js",
"postbuild": "publint"
},
"dependencies": {
+1 -1
View File
@@ -565,7 +565,7 @@ try {
} = await __emnapiInstantiateNapiModule(__wasmFile, {
context: __emnapiContext,
asyncWorkPoolSize: __asyncWorkPoolSize,
reuseWorker: { size: __asyncWorkPoolSize + __workerPoolSize },
reuseWorker: false,
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],
wasi: __wasi,
onCreateWorker() {
@@ -0,0 +1,5 @@
import { join as pathJoin } from "node:path";
import { disableReusedWorkers } from "../../disable-reused-workers.mjs";
disableReusedWorkers(pathJoin(import.meta.dirname, "../playground.wasi-browser.js"));
+4 -1
View File
@@ -1,7 +1,10 @@
import fs from "node:fs";
import { join as pathJoin } from "node:path";
const path = pathJoin(import.meta.dirname, "../playground.wasi-browser.js");
import "./patch-wasi-browser.js";
const packageDir = pathJoin(import.meta.dirname, "..");
const path = pathJoin(packageDir, "playground.wasi-browser.js");
let data = fs.readFileSync(path, "utf-8");
data = data.replace(
+4
View File
@@ -1,7 +1,11 @@
import fs from "node:fs";
import { join as pathJoin } from "node:path";
import { disableReusedWorkers } from "../../disable-reused-workers.mjs";
const packageDir = pathJoin(import.meta.dirname, "..");
disableReusedWorkers(pathJoin(packageDir, "transform-react.wasi-browser.js"));
const path = pathJoin(packageDir, "index.js");
let data = fs.readFileSync(path, "utf-8");
@@ -565,7 +565,7 @@ try {
} = await __emnapiInstantiateNapiModule(__wasmFile, {
context: __emnapiContext,
asyncWorkPoolSize: __asyncWorkPoolSize,
reuseWorker: { size: __asyncWorkPoolSize + __workerPoolSize },
reuseWorker: false,
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],
wasi: __wasi,
onCreateWorker() {
+4
View File
@@ -1,7 +1,11 @@
import fs from "node:fs";
import { join as pathJoin } from "node:path";
import { disableReusedWorkers } from "../../disable-reused-workers.mjs";
const packageDir = pathJoin(import.meta.dirname, "..");
disableReusedWorkers(pathJoin(packageDir, "transform-relay.wasi-browser.js"));
const path = pathJoin(packageDir, "index.js");
let data = fs.readFileSync(path, "utf-8");
@@ -565,7 +565,7 @@ try {
} = await __emnapiInstantiateNapiModule(__wasmFile, {
context: __emnapiContext,
asyncWorkPoolSize: __asyncWorkPoolSize,
reuseWorker: { size: __asyncWorkPoolSize + __workerPoolSize },
reuseWorker: false,
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],
wasi: __wasi,
onCreateWorker() {
+6 -1
View File
@@ -1,7 +1,12 @@
import fs from "node:fs";
import { join as pathJoin } from "node:path";
const path = pathJoin(import.meta.dirname, "../index.js");
import { disableReusedWorkers } from "../../disable-reused-workers.mjs";
const packageDir = pathJoin(import.meta.dirname, "..");
disableReusedWorkers(pathJoin(packageDir, "transform.wasi-browser.js"));
const path = pathJoin(packageDir, "index.js");
let data = fs.readFileSync(path, "utf-8");
data = data.replace(
+1 -1
View File
@@ -565,7 +565,7 @@ try {
} = await __emnapiInstantiateNapiModule(__wasmFile, {
context: __emnapiContext,
asyncWorkPoolSize: __asyncWorkPoolSize,
reuseWorker: { size: __asyncWorkPoolSize + __workerPoolSize },
reuseWorker: false,
plugins: [__emnapiAsyncWorkPlugin, __emnapiTSFNPlugin],
wasi: __wasi,
onCreateWorker() {