diff --git a/src/postamble_minimal.js b/src/postamble_minimal.js index 9472ec752e9f8..e0871e3e6ae96 100644 --- a/src/postamble_minimal.js +++ b/src/postamble_minimal.js @@ -182,6 +182,15 @@ var imports = { }; #if MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION +#if EXPORT_ES6 && !ENVIRONMENT_MAY_BE_AUDIO_WORKLET +var moduleUrl = new URL('{{{ TARGET_BASENAME }}}.wasm', import.meta.url); +#elif !EXPORT_ES6 || AUDIO_WORKLET +var moduleUrl = '{{{ TARGET_BASENAME }}}.wasm'; +#else +var moduleUrl = ENVIRONMENT_IS_AUDIO_WORKLET ? + '{{{ TARGET_BASENAME }}}.wasm' : + new URL('{{{ TARGET_BASENAME }}}.wasm', import.meta.url); +#endif // https://caniuse.com/#feat=wasm and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming #if MIN_SAFARI_VERSION < 150000 || ENVIRONMENT_MAY_BE_NODE #if ASSERTIONS && !WASM2JS @@ -197,13 +206,13 @@ instantiatePromise = // Node's fetch API cannot be used for local files, so we cannot use instantiateStreaming && !ENVIRONMENT_IS_NODE #endif - ? WebAssembly.instantiateStreaming(fetch('{{{ TARGET_BASENAME }}}.wasm'), imports) + ? WebAssembly.instantiateStreaming(fetch(moduleUrl), imports) : WebAssembly.instantiate(Module['wasm'], imports)).then((output) => { #else #if AUDIO_WORKLET instantiatePromise = #endif -WebAssembly.instantiateStreaming(fetch('{{{ TARGET_BASENAME }}}.wasm'), imports).then((output) => { +WebAssembly.instantiateStreaming(fetch(moduleUrl), imports).then((output) => { #endif #else // Non-streaming instantiation diff --git a/test/test_other.py b/test/test_other.py index 1abc8a8c7d96f..409958ab9d982 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -1702,6 +1702,18 @@ def test_minimal_runtime_errors(self): expected = 'emcc: error: MINIMAL_RUNTIME is not compatible with --preload-file' self.assert_fail([EMCC, test_file('hello_world.c'), '-sMINIMAL_RUNTIME', '--preload-file', 'foo'], expected) + def test_minimal_runtime_esm_streaming_instantiation(self): + self.run_process([EMCC, '-o', 'test.mjs', + '-sMINIMAL_RUNTIME', + '-sMINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION', + '-sEXPORT_ES6', + '-sENVIRONMENT=web', + test_file('hello_world.c')]) + + src = read_file('test.mjs') + # Verify that the generated code uses import.meta.url for the wasm URL + self.assertContained("new URL('test.wasm', import.meta.url)", src) + def test_export_all_and_exported_functions(self): # EXPORT_ALL should not export library functions by default. # This means that to export library function you also need to explicitly