| 110 | } |
| 111 | |
| 112 | func readableStream(readable js.Value) io.Reader { |
| 113 | pr, pw := io.Pipe() |
| 114 | go func() { |
| 115 | reader := readable.Call("getReader") |
| 116 | var buf []byte |
| 117 | for { |
| 118 | var ch chunk |
| 119 | if err := await(reader.Call("read"), &ch); ch.Done || err != nil { |
| 120 | pw.CloseWithError(err) |
| 121 | return |
| 122 | } |
| 123 | n := ch.Value.Length() |
| 124 | buf = slices.Grow(buf, n) |
| 125 | b := buf[:n] |
| 126 | js.CopyBytesToGo(b, ch.Value) |
| 127 | pw.Write(b) |
| 128 | } |
| 129 | }() |
| 130 | return pr |
| 131 | } |
| 132 | |
| 133 | func await(prom js.Value, v interface{}) error { |
| 134 | err := make(chan error) |