97 lines
1.3 KiB
Go
Raw Permalink Normal View History

package readablestream
import (
"io"
promise "github.com/nlepage/go-js-promise"
2024-10-14 22:24:46 +02:00
"github.com/nlepage/go-wasm-http-server/v2/internal/safejs"
)
type Reader struct {
value safejs.Value
buf []byte
off int
}
var _ io.ReadCloser = (*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
}
func (r *Reader) Close() error {
p, err := r.value.Call("cancel")
if err != nil {
return err
}
_, err = promise.Await(safejs.Unsafe(p))
return err
}