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