diff --git a/src/mono/sample/mbr/browser/main.js b/src/mono/sample/mbr/browser/main.js index 2b488975a5b327..ff6a9d021f72eb 100644 --- a/src/mono/sample/mbr/browser/main.js +++ b/src/mono/sample/mbr/browser/main.js @@ -1,12 +1,9 @@ -import createDotnetRuntime from './dotnet.js' +import { dotnet } from './dotnet.js' try { - const { getAssemblyExports } = await createDotnetRuntime({ - configSrc: "./mono-config.json", - onConfigLoaded: (config) => { - config.environmentVariables["DOTNET_MODIFIABLE_ASSEMBLIES"] = "debug"; - }, - }); + const { getAssemblyExports } = await dotnet + .withEnvironmentVariable("DOTNET_MODIFIABLE_ASSEMBLIES", "debug") + .create(); const exports = await getAssemblyExports("WasmDelta.dll"); const update = exports.Sample.Test.Update; diff --git a/src/mono/sample/wasm/browser-bench/frame-main.js b/src/mono/sample/wasm/browser-bench/frame-main.js index 92be8c802ea9c1..45fd825e15b1e4 100644 --- a/src/mono/sample/wasm/browser-bench/frame-main.js +++ b/src/mono/sample/wasm/browser-bench/frame-main.js @@ -3,7 +3,7 @@ "use strict"; -import createDotnetRuntime from './dotnet.js' +import { dotnet, exit } from './dotnet.js' class FrameApp { async init({ getAssemblyExports }) { @@ -30,24 +30,18 @@ try { mute = true; } - const runtime = await createDotnetRuntime({ - disableDotnet6Compatibility: true, - configSrc: "./mono-config.json", - printErr: function () { - if (!mute) { - console.error(...arguments); + const runtime = await dotnet + .withElementOnExit() + .withExitCodeLogging() + .withModuleConfig({ + onConfigLoaded: (config) => { + if (window.parent != window) { + window.parent.resolveAppStartEvent("onConfigLoaded"); + } + // config.diagnosticTracing = true; } - }, - onConfigLoaded: (config) => { - if (window.parent != window) { - window.parent.resolveAppStartEvent("onConfigLoaded"); - } - // config.diagnosticTracing = true; - }, - onAbort: (error) => { - wasm_exit(1, error); - }, - }); + }) + .create(); if (window.parent != window) { window.parent.resolveAppStartEvent("onDotnetReady"); @@ -58,17 +52,5 @@ catch (err) { if (!mute) { console.error(`WASM ERROR ${err}`); } - wasm_exit(1, err); + exit(1, err); } - -function wasm_exit(exit_code, reason) { - /* Set result in a tests_done element, to be read by xharness */ - var tests_done_elem = document.createElement("label"); - tests_done_elem.id = "tests_done"; - tests_done_elem.innerHTML = exit_code.toString(); - if (exit_code) tests_done_elem.style.background = "red"; - document.body.appendChild(tests_done_elem); - - if (reason) console.error(reason); - console.log(`WASM EXIT ${exit_code}`); -}; diff --git a/src/mono/sample/wasm/browser-bench/main.js b/src/mono/sample/wasm/browser-bench/main.js index 61fa696d3bc11c..a973b17939bbcd 100644 --- a/src/mono/sample/wasm/browser-bench/main.js +++ b/src/mono/sample/wasm/browser-bench/main.js @@ -3,7 +3,7 @@ "use strict"; -import createDotnetRuntime from './dotnet.js' +import { dotnet, exit } from './dotnet.js' let runBenchmark; let setTasks; @@ -94,26 +94,13 @@ try { globalThis.mainApp.FrameReachedManaged = globalThis.mainApp.frameReachedManaged.bind(globalThis.mainApp); globalThis.mainApp.PageShow = globalThis.mainApp.pageShow.bind(globalThis.mainApp); - const runtime = await createDotnetRuntime({ - disableDotnet6Compatibility: true, - configSrc: "./mono-config.json", - onAbort: (error) => { - wasm_exit(1, error); - } - }); + const runtime = await dotnet + .withElementOnExit() + .withExitCodeLogging() + .create(); + await mainApp.init(runtime); } catch (err) { - wasm_exit(1, err); + exit(1, err); } -function wasm_exit(exit_code, reason) { - /* Set result in a tests_done element, to be read by xharness */ - const tests_done_elem = document.createElement("label"); - tests_done_elem.id = "tests_done"; - tests_done_elem.innerHTML = exit_code.toString(); - if (exit_code) tests_done_elem.style.background = "red"; - document.body.appendChild(tests_done_elem); - - if (reason) console.error(reason); - console.log(`WASM EXIT ${exit_code}`); -}; diff --git a/src/mono/sample/wasm/browser-eventpipe/main.js b/src/mono/sample/wasm/browser-eventpipe/main.js index aef0806c0efa50..ab31c7d55a4bed 100644 --- a/src/mono/sample/wasm/browser-eventpipe/main.js +++ b/src/mono/sample/wasm/browser-eventpipe/main.js @@ -1,4 +1,4 @@ -import createDotnetRuntime from "./dotnet.js"; +import { dotnet } from "./dotnet.js"; const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) @@ -41,9 +41,7 @@ function getOnClickHandler(startWork, stopWork, getIterationsDone) { } async function main() { - const { MONO, Module, getAssemblyExports } = await createDotnetRuntime({ - configSrc: "./mono-config.json", - }); + const { MONO, Module, getAssemblyExports } = await dotnet.create() globalThis.__Module = Module; globalThis.MONO = MONO; diff --git a/src/mono/sample/wasm/browser-nextjs/components/deepThought.js b/src/mono/sample/wasm/browser-nextjs/components/deepThought.js index 48c97a41e40921..7b2870b8b906a3 100644 --- a/src/mono/sample/wasm/browser-nextjs/components/deepThought.js +++ b/src/mono/sample/wasm/browser-nextjs/components/deepThought.js @@ -1,29 +1,17 @@ import { useState, useEffect } from 'react' -import createDotnetRuntime from '@microsoft/dotnet-runtime' +import { dotnet } from '@microsoft/dotnet-runtime' let dotnetRuntimePromise = undefined; -let meaningFunction = undefined; async function createRuntime() { try { - const response = await fetch('dotnet.wasm'); - const arrayBuffer = await response.arrayBuffer(); - return createDotnetRuntime({ - configSrc: "./mono-config.json", - disableDotnet6Compatibility: true, - locateFile: (path, prefix) => { - return '/' + path; - }, - instantiateWasm: async (imports, successCallback) => { - try { - const arrayBufferResult = await WebAssembly.instantiate(arrayBuffer, imports); - successCallback(arrayBufferResult.instance); - } catch (err) { - console.error(err); - throw err; + return dotnet. + withModuleConfig({ + locateFile: (path, prefix) => { + return '/' + path; } - } - }); + }) + .create(); } catch (err) { console.error(err); throw err; diff --git a/src/mono/sample/wasm/browser-profile/README.md b/src/mono/sample/wasm/browser-profile/README.md index 46e9802e47ff4a..555e09657c7dbb 100644 --- a/src/mono/sample/wasm/browser-profile/README.md +++ b/src/mono/sample/wasm/browser-profile/README.md @@ -13,16 +13,14 @@ public static void StopProfile(){} 2. Initialize the profiler in the main javascript (e.g. main.js) ``` -await createDotnetRuntime({ - onConfigLoaded: () => { - if (config.enableProfiler) { - config.aotProfilerOptions = { - write_at: "", - send_to: "System.Runtime.InteropServices.JavaScript.JavaScriptExports::DumpAotProfileData" - } +await dotnet + .withConfig({ + aotProfilerOptions: { + writeAt: "", + sendTo: "System.Runtime.InteropServices.JavaScript.JavaScriptExports::DumpAotProfileData" } - }, -}); + }) + .create(); ``` 3. Call the `write_at` method at the end of the app, either in C# or in JS. To call the `write_at` method in JS, make use of bindings: diff --git a/src/mono/sample/wasm/browser-profile/main.js b/src/mono/sample/wasm/browser-profile/main.js index d9a5969671176b..b6c5195bf37fc3 100644 --- a/src/mono/sample/wasm/browser-profile/main.js +++ b/src/mono/sample/wasm/browser-profile/main.js @@ -1,16 +1,4 @@ -import createDotnetRuntime from './dotnet.js' - -function wasm_exit(exit_code, reason) { - /* Set result in a tests_done element, to be read by xharness */ - const tests_done_elem = document.createElement("label"); - tests_done_elem.id = "tests_done"; - tests_done_elem.innerHTML = exit_code.toString(); - if (exit_code) tests_done_elem.style.background = "red"; - document.body.appendChild(tests_done_elem); - - if (reason) console.error(reason); - console.log(`WASM EXIT ${exit_code}`); -} +import { dotnet, exit } from './dotnet.js' function saveProfile(aotProfileData) { if (!aotProfileData) { @@ -27,21 +15,18 @@ function saveProfile(aotProfileData) { // Remove anchor from body document.body.removeChild(a); } -let enableProfiler = false try { - const { INTERNAL, getAssemblyExports: getAssemblyExports } = await createDotnetRuntime({ - configSrc: "./mono-config.json", - disableDotnet6Compatibility: true, - onConfigLoaded: (config) => { - if (config.enableProfiler) { - enableProfiler = true; - config.aotProfilerOptions = { - writeAt: "Sample.Test::StopProfile", - sendTo: "System.Runtime.InteropServices.JavaScript.JavaScriptExports::DumpAotProfileData" - } + const { INTERNAL, getAssemblyExports: getAssemblyExports } = await dotnet + .withElementOnExit() + .withExitCodeLogging() + .withConfig({ + aotProfilerOptions: { + writeAt: "Sample.Test::StopProfile", + sendTo: "System.Runtime.InteropServices.JavaScript.JavaScriptExports::DumpAotProfileData" } - } - }); + }) + .create(); + console.log("not ready yet") const exports = await getAssemblyExports("Wasm.BrowserProfile.Sample"); const testMeaning = exports.Sample.Test.TestMeaning; @@ -51,13 +36,11 @@ try { document.getElementById("out").innerHTML = ret; console.debug(`ret: ${ret}`); - if (enableProfiler) { - stopProfile(); - saveProfile(INTERNAL.aotProfileData); - } + stopProfile(); + saveProfile(INTERNAL.aotProfileData); let exit_code = ret == 42 ? 0 : 1; - wasm_exit(exit_code); + exit(exit_code); } catch (err) { - wasm_exit(-1, err); + exit(-1, err); } diff --git a/src/mono/sample/wasm/browser-threads/main.js b/src/mono/sample/wasm/browser-threads/main.js index 3f52c29dffdf72..4fe4a1e6ae754a 100644 --- a/src/mono/sample/wasm/browser-threads/main.js +++ b/src/mono/sample/wasm/browser-threads/main.js @@ -1,4 +1,4 @@ -import createDotnetRuntime from './dotnet.js' +import { dotnet } from './dotnet.js' function wasm_exit(exit_code, reason) { /* Set result in a tests_done element, to be read by xharness in runonly CI test */ @@ -61,10 +61,12 @@ function onInputValueChanged(exports, inputElement) { try { const inputElement = document.getElementById("inputN"); - const { runtimeBuildInfo, setModuleImports, getAssemblyExports, runMain } = await createDotnetRuntime(() => { - console.log('user code in createDotnetRuntime callback'); - return { - configSrc: "./mono-config.json", + const { setModuleImports, getAssemblyExports, runMain } = await dotnet + .withModuleConfig({ + // This whole 'withModuleConfig' is for demo purposes only. + // It is prefered to use specific 'with***' methods instead. + // Only when such method is doesn't exist, fallback to moduleConfig. + onConfigLoaded: (config) => { // This is called during emscripten `dotnet.wasm` instantiation, after we fetched config. console.log('user code Module.onConfigLoaded'); @@ -83,15 +85,16 @@ try { console.log('user code Module.onDotnetReady'); }, postRun: () => { console.log('user code Module.postRun'); }, - } - }); - console.log('user code after createDotnetRuntime()'); + }) + .create(); + + console.log('user code after dotnet.create'); setModuleImports("main.js", { - Sample: { - Test: { - updateProgress - } - } + Sample: { + Test: { + updateProgress + } + } }); const exports = await getAssemblyExports(assemblyName); diff --git a/src/mono/sample/wasm/browser-webpack/app.js b/src/mono/sample/wasm/browser-webpack/app.js index 3fab9331bcc2a9..334e3350d41af1 100644 --- a/src/mono/sample/wasm/browser-webpack/app.js +++ b/src/mono/sample/wasm/browser-webpack/app.js @@ -1,11 +1,9 @@ -import createDotnetRuntime from '@microsoft/dotnet-runtime' +import { dotnet } from '@microsoft/dotnet-runtime' import _ from 'underscore' async function dotnetMeaning() { try { - const { getAssemblyExports } = await createDotnetRuntime({ - configSrc: "./mono-config.json" - }); + const { getAssemblyExports } = await dotnet.create(); const exports = await getAssemblyExports("Wasm.Browser.WebPack.Sample"); const meaningFunction = exports.Sample.Test.Main; diff --git a/src/mono/sample/wasm/browser-webpack/package-lock.json b/src/mono/sample/wasm/browser-webpack/package-lock.json index 40bd39aeb62e70..99efcaa683e1aa 100644 --- a/src/mono/sample/wasm/browser-webpack/package-lock.json +++ b/src/mono/sample/wasm/browser-webpack/package-lock.json @@ -35,7 +35,7 @@ }, "bin/dotnet-runtime": { "name": "@microsoft/dotnet-runtime", - "version": "7.0.0-dev", + "version": "8.0.0-dev", "license": "MIT", "devDependencies": { "@rollup/plugin-typescript": "8.3.3", diff --git a/src/mono/sample/wasm/browser/main.js b/src/mono/sample/wasm/browser/main.js index afe23356a73951..c8527488177573 100644 --- a/src/mono/sample/wasm/browser/main.js +++ b/src/mono/sample/wasm/browser/main.js @@ -13,6 +13,10 @@ try { .withConsoleForwarding() .withElementOnExit() .withModuleConfig({ + // This whole 'withModuleConfig' is for demo purposes only. + // It is prefered to use specific 'with***' methods instead. + // Only when such method is doesn't exist, fallback to moduleConfig. + configSrc: "./mono-config.json", onConfigLoaded: (config) => { // This is called during emscripten `dotnet.wasm` instantiation, after we fetched config. @@ -37,9 +41,7 @@ try { // at this point both emscripten and monoVM are fully initialized. - // we could use the APIs returned and resolved from createDotnetRuntime promise - // both exports are receiving the same object instances - console.log('user code after createDotnetRuntime()'); + console.log('user code after dotnet.create'); setModuleImports("main.js", { Sample: { Test: { diff --git a/src/mono/sample/wasm/console-node-ts/main.ts b/src/mono/sample/wasm/console-node-ts/main.ts index 88efc4b7615b71..d8961099cdff53 100644 --- a/src/mono/sample/wasm/console-node-ts/main.ts +++ b/src/mono/sample/wasm/console-node-ts/main.ts @@ -1,11 +1,2 @@ -import createDotnetRuntime from '@microsoft/dotnet-runtime' -import process from 'process' - -const { runMainAndExit } = await createDotnetRuntime(() => ({ - disableDotnet6Compatibility: true, - configSrc: "./mono-config.json", -})); - -const app_args = process.argv.slice(2); -const dllName = "Wasm.Console.Node.TS.Sample.dll"; -await runMainAndExit(dllName, app_args); +import { dotnet } from '@microsoft/dotnet-runtime' +await dotnet.run(); \ No newline at end of file diff --git a/src/mono/sample/wasm/node-webpack/app.js b/src/mono/sample/wasm/node-webpack/app.js index d43368999eb3bf..0636193f8f5df2 100644 --- a/src/mono/sample/wasm/node-webpack/app.js +++ b/src/mono/sample/wasm/node-webpack/app.js @@ -1,12 +1,9 @@ -import createDotnetRuntime from '@microsoft/dotnet-runtime' +import { dotnet } from '@microsoft/dotnet-runtime' import { color } from 'console-log-colors' async function dotnetMeaning() { try { - const { getAssemblyExports } = await createDotnetRuntime({ - configSrc: "./mono-config.json" - }); - + const { getAssemblyExports } = await dotnet.create(); const exports = await getAssemblyExports("Wasm.Node.WebPack.Sample"); const meaningFunction = exports.Sample.Test.Main; return meaningFunction(); diff --git a/src/mono/sample/wasm/node-webpack/package-lock.json b/src/mono/sample/wasm/node-webpack/package-lock.json index 8a93728a862adc..20d13694b45204 100644 --- a/src/mono/sample/wasm/node-webpack/package-lock.json +++ b/src/mono/sample/wasm/node-webpack/package-lock.json @@ -17,7 +17,7 @@ }, "bin/dotnet-runtime": { "name": "@microsoft/dotnet-runtime", - "version": "7.0.0-dev", + "version": "8.0.0-dev", "license": "MIT", "devDependencies": { "@rollup/plugin-typescript": "8.3.3", diff --git a/src/mono/wasm/runtime/run-outer.ts b/src/mono/wasm/runtime/run-outer.ts index 189671d6d90545..b01e2f0141c3ef 100644 --- a/src/mono/wasm/runtime/run-outer.ts +++ b/src/mono/wasm/runtime/run-outer.ts @@ -220,13 +220,17 @@ class HostBuilder implements DotnetHostBuilder { withApplicationArgumentsFromQuery(): DotnetHostBuilder { try { - if (typeof globalThis.URLSearchParams != "undefined") { - const params = new URLSearchParams(window.location.search); - const values = params.getAll("arg"); - return this.withApplicationArguments(...values); + if (!globalThis.window) { + throw new Error("Missing window to the query parameters from"); } - - throw new Error("URLSearchParams is supported"); + + if (typeof globalThis.URLSearchParams == "undefined") { + throw new Error("URLSearchParams is supported"); + } + + const params = new URLSearchParams(window.location.search); + const values = params.getAll("arg"); + return this.withApplicationArguments(...values); } catch (err) { mono_exit(1, err); throw err; diff --git a/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/Program.cs b/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/Program.cs index 3a94759894e025..6c0255467eafef 100644 --- a/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/Program.cs +++ b/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/Program.cs @@ -4,17 +4,18 @@ using System; using System.Reflection; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices.JavaScript; namespace Sample { - public class Test + public partial class Test { public static void Main(string[] args) { Console.WriteLine ("Hello, World!"); } - [MethodImpl(MethodImplOptions.NoInlining)] + [JSExport] public static int TestMeaning() { const int success = 42; diff --git a/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/WebAssembly.Browser.HotReload.Test.csproj b/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/WebAssembly.Browser.HotReload.Test.csproj index 7e2602501266f1..cd0aa2d29c8d4a 100644 --- a/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/WebAssembly.Browser.HotReload.Test.csproj +++ b/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/WebAssembly.Browser.HotReload.Test.csproj @@ -49,4 +49,10 @@ + + + + + + diff --git a/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/main.js b/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/main.js index 8d267fdcc75604..ed7d0f24e9ee5b 100644 --- a/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/main.js +++ b/src/tests/FunctionalTests/WebAssembly/Browser/HotReload/main.js @@ -1,4 +1,4 @@ -import createDotnetRuntime from './dotnet.js' +import { dotnet } from './dotnet.js' function wasm_exit(exit_code) { var tests_done_elem = document.createElement("label"); @@ -10,13 +10,13 @@ function wasm_exit(exit_code) { } try { - const { BINDING } = await createDotnetRuntime(({ MONO }) => ({ - configSrc: "./mono-config.json", - onConfigLoaded: (config) => { - config.environmentVariables["DOTNET_MODIFIABLE_ASSEMBLIES"] = "debug"; - }, - })); - const testMeaning = BINDING.bind_static_method("[WebAssembly.Browser.HotReload.Test] Sample.Test:TestMeaning"); + const { getAssemblyExports } = await dotnet + .withElementOnExit() + .withEnvironmentVariable("DOTNET_MODIFIABLE_ASSEMBLIES", "debug") + .create(); + + const exports = await getAssemblyExports("WebAssembly.Browser.HotReload.Test.dll"); + const testMeaning = exports.Sample.Test.TestMeaning const ret = testMeaning(); document.getElementById("out").innerHTML = `${ret}`; console.debug(`ret: ${ret}`); diff --git a/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/Program.cs b/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/Program.cs index 6d1ae322e7e71e..0d484ddee35c10 100644 --- a/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/Program.cs +++ b/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/Program.cs @@ -3,17 +3,18 @@ using System; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices.JavaScript; namespace Sample { - public class Test + public partial class Test { public static void Main(string[] args) { Console.WriteLine ("Hello, World!"); } - [MethodImpl(MethodImplOptions.NoInlining)] + [JSExport] public static int TestMeaning() { var config = AppContext.GetData("test_runtimeconfig_json"); diff --git a/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/WebAssembly.Browser.RuntimeConfig.Test.csproj b/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/WebAssembly.Browser.RuntimeConfig.Test.csproj index 90d9fa155b9245..732efffc9f4fdf 100644 --- a/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/WebAssembly.Browser.RuntimeConfig.Test.csproj +++ b/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/WebAssembly.Browser.RuntimeConfig.Test.csproj @@ -13,4 +13,10 @@ + + + + + + diff --git a/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/main.js b/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/main.js index d00d3b488e414c..3b44c6f15220ee 100644 --- a/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/main.js +++ b/src/tests/FunctionalTests/WebAssembly/Browser/RuntimeConfig/main.js @@ -1,4 +1,4 @@ -import createDotnetRuntime from './dotnet.js' +import { dotnet } from './dotnet.js' function wasm_exit(exit_code) { var tests_done_elem = document.createElement("label"); @@ -10,8 +10,9 @@ function wasm_exit(exit_code) { } try { - const { BINDING } = await createDotnetRuntime(); - const testMeaning = BINDING.bind_static_method("[WebAssembly.Browser.RuntimeConfig.Test] Sample.Test:TestMeaning"); + const { getAssemblyExports } = await dotnet.create(); + const exports = await getAssemblyExports("WebAssembly.Browser.RuntimeConfig.Test.dll"); + const testMeaning = exports.Sample.Test.TestMeaning; const ret = testMeaning(); document.getElementById("out").innerHTML = `${ret}`; console.debug(`ret: ${ret}`);