2024-02-11 19:30:23 +09:00
|
|
|
package hono
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"syscall/js"
|
|
|
|
|
|
|
|
"github.com/syumai/workers/internal/jsutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Middleware func(c *Context, next func())
|
|
|
|
|
|
|
|
var middleware Middleware
|
|
|
|
|
|
|
|
func ChainMiddlewares(middlewares ...Middleware) Middleware {
|
|
|
|
if len(middlewares) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if len(middlewares) == 1 {
|
|
|
|
return middlewares[0]
|
|
|
|
}
|
|
|
|
return func(c *Context, next func()) {
|
|
|
|
for i := len(middlewares) - 1; i > 0; i-- {
|
|
|
|
i := i
|
|
|
|
f := next
|
|
|
|
next = func() {
|
|
|
|
middlewares[i](c, f)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
middlewares[0](c, next)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
runHonoMiddlewareCallback := js.FuncOf(func(_ js.Value, args []js.Value) any {
|
2024-02-11 19:51:22 +09:00
|
|
|
if len(args) > 1 {
|
2024-02-11 19:30:23 +09:00
|
|
|
panic(fmt.Errorf("too many args given to handleRequest: %d", len(args)))
|
|
|
|
}
|
2024-02-11 19:51:22 +09:00
|
|
|
nextFnObj := args[0]
|
2024-02-11 19:30:23 +09:00
|
|
|
var cb js.Func
|
|
|
|
cb = js.FuncOf(func(_ js.Value, pArgs []js.Value) any {
|
|
|
|
defer cb.Release()
|
|
|
|
resolve := pArgs[0]
|
|
|
|
go func() {
|
2024-02-11 19:51:22 +09:00
|
|
|
err := runHonoMiddleware(nextFnObj)
|
2024-02-11 19:30:23 +09:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
resolve.Invoke(js.Undefined())
|
|
|
|
}()
|
|
|
|
return js.Undefined()
|
|
|
|
})
|
|
|
|
return js.Undefined()
|
|
|
|
})
|
|
|
|
jsutil.Binding.Set("runHonoMiddleware", runHonoMiddlewareCallback)
|
|
|
|
}
|
|
|
|
|
2024-02-11 19:51:22 +09:00
|
|
|
func runHonoMiddleware(nextFnObj js.Value) error {
|
2024-02-11 19:30:23 +09:00
|
|
|
if middleware == nil {
|
|
|
|
return fmt.Errorf("ServeMiddleware must be called before runHonoMiddleware.")
|
|
|
|
}
|
2024-02-11 19:51:22 +09:00
|
|
|
c := newContext(jsutil.RuntimeContext)
|
2024-02-11 19:30:23 +09:00
|
|
|
next := func() {
|
|
|
|
jsutil.AwaitPromise(nextFnObj.Invoke())
|
|
|
|
}
|
|
|
|
middleware(c, next)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
//go:wasmimport workers ready
|
|
|
|
func ready()
|
|
|
|
|
|
|
|
// ServeMiddleware sets the Task to be executed
|
|
|
|
func ServeMiddleware(middleware_ Middleware) {
|
|
|
|
middleware = middleware_
|
|
|
|
ready()
|
|
|
|
select {}
|
|
|
|
}
|