Commit82f18012Recorded6 May 2026Repositorysigil-web-repl

Load optional WASM bridge imports

Message

Teach the web REPL host page to load sigil-wasm-bridges.js when present, create bridge import objects before instantiation, and attach the instance after instantiation.

When no bridge manifest is emitted, provide no-op sigilwasmnet imports so strict Zig/WASI runtime builds still instantiate.

Verification: SIGILREDIRECTS=dev-redirects.sgl ../sigil/build/dev/bin/sigil build --config web --force --no-bundle; final WASM imports sigilwasm_net.*.

Changed
 assets/index.html | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)
Diff
assets/index.htmlmodified
@@ -1193,6 +1193,44 @@
1193
return fd;
1194
}
1195
+1196
async function loadOptionalBridgeLoader() {
+1197
const response = await fetch('sigil-wasm-bridges.js', { method: 'HEAD' });
+1198
if (!response.ok) {
+1199
return null;
+1200
}
+1201
+1202
await new Promise((resolve, reject) => {
+1203
const script = document.createElement('script');
+1204
script.src = 'sigil-wasm-bridges.js';
+1205
script.onload = resolve;
+1206
script.onerror = () => reject(new Error('Failed to load sigil-wasm-bridges.js'));
+1207
document.head.appendChild(script);
+1208
});
+1209
+1210
if (!window.SigilWasmBridges) {
+1211
return null;
+1212
}
+1213
+1214
return window.SigilWasmBridges.load();
+1215
}
+1216
+1217
function makeWasmNetStubImports() {
+1218
return {
+1219
sigil_wasm_net: {
+1220
websocket_open() { return 0; },
+1221
websocket_send() { return 0; },
+1222
websocket_close() { return 0; },
+1223
websocket_poll() { return 0; },
+1224
current_event_code() { return 0; },
+1225
current_event_was_clean() { return 0; },
+1226
current_event_data_length() { return 0; },
+1227
current_event_reason_length() { return 0; },
+1228
copy_current_event_data() { return 0; },
+1229
copy_current_event_reason() { return 0; },
+1230
},
+1231
};
+1232
}
+1233
1234
// Initialize WASI and load WASM
1235
async function init() {
1236
const wasiModule = await import("https://cdn.jsdelivr.net/npm/@bjorn3/[email protected]/dist/index.js");
@@ -1212,10 +1250,21 @@
1250
const wasi = new WASI(["sigil-web-repl"], [], fds, { debug: false });
1251
1252
try {
+1253
const bridgeManifest = await loadOptionalBridgeLoader();
+1254
const bridgeImports = {
+1255
...makeWasmNetStubImports(),
+1256
...(bridgeManifest
+1257
? window.SigilWasmBridges.createImports(bridgeManifest)
+1258
: {}),
+1259
};
1260
const wasmModule = await WebAssembly.compileStreaming(fetch('sigil-web-repl.wasm'));
1261
const instance = await WebAssembly.instantiate(wasmModule, {
1262
wasi_snapshot_preview1: wasi.wasiImport,
+1263
...bridgeImports,
1264
});
+1265
if (bridgeManifest) {
+1266
window.SigilWasmBridges.setInstance(bridgeManifest, instance);
+1267
}
1268
1269
sigilInput = (str) => callWithString(instance, instance.exports.sigil_wasm_input, str);
1270
sigilEval = (str) => callWithString(instance, instance.exports.sigil_wasm_eval, str);