mirror of
https://github.com/nlepage/go-wasm-http-server.git
synced 2025-03-10 17:29:10 +00:00
♻️ Promise: More idiomatic Go...
This commit is contained in:
parent
896b5a3cee
commit
b3e8d72ed1
Binary file not shown.
Binary file not shown.
33
promise.go
33
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{} {
|
||||
|
@ -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)
|
||||
|
||||
|
34
serve.go
34
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
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user