| <!-- Specify wasm filename prefix in URL query parameter 'name'. Default is 'main.dart' --> | |
| <!-- Example: http://localhost:8080/wasm_runner.html?name=myapp --> | |
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
| <meta charset="utf-8"> | |
| </head> | |
| <style>body {background-color: black}</style> | |
| <body> | |
| <script type="module"> | |
| let filename = (new URLSearchParams(window.location.search)).get('name') ?? 'main.dart'; | |
| let mjs = await import(`./${filename}.mjs`); | |
| let compiledApp = await mjs.compileStreaming(fetch(`${filename}.wasm`)); | |
| function loadDeferredModules(modules, callback) { | |
| return Promise.all(modules.map((m) => callback(m, fetch(m)))); | |
| } | |
| let idMap; | |
| async function loadIdMap() { | |
| const jsonRes = await fetch(`${filename}.json`); | |
| const allJson = await jsonRes.json(); | |
| const map = {}; | |
| for (const val of Object.values(allJson)) { | |
| const imports = val["imports"]; | |
| for (const id of Object.keys(imports)) { | |
| map[id] = imports[id]; | |
| } | |
| } | |
| return map; | |
| } | |
| async function loadDeferredId(id, callback) { | |
| idMap ??= await loadIdMap(); | |
| return loadDeferredModules(idMap[id], callback); | |
| } | |
| let instantiatedModule = await compiledApp.instantiate({}, { | |
| loadDeferredModules: loadDeferredModules, | |
| loadDeferredId: loadDeferredId, | |
| }); | |
| instantiatedModule.invokeMain(); | |
| </script> | |
| </body> | |
| </html> |