mirror of
https://github.com/nlepage/go-wasm-http-server.git
synced 2025-03-10 17:29:10 +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
|
module github.com/nlepage/go-wasm-http-server
|
||||||
|
|
||||||
go 1.13
|
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"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"syscall/js"
|
"syscall/js"
|
||||||
|
|
||||||
|
promise "github.com/nlepage/go-js-promise"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Request builds and returns the equivalent http.Request
|
// Request builds and returns the equivalent http.Request
|
||||||
func Request(r js.Value) *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())
|
body := make([]byte, jsBody.Get("length").Int())
|
||||||
js.CopyBytesToGo(body, jsBody)
|
js.CopyBytesToGo(body, jsBody)
|
||||||
|
|
||||||
|
4
serve.go
4
serve.go
@ -5,6 +5,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall/js"
|
"syscall/js"
|
||||||
|
|
||||||
|
promise "github.com/nlepage/go-js-promise"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil.
|
// 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 cb = js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
|
||||||
var resPromise, resolve, reject = NewPromise()
|
var resPromise, resolve, reject = promise.New()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer func() {
|
defer func() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user