@@ -2,6 +2,8 @@ import { hasNext, noNext, toObserver } from '../asynciterablehelpers';
22import { setInterval , clearInterval } from 'timers' ;
33import { PartialObserver } from '../../src/observer' ;
44import { from } from 'ix/asynciterable' ;
5+ import { AbortError } from 'ix/Ix' ;
6+ import { withAbort } from 'ix/asynciterable/operators' ;
57
68test ( 'AsyncIterable#from from promise list' , async ( ) => {
79 const xs : Iterable < Promise < number > > = [
@@ -246,3 +248,59 @@ test('AsyncIterable#fromObservable with error', async () => {
246248 const it = ys [ Symbol . asyncIterator ] ( ) ;
247249 await expect ( it . next ( ) ) . rejects . toThrow ( err ) ;
248250} ) ;
251+
252+ test ( 'AsyncIterable#fromObservable with abort while waiting' , async ( ) => {
253+ let unsubscribed = false ;
254+
255+ const xs = new TestObservable < number > ( ( obs ) => {
256+ obs . next ( 0 ) ;
257+
258+ return {
259+ unsubscribe ( ) {
260+ unsubscribed = true ;
261+ } ,
262+ } ;
263+ } ) ;
264+
265+ const abortController = new AbortController ( ) ;
266+
267+ const ys = from ( xs ) . pipe ( withAbort ( abortController . signal ) ) ;
268+ const it = ys [ Symbol . asyncIterator ] ( ) ;
269+
270+ await hasNext ( it , 0 ) ;
271+
272+ setTimeout ( ( ) => {
273+ abortController . abort ( ) ;
274+ } , 100 ) ;
275+
276+ await expect ( it . next ( ) ) . rejects . toBeInstanceOf ( AbortError ) ;
277+ expect ( unsubscribed ) . toBe ( true ) ;
278+ } ) ;
279+
280+ test ( 'AsyncIterable#fromObservable with abort while queueing' , async ( ) => {
281+ let unsubscribed = false ;
282+
283+ const xs = new TestObservable < number > ( ( obs ) => {
284+ obs . next ( 0 ) ;
285+ obs . next ( 1 ) ;
286+ obs . next ( 2 ) ;
287+
288+ return {
289+ unsubscribe ( ) {
290+ unsubscribed = true ;
291+ } ,
292+ } ;
293+ } ) ;
294+
295+ const abortController = new AbortController ( ) ;
296+
297+ const ys = from ( xs ) . pipe ( withAbort ( abortController . signal ) ) ;
298+ const it = ys [ Symbol . asyncIterator ] ( ) ;
299+
300+ await hasNext ( it , 0 ) ;
301+
302+ abortController . abort ( ) ;
303+
304+ await expect ( it . next ( ) ) . rejects . toBeInstanceOf ( AbortError ) ;
305+ expect ( unsubscribed ) . toBe ( true ) ;
306+ } ) ;
0 commit comments