/* * 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); /***/ }) /******/ ])));