40 lines
1.5 KiB
JavaScript
40 lines
1.5 KiB
JavaScript
/**
|
|
* Polyfill for Node.js 22+ where globalThis.fetch is built-in but rejects
|
|
* bare filesystem paths. WASM libraries like argon2-browser call fetch() with
|
|
* an absolute path (e.g. "/path/to/argon2.wasm") expecting a browser-style
|
|
* fallback, but Node.js 22's fetch throws synchronously for non-URL strings.
|
|
*
|
|
* This wrapper intercepts such calls and serves the file via Node's fs module,
|
|
* returning a synthetic Response so the WASM module loads correctly.
|
|
*/
|
|
|
|
import { readFile } from "fs/promises";
|
|
import { fileURLToPath } from "url";
|
|
|
|
if (globalThis.fetch) {
|
|
const originalFetch = globalThis.fetch;
|
|
globalThis.fetch = async function patchedFetch(url, options) {
|
|
const urlStr = typeof url === "string" ?
|
|
url :
|
|
url instanceof URL ?
|
|
url.href :
|
|
String(url);
|
|
// Intercept bare filesystem paths (absolute POSIX or Windows)
|
|
if (urlStr.startsWith("/") || /^[A-Za-z]:[/\\]/.test(urlStr)) {
|
|
const buffer = await readFile(urlStr);
|
|
return new Response(buffer, {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/wasm" },
|
|
});
|
|
}
|
|
if (urlStr.startsWith("file:")) {
|
|
const buffer = await readFile(fileURLToPath(urlStr));
|
|
return new Response(buffer, {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/wasm" },
|
|
});
|
|
}
|
|
return originalFetch(url, options);
|
|
};
|
|
}
|