| | |
| | | const { RawSource } = require("webpack-sources"); |
| | | const Generator = require("../Generator"); |
| | | const InitFragment = require("../InitFragment"); |
| | | const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants"); |
| | | const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypeConstants"); |
| | | const RuntimeGlobals = require("../RuntimeGlobals"); |
| | | const Template = require("../Template"); |
| | | const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); |
| | | |
| | | /** @typedef {import("webpack-sources").Source} Source */ |
| | | /** @typedef {import("./AsyncWebAssemblyModulesPlugin").AsyncWasmModuleClass} AsyncWasmModule */ |
| | | /** @typedef {import("../Generator").GenerateContext} GenerateContext */ |
| | | /** @typedef {import("../Module")} Module */ |
| | | /** @typedef {import("../Module").SourceType} SourceType */ |
| | | /** @typedef {import("../Module").SourceTypes} SourceTypes */ |
| | | /** @typedef {import("../NormalModule")} NormalModule */ |
| | | |
| | | /** |
| | | * Represents the async web assembly javascript generator runtime component. |
| | | * @typedef {{ request: string, importVar: string, dependency: WebAssemblyImportDependency }} ImportObjRequestItem |
| | | */ |
| | | |
| | | class AsyncWebAssemblyJavascriptGenerator extends Generator { |
| | | /** |
| | | * Returns the source types available for this module. |
| | | * @param {NormalModule} module fresh module |
| | | * @returns {SourceTypes} available types (do not mutate) |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the estimated size for the requested source type. |
| | | * @param {NormalModule} module the module |
| | | * @param {string=} type source type |
| | | * @param {SourceType=} type source type |
| | | * @returns {number} estimate size of the module |
| | | */ |
| | | getSize(module, type) { |
| | | // it's only estimated so this number is probably fine |
| | | // Example: m.exports=s.v(e,_.id,"6db474f11db19c35388a") |
| | | if (/** @type {AsyncWasmModule} */ (module).phase === "source") { |
| | | return 44; |
| | | } |
| | | |
| | | return 40 + module.dependencies.length * 10; |
| | | } |
| | | |
| | | /** |
| | | * Generates generated code for this runtime module. |
| | | * @param {NormalModule} module module for which the code should be generated |
| | | * @param {GenerateContext} generateContext context for generate |
| | | * @returns {Source | null} generated code |
| | |
| | | runtimeRequirements, |
| | | runtime |
| | | } = generateContext; |
| | | |
| | | // Check if this is a source phase import |
| | | if (/** @type {AsyncWasmModule} */ (module).phase === "source") { |
| | | return this._generateSourcePhase(module, generateContext); |
| | | } |
| | | |
| | | runtimeRequirements.add(RuntimeGlobals.module); |
| | | runtimeRequirements.add(RuntimeGlobals.moduleId); |
| | | runtimeRequirements.add(RuntimeGlobals.exports); |
| | |
| | | } |
| | | |
| | | /** |
| | | * Generate code for source phase import (returns WebAssembly.Module) |
| | | * @param {NormalModule} module module for which the code should be generated |
| | | * @param {GenerateContext} generateContext context for generate |
| | | * @returns {Source} generated code |
| | | */ |
| | | _generateSourcePhase(module, generateContext) { |
| | | const { chunkGraph, runtimeTemplate, runtimeRequirements, runtime } = |
| | | generateContext; |
| | | |
| | | runtimeRequirements.add(RuntimeGlobals.module); |
| | | runtimeRequirements.add(RuntimeGlobals.moduleId); |
| | | runtimeRequirements.add(RuntimeGlobals.exports); |
| | | runtimeRequirements.add(RuntimeGlobals.compileWasm); |
| | | runtimeRequirements.add(RuntimeGlobals.asyncModule); |
| | | runtimeRequirements.add(RuntimeGlobals.definePropertyGetters); |
| | | |
| | | // Source phase: export default WebAssembly.Module (via compileWasm) |
| | | const compileCall = `${RuntimeGlobals.compileWasm}(${ |
| | | module.moduleArgument |
| | | }.id, ${JSON.stringify(chunkGraph.getRenderedModuleHash(module, runtime))})`; |
| | | |
| | | // Use async module wrapper to handle the Promise from compileWasm |
| | | return new RawSource( |
| | | Template.asString([ |
| | | `${RuntimeGlobals.asyncModule}(${ |
| | | module.moduleArgument |
| | | }, async ${runtimeTemplate.basicFunction( |
| | | "__webpack_handle_async_dependencies__, __webpack_async_result__", |
| | | [ |
| | | "try {", |
| | | `var __webpack_wasm_module__ = await ${compileCall};`, |
| | | `${RuntimeGlobals.definePropertyGetters}(${module.exportsArgument}, { "default": ${runtimeTemplate.returningFunction("__webpack_wasm_module__")} });`, |
| | | "__webpack_async_result__();", |
| | | "} catch(e) { __webpack_async_result__(e); }" |
| | | ] |
| | | )}, 1);` |
| | | ]) |
| | | ); |
| | | } |
| | | |
| | | /** |
| | | * Generates fallback output for the provided error condition. |
| | | * @param {Error} error the error |
| | | * @param {NormalModule} module module for which the code should be generated |
| | | * @param {GenerateContext} generateContext context for generate |