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);