2025-02-06 09:55:56 +01:00

43 lines
1.2 KiB
JavaScript

function registerWasmHTTPListener(wasm, { base, cacheName, passthrough, args = [] } = {}) {
let path = new URL(registration.scope).pathname
if (base && base !== '') path = `${trimEnd(path, '/')}/${trimStart(base, '/')}`
const handlerPromise = new Promise(setHandler => {
self.wasmhttp = {
path,
setHandler,
}
})
const go = new Go()
go.argv = [wasm, ...args]
const source = cacheName
? caches.open(cacheName).then((cache) => cache.match(wasm)).then((response) => response ?? fetch(wasm))
: caches.match(wasm).then(response => (response) ?? fetch(wasm))
WebAssembly.instantiateStreaming(source, go.importObject).then(({ instance }) => go.run(instance))
addEventListener('fetch', e => {
if (passthrough?.(e.request)) {
e.respondWith(fetch(e.request))
return;
}
const { pathname } = new URL(e.request.url)
if (!pathname.startsWith(path)) return
e.respondWith(handlerPromise.then(handler => handler(e.request)))
})
}
function trimStart(s, c) {
let r = s
while (r.startsWith(c)) r = r.slice(c.length)
return r
}
function trimEnd(s, c) {
let r = s
while (r.endsWith(c)) r = r.slice(0, -c.length)
return r
}