diff --git a/docs/hello-state/api.wasm b/docs/hello-state/api.wasm index c2d09c6..f331c37 100755 Binary files a/docs/hello-state/api.wasm and b/docs/hello-state/api.wasm differ diff --git a/docs/hello/api.wasm b/docs/hello/api.wasm index 252bfbe..5b0b17e 100755 Binary files a/docs/hello/api.wasm and b/docs/hello/api.wasm differ diff --git a/promise.go b/promise.go index 989a332..3cd5064 100644 --- a/promise.go +++ b/promise.go @@ -4,31 +4,30 @@ import ( "syscall/js" ) -// Promise is a JavaScript Promise -type Promise struct { - js.Value -} - // NewPromise creates a new JavaScript Promise -func NewPromise(cb func(resolve func(interface{}), reject func(interface{}))) Promise { +func NewPromise() (p js.Value, resolve func(interface{}), reject func(interface{})) { var cbFunc js.Func cbFunc = js.FuncOf(func(_ js.Value, args []js.Value) interface{} { - defer cbFunc.Release() - cb( - func(value interface{}) { - args[0].Invoke(value) - }, - func(value interface{}) { - args[1].Invoke(value) - }, - ) + cbFunc.Release() + + resolve = func(value interface{}) { + args[0].Invoke(value) + } + + reject = func(value interface{}) { + args[1].Invoke(value) + } + return js.Undefined() }) - return Promise{js.Global().Get("Promise").New(cbFunc)} + + p = js.Global().Get("Promise").New(cbFunc) + + return } // Await waits for the Promise to be resolved and returns the value -func (p Promise) Await() (js.Value, error) { +func Await(p js.Value) (js.Value, error) { resCh := make(chan js.Value) var then js.Func then = js.FuncOf(func(_ js.Value, args []js.Value) interface{} { diff --git a/request.go b/request.go index 50807fa..1bd1a64 100644 --- a/request.go +++ b/request.go @@ -9,7 +9,7 @@ import ( // Request builds and returns the equivalent http.Request func Request(r js.Value) *http.Request { - jsBody := js.Global().Get("Uint8Array").New(Promise{r.Call("arrayBuffer")}.Await()) + jsBody := js.Global().Get("Uint8Array").New(Await(r.Call("arrayBuffer"))) body := make([]byte, jsBody.Get("length").Int()) js.CopyBytesToGo(body, jsBody) diff --git a/serve.go b/serve.go index e4e169c..a00272d 100644 --- a/serve.go +++ b/serve.go @@ -26,25 +26,25 @@ func Serve(handler http.Handler) func() { } var cb = js.FuncOf(func(_ js.Value, args []js.Value) interface{} { - var resPromise = NewPromise(func(resolve func(interface{}), reject func(interface{})) { - go func() { - defer func() { - if r := recover(); r != nil { - if err, ok := r.(error); ok { - reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err)) - } else { - reject(fmt.Sprintf("wasmhttp: panic: %v\n", r)) - } + var resPromise, resolve, reject = NewPromise() + + go func() { + defer func() { + if r := recover(); r != nil { + if err, ok := r.(error); ok { + reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err)) + } else { + reject(fmt.Sprintf("wasmhttp: panic: %v\n", r)) } - }() - - var res = NewResponseRecorder() - - h.ServeHTTP(res, Request(args[0])) - - resolve(res) + } }() - }) + + var res = NewResponseRecorder() + + h.ServeHTTP(res, Request(args[0])) + + resolve(res) + }() return resPromise })