diff --git a/.gitignore b/.gitignore index 0f8678b..e3a2287 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ *.wasm +!docs/**/*.wasm diff --git a/index.js b/index.js index acecf71..b01628b 100644 --- a/index.js +++ b/index.js @@ -1,16 +1,36 @@ -self.wasmhttp = { - Serve: async (wasm) => { - const go = new Go() - const { instance } = await WebAssembly.instantiateStreaming(fetch(wasm), go.importObject) - try { - await go.run(instance) - } catch (e) { - console.error(e) - } +let nextHandlerId = 1 +const handlerResolvers = {} - addEventListener('fetch', async e => { - if (new URL(e.request.url).pathname !== '/test') return - e.respondWith((await fetchHandler)(e.request)) - }) +const startWasm = async (wasm, WASMHTTP_HANDLER_ID, WASMHTTP_BASE) => { + const go = new Go() + go.env = { + WASMHTTP_HANDLER_ID, + WASMHTTP_BASE, } + const { instance } = await WebAssembly.instantiateStreaming(fetch(wasm), go.importObject) + return go.run(instance) +} + +self.wasmhttp = { + serve: async ({ wasm, base } = { + base: '', + }) => { + try { + if (!wasm) throw TypeError('option.wasm must be defined') + + const handlerId = `${nextHandlerId++}` + const handler = new Promise(resolve => handlerResolvers[handlerId] = resolve) + + startWasm(wasm, handlerId, base) + + addEventListener('fetch', async e => e.respondWith((await handler)(e.request))) + } catch (e) { + console.error('wasmhttp: error:', e) + } + }, + + registerHandler: (handlerId, handler) => { + handlerResolvers[handlerId](handler) + delete handlerResolvers[handlerId] + }, } diff --git a/serve.go b/serve.go index 6ed985b..b967dd8 100644 --- a/serve.go +++ b/serve.go @@ -55,7 +55,7 @@ func Serve(handler http.Handler) func() { return res.Value() }) - js.Global().Get("wasmhttp").Call("RegisterHandler", os.Getenv("WASMHTTP_HANDLER_ID"), cb) + js.Global().Get("wasmhttp").Call("registerHandler", os.Getenv("WASMHTTP_HANDLER_ID"), cb) return cb.Release }