[FEATURE] Use ReadableStream for Response (#15)

* feat: uses ReadableStream for Response

* chore: rebuilds other examples
This commit is contained in:
Nicolas Lepage
2024-10-14 09:14:50 +02:00
committed by GitHub
parent 163b49702b
commit 5ec4a8d7e8
21 changed files with 644 additions and 93 deletions

11
internal/safejs/bytes.go Normal file
View File

@@ -0,0 +1,11 @@
package safejs
import "github.com/hack-pad/safejs"
func CopyBytesToGo(dst []byte, src Value) (int, error) {
return safejs.CopyBytesToGo(dst, safejs.Value(src))
}
func CopyBytesToJS(dst Value, src []byte) (int, error) {
return safejs.CopyBytesToJS(safejs.Value(dst), src)
}

26
internal/safejs/func.go Normal file
View File

@@ -0,0 +1,26 @@
package safejs
import (
"github.com/hack-pad/safejs"
)
type Func safejs.Func
func FuncOf(fn func(this Value, args []Value) any) (Func, error) {
r, err := safejs.FuncOf(func(this safejs.Value, args []safejs.Value) any {
args2 := make([]Value, len(args))
for i, v := range args {
args2[i] = Value(v)
}
return fn(Value(this), []Value(args2))
})
return Func(r), err
}
func (f Func) Release() {
safejs.Func(f).Release()
}
func (f Func) Value() Value {
return Value(safejs.Func(f).Value())
}

103
internal/safejs/value.go Normal file
View File

@@ -0,0 +1,103 @@
package safejs
import (
"syscall/js"
"github.com/hack-pad/safejs"
)
type Value safejs.Value
func Safe(v js.Value) Value {
return Value(safejs.Safe(v))
}
func Unsafe(v Value) js.Value {
return safejs.Unsafe(safejs.Value(v))
}
func ValueOf(value any) (Value, error) {
v, err := safejs.ValueOf(value)
return Value(v), err
}
func (v Value) Call(m string, args ...any) (Value, error) {
args = toJSValue(args).([]any)
r, err := safejs.Value(v).Call(m, args...)
return Value(r), err
}
func (v Value) Get(p string) (Value, error) {
r, err := safejs.Value(v).Get(p)
return Value(r), err
}
func (v Value) GetBool(p string) (bool, error) {
bv, err := v.Get(p)
if err != nil {
return false, err
}
return safejs.Value(bv).Bool()
}
func (v Value) GetInt(p string) (int, error) {
iv, err := v.Get(p)
if err != nil {
return 0, err
}
return safejs.Value(iv).Int()
}
func (v Value) GetString(p string) (string, error) {
sv, err := v.Get(p)
if err != nil {
return "", err
}
return safejs.Value(sv).String()
}
func (v Value) Index(i int) (Value, error) {
r, err := safejs.Value(v).Index(i)
return Value(r), err
}
func (v Value) IndexString(i int) (string, error) {
sv, err := v.Index(i)
if err != nil {
return "", err
}
return safejs.Value(sv).String()
}
func (v Value) New(args ...any) (Value, error) {
args = toJSValue(args).([]any)
r, err := safejs.Value(v).New(args...)
return Value(r), err
}
func toJSValue(jsValue any) any {
switch value := jsValue.(type) {
case Value:
return safejs.Value(value)
case Func:
return safejs.Func(value)
case map[string]any:
newValue := make(map[string]any)
for mapKey, mapValue := range value {
newValue[mapKey] = toJSValue(mapValue)
}
return newValue
case []any:
newValue := make([]any, len(value))
for i, arg := range value {
newValue[i] = toJSValue(arg)
}
return newValue
default:
return jsValue
}
}