-
Notifications
You must be signed in to change notification settings - Fork 37
/
middleware.go
77 lines (68 loc) · 1.59 KB
/
middleware.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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 {
if len(args) > 1 {
panic(fmt.Errorf("too many args given to handleRequest: %d", len(args)))
}
nextFnObj := args[0]
var cb js.Func
cb = js.FuncOf(func(_ js.Value, pArgs []js.Value) any {
defer cb.Release()
resolve := pArgs[0]
go func() {
err := runHonoMiddleware(nextFnObj)
if err != nil {
panic(err)
}
resolve.Invoke(js.Undefined())
}()
return js.Undefined()
})
return jsutil.NewPromise(cb)
})
jsutil.Binding.Set("runHonoMiddleware", runHonoMiddlewareCallback)
}
func runHonoMiddleware(nextFnObj js.Value) error {
if middleware == nil {
return fmt.Errorf("ServeMiddleware must be called before runHonoMiddleware.")
}
c := newContext(jsutil.RuntimeContext.Get("ctx"))
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 {}
}