license Zone . __load_patch ( 'ZoneAwarePromise' , ( global , Zone , api ) => { const ObjectGetOwnPropertyDescriptor = Object . getOwnPropertyDescriptor ; const ObjectDefineProperty = Object . defineProperty ; function readableObjectToString ( obj ) { if ( obj && obj . toString === Object . prototype . toString ) { const className = obj . constructor && obj . constructor . name ; return ( className ? className : '' ) + ': ' + JSON . stringify ( obj ) ; } return obj ? obj . toString ( ) : Object . prototype . toString . call ( obj ) ; } const __symbol__ = api . symbol ; const _uncaughtPromiseErrors = [ ] ; const symbolPromise = __symbol__ ( 'Promise' ) ; const symbolThen = __symbol__ ( 'then' ) ; const creationTrace = '__creationTrace__' ; api . onUnhandledError = ( e ) => { if ( api . showUncaughtError ( ) ) { const rejection = e && e . rejection ; if ( rejection ) { console . error ( 'Unhandled Promise rejection:' , rejection instanceof Error ? rejection . message : rejection , '; Zone:' , ( < Zone > e . zone ) . name , '; Task:' , e . task && ( < Task > e . task ) . source , '; Value:' , rejection , rejection instanceof Error ? rejection . stack : undefined ) ; } else { console . error ( e ) ; } } } ; api . microtaskDrainDone = ( ) => { while ( _uncaughtPromiseErrors . length ) { while ( _uncaughtPromiseErrors . length ) { const uncaughtPromiseError = _uncaughtPromiseErrors . shift ( ) ! ; try { uncaughtPromiseError . zone . runGuarded ( ( ) => { throw uncaughtPromiseError ; } ) ; } catch ( error ) { handleUnhandledRejection ( error ) ; } } } } ; const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__ ( 'unhandledPromiseRejectionHandler' ) ; function handleUnhandledRejection ( e ) { api . onUnhandledError ( e ) ; try { const handler = ( Zone as any ) [ UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL ] ; if ( handler && typeof handler === 'function' ) { handler . call ( this , e ) ; } } catch ( err ) { } } function isThenable ( value ) { return value && value . then ; } function forwardResolution ( value ) { return value ; } function forwardRejection ( rejection ) { return ZoneAwarePromise . reject ( rejection ) ; } const symbolState = __symbol__ ( 'state' ) ; const symbolValue = __symbol__ ( 'value' ) ; const symbolFinally = __symbol__ ( 'finally' ) ; const symbolParentPromiseValue = __symbol__ ( 'parentPromiseValue' ) ; const symbolParentPromiseState = __symbol__ ( 'parentPromiseState' ) ; const source = 'Promise.then' ; const UNRESOLVED = null ; const RESOLVED = true ; const REJECTED = false ; const REJECTED_NO_CATCH = 0 ; function makeResolver ( promise , state ) { return ( v ) => { try { resolvePromise ( promise , state , v ) ; } catch ( err ) { resolvePromise ( promise , false , err ) ; } } ; } const once = function ( ) { let wasCalled = false ; return function wrapper ( wrappedFunction ) { return function ( ) { if ( wasCalled ) { return ; } wasCalled = true ; wrappedFunction . apply ( null , arguments ) ; } ; } ; } ; const TYPE_ERROR = 'Promise resolved with itself' ; const CURRENT_TASK_TRACE_SYMBOL = __symbol__ ( 'currentTaskTrace' ) ; function resolvePromise ( promise , state , value ) { const onceWrapper = once ( ) ; if ( promise === value ) { throw new TypeError ( TYPE_ERROR ) ; } if ( ( promise as any ) [ symbolState ] === UNRESOLVED ) { let then = null ; try { if ( typeof value === 'object' || typeof value === 'function' ) { then = value && value . then ; } } catch ( err ) { onceWrapper ( ( ) => { resolvePromise ( promise , false , err ) ; } ) ( ) ; return promise ; } if ( state !== REJECTED && value instanceof ZoneAwarePromise && value . hasOwnProperty ( symbolState ) && value . hasOwnProperty ( symbolValue ) && ( value as any ) [ symbolState ] !== UNRESOLVED ) { clearRejectedNoCatch ( < Promise < any > > value as any ) ; resolvePromise ( promise , ( value as any ) [ symbolState ] , ( value as any ) [ symbolValue ] ) ; } else if ( state !== REJECTED && typeof then === 'function' ) { try { then . call ( value , onceWrapper ( makeResolver ( promise , state ) ) , onceWrapper ( makeResolver ( promise , false ) ) ) ; } catch ( err ) { onceWrapper ( ( ) => { resolvePromise ( promise , false , err ) ; } ) ( ) ; } } else { ( promise as any ) [ symbolState ] = state ; const queue = ( promise as any ) [ symbolValue ] ; ( promise as any ) [ symbolValue ] = value ; if ( ( promise as any ) [ symbolFinally ] === symbolFinally ) { if ( state === RESOLVED ) { ( promise as any ) [ symbolState ] = ( promise as any ) [ symbolParentPromiseState ] ; ( promise as any ) [ symbolValue ] = ( promise as any ) [ symbolParentPromiseValue ] ; } } if ( state === REJECTED && value instanceof Error ) { const trace = Zone . currentTask && Zone . currentTask . data && ( Zone . currentTask . data as any ) [ creationTrace ] ; if ( trace ) { ObjectDefineProperty ( value , CURRENT_TASK_TRACE_SYMBOL , { configurable : true , enumerable : false , writable : true , value : trace } ) ; } } for ( let i = 0 ; i < queue . length ; ) { scheduleResolveOrReject ( promise , queue [ i ++ ] , queue [ i ++ ] , queue [ i ++ ] , queue [ i ++ ] ) ; } if ( queue . length == 0 && state == REJECTED ) { ( promise as any ) [ symbolState ] = REJECTED_NO_CATCH ; try { throw new Error ( 'Uncaught (in promise): ' + readableObjectToString ( value ) + ( value && value . stack ? '\n' + value . stack : '' ) ) ; } catch ( err ) { const error = err ; error . rejection = value ; error . promise = promise ; error . zone = Zone . current ; error . task = Zone . currentTask ! ; _uncaughtPromiseErrors . push ( error ) ; api . scheduleMicroTask ( ) ; } } } } return promise ; } const REJECTION_HANDLED_HANDLER = __symbol__ ( 'rejectionHandledHandler' ) ; function clearRejectedNoCatch ( promise ) { if ( ( promise as any ) [ symbolState ] === REJECTED_NO_CATCH ) { try { const handler = ( Zone as any ) [ REJECTION_HANDLED_HANDLER ] ; if ( handler && typeof handler === 'function' ) { handler . call ( this , { rejection : ( promise as any ) [ symbolValue ] , promise : promise } ) ; } } catch ( err ) { } ( promise as any ) [ symbolState ] = REJECTED ; for ( let i = 0 ; i < _uncaughtPromiseErrors . length ; i ++ ) { if ( promise === _uncaughtPromiseErrors [ i ] . promise ) { _uncaughtPromiseErrors . splice ( i , 1 ) ; } } } } function scheduleResolveOrReject < R , U1 , U2 > ( promise , zone , chainPromise , onFulfilled ? , onRejected ? ) { clearRejectedNoCatch ( promise ) ; const promiseState = ( promise as any ) [ symbolState ] ; const delegate = promiseState ? ( typeof onFulfilled === 'function' ) ? onFulfilled : forwardResolution : ( typeof onRejected === 'function' ) ? onRejected : forwardRejection ; zone . scheduleMicroTask ( source , ( ) => { try { const parentPromiseValue = ( promise as any ) [ symbolValue ] ; const isFinallyPromise = ! ! chainPromise && symbolFinally === ( chainPromise as any ) [ symbolFinally ] ; if ( isFinallyPromise ) { ( chainPromise as any ) [ symbolParentPromiseValue ] = parentPromiseValue ; ( chainPromise as any ) [ symbolParentPromiseState ] = promiseState ; } const value = zone . run ( delegate , undefined , isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ? [ ] : [ parentPromiseValue ] ) ; resolvePromise ( chainPromise , true , value ) ; } catch ( error ) { resolvePromise ( chainPromise , false , error ) ; } } , chainPromise as TaskData ) ; } const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }' ; class ZoneAwarePromise < R > implements Promise < R > { static toString ( ) { return ZONE_AWARE_PROMISE_TO_STRING ; } static resolve < R > ( value ) { return resolvePromise ( < ZoneAwarePromise < R > > new this ( null as any ) , RESOLVED , value ) ; } static reject < U > ( error ) { return resolvePromise ( < ZoneAwarePromise < U > > new this ( null as any ) , REJECTED , error ) ; } static race < R > ( values ) { let resolve ; let reject ; let promise = new this ( ( res , rej ) => { resolve = res ; reject = rej ; } ) ; function onResolve ( value ) { resolve ( value ) ; } function onReject ( error ) { reject ( error ) ; } for ( let value of values ) { if ( ! isThenable ( value ) ) { value = this . resolve ( value ) ; } value . then ( onResolve , onReject ) ; } return promise ; } static all < R > ( values ) { let resolve ; let reject ; let promise = new this < R > ( ( res , rej ) => { resolve = res ; reject = rej ; } ) ; let unresolvedCount = 2 ; let valueIndex = 0 ; const resolvedValues = [ ] ; for ( let value of values ) { if ( ! isThenable ( value ) ) { value = this . resolve ( value ) ; } const curValueIndex = valueIndex ; value . then ( ( value ) => { resolvedValues [ curValueIndex ] = value ; unresolvedCount -- ; if ( unresolvedCount === 0 ) { resolve ! ( resolvedValues ) ; } } , reject ! ) ; unresolvedCount ++ ; valueIndex ++ ; } unresolvedCount -= 2 ; if ( unresolvedCount === 0 ) { resolve ! ( resolvedValues ) ; } return promise ; } constructor ( executor ) { const promise = this ; if ( ! ( promise instanceof ZoneAwarePromise ) ) { throw new Error ( 'Must be an instanceof Promise.' ) ; } ( promise as any ) [ symbolState ] = UNRESOLVED ; ( promise as any ) [ symbolValue ] = [ ] ; try { executor && executor ( makeResolver ( promise , RESOLVED ) , makeResolver ( promise , REJECTED ) ) ; } catch ( error ) { resolvePromise ( promise , false , error ) ; } } get [ Symbol . toStringTag ] ( ) { return 'Promise' as any ; } then < TResult1 = R , TResult2 = never > ( onFulfilled ? , onRejected ? ) { const chainPromise = new ( this . constructor as typeof ZoneAwarePromise ) ( null as any ) ; const zone = Zone . current ; if ( ( this as any ) [ symbolState ] == UNRESOLVED ) { ( < any [ ] > ( this as any ) [ symbolValue ] ) . push ( zone , chainPromise , onFulfilled , onRejected ) ; } else { scheduleResolveOrReject ( this , zone , chainPromise as any , onFulfilled , onRejected ) ; } return chainPromise ; } catch < TResult = never > ( onRejected ? ) { return this . then ( null , onRejected ) ; } finally < U > ( onFinally ? ) { const chainPromise = new ( this . constructor as typeof ZoneAwarePromise ) ( null as any ) ; ( chainPromise as any ) [ symbolFinally ] = symbolFinally ; const zone = Zone . current ; if ( ( this as any ) [ symbolState ] == UNRESOLVED ) { ( < any [ ] > ( this as any ) [ symbolValue ] ) . push ( zone , chainPromise , onFinally , onFinally ) ; } else { scheduleResolveOrReject ( this , zone , chainPromise as any , onFinally , onFinally ) ; } return chainPromise ; } } ZoneAwarePromise [ 'resolve' ] = ZoneAwarePromise . resolve ; ZoneAwarePromise [ 'reject' ] = ZoneAwarePromise . reject ; ZoneAwarePromise [ 'race' ] = ZoneAwarePromise . race ; ZoneAwarePromise [ 'all' ] = ZoneAwarePromise . all ; const NativePromise = global [ symbolPromise ] = global [ 'Promise' ] ; const ZONE_AWARE_PROMISE = Zone . __symbol__ ( 'ZoneAwarePromise' ) ; let desc = ObjectGetOwnPropertyDescriptor ( global , 'Promise' ) ; if ( ! desc || desc . configurable ) { desc && delete desc . writable ; desc && delete desc . value ; if ( ! desc ) { desc = { configurable : true , enumerable : true } ; } desc . get = function ( ) { return global [ ZONE_AWARE_PROMISE ] ? global [ ZONE_AWARE_PROMISE ] : global [ symbolPromise ] ; } ; desc . set = function ( NewNativePromise ) { if ( NewNativePromise === ZoneAwarePromise ) { global [ ZONE_AWARE_PROMISE ] = NewNativePromise ; } else { global [ symbolPromise ] = NewNativePromise ; if ( ! NewNativePromise . prototype [ symbolThen ] ) { patchThen ( NewNativePromise ) ; } api . setNativePromise ( NewNativePromise ) ; } } ; ObjectDefineProperty ( global , 'Promise' , desc ) ; } global [ 'Promise' ] = ZoneAwarePromise ; const symbolThenPatched = __symbol__ ( 'thenPatched' ) ; function patchThen ( Ctor ) { const proto = Ctor . prototype ; const prop = ObjectGetOwnPropertyDescriptor ( proto , 'then' ) ; if ( prop && ( prop . writable === false || ! prop . configurable ) ) { return ; } const originalThen = proto . then ; proto [ symbolThen ] = originalThen ; Ctor . prototype . then = function ( onResolve , onReject ) { const wrapped = new ZoneAwarePromise ( ( resolve , reject ) => { originalThen . call ( this , resolve , reject ) ; } ) ; return wrapped . then ( onResolve , onReject ) ; } ; ( Ctor as any ) [ symbolThenPatched ] = true ; } api . patchThen = patchThen ; function zoneify ( fn ) { return function ( ) { let resultPromise = fn . apply ( this , arguments ) ; if ( resultPromise instanceof ZoneAwarePromise ) { return resultPromise ; } let ctor = resultPromise . constructor ; if ( ! ctor [ symbolThenPatched ] ) { patchThen ( ctor ) ; } return resultPromise ; } ; } if ( NativePromise ) { patchThen ( NativePromise ) ; const fetch = global [ 'fetch' ] ; if ( typeof fetch == 'function' ) { global [ api . symbol ( 'fetch' ) ] = fetch ; global [ 'fetch' ] = zoneify ( fetch ) ; } } ( Promise as any ) [ Zone . __symbol__ ( 'uncaughtPromiseErrors' ) ] = _uncaughtPromiseErrors ; return ZoneAwarePromise ; } ) ;