diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d9ffe7d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "go.toolsEnvVars": { + "GOOS": "js", + "GOARCH": "wasm" + } +} diff --git a/go.mod b/go.mod index b4213af..27a18c5 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/nlepage/go-wasm-http-server go 1.13 + +require github.com/nlepage/go-js-promise v1.0.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..291bfdb --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/nlepage/go-js-promise v1.0.0 h1:K7OmJ3+0BgWJ2LfXchg2sI6RDr7AW/KWR8182epFwGQ= +github.com/nlepage/go-js-promise v1.0.0/go.mod h1:bdOP0wObXu34euibyK39K1hoBCtlgTKXGc56AGflaRo= diff --git a/promise.go b/promise.go deleted file mode 100644 index 3cd5064..0000000 --- a/promise.go +++ /dev/null @@ -1,55 +0,0 @@ -package wasmhttp - -import ( - "syscall/js" -) - -// NewPromise creates a new JavaScript 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{} { - cbFunc.Release() - - resolve = func(value interface{}) { - args[0].Invoke(value) - } - - reject = func(value interface{}) { - args[1].Invoke(value) - } - - return js.Undefined() - }) - - p = js.Global().Get("Promise").New(cbFunc) - - return -} - -// Await waits for the Promise to be resolved and returns the value -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{} { - resCh <- args[0] - return nil - }) - defer then.Release() - - errCh := make(chan error) - var catch js.Func - catch = js.FuncOf(func(_ js.Value, args []js.Value) interface{} { - errCh <- js.Error{args[0]} - return nil - }) - defer catch.Release() - - p.Call("then", then).Call("catch", catch) - - select { - case res := <-resCh: - return res, nil - case err := <-errCh: - return js.Undefined(), err - } -} diff --git a/request.go b/request.go index 1bd1a64..b86a0df 100644 --- a/request.go +++ b/request.go @@ -5,11 +5,13 @@ import ( "net/http" "net/http/httptest" "syscall/js" + + promise "github.com/nlepage/go-js-promise" ) // Request builds and returns the equivalent http.Request func Request(r js.Value) *http.Request { - jsBody := js.Global().Get("Uint8Array").New(Await(r.Call("arrayBuffer"))) + jsBody := js.Global().Get("Uint8Array").New(promise.Await(r.Call("arrayBuffer"))) body := make([]byte, jsBody.Get("length").Int()) js.CopyBytesToGo(body, jsBody) diff --git a/serve.go b/serve.go index a00272d..323b75a 100644 --- a/serve.go +++ b/serve.go @@ -5,6 +5,8 @@ import ( "net/http" "strings" "syscall/js" + + promise "github.com/nlepage/go-js-promise" ) // Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil. @@ -26,7 +28,7 @@ func Serve(handler http.Handler) func() { } var cb = js.FuncOf(func(_ js.Value, args []js.Value) interface{} { - var resPromise, resolve, reject = NewPromise() + var resPromise, resolve, reject = promise.New() go func() { defer func() {