UNPKG

ix

Version:

The Interactive Extensions for JavaScript

134 lines (132 loc) 4.74 kB
import { __asyncDelegator, __asyncGenerator, __asyncValues, __await, __awaiter } from "tslib"; import { AsyncIterableX } from './asynciterablex.mjs'; /** @ignore */ const SharedArrayBuf = typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer : ArrayBuffer; /** @ignore */ /** @ignore */ export class AsyncIterableReadableStream extends AsyncIterableX { constructor(_stream) { super(); this._stream = _stream; } [Symbol.asyncIterator]() { const stream = this._stream; const reader = stream['getReader'](); return _consumeReader(stream, reader, defaultReaderToAsyncIterator(reader)); } } /** @ignore */ /** @ignore */ export class AsyncIterableReadableByteStream extends AsyncIterableReadableStream { [Symbol.asyncIterator]() { const stream = this._stream; let reader; try { reader = stream['getReader']({ mode: 'byob' }); } catch (e) { return super[Symbol.asyncIterator](); } const iterator = _consumeReader(stream, reader, byobReaderToAsyncIterator(reader)); // "pump" the iterator once so it initializes and is ready to accept a buffer or bytesToRead iterator.next(); return iterator; } } function _consumeReader(stream, reader, iterator) { return __asyncGenerator(this, arguments, function* _consumeReader_1() { let threw = false; try { yield __await(yield* __asyncDelegator(__asyncValues(iterator))); } catch (e) { if ((threw = true) && reader) { yield __await(reader['cancel'](e)); } } finally { if (reader) { if (!threw) { yield __await(reader['cancel']()); } if (stream.locked) { try { reader.closed.catch(() => { /* */ }); reader.releaseLock(); } catch (e) { /* */ } } } } }); } /** @ignore */ function defaultReaderToAsyncIterator(reader) { return __asyncGenerator(this, arguments, function* defaultReaderToAsyncIterator_1() { let r; while (!(r = yield __await(reader.read())).done) { yield yield __await(r.value); } }); } /** @ignore */ function byobReaderToAsyncIterator(reader) { return __asyncGenerator(this, arguments, function* byobReaderToAsyncIterator_1() { let r; let value = yield yield __await(null); while (!(r = yield __await(readNext(reader, value, 0))).done) { value = yield yield __await(r.value); } }); } /** @ignore */ function readNext(reader, bufferOrLen, offset) { return __awaiter(this, void 0, void 0, function* () { let size; let buffer; if (typeof bufferOrLen === 'number') { buffer = new ArrayBuffer((size = bufferOrLen)); } else if (bufferOrLen instanceof ArrayBuffer) { size = (buffer = bufferOrLen).byteLength; } else if (bufferOrLen instanceof SharedArrayBuf) { size = (buffer = bufferOrLen).byteLength; } else { return { done: true, value: undefined }; } return yield readInto(reader, buffer, offset, size); }); } /** @ignore */ function readInto(reader, buffer, offset, size) { return __awaiter(this, void 0, void 0, function* () { let innerOffset = offset; if (innerOffset >= size) { return { done: false, value: new Uint8Array(buffer, 0, size) }; } const { done, value } = yield reader.read(new Uint8Array(buffer, innerOffset, size - innerOffset)); if ((innerOffset += value.byteLength) < size && !done) { return yield readInto(reader, value.buffer, innerOffset, size); } return { done, value: new Uint8Array(value.buffer, 0, innerOffset) }; }); } /** * Creates an async-iterable from an existing DOM stream and optional options. * * @param {ReadableStream} stream The readable stream to convert to an async-iterable. * @param {{ mode: 'byob' }} [options] The optional options to set the mode for the DOM stream. * @returns {AsyncIterableX<any>} An async-iterable created from the incoming async-iterable. */ export function fromDOMStream(stream, options) { return !options || options['mode'] !== 'byob' ? new AsyncIterableReadableStream(stream) : new AsyncIterableReadableByteStream(stream); } //# sourceMappingURL=fromdomstream.mjs.map