@@ -264,6 +264,48 @@ describe('mapAsyncIterable', () => {
264264 await expectPromise ( thrown ) . toRejectWith ( message ) ;
265265 } ) ;
266266
267+ it ( 'close source when mapped iterable is thrown even when the underlying source does not implement a throw method' , async ( ) => {
268+ const items = [ 1 , 2 , 3 ] ;
269+ let returned = false ;
270+ const iterable : AsyncIterableIterator < number > = {
271+ [ Symbol . asyncIterator ] ( ) {
272+ return this ;
273+ } ,
274+ next ( ) {
275+ if ( returned ) {
276+ return Promise . resolve ( { done : true , value : undefined } ) ;
277+ }
278+ const value = items [ 0 ] ;
279+ items . shift ( ) ;
280+ return Promise . resolve ( {
281+ done : items . length === 0 ,
282+ value,
283+ } ) ;
284+ } ,
285+ return : ( ) => {
286+ returned = true ;
287+ return Promise . resolve ( { done : true , value : undefined } ) ;
288+ } ,
289+ } ;
290+
291+ const doubles = mapAsyncIterable ( iterable , ( x ) => x + x ) ;
292+
293+ expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 2 , done : false } ) ;
294+ expect ( await doubles . next ( ) ) . to . deep . equal ( { value : 4 , done : false } ) ;
295+
296+ // Throw error
297+ const message = 'allows throwing errors when mapping async iterable' ;
298+ const thrown = doubles . throw ( new Error ( message ) ) ;
299+ await expectPromise ( thrown ) . toRejectWith ( message ) ;
300+
301+ // Returns early when throwing errors through async iterable
302+ expect ( returned ) . to . equal ( true ) ;
303+ expect ( await doubles . next ( ) ) . to . deep . equal ( {
304+ value : undefined ,
305+ done : true ,
306+ } ) ;
307+ } ) ;
308+
267309 it ( 'passes through caught errors through async generators' , async ( ) => {
268310 async function * source ( ) {
269311 try {
0 commit comments