@@ -976,13 +976,6 @@ async function once(emitter, name, options = {}) {
976
976
} ) ;
977
977
}
978
978
979
- const AsyncIteratorPrototype = ObjectGetPrototypeOf (
980
- ObjectGetPrototypeOf ( async function * ( ) { } ) . prototype ) ;
981
-
982
- function createIterResult ( value , done ) {
983
- return { value, done } ;
984
- }
985
-
986
979
function eventTargetAgnosticRemoveListener ( emitter , name , listener , flags ) {
987
980
if ( typeof emitter . removeListener === 'function' ) {
988
981
emitter . removeListener ( name , listener ) ;
@@ -1017,80 +1010,15 @@ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
1017
1010
* @returns {AsyncIterator }
1018
1011
*/
1019
1012
function on ( emitter , event , options ) {
1013
+ const queue = [ ] ;
1014
+ let resume = null ;
1015
+ let error = null ;
1016
+
1020
1017
const signal = options ?. signal ;
1021
1018
validateAbortSignal ( signal , 'options.signal' ) ;
1022
- if ( signal ?. aborted )
1019
+ if ( signal ?. aborted ) {
1023
1020
throw new AbortError ( undefined , { cause : signal ?. reason } ) ;
1024
-
1025
- const unconsumedEvents = [ ] ;
1026
- const unconsumedPromises = [ ] ;
1027
- let error = null ;
1028
- let finished = false ;
1029
-
1030
- const iterator = ObjectSetPrototypeOf ( {
1031
- next ( ) {
1032
- // First, we consume all unread events
1033
- const value = unconsumedEvents . shift ( ) ;
1034
- if ( value ) {
1035
- return PromiseResolve ( createIterResult ( value , false ) ) ;
1036
- }
1037
-
1038
- // Then we error, if an error happened
1039
- // This happens one time if at all, because after 'error'
1040
- // we stop listening
1041
- if ( error ) {
1042
- const p = PromiseReject ( error ) ;
1043
- // Only the first element errors
1044
- error = null ;
1045
- return p ;
1046
- }
1047
-
1048
- // If the iterator is finished, resolve to done
1049
- if ( finished ) {
1050
- return PromiseResolve ( createIterResult ( undefined , true ) ) ;
1051
- }
1052
-
1053
- // Wait until an event happens
1054
- return new Promise ( function ( resolve , reject ) {
1055
- unconsumedPromises . push ( { resolve, reject } ) ;
1056
- } ) ;
1057
- } ,
1058
-
1059
- return ( ) {
1060
- eventTargetAgnosticRemoveListener ( emitter , event , eventHandler ) ;
1061
- eventTargetAgnosticRemoveListener ( emitter , 'error' , errorHandler ) ;
1062
-
1063
- if ( signal ) {
1064
- eventTargetAgnosticRemoveListener (
1065
- signal ,
1066
- 'abort' ,
1067
- abortListener ,
1068
- { once : true } ) ;
1069
- }
1070
-
1071
- finished = true ;
1072
-
1073
- for ( const promise of unconsumedPromises ) {
1074
- promise . resolve ( createIterResult ( undefined , true ) ) ;
1075
- }
1076
-
1077
- return PromiseResolve ( createIterResult ( undefined , true ) ) ;
1078
- } ,
1079
-
1080
- throw ( err ) {
1081
- if ( ! err || ! ( err instanceof Error ) ) {
1082
- throw new ERR_INVALID_ARG_TYPE ( 'EventEmitter.AsyncIterator' ,
1083
- 'Error' , err ) ;
1084
- }
1085
- error = err ;
1086
- eventTargetAgnosticRemoveListener ( emitter , event , eventHandler ) ;
1087
- eventTargetAgnosticRemoveListener ( emitter , 'error' , errorHandler ) ;
1088
- } ,
1089
-
1090
- [ SymbolAsyncIterator ] ( ) {
1091
- return this ;
1092
- }
1093
- } , AsyncIteratorPrototype ) ;
1021
+ }
1094
1022
1095
1023
eventTargetAgnosticAddListener ( emitter , event , eventHandler ) ;
1096
1024
if ( event !== 'error' && typeof emitter . on === 'function' ) {
@@ -1105,33 +1033,48 @@ function on(emitter, event, options) {
1105
1033
{ once : true } ) ;
1106
1034
}
1107
1035
1108
- return iterator ;
1036
+ function errorHandler ( err ) {
1037
+ error = err ;
1038
+ if ( resume ) {
1039
+ resume ( Promise . reject ( err ) ) ;
1040
+ resume = null ;
1041
+ }
1042
+ }
1109
1043
1110
1044
function abortListener ( ) {
1111
1045
errorHandler ( new AbortError ( undefined , { cause : signal ?. reason } ) ) ;
1112
1046
}
1113
1047
1114
1048
function eventHandler ( ...args ) {
1115
- const promise = ArrayPrototypeShift ( unconsumedPromises ) ;
1116
- if ( promise ) {
1117
- promise . resolve ( createIterResult ( args , false ) ) ;
1049
+ if ( resume ) {
1050
+ resume ( args ) ;
1051
+ resume = null ;
1118
1052
} else {
1119
- unconsumedEvents . push ( args ) ;
1053
+ queue . push ( args ) ;
1120
1054
}
1121
1055
}
1122
1056
1123
- function errorHandler ( err ) {
1124
- finished = true ;
1057
+ return async function * ( ) {
1058
+ try {
1059
+ while ( true ) {
1060
+ while ( queue . length ) {
1061
+ if ( error ) {
1062
+ throw error ;
1063
+ }
1064
+ yield queue . shift ( ) ;
1065
+ }
1125
1066
1126
- const toError = ArrayPrototypeShift ( unconsumedPromises ) ;
1067
+ if ( error ) {
1068
+ throw error ;
1069
+ }
1127
1070
1128
- if ( toError ) {
1129
- toError . reject ( err ) ;
1130
- } else {
1131
- // The next time we call next()
1132
- error = err ;
1071
+ yield await new Promise ( resolve => {
1072
+ resume = resolve ;
1073
+ } ) ;
1074
+ }
1075
+ } finally {
1076
+ eventTargetAgnosticRemoveListener ( emitter , event , eventHandler ) ;
1077
+ eventTargetAgnosticRemoveListener ( emitter , 'error' , errorHandler ) ;
1133
1078
}
1134
-
1135
- iterator . return ( ) ;
1136
- }
1079
+ } ( )
1137
1080
}
0 commit comments