UNPKG

@digital-blueprint/dispatch-app

Version:

[GitHub Repository](https://github.com/digital-blueprint/dispatch-app) | [npmjs package](https://www.npmjs.com/package/@digital-blueprint/dispatch-app) | [Unpkg CDN](https://unpkg.com/browse/@digital-blueprint/dispatch-app/) | [Dispatch Bundle](https://gi

33 lines (32 loc) 986 B
class DownloadStream extends ReadableStream { constructor(requests, strategy = { highWaterMark: 3 }) { const promises = [] const controller = new AbortController() const iterator = 'next' in requests ? requests : requests[Symbol.iterator in requests ? Symbol.iterator : Symbol.asyncIterator]() super({ async pull(ctrl) { let i = ctrl.desiredSize - promises.length while (i--) { const { done, value } = await iterator.next() if (done) break const promise = fetch(value, { signal: controller.signal }) promises.push(promise) } if (promises.length) ctrl.enqueue(await promises.shift()) else ctrl.close() }, cancel(e) { controller.abort(e) iterator.throw?.(e) } }, strategy) } [Symbol.asyncIterator]() { const reader = this.getReader() return { next() { return reader.read() }, throw(e) { reader.cancel(e) } } } }