mirror of
https://github.com/nlepage/go-wasm-http-server.git
synced 2025-03-10 17:29:10 +00:00
⚗️
This commit is contained in:
parent
9ffd514abc
commit
3c63741d6a
49
sw.js
49
sw.js
@ -1,6 +1,6 @@
|
||||
importScripts('https://cdn.jsdelivr.net/gh/golang/go@go1.15.7/misc/wasm/wasm_exec.js')
|
||||
|
||||
const startWasm = async (wasm, { env, args = [] }) => {
|
||||
async function startWasm(wasm, { env, args = [] }) => {
|
||||
const go = new Go()
|
||||
go.env = env
|
||||
go.argv = [wasm, ...args]
|
||||
@ -8,13 +8,13 @@ const startWasm = async (wasm, { env, args = [] }) => {
|
||||
return go.run(instance)
|
||||
}
|
||||
|
||||
const trimStart = (s, c) => {
|
||||
function trimStart(s, c) {
|
||||
let r = s
|
||||
while (r.startsWith(c)) r = r.slice(c.length)
|
||||
return r
|
||||
}
|
||||
|
||||
const trimEnd = (s, c) => {
|
||||
function trimEnd(s, c) {
|
||||
let r = s
|
||||
while (r.endsWith(c)) r = r.slice(0, -c.length)
|
||||
return r
|
||||
@ -24,7 +24,6 @@ const trimEnd = (s, c) => {
|
||||
// event.waitUntil(skipWaiting())
|
||||
// })
|
||||
|
||||
const running = new Set()
|
||||
let nextHandlerId = 1
|
||||
const handlerResolvers = {}
|
||||
const handlers = []
|
||||
@ -36,55 +35,23 @@ self.wasmhttp = {
|
||||
},
|
||||
}
|
||||
|
||||
console.log('aha!')
|
||||
|
||||
addEventListener('activate', event => {
|
||||
console.log('activate!')
|
||||
event.waitUntil(clients.claim())
|
||||
})
|
||||
|
||||
addEventListener('message', async ({ data }) => {
|
||||
console.log('message!', data)
|
||||
|
||||
if (data.type !== 'wasmhttp.register') return
|
||||
|
||||
const { wasm, base, args } = data
|
||||
|
||||
let path = new URL(registration.scope).pathname
|
||||
if (base && base !== '') path = `${trimEnd(path, '/')}/${trimStart(base, '/')}`
|
||||
|
||||
const key = `${wasm}:${path}`
|
||||
|
||||
if (!running.has(key)) {
|
||||
const handlerId = `${nextHandlerId++}`
|
||||
const handler = new Promise(resolve => handlerResolvers[handlerId] = resolve)
|
||||
|
||||
startWasm(wasm, { env: { WASMHTTP_HANDLER_ID: handlerId, WASMHTTP_PATH: path }, args })
|
||||
running.add(key)
|
||||
|
||||
// FIXME try catch
|
||||
handlers.push([path, await handler])
|
||||
}
|
||||
})
|
||||
|
||||
addEventListener('fetch', e => {
|
||||
console.log('fetch')
|
||||
|
||||
const { pathname } = new URL(e.request.url)
|
||||
const [, handler] = handlers.find(([path]) => pathname.startsWith(path)) || []
|
||||
if (!handler) return
|
||||
|
||||
e.respondWith(handler(e.request))
|
||||
})
|
||||
|
||||
function registerWasmHTTPListener(wasm, base, args) {
|
||||
let path = new URL(registration.scope).pathname
|
||||
if (base && base !== '') path = `${trimEnd(path, '/')}/${trimStart(base, '/')}`
|
||||
|
||||
addEventListener('fetch', async e => {
|
||||
console.log("new fetch !")
|
||||
|
||||
const { pathname } = new URL(e.request.url)
|
||||
if (!pathname.startsWith(path)) return
|
||||
|
||||
console.log("path OK!")
|
||||
|
||||
const handlerId = `${nextHandlerId++}`
|
||||
const handlerPromise = new Promise(resolve => handlerResolvers[handlerId] = resolve)
|
||||
|
||||
@ -92,7 +59,7 @@ function registerWasmHTTPListener(wasm, base, args) {
|
||||
startWasm(wasm, { env: { WASMHTTP_HANDLER_ID: handlerId, WASMHTTP_PATH: path }, args })
|
||||
|
||||
const handler = await handlerPromise
|
||||
|
||||
|
||||
e.respondWith(handler(e.request))
|
||||
})
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user