@@ -461,6 +461,74 @@ test.group('Worker', () => {
461461 assert . isBelow ( elapsed , 150 , 'Job should be killed before completing' )
462462 } )
463463
464+ test ( 'should remove timeout abort listener when job completes before timeout' , async ( {
465+ assert,
466+ cleanup,
467+ } ) => {
468+ class FastJob extends Job {
469+ static options = { timeout : 5_000 }
470+
471+ async execute ( ) { }
472+ }
473+
474+ const sharedAdapter = memory ( ) ( )
475+
476+ const localConfig = {
477+ default : 'memory' ,
478+ adapters : { memory : ( ) => sharedAdapter } ,
479+ }
480+
481+ const controller = new AbortController ( )
482+ const originalTimeout = AbortSignal . timeout
483+ const originalAddEventListener = controller . signal . addEventListener . bind ( controller . signal )
484+ const originalRemoveEventListener = controller . signal . removeEventListener . bind ( controller . signal )
485+
486+ let addedAbortListeners = 0
487+ let removedAbortListeners = 0
488+
489+ controller . signal . addEventListener = ( ( type , listener , options ) => {
490+ if ( type === 'abort' ) {
491+ addedAbortListeners ++
492+ }
493+
494+ return originalAddEventListener ( type , listener , options )
495+ } ) as AbortSignal [ 'addEventListener' ]
496+
497+ controller . signal . removeEventListener = ( ( type , listener , options ) => {
498+ if ( type === 'abort' ) {
499+ removedAbortListeners ++
500+ }
501+
502+ return originalRemoveEventListener ( type , listener , options )
503+ } ) as AbortSignal [ 'removeEventListener' ]
504+
505+ AbortSignal . timeout = ( ( ) => controller . signal ) as typeof AbortSignal . timeout
506+
507+ Locator . register ( 'FastJob' , FastJob )
508+
509+ const worker = new Worker ( localConfig )
510+
511+ cleanup ( async ( ) => {
512+ AbortSignal . timeout = originalTimeout
513+ Locator . clear ( )
514+ await worker . stop ( )
515+ } )
516+
517+ await sharedAdapter . push ( {
518+ id : 'cleanup-timeout-listener-job' ,
519+ name : 'FastJob' ,
520+ payload : { } ,
521+ attempts : 0 ,
522+ priority : 0 ,
523+ } )
524+
525+ await worker . processCycle ( [ 'default' ] ) // started
526+ await worker . processCycle ( [ 'default' ] ) // completed
527+
528+ assert . equal ( addedAbortListeners , 1 )
529+ assert . equal ( removedAbortListeners , 1 )
530+ } )
531+
464532 test ( 'should retry timed out job when failOnTimeout is false' , async ( { assert, cleanup } ) => {
465533 let attempts = 0
466534
0 commit comments