Buckets:
| /** | |
| * @license | |
| * web-streams-polyfill v3.3.3 | |
| * Copyright 2024 Mattias Buelens, Diwank Singh Tomer and other contributors. | |
| * This code is released under the MIT license. | |
| * SPDX-License-Identifier: MIT | |
| */ | |
| (function (global, factory) { | |
| typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | |
| typeof define === 'function' && define.amd ? define(['exports'], factory) : | |
| (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.WebStreamsPolyfill = {})); | |
| })(this, (function (exports) { 'use strict'; | |
| /// <reference lib="es2015.symbol" /> | |
| var SymbolPolyfill = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? | |
| Symbol : | |
| function (description) { return "Symbol(".concat(description, ")"); }; | |
| /****************************************************************************** | |
| Copyright (c) Microsoft Corporation. | |
| Permission to use, copy, modify, and/or distribute this software for any | |
| purpose with or without fee is hereby granted. | |
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | |
| REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | |
| AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | |
| INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | |
| LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | |
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |
| PERFORMANCE OF THIS SOFTWARE. | |
| ***************************************************************************** */ | |
| /* global Reflect, Promise, SuppressedError, Symbol */ | |
| function __generator(thisArg, body) { | |
| var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | |
| return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | |
| function verb(n) { return function (v) { return step([n, v]); }; } | |
| function step(op) { | |
| if (f) throw new TypeError("Generator is already executing."); | |
| while (g && (g = 0, op[0] && (_ = 0)), _) try { | |
| if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | |
| if (y = 0, t) op = [op[0] & 2, t.value]; | |
| switch (op[0]) { | |
| case 0: case 1: t = op; break; | |
| case 4: _.label++; return { value: op[1], done: false }; | |
| case 5: _.label++; y = op[1]; op = [0]; continue; | |
| case 7: op = _.ops.pop(); _.trys.pop(); continue; | |
| default: | |
| if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | |
| if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | |
| if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | |
| if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | |
| if (t[2]) _.ops.pop(); | |
| _.trys.pop(); continue; | |
| } | |
| op = body.call(thisArg, _); | |
| } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | |
| if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | |
| } | |
| } | |
| function __values(o) { | |
| var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; | |
| if (m) return m.call(o); | |
| if (o && typeof o.length === "number") return { | |
| next: function () { | |
| if (o && i >= o.length) o = void 0; | |
| return { value: o && o[i++], done: !o }; | |
| } | |
| }; | |
| throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); | |
| } | |
| function __await(v) { | |
| return this instanceof __await ? (this.v = v, this) : new __await(v); | |
| } | |
| function __asyncGenerator(thisArg, _arguments, generator) { | |
| if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); | |
| var g = generator.apply(thisArg, _arguments || []), i, q = []; | |
| return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; | |
| function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } | |
| function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } | |
| function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } | |
| function fulfill(value) { resume("next", value); } | |
| function reject(value) { resume("throw", value); } | |
| function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } | |
| } | |
| function __asyncDelegator(o) { | |
| var i, p; | |
| return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; | |
| function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; } | |
| } | |
| function __asyncValues(o) { | |
| if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); | |
| var m = o[Symbol.asyncIterator], i; | |
| return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); | |
| function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } | |
| function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } | |
| } | |
| typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { | |
| var e = new Error(message); | |
| return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; | |
| }; | |
| function noop() { | |
| return undefined; | |
| } | |
| function typeIsObject(x) { | |
| return (typeof x === 'object' && x !== null) || typeof x === 'function'; | |
| } | |
| var rethrowAssertionErrorRejection = noop; | |
| function setFunctionName(fn, name) { | |
| try { | |
| Object.defineProperty(fn, 'name', { | |
| value: name, | |
| configurable: true | |
| }); | |
| } | |
| catch (_a) { | |
| // This property is non-configurable in older browsers, so ignore if this throws. | |
| // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility | |
| } | |
| } | |
| var originalPromise = Promise; | |
| var originalPromiseThen = Promise.prototype.then; | |
| var originalPromiseReject = Promise.reject.bind(originalPromise); | |
| // https://webidl.spec.whatwg.org/#a-new-promise | |
| function newPromise(executor) { | |
| return new originalPromise(executor); | |
| } | |
| // https://webidl.spec.whatwg.org/#a-promise-resolved-with | |
| function promiseResolvedWith(value) { | |
| return newPromise(function (resolve) { return resolve(value); }); | |
| } | |
| // https://webidl.spec.whatwg.org/#a-promise-rejected-with | |
| function promiseRejectedWith(reason) { | |
| return originalPromiseReject(reason); | |
| } | |
| function PerformPromiseThen(promise, onFulfilled, onRejected) { | |
| // There doesn't appear to be any way to correctly emulate the behaviour from JavaScript, so this is just an | |
| // approximation. | |
| return originalPromiseThen.call(promise, onFulfilled, onRejected); | |
| } | |
| // Bluebird logs a warning when a promise is created within a fulfillment handler, but then isn't returned | |
| // from that handler. To prevent this, return null instead of void from all handlers. | |
| // http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it | |
| function uponPromise(promise, onFulfilled, onRejected) { | |
| PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection); | |
| } | |
| function uponFulfillment(promise, onFulfilled) { | |
| uponPromise(promise, onFulfilled); | |
| } | |
| function uponRejection(promise, onRejected) { | |
| uponPromise(promise, undefined, onRejected); | |
| } | |
| function transformPromiseWith(promise, fulfillmentHandler, rejectionHandler) { | |
| return PerformPromiseThen(promise, fulfillmentHandler, rejectionHandler); | |
| } | |
| function setPromiseIsHandledToTrue(promise) { | |
| PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection); | |
| } | |
| var _queueMicrotask = function (callback) { | |
| if (typeof queueMicrotask === 'function') { | |
| _queueMicrotask = queueMicrotask; | |
| } | |
| else { | |
| var resolvedPromise_1 = promiseResolvedWith(undefined); | |
| _queueMicrotask = function (cb) { return PerformPromiseThen(resolvedPromise_1, cb); }; | |
| } | |
| return _queueMicrotask(callback); | |
| }; | |
| function reflectCall(F, V, args) { | |
| if (typeof F !== 'function') { | |
| throw new TypeError('Argument is not a function'); | |
| } | |
| return Function.prototype.apply.call(F, V, args); | |
| } | |
| function promiseCall(F, V, args) { | |
| try { | |
| return promiseResolvedWith(reflectCall(F, V, args)); | |
| } | |
| catch (value) { | |
| return promiseRejectedWith(value); | |
| } | |
| } | |
| // Original from Chromium | |
| // https://chromium.googlesource.com/chromium/src/+/0aee4434a4dba42a42abaea9bfbc0cd196a63bc1/third_party/blink/renderer/core/streams/SimpleQueue.js | |
| var QUEUE_MAX_ARRAY_SIZE = 16384; | |
| /** | |
| * Simple queue structure. | |
| * | |
| * Avoids scalability issues with using a packed array directly by using | |
| * multiple arrays in a linked list and keeping the array size bounded. | |
| */ | |
| var SimpleQueue = /** @class */ (function () { | |
| function SimpleQueue() { | |
| this._cursor = 0; | |
| this._size = 0; | |
| // _front and _back are always defined. | |
| this._front = { | |
| _elements: [], | |
| _next: undefined | |
| }; | |
| this._back = this._front; | |
| // The cursor is used to avoid calling Array.shift(). | |
| // It contains the index of the front element of the array inside the | |
| // front-most node. It is always in the range [0, QUEUE_MAX_ARRAY_SIZE). | |
| this._cursor = 0; | |
| // When there is only one node, size === elements.length - cursor. | |
| this._size = 0; | |
| } | |
| Object.defineProperty(SimpleQueue.prototype, "length", { | |
| get: function () { | |
| return this._size; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| // For exception safety, this method is structured in order: | |
| // 1. Read state | |
| // 2. Calculate required state mutations | |
| // 3. Perform state mutations | |
| SimpleQueue.prototype.push = function (element) { | |
| var oldBack = this._back; | |
| var newBack = oldBack; | |
| if (oldBack._elements.length === QUEUE_MAX_ARRAY_SIZE - 1) { | |
| newBack = { | |
| _elements: [], | |
| _next: undefined | |
| }; | |
| } | |
| // push() is the mutation most likely to throw an exception, so it | |
| // goes first. | |
| oldBack._elements.push(element); | |
| if (newBack !== oldBack) { | |
| this._back = newBack; | |
| oldBack._next = newBack; | |
| } | |
| ++this._size; | |
| }; | |
| // Like push(), shift() follows the read -> calculate -> mutate pattern for | |
| // exception safety. | |
| SimpleQueue.prototype.shift = function () { // must not be called on an empty queue | |
| var oldFront = this._front; | |
| var newFront = oldFront; | |
| var oldCursor = this._cursor; | |
| var newCursor = oldCursor + 1; | |
| var elements = oldFront._elements; | |
| var element = elements[oldCursor]; | |
| if (newCursor === QUEUE_MAX_ARRAY_SIZE) { | |
| newFront = oldFront._next; | |
| newCursor = 0; | |
| } | |
| // No mutations before this point. | |
| --this._size; | |
| this._cursor = newCursor; | |
| if (oldFront !== newFront) { | |
| this._front = newFront; | |
| } | |
| // Permit shifted element to be garbage collected. | |
| elements[oldCursor] = undefined; | |
| return element; | |
| }; | |
| // The tricky thing about forEach() is that it can be called | |
| // re-entrantly. The queue may be mutated inside the callback. It is easy to | |
| // see that push() within the callback has no negative effects since the end | |
| // of the queue is checked for on every iteration. If shift() is called | |
| // repeatedly within the callback then the next iteration may return an | |
| // element that has been removed. In this case the callback will be called | |
| // with undefined values until we either "catch up" with elements that still | |
| // exist or reach the back of the queue. | |
| SimpleQueue.prototype.forEach = function (callback) { | |
| var i = this._cursor; | |
| var node = this._front; | |
| var elements = node._elements; | |
| while (i !== elements.length || node._next !== undefined) { | |
| if (i === elements.length) { | |
| node = node._next; | |
| elements = node._elements; | |
| i = 0; | |
| if (elements.length === 0) { | |
| break; | |
| } | |
| } | |
| callback(elements[i]); | |
| ++i; | |
| } | |
| }; | |
| // Return the element that would be returned if shift() was called now, | |
| // without modifying the queue. | |
| SimpleQueue.prototype.peek = function () { // must not be called on an empty queue | |
| var front = this._front; | |
| var cursor = this._cursor; | |
| return front._elements[cursor]; | |
| }; | |
| return SimpleQueue; | |
| }()); | |
| var AbortSteps = SymbolPolyfill('[[AbortSteps]]'); | |
| var ErrorSteps = SymbolPolyfill('[[ErrorSteps]]'); | |
| var CancelSteps = SymbolPolyfill('[[CancelSteps]]'); | |
| var PullSteps = SymbolPolyfill('[[PullSteps]]'); | |
| var ReleaseSteps = SymbolPolyfill('[[ReleaseSteps]]'); | |
| function ReadableStreamReaderGenericInitialize(reader, stream) { | |
| reader._ownerReadableStream = stream; | |
| stream._reader = reader; | |
| if (stream._state === 'readable') { | |
| defaultReaderClosedPromiseInitialize(reader); | |
| } | |
| else if (stream._state === 'closed') { | |
| defaultReaderClosedPromiseInitializeAsResolved(reader); | |
| } | |
| else { | |
| defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError); | |
| } | |
| } | |
| // A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state | |
| // check. | |
| function ReadableStreamReaderGenericCancel(reader, reason) { | |
| var stream = reader._ownerReadableStream; | |
| return ReadableStreamCancel(stream, reason); | |
| } | |
| function ReadableStreamReaderGenericRelease(reader) { | |
| var stream = reader._ownerReadableStream; | |
| if (stream._state === 'readable') { | |
| defaultReaderClosedPromiseReject(reader, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")); | |
| } | |
| else { | |
| defaultReaderClosedPromiseResetToRejected(reader, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")); | |
| } | |
| stream._readableStreamController[ReleaseSteps](); | |
| stream._reader = undefined; | |
| reader._ownerReadableStream = undefined; | |
| } | |
| // Helper functions for the readers. | |
| function readerLockException(name) { | |
| return new TypeError('Cannot ' + name + ' a stream using a released reader'); | |
| } | |
| // Helper functions for the ReadableStreamDefaultReader. | |
| function defaultReaderClosedPromiseInitialize(reader) { | |
| reader._closedPromise = newPromise(function (resolve, reject) { | |
| reader._closedPromise_resolve = resolve; | |
| reader._closedPromise_reject = reject; | |
| }); | |
| } | |
| function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) { | |
| defaultReaderClosedPromiseInitialize(reader); | |
| defaultReaderClosedPromiseReject(reader, reason); | |
| } | |
| function defaultReaderClosedPromiseInitializeAsResolved(reader) { | |
| defaultReaderClosedPromiseInitialize(reader); | |
| defaultReaderClosedPromiseResolve(reader); | |
| } | |
| function defaultReaderClosedPromiseReject(reader, reason) { | |
| if (reader._closedPromise_reject === undefined) { | |
| return; | |
| } | |
| setPromiseIsHandledToTrue(reader._closedPromise); | |
| reader._closedPromise_reject(reason); | |
| reader._closedPromise_resolve = undefined; | |
| reader._closedPromise_reject = undefined; | |
| } | |
| function defaultReaderClosedPromiseResetToRejected(reader, reason) { | |
| defaultReaderClosedPromiseInitializeAsRejected(reader, reason); | |
| } | |
| function defaultReaderClosedPromiseResolve(reader) { | |
| if (reader._closedPromise_resolve === undefined) { | |
| return; | |
| } | |
| reader._closedPromise_resolve(undefined); | |
| reader._closedPromise_resolve = undefined; | |
| reader._closedPromise_reject = undefined; | |
| } | |
| /// <reference lib="es2015.core" /> | |
| // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill | |
| var NumberIsFinite = Number.isFinite || function (x) { | |
| return typeof x === 'number' && isFinite(x); | |
| }; | |
| /// <reference lib="es2015.core" /> | |
| // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc#Polyfill | |
| var MathTrunc = Math.trunc || function (v) { | |
| return v < 0 ? Math.ceil(v) : Math.floor(v); | |
| }; | |
| // https://heycam.github.io/webidl/#idl-dictionaries | |
| function isDictionary(x) { | |
| return typeof x === 'object' || typeof x === 'function'; | |
| } | |
| function assertDictionary(obj, context) { | |
| if (obj !== undefined && !isDictionary(obj)) { | |
| throw new TypeError("".concat(context, " is not an object.")); | |
| } | |
| } | |
| // https://heycam.github.io/webidl/#idl-callback-functions | |
| function assertFunction(x, context) { | |
| if (typeof x !== 'function') { | |
| throw new TypeError("".concat(context, " is not a function.")); | |
| } | |
| } | |
| // https://heycam.github.io/webidl/#idl-object | |
| function isObject(x) { | |
| return (typeof x === 'object' && x !== null) || typeof x === 'function'; | |
| } | |
| function assertObject(x, context) { | |
| if (!isObject(x)) { | |
| throw new TypeError("".concat(context, " is not an object.")); | |
| } | |
| } | |
| function assertRequiredArgument(x, position, context) { | |
| if (x === undefined) { | |
| throw new TypeError("Parameter ".concat(position, " is required in '").concat(context, "'.")); | |
| } | |
| } | |
| function assertRequiredField(x, field, context) { | |
| if (x === undefined) { | |
| throw new TypeError("".concat(field, " is required in '").concat(context, "'.")); | |
| } | |
| } | |
| // https://heycam.github.io/webidl/#idl-unrestricted-double | |
| function convertUnrestrictedDouble(value) { | |
| return Number(value); | |
| } | |
| function censorNegativeZero(x) { | |
| return x === 0 ? 0 : x; | |
| } | |
| function integerPart(x) { | |
| return censorNegativeZero(MathTrunc(x)); | |
| } | |
| // https://heycam.github.io/webidl/#idl-unsigned-long-long | |
| function convertUnsignedLongLongWithEnforceRange(value, context) { | |
| var lowerBound = 0; | |
| var upperBound = Number.MAX_SAFE_INTEGER; | |
| var x = Number(value); | |
| x = censorNegativeZero(x); | |
| if (!NumberIsFinite(x)) { | |
| throw new TypeError("".concat(context, " is not a finite number")); | |
| } | |
| x = integerPart(x); | |
| if (x < lowerBound || x > upperBound) { | |
| throw new TypeError("".concat(context, " is outside the accepted range of ").concat(lowerBound, " to ").concat(upperBound, ", inclusive")); | |
| } | |
| if (!NumberIsFinite(x) || x === 0) { | |
| return 0; | |
| } | |
| // TODO Use BigInt if supported? | |
| // let xBigInt = BigInt(integerPart(x)); | |
| // xBigInt = BigInt.asUintN(64, xBigInt); | |
| // return Number(xBigInt); | |
| return x; | |
| } | |
| function assertReadableStream(x, context) { | |
| if (!IsReadableStream(x)) { | |
| throw new TypeError("".concat(context, " is not a ReadableStream.")); | |
| } | |
| } | |
| // Abstract operations for the ReadableStream. | |
| function AcquireReadableStreamDefaultReader(stream) { | |
| return new ReadableStreamDefaultReader(stream); | |
| } | |
| // ReadableStream API exposed for controllers. | |
| function ReadableStreamAddReadRequest(stream, readRequest) { | |
| stream._reader._readRequests.push(readRequest); | |
| } | |
| function ReadableStreamFulfillReadRequest(stream, chunk, done) { | |
| var reader = stream._reader; | |
| var readRequest = reader._readRequests.shift(); | |
| if (done) { | |
| readRequest._closeSteps(); | |
| } | |
| else { | |
| readRequest._chunkSteps(chunk); | |
| } | |
| } | |
| function ReadableStreamGetNumReadRequests(stream) { | |
| return stream._reader._readRequests.length; | |
| } | |
| function ReadableStreamHasDefaultReader(stream) { | |
| var reader = stream._reader; | |
| if (reader === undefined) { | |
| return false; | |
| } | |
| if (!IsReadableStreamDefaultReader(reader)) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| /** | |
| * A default reader vended by a {@link ReadableStream}. | |
| * | |
| * @public | |
| */ | |
| var ReadableStreamDefaultReader = /** @class */ (function () { | |
| function ReadableStreamDefaultReader(stream) { | |
| assertRequiredArgument(stream, 1, 'ReadableStreamDefaultReader'); | |
| assertReadableStream(stream, 'First parameter'); | |
| if (IsReadableStreamLocked(stream)) { | |
| throw new TypeError('This stream has already been locked for exclusive reading by another reader'); | |
| } | |
| ReadableStreamReaderGenericInitialize(this, stream); | |
| this._readRequests = new SimpleQueue(); | |
| } | |
| Object.defineProperty(ReadableStreamDefaultReader.prototype, "closed", { | |
| /** | |
| * Returns a promise that will be fulfilled when the stream becomes closed, | |
| * or rejected if the stream ever errors or the reader's lock is released before the stream finishes closing. | |
| */ | |
| get: function () { | |
| if (!IsReadableStreamDefaultReader(this)) { | |
| return promiseRejectedWith(defaultReaderBrandCheckException('closed')); | |
| } | |
| return this._closedPromise; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. | |
| */ | |
| ReadableStreamDefaultReader.prototype.cancel = function (reason) { | |
| if (reason === void 0) { reason = undefined; } | |
| if (!IsReadableStreamDefaultReader(this)) { | |
| return promiseRejectedWith(defaultReaderBrandCheckException('cancel')); | |
| } | |
| if (this._ownerReadableStream === undefined) { | |
| return promiseRejectedWith(readerLockException('cancel')); | |
| } | |
| return ReadableStreamReaderGenericCancel(this, reason); | |
| }; | |
| /** | |
| * Returns a promise that allows access to the next chunk from the stream's internal queue, if available. | |
| * | |
| * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. | |
| */ | |
| ReadableStreamDefaultReader.prototype.read = function () { | |
| if (!IsReadableStreamDefaultReader(this)) { | |
| return promiseRejectedWith(defaultReaderBrandCheckException('read')); | |
| } | |
| if (this._ownerReadableStream === undefined) { | |
| return promiseRejectedWith(readerLockException('read from')); | |
| } | |
| var resolvePromise; | |
| var rejectPromise; | |
| var promise = newPromise(function (resolve, reject) { | |
| resolvePromise = resolve; | |
| rejectPromise = reject; | |
| }); | |
| var readRequest = { | |
| _chunkSteps: function (chunk) { return resolvePromise({ value: chunk, done: false }); }, | |
| _closeSteps: function () { return resolvePromise({ value: undefined, done: true }); }, | |
| _errorSteps: function (e) { return rejectPromise(e); } | |
| }; | |
| ReadableStreamDefaultReaderRead(this, readRequest); | |
| return promise; | |
| }; | |
| /** | |
| * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. | |
| * If the associated stream is errored when the lock is released, the reader will appear errored in the same way | |
| * from now on; otherwise, the reader will appear closed. | |
| * | |
| * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by | |
| * the reader's {@link ReadableStreamDefaultReader.read | read()} method has not yet been settled. Attempting to | |
| * do so will throw a `TypeError` and leave the reader locked to the stream. | |
| */ | |
| ReadableStreamDefaultReader.prototype.releaseLock = function () { | |
| if (!IsReadableStreamDefaultReader(this)) { | |
| throw defaultReaderBrandCheckException('releaseLock'); | |
| } | |
| if (this._ownerReadableStream === undefined) { | |
| return; | |
| } | |
| ReadableStreamDefaultReaderRelease(this); | |
| }; | |
| return ReadableStreamDefaultReader; | |
| }()); | |
| Object.defineProperties(ReadableStreamDefaultReader.prototype, { | |
| cancel: { enumerable: true }, | |
| read: { enumerable: true }, | |
| releaseLock: { enumerable: true }, | |
| closed: { enumerable: true } | |
| }); | |
| setFunctionName(ReadableStreamDefaultReader.prototype.cancel, 'cancel'); | |
| setFunctionName(ReadableStreamDefaultReader.prototype.read, 'read'); | |
| setFunctionName(ReadableStreamDefaultReader.prototype.releaseLock, 'releaseLock'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(ReadableStreamDefaultReader.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'ReadableStreamDefaultReader', | |
| configurable: true | |
| }); | |
| } | |
| // Abstract operations for the readers. | |
| function IsReadableStreamDefaultReader(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) { | |
| return false; | |
| } | |
| return x instanceof ReadableStreamDefaultReader; | |
| } | |
| function ReadableStreamDefaultReaderRead(reader, readRequest) { | |
| var stream = reader._ownerReadableStream; | |
| stream._disturbed = true; | |
| if (stream._state === 'closed') { | |
| readRequest._closeSteps(); | |
| } | |
| else if (stream._state === 'errored') { | |
| readRequest._errorSteps(stream._storedError); | |
| } | |
| else { | |
| stream._readableStreamController[PullSteps](readRequest); | |
| } | |
| } | |
| function ReadableStreamDefaultReaderRelease(reader) { | |
| ReadableStreamReaderGenericRelease(reader); | |
| var e = new TypeError('Reader was released'); | |
| ReadableStreamDefaultReaderErrorReadRequests(reader, e); | |
| } | |
| function ReadableStreamDefaultReaderErrorReadRequests(reader, e) { | |
| var readRequests = reader._readRequests; | |
| reader._readRequests = new SimpleQueue(); | |
| readRequests.forEach(function (readRequest) { | |
| readRequest._errorSteps(e); | |
| }); | |
| } | |
| // Helper functions for the ReadableStreamDefaultReader. | |
| function defaultReaderBrandCheckException(name) { | |
| return new TypeError("ReadableStreamDefaultReader.prototype.".concat(name, " can only be used on a ReadableStreamDefaultReader")); | |
| } | |
| var _a$1, _b, _c; | |
| function CreateArrayFromList(elements) { | |
| // We use arrays to represent lists, so this is basically a no-op. | |
| // Do a slice though just in case we happen to depend on the unique-ness. | |
| return elements.slice(); | |
| } | |
| function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) { | |
| new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset); | |
| } | |
| var TransferArrayBuffer = function (O) { | |
| if (typeof O.transfer === 'function') { | |
| TransferArrayBuffer = function (buffer) { return buffer.transfer(); }; | |
| } | |
| else if (typeof structuredClone === 'function') { | |
| TransferArrayBuffer = function (buffer) { return structuredClone(buffer, { transfer: [buffer] }); }; | |
| } | |
| else { | |
| // Not implemented correctly | |
| TransferArrayBuffer = function (buffer) { return buffer; }; | |
| } | |
| return TransferArrayBuffer(O); | |
| }; | |
| var IsDetachedBuffer = function (O) { | |
| if (typeof O.detached === 'boolean') { | |
| IsDetachedBuffer = function (buffer) { return buffer.detached; }; | |
| } | |
| else { | |
| // Not implemented correctly | |
| IsDetachedBuffer = function (buffer) { return buffer.byteLength === 0; }; | |
| } | |
| return IsDetachedBuffer(O); | |
| }; | |
| function ArrayBufferSlice(buffer, begin, end) { | |
| // ArrayBuffer.prototype.slice is not available on IE10 | |
| // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice | |
| if (buffer.slice) { | |
| return buffer.slice(begin, end); | |
| } | |
| var length = end - begin; | |
| var slice = new ArrayBuffer(length); | |
| CopyDataBlockBytes(slice, 0, buffer, begin, length); | |
| return slice; | |
| } | |
| function GetMethod(receiver, prop) { | |
| var func = receiver[prop]; | |
| if (func === undefined || func === null) { | |
| return undefined; | |
| } | |
| if (typeof func !== 'function') { | |
| throw new TypeError("".concat(String(prop), " is not a function")); | |
| } | |
| return func; | |
| } | |
| function CreateAsyncFromSyncIterator(syncIteratorRecord) { | |
| // Instead of re-implementing CreateAsyncFromSyncIterator and %AsyncFromSyncIteratorPrototype%, | |
| // we use yield* inside an async generator function to achieve the same result. | |
| var _a; | |
| // Wrap the sync iterator inside a sync iterable, so we can use it with yield*. | |
| var syncIterable = (_a = {}, | |
| _a[SymbolPolyfill.iterator] = function () { return syncIteratorRecord.iterator; }, | |
| _a); | |
| // Create an async generator function and immediately invoke it. | |
| var asyncIterator = (function () { | |
| return __asyncGenerator(this, arguments, function () { | |
| return __generator(this, function (_a) { | |
| switch (_a.label) { | |
| case 0: return [5 /*yield**/, __values(__asyncDelegator(__asyncValues(syncIterable)))]; | |
| case 1: return [4 /*yield*/, __await.apply(void 0, [_a.sent()])]; | |
| case 2: return [4 /*yield*/, __await.apply(void 0, [_a.sent()])]; | |
| case 3: return [2 /*return*/, _a.sent()]; | |
| } | |
| }); | |
| }); | |
| }()); | |
| // Return as an async iterator record. | |
| var nextMethod = asyncIterator.next; | |
| return { iterator: asyncIterator, nextMethod: nextMethod, done: false }; | |
| } | |
| // Aligns with core-js/modules/es.symbol.async-iterator.js | |
| var SymbolAsyncIterator = (_c = (_a$1 = SymbolPolyfill.asyncIterator) !== null && _a$1 !== void 0 ? _a$1 : (_b = SymbolPolyfill.for) === null || _b === void 0 ? void 0 : _b.call(SymbolPolyfill, 'Symbol.asyncIterator')) !== null && _c !== void 0 ? _c : '@@asyncIterator'; | |
| function GetIterator(obj, hint, method) { | |
| if (hint === void 0) { hint = 'sync'; } | |
| if (method === undefined) { | |
| if (hint === 'async') { | |
| method = GetMethod(obj, SymbolAsyncIterator); | |
| if (method === undefined) { | |
| var syncMethod = GetMethod(obj, SymbolPolyfill.iterator); | |
| var syncIteratorRecord = GetIterator(obj, 'sync', syncMethod); | |
| return CreateAsyncFromSyncIterator(syncIteratorRecord); | |
| } | |
| } | |
| else { | |
| method = GetMethod(obj, SymbolPolyfill.iterator); | |
| } | |
| } | |
| if (method === undefined) { | |
| throw new TypeError('The object is not iterable'); | |
| } | |
| var iterator = reflectCall(method, obj, []); | |
| if (!typeIsObject(iterator)) { | |
| throw new TypeError('The iterator method must return an object'); | |
| } | |
| var nextMethod = iterator.next; | |
| return { iterator: iterator, nextMethod: nextMethod, done: false }; | |
| } | |
| function IteratorNext(iteratorRecord) { | |
| var result = reflectCall(iteratorRecord.nextMethod, iteratorRecord.iterator, []); | |
| if (!typeIsObject(result)) { | |
| throw new TypeError('The iterator.next() method must return an object'); | |
| } | |
| return result; | |
| } | |
| function IteratorComplete(iterResult) { | |
| return Boolean(iterResult.done); | |
| } | |
| function IteratorValue(iterResult) { | |
| return iterResult.value; | |
| } | |
| /// <reference lib="es2018.asynciterable" /> | |
| var _a; | |
| // We cannot access %AsyncIteratorPrototype% without non-ES2018 syntax, but we can re-create it. | |
| var AsyncIteratorPrototype = (_a = {}, | |
| // 25.1.3.1 %AsyncIteratorPrototype% [ @@asyncIterator ] ( ) | |
| // https://tc39.github.io/ecma262/#sec-asynciteratorprototype-asynciterator | |
| _a[SymbolAsyncIterator] = function () { | |
| return this; | |
| }, | |
| _a); | |
| Object.defineProperty(AsyncIteratorPrototype, SymbolAsyncIterator, { enumerable: false }); | |
| /// <reference lib="es2018.asynciterable" /> | |
| var ReadableStreamAsyncIteratorImpl = /** @class */ (function () { | |
| function ReadableStreamAsyncIteratorImpl(reader, preventCancel) { | |
| this._ongoingPromise = undefined; | |
| this._isFinished = false; | |
| this._reader = reader; | |
| this._preventCancel = preventCancel; | |
| } | |
| ReadableStreamAsyncIteratorImpl.prototype.next = function () { | |
| var _this = this; | |
| var nextSteps = function () { return _this._nextSteps(); }; | |
| this._ongoingPromise = this._ongoingPromise ? | |
| transformPromiseWith(this._ongoingPromise, nextSteps, nextSteps) : | |
| nextSteps(); | |
| return this._ongoingPromise; | |
| }; | |
| ReadableStreamAsyncIteratorImpl.prototype.return = function (value) { | |
| var _this = this; | |
| var returnSteps = function () { return _this._returnSteps(value); }; | |
| return this._ongoingPromise ? | |
| transformPromiseWith(this._ongoingPromise, returnSteps, returnSteps) : | |
| returnSteps(); | |
| }; | |
| ReadableStreamAsyncIteratorImpl.prototype._nextSteps = function () { | |
| var _this = this; | |
| if (this._isFinished) { | |
| return Promise.resolve({ value: undefined, done: true }); | |
| } | |
| var reader = this._reader; | |
| var resolvePromise; | |
| var rejectPromise; | |
| var promise = newPromise(function (resolve, reject) { | |
| resolvePromise = resolve; | |
| rejectPromise = reject; | |
| }); | |
| var readRequest = { | |
| _chunkSteps: function (chunk) { | |
| _this._ongoingPromise = undefined; | |
| // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test. | |
| // FIXME Is this a bug in the specification, or in the test? | |
| _queueMicrotask(function () { return resolvePromise({ value: chunk, done: false }); }); | |
| }, | |
| _closeSteps: function () { | |
| _this._ongoingPromise = undefined; | |
| _this._isFinished = true; | |
| ReadableStreamReaderGenericRelease(reader); | |
| resolvePromise({ value: undefined, done: true }); | |
| }, | |
| _errorSteps: function (reason) { | |
| _this._ongoingPromise = undefined; | |
| _this._isFinished = true; | |
| ReadableStreamReaderGenericRelease(reader); | |
| rejectPromise(reason); | |
| } | |
| }; | |
| ReadableStreamDefaultReaderRead(reader, readRequest); | |
| return promise; | |
| }; | |
| ReadableStreamAsyncIteratorImpl.prototype._returnSteps = function (value) { | |
| if (this._isFinished) { | |
| return Promise.resolve({ value: value, done: true }); | |
| } | |
| this._isFinished = true; | |
| var reader = this._reader; | |
| if (!this._preventCancel) { | |
| var result = ReadableStreamReaderGenericCancel(reader, value); | |
| ReadableStreamReaderGenericRelease(reader); | |
| return transformPromiseWith(result, function () { return ({ value: value, done: true }); }); | |
| } | |
| ReadableStreamReaderGenericRelease(reader); | |
| return promiseResolvedWith({ value: value, done: true }); | |
| }; | |
| return ReadableStreamAsyncIteratorImpl; | |
| }()); | |
| var ReadableStreamAsyncIteratorPrototype = { | |
| next: function () { | |
| if (!IsReadableStreamAsyncIterator(this)) { | |
| return promiseRejectedWith(streamAsyncIteratorBrandCheckException('next')); | |
| } | |
| return this._asyncIteratorImpl.next(); | |
| }, | |
| return: function (value) { | |
| if (!IsReadableStreamAsyncIterator(this)) { | |
| return promiseRejectedWith(streamAsyncIteratorBrandCheckException('return')); | |
| } | |
| return this._asyncIteratorImpl.return(value); | |
| } | |
| }; | |
| Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); | |
| // Abstract operations for the ReadableStream. | |
| function AcquireReadableStreamAsyncIterator(stream, preventCancel) { | |
| var reader = AcquireReadableStreamDefaultReader(stream); | |
| var impl = new ReadableStreamAsyncIteratorImpl(reader, preventCancel); | |
| var iterator = Object.create(ReadableStreamAsyncIteratorPrototype); | |
| iterator._asyncIteratorImpl = impl; | |
| return iterator; | |
| } | |
| function IsReadableStreamAsyncIterator(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_asyncIteratorImpl')) { | |
| return false; | |
| } | |
| try { | |
| // noinspection SuspiciousTypeOfGuard | |
| return x._asyncIteratorImpl instanceof | |
| ReadableStreamAsyncIteratorImpl; | |
| } | |
| catch (_a) { | |
| return false; | |
| } | |
| } | |
| // Helper functions for the ReadableStream. | |
| function streamAsyncIteratorBrandCheckException(name) { | |
| return new TypeError("ReadableStreamAsyncIterator.".concat(name, " can only be used on a ReadableSteamAsyncIterator")); | |
| } | |
| /// <reference lib="es2015.core" /> | |
| // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#Polyfill | |
| var NumberIsNaN = Number.isNaN || function (x) { | |
| // eslint-disable-next-line no-self-compare | |
| return x !== x; | |
| }; | |
| function IsNonNegativeNumber(v) { | |
| if (typeof v !== 'number') { | |
| return false; | |
| } | |
| if (NumberIsNaN(v)) { | |
| return false; | |
| } | |
| if (v < 0) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| function CloneAsUint8Array(O) { | |
| var buffer = ArrayBufferSlice(O.buffer, O.byteOffset, O.byteOffset + O.byteLength); | |
| return new Uint8Array(buffer); | |
| } | |
| function DequeueValue(container) { | |
| var pair = container._queue.shift(); | |
| container._queueTotalSize -= pair.size; | |
| if (container._queueTotalSize < 0) { | |
| container._queueTotalSize = 0; | |
| } | |
| return pair.value; | |
| } | |
| function EnqueueValueWithSize(container, value, size) { | |
| if (!IsNonNegativeNumber(size) || size === Infinity) { | |
| throw new RangeError('Size must be a finite, non-NaN, non-negative number.'); | |
| } | |
| container._queue.push({ value: value, size: size }); | |
| container._queueTotalSize += size; | |
| } | |
| function PeekQueueValue(container) { | |
| var pair = container._queue.peek(); | |
| return pair.value; | |
| } | |
| function ResetQueue(container) { | |
| container._queue = new SimpleQueue(); | |
| container._queueTotalSize = 0; | |
| } | |
| function isDataViewConstructor(ctor) { | |
| return ctor === DataView; | |
| } | |
| function isDataView(view) { | |
| return isDataViewConstructor(view.constructor); | |
| } | |
| function arrayBufferViewElementSize(ctor) { | |
| if (isDataViewConstructor(ctor)) { | |
| return 1; | |
| } | |
| return ctor.BYTES_PER_ELEMENT; | |
| } | |
| /** | |
| * A pull-into request in a {@link ReadableByteStreamController}. | |
| * | |
| * @public | |
| */ | |
| var ReadableStreamBYOBRequest = /** @class */ (function () { | |
| function ReadableStreamBYOBRequest() { | |
| throw new TypeError('Illegal constructor'); | |
| } | |
| Object.defineProperty(ReadableStreamBYOBRequest.prototype, "view", { | |
| /** | |
| * Returns the view for writing in to, or `null` if the BYOB request has already been responded to. | |
| */ | |
| get: function () { | |
| if (!IsReadableStreamBYOBRequest(this)) { | |
| throw byobRequestBrandCheckException('view'); | |
| } | |
| return this._view; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| ReadableStreamBYOBRequest.prototype.respond = function (bytesWritten) { | |
| if (!IsReadableStreamBYOBRequest(this)) { | |
| throw byobRequestBrandCheckException('respond'); | |
| } | |
| assertRequiredArgument(bytesWritten, 1, 'respond'); | |
| bytesWritten = convertUnsignedLongLongWithEnforceRange(bytesWritten, 'First parameter'); | |
| if (this._associatedReadableByteStreamController === undefined) { | |
| throw new TypeError('This BYOB request has been invalidated'); | |
| } | |
| if (IsDetachedBuffer(this._view.buffer)) { | |
| throw new TypeError("The BYOB request's buffer has been detached and so cannot be used as a response"); | |
| } | |
| ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten); | |
| }; | |
| ReadableStreamBYOBRequest.prototype.respondWithNewView = function (view) { | |
| if (!IsReadableStreamBYOBRequest(this)) { | |
| throw byobRequestBrandCheckException('respondWithNewView'); | |
| } | |
| assertRequiredArgument(view, 1, 'respondWithNewView'); | |
| if (!ArrayBuffer.isView(view)) { | |
| throw new TypeError('You can only respond with array buffer views'); | |
| } | |
| if (this._associatedReadableByteStreamController === undefined) { | |
| throw new TypeError('This BYOB request has been invalidated'); | |
| } | |
| if (IsDetachedBuffer(view.buffer)) { | |
| throw new TypeError('The given view\'s buffer has been detached and so cannot be used as a response'); | |
| } | |
| ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view); | |
| }; | |
| return ReadableStreamBYOBRequest; | |
| }()); | |
| Object.defineProperties(ReadableStreamBYOBRequest.prototype, { | |
| respond: { enumerable: true }, | |
| respondWithNewView: { enumerable: true }, | |
| view: { enumerable: true } | |
| }); | |
| setFunctionName(ReadableStreamBYOBRequest.prototype.respond, 'respond'); | |
| setFunctionName(ReadableStreamBYOBRequest.prototype.respondWithNewView, 'respondWithNewView'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(ReadableStreamBYOBRequest.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'ReadableStreamBYOBRequest', | |
| configurable: true | |
| }); | |
| } | |
| /** | |
| * Allows control of a {@link ReadableStream | readable byte stream}'s state and internal queue. | |
| * | |
| * @public | |
| */ | |
| var ReadableByteStreamController = /** @class */ (function () { | |
| function ReadableByteStreamController() { | |
| throw new TypeError('Illegal constructor'); | |
| } | |
| Object.defineProperty(ReadableByteStreamController.prototype, "byobRequest", { | |
| /** | |
| * Returns the current BYOB pull request, or `null` if there isn't one. | |
| */ | |
| get: function () { | |
| if (!IsReadableByteStreamController(this)) { | |
| throw byteStreamControllerBrandCheckException('byobRequest'); | |
| } | |
| return ReadableByteStreamControllerGetBYOBRequest(this); | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(ReadableByteStreamController.prototype, "desiredSize", { | |
| /** | |
| * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is | |
| * over-full. An underlying byte source ought to use this information to determine when and how to apply backpressure. | |
| */ | |
| get: function () { | |
| if (!IsReadableByteStreamController(this)) { | |
| throw byteStreamControllerBrandCheckException('desiredSize'); | |
| } | |
| return ReadableByteStreamControllerGetDesiredSize(this); | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from | |
| * the stream, but once those are read, the stream will become closed. | |
| */ | |
| ReadableByteStreamController.prototype.close = function () { | |
| if (!IsReadableByteStreamController(this)) { | |
| throw byteStreamControllerBrandCheckException('close'); | |
| } | |
| if (this._closeRequested) { | |
| throw new TypeError('The stream has already been closed; do not close it again!'); | |
| } | |
| var state = this._controlledReadableByteStream._state; | |
| if (state !== 'readable') { | |
| throw new TypeError("The stream (in ".concat(state, " state) is not in the readable state and cannot be closed")); | |
| } | |
| ReadableByteStreamControllerClose(this); | |
| }; | |
| ReadableByteStreamController.prototype.enqueue = function (chunk) { | |
| if (!IsReadableByteStreamController(this)) { | |
| throw byteStreamControllerBrandCheckException('enqueue'); | |
| } | |
| assertRequiredArgument(chunk, 1, 'enqueue'); | |
| if (!ArrayBuffer.isView(chunk)) { | |
| throw new TypeError('chunk must be an array buffer view'); | |
| } | |
| if (chunk.byteLength === 0) { | |
| throw new TypeError('chunk must have non-zero byteLength'); | |
| } | |
| if (chunk.buffer.byteLength === 0) { | |
| throw new TypeError("chunk's buffer must have non-zero byteLength"); | |
| } | |
| if (this._closeRequested) { | |
| throw new TypeError('stream is closed or draining'); | |
| } | |
| var state = this._controlledReadableByteStream._state; | |
| if (state !== 'readable') { | |
| throw new TypeError("The stream (in ".concat(state, " state) is not in the readable state and cannot be enqueued to")); | |
| } | |
| ReadableByteStreamControllerEnqueue(this, chunk); | |
| }; | |
| /** | |
| * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. | |
| */ | |
| ReadableByteStreamController.prototype.error = function (e) { | |
| if (e === void 0) { e = undefined; } | |
| if (!IsReadableByteStreamController(this)) { | |
| throw byteStreamControllerBrandCheckException('error'); | |
| } | |
| ReadableByteStreamControllerError(this, e); | |
| }; | |
| /** @internal */ | |
| ReadableByteStreamController.prototype[CancelSteps] = function (reason) { | |
| ReadableByteStreamControllerClearPendingPullIntos(this); | |
| ResetQueue(this); | |
| var result = this._cancelAlgorithm(reason); | |
| ReadableByteStreamControllerClearAlgorithms(this); | |
| return result; | |
| }; | |
| /** @internal */ | |
| ReadableByteStreamController.prototype[PullSteps] = function (readRequest) { | |
| var stream = this._controlledReadableByteStream; | |
| if (this._queueTotalSize > 0) { | |
| ReadableByteStreamControllerFillReadRequestFromQueue(this, readRequest); | |
| return; | |
| } | |
| var autoAllocateChunkSize = this._autoAllocateChunkSize; | |
| if (autoAllocateChunkSize !== undefined) { | |
| var buffer = void 0; | |
| try { | |
| buffer = new ArrayBuffer(autoAllocateChunkSize); | |
| } | |
| catch (bufferE) { | |
| readRequest._errorSteps(bufferE); | |
| return; | |
| } | |
| var pullIntoDescriptor = { | |
| buffer: buffer, | |
| bufferByteLength: autoAllocateChunkSize, | |
| byteOffset: 0, | |
| byteLength: autoAllocateChunkSize, | |
| bytesFilled: 0, | |
| minimumFill: 1, | |
| elementSize: 1, | |
| viewConstructor: Uint8Array, | |
| readerType: 'default' | |
| }; | |
| this._pendingPullIntos.push(pullIntoDescriptor); | |
| } | |
| ReadableStreamAddReadRequest(stream, readRequest); | |
| ReadableByteStreamControllerCallPullIfNeeded(this); | |
| }; | |
| /** @internal */ | |
| ReadableByteStreamController.prototype[ReleaseSteps] = function () { | |
| if (this._pendingPullIntos.length > 0) { | |
| var firstPullInto = this._pendingPullIntos.peek(); | |
| firstPullInto.readerType = 'none'; | |
| this._pendingPullIntos = new SimpleQueue(); | |
| this._pendingPullIntos.push(firstPullInto); | |
| } | |
| }; | |
| return ReadableByteStreamController; | |
| }()); | |
| Object.defineProperties(ReadableByteStreamController.prototype, { | |
| close: { enumerable: true }, | |
| enqueue: { enumerable: true }, | |
| error: { enumerable: true }, | |
| byobRequest: { enumerable: true }, | |
| desiredSize: { enumerable: true } | |
| }); | |
| setFunctionName(ReadableByteStreamController.prototype.close, 'close'); | |
| setFunctionName(ReadableByteStreamController.prototype.enqueue, 'enqueue'); | |
| setFunctionName(ReadableByteStreamController.prototype.error, 'error'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(ReadableByteStreamController.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'ReadableByteStreamController', | |
| configurable: true | |
| }); | |
| } | |
| // Abstract operations for the ReadableByteStreamController. | |
| function IsReadableByteStreamController(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableByteStream')) { | |
| return false; | |
| } | |
| return x instanceof ReadableByteStreamController; | |
| } | |
| function IsReadableStreamBYOBRequest(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) { | |
| return false; | |
| } | |
| return x instanceof ReadableStreamBYOBRequest; | |
| } | |
| function ReadableByteStreamControllerCallPullIfNeeded(controller) { | |
| var shouldPull = ReadableByteStreamControllerShouldCallPull(controller); | |
| if (!shouldPull) { | |
| return; | |
| } | |
| if (controller._pulling) { | |
| controller._pullAgain = true; | |
| return; | |
| } | |
| controller._pulling = true; | |
| // TODO: Test controller argument | |
| var pullPromise = controller._pullAlgorithm(); | |
| uponPromise(pullPromise, function () { | |
| controller._pulling = false; | |
| if (controller._pullAgain) { | |
| controller._pullAgain = false; | |
| ReadableByteStreamControllerCallPullIfNeeded(controller); | |
| } | |
| return null; | |
| }, function (e) { | |
| ReadableByteStreamControllerError(controller, e); | |
| return null; | |
| }); | |
| } | |
| function ReadableByteStreamControllerClearPendingPullIntos(controller) { | |
| ReadableByteStreamControllerInvalidateBYOBRequest(controller); | |
| controller._pendingPullIntos = new SimpleQueue(); | |
| } | |
| function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) { | |
| var done = false; | |
| if (stream._state === 'closed') { | |
| done = true; | |
| } | |
| var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); | |
| if (pullIntoDescriptor.readerType === 'default') { | |
| ReadableStreamFulfillReadRequest(stream, filledView, done); | |
| } | |
| else { | |
| ReadableStreamFulfillReadIntoRequest(stream, filledView, done); | |
| } | |
| } | |
| function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) { | |
| var bytesFilled = pullIntoDescriptor.bytesFilled; | |
| var elementSize = pullIntoDescriptor.elementSize; | |
| return new pullIntoDescriptor.viewConstructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize); | |
| } | |
| function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) { | |
| controller._queue.push({ buffer: buffer, byteOffset: byteOffset, byteLength: byteLength }); | |
| controller._queueTotalSize += byteLength; | |
| } | |
| function ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, buffer, byteOffset, byteLength) { | |
| var clonedChunk; | |
| try { | |
| clonedChunk = ArrayBufferSlice(buffer, byteOffset, byteOffset + byteLength); | |
| } | |
| catch (cloneE) { | |
| ReadableByteStreamControllerError(controller, cloneE); | |
| throw cloneE; | |
| } | |
| ReadableByteStreamControllerEnqueueChunkToQueue(controller, clonedChunk, 0, byteLength); | |
| } | |
| function ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstDescriptor) { | |
| if (firstDescriptor.bytesFilled > 0) { | |
| ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, firstDescriptor.buffer, firstDescriptor.byteOffset, firstDescriptor.bytesFilled); | |
| } | |
| ReadableByteStreamControllerShiftPendingPullInto(controller); | |
| } | |
| function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) { | |
| var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled); | |
| var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy; | |
| var totalBytesToCopyRemaining = maxBytesToCopy; | |
| var ready = false; | |
| var remainderBytes = maxBytesFilled % pullIntoDescriptor.elementSize; | |
| var maxAlignedBytes = maxBytesFilled - remainderBytes; | |
| // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head | |
| // of the queue, so the underlying source can keep filling it. | |
| if (maxAlignedBytes >= pullIntoDescriptor.minimumFill) { | |
| totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled; | |
| ready = true; | |
| } | |
| var queue = controller._queue; | |
| while (totalBytesToCopyRemaining > 0) { | |
| var headOfQueue = queue.peek(); | |
| var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength); | |
| var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; | |
| CopyDataBlockBytes(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy); | |
| if (headOfQueue.byteLength === bytesToCopy) { | |
| queue.shift(); | |
| } | |
| else { | |
| headOfQueue.byteOffset += bytesToCopy; | |
| headOfQueue.byteLength -= bytesToCopy; | |
| } | |
| controller._queueTotalSize -= bytesToCopy; | |
| ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor); | |
| totalBytesToCopyRemaining -= bytesToCopy; | |
| } | |
| return ready; | |
| } | |
| function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) { | |
| pullIntoDescriptor.bytesFilled += size; | |
| } | |
| function ReadableByteStreamControllerHandleQueueDrain(controller) { | |
| if (controller._queueTotalSize === 0 && controller._closeRequested) { | |
| ReadableByteStreamControllerClearAlgorithms(controller); | |
| ReadableStreamClose(controller._controlledReadableByteStream); | |
| } | |
| else { | |
| ReadableByteStreamControllerCallPullIfNeeded(controller); | |
| } | |
| } | |
| function ReadableByteStreamControllerInvalidateBYOBRequest(controller) { | |
| if (controller._byobRequest === null) { | |
| return; | |
| } | |
| controller._byobRequest._associatedReadableByteStreamController = undefined; | |
| controller._byobRequest._view = null; | |
| controller._byobRequest = null; | |
| } | |
| function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) { | |
| while (controller._pendingPullIntos.length > 0) { | |
| if (controller._queueTotalSize === 0) { | |
| return; | |
| } | |
| var pullIntoDescriptor = controller._pendingPullIntos.peek(); | |
| if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { | |
| ReadableByteStreamControllerShiftPendingPullInto(controller); | |
| ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); | |
| } | |
| } | |
| } | |
| function ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller) { | |
| var reader = controller._controlledReadableByteStream._reader; | |
| while (reader._readRequests.length > 0) { | |
| if (controller._queueTotalSize === 0) { | |
| return; | |
| } | |
| var readRequest = reader._readRequests.shift(); | |
| ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest); | |
| } | |
| } | |
| function ReadableByteStreamControllerPullInto(controller, view, min, readIntoRequest) { | |
| var stream = controller._controlledReadableByteStream; | |
| var ctor = view.constructor; | |
| var elementSize = arrayBufferViewElementSize(ctor); | |
| var byteOffset = view.byteOffset, byteLength = view.byteLength; | |
| var minimumFill = min * elementSize; | |
| var buffer; | |
| try { | |
| buffer = TransferArrayBuffer(view.buffer); | |
| } | |
| catch (e) { | |
| readIntoRequest._errorSteps(e); | |
| return; | |
| } | |
| var pullIntoDescriptor = { | |
| buffer: buffer, | |
| bufferByteLength: buffer.byteLength, | |
| byteOffset: byteOffset, | |
| byteLength: byteLength, | |
| bytesFilled: 0, | |
| minimumFill: minimumFill, | |
| elementSize: elementSize, | |
| viewConstructor: ctor, | |
| readerType: 'byob' | |
| }; | |
| if (controller._pendingPullIntos.length > 0) { | |
| controller._pendingPullIntos.push(pullIntoDescriptor); | |
| // No ReadableByteStreamControllerCallPullIfNeeded() call since: | |
| // - No change happens on desiredSize | |
| // - The source has already been notified of that there's at least 1 pending read(view) | |
| ReadableStreamAddReadIntoRequest(stream, readIntoRequest); | |
| return; | |
| } | |
| if (stream._state === 'closed') { | |
| var emptyView = new ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0); | |
| readIntoRequest._closeSteps(emptyView); | |
| return; | |
| } | |
| if (controller._queueTotalSize > 0) { | |
| if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { | |
| var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); | |
| ReadableByteStreamControllerHandleQueueDrain(controller); | |
| readIntoRequest._chunkSteps(filledView); | |
| return; | |
| } | |
| if (controller._closeRequested) { | |
| var e = new TypeError('Insufficient bytes to fill elements in the given buffer'); | |
| ReadableByteStreamControllerError(controller, e); | |
| readIntoRequest._errorSteps(e); | |
| return; | |
| } | |
| } | |
| controller._pendingPullIntos.push(pullIntoDescriptor); | |
| ReadableStreamAddReadIntoRequest(stream, readIntoRequest); | |
| ReadableByteStreamControllerCallPullIfNeeded(controller); | |
| } | |
| function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) { | |
| if (firstDescriptor.readerType === 'none') { | |
| ReadableByteStreamControllerShiftPendingPullInto(controller); | |
| } | |
| var stream = controller._controlledReadableByteStream; | |
| if (ReadableStreamHasBYOBReader(stream)) { | |
| while (ReadableStreamGetNumReadIntoRequests(stream) > 0) { | |
| var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller); | |
| ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor); | |
| } | |
| } | |
| } | |
| function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) { | |
| ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor); | |
| if (pullIntoDescriptor.readerType === 'none') { | |
| ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, pullIntoDescriptor); | |
| ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); | |
| return; | |
| } | |
| if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.minimumFill) { | |
| // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head | |
| // of the queue, so the underlying source can keep filling it. | |
| return; | |
| } | |
| ReadableByteStreamControllerShiftPendingPullInto(controller); | |
| var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize; | |
| if (remainderSize > 0) { | |
| var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; | |
| ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, pullIntoDescriptor.buffer, end - remainderSize, remainderSize); | |
| } | |
| pullIntoDescriptor.bytesFilled -= remainderSize; | |
| ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); | |
| ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); | |
| } | |
| function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) { | |
| var firstDescriptor = controller._pendingPullIntos.peek(); | |
| ReadableByteStreamControllerInvalidateBYOBRequest(controller); | |
| var state = controller._controlledReadableByteStream._state; | |
| if (state === 'closed') { | |
| ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor); | |
| } | |
| else { | |
| ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor); | |
| } | |
| ReadableByteStreamControllerCallPullIfNeeded(controller); | |
| } | |
| function ReadableByteStreamControllerShiftPendingPullInto(controller) { | |
| var descriptor = controller._pendingPullIntos.shift(); | |
| return descriptor; | |
| } | |
| function ReadableByteStreamControllerShouldCallPull(controller) { | |
| var stream = controller._controlledReadableByteStream; | |
| if (stream._state !== 'readable') { | |
| return false; | |
| } | |
| if (controller._closeRequested) { | |
| return false; | |
| } | |
| if (!controller._started) { | |
| return false; | |
| } | |
| if (ReadableStreamHasDefaultReader(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { | |
| return true; | |
| } | |
| if (ReadableStreamHasBYOBReader(stream) && ReadableStreamGetNumReadIntoRequests(stream) > 0) { | |
| return true; | |
| } | |
| var desiredSize = ReadableByteStreamControllerGetDesiredSize(controller); | |
| if (desiredSize > 0) { | |
| return true; | |
| } | |
| return false; | |
| } | |
| function ReadableByteStreamControllerClearAlgorithms(controller) { | |
| controller._pullAlgorithm = undefined; | |
| controller._cancelAlgorithm = undefined; | |
| } | |
| // A client of ReadableByteStreamController may use these functions directly to bypass state check. | |
| function ReadableByteStreamControllerClose(controller) { | |
| var stream = controller._controlledReadableByteStream; | |
| if (controller._closeRequested || stream._state !== 'readable') { | |
| return; | |
| } | |
| if (controller._queueTotalSize > 0) { | |
| controller._closeRequested = true; | |
| return; | |
| } | |
| if (controller._pendingPullIntos.length > 0) { | |
| var firstPendingPullInto = controller._pendingPullIntos.peek(); | |
| if (firstPendingPullInto.bytesFilled % firstPendingPullInto.elementSize !== 0) { | |
| var e = new TypeError('Insufficient bytes to fill elements in the given buffer'); | |
| ReadableByteStreamControllerError(controller, e); | |
| throw e; | |
| } | |
| } | |
| ReadableByteStreamControllerClearAlgorithms(controller); | |
| ReadableStreamClose(stream); | |
| } | |
| function ReadableByteStreamControllerEnqueue(controller, chunk) { | |
| var stream = controller._controlledReadableByteStream; | |
| if (controller._closeRequested || stream._state !== 'readable') { | |
| return; | |
| } | |
| var buffer = chunk.buffer, byteOffset = chunk.byteOffset, byteLength = chunk.byteLength; | |
| if (IsDetachedBuffer(buffer)) { | |
| throw new TypeError('chunk\'s buffer is detached and so cannot be enqueued'); | |
| } | |
| var transferredBuffer = TransferArrayBuffer(buffer); | |
| if (controller._pendingPullIntos.length > 0) { | |
| var firstPendingPullInto = controller._pendingPullIntos.peek(); | |
| if (IsDetachedBuffer(firstPendingPullInto.buffer)) { | |
| throw new TypeError('The BYOB request\'s buffer has been detached and so cannot be filled with an enqueued chunk'); | |
| } | |
| ReadableByteStreamControllerInvalidateBYOBRequest(controller); | |
| firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer); | |
| if (firstPendingPullInto.readerType === 'none') { | |
| ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstPendingPullInto); | |
| } | |
| } | |
| if (ReadableStreamHasDefaultReader(stream)) { | |
| ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller); | |
| if (ReadableStreamGetNumReadRequests(stream) === 0) { | |
| ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); | |
| } | |
| else { | |
| if (controller._pendingPullIntos.length > 0) { | |
| ReadableByteStreamControllerShiftPendingPullInto(controller); | |
| } | |
| var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength); | |
| ReadableStreamFulfillReadRequest(stream, transferredView, false); | |
| } | |
| } | |
| else if (ReadableStreamHasBYOBReader(stream)) { | |
| // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully. | |
| ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); | |
| ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); | |
| } | |
| else { | |
| ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); | |
| } | |
| ReadableByteStreamControllerCallPullIfNeeded(controller); | |
| } | |
| function ReadableByteStreamControllerError(controller, e) { | |
| var stream = controller._controlledReadableByteStream; | |
| if (stream._state !== 'readable') { | |
| return; | |
| } | |
| ReadableByteStreamControllerClearPendingPullIntos(controller); | |
| ResetQueue(controller); | |
| ReadableByteStreamControllerClearAlgorithms(controller); | |
| ReadableStreamError(stream, e); | |
| } | |
| function ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest) { | |
| var entry = controller._queue.shift(); | |
| controller._queueTotalSize -= entry.byteLength; | |
| ReadableByteStreamControllerHandleQueueDrain(controller); | |
| var view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); | |
| readRequest._chunkSteps(view); | |
| } | |
| function ReadableByteStreamControllerGetBYOBRequest(controller) { | |
| if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) { | |
| var firstDescriptor = controller._pendingPullIntos.peek(); | |
| var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled); | |
| var byobRequest = Object.create(ReadableStreamBYOBRequest.prototype); | |
| SetUpReadableStreamBYOBRequest(byobRequest, controller, view); | |
| controller._byobRequest = byobRequest; | |
| } | |
| return controller._byobRequest; | |
| } | |
| function ReadableByteStreamControllerGetDesiredSize(controller) { | |
| var state = controller._controlledReadableByteStream._state; | |
| if (state === 'errored') { | |
| return null; | |
| } | |
| if (state === 'closed') { | |
| return 0; | |
| } | |
| return controller._strategyHWM - controller._queueTotalSize; | |
| } | |
| function ReadableByteStreamControllerRespond(controller, bytesWritten) { | |
| var firstDescriptor = controller._pendingPullIntos.peek(); | |
| var state = controller._controlledReadableByteStream._state; | |
| if (state === 'closed') { | |
| if (bytesWritten !== 0) { | |
| throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream'); | |
| } | |
| } | |
| else { | |
| if (bytesWritten === 0) { | |
| throw new TypeError('bytesWritten must be greater than 0 when calling respond() on a readable stream'); | |
| } | |
| if (firstDescriptor.bytesFilled + bytesWritten > firstDescriptor.byteLength) { | |
| throw new RangeError('bytesWritten out of range'); | |
| } | |
| } | |
| firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer); | |
| ReadableByteStreamControllerRespondInternal(controller, bytesWritten); | |
| } | |
| function ReadableByteStreamControllerRespondWithNewView(controller, view) { | |
| var firstDescriptor = controller._pendingPullIntos.peek(); | |
| var state = controller._controlledReadableByteStream._state; | |
| if (state === 'closed') { | |
| if (view.byteLength !== 0) { | |
| throw new TypeError('The view\'s length must be 0 when calling respondWithNewView() on a closed stream'); | |
| } | |
| } | |
| else { | |
| if (view.byteLength === 0) { | |
| throw new TypeError('The view\'s length must be greater than 0 when calling respondWithNewView() on a readable stream'); | |
| } | |
| } | |
| if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) { | |
| throw new RangeError('The region specified by view does not match byobRequest'); | |
| } | |
| if (firstDescriptor.bufferByteLength !== view.buffer.byteLength) { | |
| throw new RangeError('The buffer of view has different capacity than byobRequest'); | |
| } | |
| if (firstDescriptor.bytesFilled + view.byteLength > firstDescriptor.byteLength) { | |
| throw new RangeError('The region specified by view is larger than byobRequest'); | |
| } | |
| var viewByteLength = view.byteLength; | |
| firstDescriptor.buffer = TransferArrayBuffer(view.buffer); | |
| ReadableByteStreamControllerRespondInternal(controller, viewByteLength); | |
| } | |
| function SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize) { | |
| controller._controlledReadableByteStream = stream; | |
| controller._pullAgain = false; | |
| controller._pulling = false; | |
| controller._byobRequest = null; | |
| // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. | |
| controller._queue = controller._queueTotalSize = undefined; | |
| ResetQueue(controller); | |
| controller._closeRequested = false; | |
| controller._started = false; | |
| controller._strategyHWM = highWaterMark; | |
| controller._pullAlgorithm = pullAlgorithm; | |
| controller._cancelAlgorithm = cancelAlgorithm; | |
| controller._autoAllocateChunkSize = autoAllocateChunkSize; | |
| controller._pendingPullIntos = new SimpleQueue(); | |
| stream._readableStreamController = controller; | |
| var startResult = startAlgorithm(); | |
| uponPromise(promiseResolvedWith(startResult), function () { | |
| controller._started = true; | |
| ReadableByteStreamControllerCallPullIfNeeded(controller); | |
| return null; | |
| }, function (r) { | |
| ReadableByteStreamControllerError(controller, r); | |
| return null; | |
| }); | |
| } | |
| function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) { | |
| var controller = Object.create(ReadableByteStreamController.prototype); | |
| var startAlgorithm; | |
| var pullAlgorithm; | |
| var cancelAlgorithm; | |
| if (underlyingByteSource.start !== undefined) { | |
| startAlgorithm = function () { return underlyingByteSource.start(controller); }; | |
| } | |
| else { | |
| startAlgorithm = function () { return undefined; }; | |
| } | |
| if (underlyingByteSource.pull !== undefined) { | |
| pullAlgorithm = function () { return underlyingByteSource.pull(controller); }; | |
| } | |
| else { | |
| pullAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| if (underlyingByteSource.cancel !== undefined) { | |
| cancelAlgorithm = function (reason) { return underlyingByteSource.cancel(reason); }; | |
| } | |
| else { | |
| cancelAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize; | |
| if (autoAllocateChunkSize === 0) { | |
| throw new TypeError('autoAllocateChunkSize must be greater than 0'); | |
| } | |
| SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize); | |
| } | |
| function SetUpReadableStreamBYOBRequest(request, controller, view) { | |
| request._associatedReadableByteStreamController = controller; | |
| request._view = view; | |
| } | |
| // Helper functions for the ReadableStreamBYOBRequest. | |
| function byobRequestBrandCheckException(name) { | |
| return new TypeError("ReadableStreamBYOBRequest.prototype.".concat(name, " can only be used on a ReadableStreamBYOBRequest")); | |
| } | |
| // Helper functions for the ReadableByteStreamController. | |
| function byteStreamControllerBrandCheckException(name) { | |
| return new TypeError("ReadableByteStreamController.prototype.".concat(name, " can only be used on a ReadableByteStreamController")); | |
| } | |
| function convertReaderOptions(options, context) { | |
| assertDictionary(options, context); | |
| var mode = options === null || options === void 0 ? void 0 : options.mode; | |
| return { | |
| mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, "".concat(context, " has member 'mode' that")) | |
| }; | |
| } | |
| function convertReadableStreamReaderMode(mode, context) { | |
| mode = "".concat(mode); | |
| if (mode !== 'byob') { | |
| throw new TypeError("".concat(context, " '").concat(mode, "' is not a valid enumeration value for ReadableStreamReaderMode")); | |
| } | |
| return mode; | |
| } | |
| function convertByobReadOptions(options, context) { | |
| var _a; | |
| assertDictionary(options, context); | |
| var min = (_a = options === null || options === void 0 ? void 0 : options.min) !== null && _a !== void 0 ? _a : 1; | |
| return { | |
| min: convertUnsignedLongLongWithEnforceRange(min, "".concat(context, " has member 'min' that")) | |
| }; | |
| } | |
| // Abstract operations for the ReadableStream. | |
| function AcquireReadableStreamBYOBReader(stream) { | |
| return new ReadableStreamBYOBReader(stream); | |
| } | |
| // ReadableStream API exposed for controllers. | |
| function ReadableStreamAddReadIntoRequest(stream, readIntoRequest) { | |
| stream._reader._readIntoRequests.push(readIntoRequest); | |
| } | |
| function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) { | |
| var reader = stream._reader; | |
| var readIntoRequest = reader._readIntoRequests.shift(); | |
| if (done) { | |
| readIntoRequest._closeSteps(chunk); | |
| } | |
| else { | |
| readIntoRequest._chunkSteps(chunk); | |
| } | |
| } | |
| function ReadableStreamGetNumReadIntoRequests(stream) { | |
| return stream._reader._readIntoRequests.length; | |
| } | |
| function ReadableStreamHasBYOBReader(stream) { | |
| var reader = stream._reader; | |
| if (reader === undefined) { | |
| return false; | |
| } | |
| if (!IsReadableStreamBYOBReader(reader)) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| /** | |
| * A BYOB reader vended by a {@link ReadableStream}. | |
| * | |
| * @public | |
| */ | |
| var ReadableStreamBYOBReader = /** @class */ (function () { | |
| function ReadableStreamBYOBReader(stream) { | |
| assertRequiredArgument(stream, 1, 'ReadableStreamBYOBReader'); | |
| assertReadableStream(stream, 'First parameter'); | |
| if (IsReadableStreamLocked(stream)) { | |
| throw new TypeError('This stream has already been locked for exclusive reading by another reader'); | |
| } | |
| if (!IsReadableByteStreamController(stream._readableStreamController)) { | |
| throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + | |
| 'source'); | |
| } | |
| ReadableStreamReaderGenericInitialize(this, stream); | |
| this._readIntoRequests = new SimpleQueue(); | |
| } | |
| Object.defineProperty(ReadableStreamBYOBReader.prototype, "closed", { | |
| /** | |
| * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or | |
| * the reader's lock is released before the stream finishes closing. | |
| */ | |
| get: function () { | |
| if (!IsReadableStreamBYOBReader(this)) { | |
| return promiseRejectedWith(byobReaderBrandCheckException('closed')); | |
| } | |
| return this._closedPromise; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. | |
| */ | |
| ReadableStreamBYOBReader.prototype.cancel = function (reason) { | |
| if (reason === void 0) { reason = undefined; } | |
| if (!IsReadableStreamBYOBReader(this)) { | |
| return promiseRejectedWith(byobReaderBrandCheckException('cancel')); | |
| } | |
| if (this._ownerReadableStream === undefined) { | |
| return promiseRejectedWith(readerLockException('cancel')); | |
| } | |
| return ReadableStreamReaderGenericCancel(this, reason); | |
| }; | |
| ReadableStreamBYOBReader.prototype.read = function (view, rawOptions) { | |
| if (rawOptions === void 0) { rawOptions = {}; } | |
| if (!IsReadableStreamBYOBReader(this)) { | |
| return promiseRejectedWith(byobReaderBrandCheckException('read')); | |
| } | |
| if (!ArrayBuffer.isView(view)) { | |
| return promiseRejectedWith(new TypeError('view must be an array buffer view')); | |
| } | |
| if (view.byteLength === 0) { | |
| return promiseRejectedWith(new TypeError('view must have non-zero byteLength')); | |
| } | |
| if (view.buffer.byteLength === 0) { | |
| return promiseRejectedWith(new TypeError("view's buffer must have non-zero byteLength")); | |
| } | |
| if (IsDetachedBuffer(view.buffer)) { | |
| return promiseRejectedWith(new TypeError('view\'s buffer has been detached')); | |
| } | |
| var options; | |
| try { | |
| options = convertByobReadOptions(rawOptions, 'options'); | |
| } | |
| catch (e) { | |
| return promiseRejectedWith(e); | |
| } | |
| var min = options.min; | |
| if (min === 0) { | |
| return promiseRejectedWith(new TypeError('options.min must be greater than 0')); | |
| } | |
| if (!isDataView(view)) { | |
| if (min > view.length) { | |
| return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s length')); | |
| } | |
| } | |
| else if (min > view.byteLength) { | |
| return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s byteLength')); | |
| } | |
| if (this._ownerReadableStream === undefined) { | |
| return promiseRejectedWith(readerLockException('read from')); | |
| } | |
| var resolvePromise; | |
| var rejectPromise; | |
| var promise = newPromise(function (resolve, reject) { | |
| resolvePromise = resolve; | |
| rejectPromise = reject; | |
| }); | |
| var readIntoRequest = { | |
| _chunkSteps: function (chunk) { return resolvePromise({ value: chunk, done: false }); }, | |
| _closeSteps: function (chunk) { return resolvePromise({ value: chunk, done: true }); }, | |
| _errorSteps: function (e) { return rejectPromise(e); } | |
| }; | |
| ReadableStreamBYOBReaderRead(this, view, min, readIntoRequest); | |
| return promise; | |
| }; | |
| /** | |
| * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. | |
| * If the associated stream is errored when the lock is released, the reader will appear errored in the same way | |
| * from now on; otherwise, the reader will appear closed. | |
| * | |
| * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by | |
| * the reader's {@link ReadableStreamBYOBReader.read | read()} method has not yet been settled. Attempting to | |
| * do so will throw a `TypeError` and leave the reader locked to the stream. | |
| */ | |
| ReadableStreamBYOBReader.prototype.releaseLock = function () { | |
| if (!IsReadableStreamBYOBReader(this)) { | |
| throw byobReaderBrandCheckException('releaseLock'); | |
| } | |
| if (this._ownerReadableStream === undefined) { | |
| return; | |
| } | |
| ReadableStreamBYOBReaderRelease(this); | |
| }; | |
| return ReadableStreamBYOBReader; | |
| }()); | |
| Object.defineProperties(ReadableStreamBYOBReader.prototype, { | |
| cancel: { enumerable: true }, | |
| read: { enumerable: true }, | |
| releaseLock: { enumerable: true }, | |
| closed: { enumerable: true } | |
| }); | |
| setFunctionName(ReadableStreamBYOBReader.prototype.cancel, 'cancel'); | |
| setFunctionName(ReadableStreamBYOBReader.prototype.read, 'read'); | |
| setFunctionName(ReadableStreamBYOBReader.prototype.releaseLock, 'releaseLock'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(ReadableStreamBYOBReader.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'ReadableStreamBYOBReader', | |
| configurable: true | |
| }); | |
| } | |
| // Abstract operations for the readers. | |
| function IsReadableStreamBYOBReader(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) { | |
| return false; | |
| } | |
| return x instanceof ReadableStreamBYOBReader; | |
| } | |
| function ReadableStreamBYOBReaderRead(reader, view, min, readIntoRequest) { | |
| var stream = reader._ownerReadableStream; | |
| stream._disturbed = true; | |
| if (stream._state === 'errored') { | |
| readIntoRequest._errorSteps(stream._storedError); | |
| } | |
| else { | |
| ReadableByteStreamControllerPullInto(stream._readableStreamController, view, min, readIntoRequest); | |
| } | |
| } | |
| function ReadableStreamBYOBReaderRelease(reader) { | |
| ReadableStreamReaderGenericRelease(reader); | |
| var e = new TypeError('Reader was released'); | |
| ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); | |
| } | |
| function ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e) { | |
| var readIntoRequests = reader._readIntoRequests; | |
| reader._readIntoRequests = new SimpleQueue(); | |
| readIntoRequests.forEach(function (readIntoRequest) { | |
| readIntoRequest._errorSteps(e); | |
| }); | |
| } | |
| // Helper functions for the ReadableStreamBYOBReader. | |
| function byobReaderBrandCheckException(name) { | |
| return new TypeError("ReadableStreamBYOBReader.prototype.".concat(name, " can only be used on a ReadableStreamBYOBReader")); | |
| } | |
| function ExtractHighWaterMark(strategy, defaultHWM) { | |
| var highWaterMark = strategy.highWaterMark; | |
| if (highWaterMark === undefined) { | |
| return defaultHWM; | |
| } | |
| if (NumberIsNaN(highWaterMark) || highWaterMark < 0) { | |
| throw new RangeError('Invalid highWaterMark'); | |
| } | |
| return highWaterMark; | |
| } | |
| function ExtractSizeAlgorithm(strategy) { | |
| var size = strategy.size; | |
| if (!size) { | |
| return function () { return 1; }; | |
| } | |
| return size; | |
| } | |
| function convertQueuingStrategy(init, context) { | |
| assertDictionary(init, context); | |
| var highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; | |
| var size = init === null || init === void 0 ? void 0 : init.size; | |
| return { | |
| highWaterMark: highWaterMark === undefined ? undefined : convertUnrestrictedDouble(highWaterMark), | |
| size: size === undefined ? undefined : convertQueuingStrategySize(size, "".concat(context, " has member 'size' that")) | |
| }; | |
| } | |
| function convertQueuingStrategySize(fn, context) { | |
| assertFunction(fn, context); | |
| return function (chunk) { return convertUnrestrictedDouble(fn(chunk)); }; | |
| } | |
| function convertUnderlyingSink(original, context) { | |
| assertDictionary(original, context); | |
| var abort = original === null || original === void 0 ? void 0 : original.abort; | |
| var close = original === null || original === void 0 ? void 0 : original.close; | |
| var start = original === null || original === void 0 ? void 0 : original.start; | |
| var type = original === null || original === void 0 ? void 0 : original.type; | |
| var write = original === null || original === void 0 ? void 0 : original.write; | |
| return { | |
| abort: abort === undefined ? | |
| undefined : | |
| convertUnderlyingSinkAbortCallback(abort, original, "".concat(context, " has member 'abort' that")), | |
| close: close === undefined ? | |
| undefined : | |
| convertUnderlyingSinkCloseCallback(close, original, "".concat(context, " has member 'close' that")), | |
| start: start === undefined ? | |
| undefined : | |
| convertUnderlyingSinkStartCallback(start, original, "".concat(context, " has member 'start' that")), | |
| write: write === undefined ? | |
| undefined : | |
| convertUnderlyingSinkWriteCallback(write, original, "".concat(context, " has member 'write' that")), | |
| type: type | |
| }; | |
| } | |
| function convertUnderlyingSinkAbortCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (reason) { return promiseCall(fn, original, [reason]); }; | |
| } | |
| function convertUnderlyingSinkCloseCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function () { return promiseCall(fn, original, []); }; | |
| } | |
| function convertUnderlyingSinkStartCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (controller) { return reflectCall(fn, original, [controller]); }; | |
| } | |
| function convertUnderlyingSinkWriteCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (chunk, controller) { return promiseCall(fn, original, [chunk, controller]); }; | |
| } | |
| function assertWritableStream(x, context) { | |
| if (!IsWritableStream(x)) { | |
| throw new TypeError("".concat(context, " is not a WritableStream.")); | |
| } | |
| } | |
| function isAbortSignal(value) { | |
| if (typeof value !== 'object' || value === null) { | |
| return false; | |
| } | |
| try { | |
| return typeof value.aborted === 'boolean'; | |
| } | |
| catch (_a) { | |
| // AbortSignal.prototype.aborted throws if its brand check fails | |
| return false; | |
| } | |
| } | |
| var supportsAbortController = typeof AbortController === 'function'; | |
| /** | |
| * Construct a new AbortController, if supported by the platform. | |
| * | |
| * @internal | |
| */ | |
| function createAbortController() { | |
| if (supportsAbortController) { | |
| return new AbortController(); | |
| } | |
| return undefined; | |
| } | |
| /** | |
| * A writable stream represents a destination for data, into which you can write. | |
| * | |
| * @public | |
| */ | |
| var WritableStream = /** @class */ (function () { | |
| function WritableStream(rawUnderlyingSink, rawStrategy) { | |
| if (rawUnderlyingSink === void 0) { rawUnderlyingSink = {}; } | |
| if (rawStrategy === void 0) { rawStrategy = {}; } | |
| if (rawUnderlyingSink === undefined) { | |
| rawUnderlyingSink = null; | |
| } | |
| else { | |
| assertObject(rawUnderlyingSink, 'First parameter'); | |
| } | |
| var strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); | |
| var underlyingSink = convertUnderlyingSink(rawUnderlyingSink, 'First parameter'); | |
| InitializeWritableStream(this); | |
| var type = underlyingSink.type; | |
| if (type !== undefined) { | |
| throw new RangeError('Invalid type is specified'); | |
| } | |
| var sizeAlgorithm = ExtractSizeAlgorithm(strategy); | |
| var highWaterMark = ExtractHighWaterMark(strategy, 1); | |
| SetUpWritableStreamDefaultControllerFromUnderlyingSink(this, underlyingSink, highWaterMark, sizeAlgorithm); | |
| } | |
| Object.defineProperty(WritableStream.prototype, "locked", { | |
| /** | |
| * Returns whether or not the writable stream is locked to a writer. | |
| */ | |
| get: function () { | |
| if (!IsWritableStream(this)) { | |
| throw streamBrandCheckException$2('locked'); | |
| } | |
| return IsWritableStreamLocked(this); | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * Aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be | |
| * immediately moved to an errored state, with any queued-up writes discarded. This will also execute any abort | |
| * mechanism of the underlying sink. | |
| * | |
| * The returned promise will fulfill if the stream shuts down successfully, or reject if the underlying sink signaled | |
| * that there was an error doing so. Additionally, it will reject with a `TypeError` (without attempting to cancel | |
| * the stream) if the stream is currently locked. | |
| */ | |
| WritableStream.prototype.abort = function (reason) { | |
| if (reason === void 0) { reason = undefined; } | |
| if (!IsWritableStream(this)) { | |
| return promiseRejectedWith(streamBrandCheckException$2('abort')); | |
| } | |
| if (IsWritableStreamLocked(this)) { | |
| return promiseRejectedWith(new TypeError('Cannot abort a stream that already has a writer')); | |
| } | |
| return WritableStreamAbort(this, reason); | |
| }; | |
| /** | |
| * Closes the stream. The underlying sink will finish processing any previously-written chunks, before invoking its | |
| * close behavior. During this time any further attempts to write will fail (without erroring the stream). | |
| * | |
| * The method returns a promise that will fulfill if all remaining chunks are successfully written and the stream | |
| * successfully closes, or rejects if an error is encountered during this process. Additionally, it will reject with | |
| * a `TypeError` (without attempting to cancel the stream) if the stream is currently locked. | |
| */ | |
| WritableStream.prototype.close = function () { | |
| if (!IsWritableStream(this)) { | |
| return promiseRejectedWith(streamBrandCheckException$2('close')); | |
| } | |
| if (IsWritableStreamLocked(this)) { | |
| return promiseRejectedWith(new TypeError('Cannot close a stream that already has a writer')); | |
| } | |
| if (WritableStreamCloseQueuedOrInFlight(this)) { | |
| return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); | |
| } | |
| return WritableStreamClose(this); | |
| }; | |
| /** | |
| * Creates a {@link WritableStreamDefaultWriter | writer} and locks the stream to the new writer. While the stream | |
| * is locked, no other writer can be acquired until this one is released. | |
| * | |
| * This functionality is especially useful for creating abstractions that desire the ability to write to a stream | |
| * without interruption or interleaving. By getting a writer for the stream, you can ensure nobody else can write at | |
| * the same time, which would cause the resulting written data to be unpredictable and probably useless. | |
| */ | |
| WritableStream.prototype.getWriter = function () { | |
| if (!IsWritableStream(this)) { | |
| throw streamBrandCheckException$2('getWriter'); | |
| } | |
| return AcquireWritableStreamDefaultWriter(this); | |
| }; | |
| return WritableStream; | |
| }()); | |
| Object.defineProperties(WritableStream.prototype, { | |
| abort: { enumerable: true }, | |
| close: { enumerable: true }, | |
| getWriter: { enumerable: true }, | |
| locked: { enumerable: true } | |
| }); | |
| setFunctionName(WritableStream.prototype.abort, 'abort'); | |
| setFunctionName(WritableStream.prototype.close, 'close'); | |
| setFunctionName(WritableStream.prototype.getWriter, 'getWriter'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(WritableStream.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'WritableStream', | |
| configurable: true | |
| }); | |
| } | |
| // Abstract operations for the WritableStream. | |
| function AcquireWritableStreamDefaultWriter(stream) { | |
| return new WritableStreamDefaultWriter(stream); | |
| } | |
| // Throws if and only if startAlgorithm throws. | |
| function CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) { | |
| if (highWaterMark === void 0) { highWaterMark = 1; } | |
| if (sizeAlgorithm === void 0) { sizeAlgorithm = function () { return 1; }; } | |
| var stream = Object.create(WritableStream.prototype); | |
| InitializeWritableStream(stream); | |
| var controller = Object.create(WritableStreamDefaultController.prototype); | |
| SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); | |
| return stream; | |
| } | |
| function InitializeWritableStream(stream) { | |
| stream._state = 'writable'; | |
| // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is | |
| // 'erroring' or 'errored'. May be set to an undefined value. | |
| stream._storedError = undefined; | |
| stream._writer = undefined; | |
| // Initialize to undefined first because the constructor of the controller checks this | |
| // variable to validate the caller. | |
| stream._writableStreamController = undefined; | |
| // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data | |
| // producer without waiting for the queued writes to finish. | |
| stream._writeRequests = new SimpleQueue(); | |
| // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents | |
| // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here. | |
| stream._inFlightWriteRequest = undefined; | |
| // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer | |
| // has been detached. | |
| stream._closeRequest = undefined; | |
| // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it | |
| // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here. | |
| stream._inFlightCloseRequest = undefined; | |
| // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached. | |
| stream._pendingAbortRequest = undefined; | |
| // The backpressure signal set by the controller. | |
| stream._backpressure = false; | |
| } | |
| function IsWritableStream(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) { | |
| return false; | |
| } | |
| return x instanceof WritableStream; | |
| } | |
| function IsWritableStreamLocked(stream) { | |
| if (stream._writer === undefined) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| function WritableStreamAbort(stream, reason) { | |
| var _a; | |
| if (stream._state === 'closed' || stream._state === 'errored') { | |
| return promiseResolvedWith(undefined); | |
| } | |
| stream._writableStreamController._abortReason = reason; | |
| (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(reason); | |
| // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring', | |
| // but it doesn't know that signaling abort runs author code that might have changed the state. | |
| // Widen the type again by casting to WritableStreamState. | |
| var state = stream._state; | |
| if (state === 'closed' || state === 'errored') { | |
| return promiseResolvedWith(undefined); | |
| } | |
| if (stream._pendingAbortRequest !== undefined) { | |
| return stream._pendingAbortRequest._promise; | |
| } | |
| var wasAlreadyErroring = false; | |
| if (state === 'erroring') { | |
| wasAlreadyErroring = true; | |
| // reason will not be used, so don't keep a reference to it. | |
| reason = undefined; | |
| } | |
| var promise = newPromise(function (resolve, reject) { | |
| stream._pendingAbortRequest = { | |
| _promise: undefined, | |
| _resolve: resolve, | |
| _reject: reject, | |
| _reason: reason, | |
| _wasAlreadyErroring: wasAlreadyErroring | |
| }; | |
| }); | |
| stream._pendingAbortRequest._promise = promise; | |
| if (!wasAlreadyErroring) { | |
| WritableStreamStartErroring(stream, reason); | |
| } | |
| return promise; | |
| } | |
| function WritableStreamClose(stream) { | |
| var state = stream._state; | |
| if (state === 'closed' || state === 'errored') { | |
| return promiseRejectedWith(new TypeError("The stream (in ".concat(state, " state) is not in the writable state and cannot be closed"))); | |
| } | |
| var promise = newPromise(function (resolve, reject) { | |
| var closeRequest = { | |
| _resolve: resolve, | |
| _reject: reject | |
| }; | |
| stream._closeRequest = closeRequest; | |
| }); | |
| var writer = stream._writer; | |
| if (writer !== undefined && stream._backpressure && state === 'writable') { | |
| defaultWriterReadyPromiseResolve(writer); | |
| } | |
| WritableStreamDefaultControllerClose(stream._writableStreamController); | |
| return promise; | |
| } | |
| // WritableStream API exposed for controllers. | |
| function WritableStreamAddWriteRequest(stream) { | |
| var promise = newPromise(function (resolve, reject) { | |
| var writeRequest = { | |
| _resolve: resolve, | |
| _reject: reject | |
| }; | |
| stream._writeRequests.push(writeRequest); | |
| }); | |
| return promise; | |
| } | |
| function WritableStreamDealWithRejection(stream, error) { | |
| var state = stream._state; | |
| if (state === 'writable') { | |
| WritableStreamStartErroring(stream, error); | |
| return; | |
| } | |
| WritableStreamFinishErroring(stream); | |
| } | |
| function WritableStreamStartErroring(stream, reason) { | |
| var controller = stream._writableStreamController; | |
| stream._state = 'erroring'; | |
| stream._storedError = reason; | |
| var writer = stream._writer; | |
| if (writer !== undefined) { | |
| WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason); | |
| } | |
| if (!WritableStreamHasOperationMarkedInFlight(stream) && controller._started) { | |
| WritableStreamFinishErroring(stream); | |
| } | |
| } | |
| function WritableStreamFinishErroring(stream) { | |
| stream._state = 'errored'; | |
| stream._writableStreamController[ErrorSteps](); | |
| var storedError = stream._storedError; | |
| stream._writeRequests.forEach(function (writeRequest) { | |
| writeRequest._reject(storedError); | |
| }); | |
| stream._writeRequests = new SimpleQueue(); | |
| if (stream._pendingAbortRequest === undefined) { | |
| WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); | |
| return; | |
| } | |
| var abortRequest = stream._pendingAbortRequest; | |
| stream._pendingAbortRequest = undefined; | |
| if (abortRequest._wasAlreadyErroring) { | |
| abortRequest._reject(storedError); | |
| WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); | |
| return; | |
| } | |
| var promise = stream._writableStreamController[AbortSteps](abortRequest._reason); | |
| uponPromise(promise, function () { | |
| abortRequest._resolve(); | |
| WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); | |
| return null; | |
| }, function (reason) { | |
| abortRequest._reject(reason); | |
| WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); | |
| return null; | |
| }); | |
| } | |
| function WritableStreamFinishInFlightWrite(stream) { | |
| stream._inFlightWriteRequest._resolve(undefined); | |
| stream._inFlightWriteRequest = undefined; | |
| } | |
| function WritableStreamFinishInFlightWriteWithError(stream, error) { | |
| stream._inFlightWriteRequest._reject(error); | |
| stream._inFlightWriteRequest = undefined; | |
| WritableStreamDealWithRejection(stream, error); | |
| } | |
| function WritableStreamFinishInFlightClose(stream) { | |
| stream._inFlightCloseRequest._resolve(undefined); | |
| stream._inFlightCloseRequest = undefined; | |
| var state = stream._state; | |
| if (state === 'erroring') { | |
| // The error was too late to do anything, so it is ignored. | |
| stream._storedError = undefined; | |
| if (stream._pendingAbortRequest !== undefined) { | |
| stream._pendingAbortRequest._resolve(); | |
| stream._pendingAbortRequest = undefined; | |
| } | |
| } | |
| stream._state = 'closed'; | |
| var writer = stream._writer; | |
| if (writer !== undefined) { | |
| defaultWriterClosedPromiseResolve(writer); | |
| } | |
| } | |
| function WritableStreamFinishInFlightCloseWithError(stream, error) { | |
| stream._inFlightCloseRequest._reject(error); | |
| stream._inFlightCloseRequest = undefined; | |
| // Never execute sink abort() after sink close(). | |
| if (stream._pendingAbortRequest !== undefined) { | |
| stream._pendingAbortRequest._reject(error); | |
| stream._pendingAbortRequest = undefined; | |
| } | |
| WritableStreamDealWithRejection(stream, error); | |
| } | |
| // TODO(ricea): Fix alphabetical order. | |
| function WritableStreamCloseQueuedOrInFlight(stream) { | |
| if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| function WritableStreamHasOperationMarkedInFlight(stream) { | |
| if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| function WritableStreamMarkCloseRequestInFlight(stream) { | |
| stream._inFlightCloseRequest = stream._closeRequest; | |
| stream._closeRequest = undefined; | |
| } | |
| function WritableStreamMarkFirstWriteRequestInFlight(stream) { | |
| stream._inFlightWriteRequest = stream._writeRequests.shift(); | |
| } | |
| function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) { | |
| if (stream._closeRequest !== undefined) { | |
| stream._closeRequest._reject(stream._storedError); | |
| stream._closeRequest = undefined; | |
| } | |
| var writer = stream._writer; | |
| if (writer !== undefined) { | |
| defaultWriterClosedPromiseReject(writer, stream._storedError); | |
| } | |
| } | |
| function WritableStreamUpdateBackpressure(stream, backpressure) { | |
| var writer = stream._writer; | |
| if (writer !== undefined && backpressure !== stream._backpressure) { | |
| if (backpressure) { | |
| defaultWriterReadyPromiseReset(writer); | |
| } | |
| else { | |
| defaultWriterReadyPromiseResolve(writer); | |
| } | |
| } | |
| stream._backpressure = backpressure; | |
| } | |
| /** | |
| * A default writer vended by a {@link WritableStream}. | |
| * | |
| * @public | |
| */ | |
| var WritableStreamDefaultWriter = /** @class */ (function () { | |
| function WritableStreamDefaultWriter(stream) { | |
| assertRequiredArgument(stream, 1, 'WritableStreamDefaultWriter'); | |
| assertWritableStream(stream, 'First parameter'); | |
| if (IsWritableStreamLocked(stream)) { | |
| throw new TypeError('This stream has already been locked for exclusive writing by another writer'); | |
| } | |
| this._ownerWritableStream = stream; | |
| stream._writer = this; | |
| var state = stream._state; | |
| if (state === 'writable') { | |
| if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._backpressure) { | |
| defaultWriterReadyPromiseInitialize(this); | |
| } | |
| else { | |
| defaultWriterReadyPromiseInitializeAsResolved(this); | |
| } | |
| defaultWriterClosedPromiseInitialize(this); | |
| } | |
| else if (state === 'erroring') { | |
| defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError); | |
| defaultWriterClosedPromiseInitialize(this); | |
| } | |
| else if (state === 'closed') { | |
| defaultWriterReadyPromiseInitializeAsResolved(this); | |
| defaultWriterClosedPromiseInitializeAsResolved(this); | |
| } | |
| else { | |
| var storedError = stream._storedError; | |
| defaultWriterReadyPromiseInitializeAsRejected(this, storedError); | |
| defaultWriterClosedPromiseInitializeAsRejected(this, storedError); | |
| } | |
| } | |
| Object.defineProperty(WritableStreamDefaultWriter.prototype, "closed", { | |
| /** | |
| * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or | |
| * the writer’s lock is released before the stream finishes closing. | |
| */ | |
| get: function () { | |
| if (!IsWritableStreamDefaultWriter(this)) { | |
| return promiseRejectedWith(defaultWriterBrandCheckException('closed')); | |
| } | |
| return this._closedPromise; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(WritableStreamDefaultWriter.prototype, "desiredSize", { | |
| /** | |
| * Returns the desired size to fill the stream’s internal queue. It can be negative, if the queue is over-full. | |
| * A producer can use this information to determine the right amount of data to write. | |
| * | |
| * It will be `null` if the stream cannot be successfully written to (due to either being errored, or having an abort | |
| * queued up). It will return zero if the stream is closed. And the getter will throw an exception if invoked when | |
| * the writer’s lock is released. | |
| */ | |
| get: function () { | |
| if (!IsWritableStreamDefaultWriter(this)) { | |
| throw defaultWriterBrandCheckException('desiredSize'); | |
| } | |
| if (this._ownerWritableStream === undefined) { | |
| throw defaultWriterLockException('desiredSize'); | |
| } | |
| return WritableStreamDefaultWriterGetDesiredSize(this); | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(WritableStreamDefaultWriter.prototype, "ready", { | |
| /** | |
| * Returns a promise that will be fulfilled when the desired size to fill the stream’s internal queue transitions | |
| * from non-positive to positive, signaling that it is no longer applying backpressure. Once the desired size dips | |
| * back to zero or below, the getter will return a new promise that stays pending until the next transition. | |
| * | |
| * If the stream becomes errored or aborted, or the writer’s lock is released, the returned promise will become | |
| * rejected. | |
| */ | |
| get: function () { | |
| if (!IsWritableStreamDefaultWriter(this)) { | |
| return promiseRejectedWith(defaultWriterBrandCheckException('ready')); | |
| } | |
| return this._readyPromise; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * If the reader is active, behaves the same as {@link WritableStream.abort | stream.abort(reason)}. | |
| */ | |
| WritableStreamDefaultWriter.prototype.abort = function (reason) { | |
| if (reason === void 0) { reason = undefined; } | |
| if (!IsWritableStreamDefaultWriter(this)) { | |
| return promiseRejectedWith(defaultWriterBrandCheckException('abort')); | |
| } | |
| if (this._ownerWritableStream === undefined) { | |
| return promiseRejectedWith(defaultWriterLockException('abort')); | |
| } | |
| return WritableStreamDefaultWriterAbort(this, reason); | |
| }; | |
| /** | |
| * If the reader is active, behaves the same as {@link WritableStream.close | stream.close()}. | |
| */ | |
| WritableStreamDefaultWriter.prototype.close = function () { | |
| if (!IsWritableStreamDefaultWriter(this)) { | |
| return promiseRejectedWith(defaultWriterBrandCheckException('close')); | |
| } | |
| var stream = this._ownerWritableStream; | |
| if (stream === undefined) { | |
| return promiseRejectedWith(defaultWriterLockException('close')); | |
| } | |
| if (WritableStreamCloseQueuedOrInFlight(stream)) { | |
| return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); | |
| } | |
| return WritableStreamDefaultWriterClose(this); | |
| }; | |
| /** | |
| * Releases the writer’s lock on the corresponding stream. After the lock is released, the writer is no longer active. | |
| * If the associated stream is errored when the lock is released, the writer will appear errored in the same way from | |
| * now on; otherwise, the writer will appear closed. | |
| * | |
| * Note that the lock can still be released even if some ongoing writes have not yet finished (i.e. even if the | |
| * promises returned from previous calls to {@link WritableStreamDefaultWriter.write | write()} have not yet settled). | |
| * It’s not necessary to hold the lock on the writer for the duration of the write; the lock instead simply prevents | |
| * other producers from writing in an interleaved manner. | |
| */ | |
| WritableStreamDefaultWriter.prototype.releaseLock = function () { | |
| if (!IsWritableStreamDefaultWriter(this)) { | |
| throw defaultWriterBrandCheckException('releaseLock'); | |
| } | |
| var stream = this._ownerWritableStream; | |
| if (stream === undefined) { | |
| return; | |
| } | |
| WritableStreamDefaultWriterRelease(this); | |
| }; | |
| WritableStreamDefaultWriter.prototype.write = function (chunk) { | |
| if (chunk === void 0) { chunk = undefined; } | |
| if (!IsWritableStreamDefaultWriter(this)) { | |
| return promiseRejectedWith(defaultWriterBrandCheckException('write')); | |
| } | |
| if (this._ownerWritableStream === undefined) { | |
| return promiseRejectedWith(defaultWriterLockException('write to')); | |
| } | |
| return WritableStreamDefaultWriterWrite(this, chunk); | |
| }; | |
| return WritableStreamDefaultWriter; | |
| }()); | |
| Object.defineProperties(WritableStreamDefaultWriter.prototype, { | |
| abort: { enumerable: true }, | |
| close: { enumerable: true }, | |
| releaseLock: { enumerable: true }, | |
| write: { enumerable: true }, | |
| closed: { enumerable: true }, | |
| desiredSize: { enumerable: true }, | |
| ready: { enumerable: true } | |
| }); | |
| setFunctionName(WritableStreamDefaultWriter.prototype.abort, 'abort'); | |
| setFunctionName(WritableStreamDefaultWriter.prototype.close, 'close'); | |
| setFunctionName(WritableStreamDefaultWriter.prototype.releaseLock, 'releaseLock'); | |
| setFunctionName(WritableStreamDefaultWriter.prototype.write, 'write'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(WritableStreamDefaultWriter.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'WritableStreamDefaultWriter', | |
| configurable: true | |
| }); | |
| } | |
| // Abstract operations for the WritableStreamDefaultWriter. | |
| function IsWritableStreamDefaultWriter(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) { | |
| return false; | |
| } | |
| return x instanceof WritableStreamDefaultWriter; | |
| } | |
| // A client of WritableStreamDefaultWriter may use these functions directly to bypass state check. | |
| function WritableStreamDefaultWriterAbort(writer, reason) { | |
| var stream = writer._ownerWritableStream; | |
| return WritableStreamAbort(stream, reason); | |
| } | |
| function WritableStreamDefaultWriterClose(writer) { | |
| var stream = writer._ownerWritableStream; | |
| return WritableStreamClose(stream); | |
| } | |
| function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) { | |
| var stream = writer._ownerWritableStream; | |
| var state = stream._state; | |
| if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { | |
| return promiseResolvedWith(undefined); | |
| } | |
| if (state === 'errored') { | |
| return promiseRejectedWith(stream._storedError); | |
| } | |
| return WritableStreamDefaultWriterClose(writer); | |
| } | |
| function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) { | |
| if (writer._closedPromiseState === 'pending') { | |
| defaultWriterClosedPromiseReject(writer, error); | |
| } | |
| else { | |
| defaultWriterClosedPromiseResetToRejected(writer, error); | |
| } | |
| } | |
| function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) { | |
| if (writer._readyPromiseState === 'pending') { | |
| defaultWriterReadyPromiseReject(writer, error); | |
| } | |
| else { | |
| defaultWriterReadyPromiseResetToRejected(writer, error); | |
| } | |
| } | |
| function WritableStreamDefaultWriterGetDesiredSize(writer) { | |
| var stream = writer._ownerWritableStream; | |
| var state = stream._state; | |
| if (state === 'errored' || state === 'erroring') { | |
| return null; | |
| } | |
| if (state === 'closed') { | |
| return 0; | |
| } | |
| return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController); | |
| } | |
| function WritableStreamDefaultWriterRelease(writer) { | |
| var stream = writer._ownerWritableStream; | |
| var releasedError = new TypeError("Writer was released and can no longer be used to monitor the stream's closedness"); | |
| WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError); | |
| // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not | |
| // rejected until afterwards. This means that simply testing state will not work. | |
| WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError); | |
| stream._writer = undefined; | |
| writer._ownerWritableStream = undefined; | |
| } | |
| function WritableStreamDefaultWriterWrite(writer, chunk) { | |
| var stream = writer._ownerWritableStream; | |
| var controller = stream._writableStreamController; | |
| var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk); | |
| if (stream !== writer._ownerWritableStream) { | |
| return promiseRejectedWith(defaultWriterLockException('write to')); | |
| } | |
| var state = stream._state; | |
| if (state === 'errored') { | |
| return promiseRejectedWith(stream._storedError); | |
| } | |
| if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { | |
| return promiseRejectedWith(new TypeError('The stream is closing or closed and cannot be written to')); | |
| } | |
| if (state === 'erroring') { | |
| return promiseRejectedWith(stream._storedError); | |
| } | |
| var promise = WritableStreamAddWriteRequest(stream); | |
| WritableStreamDefaultControllerWrite(controller, chunk, chunkSize); | |
| return promise; | |
| } | |
| var closeSentinel = {}; | |
| /** | |
| * Allows control of a {@link WritableStream | writable stream}'s state and internal queue. | |
| * | |
| * @public | |
| */ | |
| var WritableStreamDefaultController = /** @class */ (function () { | |
| function WritableStreamDefaultController() { | |
| throw new TypeError('Illegal constructor'); | |
| } | |
| Object.defineProperty(WritableStreamDefaultController.prototype, "abortReason", { | |
| /** | |
| * The reason which was passed to `WritableStream.abort(reason)` when the stream was aborted. | |
| * | |
| * @deprecated | |
| * This property has been removed from the specification, see https://github.com/whatwg/streams/pull/1177. | |
| * Use {@link WritableStreamDefaultController.signal}'s `reason` instead. | |
| */ | |
| get: function () { | |
| if (!IsWritableStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException$2('abortReason'); | |
| } | |
| return this._abortReason; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(WritableStreamDefaultController.prototype, "signal", { | |
| /** | |
| * An `AbortSignal` that can be used to abort the pending write or close operation when the stream is aborted. | |
| */ | |
| get: function () { | |
| if (!IsWritableStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException$2('signal'); | |
| } | |
| if (this._abortController === undefined) { | |
| // Older browsers or older Node versions may not support `AbortController` or `AbortSignal`. | |
| // We don't want to bundle and ship an `AbortController` polyfill together with our polyfill, | |
| // so instead we only implement support for `signal` if we find a global `AbortController` constructor. | |
| throw new TypeError('WritableStreamDefaultController.prototype.signal is not supported'); | |
| } | |
| return this._abortController.signal; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * Closes the controlled writable stream, making all future interactions with it fail with the given error `e`. | |
| * | |
| * This method is rarely used, since usually it suffices to return a rejected promise from one of the underlying | |
| * sink's methods. However, it can be useful for suddenly shutting down a stream in response to an event outside the | |
| * normal lifecycle of interactions with the underlying sink. | |
| */ | |
| WritableStreamDefaultController.prototype.error = function (e) { | |
| if (e === void 0) { e = undefined; } | |
| if (!IsWritableStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException$2('error'); | |
| } | |
| var state = this._controlledWritableStream._state; | |
| if (state !== 'writable') { | |
| // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so | |
| // just treat it as a no-op. | |
| return; | |
| } | |
| WritableStreamDefaultControllerError(this, e); | |
| }; | |
| /** @internal */ | |
| WritableStreamDefaultController.prototype[AbortSteps] = function (reason) { | |
| var result = this._abortAlgorithm(reason); | |
| WritableStreamDefaultControllerClearAlgorithms(this); | |
| return result; | |
| }; | |
| /** @internal */ | |
| WritableStreamDefaultController.prototype[ErrorSteps] = function () { | |
| ResetQueue(this); | |
| }; | |
| return WritableStreamDefaultController; | |
| }()); | |
| Object.defineProperties(WritableStreamDefaultController.prototype, { | |
| abortReason: { enumerable: true }, | |
| signal: { enumerable: true }, | |
| error: { enumerable: true } | |
| }); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(WritableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'WritableStreamDefaultController', | |
| configurable: true | |
| }); | |
| } | |
| // Abstract operations implementing interface required by the WritableStream. | |
| function IsWritableStreamDefaultController(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_controlledWritableStream')) { | |
| return false; | |
| } | |
| return x instanceof WritableStreamDefaultController; | |
| } | |
| function SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) { | |
| controller._controlledWritableStream = stream; | |
| stream._writableStreamController = controller; | |
| // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. | |
| controller._queue = undefined; | |
| controller._queueTotalSize = undefined; | |
| ResetQueue(controller); | |
| controller._abortReason = undefined; | |
| controller._abortController = createAbortController(); | |
| controller._started = false; | |
| controller._strategySizeAlgorithm = sizeAlgorithm; | |
| controller._strategyHWM = highWaterMark; | |
| controller._writeAlgorithm = writeAlgorithm; | |
| controller._closeAlgorithm = closeAlgorithm; | |
| controller._abortAlgorithm = abortAlgorithm; | |
| var backpressure = WritableStreamDefaultControllerGetBackpressure(controller); | |
| WritableStreamUpdateBackpressure(stream, backpressure); | |
| var startResult = startAlgorithm(); | |
| var startPromise = promiseResolvedWith(startResult); | |
| uponPromise(startPromise, function () { | |
| controller._started = true; | |
| WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); | |
| return null; | |
| }, function (r) { | |
| controller._started = true; | |
| WritableStreamDealWithRejection(stream, r); | |
| return null; | |
| }); | |
| } | |
| function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) { | |
| var controller = Object.create(WritableStreamDefaultController.prototype); | |
| var startAlgorithm; | |
| var writeAlgorithm; | |
| var closeAlgorithm; | |
| var abortAlgorithm; | |
| if (underlyingSink.start !== undefined) { | |
| startAlgorithm = function () { return underlyingSink.start(controller); }; | |
| } | |
| else { | |
| startAlgorithm = function () { return undefined; }; | |
| } | |
| if (underlyingSink.write !== undefined) { | |
| writeAlgorithm = function (chunk) { return underlyingSink.write(chunk, controller); }; | |
| } | |
| else { | |
| writeAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| if (underlyingSink.close !== undefined) { | |
| closeAlgorithm = function () { return underlyingSink.close(); }; | |
| } | |
| else { | |
| closeAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| if (underlyingSink.abort !== undefined) { | |
| abortAlgorithm = function (reason) { return underlyingSink.abort(reason); }; | |
| } | |
| else { | |
| abortAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); | |
| } | |
| // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls. | |
| function WritableStreamDefaultControllerClearAlgorithms(controller) { | |
| controller._writeAlgorithm = undefined; | |
| controller._closeAlgorithm = undefined; | |
| controller._abortAlgorithm = undefined; | |
| controller._strategySizeAlgorithm = undefined; | |
| } | |
| function WritableStreamDefaultControllerClose(controller) { | |
| EnqueueValueWithSize(controller, closeSentinel, 0); | |
| WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); | |
| } | |
| function WritableStreamDefaultControllerGetChunkSize(controller, chunk) { | |
| try { | |
| return controller._strategySizeAlgorithm(chunk); | |
| } | |
| catch (chunkSizeE) { | |
| WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE); | |
| return 1; | |
| } | |
| } | |
| function WritableStreamDefaultControllerGetDesiredSize(controller) { | |
| return controller._strategyHWM - controller._queueTotalSize; | |
| } | |
| function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) { | |
| try { | |
| EnqueueValueWithSize(controller, chunk, chunkSize); | |
| } | |
| catch (enqueueE) { | |
| WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE); | |
| return; | |
| } | |
| var stream = controller._controlledWritableStream; | |
| if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._state === 'writable') { | |
| var backpressure = WritableStreamDefaultControllerGetBackpressure(controller); | |
| WritableStreamUpdateBackpressure(stream, backpressure); | |
| } | |
| WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); | |
| } | |
| // Abstract operations for the WritableStreamDefaultController. | |
| function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) { | |
| var stream = controller._controlledWritableStream; | |
| if (!controller._started) { | |
| return; | |
| } | |
| if (stream._inFlightWriteRequest !== undefined) { | |
| return; | |
| } | |
| var state = stream._state; | |
| if (state === 'erroring') { | |
| WritableStreamFinishErroring(stream); | |
| return; | |
| } | |
| if (controller._queue.length === 0) { | |
| return; | |
| } | |
| var value = PeekQueueValue(controller); | |
| if (value === closeSentinel) { | |
| WritableStreamDefaultControllerProcessClose(controller); | |
| } | |
| else { | |
| WritableStreamDefaultControllerProcessWrite(controller, value); | |
| } | |
| } | |
| function WritableStreamDefaultControllerErrorIfNeeded(controller, error) { | |
| if (controller._controlledWritableStream._state === 'writable') { | |
| WritableStreamDefaultControllerError(controller, error); | |
| } | |
| } | |
| function WritableStreamDefaultControllerProcessClose(controller) { | |
| var stream = controller._controlledWritableStream; | |
| WritableStreamMarkCloseRequestInFlight(stream); | |
| DequeueValue(controller); | |
| var sinkClosePromise = controller._closeAlgorithm(); | |
| WritableStreamDefaultControllerClearAlgorithms(controller); | |
| uponPromise(sinkClosePromise, function () { | |
| WritableStreamFinishInFlightClose(stream); | |
| return null; | |
| }, function (reason) { | |
| WritableStreamFinishInFlightCloseWithError(stream, reason); | |
| return null; | |
| }); | |
| } | |
| function WritableStreamDefaultControllerProcessWrite(controller, chunk) { | |
| var stream = controller._controlledWritableStream; | |
| WritableStreamMarkFirstWriteRequestInFlight(stream); | |
| var sinkWritePromise = controller._writeAlgorithm(chunk); | |
| uponPromise(sinkWritePromise, function () { | |
| WritableStreamFinishInFlightWrite(stream); | |
| var state = stream._state; | |
| DequeueValue(controller); | |
| if (!WritableStreamCloseQueuedOrInFlight(stream) && state === 'writable') { | |
| var backpressure = WritableStreamDefaultControllerGetBackpressure(controller); | |
| WritableStreamUpdateBackpressure(stream, backpressure); | |
| } | |
| WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); | |
| return null; | |
| }, function (reason) { | |
| if (stream._state === 'writable') { | |
| WritableStreamDefaultControllerClearAlgorithms(controller); | |
| } | |
| WritableStreamFinishInFlightWriteWithError(stream, reason); | |
| return null; | |
| }); | |
| } | |
| function WritableStreamDefaultControllerGetBackpressure(controller) { | |
| var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller); | |
| return desiredSize <= 0; | |
| } | |
| // A client of WritableStreamDefaultController may use these functions directly to bypass state check. | |
| function WritableStreamDefaultControllerError(controller, error) { | |
| var stream = controller._controlledWritableStream; | |
| WritableStreamDefaultControllerClearAlgorithms(controller); | |
| WritableStreamStartErroring(stream, error); | |
| } | |
| // Helper functions for the WritableStream. | |
| function streamBrandCheckException$2(name) { | |
| return new TypeError("WritableStream.prototype.".concat(name, " can only be used on a WritableStream")); | |
| } | |
| // Helper functions for the WritableStreamDefaultController. | |
| function defaultControllerBrandCheckException$2(name) { | |
| return new TypeError("WritableStreamDefaultController.prototype.".concat(name, " can only be used on a WritableStreamDefaultController")); | |
| } | |
| // Helper functions for the WritableStreamDefaultWriter. | |
| function defaultWriterBrandCheckException(name) { | |
| return new TypeError("WritableStreamDefaultWriter.prototype.".concat(name, " can only be used on a WritableStreamDefaultWriter")); | |
| } | |
| function defaultWriterLockException(name) { | |
| return new TypeError('Cannot ' + name + ' a stream using a released writer'); | |
| } | |
| function defaultWriterClosedPromiseInitialize(writer) { | |
| writer._closedPromise = newPromise(function (resolve, reject) { | |
| writer._closedPromise_resolve = resolve; | |
| writer._closedPromise_reject = reject; | |
| writer._closedPromiseState = 'pending'; | |
| }); | |
| } | |
| function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) { | |
| defaultWriterClosedPromiseInitialize(writer); | |
| defaultWriterClosedPromiseReject(writer, reason); | |
| } | |
| function defaultWriterClosedPromiseInitializeAsResolved(writer) { | |
| defaultWriterClosedPromiseInitialize(writer); | |
| defaultWriterClosedPromiseResolve(writer); | |
| } | |
| function defaultWriterClosedPromiseReject(writer, reason) { | |
| if (writer._closedPromise_reject === undefined) { | |
| return; | |
| } | |
| setPromiseIsHandledToTrue(writer._closedPromise); | |
| writer._closedPromise_reject(reason); | |
| writer._closedPromise_resolve = undefined; | |
| writer._closedPromise_reject = undefined; | |
| writer._closedPromiseState = 'rejected'; | |
| } | |
| function defaultWriterClosedPromiseResetToRejected(writer, reason) { | |
| defaultWriterClosedPromiseInitializeAsRejected(writer, reason); | |
| } | |
| function defaultWriterClosedPromiseResolve(writer) { | |
| if (writer._closedPromise_resolve === undefined) { | |
| return; | |
| } | |
| writer._closedPromise_resolve(undefined); | |
| writer._closedPromise_resolve = undefined; | |
| writer._closedPromise_reject = undefined; | |
| writer._closedPromiseState = 'resolved'; | |
| } | |
| function defaultWriterReadyPromiseInitialize(writer) { | |
| writer._readyPromise = newPromise(function (resolve, reject) { | |
| writer._readyPromise_resolve = resolve; | |
| writer._readyPromise_reject = reject; | |
| }); | |
| writer._readyPromiseState = 'pending'; | |
| } | |
| function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) { | |
| defaultWriterReadyPromiseInitialize(writer); | |
| defaultWriterReadyPromiseReject(writer, reason); | |
| } | |
| function defaultWriterReadyPromiseInitializeAsResolved(writer) { | |
| defaultWriterReadyPromiseInitialize(writer); | |
| defaultWriterReadyPromiseResolve(writer); | |
| } | |
| function defaultWriterReadyPromiseReject(writer, reason) { | |
| if (writer._readyPromise_reject === undefined) { | |
| return; | |
| } | |
| setPromiseIsHandledToTrue(writer._readyPromise); | |
| writer._readyPromise_reject(reason); | |
| writer._readyPromise_resolve = undefined; | |
| writer._readyPromise_reject = undefined; | |
| writer._readyPromiseState = 'rejected'; | |
| } | |
| function defaultWriterReadyPromiseReset(writer) { | |
| defaultWriterReadyPromiseInitialize(writer); | |
| } | |
| function defaultWriterReadyPromiseResetToRejected(writer, reason) { | |
| defaultWriterReadyPromiseInitializeAsRejected(writer, reason); | |
| } | |
| function defaultWriterReadyPromiseResolve(writer) { | |
| if (writer._readyPromise_resolve === undefined) { | |
| return; | |
| } | |
| writer._readyPromise_resolve(undefined); | |
| writer._readyPromise_resolve = undefined; | |
| writer._readyPromise_reject = undefined; | |
| writer._readyPromiseState = 'fulfilled'; | |
| } | |
| /// <reference lib="dom" /> | |
| function getGlobals() { | |
| if (typeof globalThis !== 'undefined') { | |
| return globalThis; | |
| } | |
| else if (typeof self !== 'undefined') { | |
| return self; | |
| } | |
| else if (typeof global !== 'undefined') { | |
| return global; | |
| } | |
| return undefined; | |
| } | |
| var globals = getGlobals(); | |
| /// <reference types="node" /> | |
| function isDOMExceptionConstructor(ctor) { | |
| if (!(typeof ctor === 'function' || typeof ctor === 'object')) { | |
| return false; | |
| } | |
| if (ctor.name !== 'DOMException') { | |
| return false; | |
| } | |
| try { | |
| new ctor(); | |
| return true; | |
| } | |
| catch (_a) { | |
| return false; | |
| } | |
| } | |
| /** | |
| * Support: | |
| * - Web browsers | |
| * - Node 18 and higher (https://github.com/nodejs/node/commit/e4b1fb5e6422c1ff151234bb9de792d45dd88d87) | |
| */ | |
| function getFromGlobal() { | |
| var ctor = globals === null || globals === void 0 ? void 0 : globals.DOMException; | |
| return isDOMExceptionConstructor(ctor) ? ctor : undefined; | |
| } | |
| /** | |
| * Support: | |
| * - All platforms | |
| */ | |
| function createPolyfill() { | |
| // eslint-disable-next-line @typescript-eslint/no-shadow | |
| var ctor = function DOMException(message, name) { | |
| this.message = message || ''; | |
| this.name = name || 'Error'; | |
| if (Error.captureStackTrace) { | |
| Error.captureStackTrace(this, this.constructor); | |
| } | |
| }; | |
| setFunctionName(ctor, 'DOMException'); | |
| ctor.prototype = Object.create(Error.prototype); | |
| Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true }); | |
| return ctor; | |
| } | |
| // eslint-disable-next-line @typescript-eslint/no-redeclare | |
| var DOMException = getFromGlobal() || createPolyfill(); | |
| function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) { | |
| var reader = AcquireReadableStreamDefaultReader(source); | |
| var writer = AcquireWritableStreamDefaultWriter(dest); | |
| source._disturbed = true; | |
| var shuttingDown = false; | |
| // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown. | |
| var currentWrite = promiseResolvedWith(undefined); | |
| return newPromise(function (resolve, reject) { | |
| var abortAlgorithm; | |
| if (signal !== undefined) { | |
| abortAlgorithm = function () { | |
| var error = signal.reason !== undefined ? signal.reason : new DOMException('Aborted', 'AbortError'); | |
| var actions = []; | |
| if (!preventAbort) { | |
| actions.push(function () { | |
| if (dest._state === 'writable') { | |
| return WritableStreamAbort(dest, error); | |
| } | |
| return promiseResolvedWith(undefined); | |
| }); | |
| } | |
| if (!preventCancel) { | |
| actions.push(function () { | |
| if (source._state === 'readable') { | |
| return ReadableStreamCancel(source, error); | |
| } | |
| return promiseResolvedWith(undefined); | |
| }); | |
| } | |
| shutdownWithAction(function () { return Promise.all(actions.map(function (action) { return action(); })); }, true, error); | |
| }; | |
| if (signal.aborted) { | |
| abortAlgorithm(); | |
| return; | |
| } | |
| signal.addEventListener('abort', abortAlgorithm); | |
| } | |
| // Using reader and writer, read all chunks from this and write them to dest | |
| // - Backpressure must be enforced | |
| // - Shutdown must stop all activity | |
| function pipeLoop() { | |
| return newPromise(function (resolveLoop, rejectLoop) { | |
| function next(done) { | |
| if (done) { | |
| resolveLoop(); | |
| } | |
| else { | |
| // Use `PerformPromiseThen` instead of `uponPromise` to avoid | |
| // adding unnecessary `.catch(rethrowAssertionErrorRejection)` handlers | |
| PerformPromiseThen(pipeStep(), next, rejectLoop); | |
| } | |
| } | |
| next(false); | |
| }); | |
| } | |
| function pipeStep() { | |
| if (shuttingDown) { | |
| return promiseResolvedWith(true); | |
| } | |
| return PerformPromiseThen(writer._readyPromise, function () { | |
| return newPromise(function (resolveRead, rejectRead) { | |
| ReadableStreamDefaultReaderRead(reader, { | |
| _chunkSteps: function (chunk) { | |
| currentWrite = PerformPromiseThen(WritableStreamDefaultWriterWrite(writer, chunk), undefined, noop); | |
| resolveRead(false); | |
| }, | |
| _closeSteps: function () { return resolveRead(true); }, | |
| _errorSteps: rejectRead | |
| }); | |
| }); | |
| }); | |
| } | |
| // Errors must be propagated forward | |
| isOrBecomesErrored(source, reader._closedPromise, function (storedError) { | |
| if (!preventAbort) { | |
| shutdownWithAction(function () { return WritableStreamAbort(dest, storedError); }, true, storedError); | |
| } | |
| else { | |
| shutdown(true, storedError); | |
| } | |
| return null; | |
| }); | |
| // Errors must be propagated backward | |
| isOrBecomesErrored(dest, writer._closedPromise, function (storedError) { | |
| if (!preventCancel) { | |
| shutdownWithAction(function () { return ReadableStreamCancel(source, storedError); }, true, storedError); | |
| } | |
| else { | |
| shutdown(true, storedError); | |
| } | |
| return null; | |
| }); | |
| // Closing must be propagated forward | |
| isOrBecomesClosed(source, reader._closedPromise, function () { | |
| if (!preventClose) { | |
| shutdownWithAction(function () { return WritableStreamDefaultWriterCloseWithErrorPropagation(writer); }); | |
| } | |
| else { | |
| shutdown(); | |
| } | |
| return null; | |
| }); | |
| // Closing must be propagated backward | |
| if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') { | |
| var destClosed_1 = new TypeError('the destination writable stream closed before all data could be piped to it'); | |
| if (!preventCancel) { | |
| shutdownWithAction(function () { return ReadableStreamCancel(source, destClosed_1); }, true, destClosed_1); | |
| } | |
| else { | |
| shutdown(true, destClosed_1); | |
| } | |
| } | |
| setPromiseIsHandledToTrue(pipeLoop()); | |
| function waitForWritesToFinish() { | |
| // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait | |
| // for that too. | |
| var oldCurrentWrite = currentWrite; | |
| return PerformPromiseThen(currentWrite, function () { return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined; }); | |
| } | |
| function isOrBecomesErrored(stream, promise, action) { | |
| if (stream._state === 'errored') { | |
| action(stream._storedError); | |
| } | |
| else { | |
| uponRejection(promise, action); | |
| } | |
| } | |
| function isOrBecomesClosed(stream, promise, action) { | |
| if (stream._state === 'closed') { | |
| action(); | |
| } | |
| else { | |
| uponFulfillment(promise, action); | |
| } | |
| } | |
| function shutdownWithAction(action, originalIsError, originalError) { | |
| if (shuttingDown) { | |
| return; | |
| } | |
| shuttingDown = true; | |
| if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { | |
| uponFulfillment(waitForWritesToFinish(), doTheRest); | |
| } | |
| else { | |
| doTheRest(); | |
| } | |
| function doTheRest() { | |
| uponPromise(action(), function () { return finalize(originalIsError, originalError); }, function (newError) { return finalize(true, newError); }); | |
| return null; | |
| } | |
| } | |
| function shutdown(isError, error) { | |
| if (shuttingDown) { | |
| return; | |
| } | |
| shuttingDown = true; | |
| if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { | |
| uponFulfillment(waitForWritesToFinish(), function () { return finalize(isError, error); }); | |
| } | |
| else { | |
| finalize(isError, error); | |
| } | |
| } | |
| function finalize(isError, error) { | |
| WritableStreamDefaultWriterRelease(writer); | |
| ReadableStreamReaderGenericRelease(reader); | |
| if (signal !== undefined) { | |
| signal.removeEventListener('abort', abortAlgorithm); | |
| } | |
| if (isError) { | |
| reject(error); | |
| } | |
| else { | |
| resolve(undefined); | |
| } | |
| return null; | |
| } | |
| }); | |
| } | |
| /** | |
| * Allows control of a {@link ReadableStream | readable stream}'s state and internal queue. | |
| * | |
| * @public | |
| */ | |
| var ReadableStreamDefaultController = /** @class */ (function () { | |
| function ReadableStreamDefaultController() { | |
| throw new TypeError('Illegal constructor'); | |
| } | |
| Object.defineProperty(ReadableStreamDefaultController.prototype, "desiredSize", { | |
| /** | |
| * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is | |
| * over-full. An underlying source ought to use this information to determine when and how to apply backpressure. | |
| */ | |
| get: function () { | |
| if (!IsReadableStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException$1('desiredSize'); | |
| } | |
| return ReadableStreamDefaultControllerGetDesiredSize(this); | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from | |
| * the stream, but once those are read, the stream will become closed. | |
| */ | |
| ReadableStreamDefaultController.prototype.close = function () { | |
| if (!IsReadableStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException$1('close'); | |
| } | |
| if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { | |
| throw new TypeError('The stream is not in a state that permits close'); | |
| } | |
| ReadableStreamDefaultControllerClose(this); | |
| }; | |
| ReadableStreamDefaultController.prototype.enqueue = function (chunk) { | |
| if (chunk === void 0) { chunk = undefined; } | |
| if (!IsReadableStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException$1('enqueue'); | |
| } | |
| if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { | |
| throw new TypeError('The stream is not in a state that permits enqueue'); | |
| } | |
| return ReadableStreamDefaultControllerEnqueue(this, chunk); | |
| }; | |
| /** | |
| * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. | |
| */ | |
| ReadableStreamDefaultController.prototype.error = function (e) { | |
| if (e === void 0) { e = undefined; } | |
| if (!IsReadableStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException$1('error'); | |
| } | |
| ReadableStreamDefaultControllerError(this, e); | |
| }; | |
| /** @internal */ | |
| ReadableStreamDefaultController.prototype[CancelSteps] = function (reason) { | |
| ResetQueue(this); | |
| var result = this._cancelAlgorithm(reason); | |
| ReadableStreamDefaultControllerClearAlgorithms(this); | |
| return result; | |
| }; | |
| /** @internal */ | |
| ReadableStreamDefaultController.prototype[PullSteps] = function (readRequest) { | |
| var stream = this._controlledReadableStream; | |
| if (this._queue.length > 0) { | |
| var chunk = DequeueValue(this); | |
| if (this._closeRequested && this._queue.length === 0) { | |
| ReadableStreamDefaultControllerClearAlgorithms(this); | |
| ReadableStreamClose(stream); | |
| } | |
| else { | |
| ReadableStreamDefaultControllerCallPullIfNeeded(this); | |
| } | |
| readRequest._chunkSteps(chunk); | |
| } | |
| else { | |
| ReadableStreamAddReadRequest(stream, readRequest); | |
| ReadableStreamDefaultControllerCallPullIfNeeded(this); | |
| } | |
| }; | |
| /** @internal */ | |
| ReadableStreamDefaultController.prototype[ReleaseSteps] = function () { | |
| // Do nothing. | |
| }; | |
| return ReadableStreamDefaultController; | |
| }()); | |
| Object.defineProperties(ReadableStreamDefaultController.prototype, { | |
| close: { enumerable: true }, | |
| enqueue: { enumerable: true }, | |
| error: { enumerable: true }, | |
| desiredSize: { enumerable: true } | |
| }); | |
| setFunctionName(ReadableStreamDefaultController.prototype.close, 'close'); | |
| setFunctionName(ReadableStreamDefaultController.prototype.enqueue, 'enqueue'); | |
| setFunctionName(ReadableStreamDefaultController.prototype.error, 'error'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(ReadableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'ReadableStreamDefaultController', | |
| configurable: true | |
| }); | |
| } | |
| // Abstract operations for the ReadableStreamDefaultController. | |
| function IsReadableStreamDefaultController(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableStream')) { | |
| return false; | |
| } | |
| return x instanceof ReadableStreamDefaultController; | |
| } | |
| function ReadableStreamDefaultControllerCallPullIfNeeded(controller) { | |
| var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller); | |
| if (!shouldPull) { | |
| return; | |
| } | |
| if (controller._pulling) { | |
| controller._pullAgain = true; | |
| return; | |
| } | |
| controller._pulling = true; | |
| var pullPromise = controller._pullAlgorithm(); | |
| uponPromise(pullPromise, function () { | |
| controller._pulling = false; | |
| if (controller._pullAgain) { | |
| controller._pullAgain = false; | |
| ReadableStreamDefaultControllerCallPullIfNeeded(controller); | |
| } | |
| return null; | |
| }, function (e) { | |
| ReadableStreamDefaultControllerError(controller, e); | |
| return null; | |
| }); | |
| } | |
| function ReadableStreamDefaultControllerShouldCallPull(controller) { | |
| var stream = controller._controlledReadableStream; | |
| if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { | |
| return false; | |
| } | |
| if (!controller._started) { | |
| return false; | |
| } | |
| if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { | |
| return true; | |
| } | |
| var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller); | |
| if (desiredSize > 0) { | |
| return true; | |
| } | |
| return false; | |
| } | |
| function ReadableStreamDefaultControllerClearAlgorithms(controller) { | |
| controller._pullAlgorithm = undefined; | |
| controller._cancelAlgorithm = undefined; | |
| controller._strategySizeAlgorithm = undefined; | |
| } | |
| // A client of ReadableStreamDefaultController may use these functions directly to bypass state check. | |
| function ReadableStreamDefaultControllerClose(controller) { | |
| if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { | |
| return; | |
| } | |
| var stream = controller._controlledReadableStream; | |
| controller._closeRequested = true; | |
| if (controller._queue.length === 0) { | |
| ReadableStreamDefaultControllerClearAlgorithms(controller); | |
| ReadableStreamClose(stream); | |
| } | |
| } | |
| function ReadableStreamDefaultControllerEnqueue(controller, chunk) { | |
| if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { | |
| return; | |
| } | |
| var stream = controller._controlledReadableStream; | |
| if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { | |
| ReadableStreamFulfillReadRequest(stream, chunk, false); | |
| } | |
| else { | |
| var chunkSize = void 0; | |
| try { | |
| chunkSize = controller._strategySizeAlgorithm(chunk); | |
| } | |
| catch (chunkSizeE) { | |
| ReadableStreamDefaultControllerError(controller, chunkSizeE); | |
| throw chunkSizeE; | |
| } | |
| try { | |
| EnqueueValueWithSize(controller, chunk, chunkSize); | |
| } | |
| catch (enqueueE) { | |
| ReadableStreamDefaultControllerError(controller, enqueueE); | |
| throw enqueueE; | |
| } | |
| } | |
| ReadableStreamDefaultControllerCallPullIfNeeded(controller); | |
| } | |
| function ReadableStreamDefaultControllerError(controller, e) { | |
| var stream = controller._controlledReadableStream; | |
| if (stream._state !== 'readable') { | |
| return; | |
| } | |
| ResetQueue(controller); | |
| ReadableStreamDefaultControllerClearAlgorithms(controller); | |
| ReadableStreamError(stream, e); | |
| } | |
| function ReadableStreamDefaultControllerGetDesiredSize(controller) { | |
| var state = controller._controlledReadableStream._state; | |
| if (state === 'errored') { | |
| return null; | |
| } | |
| if (state === 'closed') { | |
| return 0; | |
| } | |
| return controller._strategyHWM - controller._queueTotalSize; | |
| } | |
| // This is used in the implementation of TransformStream. | |
| function ReadableStreamDefaultControllerHasBackpressure(controller) { | |
| if (ReadableStreamDefaultControllerShouldCallPull(controller)) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| function ReadableStreamDefaultControllerCanCloseOrEnqueue(controller) { | |
| var state = controller._controlledReadableStream._state; | |
| if (!controller._closeRequested && state === 'readable') { | |
| return true; | |
| } | |
| return false; | |
| } | |
| function SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) { | |
| controller._controlledReadableStream = stream; | |
| controller._queue = undefined; | |
| controller._queueTotalSize = undefined; | |
| ResetQueue(controller); | |
| controller._started = false; | |
| controller._closeRequested = false; | |
| controller._pullAgain = false; | |
| controller._pulling = false; | |
| controller._strategySizeAlgorithm = sizeAlgorithm; | |
| controller._strategyHWM = highWaterMark; | |
| controller._pullAlgorithm = pullAlgorithm; | |
| controller._cancelAlgorithm = cancelAlgorithm; | |
| stream._readableStreamController = controller; | |
| var startResult = startAlgorithm(); | |
| uponPromise(promiseResolvedWith(startResult), function () { | |
| controller._started = true; | |
| ReadableStreamDefaultControllerCallPullIfNeeded(controller); | |
| return null; | |
| }, function (r) { | |
| ReadableStreamDefaultControllerError(controller, r); | |
| return null; | |
| }); | |
| } | |
| function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) { | |
| var controller = Object.create(ReadableStreamDefaultController.prototype); | |
| var startAlgorithm; | |
| var pullAlgorithm; | |
| var cancelAlgorithm; | |
| if (underlyingSource.start !== undefined) { | |
| startAlgorithm = function () { return underlyingSource.start(controller); }; | |
| } | |
| else { | |
| startAlgorithm = function () { return undefined; }; | |
| } | |
| if (underlyingSource.pull !== undefined) { | |
| pullAlgorithm = function () { return underlyingSource.pull(controller); }; | |
| } | |
| else { | |
| pullAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| if (underlyingSource.cancel !== undefined) { | |
| cancelAlgorithm = function (reason) { return underlyingSource.cancel(reason); }; | |
| } | |
| else { | |
| cancelAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); | |
| } | |
| // Helper functions for the ReadableStreamDefaultController. | |
| function defaultControllerBrandCheckException$1(name) { | |
| return new TypeError("ReadableStreamDefaultController.prototype.".concat(name, " can only be used on a ReadableStreamDefaultController")); | |
| } | |
| function ReadableStreamTee(stream, cloneForBranch2) { | |
| if (IsReadableByteStreamController(stream._readableStreamController)) { | |
| return ReadableByteStreamTee(stream); | |
| } | |
| return ReadableStreamDefaultTee(stream); | |
| } | |
| function ReadableStreamDefaultTee(stream, cloneForBranch2) { | |
| var reader = AcquireReadableStreamDefaultReader(stream); | |
| var reading = false; | |
| var readAgain = false; | |
| var canceled1 = false; | |
| var canceled2 = false; | |
| var reason1; | |
| var reason2; | |
| var branch1; | |
| var branch2; | |
| var resolveCancelPromise; | |
| var cancelPromise = newPromise(function (resolve) { | |
| resolveCancelPromise = resolve; | |
| }); | |
| function pullAlgorithm() { | |
| if (reading) { | |
| readAgain = true; | |
| return promiseResolvedWith(undefined); | |
| } | |
| reading = true; | |
| var readRequest = { | |
| _chunkSteps: function (chunk) { | |
| // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using | |
| // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let | |
| // successful synchronously-available reads get ahead of asynchronously-available errors. | |
| _queueMicrotask(function () { | |
| readAgain = false; | |
| var chunk1 = chunk; | |
| var chunk2 = chunk; | |
| // There is no way to access the cloning code right now in the reference implementation. | |
| // If we add one then we'll need an implementation for serializable objects. | |
| // if (!canceled2 && cloneForBranch2) { | |
| // chunk2 = StructuredDeserialize(StructuredSerialize(chunk2)); | |
| // } | |
| if (!canceled1) { | |
| ReadableStreamDefaultControllerEnqueue(branch1._readableStreamController, chunk1); | |
| } | |
| if (!canceled2) { | |
| ReadableStreamDefaultControllerEnqueue(branch2._readableStreamController, chunk2); | |
| } | |
| reading = false; | |
| if (readAgain) { | |
| pullAlgorithm(); | |
| } | |
| }); | |
| }, | |
| _closeSteps: function () { | |
| reading = false; | |
| if (!canceled1) { | |
| ReadableStreamDefaultControllerClose(branch1._readableStreamController); | |
| } | |
| if (!canceled2) { | |
| ReadableStreamDefaultControllerClose(branch2._readableStreamController); | |
| } | |
| if (!canceled1 || !canceled2) { | |
| resolveCancelPromise(undefined); | |
| } | |
| }, | |
| _errorSteps: function () { | |
| reading = false; | |
| } | |
| }; | |
| ReadableStreamDefaultReaderRead(reader, readRequest); | |
| return promiseResolvedWith(undefined); | |
| } | |
| function cancel1Algorithm(reason) { | |
| canceled1 = true; | |
| reason1 = reason; | |
| if (canceled2) { | |
| var compositeReason = CreateArrayFromList([reason1, reason2]); | |
| var cancelResult = ReadableStreamCancel(stream, compositeReason); | |
| resolveCancelPromise(cancelResult); | |
| } | |
| return cancelPromise; | |
| } | |
| function cancel2Algorithm(reason) { | |
| canceled2 = true; | |
| reason2 = reason; | |
| if (canceled1) { | |
| var compositeReason = CreateArrayFromList([reason1, reason2]); | |
| var cancelResult = ReadableStreamCancel(stream, compositeReason); | |
| resolveCancelPromise(cancelResult); | |
| } | |
| return cancelPromise; | |
| } | |
| function startAlgorithm() { | |
| // do nothing | |
| } | |
| branch1 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel1Algorithm); | |
| branch2 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel2Algorithm); | |
| uponRejection(reader._closedPromise, function (r) { | |
| ReadableStreamDefaultControllerError(branch1._readableStreamController, r); | |
| ReadableStreamDefaultControllerError(branch2._readableStreamController, r); | |
| if (!canceled1 || !canceled2) { | |
| resolveCancelPromise(undefined); | |
| } | |
| return null; | |
| }); | |
| return [branch1, branch2]; | |
| } | |
| function ReadableByteStreamTee(stream) { | |
| var reader = AcquireReadableStreamDefaultReader(stream); | |
| var reading = false; | |
| var readAgainForBranch1 = false; | |
| var readAgainForBranch2 = false; | |
| var canceled1 = false; | |
| var canceled2 = false; | |
| var reason1; | |
| var reason2; | |
| var branch1; | |
| var branch2; | |
| var resolveCancelPromise; | |
| var cancelPromise = newPromise(function (resolve) { | |
| resolveCancelPromise = resolve; | |
| }); | |
| function forwardReaderError(thisReader) { | |
| uponRejection(thisReader._closedPromise, function (r) { | |
| if (thisReader !== reader) { | |
| return null; | |
| } | |
| ReadableByteStreamControllerError(branch1._readableStreamController, r); | |
| ReadableByteStreamControllerError(branch2._readableStreamController, r); | |
| if (!canceled1 || !canceled2) { | |
| resolveCancelPromise(undefined); | |
| } | |
| return null; | |
| }); | |
| } | |
| function pullWithDefaultReader() { | |
| if (IsReadableStreamBYOBReader(reader)) { | |
| ReadableStreamReaderGenericRelease(reader); | |
| reader = AcquireReadableStreamDefaultReader(stream); | |
| forwardReaderError(reader); | |
| } | |
| var readRequest = { | |
| _chunkSteps: function (chunk) { | |
| // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using | |
| // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let | |
| // successful synchronously-available reads get ahead of asynchronously-available errors. | |
| _queueMicrotask(function () { | |
| readAgainForBranch1 = false; | |
| readAgainForBranch2 = false; | |
| var chunk1 = chunk; | |
| var chunk2 = chunk; | |
| if (!canceled1 && !canceled2) { | |
| try { | |
| chunk2 = CloneAsUint8Array(chunk); | |
| } | |
| catch (cloneE) { | |
| ReadableByteStreamControllerError(branch1._readableStreamController, cloneE); | |
| ReadableByteStreamControllerError(branch2._readableStreamController, cloneE); | |
| resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); | |
| return; | |
| } | |
| } | |
| if (!canceled1) { | |
| ReadableByteStreamControllerEnqueue(branch1._readableStreamController, chunk1); | |
| } | |
| if (!canceled2) { | |
| ReadableByteStreamControllerEnqueue(branch2._readableStreamController, chunk2); | |
| } | |
| reading = false; | |
| if (readAgainForBranch1) { | |
| pull1Algorithm(); | |
| } | |
| else if (readAgainForBranch2) { | |
| pull2Algorithm(); | |
| } | |
| }); | |
| }, | |
| _closeSteps: function () { | |
| reading = false; | |
| if (!canceled1) { | |
| ReadableByteStreamControllerClose(branch1._readableStreamController); | |
| } | |
| if (!canceled2) { | |
| ReadableByteStreamControllerClose(branch2._readableStreamController); | |
| } | |
| if (branch1._readableStreamController._pendingPullIntos.length > 0) { | |
| ReadableByteStreamControllerRespond(branch1._readableStreamController, 0); | |
| } | |
| if (branch2._readableStreamController._pendingPullIntos.length > 0) { | |
| ReadableByteStreamControllerRespond(branch2._readableStreamController, 0); | |
| } | |
| if (!canceled1 || !canceled2) { | |
| resolveCancelPromise(undefined); | |
| } | |
| }, | |
| _errorSteps: function () { | |
| reading = false; | |
| } | |
| }; | |
| ReadableStreamDefaultReaderRead(reader, readRequest); | |
| } | |
| function pullWithBYOBReader(view, forBranch2) { | |
| if (IsReadableStreamDefaultReader(reader)) { | |
| ReadableStreamReaderGenericRelease(reader); | |
| reader = AcquireReadableStreamBYOBReader(stream); | |
| forwardReaderError(reader); | |
| } | |
| var byobBranch = forBranch2 ? branch2 : branch1; | |
| var otherBranch = forBranch2 ? branch1 : branch2; | |
| var readIntoRequest = { | |
| _chunkSteps: function (chunk) { | |
| // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using | |
| // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let | |
| // successful synchronously-available reads get ahead of asynchronously-available errors. | |
| _queueMicrotask(function () { | |
| readAgainForBranch1 = false; | |
| readAgainForBranch2 = false; | |
| var byobCanceled = forBranch2 ? canceled2 : canceled1; | |
| var otherCanceled = forBranch2 ? canceled1 : canceled2; | |
| if (!otherCanceled) { | |
| var clonedChunk = void 0; | |
| try { | |
| clonedChunk = CloneAsUint8Array(chunk); | |
| } | |
| catch (cloneE) { | |
| ReadableByteStreamControllerError(byobBranch._readableStreamController, cloneE); | |
| ReadableByteStreamControllerError(otherBranch._readableStreamController, cloneE); | |
| resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); | |
| return; | |
| } | |
| if (!byobCanceled) { | |
| ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); | |
| } | |
| ReadableByteStreamControllerEnqueue(otherBranch._readableStreamController, clonedChunk); | |
| } | |
| else if (!byobCanceled) { | |
| ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); | |
| } | |
| reading = false; | |
| if (readAgainForBranch1) { | |
| pull1Algorithm(); | |
| } | |
| else if (readAgainForBranch2) { | |
| pull2Algorithm(); | |
| } | |
| }); | |
| }, | |
| _closeSteps: function (chunk) { | |
| reading = false; | |
| var byobCanceled = forBranch2 ? canceled2 : canceled1; | |
| var otherCanceled = forBranch2 ? canceled1 : canceled2; | |
| if (!byobCanceled) { | |
| ReadableByteStreamControllerClose(byobBranch._readableStreamController); | |
| } | |
| if (!otherCanceled) { | |
| ReadableByteStreamControllerClose(otherBranch._readableStreamController); | |
| } | |
| if (chunk !== undefined) { | |
| if (!byobCanceled) { | |
| ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); | |
| } | |
| if (!otherCanceled && otherBranch._readableStreamController._pendingPullIntos.length > 0) { | |
| ReadableByteStreamControllerRespond(otherBranch._readableStreamController, 0); | |
| } | |
| } | |
| if (!byobCanceled || !otherCanceled) { | |
| resolveCancelPromise(undefined); | |
| } | |
| }, | |
| _errorSteps: function () { | |
| reading = false; | |
| } | |
| }; | |
| ReadableStreamBYOBReaderRead(reader, view, 1, readIntoRequest); | |
| } | |
| function pull1Algorithm() { | |
| if (reading) { | |
| readAgainForBranch1 = true; | |
| return promiseResolvedWith(undefined); | |
| } | |
| reading = true; | |
| var byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch1._readableStreamController); | |
| if (byobRequest === null) { | |
| pullWithDefaultReader(); | |
| } | |
| else { | |
| pullWithBYOBReader(byobRequest._view, false); | |
| } | |
| return promiseResolvedWith(undefined); | |
| } | |
| function pull2Algorithm() { | |
| if (reading) { | |
| readAgainForBranch2 = true; | |
| return promiseResolvedWith(undefined); | |
| } | |
| reading = true; | |
| var byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch2._readableStreamController); | |
| if (byobRequest === null) { | |
| pullWithDefaultReader(); | |
| } | |
| else { | |
| pullWithBYOBReader(byobRequest._view, true); | |
| } | |
| return promiseResolvedWith(undefined); | |
| } | |
| function cancel1Algorithm(reason) { | |
| canceled1 = true; | |
| reason1 = reason; | |
| if (canceled2) { | |
| var compositeReason = CreateArrayFromList([reason1, reason2]); | |
| var cancelResult = ReadableStreamCancel(stream, compositeReason); | |
| resolveCancelPromise(cancelResult); | |
| } | |
| return cancelPromise; | |
| } | |
| function cancel2Algorithm(reason) { | |
| canceled2 = true; | |
| reason2 = reason; | |
| if (canceled1) { | |
| var compositeReason = CreateArrayFromList([reason1, reason2]); | |
| var cancelResult = ReadableStreamCancel(stream, compositeReason); | |
| resolveCancelPromise(cancelResult); | |
| } | |
| return cancelPromise; | |
| } | |
| function startAlgorithm() { | |
| return; | |
| } | |
| branch1 = CreateReadableByteStream(startAlgorithm, pull1Algorithm, cancel1Algorithm); | |
| branch2 = CreateReadableByteStream(startAlgorithm, pull2Algorithm, cancel2Algorithm); | |
| forwardReaderError(reader); | |
| return [branch1, branch2]; | |
| } | |
| function isReadableStreamLike(stream) { | |
| return typeIsObject(stream) && typeof stream.getReader !== 'undefined'; | |
| } | |
| function ReadableStreamFrom(source) { | |
| if (isReadableStreamLike(source)) { | |
| return ReadableStreamFromDefaultReader(source.getReader()); | |
| } | |
| return ReadableStreamFromIterable(source); | |
| } | |
| function ReadableStreamFromIterable(asyncIterable) { | |
| var stream; | |
| var iteratorRecord = GetIterator(asyncIterable, 'async'); | |
| var startAlgorithm = noop; | |
| function pullAlgorithm() { | |
| var nextResult; | |
| try { | |
| nextResult = IteratorNext(iteratorRecord); | |
| } | |
| catch (e) { | |
| return promiseRejectedWith(e); | |
| } | |
| var nextPromise = promiseResolvedWith(nextResult); | |
| return transformPromiseWith(nextPromise, function (iterResult) { | |
| if (!typeIsObject(iterResult)) { | |
| throw new TypeError('The promise returned by the iterator.next() method must fulfill with an object'); | |
| } | |
| var done = IteratorComplete(iterResult); | |
| if (done) { | |
| ReadableStreamDefaultControllerClose(stream._readableStreamController); | |
| } | |
| else { | |
| var value = IteratorValue(iterResult); | |
| ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); | |
| } | |
| }); | |
| } | |
| function cancelAlgorithm(reason) { | |
| var iterator = iteratorRecord.iterator; | |
| var returnMethod; | |
| try { | |
| returnMethod = GetMethod(iterator, 'return'); | |
| } | |
| catch (e) { | |
| return promiseRejectedWith(e); | |
| } | |
| if (returnMethod === undefined) { | |
| return promiseResolvedWith(undefined); | |
| } | |
| var returnResult; | |
| try { | |
| returnResult = reflectCall(returnMethod, iterator, [reason]); | |
| } | |
| catch (e) { | |
| return promiseRejectedWith(e); | |
| } | |
| var returnPromise = promiseResolvedWith(returnResult); | |
| return transformPromiseWith(returnPromise, function (iterResult) { | |
| if (!typeIsObject(iterResult)) { | |
| throw new TypeError('The promise returned by the iterator.return() method must fulfill with an object'); | |
| } | |
| return undefined; | |
| }); | |
| } | |
| stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); | |
| return stream; | |
| } | |
| function ReadableStreamFromDefaultReader(reader) { | |
| var stream; | |
| var startAlgorithm = noop; | |
| function pullAlgorithm() { | |
| var readPromise; | |
| try { | |
| readPromise = reader.read(); | |
| } | |
| catch (e) { | |
| return promiseRejectedWith(e); | |
| } | |
| return transformPromiseWith(readPromise, function (readResult) { | |
| if (!typeIsObject(readResult)) { | |
| throw new TypeError('The promise returned by the reader.read() method must fulfill with an object'); | |
| } | |
| if (readResult.done) { | |
| ReadableStreamDefaultControllerClose(stream._readableStreamController); | |
| } | |
| else { | |
| var value = readResult.value; | |
| ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); | |
| } | |
| }); | |
| } | |
| function cancelAlgorithm(reason) { | |
| try { | |
| return promiseResolvedWith(reader.cancel(reason)); | |
| } | |
| catch (e) { | |
| return promiseRejectedWith(e); | |
| } | |
| } | |
| stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); | |
| return stream; | |
| } | |
| function convertUnderlyingDefaultOrByteSource(source, context) { | |
| assertDictionary(source, context); | |
| var original = source; | |
| var autoAllocateChunkSize = original === null || original === void 0 ? void 0 : original.autoAllocateChunkSize; | |
| var cancel = original === null || original === void 0 ? void 0 : original.cancel; | |
| var pull = original === null || original === void 0 ? void 0 : original.pull; | |
| var start = original === null || original === void 0 ? void 0 : original.start; | |
| var type = original === null || original === void 0 ? void 0 : original.type; | |
| return { | |
| autoAllocateChunkSize: autoAllocateChunkSize === undefined ? | |
| undefined : | |
| convertUnsignedLongLongWithEnforceRange(autoAllocateChunkSize, "".concat(context, " has member 'autoAllocateChunkSize' that")), | |
| cancel: cancel === undefined ? | |
| undefined : | |
| convertUnderlyingSourceCancelCallback(cancel, original, "".concat(context, " has member 'cancel' that")), | |
| pull: pull === undefined ? | |
| undefined : | |
| convertUnderlyingSourcePullCallback(pull, original, "".concat(context, " has member 'pull' that")), | |
| start: start === undefined ? | |
| undefined : | |
| convertUnderlyingSourceStartCallback(start, original, "".concat(context, " has member 'start' that")), | |
| type: type === undefined ? undefined : convertReadableStreamType(type, "".concat(context, " has member 'type' that")) | |
| }; | |
| } | |
| function convertUnderlyingSourceCancelCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (reason) { return promiseCall(fn, original, [reason]); }; | |
| } | |
| function convertUnderlyingSourcePullCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (controller) { return promiseCall(fn, original, [controller]); }; | |
| } | |
| function convertUnderlyingSourceStartCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (controller) { return reflectCall(fn, original, [controller]); }; | |
| } | |
| function convertReadableStreamType(type, context) { | |
| type = "".concat(type); | |
| if (type !== 'bytes') { | |
| throw new TypeError("".concat(context, " '").concat(type, "' is not a valid enumeration value for ReadableStreamType")); | |
| } | |
| return type; | |
| } | |
| function convertIteratorOptions(options, context) { | |
| assertDictionary(options, context); | |
| var preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; | |
| return { preventCancel: Boolean(preventCancel) }; | |
| } | |
| function convertPipeOptions(options, context) { | |
| assertDictionary(options, context); | |
| var preventAbort = options === null || options === void 0 ? void 0 : options.preventAbort; | |
| var preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; | |
| var preventClose = options === null || options === void 0 ? void 0 : options.preventClose; | |
| var signal = options === null || options === void 0 ? void 0 : options.signal; | |
| if (signal !== undefined) { | |
| assertAbortSignal(signal, "".concat(context, " has member 'signal' that")); | |
| } | |
| return { | |
| preventAbort: Boolean(preventAbort), | |
| preventCancel: Boolean(preventCancel), | |
| preventClose: Boolean(preventClose), | |
| signal: signal | |
| }; | |
| } | |
| function assertAbortSignal(signal, context) { | |
| if (!isAbortSignal(signal)) { | |
| throw new TypeError("".concat(context, " is not an AbortSignal.")); | |
| } | |
| } | |
| function convertReadableWritablePair(pair, context) { | |
| assertDictionary(pair, context); | |
| var readable = pair === null || pair === void 0 ? void 0 : pair.readable; | |
| assertRequiredField(readable, 'readable', 'ReadableWritablePair'); | |
| assertReadableStream(readable, "".concat(context, " has member 'readable' that")); | |
| var writable = pair === null || pair === void 0 ? void 0 : pair.writable; | |
| assertRequiredField(writable, 'writable', 'ReadableWritablePair'); | |
| assertWritableStream(writable, "".concat(context, " has member 'writable' that")); | |
| return { readable: readable, writable: writable }; | |
| } | |
| /** | |
| * A readable stream represents a source of data, from which you can read. | |
| * | |
| * @public | |
| */ | |
| var ReadableStream = /** @class */ (function () { | |
| function ReadableStream(rawUnderlyingSource, rawStrategy) { | |
| if (rawUnderlyingSource === void 0) { rawUnderlyingSource = {}; } | |
| if (rawStrategy === void 0) { rawStrategy = {}; } | |
| if (rawUnderlyingSource === undefined) { | |
| rawUnderlyingSource = null; | |
| } | |
| else { | |
| assertObject(rawUnderlyingSource, 'First parameter'); | |
| } | |
| var strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); | |
| var underlyingSource = convertUnderlyingDefaultOrByteSource(rawUnderlyingSource, 'First parameter'); | |
| InitializeReadableStream(this); | |
| if (underlyingSource.type === 'bytes') { | |
| if (strategy.size !== undefined) { | |
| throw new RangeError('The strategy for a byte stream cannot have a size function'); | |
| } | |
| var highWaterMark = ExtractHighWaterMark(strategy, 0); | |
| SetUpReadableByteStreamControllerFromUnderlyingSource(this, underlyingSource, highWaterMark); | |
| } | |
| else { | |
| var sizeAlgorithm = ExtractSizeAlgorithm(strategy); | |
| var highWaterMark = ExtractHighWaterMark(strategy, 1); | |
| SetUpReadableStreamDefaultControllerFromUnderlyingSource(this, underlyingSource, highWaterMark, sizeAlgorithm); | |
| } | |
| } | |
| Object.defineProperty(ReadableStream.prototype, "locked", { | |
| /** | |
| * Whether or not the readable stream is locked to a {@link ReadableStreamDefaultReader | reader}. | |
| */ | |
| get: function () { | |
| if (!IsReadableStream(this)) { | |
| throw streamBrandCheckException$1('locked'); | |
| } | |
| return IsReadableStreamLocked(this); | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| /** | |
| * Cancels the stream, signaling a loss of interest in the stream by a consumer. | |
| * | |
| * The supplied `reason` argument will be given to the underlying source's {@link UnderlyingSource.cancel | cancel()} | |
| * method, which might or might not use it. | |
| */ | |
| ReadableStream.prototype.cancel = function (reason) { | |
| if (reason === void 0) { reason = undefined; } | |
| if (!IsReadableStream(this)) { | |
| return promiseRejectedWith(streamBrandCheckException$1('cancel')); | |
| } | |
| if (IsReadableStreamLocked(this)) { | |
| return promiseRejectedWith(new TypeError('Cannot cancel a stream that already has a reader')); | |
| } | |
| return ReadableStreamCancel(this, reason); | |
| }; | |
| ReadableStream.prototype.getReader = function (rawOptions) { | |
| if (rawOptions === void 0) { rawOptions = undefined; } | |
| if (!IsReadableStream(this)) { | |
| throw streamBrandCheckException$1('getReader'); | |
| } | |
| var options = convertReaderOptions(rawOptions, 'First parameter'); | |
| if (options.mode === undefined) { | |
| return AcquireReadableStreamDefaultReader(this); | |
| } | |
| return AcquireReadableStreamBYOBReader(this); | |
| }; | |
| ReadableStream.prototype.pipeThrough = function (rawTransform, rawOptions) { | |
| if (rawOptions === void 0) { rawOptions = {}; } | |
| if (!IsReadableStream(this)) { | |
| throw streamBrandCheckException$1('pipeThrough'); | |
| } | |
| assertRequiredArgument(rawTransform, 1, 'pipeThrough'); | |
| var transform = convertReadableWritablePair(rawTransform, 'First parameter'); | |
| var options = convertPipeOptions(rawOptions, 'Second parameter'); | |
| if (IsReadableStreamLocked(this)) { | |
| throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream'); | |
| } | |
| if (IsWritableStreamLocked(transform.writable)) { | |
| throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream'); | |
| } | |
| var promise = ReadableStreamPipeTo(this, transform.writable, options.preventClose, options.preventAbort, options.preventCancel, options.signal); | |
| setPromiseIsHandledToTrue(promise); | |
| return transform.readable; | |
| }; | |
| ReadableStream.prototype.pipeTo = function (destination, rawOptions) { | |
| if (rawOptions === void 0) { rawOptions = {}; } | |
| if (!IsReadableStream(this)) { | |
| return promiseRejectedWith(streamBrandCheckException$1('pipeTo')); | |
| } | |
| if (destination === undefined) { | |
| return promiseRejectedWith("Parameter 1 is required in 'pipeTo'."); | |
| } | |
| if (!IsWritableStream(destination)) { | |
| return promiseRejectedWith(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream")); | |
| } | |
| var options; | |
| try { | |
| options = convertPipeOptions(rawOptions, 'Second parameter'); | |
| } | |
| catch (e) { | |
| return promiseRejectedWith(e); | |
| } | |
| if (IsReadableStreamLocked(this)) { | |
| return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream')); | |
| } | |
| if (IsWritableStreamLocked(destination)) { | |
| return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream')); | |
| } | |
| return ReadableStreamPipeTo(this, destination, options.preventClose, options.preventAbort, options.preventCancel, options.signal); | |
| }; | |
| /** | |
| * Tees this readable stream, returning a two-element array containing the two resulting branches as | |
| * new {@link ReadableStream} instances. | |
| * | |
| * Teeing a stream will lock it, preventing any other consumer from acquiring a reader. | |
| * To cancel the stream, cancel both of the resulting branches; a composite cancellation reason will then be | |
| * propagated to the stream's underlying source. | |
| * | |
| * Note that the chunks seen in each branch will be the same object. If the chunks are not immutable, | |
| * this could allow interference between the two branches. | |
| */ | |
| ReadableStream.prototype.tee = function () { | |
| if (!IsReadableStream(this)) { | |
| throw streamBrandCheckException$1('tee'); | |
| } | |
| var branches = ReadableStreamTee(this); | |
| return CreateArrayFromList(branches); | |
| }; | |
| ReadableStream.prototype.values = function (rawOptions) { | |
| if (rawOptions === void 0) { rawOptions = undefined; } | |
| if (!IsReadableStream(this)) { | |
| throw streamBrandCheckException$1('values'); | |
| } | |
| var options = convertIteratorOptions(rawOptions, 'First parameter'); | |
| return AcquireReadableStreamAsyncIterator(this, options.preventCancel); | |
| }; | |
| ReadableStream.prototype[SymbolAsyncIterator] = function (options) { | |
| // Stub implementation, overridden below | |
| return this.values(options); | |
| }; | |
| /** | |
| * Creates a new ReadableStream wrapping the provided iterable or async iterable. | |
| * | |
| * This can be used to adapt various kinds of objects into a readable stream, | |
| * such as an array, an async generator, or a Node.js readable stream. | |
| */ | |
| ReadableStream.from = function (asyncIterable) { | |
| return ReadableStreamFrom(asyncIterable); | |
| }; | |
| return ReadableStream; | |
| }()); | |
| Object.defineProperties(ReadableStream, { | |
| from: { enumerable: true } | |
| }); | |
| Object.defineProperties(ReadableStream.prototype, { | |
| cancel: { enumerable: true }, | |
| getReader: { enumerable: true }, | |
| pipeThrough: { enumerable: true }, | |
| pipeTo: { enumerable: true }, | |
| tee: { enumerable: true }, | |
| values: { enumerable: true }, | |
| locked: { enumerable: true } | |
| }); | |
| setFunctionName(ReadableStream.from, 'from'); | |
| setFunctionName(ReadableStream.prototype.cancel, 'cancel'); | |
| setFunctionName(ReadableStream.prototype.getReader, 'getReader'); | |
| setFunctionName(ReadableStream.prototype.pipeThrough, 'pipeThrough'); | |
| setFunctionName(ReadableStream.prototype.pipeTo, 'pipeTo'); | |
| setFunctionName(ReadableStream.prototype.tee, 'tee'); | |
| setFunctionName(ReadableStream.prototype.values, 'values'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'ReadableStream', | |
| configurable: true | |
| }); | |
| } | |
| Object.defineProperty(ReadableStream.prototype, SymbolAsyncIterator, { | |
| value: ReadableStream.prototype.values, | |
| writable: true, | |
| configurable: true | |
| }); | |
| // Abstract operations for the ReadableStream. | |
| // Throws if and only if startAlgorithm throws. | |
| function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) { | |
| if (highWaterMark === void 0) { highWaterMark = 1; } | |
| if (sizeAlgorithm === void 0) { sizeAlgorithm = function () { return 1; }; } | |
| var stream = Object.create(ReadableStream.prototype); | |
| InitializeReadableStream(stream); | |
| var controller = Object.create(ReadableStreamDefaultController.prototype); | |
| SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); | |
| return stream; | |
| } | |
| // Throws if and only if startAlgorithm throws. | |
| function CreateReadableByteStream(startAlgorithm, pullAlgorithm, cancelAlgorithm) { | |
| var stream = Object.create(ReadableStream.prototype); | |
| InitializeReadableStream(stream); | |
| var controller = Object.create(ReadableByteStreamController.prototype); | |
| SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, 0, undefined); | |
| return stream; | |
| } | |
| function InitializeReadableStream(stream) { | |
| stream._state = 'readable'; | |
| stream._reader = undefined; | |
| stream._storedError = undefined; | |
| stream._disturbed = false; | |
| } | |
| function IsReadableStream(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) { | |
| return false; | |
| } | |
| return x instanceof ReadableStream; | |
| } | |
| function IsReadableStreamLocked(stream) { | |
| if (stream._reader === undefined) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| // ReadableStream API exposed for controllers. | |
| function ReadableStreamCancel(stream, reason) { | |
| stream._disturbed = true; | |
| if (stream._state === 'closed') { | |
| return promiseResolvedWith(undefined); | |
| } | |
| if (stream._state === 'errored') { | |
| return promiseRejectedWith(stream._storedError); | |
| } | |
| ReadableStreamClose(stream); | |
| var reader = stream._reader; | |
| if (reader !== undefined && IsReadableStreamBYOBReader(reader)) { | |
| var readIntoRequests = reader._readIntoRequests; | |
| reader._readIntoRequests = new SimpleQueue(); | |
| readIntoRequests.forEach(function (readIntoRequest) { | |
| readIntoRequest._closeSteps(undefined); | |
| }); | |
| } | |
| var sourceCancelPromise = stream._readableStreamController[CancelSteps](reason); | |
| return transformPromiseWith(sourceCancelPromise, noop); | |
| } | |
| function ReadableStreamClose(stream) { | |
| stream._state = 'closed'; | |
| var reader = stream._reader; | |
| if (reader === undefined) { | |
| return; | |
| } | |
| defaultReaderClosedPromiseResolve(reader); | |
| if (IsReadableStreamDefaultReader(reader)) { | |
| var readRequests = reader._readRequests; | |
| reader._readRequests = new SimpleQueue(); | |
| readRequests.forEach(function (readRequest) { | |
| readRequest._closeSteps(); | |
| }); | |
| } | |
| } | |
| function ReadableStreamError(stream, e) { | |
| stream._state = 'errored'; | |
| stream._storedError = e; | |
| var reader = stream._reader; | |
| if (reader === undefined) { | |
| return; | |
| } | |
| defaultReaderClosedPromiseReject(reader, e); | |
| if (IsReadableStreamDefaultReader(reader)) { | |
| ReadableStreamDefaultReaderErrorReadRequests(reader, e); | |
| } | |
| else { | |
| ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); | |
| } | |
| } | |
| // Helper functions for the ReadableStream. | |
| function streamBrandCheckException$1(name) { | |
| return new TypeError("ReadableStream.prototype.".concat(name, " can only be used on a ReadableStream")); | |
| } | |
| function convertQueuingStrategyInit(init, context) { | |
| assertDictionary(init, context); | |
| var highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; | |
| assertRequiredField(highWaterMark, 'highWaterMark', 'QueuingStrategyInit'); | |
| return { | |
| highWaterMark: convertUnrestrictedDouble(highWaterMark) | |
| }; | |
| } | |
| // The size function must not have a prototype property nor be a constructor | |
| var byteLengthSizeFunction = function (chunk) { | |
| return chunk.byteLength; | |
| }; | |
| setFunctionName(byteLengthSizeFunction, 'size'); | |
| /** | |
| * A queuing strategy that counts the number of bytes in each chunk. | |
| * | |
| * @public | |
| */ | |
| var ByteLengthQueuingStrategy = /** @class */ (function () { | |
| function ByteLengthQueuingStrategy(options) { | |
| assertRequiredArgument(options, 1, 'ByteLengthQueuingStrategy'); | |
| options = convertQueuingStrategyInit(options, 'First parameter'); | |
| this._byteLengthQueuingStrategyHighWaterMark = options.highWaterMark; | |
| } | |
| Object.defineProperty(ByteLengthQueuingStrategy.prototype, "highWaterMark", { | |
| /** | |
| * Returns the high water mark provided to the constructor. | |
| */ | |
| get: function () { | |
| if (!IsByteLengthQueuingStrategy(this)) { | |
| throw byteLengthBrandCheckException('highWaterMark'); | |
| } | |
| return this._byteLengthQueuingStrategyHighWaterMark; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(ByteLengthQueuingStrategy.prototype, "size", { | |
| /** | |
| * Measures the size of `chunk` by returning the value of its `byteLength` property. | |
| */ | |
| get: function () { | |
| if (!IsByteLengthQueuingStrategy(this)) { | |
| throw byteLengthBrandCheckException('size'); | |
| } | |
| return byteLengthSizeFunction; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| return ByteLengthQueuingStrategy; | |
| }()); | |
| Object.defineProperties(ByteLengthQueuingStrategy.prototype, { | |
| highWaterMark: { enumerable: true }, | |
| size: { enumerable: true } | |
| }); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(ByteLengthQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'ByteLengthQueuingStrategy', | |
| configurable: true | |
| }); | |
| } | |
| // Helper functions for the ByteLengthQueuingStrategy. | |
| function byteLengthBrandCheckException(name) { | |
| return new TypeError("ByteLengthQueuingStrategy.prototype.".concat(name, " can only be used on a ByteLengthQueuingStrategy")); | |
| } | |
| function IsByteLengthQueuingStrategy(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_byteLengthQueuingStrategyHighWaterMark')) { | |
| return false; | |
| } | |
| return x instanceof ByteLengthQueuingStrategy; | |
| } | |
| // The size function must not have a prototype property nor be a constructor | |
| var countSizeFunction = function () { | |
| return 1; | |
| }; | |
| setFunctionName(countSizeFunction, 'size'); | |
| /** | |
| * A queuing strategy that counts the number of chunks. | |
| * | |
| * @public | |
| */ | |
| var CountQueuingStrategy = /** @class */ (function () { | |
| function CountQueuingStrategy(options) { | |
| assertRequiredArgument(options, 1, 'CountQueuingStrategy'); | |
| options = convertQueuingStrategyInit(options, 'First parameter'); | |
| this._countQueuingStrategyHighWaterMark = options.highWaterMark; | |
| } | |
| Object.defineProperty(CountQueuingStrategy.prototype, "highWaterMark", { | |
| /** | |
| * Returns the high water mark provided to the constructor. | |
| */ | |
| get: function () { | |
| if (!IsCountQueuingStrategy(this)) { | |
| throw countBrandCheckException('highWaterMark'); | |
| } | |
| return this._countQueuingStrategyHighWaterMark; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(CountQueuingStrategy.prototype, "size", { | |
| /** | |
| * Measures the size of `chunk` by always returning 1. | |
| * This ensures that the total queue size is a count of the number of chunks in the queue. | |
| */ | |
| get: function () { | |
| if (!IsCountQueuingStrategy(this)) { | |
| throw countBrandCheckException('size'); | |
| } | |
| return countSizeFunction; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| return CountQueuingStrategy; | |
| }()); | |
| Object.defineProperties(CountQueuingStrategy.prototype, { | |
| highWaterMark: { enumerable: true }, | |
| size: { enumerable: true } | |
| }); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(CountQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'CountQueuingStrategy', | |
| configurable: true | |
| }); | |
| } | |
| // Helper functions for the CountQueuingStrategy. | |
| function countBrandCheckException(name) { | |
| return new TypeError("CountQueuingStrategy.prototype.".concat(name, " can only be used on a CountQueuingStrategy")); | |
| } | |
| function IsCountQueuingStrategy(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_countQueuingStrategyHighWaterMark')) { | |
| return false; | |
| } | |
| return x instanceof CountQueuingStrategy; | |
| } | |
| function convertTransformer(original, context) { | |
| assertDictionary(original, context); | |
| var cancel = original === null || original === void 0 ? void 0 : original.cancel; | |
| var flush = original === null || original === void 0 ? void 0 : original.flush; | |
| var readableType = original === null || original === void 0 ? void 0 : original.readableType; | |
| var start = original === null || original === void 0 ? void 0 : original.start; | |
| var transform = original === null || original === void 0 ? void 0 : original.transform; | |
| var writableType = original === null || original === void 0 ? void 0 : original.writableType; | |
| return { | |
| cancel: cancel === undefined ? | |
| undefined : | |
| convertTransformerCancelCallback(cancel, original, "".concat(context, " has member 'cancel' that")), | |
| flush: flush === undefined ? | |
| undefined : | |
| convertTransformerFlushCallback(flush, original, "".concat(context, " has member 'flush' that")), | |
| readableType: readableType, | |
| start: start === undefined ? | |
| undefined : | |
| convertTransformerStartCallback(start, original, "".concat(context, " has member 'start' that")), | |
| transform: transform === undefined ? | |
| undefined : | |
| convertTransformerTransformCallback(transform, original, "".concat(context, " has member 'transform' that")), | |
| writableType: writableType | |
| }; | |
| } | |
| function convertTransformerFlushCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (controller) { return promiseCall(fn, original, [controller]); }; | |
| } | |
| function convertTransformerStartCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (controller) { return reflectCall(fn, original, [controller]); }; | |
| } | |
| function convertTransformerTransformCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (chunk, controller) { return promiseCall(fn, original, [chunk, controller]); }; | |
| } | |
| function convertTransformerCancelCallback(fn, original, context) { | |
| assertFunction(fn, context); | |
| return function (reason) { return promiseCall(fn, original, [reason]); }; | |
| } | |
| // Class TransformStream | |
| /** | |
| * A transform stream consists of a pair of streams: a {@link WritableStream | writable stream}, | |
| * known as its writable side, and a {@link ReadableStream | readable stream}, known as its readable side. | |
| * In a manner specific to the transform stream in question, writes to the writable side result in new data being | |
| * made available for reading from the readable side. | |
| * | |
| * @public | |
| */ | |
| var TransformStream = /** @class */ (function () { | |
| function TransformStream(rawTransformer, rawWritableStrategy, rawReadableStrategy) { | |
| if (rawTransformer === void 0) { rawTransformer = {}; } | |
| if (rawWritableStrategy === void 0) { rawWritableStrategy = {}; } | |
| if (rawReadableStrategy === void 0) { rawReadableStrategy = {}; } | |
| if (rawTransformer === undefined) { | |
| rawTransformer = null; | |
| } | |
| var writableStrategy = convertQueuingStrategy(rawWritableStrategy, 'Second parameter'); | |
| var readableStrategy = convertQueuingStrategy(rawReadableStrategy, 'Third parameter'); | |
| var transformer = convertTransformer(rawTransformer, 'First parameter'); | |
| if (transformer.readableType !== undefined) { | |
| throw new RangeError('Invalid readableType specified'); | |
| } | |
| if (transformer.writableType !== undefined) { | |
| throw new RangeError('Invalid writableType specified'); | |
| } | |
| var readableHighWaterMark = ExtractHighWaterMark(readableStrategy, 0); | |
| var readableSizeAlgorithm = ExtractSizeAlgorithm(readableStrategy); | |
| var writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1); | |
| var writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy); | |
| var startPromise_resolve; | |
| var startPromise = newPromise(function (resolve) { | |
| startPromise_resolve = resolve; | |
| }); | |
| InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm); | |
| SetUpTransformStreamDefaultControllerFromTransformer(this, transformer); | |
| if (transformer.start !== undefined) { | |
| startPromise_resolve(transformer.start(this._transformStreamController)); | |
| } | |
| else { | |
| startPromise_resolve(undefined); | |
| } | |
| } | |
| Object.defineProperty(TransformStream.prototype, "readable", { | |
| /** | |
| * The readable side of the transform stream. | |
| */ | |
| get: function () { | |
| if (!IsTransformStream(this)) { | |
| throw streamBrandCheckException('readable'); | |
| } | |
| return this._readable; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| Object.defineProperty(TransformStream.prototype, "writable", { | |
| /** | |
| * The writable side of the transform stream. | |
| */ | |
| get: function () { | |
| if (!IsTransformStream(this)) { | |
| throw streamBrandCheckException('writable'); | |
| } | |
| return this._writable; | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| return TransformStream; | |
| }()); | |
| Object.defineProperties(TransformStream.prototype, { | |
| readable: { enumerable: true }, | |
| writable: { enumerable: true } | |
| }); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(TransformStream.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'TransformStream', | |
| configurable: true | |
| }); | |
| } | |
| function InitializeTransformStream(stream, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) { | |
| function startAlgorithm() { | |
| return startPromise; | |
| } | |
| function writeAlgorithm(chunk) { | |
| return TransformStreamDefaultSinkWriteAlgorithm(stream, chunk); | |
| } | |
| function abortAlgorithm(reason) { | |
| return TransformStreamDefaultSinkAbortAlgorithm(stream, reason); | |
| } | |
| function closeAlgorithm() { | |
| return TransformStreamDefaultSinkCloseAlgorithm(stream); | |
| } | |
| stream._writable = CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark, writableSizeAlgorithm); | |
| function pullAlgorithm() { | |
| return TransformStreamDefaultSourcePullAlgorithm(stream); | |
| } | |
| function cancelAlgorithm(reason) { | |
| return TransformStreamDefaultSourceCancelAlgorithm(stream, reason); | |
| } | |
| stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm); | |
| // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure. | |
| stream._backpressure = undefined; | |
| stream._backpressureChangePromise = undefined; | |
| stream._backpressureChangePromise_resolve = undefined; | |
| TransformStreamSetBackpressure(stream, true); | |
| stream._transformStreamController = undefined; | |
| } | |
| function IsTransformStream(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) { | |
| return false; | |
| } | |
| return x instanceof TransformStream; | |
| } | |
| // This is a no-op if both sides are already errored. | |
| function TransformStreamError(stream, e) { | |
| ReadableStreamDefaultControllerError(stream._readable._readableStreamController, e); | |
| TransformStreamErrorWritableAndUnblockWrite(stream, e); | |
| } | |
| function TransformStreamErrorWritableAndUnblockWrite(stream, e) { | |
| TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController); | |
| WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e); | |
| TransformStreamUnblockWrite(stream); | |
| } | |
| function TransformStreamUnblockWrite(stream) { | |
| if (stream._backpressure) { | |
| // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure() | |
| // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time | |
| // _backpressure is set. | |
| TransformStreamSetBackpressure(stream, false); | |
| } | |
| } | |
| function TransformStreamSetBackpressure(stream, backpressure) { | |
| // Passes also when called during construction. | |
| if (stream._backpressureChangePromise !== undefined) { | |
| stream._backpressureChangePromise_resolve(); | |
| } | |
| stream._backpressureChangePromise = newPromise(function (resolve) { | |
| stream._backpressureChangePromise_resolve = resolve; | |
| }); | |
| stream._backpressure = backpressure; | |
| } | |
| // Class TransformStreamDefaultController | |
| /** | |
| * Allows control of the {@link ReadableStream} and {@link WritableStream} of the associated {@link TransformStream}. | |
| * | |
| * @public | |
| */ | |
| var TransformStreamDefaultController = /** @class */ (function () { | |
| function TransformStreamDefaultController() { | |
| throw new TypeError('Illegal constructor'); | |
| } | |
| Object.defineProperty(TransformStreamDefaultController.prototype, "desiredSize", { | |
| /** | |
| * Returns the desired size to fill the readable side’s internal queue. It can be negative, if the queue is over-full. | |
| */ | |
| get: function () { | |
| if (!IsTransformStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException('desiredSize'); | |
| } | |
| var readableController = this._controlledTransformStream._readable._readableStreamController; | |
| return ReadableStreamDefaultControllerGetDesiredSize(readableController); | |
| }, | |
| enumerable: false, | |
| configurable: true | |
| }); | |
| TransformStreamDefaultController.prototype.enqueue = function (chunk) { | |
| if (chunk === void 0) { chunk = undefined; } | |
| if (!IsTransformStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException('enqueue'); | |
| } | |
| TransformStreamDefaultControllerEnqueue(this, chunk); | |
| }; | |
| /** | |
| * Errors both the readable side and the writable side of the controlled transform stream, making all future | |
| * interactions with it fail with the given error `e`. Any chunks queued for transformation will be discarded. | |
| */ | |
| TransformStreamDefaultController.prototype.error = function (reason) { | |
| if (reason === void 0) { reason = undefined; } | |
| if (!IsTransformStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException('error'); | |
| } | |
| TransformStreamDefaultControllerError(this, reason); | |
| }; | |
| /** | |
| * Closes the readable side and errors the writable side of the controlled transform stream. This is useful when the | |
| * transformer only needs to consume a portion of the chunks written to the writable side. | |
| */ | |
| TransformStreamDefaultController.prototype.terminate = function () { | |
| if (!IsTransformStreamDefaultController(this)) { | |
| throw defaultControllerBrandCheckException('terminate'); | |
| } | |
| TransformStreamDefaultControllerTerminate(this); | |
| }; | |
| return TransformStreamDefaultController; | |
| }()); | |
| Object.defineProperties(TransformStreamDefaultController.prototype, { | |
| enqueue: { enumerable: true }, | |
| error: { enumerable: true }, | |
| terminate: { enumerable: true }, | |
| desiredSize: { enumerable: true } | |
| }); | |
| setFunctionName(TransformStreamDefaultController.prototype.enqueue, 'enqueue'); | |
| setFunctionName(TransformStreamDefaultController.prototype.error, 'error'); | |
| setFunctionName(TransformStreamDefaultController.prototype.terminate, 'terminate'); | |
| if (typeof SymbolPolyfill.toStringTag === 'symbol') { | |
| Object.defineProperty(TransformStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { | |
| value: 'TransformStreamDefaultController', | |
| configurable: true | |
| }); | |
| } | |
| // Transform Stream Default Controller Abstract Operations | |
| function IsTransformStreamDefaultController(x) { | |
| if (!typeIsObject(x)) { | |
| return false; | |
| } | |
| if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) { | |
| return false; | |
| } | |
| return x instanceof TransformStreamDefaultController; | |
| } | |
| function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm) { | |
| controller._controlledTransformStream = stream; | |
| stream._transformStreamController = controller; | |
| controller._transformAlgorithm = transformAlgorithm; | |
| controller._flushAlgorithm = flushAlgorithm; | |
| controller._cancelAlgorithm = cancelAlgorithm; | |
| controller._finishPromise = undefined; | |
| controller._finishPromise_resolve = undefined; | |
| controller._finishPromise_reject = undefined; | |
| } | |
| function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) { | |
| var controller = Object.create(TransformStreamDefaultController.prototype); | |
| var transformAlgorithm; | |
| var flushAlgorithm; | |
| var cancelAlgorithm; | |
| if (transformer.transform !== undefined) { | |
| transformAlgorithm = function (chunk) { return transformer.transform(chunk, controller); }; | |
| } | |
| else { | |
| transformAlgorithm = function (chunk) { | |
| try { | |
| TransformStreamDefaultControllerEnqueue(controller, chunk); | |
| return promiseResolvedWith(undefined); | |
| } | |
| catch (transformResultE) { | |
| return promiseRejectedWith(transformResultE); | |
| } | |
| }; | |
| } | |
| if (transformer.flush !== undefined) { | |
| flushAlgorithm = function () { return transformer.flush(controller); }; | |
| } | |
| else { | |
| flushAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| if (transformer.cancel !== undefined) { | |
| cancelAlgorithm = function (reason) { return transformer.cancel(reason); }; | |
| } | |
| else { | |
| cancelAlgorithm = function () { return promiseResolvedWith(undefined); }; | |
| } | |
| SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm); | |
| } | |
| function TransformStreamDefaultControllerClearAlgorithms(controller) { | |
| controller._transformAlgorithm = undefined; | |
| controller._flushAlgorithm = undefined; | |
| controller._cancelAlgorithm = undefined; | |
| } | |
| function TransformStreamDefaultControllerEnqueue(controller, chunk) { | |
| var stream = controller._controlledTransformStream; | |
| var readableController = stream._readable._readableStreamController; | |
| if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(readableController)) { | |
| throw new TypeError('Readable side is not in a state that permits enqueue'); | |
| } | |
| // We throttle transform invocations based on the backpressure of the ReadableStream, but we still | |
| // accept TransformStreamDefaultControllerEnqueue() calls. | |
| try { | |
| ReadableStreamDefaultControllerEnqueue(readableController, chunk); | |
| } | |
| catch (e) { | |
| // This happens when readableStrategy.size() throws. | |
| TransformStreamErrorWritableAndUnblockWrite(stream, e); | |
| throw stream._readable._storedError; | |
| } | |
| var backpressure = ReadableStreamDefaultControllerHasBackpressure(readableController); | |
| if (backpressure !== stream._backpressure) { | |
| TransformStreamSetBackpressure(stream, true); | |
| } | |
| } | |
| function TransformStreamDefaultControllerError(controller, e) { | |
| TransformStreamError(controller._controlledTransformStream, e); | |
| } | |
| function TransformStreamDefaultControllerPerformTransform(controller, chunk) { | |
| var transformPromise = controller._transformAlgorithm(chunk); | |
| return transformPromiseWith(transformPromise, undefined, function (r) { | |
| TransformStreamError(controller._controlledTransformStream, r); | |
| throw r; | |
| }); | |
| } | |
| function TransformStreamDefaultControllerTerminate(controller) { | |
| var stream = controller._controlledTransformStream; | |
| var readableController = stream._readable._readableStreamController; | |
| ReadableStreamDefaultControllerClose(readableController); | |
| var error = new TypeError('TransformStream terminated'); | |
| TransformStreamErrorWritableAndUnblockWrite(stream, error); | |
| } | |
| // TransformStreamDefaultSink Algorithms | |
| function TransformStreamDefaultSinkWriteAlgorithm(stream, chunk) { | |
| var controller = stream._transformStreamController; | |
| if (stream._backpressure) { | |
| var backpressureChangePromise = stream._backpressureChangePromise; | |
| return transformPromiseWith(backpressureChangePromise, function () { | |
| var writable = stream._writable; | |
| var state = writable._state; | |
| if (state === 'erroring') { | |
| throw writable._storedError; | |
| } | |
| return TransformStreamDefaultControllerPerformTransform(controller, chunk); | |
| }); | |
| } | |
| return TransformStreamDefaultControllerPerformTransform(controller, chunk); | |
| } | |
| function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) { | |
| var controller = stream._transformStreamController; | |
| if (controller._finishPromise !== undefined) { | |
| return controller._finishPromise; | |
| } | |
| // stream._readable cannot change after construction, so caching it across a call to user code is safe. | |
| var readable = stream._readable; | |
| // Assign the _finishPromise now so that if _cancelAlgorithm calls readable.cancel() internally, | |
| // we don't run the _cancelAlgorithm again. | |
| controller._finishPromise = newPromise(function (resolve, reject) { | |
| controller._finishPromise_resolve = resolve; | |
| controller._finishPromise_reject = reject; | |
| }); | |
| var cancelPromise = controller._cancelAlgorithm(reason); | |
| TransformStreamDefaultControllerClearAlgorithms(controller); | |
| uponPromise(cancelPromise, function () { | |
| if (readable._state === 'errored') { | |
| defaultControllerFinishPromiseReject(controller, readable._storedError); | |
| } | |
| else { | |
| ReadableStreamDefaultControllerError(readable._readableStreamController, reason); | |
| defaultControllerFinishPromiseResolve(controller); | |
| } | |
| return null; | |
| }, function (r) { | |
| ReadableStreamDefaultControllerError(readable._readableStreamController, r); | |
| defaultControllerFinishPromiseReject(controller, r); | |
| return null; | |
| }); | |
| return controller._finishPromise; | |
| } | |
| function TransformStreamDefaultSinkCloseAlgorithm(stream) { | |
| var controller = stream._transformStreamController; | |
| if (controller._finishPromise !== undefined) { | |
| return controller._finishPromise; | |
| } | |
| // stream._readable cannot change after construction, so caching it across a call to user code is safe. | |
| var readable = stream._readable; | |
| // Assign the _finishPromise now so that if _flushAlgorithm calls readable.cancel() internally, | |
| // we don't also run the _cancelAlgorithm. | |
| controller._finishPromise = newPromise(function (resolve, reject) { | |
| controller._finishPromise_resolve = resolve; | |
| controller._finishPromise_reject = reject; | |
| }); | |
| var flushPromise = controller._flushAlgorithm(); | |
| TransformStreamDefaultControllerClearAlgorithms(controller); | |
| uponPromise(flushPromise, function () { | |
| if (readable._state === 'errored') { | |
| defaultControllerFinishPromiseReject(controller, readable._storedError); | |
| } | |
| else { | |
| ReadableStreamDefaultControllerClose(readable._readableStreamController); | |
| defaultControllerFinishPromiseResolve(controller); | |
| } | |
| return null; | |
| }, function (r) { | |
| ReadableStreamDefaultControllerError(readable._readableStreamController, r); | |
| defaultControllerFinishPromiseReject(controller, r); | |
| return null; | |
| }); | |
| return controller._finishPromise; | |
| } | |
| // TransformStreamDefaultSource Algorithms | |
| function TransformStreamDefaultSourcePullAlgorithm(stream) { | |
| // Invariant. Enforced by the promises returned by start() and pull(). | |
| TransformStreamSetBackpressure(stream, false); | |
| // Prevent the next pull() call until there is backpressure. | |
| return stream._backpressureChangePromise; | |
| } | |
| function TransformStreamDefaultSourceCancelAlgorithm(stream, reason) { | |
| var controller = stream._transformStreamController; | |
| if (controller._finishPromise !== undefined) { | |
| return controller._finishPromise; | |
| } | |
| // stream._writable cannot change after construction, so caching it across a call to user code is safe. | |
| var writable = stream._writable; | |
| // Assign the _finishPromise now so that if _flushAlgorithm calls writable.abort() or | |
| // writable.cancel() internally, we don't run the _cancelAlgorithm again, or also run the | |
| // _flushAlgorithm. | |
| controller._finishPromise = newPromise(function (resolve, reject) { | |
| controller._finishPromise_resolve = resolve; | |
| controller._finishPromise_reject = reject; | |
| }); | |
| var cancelPromise = controller._cancelAlgorithm(reason); | |
| TransformStreamDefaultControllerClearAlgorithms(controller); | |
| uponPromise(cancelPromise, function () { | |
| if (writable._state === 'errored') { | |
| defaultControllerFinishPromiseReject(controller, writable._storedError); | |
| } | |
| else { | |
| WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, reason); | |
| TransformStreamUnblockWrite(stream); | |
| defaultControllerFinishPromiseResolve(controller); | |
| } | |
| return null; | |
| }, function (r) { | |
| WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, r); | |
| TransformStreamUnblockWrite(stream); | |
| defaultControllerFinishPromiseReject(controller, r); | |
| return null; | |
| }); | |
| return controller._finishPromise; | |
| } | |
| // Helper functions for the TransformStreamDefaultController. | |
| function defaultControllerBrandCheckException(name) { | |
| return new TypeError("TransformStreamDefaultController.prototype.".concat(name, " can only be used on a TransformStreamDefaultController")); | |
| } | |
| function defaultControllerFinishPromiseResolve(controller) { | |
| if (controller._finishPromise_resolve === undefined) { | |
| return; | |
| } | |
| controller._finishPromise_resolve(); | |
| controller._finishPromise_resolve = undefined; | |
| controller._finishPromise_reject = undefined; | |
| } | |
| function defaultControllerFinishPromiseReject(controller, reason) { | |
| if (controller._finishPromise_reject === undefined) { | |
| return; | |
| } | |
| setPromiseIsHandledToTrue(controller._finishPromise); | |
| controller._finishPromise_reject(reason); | |
| controller._finishPromise_resolve = undefined; | |
| controller._finishPromise_reject = undefined; | |
| } | |
| // Helper functions for the TransformStream. | |
| function streamBrandCheckException(name) { | |
| return new TypeError("TransformStream.prototype.".concat(name, " can only be used on a TransformStream")); | |
| } | |
| var exports$1 = { | |
| ReadableStream: ReadableStream, | |
| ReadableStreamDefaultController: ReadableStreamDefaultController, | |
| ReadableByteStreamController: ReadableByteStreamController, | |
| ReadableStreamBYOBRequest: ReadableStreamBYOBRequest, | |
| ReadableStreamDefaultReader: ReadableStreamDefaultReader, | |
| ReadableStreamBYOBReader: ReadableStreamBYOBReader, | |
| WritableStream: WritableStream, | |
| WritableStreamDefaultController: WritableStreamDefaultController, | |
| WritableStreamDefaultWriter: WritableStreamDefaultWriter, | |
| ByteLengthQueuingStrategy: ByteLengthQueuingStrategy, | |
| CountQueuingStrategy: CountQueuingStrategy, | |
| TransformStream: TransformStream, | |
| TransformStreamDefaultController: TransformStreamDefaultController | |
| }; | |
| // Add classes to global scope | |
| if (typeof globals !== 'undefined') { | |
| for (var prop in exports$1) { | |
| if (Object.prototype.hasOwnProperty.call(exports$1, prop)) { | |
| Object.defineProperty(globals, prop, { | |
| value: exports$1[prop], | |
| writable: true, | |
| configurable: true | |
| }); | |
| } | |
| } | |
| } | |
| exports.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy; | |
| exports.CountQueuingStrategy = CountQueuingStrategy; | |
| exports.ReadableByteStreamController = ReadableByteStreamController; | |
| exports.ReadableStream = ReadableStream; | |
| exports.ReadableStreamBYOBReader = ReadableStreamBYOBReader; | |
| exports.ReadableStreamBYOBRequest = ReadableStreamBYOBRequest; | |
| exports.ReadableStreamDefaultController = ReadableStreamDefaultController; | |
| exports.ReadableStreamDefaultReader = ReadableStreamDefaultReader; | |
| exports.TransformStream = TransformStream; | |
| exports.TransformStreamDefaultController = TransformStreamDefaultController; | |
| exports.WritableStream = WritableStream; | |
| exports.WritableStreamDefaultController = WritableStreamDefaultController; | |
| exports.WritableStreamDefaultWriter = WritableStreamDefaultWriter; | |
| })); | |
| //# sourceMappingURL=polyfill.js.map | |
Xet Storage Details
- Size:
- 232 kB
- Xet hash:
- 024334a52498ba2b7d243a2510c5795afe98fa7faabc500ccbd51c3c266126dc
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.