source: node_modules/web-streams-polyfill/dist/polyfill.js

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 226.5 KB
RevLine 
[d24f17c]1/**
2 * @license
3 * web-streams-polyfill v3.3.2
4 * Copyright 2024 Mattias Buelens, Diwank Singh Tomer and other contributors.
5 * This code is released under the MIT license.
6 * SPDX-License-Identifier: MIT
7 */
8(function (global, factory) {
9 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
10 typeof define === 'function' && define.amd ? define(['exports'], factory) :
11 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.WebStreamsPolyfill = {}));
12})(this, (function (exports) { 'use strict';
13
14 /// <reference lib="es2015.symbol" />
15 var SymbolPolyfill = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ?
16 Symbol :
17 function (description) { return "Symbol(".concat(description, ")"); };
18
19 /******************************************************************************
20 Copyright (c) Microsoft Corporation.
21
22 Permission to use, copy, modify, and/or distribute this software for any
23 purpose with or without fee is hereby granted.
24
25 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
26 REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
27 AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
28 INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
29 LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
30 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
31 PERFORMANCE OF THIS SOFTWARE.
32 ***************************************************************************** */
33 /* global Reflect, Promise, SuppressedError, Symbol */
34
35
36 function __generator(thisArg, body) {
37 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
38 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
39 function verb(n) { return function (v) { return step([n, v]); }; }
40 function step(op) {
41 if (f) throw new TypeError("Generator is already executing.");
42 while (g && (g = 0, op[0] && (_ = 0)), _) try {
43 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;
44 if (y = 0, t) op = [op[0] & 2, t.value];
45 switch (op[0]) {
46 case 0: case 1: t = op; break;
47 case 4: _.label++; return { value: op[1], done: false };
48 case 5: _.label++; y = op[1]; op = [0]; continue;
49 case 7: op = _.ops.pop(); _.trys.pop(); continue;
50 default:
51 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
52 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
53 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
54 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
55 if (t[2]) _.ops.pop();
56 _.trys.pop(); continue;
57 }
58 op = body.call(thisArg, _);
59 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
60 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
61 }
62 }
63
64 function __values(o) {
65 var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
66 if (m) return m.call(o);
67 if (o && typeof o.length === "number") return {
68 next: function () {
69 if (o && i >= o.length) o = void 0;
70 return { value: o && o[i++], done: !o };
71 }
72 };
73 throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
74 }
75
76 function __await(v) {
77 return this instanceof __await ? (this.v = v, this) : new __await(v);
78 }
79
80 function __asyncGenerator(thisArg, _arguments, generator) {
81 if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
82 var g = generator.apply(thisArg, _arguments || []), i, q = [];
83 return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
84 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); }); }; }
85 function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
86 function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
87 function fulfill(value) { resume("next", value); }
88 function reject(value) { resume("throw", value); }
89 function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
90 }
91
92 function __asyncDelegator(o) {
93 var i, p;
94 return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
95 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; }
96 }
97
98 function __asyncValues(o) {
99 if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
100 var m = o[Symbol.asyncIterator], i;
101 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);
102 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); }); }; }
103 function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
104 }
105
106 typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
107 var e = new Error(message);
108 return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
109 };
110
111 function noop() {
112 return undefined;
113 }
114
115 function typeIsObject(x) {
116 return (typeof x === 'object' && x !== null) || typeof x === 'function';
117 }
118 var rethrowAssertionErrorRejection = noop;
119 function setFunctionName(fn, name) {
120 try {
121 Object.defineProperty(fn, 'name', {
122 value: name,
123 configurable: true
124 });
125 }
126 catch (_a) {
127 // This property is non-configurable in older browsers, so ignore if this throws.
128 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility
129 }
130 }
131
132 var originalPromise = Promise;
133 var originalPromiseThen = Promise.prototype.then;
134 var originalPromiseReject = Promise.reject.bind(originalPromise);
135 // https://webidl.spec.whatwg.org/#a-new-promise
136 function newPromise(executor) {
137 return new originalPromise(executor);
138 }
139 // https://webidl.spec.whatwg.org/#a-promise-resolved-with
140 function promiseResolvedWith(value) {
141 return newPromise(function (resolve) { return resolve(value); });
142 }
143 // https://webidl.spec.whatwg.org/#a-promise-rejected-with
144 function promiseRejectedWith(reason) {
145 return originalPromiseReject(reason);
146 }
147 function PerformPromiseThen(promise, onFulfilled, onRejected) {
148 // There doesn't appear to be any way to correctly emulate the behaviour from JavaScript, so this is just an
149 // approximation.
150 return originalPromiseThen.call(promise, onFulfilled, onRejected);
151 }
152 // Bluebird logs a warning when a promise is created within a fulfillment handler, but then isn't returned
153 // from that handler. To prevent this, return null instead of void from all handlers.
154 // http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it
155 function uponPromise(promise, onFulfilled, onRejected) {
156 PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection);
157 }
158 function uponFulfillment(promise, onFulfilled) {
159 uponPromise(promise, onFulfilled);
160 }
161 function uponRejection(promise, onRejected) {
162 uponPromise(promise, undefined, onRejected);
163 }
164 function transformPromiseWith(promise, fulfillmentHandler, rejectionHandler) {
165 return PerformPromiseThen(promise, fulfillmentHandler, rejectionHandler);
166 }
167 function setPromiseIsHandledToTrue(promise) {
168 PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection);
169 }
170 var _queueMicrotask = function (callback) {
171 if (typeof queueMicrotask === 'function') {
172 _queueMicrotask = queueMicrotask;
173 }
174 else {
175 var resolvedPromise_1 = promiseResolvedWith(undefined);
176 _queueMicrotask = function (cb) { return PerformPromiseThen(resolvedPromise_1, cb); };
177 }
178 return _queueMicrotask(callback);
179 };
180 function reflectCall(F, V, args) {
181 if (typeof F !== 'function') {
182 throw new TypeError('Argument is not a function');
183 }
184 return Function.prototype.apply.call(F, V, args);
185 }
186 function promiseCall(F, V, args) {
187 try {
188 return promiseResolvedWith(reflectCall(F, V, args));
189 }
190 catch (value) {
191 return promiseRejectedWith(value);
192 }
193 }
194
195 // Original from Chromium
196 // https://chromium.googlesource.com/chromium/src/+/0aee4434a4dba42a42abaea9bfbc0cd196a63bc1/third_party/blink/renderer/core/streams/SimpleQueue.js
197 var QUEUE_MAX_ARRAY_SIZE = 16384;
198 /**
199 * Simple queue structure.
200 *
201 * Avoids scalability issues with using a packed array directly by using
202 * multiple arrays in a linked list and keeping the array size bounded.
203 */
204 var SimpleQueue = /** @class */ (function () {
205 function SimpleQueue() {
206 this._cursor = 0;
207 this._size = 0;
208 // _front and _back are always defined.
209 this._front = {
210 _elements: [],
211 _next: undefined
212 };
213 this._back = this._front;
214 // The cursor is used to avoid calling Array.shift().
215 // It contains the index of the front element of the array inside the
216 // front-most node. It is always in the range [0, QUEUE_MAX_ARRAY_SIZE).
217 this._cursor = 0;
218 // When there is only one node, size === elements.length - cursor.
219 this._size = 0;
220 }
221 Object.defineProperty(SimpleQueue.prototype, "length", {
222 get: function () {
223 return this._size;
224 },
225 enumerable: false,
226 configurable: true
227 });
228 // For exception safety, this method is structured in order:
229 // 1. Read state
230 // 2. Calculate required state mutations
231 // 3. Perform state mutations
232 SimpleQueue.prototype.push = function (element) {
233 var oldBack = this._back;
234 var newBack = oldBack;
235 if (oldBack._elements.length === QUEUE_MAX_ARRAY_SIZE - 1) {
236 newBack = {
237 _elements: [],
238 _next: undefined
239 };
240 }
241 // push() is the mutation most likely to throw an exception, so it
242 // goes first.
243 oldBack._elements.push(element);
244 if (newBack !== oldBack) {
245 this._back = newBack;
246 oldBack._next = newBack;
247 }
248 ++this._size;
249 };
250 // Like push(), shift() follows the read -> calculate -> mutate pattern for
251 // exception safety.
252 SimpleQueue.prototype.shift = function () { // must not be called on an empty queue
253 var oldFront = this._front;
254 var newFront = oldFront;
255 var oldCursor = this._cursor;
256 var newCursor = oldCursor + 1;
257 var elements = oldFront._elements;
258 var element = elements[oldCursor];
259 if (newCursor === QUEUE_MAX_ARRAY_SIZE) {
260 newFront = oldFront._next;
261 newCursor = 0;
262 }
263 // No mutations before this point.
264 --this._size;
265 this._cursor = newCursor;
266 if (oldFront !== newFront) {
267 this._front = newFront;
268 }
269 // Permit shifted element to be garbage collected.
270 elements[oldCursor] = undefined;
271 return element;
272 };
273 // The tricky thing about forEach() is that it can be called
274 // re-entrantly. The queue may be mutated inside the callback. It is easy to
275 // see that push() within the callback has no negative effects since the end
276 // of the queue is checked for on every iteration. If shift() is called
277 // repeatedly within the callback then the next iteration may return an
278 // element that has been removed. In this case the callback will be called
279 // with undefined values until we either "catch up" with elements that still
280 // exist or reach the back of the queue.
281 SimpleQueue.prototype.forEach = function (callback) {
282 var i = this._cursor;
283 var node = this._front;
284 var elements = node._elements;
285 while (i !== elements.length || node._next !== undefined) {
286 if (i === elements.length) {
287 node = node._next;
288 elements = node._elements;
289 i = 0;
290 if (elements.length === 0) {
291 break;
292 }
293 }
294 callback(elements[i]);
295 ++i;
296 }
297 };
298 // Return the element that would be returned if shift() was called now,
299 // without modifying the queue.
300 SimpleQueue.prototype.peek = function () { // must not be called on an empty queue
301 var front = this._front;
302 var cursor = this._cursor;
303 return front._elements[cursor];
304 };
305 return SimpleQueue;
306 }());
307
308 var AbortSteps = SymbolPolyfill('[[AbortSteps]]');
309 var ErrorSteps = SymbolPolyfill('[[ErrorSteps]]');
310 var CancelSteps = SymbolPolyfill('[[CancelSteps]]');
311 var PullSteps = SymbolPolyfill('[[PullSteps]]');
312 var ReleaseSteps = SymbolPolyfill('[[ReleaseSteps]]');
313
314 function ReadableStreamReaderGenericInitialize(reader, stream) {
315 reader._ownerReadableStream = stream;
316 stream._reader = reader;
317 if (stream._state === 'readable') {
318 defaultReaderClosedPromiseInitialize(reader);
319 }
320 else if (stream._state === 'closed') {
321 defaultReaderClosedPromiseInitializeAsResolved(reader);
322 }
323 else {
324 defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);
325 }
326 }
327 // A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state
328 // check.
329 function ReadableStreamReaderGenericCancel(reader, reason) {
330 var stream = reader._ownerReadableStream;
331 return ReadableStreamCancel(stream, reason);
332 }
333 function ReadableStreamReaderGenericRelease(reader) {
334 var stream = reader._ownerReadableStream;
335 if (stream._state === 'readable') {
336 defaultReaderClosedPromiseReject(reader, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness"));
337 }
338 else {
339 defaultReaderClosedPromiseResetToRejected(reader, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness"));
340 }
341 stream._readableStreamController[ReleaseSteps]();
342 stream._reader = undefined;
343 reader._ownerReadableStream = undefined;
344 }
345 // Helper functions for the readers.
346 function readerLockException(name) {
347 return new TypeError('Cannot ' + name + ' a stream using a released reader');
348 }
349 // Helper functions for the ReadableStreamDefaultReader.
350 function defaultReaderClosedPromiseInitialize(reader) {
351 reader._closedPromise = newPromise(function (resolve, reject) {
352 reader._closedPromise_resolve = resolve;
353 reader._closedPromise_reject = reject;
354 });
355 }
356 function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {
357 defaultReaderClosedPromiseInitialize(reader);
358 defaultReaderClosedPromiseReject(reader, reason);
359 }
360 function defaultReaderClosedPromiseInitializeAsResolved(reader) {
361 defaultReaderClosedPromiseInitialize(reader);
362 defaultReaderClosedPromiseResolve(reader);
363 }
364 function defaultReaderClosedPromiseReject(reader, reason) {
365 if (reader._closedPromise_reject === undefined) {
366 return;
367 }
368 setPromiseIsHandledToTrue(reader._closedPromise);
369 reader._closedPromise_reject(reason);
370 reader._closedPromise_resolve = undefined;
371 reader._closedPromise_reject = undefined;
372 }
373 function defaultReaderClosedPromiseResetToRejected(reader, reason) {
374 defaultReaderClosedPromiseInitializeAsRejected(reader, reason);
375 }
376 function defaultReaderClosedPromiseResolve(reader) {
377 if (reader._closedPromise_resolve === undefined) {
378 return;
379 }
380 reader._closedPromise_resolve(undefined);
381 reader._closedPromise_resolve = undefined;
382 reader._closedPromise_reject = undefined;
383 }
384
385 /// <reference lib="es2015.core" />
386 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill
387 var NumberIsFinite = Number.isFinite || function (x) {
388 return typeof x === 'number' && isFinite(x);
389 };
390
391 /// <reference lib="es2015.core" />
392 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc#Polyfill
393 var MathTrunc = Math.trunc || function (v) {
394 return v < 0 ? Math.ceil(v) : Math.floor(v);
395 };
396
397 // https://heycam.github.io/webidl/#idl-dictionaries
398 function isDictionary(x) {
399 return typeof x === 'object' || typeof x === 'function';
400 }
401 function assertDictionary(obj, context) {
402 if (obj !== undefined && !isDictionary(obj)) {
403 throw new TypeError("".concat(context, " is not an object."));
404 }
405 }
406 // https://heycam.github.io/webidl/#idl-callback-functions
407 function assertFunction(x, context) {
408 if (typeof x !== 'function') {
409 throw new TypeError("".concat(context, " is not a function."));
410 }
411 }
412 // https://heycam.github.io/webidl/#idl-object
413 function isObject(x) {
414 return (typeof x === 'object' && x !== null) || typeof x === 'function';
415 }
416 function assertObject(x, context) {
417 if (!isObject(x)) {
418 throw new TypeError("".concat(context, " is not an object."));
419 }
420 }
421 function assertRequiredArgument(x, position, context) {
422 if (x === undefined) {
423 throw new TypeError("Parameter ".concat(position, " is required in '").concat(context, "'."));
424 }
425 }
426 function assertRequiredField(x, field, context) {
427 if (x === undefined) {
428 throw new TypeError("".concat(field, " is required in '").concat(context, "'."));
429 }
430 }
431 // https://heycam.github.io/webidl/#idl-unrestricted-double
432 function convertUnrestrictedDouble(value) {
433 return Number(value);
434 }
435 function censorNegativeZero(x) {
436 return x === 0 ? 0 : x;
437 }
438 function integerPart(x) {
439 return censorNegativeZero(MathTrunc(x));
440 }
441 // https://heycam.github.io/webidl/#idl-unsigned-long-long
442 function convertUnsignedLongLongWithEnforceRange(value, context) {
443 var lowerBound = 0;
444 var upperBound = Number.MAX_SAFE_INTEGER;
445 var x = Number(value);
446 x = censorNegativeZero(x);
447 if (!NumberIsFinite(x)) {
448 throw new TypeError("".concat(context, " is not a finite number"));
449 }
450 x = integerPart(x);
451 if (x < lowerBound || x > upperBound) {
452 throw new TypeError("".concat(context, " is outside the accepted range of ").concat(lowerBound, " to ").concat(upperBound, ", inclusive"));
453 }
454 if (!NumberIsFinite(x) || x === 0) {
455 return 0;
456 }
457 // TODO Use BigInt if supported?
458 // let xBigInt = BigInt(integerPart(x));
459 // xBigInt = BigInt.asUintN(64, xBigInt);
460 // return Number(xBigInt);
461 return x;
462 }
463
464 function assertReadableStream(x, context) {
465 if (!IsReadableStream(x)) {
466 throw new TypeError("".concat(context, " is not a ReadableStream."));
467 }
468 }
469
470 // Abstract operations for the ReadableStream.
471 function AcquireReadableStreamDefaultReader(stream) {
472 return new ReadableStreamDefaultReader(stream);
473 }
474 // ReadableStream API exposed for controllers.
475 function ReadableStreamAddReadRequest(stream, readRequest) {
476 stream._reader._readRequests.push(readRequest);
477 }
478 function ReadableStreamFulfillReadRequest(stream, chunk, done) {
479 var reader = stream._reader;
480 var readRequest = reader._readRequests.shift();
481 if (done) {
482 readRequest._closeSteps();
483 }
484 else {
485 readRequest._chunkSteps(chunk);
486 }
487 }
488 function ReadableStreamGetNumReadRequests(stream) {
489 return stream._reader._readRequests.length;
490 }
491 function ReadableStreamHasDefaultReader(stream) {
492 var reader = stream._reader;
493 if (reader === undefined) {
494 return false;
495 }
496 if (!IsReadableStreamDefaultReader(reader)) {
497 return false;
498 }
499 return true;
500 }
501 /**
502 * A default reader vended by a {@link ReadableStream}.
503 *
504 * @public
505 */
506 var ReadableStreamDefaultReader = /** @class */ (function () {
507 function ReadableStreamDefaultReader(stream) {
508 assertRequiredArgument(stream, 1, 'ReadableStreamDefaultReader');
509 assertReadableStream(stream, 'First parameter');
510 if (IsReadableStreamLocked(stream)) {
511 throw new TypeError('This stream has already been locked for exclusive reading by another reader');
512 }
513 ReadableStreamReaderGenericInitialize(this, stream);
514 this._readRequests = new SimpleQueue();
515 }
516 Object.defineProperty(ReadableStreamDefaultReader.prototype, "closed", {
517 /**
518 * Returns a promise that will be fulfilled when the stream becomes closed,
519 * or rejected if the stream ever errors or the reader's lock is released before the stream finishes closing.
520 */
521 get: function () {
522 if (!IsReadableStreamDefaultReader(this)) {
523 return promiseRejectedWith(defaultReaderBrandCheckException('closed'));
524 }
525 return this._closedPromise;
526 },
527 enumerable: false,
528 configurable: true
529 });
530 /**
531 * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}.
532 */
533 ReadableStreamDefaultReader.prototype.cancel = function (reason) {
534 if (reason === void 0) { reason = undefined; }
535 if (!IsReadableStreamDefaultReader(this)) {
536 return promiseRejectedWith(defaultReaderBrandCheckException('cancel'));
537 }
538 if (this._ownerReadableStream === undefined) {
539 return promiseRejectedWith(readerLockException('cancel'));
540 }
541 return ReadableStreamReaderGenericCancel(this, reason);
542 };
543 /**
544 * Returns a promise that allows access to the next chunk from the stream's internal queue, if available.
545 *
546 * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source.
547 */
548 ReadableStreamDefaultReader.prototype.read = function () {
549 if (!IsReadableStreamDefaultReader(this)) {
550 return promiseRejectedWith(defaultReaderBrandCheckException('read'));
551 }
552 if (this._ownerReadableStream === undefined) {
553 return promiseRejectedWith(readerLockException('read from'));
554 }
555 var resolvePromise;
556 var rejectPromise;
557 var promise = newPromise(function (resolve, reject) {
558 resolvePromise = resolve;
559 rejectPromise = reject;
560 });
561 var readRequest = {
562 _chunkSteps: function (chunk) { return resolvePromise({ value: chunk, done: false }); },
563 _closeSteps: function () { return resolvePromise({ value: undefined, done: true }); },
564 _errorSteps: function (e) { return rejectPromise(e); }
565 };
566 ReadableStreamDefaultReaderRead(this, readRequest);
567 return promise;
568 };
569 /**
570 * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active.
571 * If the associated stream is errored when the lock is released, the reader will appear errored in the same way
572 * from now on; otherwise, the reader will appear closed.
573 *
574 * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by
575 * the reader's {@link ReadableStreamDefaultReader.read | read()} method has not yet been settled. Attempting to
576 * do so will throw a `TypeError` and leave the reader locked to the stream.
577 */
578 ReadableStreamDefaultReader.prototype.releaseLock = function () {
579 if (!IsReadableStreamDefaultReader(this)) {
580 throw defaultReaderBrandCheckException('releaseLock');
581 }
582 if (this._ownerReadableStream === undefined) {
583 return;
584 }
585 ReadableStreamDefaultReaderRelease(this);
586 };
587 return ReadableStreamDefaultReader;
588 }());
589 Object.defineProperties(ReadableStreamDefaultReader.prototype, {
590 cancel: { enumerable: true },
591 read: { enumerable: true },
592 releaseLock: { enumerable: true },
593 closed: { enumerable: true }
594 });
595 setFunctionName(ReadableStreamDefaultReader.prototype.cancel, 'cancel');
596 setFunctionName(ReadableStreamDefaultReader.prototype.read, 'read');
597 setFunctionName(ReadableStreamDefaultReader.prototype.releaseLock, 'releaseLock');
598 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
599 Object.defineProperty(ReadableStreamDefaultReader.prototype, SymbolPolyfill.toStringTag, {
600 value: 'ReadableStreamDefaultReader',
601 configurable: true
602 });
603 }
604 // Abstract operations for the readers.
605 function IsReadableStreamDefaultReader(x) {
606 if (!typeIsObject(x)) {
607 return false;
608 }
609 if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {
610 return false;
611 }
612 return x instanceof ReadableStreamDefaultReader;
613 }
614 function ReadableStreamDefaultReaderRead(reader, readRequest) {
615 var stream = reader._ownerReadableStream;
616 stream._disturbed = true;
617 if (stream._state === 'closed') {
618 readRequest._closeSteps();
619 }
620 else if (stream._state === 'errored') {
621 readRequest._errorSteps(stream._storedError);
622 }
623 else {
624 stream._readableStreamController[PullSteps](readRequest);
625 }
626 }
627 function ReadableStreamDefaultReaderRelease(reader) {
628 ReadableStreamReaderGenericRelease(reader);
629 var e = new TypeError('Reader was released');
630 ReadableStreamDefaultReaderErrorReadRequests(reader, e);
631 }
632 function ReadableStreamDefaultReaderErrorReadRequests(reader, e) {
633 var readRequests = reader._readRequests;
634 reader._readRequests = new SimpleQueue();
635 readRequests.forEach(function (readRequest) {
636 readRequest._errorSteps(e);
637 });
638 }
639 // Helper functions for the ReadableStreamDefaultReader.
640 function defaultReaderBrandCheckException(name) {
641 return new TypeError("ReadableStreamDefaultReader.prototype.".concat(name, " can only be used on a ReadableStreamDefaultReader"));
642 }
643
644 /// <reference lib="es2018.asynciterable" />
645 var _a;
646 var AsyncIteratorPrototype;
647 if (typeof SymbolPolyfill.asyncIterator === 'symbol') {
648 // We're running inside a ES2018+ environment, but we're compiling to an older syntax.
649 // We cannot access %AsyncIteratorPrototype% without non-ES2018 syntax, but we can re-create it.
650 AsyncIteratorPrototype = (_a = {},
651 // 25.1.3.1 %AsyncIteratorPrototype% [ @@asyncIterator ] ( )
652 // https://tc39.github.io/ecma262/#sec-asynciteratorprototype-asynciterator
653 _a[SymbolPolyfill.asyncIterator] = function () {
654 return this;
655 },
656 _a);
657 Object.defineProperty(AsyncIteratorPrototype, SymbolPolyfill.asyncIterator, { enumerable: false });
658 }
659
660 /// <reference lib="es2018.asynciterable" />
661 var ReadableStreamAsyncIteratorImpl = /** @class */ (function () {
662 function ReadableStreamAsyncIteratorImpl(reader, preventCancel) {
663 this._ongoingPromise = undefined;
664 this._isFinished = false;
665 this._reader = reader;
666 this._preventCancel = preventCancel;
667 }
668 ReadableStreamAsyncIteratorImpl.prototype.next = function () {
669 var _this = this;
670 var nextSteps = function () { return _this._nextSteps(); };
671 this._ongoingPromise = this._ongoingPromise ?
672 transformPromiseWith(this._ongoingPromise, nextSteps, nextSteps) :
673 nextSteps();
674 return this._ongoingPromise;
675 };
676 ReadableStreamAsyncIteratorImpl.prototype.return = function (value) {
677 var _this = this;
678 var returnSteps = function () { return _this._returnSteps(value); };
679 return this._ongoingPromise ?
680 transformPromiseWith(this._ongoingPromise, returnSteps, returnSteps) :
681 returnSteps();
682 };
683 ReadableStreamAsyncIteratorImpl.prototype._nextSteps = function () {
684 var _this = this;
685 if (this._isFinished) {
686 return Promise.resolve({ value: undefined, done: true });
687 }
688 var reader = this._reader;
689 var resolvePromise;
690 var rejectPromise;
691 var promise = newPromise(function (resolve, reject) {
692 resolvePromise = resolve;
693 rejectPromise = reject;
694 });
695 var readRequest = {
696 _chunkSteps: function (chunk) {
697 _this._ongoingPromise = undefined;
698 // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test.
699 // FIXME Is this a bug in the specification, or in the test?
700 _queueMicrotask(function () { return resolvePromise({ value: chunk, done: false }); });
701 },
702 _closeSteps: function () {
703 _this._ongoingPromise = undefined;
704 _this._isFinished = true;
705 ReadableStreamReaderGenericRelease(reader);
706 resolvePromise({ value: undefined, done: true });
707 },
708 _errorSteps: function (reason) {
709 _this._ongoingPromise = undefined;
710 _this._isFinished = true;
711 ReadableStreamReaderGenericRelease(reader);
712 rejectPromise(reason);
713 }
714 };
715 ReadableStreamDefaultReaderRead(reader, readRequest);
716 return promise;
717 };
718 ReadableStreamAsyncIteratorImpl.prototype._returnSteps = function (value) {
719 if (this._isFinished) {
720 return Promise.resolve({ value: value, done: true });
721 }
722 this._isFinished = true;
723 var reader = this._reader;
724 if (!this._preventCancel) {
725 var result = ReadableStreamReaderGenericCancel(reader, value);
726 ReadableStreamReaderGenericRelease(reader);
727 return transformPromiseWith(result, function () { return ({ value: value, done: true }); });
728 }
729 ReadableStreamReaderGenericRelease(reader);
730 return promiseResolvedWith({ value: value, done: true });
731 };
732 return ReadableStreamAsyncIteratorImpl;
733 }());
734 var ReadableStreamAsyncIteratorPrototype = {
735 next: function () {
736 if (!IsReadableStreamAsyncIterator(this)) {
737 return promiseRejectedWith(streamAsyncIteratorBrandCheckException('next'));
738 }
739 return this._asyncIteratorImpl.next();
740 },
741 return: function (value) {
742 if (!IsReadableStreamAsyncIterator(this)) {
743 return promiseRejectedWith(streamAsyncIteratorBrandCheckException('return'));
744 }
745 return this._asyncIteratorImpl.return(value);
746 }
747 };
748 if (AsyncIteratorPrototype !== undefined) {
749 Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype);
750 }
751 // Abstract operations for the ReadableStream.
752 function AcquireReadableStreamAsyncIterator(stream, preventCancel) {
753 var reader = AcquireReadableStreamDefaultReader(stream);
754 var impl = new ReadableStreamAsyncIteratorImpl(reader, preventCancel);
755 var iterator = Object.create(ReadableStreamAsyncIteratorPrototype);
756 iterator._asyncIteratorImpl = impl;
757 return iterator;
758 }
759 function IsReadableStreamAsyncIterator(x) {
760 if (!typeIsObject(x)) {
761 return false;
762 }
763 if (!Object.prototype.hasOwnProperty.call(x, '_asyncIteratorImpl')) {
764 return false;
765 }
766 try {
767 // noinspection SuspiciousTypeOfGuard
768 return x._asyncIteratorImpl instanceof
769 ReadableStreamAsyncIteratorImpl;
770 }
771 catch (_a) {
772 return false;
773 }
774 }
775 // Helper functions for the ReadableStream.
776 function streamAsyncIteratorBrandCheckException(name) {
777 return new TypeError("ReadableStreamAsyncIterator.".concat(name, " can only be used on a ReadableSteamAsyncIterator"));
778 }
779
780 /// <reference lib="es2015.core" />
781 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#Polyfill
782 var NumberIsNaN = Number.isNaN || function (x) {
783 // eslint-disable-next-line no-self-compare
784 return x !== x;
785 };
786
787 function CreateArrayFromList(elements) {
788 // We use arrays to represent lists, so this is basically a no-op.
789 // Do a slice though just in case we happen to depend on the unique-ness.
790 return elements.slice();
791 }
792 function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) {
793 new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
794 }
795 var TransferArrayBuffer = function (O) {
796 if (typeof O.transfer === 'function') {
797 TransferArrayBuffer = function (buffer) { return buffer.transfer(); };
798 }
799 else if (typeof structuredClone === 'function') {
800 TransferArrayBuffer = function (buffer) { return structuredClone(buffer, { transfer: [buffer] }); };
801 }
802 else {
803 // Not implemented correctly
804 TransferArrayBuffer = function (buffer) { return buffer; };
805 }
806 return TransferArrayBuffer(O);
807 };
808 var IsDetachedBuffer = function (O) {
809 if (typeof O.detached === 'boolean') {
810 IsDetachedBuffer = function (buffer) { return buffer.detached; };
811 }
812 else {
813 // Not implemented correctly
814 IsDetachedBuffer = function (buffer) { return buffer.byteLength === 0; };
815 }
816 return IsDetachedBuffer(O);
817 };
818 function ArrayBufferSlice(buffer, begin, end) {
819 // ArrayBuffer.prototype.slice is not available on IE10
820 // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice
821 if (buffer.slice) {
822 return buffer.slice(begin, end);
823 }
824 var length = end - begin;
825 var slice = new ArrayBuffer(length);
826 CopyDataBlockBytes(slice, 0, buffer, begin, length);
827 return slice;
828 }
829 function GetMethod(receiver, prop) {
830 var func = receiver[prop];
831 if (func === undefined || func === null) {
832 return undefined;
833 }
834 if (typeof func !== 'function') {
835 throw new TypeError("".concat(String(prop), " is not a function"));
836 }
837 return func;
838 }
839 function CreateAsyncFromSyncIterator(syncIteratorRecord) {
840 // Instead of re-implementing CreateAsyncFromSyncIterator and %AsyncFromSyncIteratorPrototype%,
841 // we use yield* inside an async generator function to achieve the same result.
842 var _a;
843 // Wrap the sync iterator inside a sync iterable, so we can use it with yield*.
844 var syncIterable = (_a = {},
845 _a[SymbolPolyfill.iterator] = function () { return syncIteratorRecord.iterator; },
846 _a);
847 // Create an async generator function and immediately invoke it.
848 var asyncIterator = (function () {
849 return __asyncGenerator(this, arguments, function () {
850 return __generator(this, function (_a) {
851 switch (_a.label) {
852 case 0: return [5 /*yield**/, __values(__asyncDelegator(__asyncValues(syncIterable)))];
853 case 1: return [4 /*yield*/, __await.apply(void 0, [_a.sent()])];
854 case 2: return [4 /*yield*/, __await.apply(void 0, [_a.sent()])];
855 case 3: return [2 /*return*/, _a.sent()];
856 }
857 });
858 });
859 }());
860 // Return as an async iterator record.
861 var nextMethod = asyncIterator.next;
862 return { iterator: asyncIterator, nextMethod: nextMethod, done: false };
863 }
864 function GetIterator(obj, hint, method) {
865 if (hint === void 0) { hint = 'sync'; }
866 if (method === undefined) {
867 if (hint === 'async') {
868 method = GetMethod(obj, SymbolPolyfill.asyncIterator);
869 if (method === undefined) {
870 var syncMethod = GetMethod(obj, SymbolPolyfill.iterator);
871 var syncIteratorRecord = GetIterator(obj, 'sync', syncMethod);
872 return CreateAsyncFromSyncIterator(syncIteratorRecord);
873 }
874 }
875 else {
876 method = GetMethod(obj, SymbolPolyfill.iterator);
877 }
878 }
879 if (method === undefined) {
880 throw new TypeError('The object is not iterable');
881 }
882 var iterator = reflectCall(method, obj, []);
883 if (!typeIsObject(iterator)) {
884 throw new TypeError('The iterator method must return an object');
885 }
886 var nextMethod = iterator.next;
887 return { iterator: iterator, nextMethod: nextMethod, done: false };
888 }
889 function IteratorNext(iteratorRecord) {
890 var result = reflectCall(iteratorRecord.nextMethod, iteratorRecord.iterator, []);
891 if (!typeIsObject(result)) {
892 throw new TypeError('The iterator.next() method must return an object');
893 }
894 return result;
895 }
896 function IteratorComplete(iterResult) {
897 return Boolean(iterResult.done);
898 }
899 function IteratorValue(iterResult) {
900 return iterResult.value;
901 }
902
903 function IsNonNegativeNumber(v) {
904 if (typeof v !== 'number') {
905 return false;
906 }
907 if (NumberIsNaN(v)) {
908 return false;
909 }
910 if (v < 0) {
911 return false;
912 }
913 return true;
914 }
915 function CloneAsUint8Array(O) {
916 var buffer = ArrayBufferSlice(O.buffer, O.byteOffset, O.byteOffset + O.byteLength);
917 return new Uint8Array(buffer);
918 }
919
920 function DequeueValue(container) {
921 var pair = container._queue.shift();
922 container._queueTotalSize -= pair.size;
923 if (container._queueTotalSize < 0) {
924 container._queueTotalSize = 0;
925 }
926 return pair.value;
927 }
928 function EnqueueValueWithSize(container, value, size) {
929 if (!IsNonNegativeNumber(size) || size === Infinity) {
930 throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
931 }
932 container._queue.push({ value: value, size: size });
933 container._queueTotalSize += size;
934 }
935 function PeekQueueValue(container) {
936 var pair = container._queue.peek();
937 return pair.value;
938 }
939 function ResetQueue(container) {
940 container._queue = new SimpleQueue();
941 container._queueTotalSize = 0;
942 }
943
944 function isDataViewConstructor(ctor) {
945 return ctor === DataView;
946 }
947 function isDataView(view) {
948 return isDataViewConstructor(view.constructor);
949 }
950 function arrayBufferViewElementSize(ctor) {
951 if (isDataViewConstructor(ctor)) {
952 return 1;
953 }
954 return ctor.BYTES_PER_ELEMENT;
955 }
956
957 /**
958 * A pull-into request in a {@link ReadableByteStreamController}.
959 *
960 * @public
961 */
962 var ReadableStreamBYOBRequest = /** @class */ (function () {
963 function ReadableStreamBYOBRequest() {
964 throw new TypeError('Illegal constructor');
965 }
966 Object.defineProperty(ReadableStreamBYOBRequest.prototype, "view", {
967 /**
968 * Returns the view for writing in to, or `null` if the BYOB request has already been responded to.
969 */
970 get: function () {
971 if (!IsReadableStreamBYOBRequest(this)) {
972 throw byobRequestBrandCheckException('view');
973 }
974 return this._view;
975 },
976 enumerable: false,
977 configurable: true
978 });
979 ReadableStreamBYOBRequest.prototype.respond = function (bytesWritten) {
980 if (!IsReadableStreamBYOBRequest(this)) {
981 throw byobRequestBrandCheckException('respond');
982 }
983 assertRequiredArgument(bytesWritten, 1, 'respond');
984 bytesWritten = convertUnsignedLongLongWithEnforceRange(bytesWritten, 'First parameter');
985 if (this._associatedReadableByteStreamController === undefined) {
986 throw new TypeError('This BYOB request has been invalidated');
987 }
988 if (IsDetachedBuffer(this._view.buffer)) {
989 throw new TypeError("The BYOB request's buffer has been detached and so cannot be used as a response");
990 }
991 ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);
992 };
993 ReadableStreamBYOBRequest.prototype.respondWithNewView = function (view) {
994 if (!IsReadableStreamBYOBRequest(this)) {
995 throw byobRequestBrandCheckException('respondWithNewView');
996 }
997 assertRequiredArgument(view, 1, 'respondWithNewView');
998 if (!ArrayBuffer.isView(view)) {
999 throw new TypeError('You can only respond with array buffer views');
1000 }
1001 if (this._associatedReadableByteStreamController === undefined) {
1002 throw new TypeError('This BYOB request has been invalidated');
1003 }
1004 if (IsDetachedBuffer(view.buffer)) {
1005 throw new TypeError('The given view\'s buffer has been detached and so cannot be used as a response');
1006 }
1007 ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);
1008 };
1009 return ReadableStreamBYOBRequest;
1010 }());
1011 Object.defineProperties(ReadableStreamBYOBRequest.prototype, {
1012 respond: { enumerable: true },
1013 respondWithNewView: { enumerable: true },
1014 view: { enumerable: true }
1015 });
1016 setFunctionName(ReadableStreamBYOBRequest.prototype.respond, 'respond');
1017 setFunctionName(ReadableStreamBYOBRequest.prototype.respondWithNewView, 'respondWithNewView');
1018 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
1019 Object.defineProperty(ReadableStreamBYOBRequest.prototype, SymbolPolyfill.toStringTag, {
1020 value: 'ReadableStreamBYOBRequest',
1021 configurable: true
1022 });
1023 }
1024 /**
1025 * Allows control of a {@link ReadableStream | readable byte stream}'s state and internal queue.
1026 *
1027 * @public
1028 */
1029 var ReadableByteStreamController = /** @class */ (function () {
1030 function ReadableByteStreamController() {
1031 throw new TypeError('Illegal constructor');
1032 }
1033 Object.defineProperty(ReadableByteStreamController.prototype, "byobRequest", {
1034 /**
1035 * Returns the current BYOB pull request, or `null` if there isn't one.
1036 */
1037 get: function () {
1038 if (!IsReadableByteStreamController(this)) {
1039 throw byteStreamControllerBrandCheckException('byobRequest');
1040 }
1041 return ReadableByteStreamControllerGetBYOBRequest(this);
1042 },
1043 enumerable: false,
1044 configurable: true
1045 });
1046 Object.defineProperty(ReadableByteStreamController.prototype, "desiredSize", {
1047 /**
1048 * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is
1049 * over-full. An underlying byte source ought to use this information to determine when and how to apply backpressure.
1050 */
1051 get: function () {
1052 if (!IsReadableByteStreamController(this)) {
1053 throw byteStreamControllerBrandCheckException('desiredSize');
1054 }
1055 return ReadableByteStreamControllerGetDesiredSize(this);
1056 },
1057 enumerable: false,
1058 configurable: true
1059 });
1060 /**
1061 * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from
1062 * the stream, but once those are read, the stream will become closed.
1063 */
1064 ReadableByteStreamController.prototype.close = function () {
1065 if (!IsReadableByteStreamController(this)) {
1066 throw byteStreamControllerBrandCheckException('close');
1067 }
1068 if (this._closeRequested) {
1069 throw new TypeError('The stream has already been closed; do not close it again!');
1070 }
1071 var state = this._controlledReadableByteStream._state;
1072 if (state !== 'readable') {
1073 throw new TypeError("The stream (in ".concat(state, " state) is not in the readable state and cannot be closed"));
1074 }
1075 ReadableByteStreamControllerClose(this);
1076 };
1077 ReadableByteStreamController.prototype.enqueue = function (chunk) {
1078 if (!IsReadableByteStreamController(this)) {
1079 throw byteStreamControllerBrandCheckException('enqueue');
1080 }
1081 assertRequiredArgument(chunk, 1, 'enqueue');
1082 if (!ArrayBuffer.isView(chunk)) {
1083 throw new TypeError('chunk must be an array buffer view');
1084 }
1085 if (chunk.byteLength === 0) {
1086 throw new TypeError('chunk must have non-zero byteLength');
1087 }
1088 if (chunk.buffer.byteLength === 0) {
1089 throw new TypeError("chunk's buffer must have non-zero byteLength");
1090 }
1091 if (this._closeRequested) {
1092 throw new TypeError('stream is closed or draining');
1093 }
1094 var state = this._controlledReadableByteStream._state;
1095 if (state !== 'readable') {
1096 throw new TypeError("The stream (in ".concat(state, " state) is not in the readable state and cannot be enqueued to"));
1097 }
1098 ReadableByteStreamControllerEnqueue(this, chunk);
1099 };
1100 /**
1101 * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`.
1102 */
1103 ReadableByteStreamController.prototype.error = function (e) {
1104 if (e === void 0) { e = undefined; }
1105 if (!IsReadableByteStreamController(this)) {
1106 throw byteStreamControllerBrandCheckException('error');
1107 }
1108 ReadableByteStreamControllerError(this, e);
1109 };
1110 /** @internal */
1111 ReadableByteStreamController.prototype[CancelSteps] = function (reason) {
1112 ReadableByteStreamControllerClearPendingPullIntos(this);
1113 ResetQueue(this);
1114 var result = this._cancelAlgorithm(reason);
1115 ReadableByteStreamControllerClearAlgorithms(this);
1116 return result;
1117 };
1118 /** @internal */
1119 ReadableByteStreamController.prototype[PullSteps] = function (readRequest) {
1120 var stream = this._controlledReadableByteStream;
1121 if (this._queueTotalSize > 0) {
1122 ReadableByteStreamControllerFillReadRequestFromQueue(this, readRequest);
1123 return;
1124 }
1125 var autoAllocateChunkSize = this._autoAllocateChunkSize;
1126 if (autoAllocateChunkSize !== undefined) {
1127 var buffer = void 0;
1128 try {
1129 buffer = new ArrayBuffer(autoAllocateChunkSize);
1130 }
1131 catch (bufferE) {
1132 readRequest._errorSteps(bufferE);
1133 return;
1134 }
1135 var pullIntoDescriptor = {
1136 buffer: buffer,
1137 bufferByteLength: autoAllocateChunkSize,
1138 byteOffset: 0,
1139 byteLength: autoAllocateChunkSize,
1140 bytesFilled: 0,
1141 minimumFill: 1,
1142 elementSize: 1,
1143 viewConstructor: Uint8Array,
1144 readerType: 'default'
1145 };
1146 this._pendingPullIntos.push(pullIntoDescriptor);
1147 }
1148 ReadableStreamAddReadRequest(stream, readRequest);
1149 ReadableByteStreamControllerCallPullIfNeeded(this);
1150 };
1151 /** @internal */
1152 ReadableByteStreamController.prototype[ReleaseSteps] = function () {
1153 if (this._pendingPullIntos.length > 0) {
1154 var firstPullInto = this._pendingPullIntos.peek();
1155 firstPullInto.readerType = 'none';
1156 this._pendingPullIntos = new SimpleQueue();
1157 this._pendingPullIntos.push(firstPullInto);
1158 }
1159 };
1160 return ReadableByteStreamController;
1161 }());
1162 Object.defineProperties(ReadableByteStreamController.prototype, {
1163 close: { enumerable: true },
1164 enqueue: { enumerable: true },
1165 error: { enumerable: true },
1166 byobRequest: { enumerable: true },
1167 desiredSize: { enumerable: true }
1168 });
1169 setFunctionName(ReadableByteStreamController.prototype.close, 'close');
1170 setFunctionName(ReadableByteStreamController.prototype.enqueue, 'enqueue');
1171 setFunctionName(ReadableByteStreamController.prototype.error, 'error');
1172 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
1173 Object.defineProperty(ReadableByteStreamController.prototype, SymbolPolyfill.toStringTag, {
1174 value: 'ReadableByteStreamController',
1175 configurable: true
1176 });
1177 }
1178 // Abstract operations for the ReadableByteStreamController.
1179 function IsReadableByteStreamController(x) {
1180 if (!typeIsObject(x)) {
1181 return false;
1182 }
1183 if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableByteStream')) {
1184 return false;
1185 }
1186 return x instanceof ReadableByteStreamController;
1187 }
1188 function IsReadableStreamBYOBRequest(x) {
1189 if (!typeIsObject(x)) {
1190 return false;
1191 }
1192 if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {
1193 return false;
1194 }
1195 return x instanceof ReadableStreamBYOBRequest;
1196 }
1197 function ReadableByteStreamControllerCallPullIfNeeded(controller) {
1198 var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);
1199 if (!shouldPull) {
1200 return;
1201 }
1202 if (controller._pulling) {
1203 controller._pullAgain = true;
1204 return;
1205 }
1206 controller._pulling = true;
1207 // TODO: Test controller argument
1208 var pullPromise = controller._pullAlgorithm();
1209 uponPromise(pullPromise, function () {
1210 controller._pulling = false;
1211 if (controller._pullAgain) {
1212 controller._pullAgain = false;
1213 ReadableByteStreamControllerCallPullIfNeeded(controller);
1214 }
1215 return null;
1216 }, function (e) {
1217 ReadableByteStreamControllerError(controller, e);
1218 return null;
1219 });
1220 }
1221 function ReadableByteStreamControllerClearPendingPullIntos(controller) {
1222 ReadableByteStreamControllerInvalidateBYOBRequest(controller);
1223 controller._pendingPullIntos = new SimpleQueue();
1224 }
1225 function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {
1226 var done = false;
1227 if (stream._state === 'closed') {
1228 done = true;
1229 }
1230 var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
1231 if (pullIntoDescriptor.readerType === 'default') {
1232 ReadableStreamFulfillReadRequest(stream, filledView, done);
1233 }
1234 else {
1235 ReadableStreamFulfillReadIntoRequest(stream, filledView, done);
1236 }
1237 }
1238 function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {
1239 var bytesFilled = pullIntoDescriptor.bytesFilled;
1240 var elementSize = pullIntoDescriptor.elementSize;
1241 return new pullIntoDescriptor.viewConstructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);
1242 }
1243 function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {
1244 controller._queue.push({ buffer: buffer, byteOffset: byteOffset, byteLength: byteLength });
1245 controller._queueTotalSize += byteLength;
1246 }
1247 function ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, buffer, byteOffset, byteLength) {
1248 var clonedChunk;
1249 try {
1250 clonedChunk = ArrayBufferSlice(buffer, byteOffset, byteOffset + byteLength);
1251 }
1252 catch (cloneE) {
1253 ReadableByteStreamControllerError(controller, cloneE);
1254 throw cloneE;
1255 }
1256 ReadableByteStreamControllerEnqueueChunkToQueue(controller, clonedChunk, 0, byteLength);
1257 }
1258 function ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstDescriptor) {
1259 if (firstDescriptor.bytesFilled > 0) {
1260 ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, firstDescriptor.buffer, firstDescriptor.byteOffset, firstDescriptor.bytesFilled);
1261 }
1262 ReadableByteStreamControllerShiftPendingPullInto(controller);
1263 }
1264 function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {
1265 var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);
1266 var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;
1267 var totalBytesToCopyRemaining = maxBytesToCopy;
1268 var ready = false;
1269 var remainderBytes = maxBytesFilled % pullIntoDescriptor.elementSize;
1270 var maxAlignedBytes = maxBytesFilled - remainderBytes;
1271 // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head
1272 // of the queue, so the underlying source can keep filling it.
1273 if (maxAlignedBytes >= pullIntoDescriptor.minimumFill) {
1274 totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;
1275 ready = true;
1276 }
1277 var queue = controller._queue;
1278 while (totalBytesToCopyRemaining > 0) {
1279 var headOfQueue = queue.peek();
1280 var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);
1281 var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
1282 CopyDataBlockBytes(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);
1283 if (headOfQueue.byteLength === bytesToCopy) {
1284 queue.shift();
1285 }
1286 else {
1287 headOfQueue.byteOffset += bytesToCopy;
1288 headOfQueue.byteLength -= bytesToCopy;
1289 }
1290 controller._queueTotalSize -= bytesToCopy;
1291 ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);
1292 totalBytesToCopyRemaining -= bytesToCopy;
1293 }
1294 return ready;
1295 }
1296 function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {
1297 pullIntoDescriptor.bytesFilled += size;
1298 }
1299 function ReadableByteStreamControllerHandleQueueDrain(controller) {
1300 if (controller._queueTotalSize === 0 && controller._closeRequested) {
1301 ReadableByteStreamControllerClearAlgorithms(controller);
1302 ReadableStreamClose(controller._controlledReadableByteStream);
1303 }
1304 else {
1305 ReadableByteStreamControllerCallPullIfNeeded(controller);
1306 }
1307 }
1308 function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {
1309 if (controller._byobRequest === null) {
1310 return;
1311 }
1312 controller._byobRequest._associatedReadableByteStreamController = undefined;
1313 controller._byobRequest._view = null;
1314 controller._byobRequest = null;
1315 }
1316 function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {
1317 while (controller._pendingPullIntos.length > 0) {
1318 if (controller._queueTotalSize === 0) {
1319 return;
1320 }
1321 var pullIntoDescriptor = controller._pendingPullIntos.peek();
1322 if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) {
1323 ReadableByteStreamControllerShiftPendingPullInto(controller);
1324 ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor);
1325 }
1326 }
1327 }
1328 function ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller) {
1329 var reader = controller._controlledReadableByteStream._reader;
1330 while (reader._readRequests.length > 0) {
1331 if (controller._queueTotalSize === 0) {
1332 return;
1333 }
1334 var readRequest = reader._readRequests.shift();
1335 ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest);
1336 }
1337 }
1338 function ReadableByteStreamControllerPullInto(controller, view, min, readIntoRequest) {
1339 var stream = controller._controlledReadableByteStream;
1340 var ctor = view.constructor;
1341 var elementSize = arrayBufferViewElementSize(ctor);
1342 var byteOffset = view.byteOffset, byteLength = view.byteLength;
1343 var minimumFill = min * elementSize;
1344 var buffer;
1345 try {
1346 buffer = TransferArrayBuffer(view.buffer);
1347 }
1348 catch (e) {
1349 readIntoRequest._errorSteps(e);
1350 return;
1351 }
1352 var pullIntoDescriptor = {
1353 buffer: buffer,
1354 bufferByteLength: buffer.byteLength,
1355 byteOffset: byteOffset,
1356 byteLength: byteLength,
1357 bytesFilled: 0,
1358 minimumFill: minimumFill,
1359 elementSize: elementSize,
1360 viewConstructor: ctor,
1361 readerType: 'byob'
1362 };
1363 if (controller._pendingPullIntos.length > 0) {
1364 controller._pendingPullIntos.push(pullIntoDescriptor);
1365 // No ReadableByteStreamControllerCallPullIfNeeded() call since:
1366 // - No change happens on desiredSize
1367 // - The source has already been notified of that there's at least 1 pending read(view)
1368 ReadableStreamAddReadIntoRequest(stream, readIntoRequest);
1369 return;
1370 }
1371 if (stream._state === 'closed') {
1372 var emptyView = new ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);
1373 readIntoRequest._closeSteps(emptyView);
1374 return;
1375 }
1376 if (controller._queueTotalSize > 0) {
1377 if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) {
1378 var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
1379 ReadableByteStreamControllerHandleQueueDrain(controller);
1380 readIntoRequest._chunkSteps(filledView);
1381 return;
1382 }
1383 if (controller._closeRequested) {
1384 var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
1385 ReadableByteStreamControllerError(controller, e);
1386 readIntoRequest._errorSteps(e);
1387 return;
1388 }
1389 }
1390 controller._pendingPullIntos.push(pullIntoDescriptor);
1391 ReadableStreamAddReadIntoRequest(stream, readIntoRequest);
1392 ReadableByteStreamControllerCallPullIfNeeded(controller);
1393 }
1394 function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {
1395 if (firstDescriptor.readerType === 'none') {
1396 ReadableByteStreamControllerShiftPendingPullInto(controller);
1397 }
1398 var stream = controller._controlledReadableByteStream;
1399 if (ReadableStreamHasBYOBReader(stream)) {
1400 while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {
1401 var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);
1402 ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);
1403 }
1404 }
1405 }
1406 function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {
1407 ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);
1408 if (pullIntoDescriptor.readerType === 'none') {
1409 ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, pullIntoDescriptor);
1410 ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
1411 return;
1412 }
1413 if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.minimumFill) {
1414 // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head
1415 // of the queue, so the underlying source can keep filling it.
1416 return;
1417 }
1418 ReadableByteStreamControllerShiftPendingPullInto(controller);
1419 var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;
1420 if (remainderSize > 0) {
1421 var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
1422 ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, pullIntoDescriptor.buffer, end - remainderSize, remainderSize);
1423 }
1424 pullIntoDescriptor.bytesFilled -= remainderSize;
1425 ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor);
1426 ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
1427 }
1428 function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {
1429 var firstDescriptor = controller._pendingPullIntos.peek();
1430 ReadableByteStreamControllerInvalidateBYOBRequest(controller);
1431 var state = controller._controlledReadableByteStream._state;
1432 if (state === 'closed') {
1433 ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);
1434 }
1435 else {
1436 ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);
1437 }
1438 ReadableByteStreamControllerCallPullIfNeeded(controller);
1439 }
1440 function ReadableByteStreamControllerShiftPendingPullInto(controller) {
1441 var descriptor = controller._pendingPullIntos.shift();
1442 return descriptor;
1443 }
1444 function ReadableByteStreamControllerShouldCallPull(controller) {
1445 var stream = controller._controlledReadableByteStream;
1446 if (stream._state !== 'readable') {
1447 return false;
1448 }
1449 if (controller._closeRequested) {
1450 return false;
1451 }
1452 if (!controller._started) {
1453 return false;
1454 }
1455 if (ReadableStreamHasDefaultReader(stream) && ReadableStreamGetNumReadRequests(stream) > 0) {
1456 return true;
1457 }
1458 if (ReadableStreamHasBYOBReader(stream) && ReadableStreamGetNumReadIntoRequests(stream) > 0) {
1459 return true;
1460 }
1461 var desiredSize = ReadableByteStreamControllerGetDesiredSize(controller);
1462 if (desiredSize > 0) {
1463 return true;
1464 }
1465 return false;
1466 }
1467 function ReadableByteStreamControllerClearAlgorithms(controller) {
1468 controller._pullAlgorithm = undefined;
1469 controller._cancelAlgorithm = undefined;
1470 }
1471 // A client of ReadableByteStreamController may use these functions directly to bypass state check.
1472 function ReadableByteStreamControllerClose(controller) {
1473 var stream = controller._controlledReadableByteStream;
1474 if (controller._closeRequested || stream._state !== 'readable') {
1475 return;
1476 }
1477 if (controller._queueTotalSize > 0) {
1478 controller._closeRequested = true;
1479 return;
1480 }
1481 if (controller._pendingPullIntos.length > 0) {
1482 var firstPendingPullInto = controller._pendingPullIntos.peek();
1483 if (firstPendingPullInto.bytesFilled % firstPendingPullInto.elementSize !== 0) {
1484 var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
1485 ReadableByteStreamControllerError(controller, e);
1486 throw e;
1487 }
1488 }
1489 ReadableByteStreamControllerClearAlgorithms(controller);
1490 ReadableStreamClose(stream);
1491 }
1492 function ReadableByteStreamControllerEnqueue(controller, chunk) {
1493 var stream = controller._controlledReadableByteStream;
1494 if (controller._closeRequested || stream._state !== 'readable') {
1495 return;
1496 }
1497 var buffer = chunk.buffer, byteOffset = chunk.byteOffset, byteLength = chunk.byteLength;
1498 if (IsDetachedBuffer(buffer)) {
1499 throw new TypeError('chunk\'s buffer is detached and so cannot be enqueued');
1500 }
1501 var transferredBuffer = TransferArrayBuffer(buffer);
1502 if (controller._pendingPullIntos.length > 0) {
1503 var firstPendingPullInto = controller._pendingPullIntos.peek();
1504 if (IsDetachedBuffer(firstPendingPullInto.buffer)) {
1505 throw new TypeError('The BYOB request\'s buffer has been detached and so cannot be filled with an enqueued chunk');
1506 }
1507 ReadableByteStreamControllerInvalidateBYOBRequest(controller);
1508 firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer);
1509 if (firstPendingPullInto.readerType === 'none') {
1510 ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstPendingPullInto);
1511 }
1512 }
1513 if (ReadableStreamHasDefaultReader(stream)) {
1514 ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller);
1515 if (ReadableStreamGetNumReadRequests(stream) === 0) {
1516 ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
1517 }
1518 else {
1519 if (controller._pendingPullIntos.length > 0) {
1520 ReadableByteStreamControllerShiftPendingPullInto(controller);
1521 }
1522 var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);
1523 ReadableStreamFulfillReadRequest(stream, transferredView, false);
1524 }
1525 }
1526 else if (ReadableStreamHasBYOBReader(stream)) {
1527 // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully.
1528 ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
1529 ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
1530 }
1531 else {
1532 ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
1533 }
1534 ReadableByteStreamControllerCallPullIfNeeded(controller);
1535 }
1536 function ReadableByteStreamControllerError(controller, e) {
1537 var stream = controller._controlledReadableByteStream;
1538 if (stream._state !== 'readable') {
1539 return;
1540 }
1541 ReadableByteStreamControllerClearPendingPullIntos(controller);
1542 ResetQueue(controller);
1543 ReadableByteStreamControllerClearAlgorithms(controller);
1544 ReadableStreamError(stream, e);
1545 }
1546 function ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest) {
1547 var entry = controller._queue.shift();
1548 controller._queueTotalSize -= entry.byteLength;
1549 ReadableByteStreamControllerHandleQueueDrain(controller);
1550 var view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);
1551 readRequest._chunkSteps(view);
1552 }
1553 function ReadableByteStreamControllerGetBYOBRequest(controller) {
1554 if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) {
1555 var firstDescriptor = controller._pendingPullIntos.peek();
1556 var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);
1557 var byobRequest = Object.create(ReadableStreamBYOBRequest.prototype);
1558 SetUpReadableStreamBYOBRequest(byobRequest, controller, view);
1559 controller._byobRequest = byobRequest;
1560 }
1561 return controller._byobRequest;
1562 }
1563 function ReadableByteStreamControllerGetDesiredSize(controller) {
1564 var state = controller._controlledReadableByteStream._state;
1565 if (state === 'errored') {
1566 return null;
1567 }
1568 if (state === 'closed') {
1569 return 0;
1570 }
1571 return controller._strategyHWM - controller._queueTotalSize;
1572 }
1573 function ReadableByteStreamControllerRespond(controller, bytesWritten) {
1574 var firstDescriptor = controller._pendingPullIntos.peek();
1575 var state = controller._controlledReadableByteStream._state;
1576 if (state === 'closed') {
1577 if (bytesWritten !== 0) {
1578 throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');
1579 }
1580 }
1581 else {
1582 if (bytesWritten === 0) {
1583 throw new TypeError('bytesWritten must be greater than 0 when calling respond() on a readable stream');
1584 }
1585 if (firstDescriptor.bytesFilled + bytesWritten > firstDescriptor.byteLength) {
1586 throw new RangeError('bytesWritten out of range');
1587 }
1588 }
1589 firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);
1590 ReadableByteStreamControllerRespondInternal(controller, bytesWritten);
1591 }
1592 function ReadableByteStreamControllerRespondWithNewView(controller, view) {
1593 var firstDescriptor = controller._pendingPullIntos.peek();
1594 var state = controller._controlledReadableByteStream._state;
1595 if (state === 'closed') {
1596 if (view.byteLength !== 0) {
1597 throw new TypeError('The view\'s length must be 0 when calling respondWithNewView() on a closed stream');
1598 }
1599 }
1600 else {
1601 if (view.byteLength === 0) {
1602 throw new TypeError('The view\'s length must be greater than 0 when calling respondWithNewView() on a readable stream');
1603 }
1604 }
1605 if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {
1606 throw new RangeError('The region specified by view does not match byobRequest');
1607 }
1608 if (firstDescriptor.bufferByteLength !== view.buffer.byteLength) {
1609 throw new RangeError('The buffer of view has different capacity than byobRequest');
1610 }
1611 if (firstDescriptor.bytesFilled + view.byteLength > firstDescriptor.byteLength) {
1612 throw new RangeError('The region specified by view is larger than byobRequest');
1613 }
1614 var viewByteLength = view.byteLength;
1615 firstDescriptor.buffer = TransferArrayBuffer(view.buffer);
1616 ReadableByteStreamControllerRespondInternal(controller, viewByteLength);
1617 }
1618 function SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize) {
1619 controller._controlledReadableByteStream = stream;
1620 controller._pullAgain = false;
1621 controller._pulling = false;
1622 controller._byobRequest = null;
1623 // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
1624 controller._queue = controller._queueTotalSize = undefined;
1625 ResetQueue(controller);
1626 controller._closeRequested = false;
1627 controller._started = false;
1628 controller._strategyHWM = highWaterMark;
1629 controller._pullAlgorithm = pullAlgorithm;
1630 controller._cancelAlgorithm = cancelAlgorithm;
1631 controller._autoAllocateChunkSize = autoAllocateChunkSize;
1632 controller._pendingPullIntos = new SimpleQueue();
1633 stream._readableStreamController = controller;
1634 var startResult = startAlgorithm();
1635 uponPromise(promiseResolvedWith(startResult), function () {
1636 controller._started = true;
1637 ReadableByteStreamControllerCallPullIfNeeded(controller);
1638 return null;
1639 }, function (r) {
1640 ReadableByteStreamControllerError(controller, r);
1641 return null;
1642 });
1643 }
1644 function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) {
1645 var controller = Object.create(ReadableByteStreamController.prototype);
1646 var startAlgorithm;
1647 var pullAlgorithm;
1648 var cancelAlgorithm;
1649 if (underlyingByteSource.start !== undefined) {
1650 startAlgorithm = function () { return underlyingByteSource.start(controller); };
1651 }
1652 else {
1653 startAlgorithm = function () { return undefined; };
1654 }
1655 if (underlyingByteSource.pull !== undefined) {
1656 pullAlgorithm = function () { return underlyingByteSource.pull(controller); };
1657 }
1658 else {
1659 pullAlgorithm = function () { return promiseResolvedWith(undefined); };
1660 }
1661 if (underlyingByteSource.cancel !== undefined) {
1662 cancelAlgorithm = function (reason) { return underlyingByteSource.cancel(reason); };
1663 }
1664 else {
1665 cancelAlgorithm = function () { return promiseResolvedWith(undefined); };
1666 }
1667 var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;
1668 if (autoAllocateChunkSize === 0) {
1669 throw new TypeError('autoAllocateChunkSize must be greater than 0');
1670 }
1671 SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize);
1672 }
1673 function SetUpReadableStreamBYOBRequest(request, controller, view) {
1674 request._associatedReadableByteStreamController = controller;
1675 request._view = view;
1676 }
1677 // Helper functions for the ReadableStreamBYOBRequest.
1678 function byobRequestBrandCheckException(name) {
1679 return new TypeError("ReadableStreamBYOBRequest.prototype.".concat(name, " can only be used on a ReadableStreamBYOBRequest"));
1680 }
1681 // Helper functions for the ReadableByteStreamController.
1682 function byteStreamControllerBrandCheckException(name) {
1683 return new TypeError("ReadableByteStreamController.prototype.".concat(name, " can only be used on a ReadableByteStreamController"));
1684 }
1685
1686 function convertReaderOptions(options, context) {
1687 assertDictionary(options, context);
1688 var mode = options === null || options === void 0 ? void 0 : options.mode;
1689 return {
1690 mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, "".concat(context, " has member 'mode' that"))
1691 };
1692 }
1693 function convertReadableStreamReaderMode(mode, context) {
1694 mode = "".concat(mode);
1695 if (mode !== 'byob') {
1696 throw new TypeError("".concat(context, " '").concat(mode, "' is not a valid enumeration value for ReadableStreamReaderMode"));
1697 }
1698 return mode;
1699 }
1700 function convertByobReadOptions(options, context) {
1701 var _a;
1702 assertDictionary(options, context);
1703 var min = (_a = options === null || options === void 0 ? void 0 : options.min) !== null && _a !== void 0 ? _a : 1;
1704 return {
1705 min: convertUnsignedLongLongWithEnforceRange(min, "".concat(context, " has member 'min' that"))
1706 };
1707 }
1708
1709 // Abstract operations for the ReadableStream.
1710 function AcquireReadableStreamBYOBReader(stream) {
1711 return new ReadableStreamBYOBReader(stream);
1712 }
1713 // ReadableStream API exposed for controllers.
1714 function ReadableStreamAddReadIntoRequest(stream, readIntoRequest) {
1715 stream._reader._readIntoRequests.push(readIntoRequest);
1716 }
1717 function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {
1718 var reader = stream._reader;
1719 var readIntoRequest = reader._readIntoRequests.shift();
1720 if (done) {
1721 readIntoRequest._closeSteps(chunk);
1722 }
1723 else {
1724 readIntoRequest._chunkSteps(chunk);
1725 }
1726 }
1727 function ReadableStreamGetNumReadIntoRequests(stream) {
1728 return stream._reader._readIntoRequests.length;
1729 }
1730 function ReadableStreamHasBYOBReader(stream) {
1731 var reader = stream._reader;
1732 if (reader === undefined) {
1733 return false;
1734 }
1735 if (!IsReadableStreamBYOBReader(reader)) {
1736 return false;
1737 }
1738 return true;
1739 }
1740 /**
1741 * A BYOB reader vended by a {@link ReadableStream}.
1742 *
1743 * @public
1744 */
1745 var ReadableStreamBYOBReader = /** @class */ (function () {
1746 function ReadableStreamBYOBReader(stream) {
1747 assertRequiredArgument(stream, 1, 'ReadableStreamBYOBReader');
1748 assertReadableStream(stream, 'First parameter');
1749 if (IsReadableStreamLocked(stream)) {
1750 throw new TypeError('This stream has already been locked for exclusive reading by another reader');
1751 }
1752 if (!IsReadableByteStreamController(stream._readableStreamController)) {
1753 throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' +
1754 'source');
1755 }
1756 ReadableStreamReaderGenericInitialize(this, stream);
1757 this._readIntoRequests = new SimpleQueue();
1758 }
1759 Object.defineProperty(ReadableStreamBYOBReader.prototype, "closed", {
1760 /**
1761 * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or
1762 * the reader's lock is released before the stream finishes closing.
1763 */
1764 get: function () {
1765 if (!IsReadableStreamBYOBReader(this)) {
1766 return promiseRejectedWith(byobReaderBrandCheckException('closed'));
1767 }
1768 return this._closedPromise;
1769 },
1770 enumerable: false,
1771 configurable: true
1772 });
1773 /**
1774 * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}.
1775 */
1776 ReadableStreamBYOBReader.prototype.cancel = function (reason) {
1777 if (reason === void 0) { reason = undefined; }
1778 if (!IsReadableStreamBYOBReader(this)) {
1779 return promiseRejectedWith(byobReaderBrandCheckException('cancel'));
1780 }
1781 if (this._ownerReadableStream === undefined) {
1782 return promiseRejectedWith(readerLockException('cancel'));
1783 }
1784 return ReadableStreamReaderGenericCancel(this, reason);
1785 };
1786 ReadableStreamBYOBReader.prototype.read = function (view, rawOptions) {
1787 if (rawOptions === void 0) { rawOptions = {}; }
1788 if (!IsReadableStreamBYOBReader(this)) {
1789 return promiseRejectedWith(byobReaderBrandCheckException('read'));
1790 }
1791 if (!ArrayBuffer.isView(view)) {
1792 return promiseRejectedWith(new TypeError('view must be an array buffer view'));
1793 }
1794 if (view.byteLength === 0) {
1795 return promiseRejectedWith(new TypeError('view must have non-zero byteLength'));
1796 }
1797 if (view.buffer.byteLength === 0) {
1798 return promiseRejectedWith(new TypeError("view's buffer must have non-zero byteLength"));
1799 }
1800 if (IsDetachedBuffer(view.buffer)) {
1801 return promiseRejectedWith(new TypeError('view\'s buffer has been detached'));
1802 }
1803 var options;
1804 try {
1805 options = convertByobReadOptions(rawOptions, 'options');
1806 }
1807 catch (e) {
1808 return promiseRejectedWith(e);
1809 }
1810 var min = options.min;
1811 if (min === 0) {
1812 return promiseRejectedWith(new TypeError('options.min must be greater than 0'));
1813 }
1814 if (!isDataView(view)) {
1815 if (min > view.length) {
1816 return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s length'));
1817 }
1818 }
1819 else if (min > view.byteLength) {
1820 return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s byteLength'));
1821 }
1822 if (this._ownerReadableStream === undefined) {
1823 return promiseRejectedWith(readerLockException('read from'));
1824 }
1825 var resolvePromise;
1826 var rejectPromise;
1827 var promise = newPromise(function (resolve, reject) {
1828 resolvePromise = resolve;
1829 rejectPromise = reject;
1830 });
1831 var readIntoRequest = {
1832 _chunkSteps: function (chunk) { return resolvePromise({ value: chunk, done: false }); },
1833 _closeSteps: function (chunk) { return resolvePromise({ value: chunk, done: true }); },
1834 _errorSteps: function (e) { return rejectPromise(e); }
1835 };
1836 ReadableStreamBYOBReaderRead(this, view, min, readIntoRequest);
1837 return promise;
1838 };
1839 /**
1840 * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active.
1841 * If the associated stream is errored when the lock is released, the reader will appear errored in the same way
1842 * from now on; otherwise, the reader will appear closed.
1843 *
1844 * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by
1845 * the reader's {@link ReadableStreamBYOBReader.read | read()} method has not yet been settled. Attempting to
1846 * do so will throw a `TypeError` and leave the reader locked to the stream.
1847 */
1848 ReadableStreamBYOBReader.prototype.releaseLock = function () {
1849 if (!IsReadableStreamBYOBReader(this)) {
1850 throw byobReaderBrandCheckException('releaseLock');
1851 }
1852 if (this._ownerReadableStream === undefined) {
1853 return;
1854 }
1855 ReadableStreamBYOBReaderRelease(this);
1856 };
1857 return ReadableStreamBYOBReader;
1858 }());
1859 Object.defineProperties(ReadableStreamBYOBReader.prototype, {
1860 cancel: { enumerable: true },
1861 read: { enumerable: true },
1862 releaseLock: { enumerable: true },
1863 closed: { enumerable: true }
1864 });
1865 setFunctionName(ReadableStreamBYOBReader.prototype.cancel, 'cancel');
1866 setFunctionName(ReadableStreamBYOBReader.prototype.read, 'read');
1867 setFunctionName(ReadableStreamBYOBReader.prototype.releaseLock, 'releaseLock');
1868 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
1869 Object.defineProperty(ReadableStreamBYOBReader.prototype, SymbolPolyfill.toStringTag, {
1870 value: 'ReadableStreamBYOBReader',
1871 configurable: true
1872 });
1873 }
1874 // Abstract operations for the readers.
1875 function IsReadableStreamBYOBReader(x) {
1876 if (!typeIsObject(x)) {
1877 return false;
1878 }
1879 if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {
1880 return false;
1881 }
1882 return x instanceof ReadableStreamBYOBReader;
1883 }
1884 function ReadableStreamBYOBReaderRead(reader, view, min, readIntoRequest) {
1885 var stream = reader._ownerReadableStream;
1886 stream._disturbed = true;
1887 if (stream._state === 'errored') {
1888 readIntoRequest._errorSteps(stream._storedError);
1889 }
1890 else {
1891 ReadableByteStreamControllerPullInto(stream._readableStreamController, view, min, readIntoRequest);
1892 }
1893 }
1894 function ReadableStreamBYOBReaderRelease(reader) {
1895 ReadableStreamReaderGenericRelease(reader);
1896 var e = new TypeError('Reader was released');
1897 ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e);
1898 }
1899 function ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e) {
1900 var readIntoRequests = reader._readIntoRequests;
1901 reader._readIntoRequests = new SimpleQueue();
1902 readIntoRequests.forEach(function (readIntoRequest) {
1903 readIntoRequest._errorSteps(e);
1904 });
1905 }
1906 // Helper functions for the ReadableStreamBYOBReader.
1907 function byobReaderBrandCheckException(name) {
1908 return new TypeError("ReadableStreamBYOBReader.prototype.".concat(name, " can only be used on a ReadableStreamBYOBReader"));
1909 }
1910
1911 function ExtractHighWaterMark(strategy, defaultHWM) {
1912 var highWaterMark = strategy.highWaterMark;
1913 if (highWaterMark === undefined) {
1914 return defaultHWM;
1915 }
1916 if (NumberIsNaN(highWaterMark) || highWaterMark < 0) {
1917 throw new RangeError('Invalid highWaterMark');
1918 }
1919 return highWaterMark;
1920 }
1921 function ExtractSizeAlgorithm(strategy) {
1922 var size = strategy.size;
1923 if (!size) {
1924 return function () { return 1; };
1925 }
1926 return size;
1927 }
1928
1929 function convertQueuingStrategy(init, context) {
1930 assertDictionary(init, context);
1931 var highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark;
1932 var size = init === null || init === void 0 ? void 0 : init.size;
1933 return {
1934 highWaterMark: highWaterMark === undefined ? undefined : convertUnrestrictedDouble(highWaterMark),
1935 size: size === undefined ? undefined : convertQueuingStrategySize(size, "".concat(context, " has member 'size' that"))
1936 };
1937 }
1938 function convertQueuingStrategySize(fn, context) {
1939 assertFunction(fn, context);
1940 return function (chunk) { return convertUnrestrictedDouble(fn(chunk)); };
1941 }
1942
1943 function convertUnderlyingSink(original, context) {
1944 assertDictionary(original, context);
1945 var abort = original === null || original === void 0 ? void 0 : original.abort;
1946 var close = original === null || original === void 0 ? void 0 : original.close;
1947 var start = original === null || original === void 0 ? void 0 : original.start;
1948 var type = original === null || original === void 0 ? void 0 : original.type;
1949 var write = original === null || original === void 0 ? void 0 : original.write;
1950 return {
1951 abort: abort === undefined ?
1952 undefined :
1953 convertUnderlyingSinkAbortCallback(abort, original, "".concat(context, " has member 'abort' that")),
1954 close: close === undefined ?
1955 undefined :
1956 convertUnderlyingSinkCloseCallback(close, original, "".concat(context, " has member 'close' that")),
1957 start: start === undefined ?
1958 undefined :
1959 convertUnderlyingSinkStartCallback(start, original, "".concat(context, " has member 'start' that")),
1960 write: write === undefined ?
1961 undefined :
1962 convertUnderlyingSinkWriteCallback(write, original, "".concat(context, " has member 'write' that")),
1963 type: type
1964 };
1965 }
1966 function convertUnderlyingSinkAbortCallback(fn, original, context) {
1967 assertFunction(fn, context);
1968 return function (reason) { return promiseCall(fn, original, [reason]); };
1969 }
1970 function convertUnderlyingSinkCloseCallback(fn, original, context) {
1971 assertFunction(fn, context);
1972 return function () { return promiseCall(fn, original, []); };
1973 }
1974 function convertUnderlyingSinkStartCallback(fn, original, context) {
1975 assertFunction(fn, context);
1976 return function (controller) { return reflectCall(fn, original, [controller]); };
1977 }
1978 function convertUnderlyingSinkWriteCallback(fn, original, context) {
1979 assertFunction(fn, context);
1980 return function (chunk, controller) { return promiseCall(fn, original, [chunk, controller]); };
1981 }
1982
1983 function assertWritableStream(x, context) {
1984 if (!IsWritableStream(x)) {
1985 throw new TypeError("".concat(context, " is not a WritableStream."));
1986 }
1987 }
1988
1989 function isAbortSignal(value) {
1990 if (typeof value !== 'object' || value === null) {
1991 return false;
1992 }
1993 try {
1994 return typeof value.aborted === 'boolean';
1995 }
1996 catch (_a) {
1997 // AbortSignal.prototype.aborted throws if its brand check fails
1998 return false;
1999 }
2000 }
2001 var supportsAbortController = typeof AbortController === 'function';
2002 /**
2003 * Construct a new AbortController, if supported by the platform.
2004 *
2005 * @internal
2006 */
2007 function createAbortController() {
2008 if (supportsAbortController) {
2009 return new AbortController();
2010 }
2011 return undefined;
2012 }
2013
2014 /**
2015 * A writable stream represents a destination for data, into which you can write.
2016 *
2017 * @public
2018 */
2019 var WritableStream = /** @class */ (function () {
2020 function WritableStream(rawUnderlyingSink, rawStrategy) {
2021 if (rawUnderlyingSink === void 0) { rawUnderlyingSink = {}; }
2022 if (rawStrategy === void 0) { rawStrategy = {}; }
2023 if (rawUnderlyingSink === undefined) {
2024 rawUnderlyingSink = null;
2025 }
2026 else {
2027 assertObject(rawUnderlyingSink, 'First parameter');
2028 }
2029 var strategy = convertQueuingStrategy(rawStrategy, 'Second parameter');
2030 var underlyingSink = convertUnderlyingSink(rawUnderlyingSink, 'First parameter');
2031 InitializeWritableStream(this);
2032 var type = underlyingSink.type;
2033 if (type !== undefined) {
2034 throw new RangeError('Invalid type is specified');
2035 }
2036 var sizeAlgorithm = ExtractSizeAlgorithm(strategy);
2037 var highWaterMark = ExtractHighWaterMark(strategy, 1);
2038 SetUpWritableStreamDefaultControllerFromUnderlyingSink(this, underlyingSink, highWaterMark, sizeAlgorithm);
2039 }
2040 Object.defineProperty(WritableStream.prototype, "locked", {
2041 /**
2042 * Returns whether or not the writable stream is locked to a writer.
2043 */
2044 get: function () {
2045 if (!IsWritableStream(this)) {
2046 throw streamBrandCheckException$2('locked');
2047 }
2048 return IsWritableStreamLocked(this);
2049 },
2050 enumerable: false,
2051 configurable: true
2052 });
2053 /**
2054 * Aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be
2055 * immediately moved to an errored state, with any queued-up writes discarded. This will also execute any abort
2056 * mechanism of the underlying sink.
2057 *
2058 * The returned promise will fulfill if the stream shuts down successfully, or reject if the underlying sink signaled
2059 * that there was an error doing so. Additionally, it will reject with a `TypeError` (without attempting to cancel
2060 * the stream) if the stream is currently locked.
2061 */
2062 WritableStream.prototype.abort = function (reason) {
2063 if (reason === void 0) { reason = undefined; }
2064 if (!IsWritableStream(this)) {
2065 return promiseRejectedWith(streamBrandCheckException$2('abort'));
2066 }
2067 if (IsWritableStreamLocked(this)) {
2068 return promiseRejectedWith(new TypeError('Cannot abort a stream that already has a writer'));
2069 }
2070 return WritableStreamAbort(this, reason);
2071 };
2072 /**
2073 * Closes the stream. The underlying sink will finish processing any previously-written chunks, before invoking its
2074 * close behavior. During this time any further attempts to write will fail (without erroring the stream).
2075 *
2076 * The method returns a promise that will fulfill if all remaining chunks are successfully written and the stream
2077 * successfully closes, or rejects if an error is encountered during this process. Additionally, it will reject with
2078 * a `TypeError` (without attempting to cancel the stream) if the stream is currently locked.
2079 */
2080 WritableStream.prototype.close = function () {
2081 if (!IsWritableStream(this)) {
2082 return promiseRejectedWith(streamBrandCheckException$2('close'));
2083 }
2084 if (IsWritableStreamLocked(this)) {
2085 return promiseRejectedWith(new TypeError('Cannot close a stream that already has a writer'));
2086 }
2087 if (WritableStreamCloseQueuedOrInFlight(this)) {
2088 return promiseRejectedWith(new TypeError('Cannot close an already-closing stream'));
2089 }
2090 return WritableStreamClose(this);
2091 };
2092 /**
2093 * Creates a {@link WritableStreamDefaultWriter | writer} and locks the stream to the new writer. While the stream
2094 * is locked, no other writer can be acquired until this one is released.
2095 *
2096 * This functionality is especially useful for creating abstractions that desire the ability to write to a stream
2097 * without interruption or interleaving. By getting a writer for the stream, you can ensure nobody else can write at
2098 * the same time, which would cause the resulting written data to be unpredictable and probably useless.
2099 */
2100 WritableStream.prototype.getWriter = function () {
2101 if (!IsWritableStream(this)) {
2102 throw streamBrandCheckException$2('getWriter');
2103 }
2104 return AcquireWritableStreamDefaultWriter(this);
2105 };
2106 return WritableStream;
2107 }());
2108 Object.defineProperties(WritableStream.prototype, {
2109 abort: { enumerable: true },
2110 close: { enumerable: true },
2111 getWriter: { enumerable: true },
2112 locked: { enumerable: true }
2113 });
2114 setFunctionName(WritableStream.prototype.abort, 'abort');
2115 setFunctionName(WritableStream.prototype.close, 'close');
2116 setFunctionName(WritableStream.prototype.getWriter, 'getWriter');
2117 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
2118 Object.defineProperty(WritableStream.prototype, SymbolPolyfill.toStringTag, {
2119 value: 'WritableStream',
2120 configurable: true
2121 });
2122 }
2123 // Abstract operations for the WritableStream.
2124 function AcquireWritableStreamDefaultWriter(stream) {
2125 return new WritableStreamDefaultWriter(stream);
2126 }
2127 // Throws if and only if startAlgorithm throws.
2128 function CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) {
2129 if (highWaterMark === void 0) { highWaterMark = 1; }
2130 if (sizeAlgorithm === void 0) { sizeAlgorithm = function () { return 1; }; }
2131 var stream = Object.create(WritableStream.prototype);
2132 InitializeWritableStream(stream);
2133 var controller = Object.create(WritableStreamDefaultController.prototype);
2134 SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm);
2135 return stream;
2136 }
2137 function InitializeWritableStream(stream) {
2138 stream._state = 'writable';
2139 // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is
2140 // 'erroring' or 'errored'. May be set to an undefined value.
2141 stream._storedError = undefined;
2142 stream._writer = undefined;
2143 // Initialize to undefined first because the constructor of the controller checks this
2144 // variable to validate the caller.
2145 stream._writableStreamController = undefined;
2146 // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data
2147 // producer without waiting for the queued writes to finish.
2148 stream._writeRequests = new SimpleQueue();
2149 // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents
2150 // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here.
2151 stream._inFlightWriteRequest = undefined;
2152 // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer
2153 // has been detached.
2154 stream._closeRequest = undefined;
2155 // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it
2156 // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here.
2157 stream._inFlightCloseRequest = undefined;
2158 // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached.
2159 stream._pendingAbortRequest = undefined;
2160 // The backpressure signal set by the controller.
2161 stream._backpressure = false;
2162 }
2163 function IsWritableStream(x) {
2164 if (!typeIsObject(x)) {
2165 return false;
2166 }
2167 if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {
2168 return false;
2169 }
2170 return x instanceof WritableStream;
2171 }
2172 function IsWritableStreamLocked(stream) {
2173 if (stream._writer === undefined) {
2174 return false;
2175 }
2176 return true;
2177 }
2178 function WritableStreamAbort(stream, reason) {
2179 var _a;
2180 if (stream._state === 'closed' || stream._state === 'errored') {
2181 return promiseResolvedWith(undefined);
2182 }
2183 stream._writableStreamController._abortReason = reason;
2184 (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(reason);
2185 // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring',
2186 // but it doesn't know that signaling abort runs author code that might have changed the state.
2187 // Widen the type again by casting to WritableStreamState.
2188 var state = stream._state;
2189 if (state === 'closed' || state === 'errored') {
2190 return promiseResolvedWith(undefined);
2191 }
2192 if (stream._pendingAbortRequest !== undefined) {
2193 return stream._pendingAbortRequest._promise;
2194 }
2195 var wasAlreadyErroring = false;
2196 if (state === 'erroring') {
2197 wasAlreadyErroring = true;
2198 // reason will not be used, so don't keep a reference to it.
2199 reason = undefined;
2200 }
2201 var promise = newPromise(function (resolve, reject) {
2202 stream._pendingAbortRequest = {
2203 _promise: undefined,
2204 _resolve: resolve,
2205 _reject: reject,
2206 _reason: reason,
2207 _wasAlreadyErroring: wasAlreadyErroring
2208 };
2209 });
2210 stream._pendingAbortRequest._promise = promise;
2211 if (!wasAlreadyErroring) {
2212 WritableStreamStartErroring(stream, reason);
2213 }
2214 return promise;
2215 }
2216 function WritableStreamClose(stream) {
2217 var state = stream._state;
2218 if (state === 'closed' || state === 'errored') {
2219 return promiseRejectedWith(new TypeError("The stream (in ".concat(state, " state) is not in the writable state and cannot be closed")));
2220 }
2221 var promise = newPromise(function (resolve, reject) {
2222 var closeRequest = {
2223 _resolve: resolve,
2224 _reject: reject
2225 };
2226 stream._closeRequest = closeRequest;
2227 });
2228 var writer = stream._writer;
2229 if (writer !== undefined && stream._backpressure && state === 'writable') {
2230 defaultWriterReadyPromiseResolve(writer);
2231 }
2232 WritableStreamDefaultControllerClose(stream._writableStreamController);
2233 return promise;
2234 }
2235 // WritableStream API exposed for controllers.
2236 function WritableStreamAddWriteRequest(stream) {
2237 var promise = newPromise(function (resolve, reject) {
2238 var writeRequest = {
2239 _resolve: resolve,
2240 _reject: reject
2241 };
2242 stream._writeRequests.push(writeRequest);
2243 });
2244 return promise;
2245 }
2246 function WritableStreamDealWithRejection(stream, error) {
2247 var state = stream._state;
2248 if (state === 'writable') {
2249 WritableStreamStartErroring(stream, error);
2250 return;
2251 }
2252 WritableStreamFinishErroring(stream);
2253 }
2254 function WritableStreamStartErroring(stream, reason) {
2255 var controller = stream._writableStreamController;
2256 stream._state = 'erroring';
2257 stream._storedError = reason;
2258 var writer = stream._writer;
2259 if (writer !== undefined) {
2260 WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
2261 }
2262 if (!WritableStreamHasOperationMarkedInFlight(stream) && controller._started) {
2263 WritableStreamFinishErroring(stream);
2264 }
2265 }
2266 function WritableStreamFinishErroring(stream) {
2267 stream._state = 'errored';
2268 stream._writableStreamController[ErrorSteps]();
2269 var storedError = stream._storedError;
2270 stream._writeRequests.forEach(function (writeRequest) {
2271 writeRequest._reject(storedError);
2272 });
2273 stream._writeRequests = new SimpleQueue();
2274 if (stream._pendingAbortRequest === undefined) {
2275 WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
2276 return;
2277 }
2278 var abortRequest = stream._pendingAbortRequest;
2279 stream._pendingAbortRequest = undefined;
2280 if (abortRequest._wasAlreadyErroring) {
2281 abortRequest._reject(storedError);
2282 WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
2283 return;
2284 }
2285 var promise = stream._writableStreamController[AbortSteps](abortRequest._reason);
2286 uponPromise(promise, function () {
2287 abortRequest._resolve();
2288 WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
2289 return null;
2290 }, function (reason) {
2291 abortRequest._reject(reason);
2292 WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
2293 return null;
2294 });
2295 }
2296 function WritableStreamFinishInFlightWrite(stream) {
2297 stream._inFlightWriteRequest._resolve(undefined);
2298 stream._inFlightWriteRequest = undefined;
2299 }
2300 function WritableStreamFinishInFlightWriteWithError(stream, error) {
2301 stream._inFlightWriteRequest._reject(error);
2302 stream._inFlightWriteRequest = undefined;
2303 WritableStreamDealWithRejection(stream, error);
2304 }
2305 function WritableStreamFinishInFlightClose(stream) {
2306 stream._inFlightCloseRequest._resolve(undefined);
2307 stream._inFlightCloseRequest = undefined;
2308 var state = stream._state;
2309 if (state === 'erroring') {
2310 // The error was too late to do anything, so it is ignored.
2311 stream._storedError = undefined;
2312 if (stream._pendingAbortRequest !== undefined) {
2313 stream._pendingAbortRequest._resolve();
2314 stream._pendingAbortRequest = undefined;
2315 }
2316 }
2317 stream._state = 'closed';
2318 var writer = stream._writer;
2319 if (writer !== undefined) {
2320 defaultWriterClosedPromiseResolve(writer);
2321 }
2322 }
2323 function WritableStreamFinishInFlightCloseWithError(stream, error) {
2324 stream._inFlightCloseRequest._reject(error);
2325 stream._inFlightCloseRequest = undefined;
2326 // Never execute sink abort() after sink close().
2327 if (stream._pendingAbortRequest !== undefined) {
2328 stream._pendingAbortRequest._reject(error);
2329 stream._pendingAbortRequest = undefined;
2330 }
2331 WritableStreamDealWithRejection(stream, error);
2332 }
2333 // TODO(ricea): Fix alphabetical order.
2334 function WritableStreamCloseQueuedOrInFlight(stream) {
2335 if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {
2336 return false;
2337 }
2338 return true;
2339 }
2340 function WritableStreamHasOperationMarkedInFlight(stream) {
2341 if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {
2342 return false;
2343 }
2344 return true;
2345 }
2346 function WritableStreamMarkCloseRequestInFlight(stream) {
2347 stream._inFlightCloseRequest = stream._closeRequest;
2348 stream._closeRequest = undefined;
2349 }
2350 function WritableStreamMarkFirstWriteRequestInFlight(stream) {
2351 stream._inFlightWriteRequest = stream._writeRequests.shift();
2352 }
2353 function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
2354 if (stream._closeRequest !== undefined) {
2355 stream._closeRequest._reject(stream._storedError);
2356 stream._closeRequest = undefined;
2357 }
2358 var writer = stream._writer;
2359 if (writer !== undefined) {
2360 defaultWriterClosedPromiseReject(writer, stream._storedError);
2361 }
2362 }
2363 function WritableStreamUpdateBackpressure(stream, backpressure) {
2364 var writer = stream._writer;
2365 if (writer !== undefined && backpressure !== stream._backpressure) {
2366 if (backpressure) {
2367 defaultWriterReadyPromiseReset(writer);
2368 }
2369 else {
2370 defaultWriterReadyPromiseResolve(writer);
2371 }
2372 }
2373 stream._backpressure = backpressure;
2374 }
2375 /**
2376 * A default writer vended by a {@link WritableStream}.
2377 *
2378 * @public
2379 */
2380 var WritableStreamDefaultWriter = /** @class */ (function () {
2381 function WritableStreamDefaultWriter(stream) {
2382 assertRequiredArgument(stream, 1, 'WritableStreamDefaultWriter');
2383 assertWritableStream(stream, 'First parameter');
2384 if (IsWritableStreamLocked(stream)) {
2385 throw new TypeError('This stream has already been locked for exclusive writing by another writer');
2386 }
2387 this._ownerWritableStream = stream;
2388 stream._writer = this;
2389 var state = stream._state;
2390 if (state === 'writable') {
2391 if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._backpressure) {
2392 defaultWriterReadyPromiseInitialize(this);
2393 }
2394 else {
2395 defaultWriterReadyPromiseInitializeAsResolved(this);
2396 }
2397 defaultWriterClosedPromiseInitialize(this);
2398 }
2399 else if (state === 'erroring') {
2400 defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);
2401 defaultWriterClosedPromiseInitialize(this);
2402 }
2403 else if (state === 'closed') {
2404 defaultWriterReadyPromiseInitializeAsResolved(this);
2405 defaultWriterClosedPromiseInitializeAsResolved(this);
2406 }
2407 else {
2408 var storedError = stream._storedError;
2409 defaultWriterReadyPromiseInitializeAsRejected(this, storedError);
2410 defaultWriterClosedPromiseInitializeAsRejected(this, storedError);
2411 }
2412 }
2413 Object.defineProperty(WritableStreamDefaultWriter.prototype, "closed", {
2414 /**
2415 * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or
2416 * the writer’s lock is released before the stream finishes closing.
2417 */
2418 get: function () {
2419 if (!IsWritableStreamDefaultWriter(this)) {
2420 return promiseRejectedWith(defaultWriterBrandCheckException('closed'));
2421 }
2422 return this._closedPromise;
2423 },
2424 enumerable: false,
2425 configurable: true
2426 });
2427 Object.defineProperty(WritableStreamDefaultWriter.prototype, "desiredSize", {
2428 /**
2429 * Returns the desired size to fill the stream’s internal queue. It can be negative, if the queue is over-full.
2430 * A producer can use this information to determine the right amount of data to write.
2431 *
2432 * It will be `null` if the stream cannot be successfully written to (due to either being errored, or having an abort
2433 * queued up). It will return zero if the stream is closed. And the getter will throw an exception if invoked when
2434 * the writer’s lock is released.
2435 */
2436 get: function () {
2437 if (!IsWritableStreamDefaultWriter(this)) {
2438 throw defaultWriterBrandCheckException('desiredSize');
2439 }
2440 if (this._ownerWritableStream === undefined) {
2441 throw defaultWriterLockException('desiredSize');
2442 }
2443 return WritableStreamDefaultWriterGetDesiredSize(this);
2444 },
2445 enumerable: false,
2446 configurable: true
2447 });
2448 Object.defineProperty(WritableStreamDefaultWriter.prototype, "ready", {
2449 /**
2450 * Returns a promise that will be fulfilled when the desired size to fill the stream’s internal queue transitions
2451 * from non-positive to positive, signaling that it is no longer applying backpressure. Once the desired size dips
2452 * back to zero or below, the getter will return a new promise that stays pending until the next transition.
2453 *
2454 * If the stream becomes errored or aborted, or the writer’s lock is released, the returned promise will become
2455 * rejected.
2456 */
2457 get: function () {
2458 if (!IsWritableStreamDefaultWriter(this)) {
2459 return promiseRejectedWith(defaultWriterBrandCheckException('ready'));
2460 }
2461 return this._readyPromise;
2462 },
2463 enumerable: false,
2464 configurable: true
2465 });
2466 /**
2467 * If the reader is active, behaves the same as {@link WritableStream.abort | stream.abort(reason)}.
2468 */
2469 WritableStreamDefaultWriter.prototype.abort = function (reason) {
2470 if (reason === void 0) { reason = undefined; }
2471 if (!IsWritableStreamDefaultWriter(this)) {
2472 return promiseRejectedWith(defaultWriterBrandCheckException('abort'));
2473 }
2474 if (this._ownerWritableStream === undefined) {
2475 return promiseRejectedWith(defaultWriterLockException('abort'));
2476 }
2477 return WritableStreamDefaultWriterAbort(this, reason);
2478 };
2479 /**
2480 * If the reader is active, behaves the same as {@link WritableStream.close | stream.close()}.
2481 */
2482 WritableStreamDefaultWriter.prototype.close = function () {
2483 if (!IsWritableStreamDefaultWriter(this)) {
2484 return promiseRejectedWith(defaultWriterBrandCheckException('close'));
2485 }
2486 var stream = this._ownerWritableStream;
2487 if (stream === undefined) {
2488 return promiseRejectedWith(defaultWriterLockException('close'));
2489 }
2490 if (WritableStreamCloseQueuedOrInFlight(stream)) {
2491 return promiseRejectedWith(new TypeError('Cannot close an already-closing stream'));
2492 }
2493 return WritableStreamDefaultWriterClose(this);
2494 };
2495 /**
2496 * Releases the writer’s lock on the corresponding stream. After the lock is released, the writer is no longer active.
2497 * If the associated stream is errored when the lock is released, the writer will appear errored in the same way from
2498 * now on; otherwise, the writer will appear closed.
2499 *
2500 * Note that the lock can still be released even if some ongoing writes have not yet finished (i.e. even if the
2501 * promises returned from previous calls to {@link WritableStreamDefaultWriter.write | write()} have not yet settled).
2502 * It’s not necessary to hold the lock on the writer for the duration of the write; the lock instead simply prevents
2503 * other producers from writing in an interleaved manner.
2504 */
2505 WritableStreamDefaultWriter.prototype.releaseLock = function () {
2506 if (!IsWritableStreamDefaultWriter(this)) {
2507 throw defaultWriterBrandCheckException('releaseLock');
2508 }
2509 var stream = this._ownerWritableStream;
2510 if (stream === undefined) {
2511 return;
2512 }
2513 WritableStreamDefaultWriterRelease(this);
2514 };
2515 WritableStreamDefaultWriter.prototype.write = function (chunk) {
2516 if (chunk === void 0) { chunk = undefined; }
2517 if (!IsWritableStreamDefaultWriter(this)) {
2518 return promiseRejectedWith(defaultWriterBrandCheckException('write'));
2519 }
2520 if (this._ownerWritableStream === undefined) {
2521 return promiseRejectedWith(defaultWriterLockException('write to'));
2522 }
2523 return WritableStreamDefaultWriterWrite(this, chunk);
2524 };
2525 return WritableStreamDefaultWriter;
2526 }());
2527 Object.defineProperties(WritableStreamDefaultWriter.prototype, {
2528 abort: { enumerable: true },
2529 close: { enumerable: true },
2530 releaseLock: { enumerable: true },
2531 write: { enumerable: true },
2532 closed: { enumerable: true },
2533 desiredSize: { enumerable: true },
2534 ready: { enumerable: true }
2535 });
2536 setFunctionName(WritableStreamDefaultWriter.prototype.abort, 'abort');
2537 setFunctionName(WritableStreamDefaultWriter.prototype.close, 'close');
2538 setFunctionName(WritableStreamDefaultWriter.prototype.releaseLock, 'releaseLock');
2539 setFunctionName(WritableStreamDefaultWriter.prototype.write, 'write');
2540 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
2541 Object.defineProperty(WritableStreamDefaultWriter.prototype, SymbolPolyfill.toStringTag, {
2542 value: 'WritableStreamDefaultWriter',
2543 configurable: true
2544 });
2545 }
2546 // Abstract operations for the WritableStreamDefaultWriter.
2547 function IsWritableStreamDefaultWriter(x) {
2548 if (!typeIsObject(x)) {
2549 return false;
2550 }
2551 if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {
2552 return false;
2553 }
2554 return x instanceof WritableStreamDefaultWriter;
2555 }
2556 // A client of WritableStreamDefaultWriter may use these functions directly to bypass state check.
2557 function WritableStreamDefaultWriterAbort(writer, reason) {
2558 var stream = writer._ownerWritableStream;
2559 return WritableStreamAbort(stream, reason);
2560 }
2561 function WritableStreamDefaultWriterClose(writer) {
2562 var stream = writer._ownerWritableStream;
2563 return WritableStreamClose(stream);
2564 }
2565 function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {
2566 var stream = writer._ownerWritableStream;
2567 var state = stream._state;
2568 if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') {
2569 return promiseResolvedWith(undefined);
2570 }
2571 if (state === 'errored') {
2572 return promiseRejectedWith(stream._storedError);
2573 }
2574 return WritableStreamDefaultWriterClose(writer);
2575 }
2576 function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
2577 if (writer._closedPromiseState === 'pending') {
2578 defaultWriterClosedPromiseReject(writer, error);
2579 }
2580 else {
2581 defaultWriterClosedPromiseResetToRejected(writer, error);
2582 }
2583 }
2584 function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
2585 if (writer._readyPromiseState === 'pending') {
2586 defaultWriterReadyPromiseReject(writer, error);
2587 }
2588 else {
2589 defaultWriterReadyPromiseResetToRejected(writer, error);
2590 }
2591 }
2592 function WritableStreamDefaultWriterGetDesiredSize(writer) {
2593 var stream = writer._ownerWritableStream;
2594 var state = stream._state;
2595 if (state === 'errored' || state === 'erroring') {
2596 return null;
2597 }
2598 if (state === 'closed') {
2599 return 0;
2600 }
2601 return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);
2602 }
2603 function WritableStreamDefaultWriterRelease(writer) {
2604 var stream = writer._ownerWritableStream;
2605 var releasedError = new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");
2606 WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
2607 // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not
2608 // rejected until afterwards. This means that simply testing state will not work.
2609 WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
2610 stream._writer = undefined;
2611 writer._ownerWritableStream = undefined;
2612 }
2613 function WritableStreamDefaultWriterWrite(writer, chunk) {
2614 var stream = writer._ownerWritableStream;
2615 var controller = stream._writableStreamController;
2616 var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);
2617 if (stream !== writer._ownerWritableStream) {
2618 return promiseRejectedWith(defaultWriterLockException('write to'));
2619 }
2620 var state = stream._state;
2621 if (state === 'errored') {
2622 return promiseRejectedWith(stream._storedError);
2623 }
2624 if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') {
2625 return promiseRejectedWith(new TypeError('The stream is closing or closed and cannot be written to'));
2626 }
2627 if (state === 'erroring') {
2628 return promiseRejectedWith(stream._storedError);
2629 }
2630 var promise = WritableStreamAddWriteRequest(stream);
2631 WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);
2632 return promise;
2633 }
2634 var closeSentinel = {};
2635 /**
2636 * Allows control of a {@link WritableStream | writable stream}'s state and internal queue.
2637 *
2638 * @public
2639 */
2640 var WritableStreamDefaultController = /** @class */ (function () {
2641 function WritableStreamDefaultController() {
2642 throw new TypeError('Illegal constructor');
2643 }
2644 Object.defineProperty(WritableStreamDefaultController.prototype, "abortReason", {
2645 /**
2646 * The reason which was passed to `WritableStream.abort(reason)` when the stream was aborted.
2647 *
2648 * @deprecated
2649 * This property has been removed from the specification, see https://github.com/whatwg/streams/pull/1177.
2650 * Use {@link WritableStreamDefaultController.signal}'s `reason` instead.
2651 */
2652 get: function () {
2653 if (!IsWritableStreamDefaultController(this)) {
2654 throw defaultControllerBrandCheckException$2('abortReason');
2655 }
2656 return this._abortReason;
2657 },
2658 enumerable: false,
2659 configurable: true
2660 });
2661 Object.defineProperty(WritableStreamDefaultController.prototype, "signal", {
2662 /**
2663 * An `AbortSignal` that can be used to abort the pending write or close operation when the stream is aborted.
2664 */
2665 get: function () {
2666 if (!IsWritableStreamDefaultController(this)) {
2667 throw defaultControllerBrandCheckException$2('signal');
2668 }
2669 if (this._abortController === undefined) {
2670 // Older browsers or older Node versions may not support `AbortController` or `AbortSignal`.
2671 // We don't want to bundle and ship an `AbortController` polyfill together with our polyfill,
2672 // so instead we only implement support for `signal` if we find a global `AbortController` constructor.
2673 throw new TypeError('WritableStreamDefaultController.prototype.signal is not supported');
2674 }
2675 return this._abortController.signal;
2676 },
2677 enumerable: false,
2678 configurable: true
2679 });
2680 /**
2681 * Closes the controlled writable stream, making all future interactions with it fail with the given error `e`.
2682 *
2683 * This method is rarely used, since usually it suffices to return a rejected promise from one of the underlying
2684 * sink's methods. However, it can be useful for suddenly shutting down a stream in response to an event outside the
2685 * normal lifecycle of interactions with the underlying sink.
2686 */
2687 WritableStreamDefaultController.prototype.error = function (e) {
2688 if (e === void 0) { e = undefined; }
2689 if (!IsWritableStreamDefaultController(this)) {
2690 throw defaultControllerBrandCheckException$2('error');
2691 }
2692 var state = this._controlledWritableStream._state;
2693 if (state !== 'writable') {
2694 // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so
2695 // just treat it as a no-op.
2696 return;
2697 }
2698 WritableStreamDefaultControllerError(this, e);
2699 };
2700 /** @internal */
2701 WritableStreamDefaultController.prototype[AbortSteps] = function (reason) {
2702 var result = this._abortAlgorithm(reason);
2703 WritableStreamDefaultControllerClearAlgorithms(this);
2704 return result;
2705 };
2706 /** @internal */
2707 WritableStreamDefaultController.prototype[ErrorSteps] = function () {
2708 ResetQueue(this);
2709 };
2710 return WritableStreamDefaultController;
2711 }());
2712 Object.defineProperties(WritableStreamDefaultController.prototype, {
2713 abortReason: { enumerable: true },
2714 signal: { enumerable: true },
2715 error: { enumerable: true }
2716 });
2717 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
2718 Object.defineProperty(WritableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, {
2719 value: 'WritableStreamDefaultController',
2720 configurable: true
2721 });
2722 }
2723 // Abstract operations implementing interface required by the WritableStream.
2724 function IsWritableStreamDefaultController(x) {
2725 if (!typeIsObject(x)) {
2726 return false;
2727 }
2728 if (!Object.prototype.hasOwnProperty.call(x, '_controlledWritableStream')) {
2729 return false;
2730 }
2731 return x instanceof WritableStreamDefaultController;
2732 }
2733 function SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) {
2734 controller._controlledWritableStream = stream;
2735 stream._writableStreamController = controller;
2736 // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
2737 controller._queue = undefined;
2738 controller._queueTotalSize = undefined;
2739 ResetQueue(controller);
2740 controller._abortReason = undefined;
2741 controller._abortController = createAbortController();
2742 controller._started = false;
2743 controller._strategySizeAlgorithm = sizeAlgorithm;
2744 controller._strategyHWM = highWaterMark;
2745 controller._writeAlgorithm = writeAlgorithm;
2746 controller._closeAlgorithm = closeAlgorithm;
2747 controller._abortAlgorithm = abortAlgorithm;
2748 var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
2749 WritableStreamUpdateBackpressure(stream, backpressure);
2750 var startResult = startAlgorithm();
2751 var startPromise = promiseResolvedWith(startResult);
2752 uponPromise(startPromise, function () {
2753 controller._started = true;
2754 WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
2755 return null;
2756 }, function (r) {
2757 controller._started = true;
2758 WritableStreamDealWithRejection(stream, r);
2759 return null;
2760 });
2761 }
2762 function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) {
2763 var controller = Object.create(WritableStreamDefaultController.prototype);
2764 var startAlgorithm;
2765 var writeAlgorithm;
2766 var closeAlgorithm;
2767 var abortAlgorithm;
2768 if (underlyingSink.start !== undefined) {
2769 startAlgorithm = function () { return underlyingSink.start(controller); };
2770 }
2771 else {
2772 startAlgorithm = function () { return undefined; };
2773 }
2774 if (underlyingSink.write !== undefined) {
2775 writeAlgorithm = function (chunk) { return underlyingSink.write(chunk, controller); };
2776 }
2777 else {
2778 writeAlgorithm = function () { return promiseResolvedWith(undefined); };
2779 }
2780 if (underlyingSink.close !== undefined) {
2781 closeAlgorithm = function () { return underlyingSink.close(); };
2782 }
2783 else {
2784 closeAlgorithm = function () { return promiseResolvedWith(undefined); };
2785 }
2786 if (underlyingSink.abort !== undefined) {
2787 abortAlgorithm = function (reason) { return underlyingSink.abort(reason); };
2788 }
2789 else {
2790 abortAlgorithm = function () { return promiseResolvedWith(undefined); };
2791 }
2792 SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm);
2793 }
2794 // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls.
2795 function WritableStreamDefaultControllerClearAlgorithms(controller) {
2796 controller._writeAlgorithm = undefined;
2797 controller._closeAlgorithm = undefined;
2798 controller._abortAlgorithm = undefined;
2799 controller._strategySizeAlgorithm = undefined;
2800 }
2801 function WritableStreamDefaultControllerClose(controller) {
2802 EnqueueValueWithSize(controller, closeSentinel, 0);
2803 WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
2804 }
2805 function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {
2806 try {
2807 return controller._strategySizeAlgorithm(chunk);
2808 }
2809 catch (chunkSizeE) {
2810 WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
2811 return 1;
2812 }
2813 }
2814 function WritableStreamDefaultControllerGetDesiredSize(controller) {
2815 return controller._strategyHWM - controller._queueTotalSize;
2816 }
2817 function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
2818 try {
2819 EnqueueValueWithSize(controller, chunk, chunkSize);
2820 }
2821 catch (enqueueE) {
2822 WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
2823 return;
2824 }
2825 var stream = controller._controlledWritableStream;
2826 if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._state === 'writable') {
2827 var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
2828 WritableStreamUpdateBackpressure(stream, backpressure);
2829 }
2830 WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
2831 }
2832 // Abstract operations for the WritableStreamDefaultController.
2833 function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
2834 var stream = controller._controlledWritableStream;
2835 if (!controller._started) {
2836 return;
2837 }
2838 if (stream._inFlightWriteRequest !== undefined) {
2839 return;
2840 }
2841 var state = stream._state;
2842 if (state === 'erroring') {
2843 WritableStreamFinishErroring(stream);
2844 return;
2845 }
2846 if (controller._queue.length === 0) {
2847 return;
2848 }
2849 var value = PeekQueueValue(controller);
2850 if (value === closeSentinel) {
2851 WritableStreamDefaultControllerProcessClose(controller);
2852 }
2853 else {
2854 WritableStreamDefaultControllerProcessWrite(controller, value);
2855 }
2856 }
2857 function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {
2858 if (controller._controlledWritableStream._state === 'writable') {
2859 WritableStreamDefaultControllerError(controller, error);
2860 }
2861 }
2862 function WritableStreamDefaultControllerProcessClose(controller) {
2863 var stream = controller._controlledWritableStream;
2864 WritableStreamMarkCloseRequestInFlight(stream);
2865 DequeueValue(controller);
2866 var sinkClosePromise = controller._closeAlgorithm();
2867 WritableStreamDefaultControllerClearAlgorithms(controller);
2868 uponPromise(sinkClosePromise, function () {
2869 WritableStreamFinishInFlightClose(stream);
2870 return null;
2871 }, function (reason) {
2872 WritableStreamFinishInFlightCloseWithError(stream, reason);
2873 return null;
2874 });
2875 }
2876 function WritableStreamDefaultControllerProcessWrite(controller, chunk) {
2877 var stream = controller._controlledWritableStream;
2878 WritableStreamMarkFirstWriteRequestInFlight(stream);
2879 var sinkWritePromise = controller._writeAlgorithm(chunk);
2880 uponPromise(sinkWritePromise, function () {
2881 WritableStreamFinishInFlightWrite(stream);
2882 var state = stream._state;
2883 DequeueValue(controller);
2884 if (!WritableStreamCloseQueuedOrInFlight(stream) && state === 'writable') {
2885 var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
2886 WritableStreamUpdateBackpressure(stream, backpressure);
2887 }
2888 WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
2889 return null;
2890 }, function (reason) {
2891 if (stream._state === 'writable') {
2892 WritableStreamDefaultControllerClearAlgorithms(controller);
2893 }
2894 WritableStreamFinishInFlightWriteWithError(stream, reason);
2895 return null;
2896 });
2897 }
2898 function WritableStreamDefaultControllerGetBackpressure(controller) {
2899 var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);
2900 return desiredSize <= 0;
2901 }
2902 // A client of WritableStreamDefaultController may use these functions directly to bypass state check.
2903 function WritableStreamDefaultControllerError(controller, error) {
2904 var stream = controller._controlledWritableStream;
2905 WritableStreamDefaultControllerClearAlgorithms(controller);
2906 WritableStreamStartErroring(stream, error);
2907 }
2908 // Helper functions for the WritableStream.
2909 function streamBrandCheckException$2(name) {
2910 return new TypeError("WritableStream.prototype.".concat(name, " can only be used on a WritableStream"));
2911 }
2912 // Helper functions for the WritableStreamDefaultController.
2913 function defaultControllerBrandCheckException$2(name) {
2914 return new TypeError("WritableStreamDefaultController.prototype.".concat(name, " can only be used on a WritableStreamDefaultController"));
2915 }
2916 // Helper functions for the WritableStreamDefaultWriter.
2917 function defaultWriterBrandCheckException(name) {
2918 return new TypeError("WritableStreamDefaultWriter.prototype.".concat(name, " can only be used on a WritableStreamDefaultWriter"));
2919 }
2920 function defaultWriterLockException(name) {
2921 return new TypeError('Cannot ' + name + ' a stream using a released writer');
2922 }
2923 function defaultWriterClosedPromiseInitialize(writer) {
2924 writer._closedPromise = newPromise(function (resolve, reject) {
2925 writer._closedPromise_resolve = resolve;
2926 writer._closedPromise_reject = reject;
2927 writer._closedPromiseState = 'pending';
2928 });
2929 }
2930 function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {
2931 defaultWriterClosedPromiseInitialize(writer);
2932 defaultWriterClosedPromiseReject(writer, reason);
2933 }
2934 function defaultWriterClosedPromiseInitializeAsResolved(writer) {
2935 defaultWriterClosedPromiseInitialize(writer);
2936 defaultWriterClosedPromiseResolve(writer);
2937 }
2938 function defaultWriterClosedPromiseReject(writer, reason) {
2939 if (writer._closedPromise_reject === undefined) {
2940 return;
2941 }
2942 setPromiseIsHandledToTrue(writer._closedPromise);
2943 writer._closedPromise_reject(reason);
2944 writer._closedPromise_resolve = undefined;
2945 writer._closedPromise_reject = undefined;
2946 writer._closedPromiseState = 'rejected';
2947 }
2948 function defaultWriterClosedPromiseResetToRejected(writer, reason) {
2949 defaultWriterClosedPromiseInitializeAsRejected(writer, reason);
2950 }
2951 function defaultWriterClosedPromiseResolve(writer) {
2952 if (writer._closedPromise_resolve === undefined) {
2953 return;
2954 }
2955 writer._closedPromise_resolve(undefined);
2956 writer._closedPromise_resolve = undefined;
2957 writer._closedPromise_reject = undefined;
2958 writer._closedPromiseState = 'resolved';
2959 }
2960 function defaultWriterReadyPromiseInitialize(writer) {
2961 writer._readyPromise = newPromise(function (resolve, reject) {
2962 writer._readyPromise_resolve = resolve;
2963 writer._readyPromise_reject = reject;
2964 });
2965 writer._readyPromiseState = 'pending';
2966 }
2967 function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {
2968 defaultWriterReadyPromiseInitialize(writer);
2969 defaultWriterReadyPromiseReject(writer, reason);
2970 }
2971 function defaultWriterReadyPromiseInitializeAsResolved(writer) {
2972 defaultWriterReadyPromiseInitialize(writer);
2973 defaultWriterReadyPromiseResolve(writer);
2974 }
2975 function defaultWriterReadyPromiseReject(writer, reason) {
2976 if (writer._readyPromise_reject === undefined) {
2977 return;
2978 }
2979 setPromiseIsHandledToTrue(writer._readyPromise);
2980 writer._readyPromise_reject(reason);
2981 writer._readyPromise_resolve = undefined;
2982 writer._readyPromise_reject = undefined;
2983 writer._readyPromiseState = 'rejected';
2984 }
2985 function defaultWriterReadyPromiseReset(writer) {
2986 defaultWriterReadyPromiseInitialize(writer);
2987 }
2988 function defaultWriterReadyPromiseResetToRejected(writer, reason) {
2989 defaultWriterReadyPromiseInitializeAsRejected(writer, reason);
2990 }
2991 function defaultWriterReadyPromiseResolve(writer) {
2992 if (writer._readyPromise_resolve === undefined) {
2993 return;
2994 }
2995 writer._readyPromise_resolve(undefined);
2996 writer._readyPromise_resolve = undefined;
2997 writer._readyPromise_reject = undefined;
2998 writer._readyPromiseState = 'fulfilled';
2999 }
3000
3001 /// <reference lib="dom" />
3002 function getGlobals() {
3003 if (typeof globalThis !== 'undefined') {
3004 return globalThis;
3005 }
3006 else if (typeof self !== 'undefined') {
3007 return self;
3008 }
3009 else if (typeof global !== 'undefined') {
3010 return global;
3011 }
3012 return undefined;
3013 }
3014 var globals = getGlobals();
3015
3016 /// <reference types="node" />
3017 function isDOMExceptionConstructor(ctor) {
3018 if (!(typeof ctor === 'function' || typeof ctor === 'object')) {
3019 return false;
3020 }
3021 if (ctor.name !== 'DOMException') {
3022 return false;
3023 }
3024 try {
3025 new ctor();
3026 return true;
3027 }
3028 catch (_a) {
3029 return false;
3030 }
3031 }
3032 /**
3033 * Support:
3034 * - Web browsers
3035 * - Node 18 and higher (https://github.com/nodejs/node/commit/e4b1fb5e6422c1ff151234bb9de792d45dd88d87)
3036 */
3037 function getFromGlobal() {
3038 var ctor = globals === null || globals === void 0 ? void 0 : globals.DOMException;
3039 return isDOMExceptionConstructor(ctor) ? ctor : undefined;
3040 }
3041 /**
3042 * Support:
3043 * - All platforms
3044 */
3045 function createPolyfill() {
3046 // eslint-disable-next-line @typescript-eslint/no-shadow
3047 var ctor = function DOMException(message, name) {
3048 this.message = message || '';
3049 this.name = name || 'Error';
3050 if (Error.captureStackTrace) {
3051 Error.captureStackTrace(this, this.constructor);
3052 }
3053 };
3054 setFunctionName(ctor, 'DOMException');
3055 ctor.prototype = Object.create(Error.prototype);
3056 Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true });
3057 return ctor;
3058 }
3059 // eslint-disable-next-line @typescript-eslint/no-redeclare
3060 var DOMException = getFromGlobal() || createPolyfill();
3061
3062 function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) {
3063 var reader = AcquireReadableStreamDefaultReader(source);
3064 var writer = AcquireWritableStreamDefaultWriter(dest);
3065 source._disturbed = true;
3066 var shuttingDown = false;
3067 // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown.
3068 var currentWrite = promiseResolvedWith(undefined);
3069 return newPromise(function (resolve, reject) {
3070 var abortAlgorithm;
3071 if (signal !== undefined) {
3072 abortAlgorithm = function () {
3073 var error = signal.reason !== undefined ? signal.reason : new DOMException('Aborted', 'AbortError');
3074 var actions = [];
3075 if (!preventAbort) {
3076 actions.push(function () {
3077 if (dest._state === 'writable') {
3078 return WritableStreamAbort(dest, error);
3079 }
3080 return promiseResolvedWith(undefined);
3081 });
3082 }
3083 if (!preventCancel) {
3084 actions.push(function () {
3085 if (source._state === 'readable') {
3086 return ReadableStreamCancel(source, error);
3087 }
3088 return promiseResolvedWith(undefined);
3089 });
3090 }
3091 shutdownWithAction(function () { return Promise.all(actions.map(function (action) { return action(); })); }, true, error);
3092 };
3093 if (signal.aborted) {
3094 abortAlgorithm();
3095 return;
3096 }
3097 signal.addEventListener('abort', abortAlgorithm);
3098 }
3099 // Using reader and writer, read all chunks from this and write them to dest
3100 // - Backpressure must be enforced
3101 // - Shutdown must stop all activity
3102 function pipeLoop() {
3103 return newPromise(function (resolveLoop, rejectLoop) {
3104 function next(done) {
3105 if (done) {
3106 resolveLoop();
3107 }
3108 else {
3109 // Use `PerformPromiseThen` instead of `uponPromise` to avoid
3110 // adding unnecessary `.catch(rethrowAssertionErrorRejection)` handlers
3111 PerformPromiseThen(pipeStep(), next, rejectLoop);
3112 }
3113 }
3114 next(false);
3115 });
3116 }
3117 function pipeStep() {
3118 if (shuttingDown) {
3119 return promiseResolvedWith(true);
3120 }
3121 return PerformPromiseThen(writer._readyPromise, function () {
3122 return newPromise(function (resolveRead, rejectRead) {
3123 ReadableStreamDefaultReaderRead(reader, {
3124 _chunkSteps: function (chunk) {
3125 currentWrite = PerformPromiseThen(WritableStreamDefaultWriterWrite(writer, chunk), undefined, noop);
3126 resolveRead(false);
3127 },
3128 _closeSteps: function () { return resolveRead(true); },
3129 _errorSteps: rejectRead
3130 });
3131 });
3132 });
3133 }
3134 // Errors must be propagated forward
3135 isOrBecomesErrored(source, reader._closedPromise, function (storedError) {
3136 if (!preventAbort) {
3137 shutdownWithAction(function () { return WritableStreamAbort(dest, storedError); }, true, storedError);
3138 }
3139 else {
3140 shutdown(true, storedError);
3141 }
3142 return null;
3143 });
3144 // Errors must be propagated backward
3145 isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {
3146 if (!preventCancel) {
3147 shutdownWithAction(function () { return ReadableStreamCancel(source, storedError); }, true, storedError);
3148 }
3149 else {
3150 shutdown(true, storedError);
3151 }
3152 return null;
3153 });
3154 // Closing must be propagated forward
3155 isOrBecomesClosed(source, reader._closedPromise, function () {
3156 if (!preventClose) {
3157 shutdownWithAction(function () { return WritableStreamDefaultWriterCloseWithErrorPropagation(writer); });
3158 }
3159 else {
3160 shutdown();
3161 }
3162 return null;
3163 });
3164 // Closing must be propagated backward
3165 if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') {
3166 var destClosed_1 = new TypeError('the destination writable stream closed before all data could be piped to it');
3167 if (!preventCancel) {
3168 shutdownWithAction(function () { return ReadableStreamCancel(source, destClosed_1); }, true, destClosed_1);
3169 }
3170 else {
3171 shutdown(true, destClosed_1);
3172 }
3173 }
3174 setPromiseIsHandledToTrue(pipeLoop());
3175 function waitForWritesToFinish() {
3176 // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait
3177 // for that too.
3178 var oldCurrentWrite = currentWrite;
3179 return PerformPromiseThen(currentWrite, function () { return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined; });
3180 }
3181 function isOrBecomesErrored(stream, promise, action) {
3182 if (stream._state === 'errored') {
3183 action(stream._storedError);
3184 }
3185 else {
3186 uponRejection(promise, action);
3187 }
3188 }
3189 function isOrBecomesClosed(stream, promise, action) {
3190 if (stream._state === 'closed') {
3191 action();
3192 }
3193 else {
3194 uponFulfillment(promise, action);
3195 }
3196 }
3197 function shutdownWithAction(action, originalIsError, originalError) {
3198 if (shuttingDown) {
3199 return;
3200 }
3201 shuttingDown = true;
3202 if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) {
3203 uponFulfillment(waitForWritesToFinish(), doTheRest);
3204 }
3205 else {
3206 doTheRest();
3207 }
3208 function doTheRest() {
3209 uponPromise(action(), function () { return finalize(originalIsError, originalError); }, function (newError) { return finalize(true, newError); });
3210 return null;
3211 }
3212 }
3213 function shutdown(isError, error) {
3214 if (shuttingDown) {
3215 return;
3216 }
3217 shuttingDown = true;
3218 if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) {
3219 uponFulfillment(waitForWritesToFinish(), function () { return finalize(isError, error); });
3220 }
3221 else {
3222 finalize(isError, error);
3223 }
3224 }
3225 function finalize(isError, error) {
3226 WritableStreamDefaultWriterRelease(writer);
3227 ReadableStreamReaderGenericRelease(reader);
3228 if (signal !== undefined) {
3229 signal.removeEventListener('abort', abortAlgorithm);
3230 }
3231 if (isError) {
3232 reject(error);
3233 }
3234 else {
3235 resolve(undefined);
3236 }
3237 return null;
3238 }
3239 });
3240 }
3241
3242 /**
3243 * Allows control of a {@link ReadableStream | readable stream}'s state and internal queue.
3244 *
3245 * @public
3246 */
3247 var ReadableStreamDefaultController = /** @class */ (function () {
3248 function ReadableStreamDefaultController() {
3249 throw new TypeError('Illegal constructor');
3250 }
3251 Object.defineProperty(ReadableStreamDefaultController.prototype, "desiredSize", {
3252 /**
3253 * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is
3254 * over-full. An underlying source ought to use this information to determine when and how to apply backpressure.
3255 */
3256 get: function () {
3257 if (!IsReadableStreamDefaultController(this)) {
3258 throw defaultControllerBrandCheckException$1('desiredSize');
3259 }
3260 return ReadableStreamDefaultControllerGetDesiredSize(this);
3261 },
3262 enumerable: false,
3263 configurable: true
3264 });
3265 /**
3266 * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from
3267 * the stream, but once those are read, the stream will become closed.
3268 */
3269 ReadableStreamDefaultController.prototype.close = function () {
3270 if (!IsReadableStreamDefaultController(this)) {
3271 throw defaultControllerBrandCheckException$1('close');
3272 }
3273 if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) {
3274 throw new TypeError('The stream is not in a state that permits close');
3275 }
3276 ReadableStreamDefaultControllerClose(this);
3277 };
3278 ReadableStreamDefaultController.prototype.enqueue = function (chunk) {
3279 if (chunk === void 0) { chunk = undefined; }
3280 if (!IsReadableStreamDefaultController(this)) {
3281 throw defaultControllerBrandCheckException$1('enqueue');
3282 }
3283 if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) {
3284 throw new TypeError('The stream is not in a state that permits enqueue');
3285 }
3286 return ReadableStreamDefaultControllerEnqueue(this, chunk);
3287 };
3288 /**
3289 * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`.
3290 */
3291 ReadableStreamDefaultController.prototype.error = function (e) {
3292 if (e === void 0) { e = undefined; }
3293 if (!IsReadableStreamDefaultController(this)) {
3294 throw defaultControllerBrandCheckException$1('error');
3295 }
3296 ReadableStreamDefaultControllerError(this, e);
3297 };
3298 /** @internal */
3299 ReadableStreamDefaultController.prototype[CancelSteps] = function (reason) {
3300 ResetQueue(this);
3301 var result = this._cancelAlgorithm(reason);
3302 ReadableStreamDefaultControllerClearAlgorithms(this);
3303 return result;
3304 };
3305 /** @internal */
3306 ReadableStreamDefaultController.prototype[PullSteps] = function (readRequest) {
3307 var stream = this._controlledReadableStream;
3308 if (this._queue.length > 0) {
3309 var chunk = DequeueValue(this);
3310 if (this._closeRequested && this._queue.length === 0) {
3311 ReadableStreamDefaultControllerClearAlgorithms(this);
3312 ReadableStreamClose(stream);
3313 }
3314 else {
3315 ReadableStreamDefaultControllerCallPullIfNeeded(this);
3316 }
3317 readRequest._chunkSteps(chunk);
3318 }
3319 else {
3320 ReadableStreamAddReadRequest(stream, readRequest);
3321 ReadableStreamDefaultControllerCallPullIfNeeded(this);
3322 }
3323 };
3324 /** @internal */
3325 ReadableStreamDefaultController.prototype[ReleaseSteps] = function () {
3326 // Do nothing.
3327 };
3328 return ReadableStreamDefaultController;
3329 }());
3330 Object.defineProperties(ReadableStreamDefaultController.prototype, {
3331 close: { enumerable: true },
3332 enqueue: { enumerable: true },
3333 error: { enumerable: true },
3334 desiredSize: { enumerable: true }
3335 });
3336 setFunctionName(ReadableStreamDefaultController.prototype.close, 'close');
3337 setFunctionName(ReadableStreamDefaultController.prototype.enqueue, 'enqueue');
3338 setFunctionName(ReadableStreamDefaultController.prototype.error, 'error');
3339 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
3340 Object.defineProperty(ReadableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, {
3341 value: 'ReadableStreamDefaultController',
3342 configurable: true
3343 });
3344 }
3345 // Abstract operations for the ReadableStreamDefaultController.
3346 function IsReadableStreamDefaultController(x) {
3347 if (!typeIsObject(x)) {
3348 return false;
3349 }
3350 if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableStream')) {
3351 return false;
3352 }
3353 return x instanceof ReadableStreamDefaultController;
3354 }
3355 function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {
3356 var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);
3357 if (!shouldPull) {
3358 return;
3359 }
3360 if (controller._pulling) {
3361 controller._pullAgain = true;
3362 return;
3363 }
3364 controller._pulling = true;
3365 var pullPromise = controller._pullAlgorithm();
3366 uponPromise(pullPromise, function () {
3367 controller._pulling = false;
3368 if (controller._pullAgain) {
3369 controller._pullAgain = false;
3370 ReadableStreamDefaultControllerCallPullIfNeeded(controller);
3371 }
3372 return null;
3373 }, function (e) {
3374 ReadableStreamDefaultControllerError(controller, e);
3375 return null;
3376 });
3377 }
3378 function ReadableStreamDefaultControllerShouldCallPull(controller) {
3379 var stream = controller._controlledReadableStream;
3380 if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) {
3381 return false;
3382 }
3383 if (!controller._started) {
3384 return false;
3385 }
3386 if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) {
3387 return true;
3388 }
3389 var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
3390 if (desiredSize > 0) {
3391 return true;
3392 }
3393 return false;
3394 }
3395 function ReadableStreamDefaultControllerClearAlgorithms(controller) {
3396 controller._pullAlgorithm = undefined;
3397 controller._cancelAlgorithm = undefined;
3398 controller._strategySizeAlgorithm = undefined;
3399 }
3400 // A client of ReadableStreamDefaultController may use these functions directly to bypass state check.
3401 function ReadableStreamDefaultControllerClose(controller) {
3402 if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) {
3403 return;
3404 }
3405 var stream = controller._controlledReadableStream;
3406 controller._closeRequested = true;
3407 if (controller._queue.length === 0) {
3408 ReadableStreamDefaultControllerClearAlgorithms(controller);
3409 ReadableStreamClose(stream);
3410 }
3411 }
3412 function ReadableStreamDefaultControllerEnqueue(controller, chunk) {
3413 if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) {
3414 return;
3415 }
3416 var stream = controller._controlledReadableStream;
3417 if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) {
3418 ReadableStreamFulfillReadRequest(stream, chunk, false);
3419 }
3420 else {
3421 var chunkSize = void 0;
3422 try {
3423 chunkSize = controller._strategySizeAlgorithm(chunk);
3424 }
3425 catch (chunkSizeE) {
3426 ReadableStreamDefaultControllerError(controller, chunkSizeE);
3427 throw chunkSizeE;
3428 }
3429 try {
3430 EnqueueValueWithSize(controller, chunk, chunkSize);
3431 }
3432 catch (enqueueE) {
3433 ReadableStreamDefaultControllerError(controller, enqueueE);
3434 throw enqueueE;
3435 }
3436 }
3437 ReadableStreamDefaultControllerCallPullIfNeeded(controller);
3438 }
3439 function ReadableStreamDefaultControllerError(controller, e) {
3440 var stream = controller._controlledReadableStream;
3441 if (stream._state !== 'readable') {
3442 return;
3443 }
3444 ResetQueue(controller);
3445 ReadableStreamDefaultControllerClearAlgorithms(controller);
3446 ReadableStreamError(stream, e);
3447 }
3448 function ReadableStreamDefaultControllerGetDesiredSize(controller) {
3449 var state = controller._controlledReadableStream._state;
3450 if (state === 'errored') {
3451 return null;
3452 }
3453 if (state === 'closed') {
3454 return 0;
3455 }
3456 return controller._strategyHWM - controller._queueTotalSize;
3457 }
3458 // This is used in the implementation of TransformStream.
3459 function ReadableStreamDefaultControllerHasBackpressure(controller) {
3460 if (ReadableStreamDefaultControllerShouldCallPull(controller)) {
3461 return false;
3462 }
3463 return true;
3464 }
3465 function ReadableStreamDefaultControllerCanCloseOrEnqueue(controller) {
3466 var state = controller._controlledReadableStream._state;
3467 if (!controller._closeRequested && state === 'readable') {
3468 return true;
3469 }
3470 return false;
3471 }
3472 function SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) {
3473 controller._controlledReadableStream = stream;
3474 controller._queue = undefined;
3475 controller._queueTotalSize = undefined;
3476 ResetQueue(controller);
3477 controller._started = false;
3478 controller._closeRequested = false;
3479 controller._pullAgain = false;
3480 controller._pulling = false;
3481 controller._strategySizeAlgorithm = sizeAlgorithm;
3482 controller._strategyHWM = highWaterMark;
3483 controller._pullAlgorithm = pullAlgorithm;
3484 controller._cancelAlgorithm = cancelAlgorithm;
3485 stream._readableStreamController = controller;
3486 var startResult = startAlgorithm();
3487 uponPromise(promiseResolvedWith(startResult), function () {
3488 controller._started = true;
3489 ReadableStreamDefaultControllerCallPullIfNeeded(controller);
3490 return null;
3491 }, function (r) {
3492 ReadableStreamDefaultControllerError(controller, r);
3493 return null;
3494 });
3495 }
3496 function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) {
3497 var controller = Object.create(ReadableStreamDefaultController.prototype);
3498 var startAlgorithm;
3499 var pullAlgorithm;
3500 var cancelAlgorithm;
3501 if (underlyingSource.start !== undefined) {
3502 startAlgorithm = function () { return underlyingSource.start(controller); };
3503 }
3504 else {
3505 startAlgorithm = function () { return undefined; };
3506 }
3507 if (underlyingSource.pull !== undefined) {
3508 pullAlgorithm = function () { return underlyingSource.pull(controller); };
3509 }
3510 else {
3511 pullAlgorithm = function () { return promiseResolvedWith(undefined); };
3512 }
3513 if (underlyingSource.cancel !== undefined) {
3514 cancelAlgorithm = function (reason) { return underlyingSource.cancel(reason); };
3515 }
3516 else {
3517 cancelAlgorithm = function () { return promiseResolvedWith(undefined); };
3518 }
3519 SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm);
3520 }
3521 // Helper functions for the ReadableStreamDefaultController.
3522 function defaultControllerBrandCheckException$1(name) {
3523 return new TypeError("ReadableStreamDefaultController.prototype.".concat(name, " can only be used on a ReadableStreamDefaultController"));
3524 }
3525
3526 function ReadableStreamTee(stream, cloneForBranch2) {
3527 if (IsReadableByteStreamController(stream._readableStreamController)) {
3528 return ReadableByteStreamTee(stream);
3529 }
3530 return ReadableStreamDefaultTee(stream);
3531 }
3532 function ReadableStreamDefaultTee(stream, cloneForBranch2) {
3533 var reader = AcquireReadableStreamDefaultReader(stream);
3534 var reading = false;
3535 var readAgain = false;
3536 var canceled1 = false;
3537 var canceled2 = false;
3538 var reason1;
3539 var reason2;
3540 var branch1;
3541 var branch2;
3542 var resolveCancelPromise;
3543 var cancelPromise = newPromise(function (resolve) {
3544 resolveCancelPromise = resolve;
3545 });
3546 function pullAlgorithm() {
3547 if (reading) {
3548 readAgain = true;
3549 return promiseResolvedWith(undefined);
3550 }
3551 reading = true;
3552 var readRequest = {
3553 _chunkSteps: function (chunk) {
3554 // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using
3555 // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let
3556 // successful synchronously-available reads get ahead of asynchronously-available errors.
3557 _queueMicrotask(function () {
3558 readAgain = false;
3559 var chunk1 = chunk;
3560 var chunk2 = chunk;
3561 // There is no way to access the cloning code right now in the reference implementation.
3562 // If we add one then we'll need an implementation for serializable objects.
3563 // if (!canceled2 && cloneForBranch2) {
3564 // chunk2 = StructuredDeserialize(StructuredSerialize(chunk2));
3565 // }
3566 if (!canceled1) {
3567 ReadableStreamDefaultControllerEnqueue(branch1._readableStreamController, chunk1);
3568 }
3569 if (!canceled2) {
3570 ReadableStreamDefaultControllerEnqueue(branch2._readableStreamController, chunk2);
3571 }
3572 reading = false;
3573 if (readAgain) {
3574 pullAlgorithm();
3575 }
3576 });
3577 },
3578 _closeSteps: function () {
3579 reading = false;
3580 if (!canceled1) {
3581 ReadableStreamDefaultControllerClose(branch1._readableStreamController);
3582 }
3583 if (!canceled2) {
3584 ReadableStreamDefaultControllerClose(branch2._readableStreamController);
3585 }
3586 if (!canceled1 || !canceled2) {
3587 resolveCancelPromise(undefined);
3588 }
3589 },
3590 _errorSteps: function () {
3591 reading = false;
3592 }
3593 };
3594 ReadableStreamDefaultReaderRead(reader, readRequest);
3595 return promiseResolvedWith(undefined);
3596 }
3597 function cancel1Algorithm(reason) {
3598 canceled1 = true;
3599 reason1 = reason;
3600 if (canceled2) {
3601 var compositeReason = CreateArrayFromList([reason1, reason2]);
3602 var cancelResult = ReadableStreamCancel(stream, compositeReason);
3603 resolveCancelPromise(cancelResult);
3604 }
3605 return cancelPromise;
3606 }
3607 function cancel2Algorithm(reason) {
3608 canceled2 = true;
3609 reason2 = reason;
3610 if (canceled1) {
3611 var compositeReason = CreateArrayFromList([reason1, reason2]);
3612 var cancelResult = ReadableStreamCancel(stream, compositeReason);
3613 resolveCancelPromise(cancelResult);
3614 }
3615 return cancelPromise;
3616 }
3617 function startAlgorithm() {
3618 // do nothing
3619 }
3620 branch1 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel1Algorithm);
3621 branch2 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel2Algorithm);
3622 uponRejection(reader._closedPromise, function (r) {
3623 ReadableStreamDefaultControllerError(branch1._readableStreamController, r);
3624 ReadableStreamDefaultControllerError(branch2._readableStreamController, r);
3625 if (!canceled1 || !canceled2) {
3626 resolveCancelPromise(undefined);
3627 }
3628 return null;
3629 });
3630 return [branch1, branch2];
3631 }
3632 function ReadableByteStreamTee(stream) {
3633 var reader = AcquireReadableStreamDefaultReader(stream);
3634 var reading = false;
3635 var readAgainForBranch1 = false;
3636 var readAgainForBranch2 = false;
3637 var canceled1 = false;
3638 var canceled2 = false;
3639 var reason1;
3640 var reason2;
3641 var branch1;
3642 var branch2;
3643 var resolveCancelPromise;
3644 var cancelPromise = newPromise(function (resolve) {
3645 resolveCancelPromise = resolve;
3646 });
3647 function forwardReaderError(thisReader) {
3648 uponRejection(thisReader._closedPromise, function (r) {
3649 if (thisReader !== reader) {
3650 return null;
3651 }
3652 ReadableByteStreamControllerError(branch1._readableStreamController, r);
3653 ReadableByteStreamControllerError(branch2._readableStreamController, r);
3654 if (!canceled1 || !canceled2) {
3655 resolveCancelPromise(undefined);
3656 }
3657 return null;
3658 });
3659 }
3660 function pullWithDefaultReader() {
3661 if (IsReadableStreamBYOBReader(reader)) {
3662 ReadableStreamReaderGenericRelease(reader);
3663 reader = AcquireReadableStreamDefaultReader(stream);
3664 forwardReaderError(reader);
3665 }
3666 var readRequest = {
3667 _chunkSteps: function (chunk) {
3668 // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using
3669 // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let
3670 // successful synchronously-available reads get ahead of asynchronously-available errors.
3671 _queueMicrotask(function () {
3672 readAgainForBranch1 = false;
3673 readAgainForBranch2 = false;
3674 var chunk1 = chunk;
3675 var chunk2 = chunk;
3676 if (!canceled1 && !canceled2) {
3677 try {
3678 chunk2 = CloneAsUint8Array(chunk);
3679 }
3680 catch (cloneE) {
3681 ReadableByteStreamControllerError(branch1._readableStreamController, cloneE);
3682 ReadableByteStreamControllerError(branch2._readableStreamController, cloneE);
3683 resolveCancelPromise(ReadableStreamCancel(stream, cloneE));
3684 return;
3685 }
3686 }
3687 if (!canceled1) {
3688 ReadableByteStreamControllerEnqueue(branch1._readableStreamController, chunk1);
3689 }
3690 if (!canceled2) {
3691 ReadableByteStreamControllerEnqueue(branch2._readableStreamController, chunk2);
3692 }
3693 reading = false;
3694 if (readAgainForBranch1) {
3695 pull1Algorithm();
3696 }
3697 else if (readAgainForBranch2) {
3698 pull2Algorithm();
3699 }
3700 });
3701 },
3702 _closeSteps: function () {
3703 reading = false;
3704 if (!canceled1) {
3705 ReadableByteStreamControllerClose(branch1._readableStreamController);
3706 }
3707 if (!canceled2) {
3708 ReadableByteStreamControllerClose(branch2._readableStreamController);
3709 }
3710 if (branch1._readableStreamController._pendingPullIntos.length > 0) {
3711 ReadableByteStreamControllerRespond(branch1._readableStreamController, 0);
3712 }
3713 if (branch2._readableStreamController._pendingPullIntos.length > 0) {
3714 ReadableByteStreamControllerRespond(branch2._readableStreamController, 0);
3715 }
3716 if (!canceled1 || !canceled2) {
3717 resolveCancelPromise(undefined);
3718 }
3719 },
3720 _errorSteps: function () {
3721 reading = false;
3722 }
3723 };
3724 ReadableStreamDefaultReaderRead(reader, readRequest);
3725 }
3726 function pullWithBYOBReader(view, forBranch2) {
3727 if (IsReadableStreamDefaultReader(reader)) {
3728 ReadableStreamReaderGenericRelease(reader);
3729 reader = AcquireReadableStreamBYOBReader(stream);
3730 forwardReaderError(reader);
3731 }
3732 var byobBranch = forBranch2 ? branch2 : branch1;
3733 var otherBranch = forBranch2 ? branch1 : branch2;
3734 var readIntoRequest = {
3735 _chunkSteps: function (chunk) {
3736 // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using
3737 // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let
3738 // successful synchronously-available reads get ahead of asynchronously-available errors.
3739 _queueMicrotask(function () {
3740 readAgainForBranch1 = false;
3741 readAgainForBranch2 = false;
3742 var byobCanceled = forBranch2 ? canceled2 : canceled1;
3743 var otherCanceled = forBranch2 ? canceled1 : canceled2;
3744 if (!otherCanceled) {
3745 var clonedChunk = void 0;
3746 try {
3747 clonedChunk = CloneAsUint8Array(chunk);
3748 }
3749 catch (cloneE) {
3750 ReadableByteStreamControllerError(byobBranch._readableStreamController, cloneE);
3751 ReadableByteStreamControllerError(otherBranch._readableStreamController, cloneE);
3752 resolveCancelPromise(ReadableStreamCancel(stream, cloneE));
3753 return;
3754 }
3755 if (!byobCanceled) {
3756 ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk);
3757 }
3758 ReadableByteStreamControllerEnqueue(otherBranch._readableStreamController, clonedChunk);
3759 }
3760 else if (!byobCanceled) {
3761 ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk);
3762 }
3763 reading = false;
3764 if (readAgainForBranch1) {
3765 pull1Algorithm();
3766 }
3767 else if (readAgainForBranch2) {
3768 pull2Algorithm();
3769 }
3770 });
3771 },
3772 _closeSteps: function (chunk) {
3773 reading = false;
3774 var byobCanceled = forBranch2 ? canceled2 : canceled1;
3775 var otherCanceled = forBranch2 ? canceled1 : canceled2;
3776 if (!byobCanceled) {
3777 ReadableByteStreamControllerClose(byobBranch._readableStreamController);
3778 }
3779 if (!otherCanceled) {
3780 ReadableByteStreamControllerClose(otherBranch._readableStreamController);
3781 }
3782 if (chunk !== undefined) {
3783 if (!byobCanceled) {
3784 ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk);
3785 }
3786 if (!otherCanceled && otherBranch._readableStreamController._pendingPullIntos.length > 0) {
3787 ReadableByteStreamControllerRespond(otherBranch._readableStreamController, 0);
3788 }
3789 }
3790 if (!byobCanceled || !otherCanceled) {
3791 resolveCancelPromise(undefined);
3792 }
3793 },
3794 _errorSteps: function () {
3795 reading = false;
3796 }
3797 };
3798 ReadableStreamBYOBReaderRead(reader, view, 1, readIntoRequest);
3799 }
3800 function pull1Algorithm() {
3801 if (reading) {
3802 readAgainForBranch1 = true;
3803 return promiseResolvedWith(undefined);
3804 }
3805 reading = true;
3806 var byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch1._readableStreamController);
3807 if (byobRequest === null) {
3808 pullWithDefaultReader();
3809 }
3810 else {
3811 pullWithBYOBReader(byobRequest._view, false);
3812 }
3813 return promiseResolvedWith(undefined);
3814 }
3815 function pull2Algorithm() {
3816 if (reading) {
3817 readAgainForBranch2 = true;
3818 return promiseResolvedWith(undefined);
3819 }
3820 reading = true;
3821 var byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch2._readableStreamController);
3822 if (byobRequest === null) {
3823 pullWithDefaultReader();
3824 }
3825 else {
3826 pullWithBYOBReader(byobRequest._view, true);
3827 }
3828 return promiseResolvedWith(undefined);
3829 }
3830 function cancel1Algorithm(reason) {
3831 canceled1 = true;
3832 reason1 = reason;
3833 if (canceled2) {
3834 var compositeReason = CreateArrayFromList([reason1, reason2]);
3835 var cancelResult = ReadableStreamCancel(stream, compositeReason);
3836 resolveCancelPromise(cancelResult);
3837 }
3838 return cancelPromise;
3839 }
3840 function cancel2Algorithm(reason) {
3841 canceled2 = true;
3842 reason2 = reason;
3843 if (canceled1) {
3844 var compositeReason = CreateArrayFromList([reason1, reason2]);
3845 var cancelResult = ReadableStreamCancel(stream, compositeReason);
3846 resolveCancelPromise(cancelResult);
3847 }
3848 return cancelPromise;
3849 }
3850 function startAlgorithm() {
3851 return;
3852 }
3853 branch1 = CreateReadableByteStream(startAlgorithm, pull1Algorithm, cancel1Algorithm);
3854 branch2 = CreateReadableByteStream(startAlgorithm, pull2Algorithm, cancel2Algorithm);
3855 forwardReaderError(reader);
3856 return [branch1, branch2];
3857 }
3858
3859 function isReadableStreamLike(stream) {
3860 return typeIsObject(stream) && typeof stream.getReader !== 'undefined';
3861 }
3862
3863 function ReadableStreamFrom(source) {
3864 if (isReadableStreamLike(source)) {
3865 return ReadableStreamFromDefaultReader(source.getReader());
3866 }
3867 return ReadableStreamFromIterable(source);
3868 }
3869 function ReadableStreamFromIterable(asyncIterable) {
3870 var stream;
3871 var iteratorRecord = GetIterator(asyncIterable, 'async');
3872 var startAlgorithm = noop;
3873 function pullAlgorithm() {
3874 var nextResult;
3875 try {
3876 nextResult = IteratorNext(iteratorRecord);
3877 }
3878 catch (e) {
3879 return promiseRejectedWith(e);
3880 }
3881 var nextPromise = promiseResolvedWith(nextResult);
3882 return transformPromiseWith(nextPromise, function (iterResult) {
3883 if (!typeIsObject(iterResult)) {
3884 throw new TypeError('The promise returned by the iterator.next() method must fulfill with an object');
3885 }
3886 var done = IteratorComplete(iterResult);
3887 if (done) {
3888 ReadableStreamDefaultControllerClose(stream._readableStreamController);
3889 }
3890 else {
3891 var value = IteratorValue(iterResult);
3892 ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value);
3893 }
3894 });
3895 }
3896 function cancelAlgorithm(reason) {
3897 var iterator = iteratorRecord.iterator;
3898 var returnMethod;
3899 try {
3900 returnMethod = GetMethod(iterator, 'return');
3901 }
3902 catch (e) {
3903 return promiseRejectedWith(e);
3904 }
3905 if (returnMethod === undefined) {
3906 return promiseResolvedWith(undefined);
3907 }
3908 var returnResult;
3909 try {
3910 returnResult = reflectCall(returnMethod, iterator, [reason]);
3911 }
3912 catch (e) {
3913 return promiseRejectedWith(e);
3914 }
3915 var returnPromise = promiseResolvedWith(returnResult);
3916 return transformPromiseWith(returnPromise, function (iterResult) {
3917 if (!typeIsObject(iterResult)) {
3918 throw new TypeError('The promise returned by the iterator.return() method must fulfill with an object');
3919 }
3920 return undefined;
3921 });
3922 }
3923 stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0);
3924 return stream;
3925 }
3926 function ReadableStreamFromDefaultReader(reader) {
3927 var stream;
3928 var startAlgorithm = noop;
3929 function pullAlgorithm() {
3930 var readPromise;
3931 try {
3932 readPromise = reader.read();
3933 }
3934 catch (e) {
3935 return promiseRejectedWith(e);
3936 }
3937 return transformPromiseWith(readPromise, function (readResult) {
3938 if (!typeIsObject(readResult)) {
3939 throw new TypeError('The promise returned by the reader.read() method must fulfill with an object');
3940 }
3941 if (readResult.done) {
3942 ReadableStreamDefaultControllerClose(stream._readableStreamController);
3943 }
3944 else {
3945 var value = readResult.value;
3946 ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value);
3947 }
3948 });
3949 }
3950 function cancelAlgorithm(reason) {
3951 try {
3952 return promiseResolvedWith(reader.cancel(reason));
3953 }
3954 catch (e) {
3955 return promiseRejectedWith(e);
3956 }
3957 }
3958 stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0);
3959 return stream;
3960 }
3961
3962 function convertUnderlyingDefaultOrByteSource(source, context) {
3963 assertDictionary(source, context);
3964 var original = source;
3965 var autoAllocateChunkSize = original === null || original === void 0 ? void 0 : original.autoAllocateChunkSize;
3966 var cancel = original === null || original === void 0 ? void 0 : original.cancel;
3967 var pull = original === null || original === void 0 ? void 0 : original.pull;
3968 var start = original === null || original === void 0 ? void 0 : original.start;
3969 var type = original === null || original === void 0 ? void 0 : original.type;
3970 return {
3971 autoAllocateChunkSize: autoAllocateChunkSize === undefined ?
3972 undefined :
3973 convertUnsignedLongLongWithEnforceRange(autoAllocateChunkSize, "".concat(context, " has member 'autoAllocateChunkSize' that")),
3974 cancel: cancel === undefined ?
3975 undefined :
3976 convertUnderlyingSourceCancelCallback(cancel, original, "".concat(context, " has member 'cancel' that")),
3977 pull: pull === undefined ?
3978 undefined :
3979 convertUnderlyingSourcePullCallback(pull, original, "".concat(context, " has member 'pull' that")),
3980 start: start === undefined ?
3981 undefined :
3982 convertUnderlyingSourceStartCallback(start, original, "".concat(context, " has member 'start' that")),
3983 type: type === undefined ? undefined : convertReadableStreamType(type, "".concat(context, " has member 'type' that"))
3984 };
3985 }
3986 function convertUnderlyingSourceCancelCallback(fn, original, context) {
3987 assertFunction(fn, context);
3988 return function (reason) { return promiseCall(fn, original, [reason]); };
3989 }
3990 function convertUnderlyingSourcePullCallback(fn, original, context) {
3991 assertFunction(fn, context);
3992 return function (controller) { return promiseCall(fn, original, [controller]); };
3993 }
3994 function convertUnderlyingSourceStartCallback(fn, original, context) {
3995 assertFunction(fn, context);
3996 return function (controller) { return reflectCall(fn, original, [controller]); };
3997 }
3998 function convertReadableStreamType(type, context) {
3999 type = "".concat(type);
4000 if (type !== 'bytes') {
4001 throw new TypeError("".concat(context, " '").concat(type, "' is not a valid enumeration value for ReadableStreamType"));
4002 }
4003 return type;
4004 }
4005
4006 function convertIteratorOptions(options, context) {
4007 assertDictionary(options, context);
4008 var preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel;
4009 return { preventCancel: Boolean(preventCancel) };
4010 }
4011
4012 function convertPipeOptions(options, context) {
4013 assertDictionary(options, context);
4014 var preventAbort = options === null || options === void 0 ? void 0 : options.preventAbort;
4015 var preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel;
4016 var preventClose = options === null || options === void 0 ? void 0 : options.preventClose;
4017 var signal = options === null || options === void 0 ? void 0 : options.signal;
4018 if (signal !== undefined) {
4019 assertAbortSignal(signal, "".concat(context, " has member 'signal' that"));
4020 }
4021 return {
4022 preventAbort: Boolean(preventAbort),
4023 preventCancel: Boolean(preventCancel),
4024 preventClose: Boolean(preventClose),
4025 signal: signal
4026 };
4027 }
4028 function assertAbortSignal(signal, context) {
4029 if (!isAbortSignal(signal)) {
4030 throw new TypeError("".concat(context, " is not an AbortSignal."));
4031 }
4032 }
4033
4034 function convertReadableWritablePair(pair, context) {
4035 assertDictionary(pair, context);
4036 var readable = pair === null || pair === void 0 ? void 0 : pair.readable;
4037 assertRequiredField(readable, 'readable', 'ReadableWritablePair');
4038 assertReadableStream(readable, "".concat(context, " has member 'readable' that"));
4039 var writable = pair === null || pair === void 0 ? void 0 : pair.writable;
4040 assertRequiredField(writable, 'writable', 'ReadableWritablePair');
4041 assertWritableStream(writable, "".concat(context, " has member 'writable' that"));
4042 return { readable: readable, writable: writable };
4043 }
4044
4045 /**
4046 * A readable stream represents a source of data, from which you can read.
4047 *
4048 * @public
4049 */
4050 var ReadableStream = /** @class */ (function () {
4051 function ReadableStream(rawUnderlyingSource, rawStrategy) {
4052 if (rawUnderlyingSource === void 0) { rawUnderlyingSource = {}; }
4053 if (rawStrategy === void 0) { rawStrategy = {}; }
4054 if (rawUnderlyingSource === undefined) {
4055 rawUnderlyingSource = null;
4056 }
4057 else {
4058 assertObject(rawUnderlyingSource, 'First parameter');
4059 }
4060 var strategy = convertQueuingStrategy(rawStrategy, 'Second parameter');
4061 var underlyingSource = convertUnderlyingDefaultOrByteSource(rawUnderlyingSource, 'First parameter');
4062 InitializeReadableStream(this);
4063 if (underlyingSource.type === 'bytes') {
4064 if (strategy.size !== undefined) {
4065 throw new RangeError('The strategy for a byte stream cannot have a size function');
4066 }
4067 var highWaterMark = ExtractHighWaterMark(strategy, 0);
4068 SetUpReadableByteStreamControllerFromUnderlyingSource(this, underlyingSource, highWaterMark);
4069 }
4070 else {
4071 var sizeAlgorithm = ExtractSizeAlgorithm(strategy);
4072 var highWaterMark = ExtractHighWaterMark(strategy, 1);
4073 SetUpReadableStreamDefaultControllerFromUnderlyingSource(this, underlyingSource, highWaterMark, sizeAlgorithm);
4074 }
4075 }
4076 Object.defineProperty(ReadableStream.prototype, "locked", {
4077 /**
4078 * Whether or not the readable stream is locked to a {@link ReadableStreamDefaultReader | reader}.
4079 */
4080 get: function () {
4081 if (!IsReadableStream(this)) {
4082 throw streamBrandCheckException$1('locked');
4083 }
4084 return IsReadableStreamLocked(this);
4085 },
4086 enumerable: false,
4087 configurable: true
4088 });
4089 /**
4090 * Cancels the stream, signaling a loss of interest in the stream by a consumer.
4091 *
4092 * The supplied `reason` argument will be given to the underlying source's {@link UnderlyingSource.cancel | cancel()}
4093 * method, which might or might not use it.
4094 */
4095 ReadableStream.prototype.cancel = function (reason) {
4096 if (reason === void 0) { reason = undefined; }
4097 if (!IsReadableStream(this)) {
4098 return promiseRejectedWith(streamBrandCheckException$1('cancel'));
4099 }
4100 if (IsReadableStreamLocked(this)) {
4101 return promiseRejectedWith(new TypeError('Cannot cancel a stream that already has a reader'));
4102 }
4103 return ReadableStreamCancel(this, reason);
4104 };
4105 ReadableStream.prototype.getReader = function (rawOptions) {
4106 if (rawOptions === void 0) { rawOptions = undefined; }
4107 if (!IsReadableStream(this)) {
4108 throw streamBrandCheckException$1('getReader');
4109 }
4110 var options = convertReaderOptions(rawOptions, 'First parameter');
4111 if (options.mode === undefined) {
4112 return AcquireReadableStreamDefaultReader(this);
4113 }
4114 return AcquireReadableStreamBYOBReader(this);
4115 };
4116 ReadableStream.prototype.pipeThrough = function (rawTransform, rawOptions) {
4117 if (rawOptions === void 0) { rawOptions = {}; }
4118 if (!IsReadableStream(this)) {
4119 throw streamBrandCheckException$1('pipeThrough');
4120 }
4121 assertRequiredArgument(rawTransform, 1, 'pipeThrough');
4122 var transform = convertReadableWritablePair(rawTransform, 'First parameter');
4123 var options = convertPipeOptions(rawOptions, 'Second parameter');
4124 if (IsReadableStreamLocked(this)) {
4125 throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream');
4126 }
4127 if (IsWritableStreamLocked(transform.writable)) {
4128 throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream');
4129 }
4130 var promise = ReadableStreamPipeTo(this, transform.writable, options.preventClose, options.preventAbort, options.preventCancel, options.signal);
4131 setPromiseIsHandledToTrue(promise);
4132 return transform.readable;
4133 };
4134 ReadableStream.prototype.pipeTo = function (destination, rawOptions) {
4135 if (rawOptions === void 0) { rawOptions = {}; }
4136 if (!IsReadableStream(this)) {
4137 return promiseRejectedWith(streamBrandCheckException$1('pipeTo'));
4138 }
4139 if (destination === undefined) {
4140 return promiseRejectedWith("Parameter 1 is required in 'pipeTo'.");
4141 }
4142 if (!IsWritableStream(destination)) {
4143 return promiseRejectedWith(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));
4144 }
4145 var options;
4146 try {
4147 options = convertPipeOptions(rawOptions, 'Second parameter');
4148 }
4149 catch (e) {
4150 return promiseRejectedWith(e);
4151 }
4152 if (IsReadableStreamLocked(this)) {
4153 return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));
4154 }
4155 if (IsWritableStreamLocked(destination)) {
4156 return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));
4157 }
4158 return ReadableStreamPipeTo(this, destination, options.preventClose, options.preventAbort, options.preventCancel, options.signal);
4159 };
4160 /**
4161 * Tees this readable stream, returning a two-element array containing the two resulting branches as
4162 * new {@link ReadableStream} instances.
4163 *
4164 * Teeing a stream will lock it, preventing any other consumer from acquiring a reader.
4165 * To cancel the stream, cancel both of the resulting branches; a composite cancellation reason will then be
4166 * propagated to the stream's underlying source.
4167 *
4168 * Note that the chunks seen in each branch will be the same object. If the chunks are not immutable,
4169 * this could allow interference between the two branches.
4170 */
4171 ReadableStream.prototype.tee = function () {
4172 if (!IsReadableStream(this)) {
4173 throw streamBrandCheckException$1('tee');
4174 }
4175 var branches = ReadableStreamTee(this);
4176 return CreateArrayFromList(branches);
4177 };
4178 ReadableStream.prototype.values = function (rawOptions) {
4179 if (rawOptions === void 0) { rawOptions = undefined; }
4180 if (!IsReadableStream(this)) {
4181 throw streamBrandCheckException$1('values');
4182 }
4183 var options = convertIteratorOptions(rawOptions, 'First parameter');
4184 return AcquireReadableStreamAsyncIterator(this, options.preventCancel);
4185 };
4186 /**
4187 * Creates a new ReadableStream wrapping the provided iterable or async iterable.
4188 *
4189 * This can be used to adapt various kinds of objects into a readable stream,
4190 * such as an array, an async generator, or a Node.js readable stream.
4191 */
4192 ReadableStream.from = function (asyncIterable) {
4193 return ReadableStreamFrom(asyncIterable);
4194 };
4195 return ReadableStream;
4196 }());
4197 Object.defineProperties(ReadableStream, {
4198 from: { enumerable: true }
4199 });
4200 Object.defineProperties(ReadableStream.prototype, {
4201 cancel: { enumerable: true },
4202 getReader: { enumerable: true },
4203 pipeThrough: { enumerable: true },
4204 pipeTo: { enumerable: true },
4205 tee: { enumerable: true },
4206 values: { enumerable: true },
4207 locked: { enumerable: true }
4208 });
4209 setFunctionName(ReadableStream.from, 'from');
4210 setFunctionName(ReadableStream.prototype.cancel, 'cancel');
4211 setFunctionName(ReadableStream.prototype.getReader, 'getReader');
4212 setFunctionName(ReadableStream.prototype.pipeThrough, 'pipeThrough');
4213 setFunctionName(ReadableStream.prototype.pipeTo, 'pipeTo');
4214 setFunctionName(ReadableStream.prototype.tee, 'tee');
4215 setFunctionName(ReadableStream.prototype.values, 'values');
4216 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
4217 Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.toStringTag, {
4218 value: 'ReadableStream',
4219 configurable: true
4220 });
4221 }
4222 if (typeof SymbolPolyfill.asyncIterator === 'symbol') {
4223 Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.asyncIterator, {
4224 value: ReadableStream.prototype.values,
4225 writable: true,
4226 configurable: true
4227 });
4228 }
4229 // Abstract operations for the ReadableStream.
4230 // Throws if and only if startAlgorithm throws.
4231 function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) {
4232 if (highWaterMark === void 0) { highWaterMark = 1; }
4233 if (sizeAlgorithm === void 0) { sizeAlgorithm = function () { return 1; }; }
4234 var stream = Object.create(ReadableStream.prototype);
4235 InitializeReadableStream(stream);
4236 var controller = Object.create(ReadableStreamDefaultController.prototype);
4237 SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm);
4238 return stream;
4239 }
4240 // Throws if and only if startAlgorithm throws.
4241 function CreateReadableByteStream(startAlgorithm, pullAlgorithm, cancelAlgorithm) {
4242 var stream = Object.create(ReadableStream.prototype);
4243 InitializeReadableStream(stream);
4244 var controller = Object.create(ReadableByteStreamController.prototype);
4245 SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, 0, undefined);
4246 return stream;
4247 }
4248 function InitializeReadableStream(stream) {
4249 stream._state = 'readable';
4250 stream._reader = undefined;
4251 stream._storedError = undefined;
4252 stream._disturbed = false;
4253 }
4254 function IsReadableStream(x) {
4255 if (!typeIsObject(x)) {
4256 return false;
4257 }
4258 if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {
4259 return false;
4260 }
4261 return x instanceof ReadableStream;
4262 }
4263 function IsReadableStreamLocked(stream) {
4264 if (stream._reader === undefined) {
4265 return false;
4266 }
4267 return true;
4268 }
4269 // ReadableStream API exposed for controllers.
4270 function ReadableStreamCancel(stream, reason) {
4271 stream._disturbed = true;
4272 if (stream._state === 'closed') {
4273 return promiseResolvedWith(undefined);
4274 }
4275 if (stream._state === 'errored') {
4276 return promiseRejectedWith(stream._storedError);
4277 }
4278 ReadableStreamClose(stream);
4279 var reader = stream._reader;
4280 if (reader !== undefined && IsReadableStreamBYOBReader(reader)) {
4281 var readIntoRequests = reader._readIntoRequests;
4282 reader._readIntoRequests = new SimpleQueue();
4283 readIntoRequests.forEach(function (readIntoRequest) {
4284 readIntoRequest._closeSteps(undefined);
4285 });
4286 }
4287 var sourceCancelPromise = stream._readableStreamController[CancelSteps](reason);
4288 return transformPromiseWith(sourceCancelPromise, noop);
4289 }
4290 function ReadableStreamClose(stream) {
4291 stream._state = 'closed';
4292 var reader = stream._reader;
4293 if (reader === undefined) {
4294 return;
4295 }
4296 defaultReaderClosedPromiseResolve(reader);
4297 if (IsReadableStreamDefaultReader(reader)) {
4298 var readRequests = reader._readRequests;
4299 reader._readRequests = new SimpleQueue();
4300 readRequests.forEach(function (readRequest) {
4301 readRequest._closeSteps();
4302 });
4303 }
4304 }
4305 function ReadableStreamError(stream, e) {
4306 stream._state = 'errored';
4307 stream._storedError = e;
4308 var reader = stream._reader;
4309 if (reader === undefined) {
4310 return;
4311 }
4312 defaultReaderClosedPromiseReject(reader, e);
4313 if (IsReadableStreamDefaultReader(reader)) {
4314 ReadableStreamDefaultReaderErrorReadRequests(reader, e);
4315 }
4316 else {
4317 ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e);
4318 }
4319 }
4320 // Helper functions for the ReadableStream.
4321 function streamBrandCheckException$1(name) {
4322 return new TypeError("ReadableStream.prototype.".concat(name, " can only be used on a ReadableStream"));
4323 }
4324
4325 function convertQueuingStrategyInit(init, context) {
4326 assertDictionary(init, context);
4327 var highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark;
4328 assertRequiredField(highWaterMark, 'highWaterMark', 'QueuingStrategyInit');
4329 return {
4330 highWaterMark: convertUnrestrictedDouble(highWaterMark)
4331 };
4332 }
4333
4334 // The size function must not have a prototype property nor be a constructor
4335 var byteLengthSizeFunction = function (chunk) {
4336 return chunk.byteLength;
4337 };
4338 setFunctionName(byteLengthSizeFunction, 'size');
4339 /**
4340 * A queuing strategy that counts the number of bytes in each chunk.
4341 *
4342 * @public
4343 */
4344 var ByteLengthQueuingStrategy = /** @class */ (function () {
4345 function ByteLengthQueuingStrategy(options) {
4346 assertRequiredArgument(options, 1, 'ByteLengthQueuingStrategy');
4347 options = convertQueuingStrategyInit(options, 'First parameter');
4348 this._byteLengthQueuingStrategyHighWaterMark = options.highWaterMark;
4349 }
4350 Object.defineProperty(ByteLengthQueuingStrategy.prototype, "highWaterMark", {
4351 /**
4352 * Returns the high water mark provided to the constructor.
4353 */
4354 get: function () {
4355 if (!IsByteLengthQueuingStrategy(this)) {
4356 throw byteLengthBrandCheckException('highWaterMark');
4357 }
4358 return this._byteLengthQueuingStrategyHighWaterMark;
4359 },
4360 enumerable: false,
4361 configurable: true
4362 });
4363 Object.defineProperty(ByteLengthQueuingStrategy.prototype, "size", {
4364 /**
4365 * Measures the size of `chunk` by returning the value of its `byteLength` property.
4366 */
4367 get: function () {
4368 if (!IsByteLengthQueuingStrategy(this)) {
4369 throw byteLengthBrandCheckException('size');
4370 }
4371 return byteLengthSizeFunction;
4372 },
4373 enumerable: false,
4374 configurable: true
4375 });
4376 return ByteLengthQueuingStrategy;
4377 }());
4378 Object.defineProperties(ByteLengthQueuingStrategy.prototype, {
4379 highWaterMark: { enumerable: true },
4380 size: { enumerable: true }
4381 });
4382 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
4383 Object.defineProperty(ByteLengthQueuingStrategy.prototype, SymbolPolyfill.toStringTag, {
4384 value: 'ByteLengthQueuingStrategy',
4385 configurable: true
4386 });
4387 }
4388 // Helper functions for the ByteLengthQueuingStrategy.
4389 function byteLengthBrandCheckException(name) {
4390 return new TypeError("ByteLengthQueuingStrategy.prototype.".concat(name, " can only be used on a ByteLengthQueuingStrategy"));
4391 }
4392 function IsByteLengthQueuingStrategy(x) {
4393 if (!typeIsObject(x)) {
4394 return false;
4395 }
4396 if (!Object.prototype.hasOwnProperty.call(x, '_byteLengthQueuingStrategyHighWaterMark')) {
4397 return false;
4398 }
4399 return x instanceof ByteLengthQueuingStrategy;
4400 }
4401
4402 // The size function must not have a prototype property nor be a constructor
4403 var countSizeFunction = function () {
4404 return 1;
4405 };
4406 setFunctionName(countSizeFunction, 'size');
4407 /**
4408 * A queuing strategy that counts the number of chunks.
4409 *
4410 * @public
4411 */
4412 var CountQueuingStrategy = /** @class */ (function () {
4413 function CountQueuingStrategy(options) {
4414 assertRequiredArgument(options, 1, 'CountQueuingStrategy');
4415 options = convertQueuingStrategyInit(options, 'First parameter');
4416 this._countQueuingStrategyHighWaterMark = options.highWaterMark;
4417 }
4418 Object.defineProperty(CountQueuingStrategy.prototype, "highWaterMark", {
4419 /**
4420 * Returns the high water mark provided to the constructor.
4421 */
4422 get: function () {
4423 if (!IsCountQueuingStrategy(this)) {
4424 throw countBrandCheckException('highWaterMark');
4425 }
4426 return this._countQueuingStrategyHighWaterMark;
4427 },
4428 enumerable: false,
4429 configurable: true
4430 });
4431 Object.defineProperty(CountQueuingStrategy.prototype, "size", {
4432 /**
4433 * Measures the size of `chunk` by always returning 1.
4434 * This ensures that the total queue size is a count of the number of chunks in the queue.
4435 */
4436 get: function () {
4437 if (!IsCountQueuingStrategy(this)) {
4438 throw countBrandCheckException('size');
4439 }
4440 return countSizeFunction;
4441 },
4442 enumerable: false,
4443 configurable: true
4444 });
4445 return CountQueuingStrategy;
4446 }());
4447 Object.defineProperties(CountQueuingStrategy.prototype, {
4448 highWaterMark: { enumerable: true },
4449 size: { enumerable: true }
4450 });
4451 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
4452 Object.defineProperty(CountQueuingStrategy.prototype, SymbolPolyfill.toStringTag, {
4453 value: 'CountQueuingStrategy',
4454 configurable: true
4455 });
4456 }
4457 // Helper functions for the CountQueuingStrategy.
4458 function countBrandCheckException(name) {
4459 return new TypeError("CountQueuingStrategy.prototype.".concat(name, " can only be used on a CountQueuingStrategy"));
4460 }
4461 function IsCountQueuingStrategy(x) {
4462 if (!typeIsObject(x)) {
4463 return false;
4464 }
4465 if (!Object.prototype.hasOwnProperty.call(x, '_countQueuingStrategyHighWaterMark')) {
4466 return false;
4467 }
4468 return x instanceof CountQueuingStrategy;
4469 }
4470
4471 function convertTransformer(original, context) {
4472 assertDictionary(original, context);
4473 var cancel = original === null || original === void 0 ? void 0 : original.cancel;
4474 var flush = original === null || original === void 0 ? void 0 : original.flush;
4475 var readableType = original === null || original === void 0 ? void 0 : original.readableType;
4476 var start = original === null || original === void 0 ? void 0 : original.start;
4477 var transform = original === null || original === void 0 ? void 0 : original.transform;
4478 var writableType = original === null || original === void 0 ? void 0 : original.writableType;
4479 return {
4480 cancel: cancel === undefined ?
4481 undefined :
4482 convertTransformerCancelCallback(cancel, original, "".concat(context, " has member 'cancel' that")),
4483 flush: flush === undefined ?
4484 undefined :
4485 convertTransformerFlushCallback(flush, original, "".concat(context, " has member 'flush' that")),
4486 readableType: readableType,
4487 start: start === undefined ?
4488 undefined :
4489 convertTransformerStartCallback(start, original, "".concat(context, " has member 'start' that")),
4490 transform: transform === undefined ?
4491 undefined :
4492 convertTransformerTransformCallback(transform, original, "".concat(context, " has member 'transform' that")),
4493 writableType: writableType
4494 };
4495 }
4496 function convertTransformerFlushCallback(fn, original, context) {
4497 assertFunction(fn, context);
4498 return function (controller) { return promiseCall(fn, original, [controller]); };
4499 }
4500 function convertTransformerStartCallback(fn, original, context) {
4501 assertFunction(fn, context);
4502 return function (controller) { return reflectCall(fn, original, [controller]); };
4503 }
4504 function convertTransformerTransformCallback(fn, original, context) {
4505 assertFunction(fn, context);
4506 return function (chunk, controller) { return promiseCall(fn, original, [chunk, controller]); };
4507 }
4508 function convertTransformerCancelCallback(fn, original, context) {
4509 assertFunction(fn, context);
4510 return function (reason) { return promiseCall(fn, original, [reason]); };
4511 }
4512
4513 // Class TransformStream
4514 /**
4515 * A transform stream consists of a pair of streams: a {@link WritableStream | writable stream},
4516 * known as its writable side, and a {@link ReadableStream | readable stream}, known as its readable side.
4517 * In a manner specific to the transform stream in question, writes to the writable side result in new data being
4518 * made available for reading from the readable side.
4519 *
4520 * @public
4521 */
4522 var TransformStream = /** @class */ (function () {
4523 function TransformStream(rawTransformer, rawWritableStrategy, rawReadableStrategy) {
4524 if (rawTransformer === void 0) { rawTransformer = {}; }
4525 if (rawWritableStrategy === void 0) { rawWritableStrategy = {}; }
4526 if (rawReadableStrategy === void 0) { rawReadableStrategy = {}; }
4527 if (rawTransformer === undefined) {
4528 rawTransformer = null;
4529 }
4530 var writableStrategy = convertQueuingStrategy(rawWritableStrategy, 'Second parameter');
4531 var readableStrategy = convertQueuingStrategy(rawReadableStrategy, 'Third parameter');
4532 var transformer = convertTransformer(rawTransformer, 'First parameter');
4533 if (transformer.readableType !== undefined) {
4534 throw new RangeError('Invalid readableType specified');
4535 }
4536 if (transformer.writableType !== undefined) {
4537 throw new RangeError('Invalid writableType specified');
4538 }
4539 var readableHighWaterMark = ExtractHighWaterMark(readableStrategy, 0);
4540 var readableSizeAlgorithm = ExtractSizeAlgorithm(readableStrategy);
4541 var writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1);
4542 var writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy);
4543 var startPromise_resolve;
4544 var startPromise = newPromise(function (resolve) {
4545 startPromise_resolve = resolve;
4546 });
4547 InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
4548 SetUpTransformStreamDefaultControllerFromTransformer(this, transformer);
4549 if (transformer.start !== undefined) {
4550 startPromise_resolve(transformer.start(this._transformStreamController));
4551 }
4552 else {
4553 startPromise_resolve(undefined);
4554 }
4555 }
4556 Object.defineProperty(TransformStream.prototype, "readable", {
4557 /**
4558 * The readable side of the transform stream.
4559 */
4560 get: function () {
4561 if (!IsTransformStream(this)) {
4562 throw streamBrandCheckException('readable');
4563 }
4564 return this._readable;
4565 },
4566 enumerable: false,
4567 configurable: true
4568 });
4569 Object.defineProperty(TransformStream.prototype, "writable", {
4570 /**
4571 * The writable side of the transform stream.
4572 */
4573 get: function () {
4574 if (!IsTransformStream(this)) {
4575 throw streamBrandCheckException('writable');
4576 }
4577 return this._writable;
4578 },
4579 enumerable: false,
4580 configurable: true
4581 });
4582 return TransformStream;
4583 }());
4584 Object.defineProperties(TransformStream.prototype, {
4585 readable: { enumerable: true },
4586 writable: { enumerable: true }
4587 });
4588 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
4589 Object.defineProperty(TransformStream.prototype, SymbolPolyfill.toStringTag, {
4590 value: 'TransformStream',
4591 configurable: true
4592 });
4593 }
4594 function InitializeTransformStream(stream, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) {
4595 function startAlgorithm() {
4596 return startPromise;
4597 }
4598 function writeAlgorithm(chunk) {
4599 return TransformStreamDefaultSinkWriteAlgorithm(stream, chunk);
4600 }
4601 function abortAlgorithm(reason) {
4602 return TransformStreamDefaultSinkAbortAlgorithm(stream, reason);
4603 }
4604 function closeAlgorithm() {
4605 return TransformStreamDefaultSinkCloseAlgorithm(stream);
4606 }
4607 stream._writable = CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark, writableSizeAlgorithm);
4608 function pullAlgorithm() {
4609 return TransformStreamDefaultSourcePullAlgorithm(stream);
4610 }
4611 function cancelAlgorithm(reason) {
4612 return TransformStreamDefaultSourceCancelAlgorithm(stream, reason);
4613 }
4614 stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
4615 // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure.
4616 stream._backpressure = undefined;
4617 stream._backpressureChangePromise = undefined;
4618 stream._backpressureChangePromise_resolve = undefined;
4619 TransformStreamSetBackpressure(stream, true);
4620 stream._transformStreamController = undefined;
4621 }
4622 function IsTransformStream(x) {
4623 if (!typeIsObject(x)) {
4624 return false;
4625 }
4626 if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {
4627 return false;
4628 }
4629 return x instanceof TransformStream;
4630 }
4631 // This is a no-op if both sides are already errored.
4632 function TransformStreamError(stream, e) {
4633 ReadableStreamDefaultControllerError(stream._readable._readableStreamController, e);
4634 TransformStreamErrorWritableAndUnblockWrite(stream, e);
4635 }
4636 function TransformStreamErrorWritableAndUnblockWrite(stream, e) {
4637 TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController);
4638 WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e);
4639 TransformStreamUnblockWrite(stream);
4640 }
4641 function TransformStreamUnblockWrite(stream) {
4642 if (stream._backpressure) {
4643 // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure()
4644 // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time
4645 // _backpressure is set.
4646 TransformStreamSetBackpressure(stream, false);
4647 }
4648 }
4649 function TransformStreamSetBackpressure(stream, backpressure) {
4650 // Passes also when called during construction.
4651 if (stream._backpressureChangePromise !== undefined) {
4652 stream._backpressureChangePromise_resolve();
4653 }
4654 stream._backpressureChangePromise = newPromise(function (resolve) {
4655 stream._backpressureChangePromise_resolve = resolve;
4656 });
4657 stream._backpressure = backpressure;
4658 }
4659 // Class TransformStreamDefaultController
4660 /**
4661 * Allows control of the {@link ReadableStream} and {@link WritableStream} of the associated {@link TransformStream}.
4662 *
4663 * @public
4664 */
4665 var TransformStreamDefaultController = /** @class */ (function () {
4666 function TransformStreamDefaultController() {
4667 throw new TypeError('Illegal constructor');
4668 }
4669 Object.defineProperty(TransformStreamDefaultController.prototype, "desiredSize", {
4670 /**
4671 * Returns the desired size to fill the readable side’s internal queue. It can be negative, if the queue is over-full.
4672 */
4673 get: function () {
4674 if (!IsTransformStreamDefaultController(this)) {
4675 throw defaultControllerBrandCheckException('desiredSize');
4676 }
4677 var readableController = this._controlledTransformStream._readable._readableStreamController;
4678 return ReadableStreamDefaultControllerGetDesiredSize(readableController);
4679 },
4680 enumerable: false,
4681 configurable: true
4682 });
4683 TransformStreamDefaultController.prototype.enqueue = function (chunk) {
4684 if (chunk === void 0) { chunk = undefined; }
4685 if (!IsTransformStreamDefaultController(this)) {
4686 throw defaultControllerBrandCheckException('enqueue');
4687 }
4688 TransformStreamDefaultControllerEnqueue(this, chunk);
4689 };
4690 /**
4691 * Errors both the readable side and the writable side of the controlled transform stream, making all future
4692 * interactions with it fail with the given error `e`. Any chunks queued for transformation will be discarded.
4693 */
4694 TransformStreamDefaultController.prototype.error = function (reason) {
4695 if (reason === void 0) { reason = undefined; }
4696 if (!IsTransformStreamDefaultController(this)) {
4697 throw defaultControllerBrandCheckException('error');
4698 }
4699 TransformStreamDefaultControllerError(this, reason);
4700 };
4701 /**
4702 * Closes the readable side and errors the writable side of the controlled transform stream. This is useful when the
4703 * transformer only needs to consume a portion of the chunks written to the writable side.
4704 */
4705 TransformStreamDefaultController.prototype.terminate = function () {
4706 if (!IsTransformStreamDefaultController(this)) {
4707 throw defaultControllerBrandCheckException('terminate');
4708 }
4709 TransformStreamDefaultControllerTerminate(this);
4710 };
4711 return TransformStreamDefaultController;
4712 }());
4713 Object.defineProperties(TransformStreamDefaultController.prototype, {
4714 enqueue: { enumerable: true },
4715 error: { enumerable: true },
4716 terminate: { enumerable: true },
4717 desiredSize: { enumerable: true }
4718 });
4719 setFunctionName(TransformStreamDefaultController.prototype.enqueue, 'enqueue');
4720 setFunctionName(TransformStreamDefaultController.prototype.error, 'error');
4721 setFunctionName(TransformStreamDefaultController.prototype.terminate, 'terminate');
4722 if (typeof SymbolPolyfill.toStringTag === 'symbol') {
4723 Object.defineProperty(TransformStreamDefaultController.prototype, SymbolPolyfill.toStringTag, {
4724 value: 'TransformStreamDefaultController',
4725 configurable: true
4726 });
4727 }
4728 // Transform Stream Default Controller Abstract Operations
4729 function IsTransformStreamDefaultController(x) {
4730 if (!typeIsObject(x)) {
4731 return false;
4732 }
4733 if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {
4734 return false;
4735 }
4736 return x instanceof TransformStreamDefaultController;
4737 }
4738 function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm) {
4739 controller._controlledTransformStream = stream;
4740 stream._transformStreamController = controller;
4741 controller._transformAlgorithm = transformAlgorithm;
4742 controller._flushAlgorithm = flushAlgorithm;
4743 controller._cancelAlgorithm = cancelAlgorithm;
4744 controller._finishPromise = undefined;
4745 controller._finishPromise_resolve = undefined;
4746 controller._finishPromise_reject = undefined;
4747 }
4748 function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) {
4749 var controller = Object.create(TransformStreamDefaultController.prototype);
4750 var transformAlgorithm;
4751 var flushAlgorithm;
4752 var cancelAlgorithm;
4753 if (transformer.transform !== undefined) {
4754 transformAlgorithm = function (chunk) { return transformer.transform(chunk, controller); };
4755 }
4756 else {
4757 transformAlgorithm = function (chunk) {
4758 try {
4759 TransformStreamDefaultControllerEnqueue(controller, chunk);
4760 return promiseResolvedWith(undefined);
4761 }
4762 catch (transformResultE) {
4763 return promiseRejectedWith(transformResultE);
4764 }
4765 };
4766 }
4767 if (transformer.flush !== undefined) {
4768 flushAlgorithm = function () { return transformer.flush(controller); };
4769 }
4770 else {
4771 flushAlgorithm = function () { return promiseResolvedWith(undefined); };
4772 }
4773 if (transformer.cancel !== undefined) {
4774 cancelAlgorithm = function (reason) { return transformer.cancel(reason); };
4775 }
4776 else {
4777 cancelAlgorithm = function () { return promiseResolvedWith(undefined); };
4778 }
4779 SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm);
4780 }
4781 function TransformStreamDefaultControllerClearAlgorithms(controller) {
4782 controller._transformAlgorithm = undefined;
4783 controller._flushAlgorithm = undefined;
4784 controller._cancelAlgorithm = undefined;
4785 }
4786 function TransformStreamDefaultControllerEnqueue(controller, chunk) {
4787 var stream = controller._controlledTransformStream;
4788 var readableController = stream._readable._readableStreamController;
4789 if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(readableController)) {
4790 throw new TypeError('Readable side is not in a state that permits enqueue');
4791 }
4792 // We throttle transform invocations based on the backpressure of the ReadableStream, but we still
4793 // accept TransformStreamDefaultControllerEnqueue() calls.
4794 try {
4795 ReadableStreamDefaultControllerEnqueue(readableController, chunk);
4796 }
4797 catch (e) {
4798 // This happens when readableStrategy.size() throws.
4799 TransformStreamErrorWritableAndUnblockWrite(stream, e);
4800 throw stream._readable._storedError;
4801 }
4802 var backpressure = ReadableStreamDefaultControllerHasBackpressure(readableController);
4803 if (backpressure !== stream._backpressure) {
4804 TransformStreamSetBackpressure(stream, true);
4805 }
4806 }
4807 function TransformStreamDefaultControllerError(controller, e) {
4808 TransformStreamError(controller._controlledTransformStream, e);
4809 }
4810 function TransformStreamDefaultControllerPerformTransform(controller, chunk) {
4811 var transformPromise = controller._transformAlgorithm(chunk);
4812 return transformPromiseWith(transformPromise, undefined, function (r) {
4813 TransformStreamError(controller._controlledTransformStream, r);
4814 throw r;
4815 });
4816 }
4817 function TransformStreamDefaultControllerTerminate(controller) {
4818 var stream = controller._controlledTransformStream;
4819 var readableController = stream._readable._readableStreamController;
4820 ReadableStreamDefaultControllerClose(readableController);
4821 var error = new TypeError('TransformStream terminated');
4822 TransformStreamErrorWritableAndUnblockWrite(stream, error);
4823 }
4824 // TransformStreamDefaultSink Algorithms
4825 function TransformStreamDefaultSinkWriteAlgorithm(stream, chunk) {
4826 var controller = stream._transformStreamController;
4827 if (stream._backpressure) {
4828 var backpressureChangePromise = stream._backpressureChangePromise;
4829 return transformPromiseWith(backpressureChangePromise, function () {
4830 var writable = stream._writable;
4831 var state = writable._state;
4832 if (state === 'erroring') {
4833 throw writable._storedError;
4834 }
4835 return TransformStreamDefaultControllerPerformTransform(controller, chunk);
4836 });
4837 }
4838 return TransformStreamDefaultControllerPerformTransform(controller, chunk);
4839 }
4840 function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) {
4841 var controller = stream._transformStreamController;
4842 if (controller._finishPromise !== undefined) {
4843 return controller._finishPromise;
4844 }
4845 // stream._readable cannot change after construction, so caching it across a call to user code is safe.
4846 var readable = stream._readable;
4847 // Assign the _finishPromise now so that if _cancelAlgorithm calls readable.cancel() internally,
4848 // we don't run the _cancelAlgorithm again.
4849 controller._finishPromise = newPromise(function (resolve, reject) {
4850 controller._finishPromise_resolve = resolve;
4851 controller._finishPromise_reject = reject;
4852 });
4853 var cancelPromise = controller._cancelAlgorithm(reason);
4854 TransformStreamDefaultControllerClearAlgorithms(controller);
4855 uponPromise(cancelPromise, function () {
4856 if (readable._state === 'errored') {
4857 defaultControllerFinishPromiseReject(controller, readable._storedError);
4858 }
4859 else {
4860 ReadableStreamDefaultControllerError(readable._readableStreamController, reason);
4861 defaultControllerFinishPromiseResolve(controller);
4862 }
4863 return null;
4864 }, function (r) {
4865 ReadableStreamDefaultControllerError(readable._readableStreamController, r);
4866 defaultControllerFinishPromiseReject(controller, r);
4867 return null;
4868 });
4869 return controller._finishPromise;
4870 }
4871 function TransformStreamDefaultSinkCloseAlgorithm(stream) {
4872 var controller = stream._transformStreamController;
4873 if (controller._finishPromise !== undefined) {
4874 return controller._finishPromise;
4875 }
4876 // stream._readable cannot change after construction, so caching it across a call to user code is safe.
4877 var readable = stream._readable;
4878 // Assign the _finishPromise now so that if _flushAlgorithm calls readable.cancel() internally,
4879 // we don't also run the _cancelAlgorithm.
4880 controller._finishPromise = newPromise(function (resolve, reject) {
4881 controller._finishPromise_resolve = resolve;
4882 controller._finishPromise_reject = reject;
4883 });
4884 var flushPromise = controller._flushAlgorithm();
4885 TransformStreamDefaultControllerClearAlgorithms(controller);
4886 uponPromise(flushPromise, function () {
4887 if (readable._state === 'errored') {
4888 defaultControllerFinishPromiseReject(controller, readable._storedError);
4889 }
4890 else {
4891 ReadableStreamDefaultControllerClose(readable._readableStreamController);
4892 defaultControllerFinishPromiseResolve(controller);
4893 }
4894 return null;
4895 }, function (r) {
4896 ReadableStreamDefaultControllerError(readable._readableStreamController, r);
4897 defaultControllerFinishPromiseReject(controller, r);
4898 return null;
4899 });
4900 return controller._finishPromise;
4901 }
4902 // TransformStreamDefaultSource Algorithms
4903 function TransformStreamDefaultSourcePullAlgorithm(stream) {
4904 // Invariant. Enforced by the promises returned by start() and pull().
4905 TransformStreamSetBackpressure(stream, false);
4906 // Prevent the next pull() call until there is backpressure.
4907 return stream._backpressureChangePromise;
4908 }
4909 function TransformStreamDefaultSourceCancelAlgorithm(stream, reason) {
4910 var controller = stream._transformStreamController;
4911 if (controller._finishPromise !== undefined) {
4912 return controller._finishPromise;
4913 }
4914 // stream._writable cannot change after construction, so caching it across a call to user code is safe.
4915 var writable = stream._writable;
4916 // Assign the _finishPromise now so that if _flushAlgorithm calls writable.abort() or
4917 // writable.cancel() internally, we don't run the _cancelAlgorithm again, or also run the
4918 // _flushAlgorithm.
4919 controller._finishPromise = newPromise(function (resolve, reject) {
4920 controller._finishPromise_resolve = resolve;
4921 controller._finishPromise_reject = reject;
4922 });
4923 var cancelPromise = controller._cancelAlgorithm(reason);
4924 TransformStreamDefaultControllerClearAlgorithms(controller);
4925 uponPromise(cancelPromise, function () {
4926 if (writable._state === 'errored') {
4927 defaultControllerFinishPromiseReject(controller, writable._storedError);
4928 }
4929 else {
4930 WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, reason);
4931 TransformStreamUnblockWrite(stream);
4932 defaultControllerFinishPromiseResolve(controller);
4933 }
4934 return null;
4935 }, function (r) {
4936 WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, r);
4937 TransformStreamUnblockWrite(stream);
4938 defaultControllerFinishPromiseReject(controller, r);
4939 return null;
4940 });
4941 return controller._finishPromise;
4942 }
4943 // Helper functions for the TransformStreamDefaultController.
4944 function defaultControllerBrandCheckException(name) {
4945 return new TypeError("TransformStreamDefaultController.prototype.".concat(name, " can only be used on a TransformStreamDefaultController"));
4946 }
4947 function defaultControllerFinishPromiseResolve(controller) {
4948 if (controller._finishPromise_resolve === undefined) {
4949 return;
4950 }
4951 controller._finishPromise_resolve();
4952 controller._finishPromise_resolve = undefined;
4953 controller._finishPromise_reject = undefined;
4954 }
4955 function defaultControllerFinishPromiseReject(controller, reason) {
4956 if (controller._finishPromise_reject === undefined) {
4957 return;
4958 }
4959 setPromiseIsHandledToTrue(controller._finishPromise);
4960 controller._finishPromise_reject(reason);
4961 controller._finishPromise_resolve = undefined;
4962 controller._finishPromise_reject = undefined;
4963 }
4964 // Helper functions for the TransformStream.
4965 function streamBrandCheckException(name) {
4966 return new TypeError("TransformStream.prototype.".concat(name, " can only be used on a TransformStream"));
4967 }
4968
4969 var exports$1 = {
4970 ReadableStream: ReadableStream,
4971 ReadableStreamDefaultController: ReadableStreamDefaultController,
4972 ReadableByteStreamController: ReadableByteStreamController,
4973 ReadableStreamBYOBRequest: ReadableStreamBYOBRequest,
4974 ReadableStreamDefaultReader: ReadableStreamDefaultReader,
4975 ReadableStreamBYOBReader: ReadableStreamBYOBReader,
4976 WritableStream: WritableStream,
4977 WritableStreamDefaultController: WritableStreamDefaultController,
4978 WritableStreamDefaultWriter: WritableStreamDefaultWriter,
4979 ByteLengthQueuingStrategy: ByteLengthQueuingStrategy,
4980 CountQueuingStrategy: CountQueuingStrategy,
4981 TransformStream: TransformStream,
4982 TransformStreamDefaultController: TransformStreamDefaultController
4983 };
4984 // Add classes to global scope
4985 if (typeof globals !== 'undefined') {
4986 for (var prop in exports$1) {
4987 if (Object.prototype.hasOwnProperty.call(exports$1, prop)) {
4988 Object.defineProperty(globals, prop, {
4989 value: exports$1[prop],
4990 writable: true,
4991 configurable: true
4992 });
4993 }
4994 }
4995 }
4996
4997 exports.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy;
4998 exports.CountQueuingStrategy = CountQueuingStrategy;
4999 exports.ReadableByteStreamController = ReadableByteStreamController;
5000 exports.ReadableStream = ReadableStream;
5001 exports.ReadableStreamBYOBReader = ReadableStreamBYOBReader;
5002 exports.ReadableStreamBYOBRequest = ReadableStreamBYOBRequest;
5003 exports.ReadableStreamDefaultController = ReadableStreamDefaultController;
5004 exports.ReadableStreamDefaultReader = ReadableStreamDefaultReader;
5005 exports.TransformStream = TransformStream;
5006 exports.TransformStreamDefaultController = TransformStreamDefaultController;
5007 exports.WritableStream = WritableStream;
5008 exports.WritableStreamDefaultController = WritableStreamDefaultController;
5009 exports.WritableStreamDefaultWriter = WritableStreamDefaultWriter;
5010
5011}));
5012//# sourceMappingURL=polyfill.js.map
Note: See TracBrowser for help on using the repository browser.