Files
2024-10-11 16:01:13 +08:00

112 lines
3.7 KiB
JavaScript

import "./emHdBindings.js";
/**
* @type {Promise<import("..").USD> | null}
*/
let usd_module_promise = null;
/**
* @param {undefined | import("..").GetUsdModuleOptions} opts
*/
export async function getUsdModule(opts) {
if (usd_module_promise) {
return usd_module_promise;
}
/**
* @type {import("..").getUsdModule}
*/
const getUsdModuleFn = globalThis["NEEDLE:USD:GET"];
if (!getUsdModuleFn) {
throw new Error("\"NEEDLE:USD:GET\" not found in globalThis - please modify \"emHdBindings.js\" and add: globalThis[\"NEEDLE:USD:GET\"] = getUsdModule;");
}
// HACK for worker import: \"Cannot use import statement outside a module\""
// https://github.com/vitejs/vite/issues/6979
// @ts-ignore
const isProd = import.meta.env?.PROD ?? true;
/**
* We use a async import here because otherwise sveltekit vite complains about unknown file extensions (e.g. .wasm)
*/
const bindingsPromise = await Promise.all([
/** @ts-ignore */
import(`./emHdBindings.js?url`),
/** @ts-ignore */
import(`./emHdBindings.data?url`),
// https://v3.vitejs.dev/guide/features.html#web-workers
// https://github.com/vitejs/vite/issues/6979
/** @ts-ignore */
import(`./emHdBindings.worker.js?worker&url`),
/** @ts-ignore */
import(`./emHdBindings.worker.js?url`),
/** @ts-ignore */
import(`./emHdBindings.wasm?url`),
]);
const [bindings, data, workerProd, workerDev, wasm] = bindingsPromise;
const worker = isProd ? workerProd : workerDev;
const preloaded_data = await fetch(data.default).then(r => r.arrayBuffer());
return usd_module_promise = getUsdModuleFn({
mainScriptUrlOrBlob: bindings.default,// "./emHdBindings.js",
setStatus: (status) => {
console.debug("🧊 USD STATUS", status);
},
...opts,
locateFile: (file) => {
if (opts?.debug === true) console.warn("LOCATE FILE:", file)
const userResult = opts?.locateFile?.(file);
if (userResult) {
return userResult;
}
/** resolved filepath */
let res = null;
if (file.includes("emHdBindings.data")) {
res = data.default;
}
else if (file.includes("emHdBindings.wasm")) {
res = wasm.default;
}
else if (file.includes("emHdBindings.worker.js")) {
res = worker.default;
}
// if (url?.startsWith("data:text/javascript;base64")) {
// // we're client side and Buffer and atob are not available
// // so we need to convert the base64 to a blob
// const base64 = url.split(",")[1];
// const binary = atob(base64);
// const bytes = new Uint8Array(binary.length);
// for (let i = 0; i < binary.length; i++) {
// bytes[i] = binary.charCodeAt(i);
// }
// }
return res ?? file;
},
getPreloadedPackage(name, size) {
const userResult = opts?.getPreloadedPackage?.(name, size);
if (userResult) return userResult;
// For debugging if the data file isnt loaded or the size might be wrong
// Make sure to clear the vite cache. See https://linear.app/needle/issue/NE-4851#comment-2a9538e3
if (name.includes("emHdBindings.data")) {
if (preloaded_data.byteLength !== size) {
throw new Error(`emHdBindings.data size mismatch: expected ${size} but got ${preloaded_data.byteLength}\n${data.default}`);
}
}
return null;
},
});
}