|
@@ -1,3962 +0,0 @@
|
|
|
-/*
|
|
|
- * To the extent possible under law, the authors have dedicated all copyright
|
|
|
- * and related and neighboring rights to this software to the public
|
|
|
- * domain worldwide. This software is distributed without any warranty.
|
|
|
- *
|
|
|
- * You should have received a copy of the CC0 Public Domain Dedication along
|
|
|
- * with this software. If not, see https://creativecommons.org/publicdomain/zero/1.0/.
|
|
|
- */
|
|
|
-
|
|
|
-(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap
|
|
|
-/******/ // The module cache
|
|
|
-/******/ var installedModules = {};
|
|
|
-/******/
|
|
|
-/******/ // The require function
|
|
|
-/******/ function __webpack_require__(moduleId) {
|
|
|
-/******/
|
|
|
-/******/ // Check if module is in cache
|
|
|
-/******/ if(installedModules[moduleId])
|
|
|
-/******/ return installedModules[moduleId].exports;
|
|
|
-/******/
|
|
|
-/******/ // Create a new module (and put it into the cache)
|
|
|
-/******/ var module = installedModules[moduleId] = {
|
|
|
-/******/ i: moduleId,
|
|
|
-/******/ l: false,
|
|
|
-/******/ exports: {}
|
|
|
-/******/ };
|
|
|
-/******/
|
|
|
-/******/ // Execute the module function
|
|
|
-/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
|
-/******/
|
|
|
-/******/ // Flag the module as loaded
|
|
|
-/******/ module.l = true;
|
|
|
-/******/
|
|
|
-/******/ // Return the exports of the module
|
|
|
-/******/ return module.exports;
|
|
|
-/******/ }
|
|
|
-/******/
|
|
|
-/******/
|
|
|
-/******/ // expose the modules object (__webpack_modules__)
|
|
|
-/******/ __webpack_require__.m = modules;
|
|
|
-/******/
|
|
|
-/******/ // expose the module cache
|
|
|
-/******/ __webpack_require__.c = installedModules;
|
|
|
-/******/
|
|
|
-/******/ // identity function for calling harmony imports with the correct context
|
|
|
-/******/ __webpack_require__.i = function(value) { return value; };
|
|
|
-/******/
|
|
|
-/******/ // define getter function for harmony exports
|
|
|
-/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
|
-/******/ if(!__webpack_require__.o(exports, name)) {
|
|
|
-/******/ Object.defineProperty(exports, name, {
|
|
|
-/******/ configurable: false,
|
|
|
-/******/ enumerable: true,
|
|
|
-/******/ get: getter
|
|
|
-/******/ });
|
|
|
-/******/ }
|
|
|
-/******/ };
|
|
|
-/******/
|
|
|
-/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
|
-/******/ __webpack_require__.n = function(module) {
|
|
|
-/******/ var getter = module && module.__esModule ?
|
|
|
-/******/ function getDefault() { return module['default']; } :
|
|
|
-/******/ function getModuleExports() { return module; };
|
|
|
-/******/ __webpack_require__.d(getter, 'a', getter);
|
|
|
-/******/ return getter;
|
|
|
-/******/ };
|
|
|
-/******/
|
|
|
-/******/ // Object.prototype.hasOwnProperty.call
|
|
|
-/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
|
-/******/
|
|
|
-/******/ // __webpack_public_path__
|
|
|
-/******/ __webpack_require__.p = "";
|
|
|
-/******/
|
|
|
-/******/ // Load entry module and return exports
|
|
|
-/******/ return __webpack_require__(__webpack_require__.s = 7);
|
|
|
-/******/ })
|
|
|
-/************************************************************************/
|
|
|
-/******/ ([
|
|
|
-/* 0 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-"use strict";
|
|
|
-
|
|
|
-
|
|
|
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
-
|
|
|
-var _require = __webpack_require__(1),
|
|
|
- assert = _require.assert;
|
|
|
-
|
|
|
-function IsPropertyKey(argument) {
|
|
|
- return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';
|
|
|
-}
|
|
|
-
|
|
|
-exports.typeIsObject = function (x) {
|
|
|
- return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';
|
|
|
-};
|
|
|
-
|
|
|
-exports.createDataProperty = function (o, p, v) {
|
|
|
- assert(exports.typeIsObject(o));
|
|
|
- Object.defineProperty(o, p, { value: v, writable: true, enumerable: true, configurable: true });
|
|
|
-};
|
|
|
-
|
|
|
-exports.createArrayFromList = function (elements) {
|
|
|
- // We use arrays to represent lists, so this is basically a no-op.
|
|
|
- // Do a slice though just in case we happen to depend on the unique-ness.
|
|
|
- return elements.slice();
|
|
|
-};
|
|
|
-
|
|
|
-exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {
|
|
|
- new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
|
|
|
-};
|
|
|
-
|
|
|
-exports.CreateIterResultObject = function (value, done) {
|
|
|
- assert(typeof done === 'boolean');
|
|
|
- var obj = {};
|
|
|
- Object.defineProperty(obj, 'value', { value: value, enumerable: true, writable: true, configurable: true });
|
|
|
- Object.defineProperty(obj, 'done', { value: done, enumerable: true, writable: true, configurable: true });
|
|
|
- return obj;
|
|
|
-};
|
|
|
-
|
|
|
-exports.IsFiniteNonNegativeNumber = function (v) {
|
|
|
- if (Number.isNaN(v)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (v === Infinity) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (v < 0) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-};
|
|
|
-
|
|
|
-function Call(F, V, args) {
|
|
|
- if (typeof F !== 'function') {
|
|
|
- throw new TypeError('Argument is not a function');
|
|
|
- }
|
|
|
-
|
|
|
- return Function.prototype.apply.call(F, V, args);
|
|
|
-}
|
|
|
-
|
|
|
-exports.InvokeOrNoop = function (O, P, args) {
|
|
|
- assert(O !== undefined);
|
|
|
- assert(IsPropertyKey(P));
|
|
|
- assert(Array.isArray(args));
|
|
|
-
|
|
|
- var method = O[P];
|
|
|
- if (method === undefined) {
|
|
|
- return undefined;
|
|
|
- }
|
|
|
-
|
|
|
- return Call(method, O, args);
|
|
|
-};
|
|
|
-
|
|
|
-exports.PromiseInvokeOrNoop = function (O, P, args) {
|
|
|
- assert(O !== undefined);
|
|
|
- assert(IsPropertyKey(P));
|
|
|
- assert(Array.isArray(args));
|
|
|
- try {
|
|
|
- return Promise.resolve(exports.InvokeOrNoop(O, P, args));
|
|
|
- } catch (returnValueE) {
|
|
|
- return Promise.reject(returnValueE);
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {
|
|
|
- assert(O !== undefined);
|
|
|
- assert(IsPropertyKey(P));
|
|
|
- assert(Array.isArray(args));
|
|
|
- assert(Array.isArray(argsF));
|
|
|
-
|
|
|
- var method = void 0;
|
|
|
- try {
|
|
|
- method = O[P];
|
|
|
- } catch (methodE) {
|
|
|
- return Promise.reject(methodE);
|
|
|
- }
|
|
|
-
|
|
|
- if (method === undefined) {
|
|
|
- return F.apply(null, argsF);
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- return Promise.resolve(Call(method, O, args));
|
|
|
- } catch (e) {
|
|
|
- return Promise.reject(e);
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-// Not implemented correctly
|
|
|
-exports.TransferArrayBuffer = function (O) {
|
|
|
- return O.slice();
|
|
|
-};
|
|
|
-
|
|
|
-exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {
|
|
|
- highWaterMark = Number(highWaterMark);
|
|
|
- if (Number.isNaN(highWaterMark) || highWaterMark < 0) {
|
|
|
- throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');
|
|
|
- }
|
|
|
-
|
|
|
- return highWaterMark;
|
|
|
-};
|
|
|
-
|
|
|
-exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {
|
|
|
- if (size !== undefined && typeof size !== 'function') {
|
|
|
- throw new TypeError('size property of a queuing strategy must be a function');
|
|
|
- }
|
|
|
-
|
|
|
- highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);
|
|
|
-
|
|
|
- return { size: size, highWaterMark: highWaterMark };
|
|
|
-};
|
|
|
-
|
|
|
-/***/ }),
|
|
|
-/* 1 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-"use strict";
|
|
|
-
|
|
|
-
|
|
|
-function rethrowAssertionErrorRejection(e) {
|
|
|
- // Used throughout the reference implementation, as `.catch(rethrowAssertionErrorRejection)`, to ensure any errors
|
|
|
- // get shown. There are places in the spec where we do promise transformations and purposefully ignore or don't
|
|
|
- // expect any errors, but assertion errors are always problematic.
|
|
|
- if (e && e.constructor === AssertionError) {
|
|
|
- setTimeout(function () {
|
|
|
- throw e;
|
|
|
- }, 0);
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-function AssertionError(message) {
|
|
|
- this.name = 'AssertionError';
|
|
|
- this.message = message || '';
|
|
|
- this.stack = new Error().stack;
|
|
|
-}
|
|
|
-AssertionError.prototype = Object.create(Error.prototype);
|
|
|
-AssertionError.prototype.constructor = AssertionError;
|
|
|
-
|
|
|
-function assert(value, message) {
|
|
|
- if (!value) {
|
|
|
- throw new AssertionError(message);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-module.exports = {
|
|
|
- rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,
|
|
|
- AssertionError: AssertionError,
|
|
|
- assert: assert
|
|
|
-};
|
|
|
-
|
|
|
-/***/ }),
|
|
|
-/* 2 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-"use strict";
|
|
|
-
|
|
|
-
|
|
|
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
-
|
|
|
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
-
|
|
|
-var _require = __webpack_require__(0),
|
|
|
- InvokeOrNoop = _require.InvokeOrNoop,
|
|
|
- PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
|
|
|
- ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
|
|
|
- typeIsObject = _require.typeIsObject;
|
|
|
-
|
|
|
-var _require2 = __webpack_require__(1),
|
|
|
- assert = _require2.assert,
|
|
|
- rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;
|
|
|
-
|
|
|
-var _require3 = __webpack_require__(3),
|
|
|
- DequeueValue = _require3.DequeueValue,
|
|
|
- EnqueueValueWithSize = _require3.EnqueueValueWithSize,
|
|
|
- PeekQueueValue = _require3.PeekQueueValue,
|
|
|
- ResetQueue = _require3.ResetQueue;
|
|
|
-
|
|
|
-var WritableStream = function () {
|
|
|
- function WritableStream() {
|
|
|
- var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
-
|
|
|
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
|
- size = _ref.size,
|
|
|
- _ref$highWaterMark = _ref.highWaterMark,
|
|
|
- highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;
|
|
|
-
|
|
|
- _classCallCheck(this, WritableStream);
|
|
|
-
|
|
|
- this._state = 'writable';
|
|
|
-
|
|
|
- // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is
|
|
|
- // 'erroring' or 'errored'. May be set to an undefined value.
|
|
|
- this._storedError = undefined;
|
|
|
-
|
|
|
- this._writer = undefined;
|
|
|
-
|
|
|
- // Initialize to undefined first because the constructor of the controller checks this
|
|
|
- // variable to validate the caller.
|
|
|
- this._writableStreamController = undefined;
|
|
|
-
|
|
|
- // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data
|
|
|
- // producer without waiting for the queued writes to finish.
|
|
|
- this._writeRequests = [];
|
|
|
-
|
|
|
- // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents
|
|
|
- // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here.
|
|
|
- this._inFlightWriteRequest = undefined;
|
|
|
-
|
|
|
- // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer
|
|
|
- // has been detached.
|
|
|
- this._closeRequest = undefined;
|
|
|
-
|
|
|
- // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it
|
|
|
- // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here.
|
|
|
- this._inFlightCloseRequest = undefined;
|
|
|
-
|
|
|
- // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached.
|
|
|
- this._pendingAbortRequest = undefined;
|
|
|
-
|
|
|
- // The backpressure signal set by the controller.
|
|
|
- this._backpressure = false;
|
|
|
-
|
|
|
- var type = underlyingSink.type;
|
|
|
-
|
|
|
- if (type !== undefined) {
|
|
|
- throw new RangeError('Invalid type is specified');
|
|
|
- }
|
|
|
-
|
|
|
- this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);
|
|
|
- this._writableStreamController.__startSteps();
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(WritableStream, [{
|
|
|
- key: 'abort',
|
|
|
- value: function abort(reason) {
|
|
|
- if (IsWritableStream(this) === false) {
|
|
|
- return Promise.reject(streamBrandCheckException('abort'));
|
|
|
- }
|
|
|
-
|
|
|
- if (IsWritableStreamLocked(this) === true) {
|
|
|
- return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));
|
|
|
- }
|
|
|
-
|
|
|
- return WritableStreamAbort(this, reason);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'getWriter',
|
|
|
- value: function getWriter() {
|
|
|
- if (IsWritableStream(this) === false) {
|
|
|
- throw streamBrandCheckException('getWriter');
|
|
|
- }
|
|
|
-
|
|
|
- return AcquireWritableStreamDefaultWriter(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'locked',
|
|
|
- get: function get() {
|
|
|
- if (IsWritableStream(this) === false) {
|
|
|
- throw streamBrandCheckException('locked');
|
|
|
- }
|
|
|
-
|
|
|
- return IsWritableStreamLocked(this);
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return WritableStream;
|
|
|
-}();
|
|
|
-
|
|
|
-module.exports = {
|
|
|
- AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,
|
|
|
- IsWritableStream: IsWritableStream,
|
|
|
- IsWritableStreamLocked: IsWritableStreamLocked,
|
|
|
- WritableStream: WritableStream,
|
|
|
- WritableStreamAbort: WritableStreamAbort,
|
|
|
- WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,
|
|
|
- WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,
|
|
|
- WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,
|
|
|
- WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,
|
|
|
- WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight
|
|
|
-};
|
|
|
-
|
|
|
-// Abstract operations for the WritableStream.
|
|
|
-
|
|
|
-function AcquireWritableStreamDefaultWriter(stream) {
|
|
|
- return new WritableStreamDefaultWriter(stream);
|
|
|
-}
|
|
|
-
|
|
|
-function IsWritableStream(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function IsWritableStreamLocked(stream) {
|
|
|
- assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');
|
|
|
-
|
|
|
- if (stream._writer === undefined) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamAbort(stream, reason) {
|
|
|
- var state = stream._state;
|
|
|
- if (state === 'closed') {
|
|
|
- return Promise.resolve(undefined);
|
|
|
- }
|
|
|
- if (state === 'errored') {
|
|
|
- return Promise.reject(stream._storedError);
|
|
|
- }
|
|
|
- var error = new TypeError('Requested to abort');
|
|
|
- if (stream._pendingAbortRequest !== undefined) {
|
|
|
- return Promise.reject(error);
|
|
|
- }
|
|
|
-
|
|
|
- assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');
|
|
|
-
|
|
|
- var wasAlreadyErroring = false;
|
|
|
- if (state === 'erroring') {
|
|
|
- wasAlreadyErroring = true;
|
|
|
- // reason will not be used, so don't keep a reference to it.
|
|
|
- reason = undefined;
|
|
|
- }
|
|
|
-
|
|
|
- var promise = new Promise(function (resolve, reject) {
|
|
|
- stream._pendingAbortRequest = {
|
|
|
- _resolve: resolve,
|
|
|
- _reject: reject,
|
|
|
- _reason: reason,
|
|
|
- _wasAlreadyErroring: wasAlreadyErroring
|
|
|
- };
|
|
|
- });
|
|
|
-
|
|
|
- if (wasAlreadyErroring === false) {
|
|
|
- WritableStreamStartErroring(stream, error);
|
|
|
- }
|
|
|
-
|
|
|
- return promise;
|
|
|
-}
|
|
|
-
|
|
|
-// WritableStream API exposed for controllers.
|
|
|
-
|
|
|
-function WritableStreamAddWriteRequest(stream) {
|
|
|
- assert(IsWritableStreamLocked(stream) === true);
|
|
|
- assert(stream._state === 'writable');
|
|
|
-
|
|
|
- var promise = new Promise(function (resolve, reject) {
|
|
|
- var writeRequest = {
|
|
|
- _resolve: resolve,
|
|
|
- _reject: reject
|
|
|
- };
|
|
|
-
|
|
|
- stream._writeRequests.push(writeRequest);
|
|
|
- });
|
|
|
-
|
|
|
- return promise;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDealWithRejection(stream, error) {
|
|
|
- var state = stream._state;
|
|
|
-
|
|
|
- if (state === 'writable') {
|
|
|
- WritableStreamStartErroring(stream, error);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- assert(state === 'erroring');
|
|
|
- WritableStreamFinishErroring(stream);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamStartErroring(stream, reason) {
|
|
|
- assert(stream._storedError === undefined, 'stream._storedError === undefined');
|
|
|
- assert(stream._state === 'writable', 'state must be writable');
|
|
|
-
|
|
|
- var controller = stream._writableStreamController;
|
|
|
- assert(controller !== undefined, 'controller must not be undefined');
|
|
|
-
|
|
|
- stream._state = 'erroring';
|
|
|
- stream._storedError = reason;
|
|
|
- var writer = stream._writer;
|
|
|
- if (writer !== undefined) {
|
|
|
- WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
|
|
|
- }
|
|
|
-
|
|
|
- if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {
|
|
|
- WritableStreamFinishErroring(stream);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamFinishErroring(stream) {
|
|
|
- assert(stream._state === 'erroring', 'stream._state === erroring');
|
|
|
- assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');
|
|
|
- stream._state = 'errored';
|
|
|
- stream._writableStreamController.__errorSteps();
|
|
|
-
|
|
|
- var storedError = stream._storedError;
|
|
|
- for (var i = 0; i < stream._writeRequests.length; i++) {
|
|
|
- var writeRequest = stream._writeRequests[i];
|
|
|
- writeRequest._reject(storedError);
|
|
|
- }
|
|
|
- stream._writeRequests = [];
|
|
|
-
|
|
|
- if (stream._pendingAbortRequest === undefined) {
|
|
|
- WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- var abortRequest = stream._pendingAbortRequest;
|
|
|
- stream._pendingAbortRequest = undefined;
|
|
|
-
|
|
|
- if (abortRequest._wasAlreadyErroring === true) {
|
|
|
- abortRequest._reject(storedError);
|
|
|
- WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);
|
|
|
- promise.then(function () {
|
|
|
- abortRequest._resolve();
|
|
|
- WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
|
|
|
- }, function (reason) {
|
|
|
- abortRequest._reject(reason);
|
|
|
- WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamFinishInFlightWrite(stream) {
|
|
|
- assert(stream._inFlightWriteRequest !== undefined);
|
|
|
- stream._inFlightWriteRequest._resolve(undefined);
|
|
|
- stream._inFlightWriteRequest = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamFinishInFlightWriteWithError(stream, error) {
|
|
|
- assert(stream._inFlightWriteRequest !== undefined);
|
|
|
- stream._inFlightWriteRequest._reject(error);
|
|
|
- stream._inFlightWriteRequest = undefined;
|
|
|
-
|
|
|
- assert(stream._state === 'writable' || stream._state === 'erroring');
|
|
|
-
|
|
|
- WritableStreamDealWithRejection(stream, error);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamFinishInFlightClose(stream) {
|
|
|
- assert(stream._inFlightCloseRequest !== undefined);
|
|
|
- stream._inFlightCloseRequest._resolve(undefined);
|
|
|
- stream._inFlightCloseRequest = undefined;
|
|
|
-
|
|
|
- var state = stream._state;
|
|
|
-
|
|
|
- assert(state === 'writable' || state === 'erroring');
|
|
|
-
|
|
|
- if (state === 'erroring') {
|
|
|
- // The error was too late to do anything, so it is ignored.
|
|
|
- stream._storedError = undefined;
|
|
|
- if (stream._pendingAbortRequest !== undefined) {
|
|
|
- stream._pendingAbortRequest._resolve();
|
|
|
- stream._pendingAbortRequest = undefined;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- stream._state = 'closed';
|
|
|
-
|
|
|
- var writer = stream._writer;
|
|
|
- if (writer !== undefined) {
|
|
|
- defaultWriterClosedPromiseResolve(writer);
|
|
|
- }
|
|
|
-
|
|
|
- assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');
|
|
|
- assert(stream._storedError === undefined, 'stream._storedError === undefined');
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamFinishInFlightCloseWithError(stream, error) {
|
|
|
- assert(stream._inFlightCloseRequest !== undefined);
|
|
|
- stream._inFlightCloseRequest._reject(error);
|
|
|
- stream._inFlightCloseRequest = undefined;
|
|
|
-
|
|
|
- assert(stream._state === 'writable' || stream._state === 'erroring');
|
|
|
-
|
|
|
- // Never execute sink abort() after sink close().
|
|
|
- if (stream._pendingAbortRequest !== undefined) {
|
|
|
- stream._pendingAbortRequest._reject(error);
|
|
|
- stream._pendingAbortRequest = undefined;
|
|
|
- }
|
|
|
- WritableStreamDealWithRejection(stream, error);
|
|
|
-}
|
|
|
-
|
|
|
-// TODO(ricea): Fix alphabetical order.
|
|
|
-function WritableStreamCloseQueuedOrInFlight(stream) {
|
|
|
- if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamHasOperationMarkedInFlight(stream) {
|
|
|
- if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamMarkCloseRequestInFlight(stream) {
|
|
|
- assert(stream._inFlightCloseRequest === undefined);
|
|
|
- assert(stream._closeRequest !== undefined);
|
|
|
- stream._inFlightCloseRequest = stream._closeRequest;
|
|
|
- stream._closeRequest = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamMarkFirstWriteRequestInFlight(stream) {
|
|
|
- assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');
|
|
|
- assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');
|
|
|
- stream._inFlightWriteRequest = stream._writeRequests.shift();
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
|
|
|
- assert(stream._state === 'errored', '_stream_.[[state]] is `"errored"`');
|
|
|
- if (stream._closeRequest !== undefined) {
|
|
|
- assert(stream._inFlightCloseRequest === undefined);
|
|
|
-
|
|
|
- stream._closeRequest._reject(stream._storedError);
|
|
|
- stream._closeRequest = undefined;
|
|
|
- }
|
|
|
- var writer = stream._writer;
|
|
|
- if (writer !== undefined) {
|
|
|
- defaultWriterClosedPromiseReject(writer, stream._storedError);
|
|
|
- writer._closedPromise.catch(function () {});
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamUpdateBackpressure(stream, backpressure) {
|
|
|
- assert(stream._state === 'writable');
|
|
|
- assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
|
|
|
-
|
|
|
- var writer = stream._writer;
|
|
|
- if (writer !== undefined && backpressure !== stream._backpressure) {
|
|
|
- if (backpressure === true) {
|
|
|
- defaultWriterReadyPromiseReset(writer);
|
|
|
- } else {
|
|
|
- assert(backpressure === false);
|
|
|
-
|
|
|
- defaultWriterReadyPromiseResolve(writer);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- stream._backpressure = backpressure;
|
|
|
-}
|
|
|
-
|
|
|
-var WritableStreamDefaultWriter = function () {
|
|
|
- function WritableStreamDefaultWriter(stream) {
|
|
|
- _classCallCheck(this, WritableStreamDefaultWriter);
|
|
|
-
|
|
|
- if (IsWritableStream(stream) === false) {
|
|
|
- throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');
|
|
|
- }
|
|
|
- if (IsWritableStreamLocked(stream) === true) {
|
|
|
- throw new TypeError('This stream has already been locked for exclusive writing by another writer');
|
|
|
- }
|
|
|
-
|
|
|
- this._ownerWritableStream = stream;
|
|
|
- stream._writer = this;
|
|
|
-
|
|
|
- var state = stream._state;
|
|
|
-
|
|
|
- if (state === 'writable') {
|
|
|
- if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {
|
|
|
- defaultWriterReadyPromiseInitialize(this);
|
|
|
- } else {
|
|
|
- defaultWriterReadyPromiseInitializeAsResolved(this);
|
|
|
- }
|
|
|
-
|
|
|
- defaultWriterClosedPromiseInitialize(this);
|
|
|
- } else if (state === 'erroring') {
|
|
|
- defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);
|
|
|
- this._readyPromise.catch(function () {});
|
|
|
- defaultWriterClosedPromiseInitialize(this);
|
|
|
- } else if (state === 'closed') {
|
|
|
- defaultWriterReadyPromiseInitializeAsResolved(this);
|
|
|
- defaultWriterClosedPromiseInitializeAsResolved(this);
|
|
|
- } else {
|
|
|
- assert(state === 'errored', 'state must be errored');
|
|
|
-
|
|
|
- var storedError = stream._storedError;
|
|
|
- defaultWriterReadyPromiseInitializeAsRejected(this, storedError);
|
|
|
- this._readyPromise.catch(function () {});
|
|
|
- defaultWriterClosedPromiseInitializeAsRejected(this, storedError);
|
|
|
- this._closedPromise.catch(function () {});
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(WritableStreamDefaultWriter, [{
|
|
|
- key: 'abort',
|
|
|
- value: function abort(reason) {
|
|
|
- if (IsWritableStreamDefaultWriter(this) === false) {
|
|
|
- return Promise.reject(defaultWriterBrandCheckException('abort'));
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerWritableStream === undefined) {
|
|
|
- return Promise.reject(defaultWriterLockException('abort'));
|
|
|
- }
|
|
|
-
|
|
|
- return WritableStreamDefaultWriterAbort(this, reason);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'close',
|
|
|
- value: function close() {
|
|
|
- if (IsWritableStreamDefaultWriter(this) === false) {
|
|
|
- return Promise.reject(defaultWriterBrandCheckException('close'));
|
|
|
- }
|
|
|
-
|
|
|
- var stream = this._ownerWritableStream;
|
|
|
-
|
|
|
- if (stream === undefined) {
|
|
|
- return Promise.reject(defaultWriterLockException('close'));
|
|
|
- }
|
|
|
-
|
|
|
- if (WritableStreamCloseQueuedOrInFlight(stream) === true) {
|
|
|
- return Promise.reject(new TypeError('cannot close an already-closing stream'));
|
|
|
- }
|
|
|
-
|
|
|
- return WritableStreamDefaultWriterClose(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'releaseLock',
|
|
|
- value: function releaseLock() {
|
|
|
- if (IsWritableStreamDefaultWriter(this) === false) {
|
|
|
- throw defaultWriterBrandCheckException('releaseLock');
|
|
|
- }
|
|
|
-
|
|
|
- var stream = this._ownerWritableStream;
|
|
|
-
|
|
|
- if (stream === undefined) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- assert(stream._writer !== undefined);
|
|
|
-
|
|
|
- WritableStreamDefaultWriterRelease(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'write',
|
|
|
- value: function write(chunk) {
|
|
|
- if (IsWritableStreamDefaultWriter(this) === false) {
|
|
|
- return Promise.reject(defaultWriterBrandCheckException('write'));
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerWritableStream === undefined) {
|
|
|
- return Promise.reject(defaultWriterLockException('write to'));
|
|
|
- }
|
|
|
-
|
|
|
- return WritableStreamDefaultWriterWrite(this, chunk);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'closed',
|
|
|
- get: function get() {
|
|
|
- if (IsWritableStreamDefaultWriter(this) === false) {
|
|
|
- return Promise.reject(defaultWriterBrandCheckException('closed'));
|
|
|
- }
|
|
|
-
|
|
|
- return this._closedPromise;
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'desiredSize',
|
|
|
- get: function get() {
|
|
|
- if (IsWritableStreamDefaultWriter(this) === false) {
|
|
|
- throw defaultWriterBrandCheckException('desiredSize');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerWritableStream === undefined) {
|
|
|
- throw defaultWriterLockException('desiredSize');
|
|
|
- }
|
|
|
-
|
|
|
- return WritableStreamDefaultWriterGetDesiredSize(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'ready',
|
|
|
- get: function get() {
|
|
|
- if (IsWritableStreamDefaultWriter(this) === false) {
|
|
|
- return Promise.reject(defaultWriterBrandCheckException('ready'));
|
|
|
- }
|
|
|
-
|
|
|
- return this._readyPromise;
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return WritableStreamDefaultWriter;
|
|
|
-}();
|
|
|
-
|
|
|
-// Abstract operations for the WritableStreamDefaultWriter.
|
|
|
-
|
|
|
-function IsWritableStreamDefaultWriter(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-// A client of WritableStreamDefaultWriter may use these functions directly to bypass state check.
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterAbort(writer, reason) {
|
|
|
- var stream = writer._ownerWritableStream;
|
|
|
-
|
|
|
- assert(stream !== undefined);
|
|
|
-
|
|
|
- return WritableStreamAbort(stream, reason);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterClose(writer) {
|
|
|
- var stream = writer._ownerWritableStream;
|
|
|
-
|
|
|
- assert(stream !== undefined);
|
|
|
-
|
|
|
- var state = stream._state;
|
|
|
- if (state === 'closed' || state === 'errored') {
|
|
|
- return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));
|
|
|
- }
|
|
|
-
|
|
|
- assert(state === 'writable' || state === 'erroring');
|
|
|
- assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
|
|
|
-
|
|
|
- var promise = new Promise(function (resolve, reject) {
|
|
|
- var closeRequest = {
|
|
|
- _resolve: resolve,
|
|
|
- _reject: reject
|
|
|
- };
|
|
|
-
|
|
|
- stream._closeRequest = closeRequest;
|
|
|
- });
|
|
|
-
|
|
|
- if (stream._backpressure === true && state === 'writable') {
|
|
|
- defaultWriterReadyPromiseResolve(writer);
|
|
|
- }
|
|
|
-
|
|
|
- WritableStreamDefaultControllerClose(stream._writableStreamController);
|
|
|
-
|
|
|
- return promise;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {
|
|
|
- var stream = writer._ownerWritableStream;
|
|
|
-
|
|
|
- assert(stream !== undefined);
|
|
|
-
|
|
|
- var state = stream._state;
|
|
|
- if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
|
|
|
- return Promise.resolve();
|
|
|
- }
|
|
|
-
|
|
|
- if (state === 'errored') {
|
|
|
- return Promise.reject(stream._storedError);
|
|
|
- }
|
|
|
-
|
|
|
- assert(state === 'writable' || state === 'erroring');
|
|
|
-
|
|
|
- return WritableStreamDefaultWriterClose(writer);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
|
|
|
- if (writer._closedPromiseState === 'pending') {
|
|
|
- defaultWriterClosedPromiseReject(writer, error);
|
|
|
- } else {
|
|
|
- defaultWriterClosedPromiseResetToRejected(writer, error);
|
|
|
- }
|
|
|
- writer._closedPromise.catch(function () {});
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
|
|
|
- if (writer._readyPromiseState === 'pending') {
|
|
|
- defaultWriterReadyPromiseReject(writer, error);
|
|
|
- } else {
|
|
|
- defaultWriterReadyPromiseResetToRejected(writer, error);
|
|
|
- }
|
|
|
- writer._readyPromise.catch(function () {});
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterGetDesiredSize(writer) {
|
|
|
- var stream = writer._ownerWritableStream;
|
|
|
- var state = stream._state;
|
|
|
-
|
|
|
- if (state === 'errored' || state === 'erroring') {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- if (state === 'closed') {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterRelease(writer) {
|
|
|
- var stream = writer._ownerWritableStream;
|
|
|
- assert(stream !== undefined);
|
|
|
- assert(stream._writer === writer);
|
|
|
-
|
|
|
- var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\'s closedness');
|
|
|
-
|
|
|
- WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
|
|
|
-
|
|
|
- // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not
|
|
|
- // rejected until afterwards. This means that simply testing state will not work.
|
|
|
- WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
|
|
|
-
|
|
|
- stream._writer = undefined;
|
|
|
- writer._ownerWritableStream = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultWriterWrite(writer, chunk) {
|
|
|
- var stream = writer._ownerWritableStream;
|
|
|
-
|
|
|
- assert(stream !== undefined);
|
|
|
-
|
|
|
- var controller = stream._writableStreamController;
|
|
|
-
|
|
|
- var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);
|
|
|
-
|
|
|
- if (stream !== writer._ownerWritableStream) {
|
|
|
- return Promise.reject(defaultWriterLockException('write to'));
|
|
|
- }
|
|
|
-
|
|
|
- var state = stream._state;
|
|
|
- if (state === 'errored') {
|
|
|
- return Promise.reject(stream._storedError);
|
|
|
- }
|
|
|
- if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
|
|
|
- return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));
|
|
|
- }
|
|
|
- if (state === 'erroring') {
|
|
|
- return Promise.reject(stream._storedError);
|
|
|
- }
|
|
|
-
|
|
|
- assert(state === 'writable');
|
|
|
-
|
|
|
- var promise = WritableStreamAddWriteRequest(stream);
|
|
|
-
|
|
|
- WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);
|
|
|
-
|
|
|
- return promise;
|
|
|
-}
|
|
|
-
|
|
|
-var WritableStreamDefaultController = function () {
|
|
|
- function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {
|
|
|
- _classCallCheck(this, WritableStreamDefaultController);
|
|
|
-
|
|
|
- if (IsWritableStream(stream) === false) {
|
|
|
- throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');
|
|
|
- }
|
|
|
-
|
|
|
- if (stream._writableStreamController !== undefined) {
|
|
|
- throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');
|
|
|
- }
|
|
|
-
|
|
|
- this._controlledWritableStream = stream;
|
|
|
-
|
|
|
- this._underlyingSink = underlyingSink;
|
|
|
-
|
|
|
- // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
|
|
|
- this._queue = undefined;
|
|
|
- this._queueTotalSize = undefined;
|
|
|
- ResetQueue(this);
|
|
|
-
|
|
|
- this._started = false;
|
|
|
-
|
|
|
- var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
|
|
|
- this._strategySize = normalizedStrategy.size;
|
|
|
- this._strategyHWM = normalizedStrategy.highWaterMark;
|
|
|
-
|
|
|
- var backpressure = WritableStreamDefaultControllerGetBackpressure(this);
|
|
|
- WritableStreamUpdateBackpressure(stream, backpressure);
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(WritableStreamDefaultController, [{
|
|
|
- key: 'error',
|
|
|
- value: function error(e) {
|
|
|
- if (IsWritableStreamDefaultController(this) === false) {
|
|
|
- throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');
|
|
|
- }
|
|
|
- var state = this._controlledWritableStream._state;
|
|
|
- if (state !== 'writable') {
|
|
|
- // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so
|
|
|
- // just treat it as a no-op.
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- WritableStreamDefaultControllerError(this, e);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: '__abortSteps',
|
|
|
- value: function __abortSteps(reason) {
|
|
|
- return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: '__errorSteps',
|
|
|
- value: function __errorSteps() {
|
|
|
- ResetQueue(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: '__startSteps',
|
|
|
- value: function __startSteps() {
|
|
|
- var _this = this;
|
|
|
-
|
|
|
- var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);
|
|
|
- var stream = this._controlledWritableStream;
|
|
|
-
|
|
|
- Promise.resolve(startResult).then(function () {
|
|
|
- assert(stream._state === 'writable' || stream._state === 'erroring');
|
|
|
- _this._started = true;
|
|
|
- WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);
|
|
|
- }, function (r) {
|
|
|
- assert(stream._state === 'writable' || stream._state === 'erroring');
|
|
|
- _this._started = true;
|
|
|
- WritableStreamDealWithRejection(stream, r);
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return WritableStreamDefaultController;
|
|
|
-}();
|
|
|
-
|
|
|
-// Abstract operations implementing interface required by the WritableStream.
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerClose(controller) {
|
|
|
- EnqueueValueWithSize(controller, 'close', 0);
|
|
|
- WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {
|
|
|
- var strategySize = controller._strategySize;
|
|
|
-
|
|
|
- if (strategySize === undefined) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- return strategySize(chunk);
|
|
|
- } catch (chunkSizeE) {
|
|
|
- WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
|
|
|
- return 1;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerGetDesiredSize(controller) {
|
|
|
- return controller._strategyHWM - controller._queueTotalSize;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
|
|
|
- var writeRecord = { chunk: chunk };
|
|
|
-
|
|
|
- try {
|
|
|
- EnqueueValueWithSize(controller, writeRecord, chunkSize);
|
|
|
- } catch (enqueueE) {
|
|
|
- WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- var stream = controller._controlledWritableStream;
|
|
|
- if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {
|
|
|
- var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
|
|
|
- WritableStreamUpdateBackpressure(stream, backpressure);
|
|
|
- }
|
|
|
-
|
|
|
- WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
|
|
|
-}
|
|
|
-
|
|
|
-// Abstract operations for the WritableStreamDefaultController.
|
|
|
-
|
|
|
-function IsWritableStreamDefaultController(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
|
|
|
- var stream = controller._controlledWritableStream;
|
|
|
-
|
|
|
- if (controller._started === false) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (stream._inFlightWriteRequest !== undefined) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- var state = stream._state;
|
|
|
- if (state === 'closed' || state === 'errored') {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (state === 'erroring') {
|
|
|
- WritableStreamFinishErroring(stream);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._queue.length === 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- var writeRecord = PeekQueueValue(controller);
|
|
|
- if (writeRecord === 'close') {
|
|
|
- WritableStreamDefaultControllerProcessClose(controller);
|
|
|
- } else {
|
|
|
- WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {
|
|
|
- if (controller._controlledWritableStream._state === 'writable') {
|
|
|
- WritableStreamDefaultControllerError(controller, error);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerProcessClose(controller) {
|
|
|
- var stream = controller._controlledWritableStream;
|
|
|
-
|
|
|
- WritableStreamMarkCloseRequestInFlight(stream);
|
|
|
-
|
|
|
- DequeueValue(controller);
|
|
|
- assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');
|
|
|
-
|
|
|
- var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);
|
|
|
- sinkClosePromise.then(function () {
|
|
|
- WritableStreamFinishInFlightClose(stream);
|
|
|
- }, function (reason) {
|
|
|
- WritableStreamFinishInFlightCloseWithError(stream, reason);
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerProcessWrite(controller, chunk) {
|
|
|
- var stream = controller._controlledWritableStream;
|
|
|
-
|
|
|
- WritableStreamMarkFirstWriteRequestInFlight(stream);
|
|
|
-
|
|
|
- var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);
|
|
|
- sinkWritePromise.then(function () {
|
|
|
- WritableStreamFinishInFlightWrite(stream);
|
|
|
-
|
|
|
- var state = stream._state;
|
|
|
- assert(state === 'writable' || state === 'erroring');
|
|
|
-
|
|
|
- DequeueValue(controller);
|
|
|
-
|
|
|
- if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {
|
|
|
- var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
|
|
|
- WritableStreamUpdateBackpressure(stream, backpressure);
|
|
|
- }
|
|
|
-
|
|
|
- WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
|
|
|
- }, function (reason) {
|
|
|
- WritableStreamFinishInFlightWriteWithError(stream, reason);
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
-}
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerGetBackpressure(controller) {
|
|
|
- var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);
|
|
|
- return desiredSize <= 0;
|
|
|
-}
|
|
|
-
|
|
|
-// A client of WritableStreamDefaultController may use these functions directly to bypass state check.
|
|
|
-
|
|
|
-function WritableStreamDefaultControllerError(controller, error) {
|
|
|
- var stream = controller._controlledWritableStream;
|
|
|
-
|
|
|
- assert(stream._state === 'writable');
|
|
|
-
|
|
|
- WritableStreamStartErroring(stream, error);
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the WritableStream.
|
|
|
-
|
|
|
-function streamBrandCheckException(name) {
|
|
|
- return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the WritableStreamDefaultWriter.
|
|
|
-
|
|
|
-function defaultWriterBrandCheckException(name) {
|
|
|
- return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterLockException(name) {
|
|
|
- return new TypeError('Cannot ' + name + ' a stream using a released writer');
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterClosedPromiseInitialize(writer) {
|
|
|
- writer._closedPromise = new Promise(function (resolve, reject) {
|
|
|
- writer._closedPromise_resolve = resolve;
|
|
|
- writer._closedPromise_reject = reject;
|
|
|
- writer._closedPromiseState = 'pending';
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {
|
|
|
- writer._closedPromise = Promise.reject(reason);
|
|
|
- writer._closedPromise_resolve = undefined;
|
|
|
- writer._closedPromise_reject = undefined;
|
|
|
- writer._closedPromiseState = 'rejected';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterClosedPromiseInitializeAsResolved(writer) {
|
|
|
- writer._closedPromise = Promise.resolve(undefined);
|
|
|
- writer._closedPromise_resolve = undefined;
|
|
|
- writer._closedPromise_reject = undefined;
|
|
|
- writer._closedPromiseState = 'resolved';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterClosedPromiseReject(writer, reason) {
|
|
|
- assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
|
|
|
- assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
|
|
|
- assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
|
|
|
-
|
|
|
- writer._closedPromise_reject(reason);
|
|
|
- writer._closedPromise_resolve = undefined;
|
|
|
- writer._closedPromise_reject = undefined;
|
|
|
- writer._closedPromiseState = 'rejected';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterClosedPromiseResetToRejected(writer, reason) {
|
|
|
- assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');
|
|
|
- assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');
|
|
|
- assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');
|
|
|
-
|
|
|
- writer._closedPromise = Promise.reject(reason);
|
|
|
- writer._closedPromiseState = 'rejected';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterClosedPromiseResolve(writer) {
|
|
|
- assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
|
|
|
- assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
|
|
|
- assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
|
|
|
-
|
|
|
- writer._closedPromise_resolve(undefined);
|
|
|
- writer._closedPromise_resolve = undefined;
|
|
|
- writer._closedPromise_reject = undefined;
|
|
|
- writer._closedPromiseState = 'resolved';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterReadyPromiseInitialize(writer) {
|
|
|
- writer._readyPromise = new Promise(function (resolve, reject) {
|
|
|
- writer._readyPromise_resolve = resolve;
|
|
|
- writer._readyPromise_reject = reject;
|
|
|
- });
|
|
|
- writer._readyPromiseState = 'pending';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {
|
|
|
- writer._readyPromise = Promise.reject(reason);
|
|
|
- writer._readyPromise_resolve = undefined;
|
|
|
- writer._readyPromise_reject = undefined;
|
|
|
- writer._readyPromiseState = 'rejected';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterReadyPromiseInitializeAsResolved(writer) {
|
|
|
- writer._readyPromise = Promise.resolve(undefined);
|
|
|
- writer._readyPromise_resolve = undefined;
|
|
|
- writer._readyPromise_reject = undefined;
|
|
|
- writer._readyPromiseState = 'fulfilled';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterReadyPromiseReject(writer, reason) {
|
|
|
- assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
|
|
|
- assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
|
|
|
-
|
|
|
- writer._readyPromise_reject(reason);
|
|
|
- writer._readyPromise_resolve = undefined;
|
|
|
- writer._readyPromise_reject = undefined;
|
|
|
- writer._readyPromiseState = 'rejected';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterReadyPromiseReset(writer) {
|
|
|
- assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
|
|
|
- assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
|
|
|
-
|
|
|
- writer._readyPromise = new Promise(function (resolve, reject) {
|
|
|
- writer._readyPromise_resolve = resolve;
|
|
|
- writer._readyPromise_reject = reject;
|
|
|
- });
|
|
|
- writer._readyPromiseState = 'pending';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterReadyPromiseResetToRejected(writer, reason) {
|
|
|
- assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
|
|
|
- assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
|
|
|
-
|
|
|
- writer._readyPromise = Promise.reject(reason);
|
|
|
- writer._readyPromiseState = 'rejected';
|
|
|
-}
|
|
|
-
|
|
|
-function defaultWriterReadyPromiseResolve(writer) {
|
|
|
- assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
|
|
|
- assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
|
|
|
-
|
|
|
- writer._readyPromise_resolve(undefined);
|
|
|
- writer._readyPromise_resolve = undefined;
|
|
|
- writer._readyPromise_reject = undefined;
|
|
|
- writer._readyPromiseState = 'fulfilled';
|
|
|
-}
|
|
|
-
|
|
|
-/***/ }),
|
|
|
-/* 3 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-"use strict";
|
|
|
-
|
|
|
-
|
|
|
-var _require = __webpack_require__(0),
|
|
|
- IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;
|
|
|
-
|
|
|
-var _require2 = __webpack_require__(1),
|
|
|
- assert = _require2.assert;
|
|
|
-
|
|
|
-exports.DequeueValue = function (container) {
|
|
|
- assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
|
|
|
- assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');
|
|
|
-
|
|
|
- var pair = container._queue.shift();
|
|
|
- container._queueTotalSize -= pair.size;
|
|
|
- if (container._queueTotalSize < 0) {
|
|
|
- container._queueTotalSize = 0;
|
|
|
- }
|
|
|
-
|
|
|
- return pair.value;
|
|
|
-};
|
|
|
-
|
|
|
-exports.EnqueueValueWithSize = function (container, value, size) {
|
|
|
- assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');
|
|
|
-
|
|
|
- size = Number(size);
|
|
|
- if (!IsFiniteNonNegativeNumber(size)) {
|
|
|
- throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
|
|
|
- }
|
|
|
-
|
|
|
- container._queue.push({ value: value, size: size });
|
|
|
- container._queueTotalSize += size;
|
|
|
-};
|
|
|
-
|
|
|
-exports.PeekQueueValue = function (container) {
|
|
|
- assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
|
|
|
- assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');
|
|
|
-
|
|
|
- var pair = container._queue[0];
|
|
|
- return pair.value;
|
|
|
-};
|
|
|
-
|
|
|
-exports.ResetQueue = function (container) {
|
|
|
- assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');
|
|
|
-
|
|
|
- container._queue = [];
|
|
|
- container._queueTotalSize = 0;
|
|
|
-};
|
|
|
-
|
|
|
-/***/ }),
|
|
|
-/* 4 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-"use strict";
|
|
|
-
|
|
|
-
|
|
|
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
-
|
|
|
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
-
|
|
|
-var _require = __webpack_require__(0),
|
|
|
- ArrayBufferCopy = _require.ArrayBufferCopy,
|
|
|
- CreateIterResultObject = _require.CreateIterResultObject,
|
|
|
- IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,
|
|
|
- InvokeOrNoop = _require.InvokeOrNoop,
|
|
|
- PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
|
|
|
- TransferArrayBuffer = _require.TransferArrayBuffer,
|
|
|
- ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
|
|
|
- ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;
|
|
|
-
|
|
|
-var _require2 = __webpack_require__(0),
|
|
|
- createArrayFromList = _require2.createArrayFromList,
|
|
|
- createDataProperty = _require2.createDataProperty,
|
|
|
- typeIsObject = _require2.typeIsObject;
|
|
|
-
|
|
|
-var _require3 = __webpack_require__(1),
|
|
|
- assert = _require3.assert,
|
|
|
- rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;
|
|
|
-
|
|
|
-var _require4 = __webpack_require__(3),
|
|
|
- DequeueValue = _require4.DequeueValue,
|
|
|
- EnqueueValueWithSize = _require4.EnqueueValueWithSize,
|
|
|
- ResetQueue = _require4.ResetQueue;
|
|
|
-
|
|
|
-var _require5 = __webpack_require__(2),
|
|
|
- AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,
|
|
|
- IsWritableStream = _require5.IsWritableStream,
|
|
|
- IsWritableStreamLocked = _require5.IsWritableStreamLocked,
|
|
|
- WritableStreamAbort = _require5.WritableStreamAbort,
|
|
|
- WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,
|
|
|
- WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,
|
|
|
- WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,
|
|
|
- WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;
|
|
|
-
|
|
|
-var ReadableStream = function () {
|
|
|
- function ReadableStream() {
|
|
|
- var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
-
|
|
|
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
|
- size = _ref.size,
|
|
|
- highWaterMark = _ref.highWaterMark;
|
|
|
-
|
|
|
- _classCallCheck(this, ReadableStream);
|
|
|
-
|
|
|
- // Exposed to controllers.
|
|
|
- this._state = 'readable';
|
|
|
-
|
|
|
- this._reader = undefined;
|
|
|
- this._storedError = undefined;
|
|
|
-
|
|
|
- this._disturbed = false;
|
|
|
-
|
|
|
- // Initialize to undefined first because the constructor of the controller checks this
|
|
|
- // variable to validate the caller.
|
|
|
- this._readableStreamController = undefined;
|
|
|
- var type = underlyingSource.type;
|
|
|
- var typeString = String(type);
|
|
|
- if (typeString === 'bytes') {
|
|
|
- if (highWaterMark === undefined) {
|
|
|
- highWaterMark = 0;
|
|
|
- }
|
|
|
- this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);
|
|
|
- } else if (type === undefined) {
|
|
|
- if (highWaterMark === undefined) {
|
|
|
- highWaterMark = 1;
|
|
|
- }
|
|
|
- this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);
|
|
|
- } else {
|
|
|
- throw new RangeError('Invalid type is specified');
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(ReadableStream, [{
|
|
|
- key: 'cancel',
|
|
|
- value: function cancel(reason) {
|
|
|
- if (IsReadableStream(this) === false) {
|
|
|
- return Promise.reject(streamBrandCheckException('cancel'));
|
|
|
- }
|
|
|
-
|
|
|
- if (IsReadableStreamLocked(this) === true) {
|
|
|
- return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableStreamCancel(this, reason);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'getReader',
|
|
|
- value: function getReader() {
|
|
|
- var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
|
- mode = _ref2.mode;
|
|
|
-
|
|
|
- if (IsReadableStream(this) === false) {
|
|
|
- throw streamBrandCheckException('getReader');
|
|
|
- }
|
|
|
-
|
|
|
- if (mode === undefined) {
|
|
|
- return AcquireReadableStreamDefaultReader(this);
|
|
|
- }
|
|
|
-
|
|
|
- mode = String(mode);
|
|
|
-
|
|
|
- if (mode === 'byob') {
|
|
|
- return AcquireReadableStreamBYOBReader(this);
|
|
|
- }
|
|
|
-
|
|
|
- throw new RangeError('Invalid mode is specified');
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'pipeThrough',
|
|
|
- value: function pipeThrough(_ref3, options) {
|
|
|
- var writable = _ref3.writable,
|
|
|
- readable = _ref3.readable;
|
|
|
-
|
|
|
- var promise = this.pipeTo(writable, options);
|
|
|
-
|
|
|
- ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);
|
|
|
-
|
|
|
- return readable;
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'pipeTo',
|
|
|
- value: function pipeTo(dest) {
|
|
|
- var _this = this;
|
|
|
-
|
|
|
- var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
|
- preventClose = _ref4.preventClose,
|
|
|
- preventAbort = _ref4.preventAbort,
|
|
|
- preventCancel = _ref4.preventCancel;
|
|
|
-
|
|
|
- if (IsReadableStream(this) === false) {
|
|
|
- return Promise.reject(streamBrandCheckException('pipeTo'));
|
|
|
- }
|
|
|
- if (IsWritableStream(dest) === false) {
|
|
|
- return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\'s first argument must be a WritableStream'));
|
|
|
- }
|
|
|
-
|
|
|
- preventClose = Boolean(preventClose);
|
|
|
- preventAbort = Boolean(preventAbort);
|
|
|
- preventCancel = Boolean(preventCancel);
|
|
|
-
|
|
|
- if (IsReadableStreamLocked(this) === true) {
|
|
|
- return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));
|
|
|
- }
|
|
|
- if (IsWritableStreamLocked(dest) === true) {
|
|
|
- return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));
|
|
|
- }
|
|
|
-
|
|
|
- var reader = AcquireReadableStreamDefaultReader(this);
|
|
|
- var writer = AcquireWritableStreamDefaultWriter(dest);
|
|
|
-
|
|
|
- var shuttingDown = false;
|
|
|
-
|
|
|
- // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown.
|
|
|
- var currentWrite = Promise.resolve();
|
|
|
-
|
|
|
- return new Promise(function (resolve, reject) {
|
|
|
- // Using reader and writer, read all chunks from this and write them to dest
|
|
|
- // - Backpressure must be enforced
|
|
|
- // - Shutdown must stop all activity
|
|
|
- function pipeLoop() {
|
|
|
- currentWrite = Promise.resolve();
|
|
|
-
|
|
|
- if (shuttingDown === true) {
|
|
|
- return Promise.resolve();
|
|
|
- }
|
|
|
-
|
|
|
- return writer._readyPromise.then(function () {
|
|
|
- return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {
|
|
|
- var value = _ref5.value,
|
|
|
- done = _ref5.done;
|
|
|
-
|
|
|
- if (done === true) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});
|
|
|
- });
|
|
|
- }).then(pipeLoop);
|
|
|
- }
|
|
|
-
|
|
|
- // Errors must be propagated forward
|
|
|
- isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {
|
|
|
- if (preventAbort === false) {
|
|
|
- shutdownWithAction(function () {
|
|
|
- return WritableStreamAbort(dest, storedError);
|
|
|
- }, true, storedError);
|
|
|
- } else {
|
|
|
- shutdown(true, storedError);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- // Errors must be propagated backward
|
|
|
- isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {
|
|
|
- if (preventCancel === false) {
|
|
|
- shutdownWithAction(function () {
|
|
|
- return ReadableStreamCancel(_this, storedError);
|
|
|
- }, true, storedError);
|
|
|
- } else {
|
|
|
- shutdown(true, storedError);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- // Closing must be propagated forward
|
|
|
- isOrBecomesClosed(_this, reader._closedPromise, function () {
|
|
|
- if (preventClose === false) {
|
|
|
- shutdownWithAction(function () {
|
|
|
- return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);
|
|
|
- });
|
|
|
- } else {
|
|
|
- shutdown();
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- // Closing must be propagated backward
|
|
|
- if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {
|
|
|
- var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');
|
|
|
-
|
|
|
- if (preventCancel === false) {
|
|
|
- shutdownWithAction(function () {
|
|
|
- return ReadableStreamCancel(_this, destClosed);
|
|
|
- }, true, destClosed);
|
|
|
- } else {
|
|
|
- shutdown(true, destClosed);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- pipeLoop().catch(function (err) {
|
|
|
- currentWrite = Promise.resolve();
|
|
|
- rethrowAssertionErrorRejection(err);
|
|
|
- });
|
|
|
-
|
|
|
- function waitForWritesToFinish() {
|
|
|
- // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait
|
|
|
- // for that too.
|
|
|
- var oldCurrentWrite = currentWrite;
|
|
|
- return currentWrite.then(function () {
|
|
|
- return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- function isOrBecomesErrored(stream, promise, action) {
|
|
|
- if (stream._state === 'errored') {
|
|
|
- action(stream._storedError);
|
|
|
- } else {
|
|
|
- promise.catch(action).catch(rethrowAssertionErrorRejection);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function isOrBecomesClosed(stream, promise, action) {
|
|
|
- if (stream._state === 'closed') {
|
|
|
- action();
|
|
|
- } else {
|
|
|
- promise.then(action).catch(rethrowAssertionErrorRejection);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function shutdownWithAction(action, originalIsError, originalError) {
|
|
|
- if (shuttingDown === true) {
|
|
|
- return;
|
|
|
- }
|
|
|
- shuttingDown = true;
|
|
|
-
|
|
|
- if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
|
|
|
- waitForWritesToFinish().then(doTheRest);
|
|
|
- } else {
|
|
|
- doTheRest();
|
|
|
- }
|
|
|
-
|
|
|
- function doTheRest() {
|
|
|
- action().then(function () {
|
|
|
- return finalize(originalIsError, originalError);
|
|
|
- }, function (newError) {
|
|
|
- return finalize(true, newError);
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function shutdown(isError, error) {
|
|
|
- if (shuttingDown === true) {
|
|
|
- return;
|
|
|
- }
|
|
|
- shuttingDown = true;
|
|
|
-
|
|
|
- if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
|
|
|
- waitForWritesToFinish().then(function () {
|
|
|
- return finalize(isError, error);
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
- } else {
|
|
|
- finalize(isError, error);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function finalize(isError, error) {
|
|
|
- WritableStreamDefaultWriterRelease(writer);
|
|
|
- ReadableStreamReaderGenericRelease(reader);
|
|
|
-
|
|
|
- if (isError) {
|
|
|
- reject(error);
|
|
|
- } else {
|
|
|
- resolve(undefined);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'tee',
|
|
|
- value: function tee() {
|
|
|
- if (IsReadableStream(this) === false) {
|
|
|
- throw streamBrandCheckException('tee');
|
|
|
- }
|
|
|
-
|
|
|
- var branches = ReadableStreamTee(this, false);
|
|
|
- return createArrayFromList(branches);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'locked',
|
|
|
- get: function get() {
|
|
|
- if (IsReadableStream(this) === false) {
|
|
|
- throw streamBrandCheckException('locked');
|
|
|
- }
|
|
|
-
|
|
|
- return IsReadableStreamLocked(this);
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return ReadableStream;
|
|
|
-}();
|
|
|
-
|
|
|
-module.exports = {
|
|
|
- ReadableStream: ReadableStream,
|
|
|
- IsReadableStreamDisturbed: IsReadableStreamDisturbed,
|
|
|
- ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,
|
|
|
- ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,
|
|
|
- ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,
|
|
|
- ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize
|
|
|
-};
|
|
|
-
|
|
|
-// Abstract operations for the ReadableStream.
|
|
|
-
|
|
|
-function AcquireReadableStreamBYOBReader(stream) {
|
|
|
- return new ReadableStreamBYOBReader(stream);
|
|
|
-}
|
|
|
-
|
|
|
-function AcquireReadableStreamDefaultReader(stream) {
|
|
|
- return new ReadableStreamDefaultReader(stream);
|
|
|
-}
|
|
|
-
|
|
|
-function IsReadableStream(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function IsReadableStreamDisturbed(stream) {
|
|
|
- assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');
|
|
|
-
|
|
|
- return stream._disturbed;
|
|
|
-}
|
|
|
-
|
|
|
-function IsReadableStreamLocked(stream) {
|
|
|
- assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');
|
|
|
-
|
|
|
- if (stream._reader === undefined) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamTee(stream, cloneForBranch2) {
|
|
|
- assert(IsReadableStream(stream) === true);
|
|
|
- assert(typeof cloneForBranch2 === 'boolean');
|
|
|
-
|
|
|
- var reader = AcquireReadableStreamDefaultReader(stream);
|
|
|
-
|
|
|
- var teeState = {
|
|
|
- closedOrErrored: false,
|
|
|
- canceled1: false,
|
|
|
- canceled2: false,
|
|
|
- reason1: undefined,
|
|
|
- reason2: undefined
|
|
|
- };
|
|
|
- teeState.promise = new Promise(function (resolve) {
|
|
|
- teeState._resolve = resolve;
|
|
|
- });
|
|
|
-
|
|
|
- var pull = create_ReadableStreamTeePullFunction();
|
|
|
- pull._reader = reader;
|
|
|
- pull._teeState = teeState;
|
|
|
- pull._cloneForBranch2 = cloneForBranch2;
|
|
|
-
|
|
|
- var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();
|
|
|
- cancel1._stream = stream;
|
|
|
- cancel1._teeState = teeState;
|
|
|
-
|
|
|
- var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();
|
|
|
- cancel2._stream = stream;
|
|
|
- cancel2._teeState = teeState;
|
|
|
-
|
|
|
- var underlyingSource1 = Object.create(Object.prototype);
|
|
|
- createDataProperty(underlyingSource1, 'pull', pull);
|
|
|
- createDataProperty(underlyingSource1, 'cancel', cancel1);
|
|
|
- var branch1Stream = new ReadableStream(underlyingSource1);
|
|
|
-
|
|
|
- var underlyingSource2 = Object.create(Object.prototype);
|
|
|
- createDataProperty(underlyingSource2, 'pull', pull);
|
|
|
- createDataProperty(underlyingSource2, 'cancel', cancel2);
|
|
|
- var branch2Stream = new ReadableStream(underlyingSource2);
|
|
|
-
|
|
|
- pull._branch1 = branch1Stream._readableStreamController;
|
|
|
- pull._branch2 = branch2Stream._readableStreamController;
|
|
|
-
|
|
|
- reader._closedPromise.catch(function (r) {
|
|
|
- if (teeState.closedOrErrored === true) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamDefaultControllerError(pull._branch1, r);
|
|
|
- ReadableStreamDefaultControllerError(pull._branch2, r);
|
|
|
- teeState.closedOrErrored = true;
|
|
|
- });
|
|
|
-
|
|
|
- return [branch1Stream, branch2Stream];
|
|
|
-}
|
|
|
-
|
|
|
-function create_ReadableStreamTeePullFunction() {
|
|
|
- function f() {
|
|
|
- var reader = f._reader,
|
|
|
- branch1 = f._branch1,
|
|
|
- branch2 = f._branch2,
|
|
|
- teeState = f._teeState;
|
|
|
-
|
|
|
-
|
|
|
- return ReadableStreamDefaultReaderRead(reader).then(function (result) {
|
|
|
- assert(typeIsObject(result));
|
|
|
- var value = result.value;
|
|
|
- var done = result.done;
|
|
|
- assert(typeof done === 'boolean');
|
|
|
-
|
|
|
- if (done === true && teeState.closedOrErrored === false) {
|
|
|
- if (teeState.canceled1 === false) {
|
|
|
- ReadableStreamDefaultControllerClose(branch1);
|
|
|
- }
|
|
|
- if (teeState.canceled2 === false) {
|
|
|
- ReadableStreamDefaultControllerClose(branch2);
|
|
|
- }
|
|
|
- teeState.closedOrErrored = true;
|
|
|
- }
|
|
|
-
|
|
|
- if (teeState.closedOrErrored === true) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- var value1 = value;
|
|
|
- var value2 = value;
|
|
|
-
|
|
|
- // There is no way to access the cloning code right now in the reference implementation.
|
|
|
- // If we add one then we'll need an implementation for serializable objects.
|
|
|
- // if (teeState.canceled2 === false && cloneForBranch2 === true) {
|
|
|
- // value2 = StructuredDeserialize(StructuredSerialize(value2));
|
|
|
- // }
|
|
|
-
|
|
|
- if (teeState.canceled1 === false) {
|
|
|
- ReadableStreamDefaultControllerEnqueue(branch1, value1);
|
|
|
- }
|
|
|
-
|
|
|
- if (teeState.canceled2 === false) {
|
|
|
- ReadableStreamDefaultControllerEnqueue(branch2, value2);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- return f;
|
|
|
-}
|
|
|
-
|
|
|
-function create_ReadableStreamTeeBranch1CancelFunction() {
|
|
|
- function f(reason) {
|
|
|
- var stream = f._stream,
|
|
|
- teeState = f._teeState;
|
|
|
-
|
|
|
-
|
|
|
- teeState.canceled1 = true;
|
|
|
- teeState.reason1 = reason;
|
|
|
- if (teeState.canceled2 === true) {
|
|
|
- var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
|
|
|
- var cancelResult = ReadableStreamCancel(stream, compositeReason);
|
|
|
- teeState._resolve(cancelResult);
|
|
|
- }
|
|
|
- return teeState.promise;
|
|
|
- }
|
|
|
- return f;
|
|
|
-}
|
|
|
-
|
|
|
-function create_ReadableStreamTeeBranch2CancelFunction() {
|
|
|
- function f(reason) {
|
|
|
- var stream = f._stream,
|
|
|
- teeState = f._teeState;
|
|
|
-
|
|
|
-
|
|
|
- teeState.canceled2 = true;
|
|
|
- teeState.reason2 = reason;
|
|
|
- if (teeState.canceled1 === true) {
|
|
|
- var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
|
|
|
- var cancelResult = ReadableStreamCancel(stream, compositeReason);
|
|
|
- teeState._resolve(cancelResult);
|
|
|
- }
|
|
|
- return teeState.promise;
|
|
|
- }
|
|
|
- return f;
|
|
|
-}
|
|
|
-
|
|
|
-// ReadableStream API exposed for controllers.
|
|
|
-
|
|
|
-function ReadableStreamAddReadIntoRequest(stream) {
|
|
|
- assert(IsReadableStreamBYOBReader(stream._reader) === true);
|
|
|
- assert(stream._state === 'readable' || stream._state === 'closed');
|
|
|
-
|
|
|
- var promise = new Promise(function (resolve, reject) {
|
|
|
- var readIntoRequest = {
|
|
|
- _resolve: resolve,
|
|
|
- _reject: reject
|
|
|
- };
|
|
|
-
|
|
|
- stream._reader._readIntoRequests.push(readIntoRequest);
|
|
|
- });
|
|
|
-
|
|
|
- return promise;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamAddReadRequest(stream) {
|
|
|
- assert(IsReadableStreamDefaultReader(stream._reader) === true);
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- var promise = new Promise(function (resolve, reject) {
|
|
|
- var readRequest = {
|
|
|
- _resolve: resolve,
|
|
|
- _reject: reject
|
|
|
- };
|
|
|
-
|
|
|
- stream._reader._readRequests.push(readRequest);
|
|
|
- });
|
|
|
-
|
|
|
- return promise;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamCancel(stream, reason) {
|
|
|
- stream._disturbed = true;
|
|
|
-
|
|
|
- if (stream._state === 'closed') {
|
|
|
- return Promise.resolve(undefined);
|
|
|
- }
|
|
|
- if (stream._state === 'errored') {
|
|
|
- return Promise.reject(stream._storedError);
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamClose(stream);
|
|
|
-
|
|
|
- var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);
|
|
|
- return sourceCancelPromise.then(function () {
|
|
|
- return undefined;
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamClose(stream) {
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- stream._state = 'closed';
|
|
|
-
|
|
|
- var reader = stream._reader;
|
|
|
-
|
|
|
- if (reader === undefined) {
|
|
|
- return undefined;
|
|
|
- }
|
|
|
-
|
|
|
- if (IsReadableStreamDefaultReader(reader) === true) {
|
|
|
- for (var i = 0; i < reader._readRequests.length; i++) {
|
|
|
- var _resolve = reader._readRequests[i]._resolve;
|
|
|
-
|
|
|
- _resolve(CreateIterResultObject(undefined, true));
|
|
|
- }
|
|
|
- reader._readRequests = [];
|
|
|
- }
|
|
|
-
|
|
|
- defaultReaderClosedPromiseResolve(reader);
|
|
|
-
|
|
|
- return undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamError(stream, e) {
|
|
|
- assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');
|
|
|
- assert(stream._state === 'readable', 'state must be readable');
|
|
|
-
|
|
|
- stream._state = 'errored';
|
|
|
- stream._storedError = e;
|
|
|
-
|
|
|
- var reader = stream._reader;
|
|
|
-
|
|
|
- if (reader === undefined) {
|
|
|
- return undefined;
|
|
|
- }
|
|
|
-
|
|
|
- if (IsReadableStreamDefaultReader(reader) === true) {
|
|
|
- for (var i = 0; i < reader._readRequests.length; i++) {
|
|
|
- var readRequest = reader._readRequests[i];
|
|
|
- readRequest._reject(e);
|
|
|
- }
|
|
|
-
|
|
|
- reader._readRequests = [];
|
|
|
- } else {
|
|
|
- assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');
|
|
|
-
|
|
|
- for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {
|
|
|
- var readIntoRequest = reader._readIntoRequests[_i];
|
|
|
- readIntoRequest._reject(e);
|
|
|
- }
|
|
|
-
|
|
|
- reader._readIntoRequests = [];
|
|
|
- }
|
|
|
-
|
|
|
- defaultReaderClosedPromiseReject(reader, e);
|
|
|
- reader._closedPromise.catch(function () {});
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {
|
|
|
- var reader = stream._reader;
|
|
|
-
|
|
|
- assert(reader._readIntoRequests.length > 0);
|
|
|
-
|
|
|
- var readIntoRequest = reader._readIntoRequests.shift();
|
|
|
- readIntoRequest._resolve(CreateIterResultObject(chunk, done));
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamFulfillReadRequest(stream, chunk, done) {
|
|
|
- var reader = stream._reader;
|
|
|
-
|
|
|
- assert(reader._readRequests.length > 0);
|
|
|
-
|
|
|
- var readRequest = reader._readRequests.shift();
|
|
|
- readRequest._resolve(CreateIterResultObject(chunk, done));
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamGetNumReadIntoRequests(stream) {
|
|
|
- return stream._reader._readIntoRequests.length;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamGetNumReadRequests(stream) {
|
|
|
- return stream._reader._readRequests.length;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamHasBYOBReader(stream) {
|
|
|
- var reader = stream._reader;
|
|
|
-
|
|
|
- if (reader === undefined) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (IsReadableStreamBYOBReader(reader) === false) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamHasDefaultReader(stream) {
|
|
|
- var reader = stream._reader;
|
|
|
-
|
|
|
- if (reader === undefined) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (IsReadableStreamDefaultReader(reader) === false) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-// Readers
|
|
|
-
|
|
|
-var ReadableStreamDefaultReader = function () {
|
|
|
- function ReadableStreamDefaultReader(stream) {
|
|
|
- _classCallCheck(this, ReadableStreamDefaultReader);
|
|
|
-
|
|
|
- if (IsReadableStream(stream) === false) {
|
|
|
- throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');
|
|
|
- }
|
|
|
- if (IsReadableStreamLocked(stream) === true) {
|
|
|
- throw new TypeError('This stream has already been locked for exclusive reading by another reader');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamReaderGenericInitialize(this, stream);
|
|
|
-
|
|
|
- this._readRequests = [];
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(ReadableStreamDefaultReader, [{
|
|
|
- key: 'cancel',
|
|
|
- value: function cancel(reason) {
|
|
|
- if (IsReadableStreamDefaultReader(this) === false) {
|
|
|
- return Promise.reject(defaultReaderBrandCheckException('cancel'));
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerReadableStream === undefined) {
|
|
|
- return Promise.reject(readerLockException('cancel'));
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableStreamReaderGenericCancel(this, reason);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'read',
|
|
|
- value: function read() {
|
|
|
- if (IsReadableStreamDefaultReader(this) === false) {
|
|
|
- return Promise.reject(defaultReaderBrandCheckException('read'));
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerReadableStream === undefined) {
|
|
|
- return Promise.reject(readerLockException('read from'));
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableStreamDefaultReaderRead(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'releaseLock',
|
|
|
- value: function releaseLock() {
|
|
|
- if (IsReadableStreamDefaultReader(this) === false) {
|
|
|
- throw defaultReaderBrandCheckException('releaseLock');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerReadableStream === undefined) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (this._readRequests.length > 0) {
|
|
|
- throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamReaderGenericRelease(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'closed',
|
|
|
- get: function get() {
|
|
|
- if (IsReadableStreamDefaultReader(this) === false) {
|
|
|
- return Promise.reject(defaultReaderBrandCheckException('closed'));
|
|
|
- }
|
|
|
-
|
|
|
- return this._closedPromise;
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return ReadableStreamDefaultReader;
|
|
|
-}();
|
|
|
-
|
|
|
-var ReadableStreamBYOBReader = function () {
|
|
|
- function ReadableStreamBYOBReader(stream) {
|
|
|
- _classCallCheck(this, ReadableStreamBYOBReader);
|
|
|
-
|
|
|
- if (!IsReadableStream(stream)) {
|
|
|
- throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');
|
|
|
- }
|
|
|
- if (IsReadableByteStreamController(stream._readableStreamController) === false) {
|
|
|
- throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');
|
|
|
- }
|
|
|
- if (IsReadableStreamLocked(stream)) {
|
|
|
- throw new TypeError('This stream has already been locked for exclusive reading by another reader');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamReaderGenericInitialize(this, stream);
|
|
|
-
|
|
|
- this._readIntoRequests = [];
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(ReadableStreamBYOBReader, [{
|
|
|
- key: 'cancel',
|
|
|
- value: function cancel(reason) {
|
|
|
- if (!IsReadableStreamBYOBReader(this)) {
|
|
|
- return Promise.reject(byobReaderBrandCheckException('cancel'));
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerReadableStream === undefined) {
|
|
|
- return Promise.reject(readerLockException('cancel'));
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableStreamReaderGenericCancel(this, reason);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'read',
|
|
|
- value: function read(view) {
|
|
|
- if (!IsReadableStreamBYOBReader(this)) {
|
|
|
- return Promise.reject(byobReaderBrandCheckException('read'));
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerReadableStream === undefined) {
|
|
|
- return Promise.reject(readerLockException('read from'));
|
|
|
- }
|
|
|
-
|
|
|
- if (!ArrayBuffer.isView(view)) {
|
|
|
- return Promise.reject(new TypeError('view must be an array buffer view'));
|
|
|
- }
|
|
|
-
|
|
|
- if (view.byteLength === 0) {
|
|
|
- return Promise.reject(new TypeError('view must have non-zero byteLength'));
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableStreamBYOBReaderRead(this, view);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'releaseLock',
|
|
|
- value: function releaseLock() {
|
|
|
- if (!IsReadableStreamBYOBReader(this)) {
|
|
|
- throw byobReaderBrandCheckException('releaseLock');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._ownerReadableStream === undefined) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (this._readIntoRequests.length > 0) {
|
|
|
- throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamReaderGenericRelease(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'closed',
|
|
|
- get: function get() {
|
|
|
- if (!IsReadableStreamBYOBReader(this)) {
|
|
|
- return Promise.reject(byobReaderBrandCheckException('closed'));
|
|
|
- }
|
|
|
-
|
|
|
- return this._closedPromise;
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return ReadableStreamBYOBReader;
|
|
|
-}();
|
|
|
-
|
|
|
-// Abstract operations for the readers.
|
|
|
-
|
|
|
-function IsReadableStreamBYOBReader(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function IsReadableStreamDefaultReader(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamReaderGenericInitialize(reader, stream) {
|
|
|
- reader._ownerReadableStream = stream;
|
|
|
- stream._reader = reader;
|
|
|
-
|
|
|
- if (stream._state === 'readable') {
|
|
|
- defaultReaderClosedPromiseInitialize(reader);
|
|
|
- } else if (stream._state === 'closed') {
|
|
|
- defaultReaderClosedPromiseInitializeAsResolved(reader);
|
|
|
- } else {
|
|
|
- assert(stream._state === 'errored', 'state must be errored');
|
|
|
-
|
|
|
- defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);
|
|
|
- reader._closedPromise.catch(function () {});
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state
|
|
|
-// check.
|
|
|
-
|
|
|
-function ReadableStreamReaderGenericCancel(reader, reason) {
|
|
|
- var stream = reader._ownerReadableStream;
|
|
|
- assert(stream !== undefined);
|
|
|
- return ReadableStreamCancel(stream, reason);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamReaderGenericRelease(reader) {
|
|
|
- assert(reader._ownerReadableStream !== undefined);
|
|
|
- assert(reader._ownerReadableStream._reader === reader);
|
|
|
-
|
|
|
- if (reader._ownerReadableStream._state === 'readable') {
|
|
|
- defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
|
|
|
- } else {
|
|
|
- defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
|
|
|
- }
|
|
|
- reader._closedPromise.catch(function () {});
|
|
|
-
|
|
|
- reader._ownerReadableStream._reader = undefined;
|
|
|
- reader._ownerReadableStream = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamBYOBReaderRead(reader, view) {
|
|
|
- var stream = reader._ownerReadableStream;
|
|
|
-
|
|
|
- assert(stream !== undefined);
|
|
|
-
|
|
|
- stream._disturbed = true;
|
|
|
-
|
|
|
- if (stream._state === 'errored') {
|
|
|
- return Promise.reject(stream._storedError);
|
|
|
- }
|
|
|
-
|
|
|
- // Controllers must implement this.
|
|
|
- return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamDefaultReaderRead(reader) {
|
|
|
- var stream = reader._ownerReadableStream;
|
|
|
-
|
|
|
- assert(stream !== undefined);
|
|
|
-
|
|
|
- stream._disturbed = true;
|
|
|
-
|
|
|
- if (stream._state === 'closed') {
|
|
|
- return Promise.resolve(CreateIterResultObject(undefined, true));
|
|
|
- }
|
|
|
-
|
|
|
- if (stream._state === 'errored') {
|
|
|
- return Promise.reject(stream._storedError);
|
|
|
- }
|
|
|
-
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- return stream._readableStreamController.__pullSteps();
|
|
|
-}
|
|
|
-
|
|
|
-// Controllers
|
|
|
-
|
|
|
-var ReadableStreamDefaultController = function () {
|
|
|
- function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {
|
|
|
- _classCallCheck(this, ReadableStreamDefaultController);
|
|
|
-
|
|
|
- if (IsReadableStream(stream) === false) {
|
|
|
- throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');
|
|
|
- }
|
|
|
-
|
|
|
- if (stream._readableStreamController !== undefined) {
|
|
|
- throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');
|
|
|
- }
|
|
|
-
|
|
|
- this._controlledReadableStream = stream;
|
|
|
-
|
|
|
- this._underlyingSource = underlyingSource;
|
|
|
-
|
|
|
- // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
|
|
|
- this._queue = undefined;
|
|
|
- this._queueTotalSize = undefined;
|
|
|
- ResetQueue(this);
|
|
|
-
|
|
|
- this._started = false;
|
|
|
- this._closeRequested = false;
|
|
|
- this._pullAgain = false;
|
|
|
- this._pulling = false;
|
|
|
-
|
|
|
- var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
|
|
|
- this._strategySize = normalizedStrategy.size;
|
|
|
- this._strategyHWM = normalizedStrategy.highWaterMark;
|
|
|
-
|
|
|
- var controller = this;
|
|
|
-
|
|
|
- var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);
|
|
|
- Promise.resolve(startResult).then(function () {
|
|
|
- controller._started = true;
|
|
|
-
|
|
|
- assert(controller._pulling === false);
|
|
|
- assert(controller._pullAgain === false);
|
|
|
-
|
|
|
- ReadableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
|
- }, function (r) {
|
|
|
- ReadableStreamDefaultControllerErrorIfNeeded(controller, r);
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(ReadableStreamDefaultController, [{
|
|
|
- key: 'close',
|
|
|
- value: function close() {
|
|
|
- if (IsReadableStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('close');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._closeRequested === true) {
|
|
|
- throw new TypeError('The stream has already been closed; do not close it again!');
|
|
|
- }
|
|
|
-
|
|
|
- var state = this._controlledReadableStream._state;
|
|
|
- if (state !== 'readable') {
|
|
|
- throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamDefaultControllerClose(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'enqueue',
|
|
|
- value: function enqueue(chunk) {
|
|
|
- if (IsReadableStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('enqueue');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._closeRequested === true) {
|
|
|
- throw new TypeError('stream is closed or draining');
|
|
|
- }
|
|
|
-
|
|
|
- var state = this._controlledReadableStream._state;
|
|
|
- if (state !== 'readable') {
|
|
|
- throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableStreamDefaultControllerEnqueue(this, chunk);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'error',
|
|
|
- value: function error(e) {
|
|
|
- if (IsReadableStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('error');
|
|
|
- }
|
|
|
-
|
|
|
- var stream = this._controlledReadableStream;
|
|
|
- if (stream._state !== 'readable') {
|
|
|
- throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamDefaultControllerError(this, e);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: '__cancelSteps',
|
|
|
- value: function __cancelSteps(reason) {
|
|
|
- ResetQueue(this);
|
|
|
- return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: '__pullSteps',
|
|
|
- value: function __pullSteps() {
|
|
|
- var stream = this._controlledReadableStream;
|
|
|
-
|
|
|
- if (this._queue.length > 0) {
|
|
|
- var chunk = DequeueValue(this);
|
|
|
-
|
|
|
- if (this._closeRequested === true && this._queue.length === 0) {
|
|
|
- ReadableStreamClose(stream);
|
|
|
- } else {
|
|
|
- ReadableStreamDefaultControllerCallPullIfNeeded(this);
|
|
|
- }
|
|
|
-
|
|
|
- return Promise.resolve(CreateIterResultObject(chunk, false));
|
|
|
- }
|
|
|
-
|
|
|
- var pendingPromise = ReadableStreamAddReadRequest(stream);
|
|
|
- ReadableStreamDefaultControllerCallPullIfNeeded(this);
|
|
|
- return pendingPromise;
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'desiredSize',
|
|
|
- get: function get() {
|
|
|
- if (IsReadableStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('desiredSize');
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableStreamDefaultControllerGetDesiredSize(this);
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return ReadableStreamDefaultController;
|
|
|
-}();
|
|
|
-
|
|
|
-// Abstract operations for the ReadableStreamDefaultController.
|
|
|
-
|
|
|
-function IsReadableStreamDefaultController(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {
|
|
|
- var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);
|
|
|
- if (shouldPull === false) {
|
|
|
- return undefined;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._pulling === true) {
|
|
|
- controller._pullAgain = true;
|
|
|
- return undefined;
|
|
|
- }
|
|
|
-
|
|
|
- assert(controller._pullAgain === false);
|
|
|
-
|
|
|
- controller._pulling = true;
|
|
|
-
|
|
|
- var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);
|
|
|
- pullPromise.then(function () {
|
|
|
- controller._pulling = false;
|
|
|
-
|
|
|
- if (controller._pullAgain === true) {
|
|
|
- controller._pullAgain = false;
|
|
|
- return ReadableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
|
- }
|
|
|
- return undefined;
|
|
|
- }, function (e) {
|
|
|
- ReadableStreamDefaultControllerErrorIfNeeded(controller, e);
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
-
|
|
|
- return undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamDefaultControllerShouldCallPull(controller) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- if (stream._state === 'closed' || stream._state === 'errored') {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._closeRequested === true) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._started === false) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
|
|
|
- if (desiredSize > 0) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-// A client of ReadableStreamDefaultController may use these functions directly to bypass state check.
|
|
|
-
|
|
|
-function ReadableStreamDefaultControllerClose(controller) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- assert(controller._closeRequested === false);
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- controller._closeRequested = true;
|
|
|
-
|
|
|
- if (controller._queue.length === 0) {
|
|
|
- ReadableStreamClose(stream);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamDefaultControllerEnqueue(controller, chunk) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- assert(controller._closeRequested === false);
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
|
|
|
- ReadableStreamFulfillReadRequest(stream, chunk, false);
|
|
|
- } else {
|
|
|
- var chunkSize = 1;
|
|
|
-
|
|
|
- if (controller._strategySize !== undefined) {
|
|
|
- var strategySize = controller._strategySize;
|
|
|
- try {
|
|
|
- chunkSize = strategySize(chunk);
|
|
|
- } catch (chunkSizeE) {
|
|
|
- ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
|
|
|
- throw chunkSizeE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- EnqueueValueWithSize(controller, chunk, chunkSize);
|
|
|
- } catch (enqueueE) {
|
|
|
- ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
|
|
|
- throw enqueueE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamDefaultControllerCallPullIfNeeded(controller);
|
|
|
-
|
|
|
- return undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamDefaultControllerError(controller, e) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- ResetQueue(controller);
|
|
|
-
|
|
|
- ReadableStreamError(stream, e);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {
|
|
|
- if (controller._controlledReadableStream._state === 'readable') {
|
|
|
- ReadableStreamDefaultControllerError(controller, e);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableStreamDefaultControllerGetDesiredSize(controller) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
- var state = stream._state;
|
|
|
-
|
|
|
- if (state === 'errored') {
|
|
|
- return null;
|
|
|
- }
|
|
|
- if (state === 'closed') {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- return controller._strategyHWM - controller._queueTotalSize;
|
|
|
-}
|
|
|
-
|
|
|
-var ReadableStreamBYOBRequest = function () {
|
|
|
- function ReadableStreamBYOBRequest(controller, view) {
|
|
|
- _classCallCheck(this, ReadableStreamBYOBRequest);
|
|
|
-
|
|
|
- this._associatedReadableByteStreamController = controller;
|
|
|
- this._view = view;
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(ReadableStreamBYOBRequest, [{
|
|
|
- key: 'respond',
|
|
|
- value: function respond(bytesWritten) {
|
|
|
- if (IsReadableStreamBYOBRequest(this) === false) {
|
|
|
- throw byobRequestBrandCheckException('respond');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._associatedReadableByteStreamController === undefined) {
|
|
|
- throw new TypeError('This BYOB request has been invalidated');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'respondWithNewView',
|
|
|
- value: function respondWithNewView(view) {
|
|
|
- if (IsReadableStreamBYOBRequest(this) === false) {
|
|
|
- throw byobRequestBrandCheckException('respond');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._associatedReadableByteStreamController === undefined) {
|
|
|
- throw new TypeError('This BYOB request has been invalidated');
|
|
|
- }
|
|
|
-
|
|
|
- if (!ArrayBuffer.isView(view)) {
|
|
|
- throw new TypeError('You can only respond with array buffer views');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'view',
|
|
|
- get: function get() {
|
|
|
- return this._view;
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return ReadableStreamBYOBRequest;
|
|
|
-}();
|
|
|
-
|
|
|
-var ReadableByteStreamController = function () {
|
|
|
- function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {
|
|
|
- _classCallCheck(this, ReadableByteStreamController);
|
|
|
-
|
|
|
- if (IsReadableStream(stream) === false) {
|
|
|
- throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');
|
|
|
- }
|
|
|
-
|
|
|
- if (stream._readableStreamController !== undefined) {
|
|
|
- throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');
|
|
|
- }
|
|
|
-
|
|
|
- this._controlledReadableStream = stream;
|
|
|
-
|
|
|
- this._underlyingByteSource = underlyingByteSource;
|
|
|
-
|
|
|
- this._pullAgain = false;
|
|
|
- this._pulling = false;
|
|
|
-
|
|
|
- ReadableByteStreamControllerClearPendingPullIntos(this);
|
|
|
-
|
|
|
- // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.
|
|
|
- this._queue = this._queueTotalSize = undefined;
|
|
|
- ResetQueue(this);
|
|
|
-
|
|
|
- this._closeRequested = false;
|
|
|
- this._started = false;
|
|
|
-
|
|
|
- this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);
|
|
|
-
|
|
|
- var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;
|
|
|
- if (autoAllocateChunkSize !== undefined) {
|
|
|
- if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {
|
|
|
- throw new RangeError('autoAllocateChunkSize must be a positive integer');
|
|
|
- }
|
|
|
- }
|
|
|
- this._autoAllocateChunkSize = autoAllocateChunkSize;
|
|
|
-
|
|
|
- this._pendingPullIntos = [];
|
|
|
-
|
|
|
- var controller = this;
|
|
|
-
|
|
|
- var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);
|
|
|
- Promise.resolve(startResult).then(function () {
|
|
|
- controller._started = true;
|
|
|
-
|
|
|
- assert(controller._pulling === false);
|
|
|
- assert(controller._pullAgain === false);
|
|
|
-
|
|
|
- ReadableByteStreamControllerCallPullIfNeeded(controller);
|
|
|
- }, function (r) {
|
|
|
- if (stream._state === 'readable') {
|
|
|
- ReadableByteStreamControllerError(controller, r);
|
|
|
- }
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(ReadableByteStreamController, [{
|
|
|
- key: 'close',
|
|
|
- value: function close() {
|
|
|
- if (IsReadableByteStreamController(this) === false) {
|
|
|
- throw byteStreamControllerBrandCheckException('close');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._closeRequested === true) {
|
|
|
- throw new TypeError('The stream has already been closed; do not close it again!');
|
|
|
- }
|
|
|
-
|
|
|
- var state = this._controlledReadableStream._state;
|
|
|
- if (state !== 'readable') {
|
|
|
- throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerClose(this);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'enqueue',
|
|
|
- value: function enqueue(chunk) {
|
|
|
- if (IsReadableByteStreamController(this) === false) {
|
|
|
- throw byteStreamControllerBrandCheckException('enqueue');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._closeRequested === true) {
|
|
|
- throw new TypeError('stream is closed or draining');
|
|
|
- }
|
|
|
-
|
|
|
- var state = this._controlledReadableStream._state;
|
|
|
- if (state !== 'readable') {
|
|
|
- throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
|
|
|
- }
|
|
|
-
|
|
|
- if (!ArrayBuffer.isView(chunk)) {
|
|
|
- throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerEnqueue(this, chunk);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'error',
|
|
|
- value: function error(e) {
|
|
|
- if (IsReadableByteStreamController(this) === false) {
|
|
|
- throw byteStreamControllerBrandCheckException('error');
|
|
|
- }
|
|
|
-
|
|
|
- var stream = this._controlledReadableStream;
|
|
|
- if (stream._state !== 'readable') {
|
|
|
- throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerError(this, e);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: '__cancelSteps',
|
|
|
- value: function __cancelSteps(reason) {
|
|
|
- if (this._pendingPullIntos.length > 0) {
|
|
|
- var firstDescriptor = this._pendingPullIntos[0];
|
|
|
- firstDescriptor.bytesFilled = 0;
|
|
|
- }
|
|
|
-
|
|
|
- ResetQueue(this);
|
|
|
-
|
|
|
- return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: '__pullSteps',
|
|
|
- value: function __pullSteps() {
|
|
|
- var stream = this._controlledReadableStream;
|
|
|
- assert(ReadableStreamHasDefaultReader(stream) === true);
|
|
|
-
|
|
|
- if (this._queueTotalSize > 0) {
|
|
|
- assert(ReadableStreamGetNumReadRequests(stream) === 0);
|
|
|
-
|
|
|
- var entry = this._queue.shift();
|
|
|
- this._queueTotalSize -= entry.byteLength;
|
|
|
-
|
|
|
- ReadableByteStreamControllerHandleQueueDrain(this);
|
|
|
-
|
|
|
- var view = void 0;
|
|
|
- try {
|
|
|
- view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);
|
|
|
- } catch (viewE) {
|
|
|
- return Promise.reject(viewE);
|
|
|
- }
|
|
|
-
|
|
|
- return Promise.resolve(CreateIterResultObject(view, false));
|
|
|
- }
|
|
|
-
|
|
|
- var autoAllocateChunkSize = this._autoAllocateChunkSize;
|
|
|
- if (autoAllocateChunkSize !== undefined) {
|
|
|
- var buffer = void 0;
|
|
|
- try {
|
|
|
- buffer = new ArrayBuffer(autoAllocateChunkSize);
|
|
|
- } catch (bufferE) {
|
|
|
- return Promise.reject(bufferE);
|
|
|
- }
|
|
|
-
|
|
|
- var pullIntoDescriptor = {
|
|
|
- buffer: buffer,
|
|
|
- byteOffset: 0,
|
|
|
- byteLength: autoAllocateChunkSize,
|
|
|
- bytesFilled: 0,
|
|
|
- elementSize: 1,
|
|
|
- ctor: Uint8Array,
|
|
|
- readerType: 'default'
|
|
|
- };
|
|
|
-
|
|
|
- this._pendingPullIntos.push(pullIntoDescriptor);
|
|
|
- }
|
|
|
-
|
|
|
- var promise = ReadableStreamAddReadRequest(stream);
|
|
|
-
|
|
|
- ReadableByteStreamControllerCallPullIfNeeded(this);
|
|
|
-
|
|
|
- return promise;
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'byobRequest',
|
|
|
- get: function get() {
|
|
|
- if (IsReadableByteStreamController(this) === false) {
|
|
|
- throw byteStreamControllerBrandCheckException('byobRequest');
|
|
|
- }
|
|
|
-
|
|
|
- if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {
|
|
|
- var firstDescriptor = this._pendingPullIntos[0];
|
|
|
- var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);
|
|
|
-
|
|
|
- this._byobRequest = new ReadableStreamBYOBRequest(this, view);
|
|
|
- }
|
|
|
-
|
|
|
- return this._byobRequest;
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'desiredSize',
|
|
|
- get: function get() {
|
|
|
- if (IsReadableByteStreamController(this) === false) {
|
|
|
- throw byteStreamControllerBrandCheckException('desiredSize');
|
|
|
- }
|
|
|
-
|
|
|
- return ReadableByteStreamControllerGetDesiredSize(this);
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return ReadableByteStreamController;
|
|
|
-}();
|
|
|
-
|
|
|
-// Abstract operations for the ReadableByteStreamController.
|
|
|
-
|
|
|
-function IsReadableByteStreamController(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function IsReadableStreamBYOBRequest(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerCallPullIfNeeded(controller) {
|
|
|
- var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);
|
|
|
- if (shouldPull === false) {
|
|
|
- return undefined;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._pulling === true) {
|
|
|
- controller._pullAgain = true;
|
|
|
- return undefined;
|
|
|
- }
|
|
|
-
|
|
|
- assert(controller._pullAgain === false);
|
|
|
-
|
|
|
- controller._pulling = true;
|
|
|
-
|
|
|
- // TODO: Test controller argument
|
|
|
- var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);
|
|
|
- pullPromise.then(function () {
|
|
|
- controller._pulling = false;
|
|
|
-
|
|
|
- if (controller._pullAgain === true) {
|
|
|
- controller._pullAgain = false;
|
|
|
- ReadableByteStreamControllerCallPullIfNeeded(controller);
|
|
|
- }
|
|
|
- }, function (e) {
|
|
|
- if (controller._controlledReadableStream._state === 'readable') {
|
|
|
- ReadableByteStreamControllerError(controller, e);
|
|
|
- }
|
|
|
- }).catch(rethrowAssertionErrorRejection);
|
|
|
-
|
|
|
- return undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerClearPendingPullIntos(controller) {
|
|
|
- ReadableByteStreamControllerInvalidateBYOBRequest(controller);
|
|
|
- controller._pendingPullIntos = [];
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {
|
|
|
- assert(stream._state !== 'errored', 'state must not be errored');
|
|
|
-
|
|
|
- var done = false;
|
|
|
- if (stream._state === 'closed') {
|
|
|
- assert(pullIntoDescriptor.bytesFilled === 0);
|
|
|
- done = true;
|
|
|
- }
|
|
|
-
|
|
|
- var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
|
|
|
- if (pullIntoDescriptor.readerType === 'default') {
|
|
|
- ReadableStreamFulfillReadRequest(stream, filledView, done);
|
|
|
- } else {
|
|
|
- assert(pullIntoDescriptor.readerType === 'byob');
|
|
|
- ReadableStreamFulfillReadIntoRequest(stream, filledView, done);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {
|
|
|
- var bytesFilled = pullIntoDescriptor.bytesFilled;
|
|
|
- var elementSize = pullIntoDescriptor.elementSize;
|
|
|
-
|
|
|
- assert(bytesFilled <= pullIntoDescriptor.byteLength);
|
|
|
- assert(bytesFilled % elementSize === 0);
|
|
|
-
|
|
|
- return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {
|
|
|
- controller._queue.push({ buffer: buffer, byteOffset: byteOffset, byteLength: byteLength });
|
|
|
- controller._queueTotalSize += byteLength;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {
|
|
|
- var elementSize = pullIntoDescriptor.elementSize;
|
|
|
-
|
|
|
- var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;
|
|
|
-
|
|
|
- var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);
|
|
|
- var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;
|
|
|
- var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;
|
|
|
-
|
|
|
- var totalBytesToCopyRemaining = maxBytesToCopy;
|
|
|
- var ready = false;
|
|
|
- if (maxAlignedBytes > currentAlignedBytes) {
|
|
|
- totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;
|
|
|
- ready = true;
|
|
|
- }
|
|
|
-
|
|
|
- var queue = controller._queue;
|
|
|
-
|
|
|
- while (totalBytesToCopyRemaining > 0) {
|
|
|
- var headOfQueue = queue[0];
|
|
|
-
|
|
|
- var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);
|
|
|
-
|
|
|
- var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
|
|
|
- ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);
|
|
|
-
|
|
|
- if (headOfQueue.byteLength === bytesToCopy) {
|
|
|
- queue.shift();
|
|
|
- } else {
|
|
|
- headOfQueue.byteOffset += bytesToCopy;
|
|
|
- headOfQueue.byteLength -= bytesToCopy;
|
|
|
- }
|
|
|
- controller._queueTotalSize -= bytesToCopy;
|
|
|
-
|
|
|
- ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);
|
|
|
-
|
|
|
- totalBytesToCopyRemaining -= bytesToCopy;
|
|
|
- }
|
|
|
-
|
|
|
- if (ready === false) {
|
|
|
- assert(controller._queueTotalSize === 0, 'queue must be empty');
|
|
|
- assert(pullIntoDescriptor.bytesFilled > 0);
|
|
|
- assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);
|
|
|
- }
|
|
|
-
|
|
|
- return ready;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {
|
|
|
- assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);
|
|
|
-
|
|
|
- ReadableByteStreamControllerInvalidateBYOBRequest(controller);
|
|
|
- pullIntoDescriptor.bytesFilled += size;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerHandleQueueDrain(controller) {
|
|
|
- assert(controller._controlledReadableStream._state === 'readable');
|
|
|
-
|
|
|
- if (controller._queueTotalSize === 0 && controller._closeRequested === true) {
|
|
|
- ReadableStreamClose(controller._controlledReadableStream);
|
|
|
- } else {
|
|
|
- ReadableByteStreamControllerCallPullIfNeeded(controller);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {
|
|
|
- if (controller._byobRequest === undefined) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- controller._byobRequest._associatedReadableByteStreamController = undefined;
|
|
|
- controller._byobRequest._view = undefined;
|
|
|
- controller._byobRequest = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {
|
|
|
- assert(controller._closeRequested === false);
|
|
|
-
|
|
|
- while (controller._pendingPullIntos.length > 0) {
|
|
|
- if (controller._queueTotalSize === 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- var pullIntoDescriptor = controller._pendingPullIntos[0];
|
|
|
-
|
|
|
- if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
|
|
|
- ReadableByteStreamControllerShiftPendingPullInto(controller);
|
|
|
-
|
|
|
- ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerPullInto(controller, view) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- var elementSize = 1;
|
|
|
- if (view.constructor !== DataView) {
|
|
|
- elementSize = view.constructor.BYTES_PER_ELEMENT;
|
|
|
- }
|
|
|
-
|
|
|
- var ctor = view.constructor;
|
|
|
-
|
|
|
- var pullIntoDescriptor = {
|
|
|
- buffer: view.buffer,
|
|
|
- byteOffset: view.byteOffset,
|
|
|
- byteLength: view.byteLength,
|
|
|
- bytesFilled: 0,
|
|
|
- elementSize: elementSize,
|
|
|
- ctor: ctor,
|
|
|
- readerType: 'byob'
|
|
|
- };
|
|
|
-
|
|
|
- if (controller._pendingPullIntos.length > 0) {
|
|
|
- pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
|
|
|
- controller._pendingPullIntos.push(pullIntoDescriptor);
|
|
|
-
|
|
|
- // No ReadableByteStreamControllerCallPullIfNeeded() call since:
|
|
|
- // - No change happens on desiredSize
|
|
|
- // - The source has already been notified of that there's at least 1 pending read(view)
|
|
|
-
|
|
|
- return ReadableStreamAddReadIntoRequest(stream);
|
|
|
- }
|
|
|
-
|
|
|
- if (stream._state === 'closed') {
|
|
|
- var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);
|
|
|
- return Promise.resolve(CreateIterResultObject(emptyView, true));
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._queueTotalSize > 0) {
|
|
|
- if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
|
|
|
- var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
|
|
|
-
|
|
|
- ReadableByteStreamControllerHandleQueueDrain(controller);
|
|
|
-
|
|
|
- return Promise.resolve(CreateIterResultObject(filledView, false));
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._closeRequested === true) {
|
|
|
- var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
|
|
|
- ReadableByteStreamControllerError(controller, e);
|
|
|
-
|
|
|
- return Promise.reject(e);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
|
|
|
- controller._pendingPullIntos.push(pullIntoDescriptor);
|
|
|
-
|
|
|
- var promise = ReadableStreamAddReadIntoRequest(stream);
|
|
|
-
|
|
|
- ReadableByteStreamControllerCallPullIfNeeded(controller);
|
|
|
-
|
|
|
- return promise;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {
|
|
|
- firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);
|
|
|
-
|
|
|
- assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');
|
|
|
-
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
- if (ReadableStreamHasBYOBReader(stream) === true) {
|
|
|
- while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {
|
|
|
- var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);
|
|
|
- ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {
|
|
|
- if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {
|
|
|
- throw new RangeError('bytesWritten out of range');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);
|
|
|
-
|
|
|
- if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {
|
|
|
- // TODO: Figure out whether we should detach the buffer or not here.
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerShiftPendingPullInto(controller);
|
|
|
-
|
|
|
- var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;
|
|
|
- if (remainderSize > 0) {
|
|
|
- var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
|
|
|
- var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);
|
|
|
- ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);
|
|
|
- }
|
|
|
-
|
|
|
- pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
|
|
|
- pullIntoDescriptor.bytesFilled -= remainderSize;
|
|
|
- ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
|
|
|
-
|
|
|
- ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {
|
|
|
- var firstDescriptor = controller._pendingPullIntos[0];
|
|
|
-
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- if (stream._state === 'closed') {
|
|
|
- if (bytesWritten !== 0) {
|
|
|
- throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');
|
|
|
- }
|
|
|
-
|
|
|
- ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);
|
|
|
- } else {
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerShiftPendingPullInto(controller) {
|
|
|
- var descriptor = controller._pendingPullIntos.shift();
|
|
|
- ReadableByteStreamControllerInvalidateBYOBRequest(controller);
|
|
|
- return descriptor;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerShouldCallPull(controller) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- if (stream._state !== 'readable') {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._closeRequested === true) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._started === false) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-// A client of ReadableByteStreamController may use these functions directly to bypass state check.
|
|
|
-
|
|
|
-function ReadableByteStreamControllerClose(controller) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- assert(controller._closeRequested === false);
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- if (controller._queueTotalSize > 0) {
|
|
|
- controller._closeRequested = true;
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (controller._pendingPullIntos.length > 0) {
|
|
|
- var firstPendingPullInto = controller._pendingPullIntos[0];
|
|
|
- if (firstPendingPullInto.bytesFilled > 0) {
|
|
|
- var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
|
|
|
- ReadableByteStreamControllerError(controller, e);
|
|
|
-
|
|
|
- throw e;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- ReadableStreamClose(stream);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerEnqueue(controller, chunk) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- assert(controller._closeRequested === false);
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- var buffer = chunk.buffer;
|
|
|
- var byteOffset = chunk.byteOffset;
|
|
|
- var byteLength = chunk.byteLength;
|
|
|
- var transferredBuffer = TransferArrayBuffer(buffer);
|
|
|
-
|
|
|
- if (ReadableStreamHasDefaultReader(stream) === true) {
|
|
|
- if (ReadableStreamGetNumReadRequests(stream) === 0) {
|
|
|
- ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
|
|
|
- } else {
|
|
|
- assert(controller._queue.length === 0);
|
|
|
-
|
|
|
- var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);
|
|
|
- ReadableStreamFulfillReadRequest(stream, transferredView, false);
|
|
|
- }
|
|
|
- } else if (ReadableStreamHasBYOBReader(stream) === true) {
|
|
|
- // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully.
|
|
|
- ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
|
|
|
- ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
|
|
|
- } else {
|
|
|
- assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');
|
|
|
- ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerError(controller, e) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
-
|
|
|
- assert(stream._state === 'readable');
|
|
|
-
|
|
|
- ReadableByteStreamControllerClearPendingPullIntos(controller);
|
|
|
-
|
|
|
- ResetQueue(controller);
|
|
|
- ReadableStreamError(stream, e);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerGetDesiredSize(controller) {
|
|
|
- var stream = controller._controlledReadableStream;
|
|
|
- var state = stream._state;
|
|
|
-
|
|
|
- if (state === 'errored') {
|
|
|
- return null;
|
|
|
- }
|
|
|
- if (state === 'closed') {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- return controller._strategyHWM - controller._queueTotalSize;
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerRespond(controller, bytesWritten) {
|
|
|
- bytesWritten = Number(bytesWritten);
|
|
|
- if (IsFiniteNonNegativeNumber(bytesWritten) === false) {
|
|
|
- throw new RangeError('bytesWritten must be a finite');
|
|
|
- }
|
|
|
-
|
|
|
- assert(controller._pendingPullIntos.length > 0);
|
|
|
-
|
|
|
- ReadableByteStreamControllerRespondInternal(controller, bytesWritten);
|
|
|
-}
|
|
|
-
|
|
|
-function ReadableByteStreamControllerRespondWithNewView(controller, view) {
|
|
|
- assert(controller._pendingPullIntos.length > 0);
|
|
|
-
|
|
|
- var firstDescriptor = controller._pendingPullIntos[0];
|
|
|
-
|
|
|
- if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {
|
|
|
- throw new RangeError('The region specified by view does not match byobRequest');
|
|
|
- }
|
|
|
- if (firstDescriptor.byteLength !== view.byteLength) {
|
|
|
- throw new RangeError('The buffer of view has different capacity than byobRequest');
|
|
|
- }
|
|
|
-
|
|
|
- firstDescriptor.buffer = view.buffer;
|
|
|
-
|
|
|
- ReadableByteStreamControllerRespondInternal(controller, view.byteLength);
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the ReadableStream.
|
|
|
-
|
|
|
-function streamBrandCheckException(name) {
|
|
|
- return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the readers.
|
|
|
-
|
|
|
-function readerLockException(name) {
|
|
|
- return new TypeError('Cannot ' + name + ' a stream using a released reader');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the ReadableStreamDefaultReader.
|
|
|
-
|
|
|
-function defaultReaderBrandCheckException(name) {
|
|
|
- return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');
|
|
|
-}
|
|
|
-
|
|
|
-function defaultReaderClosedPromiseInitialize(reader) {
|
|
|
- reader._closedPromise = new Promise(function (resolve, reject) {
|
|
|
- reader._closedPromise_resolve = resolve;
|
|
|
- reader._closedPromise_reject = reject;
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {
|
|
|
- reader._closedPromise = Promise.reject(reason);
|
|
|
- reader._closedPromise_resolve = undefined;
|
|
|
- reader._closedPromise_reject = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function defaultReaderClosedPromiseInitializeAsResolved(reader) {
|
|
|
- reader._closedPromise = Promise.resolve(undefined);
|
|
|
- reader._closedPromise_resolve = undefined;
|
|
|
- reader._closedPromise_reject = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function defaultReaderClosedPromiseReject(reader, reason) {
|
|
|
- assert(reader._closedPromise_resolve !== undefined);
|
|
|
- assert(reader._closedPromise_reject !== undefined);
|
|
|
-
|
|
|
- reader._closedPromise_reject(reason);
|
|
|
- reader._closedPromise_resolve = undefined;
|
|
|
- reader._closedPromise_reject = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-function defaultReaderClosedPromiseResetToRejected(reader, reason) {
|
|
|
- assert(reader._closedPromise_resolve === undefined);
|
|
|
- assert(reader._closedPromise_reject === undefined);
|
|
|
-
|
|
|
- reader._closedPromise = Promise.reject(reason);
|
|
|
-}
|
|
|
-
|
|
|
-function defaultReaderClosedPromiseResolve(reader) {
|
|
|
- assert(reader._closedPromise_resolve !== undefined);
|
|
|
- assert(reader._closedPromise_reject !== undefined);
|
|
|
-
|
|
|
- reader._closedPromise_resolve(undefined);
|
|
|
- reader._closedPromise_resolve = undefined;
|
|
|
- reader._closedPromise_reject = undefined;
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the ReadableStreamDefaultReader.
|
|
|
-
|
|
|
-function byobReaderBrandCheckException(name) {
|
|
|
- return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the ReadableStreamDefaultController.
|
|
|
-
|
|
|
-function defaultControllerBrandCheckException(name) {
|
|
|
- return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the ReadableStreamBYOBRequest.
|
|
|
-
|
|
|
-function byobRequestBrandCheckException(name) {
|
|
|
- return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the ReadableByteStreamController.
|
|
|
-
|
|
|
-function byteStreamControllerBrandCheckException(name) {
|
|
|
- return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper function for ReadableStream pipeThrough
|
|
|
-
|
|
|
-function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {
|
|
|
- try {
|
|
|
- // This relies on the brand-check that is enforced by Promise.prototype.then(). As with the rest of the reference
|
|
|
- // implementation, it doesn't attempt to do the right thing if someone has modified the global environment.
|
|
|
- Promise.prototype.then.call(promise, undefined, function () {});
|
|
|
- } catch (e) {
|
|
|
- // The brand check failed, therefore the internal slot is not present and there's nothing further to do.
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/***/ }),
|
|
|
-/* 5 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-"use strict";
|
|
|
-
|
|
|
-
|
|
|
-var transformStream = __webpack_require__(6);
|
|
|
-var readableStream = __webpack_require__(4);
|
|
|
-var writableStream = __webpack_require__(2);
|
|
|
-
|
|
|
-exports.TransformStream = transformStream.TransformStream;
|
|
|
-exports.ReadableStream = readableStream.ReadableStream;
|
|
|
-exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;
|
|
|
-exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;
|
|
|
-exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;
|
|
|
-exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;
|
|
|
-exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;
|
|
|
-exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;
|
|
|
-exports.IsWritableStream = writableStream.IsWritableStream;
|
|
|
-exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;
|
|
|
-exports.WritableStream = writableStream.WritableStream;
|
|
|
-exports.WritableStreamAbort = writableStream.WritableStreamAbort;
|
|
|
-exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;
|
|
|
-exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;
|
|
|
-exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;
|
|
|
-exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;
|
|
|
-
|
|
|
-/***/ }),
|
|
|
-/* 6 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-"use strict";
|
|
|
-
|
|
|
-
|
|
|
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
-
|
|
|
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
-
|
|
|
-var _require = __webpack_require__(1),
|
|
|
- assert = _require.assert;
|
|
|
-
|
|
|
-var _require2 = __webpack_require__(0),
|
|
|
- InvokeOrNoop = _require2.InvokeOrNoop,
|
|
|
- PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,
|
|
|
- PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,
|
|
|
- typeIsObject = _require2.typeIsObject;
|
|
|
-
|
|
|
-var _require3 = __webpack_require__(4),
|
|
|
- ReadableStream = _require3.ReadableStream,
|
|
|
- ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,
|
|
|
- ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,
|
|
|
- ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,
|
|
|
- ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;
|
|
|
-
|
|
|
-var _require4 = __webpack_require__(2),
|
|
|
- WritableStream = _require4.WritableStream,
|
|
|
- WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;
|
|
|
-
|
|
|
-// Methods on the transform stream controller object
|
|
|
-
|
|
|
-function TransformStreamCloseReadable(transformStream) {
|
|
|
- // console.log('TransformStreamCloseReadable()');
|
|
|
-
|
|
|
- if (transformStream._errored === true) {
|
|
|
- throw new TypeError('TransformStream is already errored');
|
|
|
- }
|
|
|
-
|
|
|
- if (transformStream._readableClosed === true) {
|
|
|
- throw new TypeError('Readable side is already closed');
|
|
|
- }
|
|
|
-
|
|
|
- TransformStreamCloseReadableInternal(transformStream);
|
|
|
-}
|
|
|
-
|
|
|
-function TransformStreamEnqueueToReadable(transformStream, chunk) {
|
|
|
- // console.log('TransformStreamEnqueueToReadable()');
|
|
|
-
|
|
|
- if (transformStream._errored === true) {
|
|
|
- throw new TypeError('TransformStream is already errored');
|
|
|
- }
|
|
|
-
|
|
|
- if (transformStream._readableClosed === true) {
|
|
|
- throw new TypeError('Readable side is already closed');
|
|
|
- }
|
|
|
-
|
|
|
- // We throttle transformer.transform invocation based on the backpressure of the ReadableStream, but we still
|
|
|
- // accept TransformStreamEnqueueToReadable() calls.
|
|
|
-
|
|
|
- var controller = transformStream._readableController;
|
|
|
-
|
|
|
- try {
|
|
|
- ReadableStreamDefaultControllerEnqueue(controller, chunk);
|
|
|
- } catch (e) {
|
|
|
- // This happens when readableStrategy.size() throws.
|
|
|
- // The ReadableStream has already errored itself.
|
|
|
- transformStream._readableClosed = true;
|
|
|
- TransformStreamErrorIfNeeded(transformStream, e);
|
|
|
-
|
|
|
- throw transformStream._storedError;
|
|
|
- }
|
|
|
-
|
|
|
- var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
|
|
|
- var maybeBackpressure = desiredSize <= 0;
|
|
|
-
|
|
|
- if (maybeBackpressure === true && transformStream._backpressure === false) {
|
|
|
- // This allows pull() again. When desiredSize is 0, it's possible that a pull() will happen immediately (but
|
|
|
- // asynchronously) after this because of pending read()s and set _backpressure back to false.
|
|
|
- //
|
|
|
- // If pull() could be called from inside enqueue(), then this logic would be wrong. This cannot happen
|
|
|
- // because there is always a promise pending from start() or pull() when _backpressure is false.
|
|
|
- TransformStreamSetBackpressure(transformStream, true);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function TransformStreamError(transformStream, e) {
|
|
|
- if (transformStream._errored === true) {
|
|
|
- throw new TypeError('TransformStream is already errored');
|
|
|
- }
|
|
|
-
|
|
|
- TransformStreamErrorInternal(transformStream, e);
|
|
|
-}
|
|
|
-
|
|
|
-// Abstract operations.
|
|
|
-
|
|
|
-function TransformStreamCloseReadableInternal(transformStream) {
|
|
|
- assert(transformStream._errored === false);
|
|
|
- assert(transformStream._readableClosed === false);
|
|
|
-
|
|
|
- try {
|
|
|
- ReadableStreamDefaultControllerClose(transformStream._readableController);
|
|
|
- } catch (e) {
|
|
|
- assert(false);
|
|
|
- }
|
|
|
-
|
|
|
- transformStream._readableClosed = true;
|
|
|
-}
|
|
|
-
|
|
|
-function TransformStreamErrorIfNeeded(transformStream, e) {
|
|
|
- if (transformStream._errored === false) {
|
|
|
- TransformStreamErrorInternal(transformStream, e);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function TransformStreamErrorInternal(transformStream, e) {
|
|
|
- // console.log('TransformStreamErrorInternal()');
|
|
|
-
|
|
|
- assert(transformStream._errored === false);
|
|
|
-
|
|
|
- transformStream._errored = true;
|
|
|
- transformStream._storedError = e;
|
|
|
-
|
|
|
- if (transformStream._writableDone === false) {
|
|
|
- WritableStreamDefaultControllerError(transformStream._writableController, e);
|
|
|
- }
|
|
|
- if (transformStream._readableClosed === false) {
|
|
|
- ReadableStreamDefaultControllerError(transformStream._readableController, e);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// Used for preventing the next write() call on TransformStreamSink until there
|
|
|
-// is no longer backpressure.
|
|
|
-function TransformStreamReadableReadyPromise(transformStream) {
|
|
|
- assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
|
|
|
-
|
|
|
- if (transformStream._backpressure === false) {
|
|
|
- return Promise.resolve();
|
|
|
- }
|
|
|
-
|
|
|
- assert(transformStream._backpressure === true, '_backpressure should have been initialized');
|
|
|
-
|
|
|
- return transformStream._backpressureChangePromise;
|
|
|
-}
|
|
|
-
|
|
|
-function TransformStreamSetBackpressure(transformStream, backpressure) {
|
|
|
- // console.log(`TransformStreamSetBackpressure(${backpressure})`);
|
|
|
-
|
|
|
- // Passes also when called during construction.
|
|
|
- assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');
|
|
|
-
|
|
|
- if (transformStream._backpressureChangePromise !== undefined) {
|
|
|
- // The fulfillment value is just for a sanity check.
|
|
|
- transformStream._backpressureChangePromise_resolve(backpressure);
|
|
|
- }
|
|
|
-
|
|
|
- transformStream._backpressureChangePromise = new Promise(function (resolve) {
|
|
|
- transformStream._backpressureChangePromise_resolve = resolve;
|
|
|
- });
|
|
|
-
|
|
|
- transformStream._backpressureChangePromise.then(function (resolution) {
|
|
|
- assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');
|
|
|
- });
|
|
|
-
|
|
|
- transformStream._backpressure = backpressure;
|
|
|
-}
|
|
|
-
|
|
|
-function TransformStreamDefaultTransform(chunk, transformStreamController) {
|
|
|
- var transformStream = transformStreamController._controlledTransformStream;
|
|
|
- TransformStreamEnqueueToReadable(transformStream, chunk);
|
|
|
- return Promise.resolve();
|
|
|
-}
|
|
|
-
|
|
|
-function TransformStreamTransform(transformStream, chunk) {
|
|
|
- // console.log('TransformStreamTransform()');
|
|
|
-
|
|
|
- assert(transformStream._errored === false);
|
|
|
- assert(transformStream._transforming === false);
|
|
|
- assert(transformStream._backpressure === false);
|
|
|
-
|
|
|
- transformStream._transforming = true;
|
|
|
-
|
|
|
- var transformer = transformStream._transformer;
|
|
|
- var controller = transformStream._transformStreamController;
|
|
|
-
|
|
|
- var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);
|
|
|
-
|
|
|
- return transformPromise.then(function () {
|
|
|
- transformStream._transforming = false;
|
|
|
-
|
|
|
- return TransformStreamReadableReadyPromise(transformStream);
|
|
|
- }, function (e) {
|
|
|
- TransformStreamErrorIfNeeded(transformStream, e);
|
|
|
- return Promise.reject(e);
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-function IsTransformStreamDefaultController(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-function IsTransformStream(x) {
|
|
|
- if (!typeIsObject(x)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-var TransformStreamSink = function () {
|
|
|
- function TransformStreamSink(transformStream, startPromise) {
|
|
|
- _classCallCheck(this, TransformStreamSink);
|
|
|
-
|
|
|
- this._transformStream = transformStream;
|
|
|
- this._startPromise = startPromise;
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(TransformStreamSink, [{
|
|
|
- key: 'start',
|
|
|
- value: function start(c) {
|
|
|
- var transformStream = this._transformStream;
|
|
|
-
|
|
|
- transformStream._writableController = c;
|
|
|
-
|
|
|
- return this._startPromise.then(function () {
|
|
|
- return TransformStreamReadableReadyPromise(transformStream);
|
|
|
- });
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'write',
|
|
|
- value: function write(chunk) {
|
|
|
- // console.log('TransformStreamSink.write()');
|
|
|
-
|
|
|
- var transformStream = this._transformStream;
|
|
|
-
|
|
|
- return TransformStreamTransform(transformStream, chunk);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'abort',
|
|
|
- value: function abort() {
|
|
|
- var transformStream = this._transformStream;
|
|
|
- transformStream._writableDone = true;
|
|
|
- TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'close',
|
|
|
- value: function close() {
|
|
|
- // console.log('TransformStreamSink.close()');
|
|
|
-
|
|
|
- var transformStream = this._transformStream;
|
|
|
-
|
|
|
- assert(transformStream._transforming === false);
|
|
|
-
|
|
|
- transformStream._writableDone = true;
|
|
|
-
|
|
|
- var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);
|
|
|
- // Return a promise that is fulfilled with undefined on success.
|
|
|
- return flushPromise.then(function () {
|
|
|
- if (transformStream._errored === true) {
|
|
|
- return Promise.reject(transformStream._storedError);
|
|
|
- }
|
|
|
- if (transformStream._readableClosed === false) {
|
|
|
- TransformStreamCloseReadableInternal(transformStream);
|
|
|
- }
|
|
|
- return Promise.resolve();
|
|
|
- }).catch(function (r) {
|
|
|
- TransformStreamErrorIfNeeded(transformStream, r);
|
|
|
- return Promise.reject(transformStream._storedError);
|
|
|
- });
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return TransformStreamSink;
|
|
|
-}();
|
|
|
-
|
|
|
-var TransformStreamSource = function () {
|
|
|
- function TransformStreamSource(transformStream, startPromise) {
|
|
|
- _classCallCheck(this, TransformStreamSource);
|
|
|
-
|
|
|
- this._transformStream = transformStream;
|
|
|
- this._startPromise = startPromise;
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(TransformStreamSource, [{
|
|
|
- key: 'start',
|
|
|
- value: function start(c) {
|
|
|
- var transformStream = this._transformStream;
|
|
|
-
|
|
|
- transformStream._readableController = c;
|
|
|
-
|
|
|
- return this._startPromise.then(function () {
|
|
|
- // Prevent the first pull() call until there is backpressure.
|
|
|
-
|
|
|
- assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
|
|
|
-
|
|
|
- if (transformStream._backpressure === true) {
|
|
|
- return Promise.resolve();
|
|
|
- }
|
|
|
-
|
|
|
- assert(transformStream._backpressure === false, '_backpressure should have been initialized');
|
|
|
-
|
|
|
- return transformStream._backpressureChangePromise;
|
|
|
- });
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'pull',
|
|
|
- value: function pull() {
|
|
|
- // console.log('TransformStreamSource.pull()');
|
|
|
-
|
|
|
- var transformStream = this._transformStream;
|
|
|
-
|
|
|
- // Invariant. Enforced by the promises returned by start() and pull().
|
|
|
- assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');
|
|
|
-
|
|
|
- assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
|
|
|
-
|
|
|
- TransformStreamSetBackpressure(transformStream, false);
|
|
|
-
|
|
|
- // Prevent the next pull() call until there is backpressure.
|
|
|
- return transformStream._backpressureChangePromise;
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'cancel',
|
|
|
- value: function cancel() {
|
|
|
- var transformStream = this._transformStream;
|
|
|
- transformStream._readableClosed = true;
|
|
|
- TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return TransformStreamSource;
|
|
|
-}();
|
|
|
-
|
|
|
-var TransformStreamDefaultController = function () {
|
|
|
- function TransformStreamDefaultController(transformStream) {
|
|
|
- _classCallCheck(this, TransformStreamDefaultController);
|
|
|
-
|
|
|
- if (IsTransformStream(transformStream) === false) {
|
|
|
- throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');
|
|
|
- }
|
|
|
-
|
|
|
- if (transformStream._transformStreamController !== undefined) {
|
|
|
- throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');
|
|
|
- }
|
|
|
-
|
|
|
- this._controlledTransformStream = transformStream;
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(TransformStreamDefaultController, [{
|
|
|
- key: 'enqueue',
|
|
|
- value: function enqueue(chunk) {
|
|
|
- if (IsTransformStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('enqueue');
|
|
|
- }
|
|
|
-
|
|
|
- TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'close',
|
|
|
- value: function close() {
|
|
|
- if (IsTransformStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('close');
|
|
|
- }
|
|
|
-
|
|
|
- TransformStreamCloseReadable(this._controlledTransformStream);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'error',
|
|
|
- value: function error(reason) {
|
|
|
- if (IsTransformStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('error');
|
|
|
- }
|
|
|
-
|
|
|
- TransformStreamError(this._controlledTransformStream, reason);
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'desiredSize',
|
|
|
- get: function get() {
|
|
|
- if (IsTransformStreamDefaultController(this) === false) {
|
|
|
- throw defaultControllerBrandCheckException('desiredSize');
|
|
|
- }
|
|
|
-
|
|
|
- var transformStream = this._controlledTransformStream;
|
|
|
- var readableController = transformStream._readableController;
|
|
|
-
|
|
|
- return ReadableStreamDefaultControllerGetDesiredSize(readableController);
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return TransformStreamDefaultController;
|
|
|
-}();
|
|
|
-
|
|
|
-var TransformStream = function () {
|
|
|
- function TransformStream() {
|
|
|
- var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
-
|
|
|
- _classCallCheck(this, TransformStream);
|
|
|
-
|
|
|
- this._transformer = transformer;
|
|
|
- var readableStrategy = transformer.readableStrategy,
|
|
|
- writableStrategy = transformer.writableStrategy;
|
|
|
-
|
|
|
-
|
|
|
- this._transforming = false;
|
|
|
- this._errored = false;
|
|
|
- this._storedError = undefined;
|
|
|
-
|
|
|
- this._writableController = undefined;
|
|
|
- this._readableController = undefined;
|
|
|
- this._transformStreamController = undefined;
|
|
|
-
|
|
|
- this._writableDone = false;
|
|
|
- this._readableClosed = false;
|
|
|
-
|
|
|
- this._backpressure = undefined;
|
|
|
- this._backpressureChangePromise = undefined;
|
|
|
- this._backpressureChangePromise_resolve = undefined;
|
|
|
-
|
|
|
- this._transformStreamController = new TransformStreamDefaultController(this);
|
|
|
-
|
|
|
- var startPromise_resolve = void 0;
|
|
|
- var startPromise = new Promise(function (resolve) {
|
|
|
- startPromise_resolve = resolve;
|
|
|
- });
|
|
|
-
|
|
|
- var source = new TransformStreamSource(this, startPromise);
|
|
|
-
|
|
|
- this._readable = new ReadableStream(source, readableStrategy);
|
|
|
-
|
|
|
- var sink = new TransformStreamSink(this, startPromise);
|
|
|
-
|
|
|
- this._writable = new WritableStream(sink, writableStrategy);
|
|
|
-
|
|
|
- assert(this._writableController !== undefined);
|
|
|
- assert(this._readableController !== undefined);
|
|
|
-
|
|
|
- var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);
|
|
|
- // Set _backpressure based on desiredSize. As there is no read() at this point, we can just interpret
|
|
|
- // desiredSize being non-positive as backpressure.
|
|
|
- TransformStreamSetBackpressure(this, desiredSize <= 0);
|
|
|
-
|
|
|
- var transformStream = this;
|
|
|
- var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);
|
|
|
- startPromise_resolve(startResult);
|
|
|
- startPromise.catch(function (e) {
|
|
|
- // The underlyingSink and underlyingSource will error the readable and writable ends on their own.
|
|
|
- if (transformStream._errored === false) {
|
|
|
- transformStream._errored = true;
|
|
|
- transformStream._storedError = e;
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- _createClass(TransformStream, [{
|
|
|
- key: 'readable',
|
|
|
- get: function get() {
|
|
|
- if (IsTransformStream(this) === false) {
|
|
|
- throw streamBrandCheckException('readable');
|
|
|
- }
|
|
|
-
|
|
|
- return this._readable;
|
|
|
- }
|
|
|
- }, {
|
|
|
- key: 'writable',
|
|
|
- get: function get() {
|
|
|
- if (IsTransformStream(this) === false) {
|
|
|
- throw streamBrandCheckException('writable');
|
|
|
- }
|
|
|
-
|
|
|
- return this._writable;
|
|
|
- }
|
|
|
- }]);
|
|
|
-
|
|
|
- return TransformStream;
|
|
|
-}();
|
|
|
-
|
|
|
-module.exports = { TransformStream: TransformStream };
|
|
|
-
|
|
|
-// Helper functions for the TransformStreamDefaultController.
|
|
|
-
|
|
|
-function defaultControllerBrandCheckException(name) {
|
|
|
- return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');
|
|
|
-}
|
|
|
-
|
|
|
-// Helper functions for the TransformStream.
|
|
|
-
|
|
|
-function streamBrandCheckException(name) {
|
|
|
- return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');
|
|
|
-}
|
|
|
-
|
|
|
-/***/ }),
|
|
|
-/* 7 */
|
|
|
-/***/ (function(module, exports, __webpack_require__) {
|
|
|
-
|
|
|
-module.exports = __webpack_require__(5);
|
|
|
-
|
|
|
-
|
|
|
-/***/ })
|
|
|
-/******/ ])));
|