add http caller example

pull/2/head
vedhavyas 2019-09-23 22:22:23 +02:00
parent f6ac4e734a
commit ff4ee892fe
No known key found for this signature in database
GPG Key ID: 317BF0923E3EB7E5
4 changed files with 99 additions and 1 deletions

View File

@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"log" "log"
"math" "math"
"net/http"
"reflect" "reflect"
"sync" "sync"
"syscall" "syscall"
@ -107,7 +108,9 @@ func (b *Bridge) addValues() {
false, false,
&object{ &object{
props: map[string]interface{}{ props: map[string]interface{}{
"Object": propObject("Object", nil), "Object": &object{name: "Object", new: func(args []interface{}) interface{} {
return &object{name: "ObjectInner", props: map[string]interface{}{}}
}},
"Array": propObject("Array", nil), "Array": propObject("Array", nil),
"Int8Array": typedArray, "Int8Array": typedArray,
"Int16Array": typedArray, "Int16Array": typedArray,
@ -137,6 +140,28 @@ func (b *Bridge) addValues() {
return rand.Read(arr.data()) return rand.Read(arr.data())
}), }),
}), }),
"AbortController": &object{name: "AbortController", new: func(args []interface{}) interface{} {
return &object{name: "AbortControllerInner", props: map[string]interface{}{
"signal": propObject("signal", map[string]interface{}{}),
}}
}},
"Headers": &object{name: "Headers", new: func(args []interface{}) interface{} {
headers := http.Header{}
obj := &object{name: "HeadersInner", props: map[string]interface{}{
"headers": headers,
"append": Func(func(args []interface{}) (interface{}, error) {
headers.Add(args[0].(string), args[1].(string))
return nil, nil
}),
}}
return obj
}},
"fetch": Func(func(args []interface{}) (interface{}, error) {
// TODO(ved): implement fetch
log.Fatalln(args)
return nil, nil
}),
"fs": propObject("fs", map[string]interface{}{ "fs": propObject("fs", map[string]interface{}{
"constants": propObject("constants", map[string]interface{}{ "constants": propObject("constants", map[string]interface{}{
"O_WRONLY": syscall.O_WRONLY, "O_WRONLY": syscall.O_WRONLY,
@ -494,6 +519,15 @@ func Bytes(v interface{}) ([]byte, error) {
return arr.data(), nil return arr.data(), nil
} }
func String(v interface{}) (string, error) {
str, ok := v.(string)
if !ok {
return "", fmt.Errorf("got %t instead of string", v)
}
return str, nil
}
func Error(v interface{}) (errVal error, err error) { func Error(v interface{}) (errVal error, err error) {
str, ok := v.(string) str, ok := v.(string)
if !ok { if !ok {

View File

@ -0,0 +1,35 @@
package main
import (
"context"
"log"
"github.com/vedhavyas/go-wasm"
)
func main() {
b, err := wasm.BridgeFromFile("test", "./examples/http/main.wasm", nil)
if err != nil {
panic(err)
}
ctx, canc := context.WithCancel(context.Background())
defer canc()
init := make(chan error)
go b.Run(ctx, init)
if err := <-init; err != nil {
panic(err)
}
res, err := b.CallFunc("call", []interface{}{"https://google.com"})
if err != nil {
panic(err)
}
str, err := wasm.String(res)
if err != nil {
panic(err)
}
log.Println("Result:", str)
}

View File

@ -0,0 +1,29 @@
// +build js,wasm
package main
import (
"fmt"
"net/http"
"syscall/js"
)
func call(this js.Value, args []js.Value) interface{} {
res, err := http.Get(args[0].String())
if err != nil {
panic(err)
}
f := fmt.Sprintln(res.Status, res.StatusCode, res.ContentLength)
err = res.Body.Close()
if err != nil {
panic(err)
}
return f
}
func main() {
js.Global().Set("call", js.FuncOf(call))
select {}
}

Binary file not shown.