fix: listen for ReadableStream cancellation

This commit is contained in:
Nicolas Lepage 2024-11-27 22:32:19 +01:00
parent c561826125
commit 2d786bdb14
No known key found for this signature in database
GPG Key ID: B0879E35E66D8F6F

View File

@ -12,6 +12,7 @@ type Writer struct {
Value safejs.Value
controller safejs.Value
ctx context.Context
cancelled bool
}
var _ io.WriteCloser = (*Writer)(nil)
@ -54,14 +55,25 @@ func NewWriter() (*Writer, error) {
return nil, err
}
return &Writer{
rs := &Writer{
Value: value,
controller: controller,
ctx: ctx,
}, nil
}
go func() {
<-ctx.Done()
rs.cancelled = true
}()
return rs, nil
}
func (rs *Writer) Write(b []byte) (int, error) {
if rs.cancelled {
return 0, nil
}
chunk, err := jstype.Uint8Array.New(len(b)) // FIXME reuse same Uint8Array?
if err != nil {
return 0, err
@ -78,6 +90,10 @@ func (rs *Writer) Write(b []byte) (int, error) {
}
func (rs *Writer) Close() error {
if rs.cancelled {
return nil
}
_, err := rs.controller.Call("close")
return err
}