- From: Mattias Buelens <notifications@github.com>
- Date: Thu, 08 Aug 2019 15:59:58 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/1008/519717244@github.com>
If `pull()` does not return a promise and it does not call `enqueue()`, then the stream will not call `pull()` again until `enqueue()` is called. In your case: after reaching the end of the array, the next `pull()` call does not enqueue any more chunks, so the stream will stop calling `pull()`. One solution would be to have `pull()` return a promise, and always enqueue at least one chunk before resolving that promise. For example: ```javascript function createReadableDataStream(source: number[]) { let nextAppendResolve; let nextAppendPromise = new Promise((resolve) => { nextAppendResolve = resolve; }); let append = (chunks) => { source.push(...chunks); nextAppendResolve(); nextAppendPromise = new Promise((resolve) => { nextAppendResolve = resolve; }); }; let position = 0; let stream = new ReadableStream({ type: "bytes", autoAllocateChunkSize: CHUNK_SIZE, async pull(controller: ReadableByteStreamController) { // when reaching the end of the current array, don't close the stream // the source array may be appended later while (position >= source.length) { await nextAppendPromise; } const view = controller.byobRequest.view; view[0] = source[position++]; controller.byobRequest.respond(1); } }); return { stream, append }; } let streamdata: number[] = new Array(5); for (let i = 0; i < streamdata.length; i++) { streamdata[i] = i + 1; } let { stream, append } = createReadableDataStream(streamdata); readAll(stream); // append more data to the underlying source setTimeout( () => { append([11, 12, 13]); }, 3000 ); ``` -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/streams/issues/1008#issuecomment-519717244
Received on Thursday, 8 August 2019 23:00:20 UTC