@@ -5088,28 +5088,32 @@ function initializeCountSizeFunction(globalObject) {
5088
5088
WeakMapPrototypeSet ( countSizeFunctionWeakMap , globalObject , size ) ;
5089
5089
}
5090
5090
5091
- async function * createAsyncFromSyncIterator ( syncIterator ) {
5092
- // deno-lint-ignore prefer-primordials
5093
- yield * syncIterator ;
5094
- }
5095
-
5096
5091
// Ref: https://tc39.es/ecma262/#sec-getiterator
5097
- function getIterator ( obj , async = false ) {
5098
- if ( async ) {
5099
- if ( obj [ SymbolAsyncIterator ] == null ) {
5100
- if ( obj [ SymbolIterator ] == null ) {
5101
- throw new TypeError ( "No iterator found" ) ;
5102
- }
5103
- return createAsyncFromSyncIterator ( obj [ SymbolIterator ] ( ) ) ;
5104
- } else {
5105
- return obj [ SymbolAsyncIterator ] ( ) ;
5092
+ function getAsyncOrSyncIterator ( obj ) {
5093
+ let iterator ;
5094
+ if ( obj [ SymbolAsyncIterator ] != null ) {
5095
+ iterator = obj [ SymbolAsyncIterator ] ( ) ;
5096
+ if ( ! isObject ( iterator ) ) {
5097
+ throw new TypeError (
5098
+ "[Symbol.asyncIterator] returned a non-object value" ,
5099
+ ) ;
5106
5100
}
5107
- } else {
5108
- if ( obj [ SymbolIterator ] == null ) {
5109
- throw new TypeError ( "No iterator found" ) ;
5101
+ } else if ( obj [ SymbolIterator ] != null ) {
5102
+ iterator = obj [ SymbolIterator ] ( ) ;
5103
+ if ( ! isObject ( iterator ) ) {
5104
+ throw new TypeError ( "[Symbol.iterator] returned a non-object value" ) ;
5110
5105
}
5111
- return obj [ SymbolIterator ] ( ) ;
5106
+ } else {
5107
+ throw new TypeError ( "No iterator found" ) ;
5108
+ }
5109
+ if ( typeof iterator . next !== "function" ) {
5110
+ throw new TypeError ( "iterator.next is not a function" ) ;
5112
5111
}
5112
+ return iterator ;
5113
+ }
5114
+
5115
+ function isObject ( x ) {
5116
+ return ( typeof x === "object" && x != null ) || typeof x === "function" ;
5113
5117
}
5114
5118
5115
5119
const _resourceBacking = Symbol ( "[[resourceBacking]]" ) ;
@@ -5204,26 +5208,29 @@ class ReadableStream {
5204
5208
) ;
5205
5209
asyncIterable = webidl . converters . any ( asyncIterable ) ;
5206
5210
5207
- const iterator = getIterator ( asyncIterable , true ) ;
5211
+ const iterator = getAsyncOrSyncIterator ( asyncIterable ) ;
5208
5212
5209
5213
const stream = createReadableStream ( noop , async ( ) => {
5210
5214
// deno-lint-ignore prefer-primordials
5211
5215
const res = await iterator . next ( ) ;
5212
- if ( typeof res !== "object" ) {
5216
+ if ( ! isObject ( res ) ) {
5213
5217
throw new TypeError ( "iterator.next value is not an object" ) ;
5214
5218
}
5215
5219
if ( res . done ) {
5216
5220
readableStreamDefaultControllerClose ( stream [ _controller ] ) ;
5217
5221
} else {
5218
- readableStreamDefaultControllerEnqueue ( stream [ _controller ] , res . value ) ;
5222
+ readableStreamDefaultControllerEnqueue (
5223
+ stream [ _controller ] ,
5224
+ await res . value ,
5225
+ ) ;
5219
5226
}
5220
5227
} , async ( reason ) => {
5221
- if ( typeof iterator . return === "undefined" ) {
5228
+ if ( iterator . return == null ) {
5222
5229
return undefined ;
5223
5230
} else {
5224
5231
// deno-lint-ignore prefer-primordials
5225
5232
const res = await iterator . return ( reason ) ;
5226
- if ( typeof res !== "object" ) {
5233
+ if ( ! isObject ( res ) ) {
5227
5234
throw new TypeError ( "iterator.return value is not an object" ) ;
5228
5235
} else {
5229
5236
return undefined ;
0 commit comments