| | |
| | | |
| | | const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants"); |
| | | const RuntimeGlobals = require("../RuntimeGlobals"); |
| | | const AsyncWasmCompileRuntimeModule = require("../wasm-async/AsyncWasmCompileRuntimeModule"); |
| | | const AsyncWasmLoadingRuntimeModule = require("../wasm-async/AsyncWasmLoadingRuntimeModule"); |
| | | |
| | | /** @typedef {import("../Chunk")} Chunk */ |
| | |
| | | |
| | | const PLUGIN_NAME = "FetchCompileAsyncWasmPlugin"; |
| | | |
| | | /** |
| | | * Enables asynchronous WebAssembly loading through `fetch` for environments |
| | | * that can instantiate fetched binaries at runtime. |
| | | */ |
| | | class FetchCompileAsyncWasmPlugin { |
| | | /** |
| | | * Apply the plugin |
| | | * Registers compilation hooks that attach the async fetch-based wasm runtime |
| | | * to chunks containing async 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 async 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 an async WebAssembly module. |
| | | * @param {string} path path to the wasm file |
| | | * @returns {string} code to load the wasm file |
| | | */ |
| | |
| | | }) |
| | | ); |
| | | }); |
| | | |
| | | compilation.hooks.runtimeRequirementInTree |
| | | .for(RuntimeGlobals.compileWasm) |
| | | .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => { |
| | | if (!isEnabledForChunk(chunk)) return; |
| | | if ( |
| | | !chunkGraph.hasModuleInGraph( |
| | | chunk, |
| | | (m) => m.type === WEBASSEMBLY_MODULE_TYPE_ASYNC |
| | | ) |
| | | ) { |
| | | return; |
| | | } |
| | | set.add(RuntimeGlobals.publicPath); |
| | | compilation.addRuntimeModule( |
| | | chunk, |
| | | new AsyncWasmCompileRuntimeModule({ |
| | | generateLoadBinaryCode, |
| | | supportsStreaming: true |
| | | }) |
| | | ); |
| | | }); |
| | | }); |
| | | } |
| | | } |