mirror of
https://github.com/nlepage/go-wasm-http-server.git
synced 2025-03-10 09:27:08 +00:00
♻️ Use github.com/nlepage/go-js-promise
This commit is contained in:
parent
1f549a4bf0
commit
624ed00220
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"go.toolsEnvVars": {
|
||||
"GOOS": "js",
|
||||
"GOARCH": "wasm"
|
||||
}
|
||||
}
|
2
go.mod
2
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
|
||||
|
2
go.sum
Normal file
2
go.sum
Normal file
@ -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=
|
55
promise.go
55
promise.go
@ -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
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
||||
|
4
serve.go
4
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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user