// bootstrap.js — boots the Go/Wasm client, and supports flash-free hot swaps. // // On first load the server has already rendered the page's HTML into #app and // the wasm app hydrates it (see wasm/main.go). The dev server's livereload // script hot-swaps a freshly built module WITHOUT a full page reload or a blank // flash: it calls __gowasmPrepare() to fetch + compile the new module while the // current page is still visible, then (in one synchronous step) __gowasmDispose() // to tear down the old instance and start() to run the new one. (function () { // prepare fetches + compiles the module and returns a SYNCHRONOUS start() // thunk. Separating the async work (network + compile) from start (which // renders synchronously) is what lets a swap avoid an intermediate blank #app. async function prepare() { const go = new Go(); // cache:no-store so a hot swap always fetches the freshly built bytes. const resp = await fetch("/app.wasm", { cache: "no-store" }); const result = await WebAssembly.instantiateStreaming(resp, go.importObject); return function start() { go.run(result.instance); }; // runs main() (renders), then parks on select{} } async function boot() { (await prepare())(); } window.__gowasmPrepare = prepare; window.__gowasmBoot = boot; boot(); })();