Skip to content

Commit

Permalink
feat: uses ReadableStream for request (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
nlepage authored Oct 14, 2024
1 parent 3220c94 commit b7e5adf
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 24 deletions.
Binary file modified docs/hello-sse/api.wasm
Binary file not shown.
Binary file modified docs/hello-state/api.wasm
Binary file not shown.
Binary file modified docs/hello/api.wasm
Binary file not shown.
85 changes: 85 additions & 0 deletions internal/readablestream/reader.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package readablestream

import (
"io"

promise "github.com/nlepage/go-js-promise"

"github.com/nlepage/go-wasm-http-server/internal/safejs"
)

type Reader struct {
value safejs.Value
buf []byte
off int
}

var _ io.Reader = (*Reader)(nil)

func NewReader(r safejs.Value) *Reader {
return &Reader{
value: r,
}
}

func (r *Reader) Read(p []byte) (int, error) {
if r.off < len(r.buf) {
n := copy(p, r.buf[r.off:])

r.off += n

return n, nil
}

r.off = 0

pRes, err := r.value.Call("read")
if err != nil {
return 0, err
}

ures, err := promise.Await(safejs.Unsafe(pRes))
if err != nil {
return 0, err
}

res := safejs.Safe(ures)

done, err := res.GetBool("done")
if err != nil {
return 0, err
}
if done {
return 0, io.EOF
}

value, err := res.Get("value")
if err != nil {
return 0, err
}

l, err := value.GetInt("length")
if err != nil {
return 0, err
}

if cap(r.buf) < l {
r.buf = make([]byte, l)
}
if len(r.buf) < cap(r.buf) {
r.buf = r.buf[:cap(r.buf)]
}

n, err := safejs.CopyBytesToGo(r.buf, value)
if err != nil {
return 0, err
}

r.buf = r.buf[:n]

n = copy(p, r.buf[r.off:])

r.off += n

return n, nil
}
File renamed without changes.
36 changes: 12 additions & 24 deletions request.go
Original file line number Diff line number Diff line change
@@ -1,65 +1,53 @@
package wasmhttp

import (
"bytes"
"net/http"
"net/http/httptest"
"syscall/js"

promise "github.com/nlepage/go-js-promise"

"github.com/nlepage/go-wasm-http-server/internal/jstype"
"github.com/nlepage/go-wasm-http-server/internal/readablestream"
"github.com/nlepage/go-wasm-http-server/internal/safejs"
)

// Request builds and returns the equivalent http.Request
func Request(ur js.Value) (*http.Request, error) {
r := safejs.Safe(ur)
func Request(uvalue js.Value) (*http.Request, error) {
value := safejs.Safe(uvalue)

ab, err := r.Call("arrayBuffer")
body, err := value.Get("body")
if err != nil {
return nil, err
}

u8a, err := jstype.Uint8Array.New(promise.Await(safejs.Unsafe(ab)))
r, err := body.Call("getReader")
if err != nil {
return nil, err
}

l, err := u8a.GetInt("length")
method, err := value.GetString("method")
if err != nil {
return nil, err
}

b := make([]byte, l)

_, err = safejs.CopyBytesToGo(b, u8a)
if err != nil {
return nil, err
}

method, err := r.GetString("method")
if err != nil {
return nil, err
}

url, err := r.GetString("url")
url, err := value.GetString("url")
if err != nil {
return nil, err
}

req := httptest.NewRequest(
method,
url,
bytes.NewReader(b),
readablestream.NewReader(r),
)

headers, err := r.Get("headers")
headers, err := value.Get("headers")
if err != nil {
return nil, err
}

headersIt, err := headers.Call("entries")
if err != nil {
return nil, err
}
for {
e, err := headersIt.Call("next")
if err != nil {
Expand Down

0 comments on commit b7e5adf

Please sign in to comment.