Skip to content

Commit ff4ee89

Browse files
committed
add http caller example
1 parent f6ac4e7 commit ff4ee89

File tree

4 files changed

+99
-1
lines changed

4 files changed

+99
-1
lines changed

bridge.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"log"
1010
"math"
11+
"net/http"
1112
"reflect"
1213
"sync"
1314
"syscall"
@@ -107,7 +108,9 @@ func (b *Bridge) addValues() {
107108
false,
108109
&object{
109110
props: map[string]interface{}{
110-
"Object": propObject("Object", nil),
111+
"Object": &object{name: "Object", new: func(args []interface{}) interface{} {
112+
return &object{name: "ObjectInner", props: map[string]interface{}{}}
113+
}},
111114
"Array": propObject("Array", nil),
112115
"Int8Array": typedArray,
113116
"Int16Array": typedArray,
@@ -137,6 +140,28 @@ func (b *Bridge) addValues() {
137140
return rand.Read(arr.data())
138141
}),
139142
}),
143+
"AbortController": &object{name: "AbortController", new: func(args []interface{}) interface{} {
144+
return &object{name: "AbortControllerInner", props: map[string]interface{}{
145+
"signal": propObject("signal", map[string]interface{}{}),
146+
}}
147+
}},
148+
"Headers": &object{name: "Headers", new: func(args []interface{}) interface{} {
149+
headers := http.Header{}
150+
obj := &object{name: "HeadersInner", props: map[string]interface{}{
151+
"headers": headers,
152+
"append": Func(func(args []interface{}) (interface{}, error) {
153+
headers.Add(args[0].(string), args[1].(string))
154+
return nil, nil
155+
}),
156+
}}
157+
158+
return obj
159+
}},
160+
"fetch": Func(func(args []interface{}) (interface{}, error) {
161+
// TODO(ved): implement fetch
162+
log.Fatalln(args)
163+
return nil, nil
164+
}),
140165
"fs": propObject("fs", map[string]interface{}{
141166
"constants": propObject("constants", map[string]interface{}{
142167
"O_WRONLY": syscall.O_WRONLY,
@@ -494,6 +519,15 @@ func Bytes(v interface{}) ([]byte, error) {
494519
return arr.data(), nil
495520
}
496521

522+
func String(v interface{}) (string, error) {
523+
str, ok := v.(string)
524+
if !ok {
525+
return "", fmt.Errorf("got %t instead of string", v)
526+
}
527+
528+
return str, nil
529+
}
530+
497531
func Error(v interface{}) (errVal error, err error) {
498532
str, ok := v.(string)
499533
if !ok {

examples/http-caller/main.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
7+
"github.com/vedhavyas/go-wasm"
8+
)
9+
10+
func main() {
11+
b, err := wasm.BridgeFromFile("test", "./examples/http/main.wasm", nil)
12+
if err != nil {
13+
panic(err)
14+
}
15+
16+
ctx, canc := context.WithCancel(context.Background())
17+
defer canc()
18+
init := make(chan error)
19+
go b.Run(ctx, init)
20+
if err := <-init; err != nil {
21+
panic(err)
22+
}
23+
24+
res, err := b.CallFunc("call", []interface{}{"https://google.com"})
25+
if err != nil {
26+
panic(err)
27+
}
28+
29+
str, err := wasm.String(res)
30+
if err != nil {
31+
panic(err)
32+
}
33+
34+
log.Println("Result:", str)
35+
}

examples/http/main.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// +build js,wasm
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
"net/http"
8+
"syscall/js"
9+
)
10+
11+
func call(this js.Value, args []js.Value) interface{} {
12+
res, err := http.Get(args[0].String())
13+
if err != nil {
14+
panic(err)
15+
}
16+
17+
f := fmt.Sprintln(res.Status, res.StatusCode, res.ContentLength)
18+
err = res.Body.Close()
19+
if err != nil {
20+
panic(err)
21+
}
22+
23+
return f
24+
}
25+
26+
func main() {
27+
js.Global().Set("call", js.FuncOf(call))
28+
select {}
29+
}

examples/http/main.wasm

7.86 MB
Binary file not shown.

0 commit comments

Comments
 (0)