| | |
| | | /** @typedef {import("../Compiler")} Compiler */ |
| | | |
| | | /** |
| | | * Options that influence how synchronous WebAssembly modules are emitted for |
| | | * the fetch-based wasm loading runtime. |
| | | * @typedef {object} FetchCompileWasmPluginOptions |
| | | * @property {boolean=} mangleImports mangle imports |
| | | */ |
| | | |
| | | const PLUGIN_NAME = "FetchCompileWasmPlugin"; |
| | | |
| | | /** |
| | | * Enables synchronous WebAssembly chunk loading that fetches `.wasm` files and |
| | | * compiles them in browser-like environments. |
| | | */ |
| | | class FetchCompileWasmPlugin { |
| | | /** |
| | | * Stores options that affect generated synchronous WebAssembly runtime code. |
| | | * @param {FetchCompileWasmPluginOptions=} options options |
| | | */ |
| | | constructor(options = {}) { |
| | | /** @type {FetchCompileWasmPluginOptions} */ |
| | | this.options = options; |
| | | } |
| | | |
| | | /** |
| | | * Apply the plugin |
| | | * Registers compilation hooks that attach the fetch-based synchronous wasm |
| | | * runtime module to chunks containing sync WebAssembly modules. |
| | | * @param {Compiler} compiler the compiler instance |
| | | * @returns {void} |
| | | */ |
| | |
| | | compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => { |
| | | const globalWasmLoading = compilation.outputOptions.wasmLoading; |
| | | /** |
| | | * Determines whether the chunk should load synchronous WebAssembly |
| | | * binaries through the `fetch` backend. |
| | | * @param {Chunk} chunk chunk |
| | | * @returns {boolean} true, if wasm loading is enabled for the chunk |
| | | */ |
| | |
| | | return wasmLoading === "fetch"; |
| | | }; |
| | | /** |
| | | * Generates the runtime expression that downloads the emitted wasm |
| | | * binary for a module. |
| | | * @param {string} path path to the wasm file |
| | | * @returns {string} code to load the wasm file |
| | | */ |