@@ -34,10 +34,15 @@ function stackIsFromUser(stack: string) {
3434 return false ;
3535}
3636
37+ const alwaysActive = ( ) => true ;
38+
3739// Inspired by https://github.com/mafintosh/why-is-node-running/blob/master/index.js
3840// Extracted as we want to format the result ourselves
3941export default function collectHandles ( ) : ( ) => Array < Error > {
40- const activeHandles : Map < number , Error > = new Map ( ) ;
42+ const activeHandles : Map <
43+ number ,
44+ { error : Error ; isActive : ( ) => boolean }
45+ > = new Map ( ) ;
4146
4247 let hook : AsyncHook ;
4348
@@ -47,14 +52,34 @@ export default function collectHandles(): () => Array<Error> {
4752 destroy ( asyncId ) {
4853 activeHandles . delete ( asyncId ) ;
4954 } ,
50- init : function initHook ( asyncId , type ) {
55+ init : function initHook (
56+ asyncId ,
57+ type ,
58+ _triggerAsyncId ,
59+ resource : { } | NodeJS . Timeout ,
60+ ) {
5161 if ( type === 'PROMISE' || type === 'TIMERWRAP' ) {
5262 return ;
5363 }
5464 const error = new ErrorWithStack ( type , initHook ) ;
5565
5666 if ( stackIsFromUser ( error . stack || '' ) ) {
57- activeHandles . set ( asyncId , error ) ;
67+ let isActive : ( ) => boolean ;
68+
69+ if ( type === 'Timeout' || type === 'Immediate' ) {
70+ if ( 'hasRef' in resource ) {
71+ // Timer that supports hasRef (Node v11+)
72+ isActive = resource . hasRef . bind ( resource ) ;
73+ } else {
74+ // Timer that doesn't support hasRef
75+ isActive = alwaysActive ;
76+ }
77+ } else {
78+ // Any other async resource
79+ isActive = alwaysActive ;
80+ }
81+
82+ activeHandles . set ( asyncId , { error, isActive} ) ;
5883 }
5984 } ,
6085 } ) ;
@@ -74,7 +99,11 @@ export default function collectHandles(): () => Array<Error> {
7499 return ( ) => {
75100 hook . disable ( ) ;
76101
77- const result = Array . from ( activeHandles . values ( ) ) ;
102+ // Get errors for every async resource still referenced at this moment
103+ const result = Array . from ( activeHandles . values ( ) )
104+ . filter ( ( { isActive} ) => isActive ( ) )
105+ . map ( ( { error} ) => error ) ;
106+
78107 activeHandles . clear ( ) ;
79108 return result ;
80109 } ;
0 commit comments