2024-10-14 22:23:22 +02:00
|
|
|
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"
|
2024-10-14 22:23:22 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
type Reader struct {
|
|
|
|
value safejs.Value
|
|
|
|
buf []byte
|
|
|
|
off int
|
|
|
|
}
|
|
|
|
|
2024-12-30 00:51:31 +01:00
|
|
|
var _ io.ReadCloser = (*Reader)(nil)
|
2024-10-14 22:23:22 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
2024-12-30 00:51:31 +01:00
|
|
|
|
|
|
|
func (r *Reader) Close() error {
|
|
|
|
p, err := r.value.Call("cancel")
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = promise.Await(safejs.Unsafe(p))
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|