@@ -11,42 +11,21 @@ const TRANSIENT_MONGO_ERROR_NAMES = new Set([
1111] ) ;
1212
1313const TRANSIENT_MONGO_MESSAGE_PATTERNS = [
14- / g e t a d d r i n f o \s + E S E R V F A I L / i,
15- / g e t a d d r i n f o \s + E N O T F O U N D / i,
16- / g e t a d d r i n f o \s + E A I _ A G A I N / i,
17- / \b E C O N N R E S E T \b / i,
18- / \b E T I M E D O U T \b / i,
19- / \b E C O N N R E F U S E D \b / i,
14+ / g e t a d d r i n f o \s + ( E S E R V F A I L | E N O T F O U N D | E A I _ A G A I N ) / i,
15+ / \b ( E C O N N R E S E T | E T I M E D O U T | E C O N N R E F U S E D ) \b / i,
2016 / s e r v e r m o n i t o r t i m e o u t / i,
21- / i n t e r r u p t e d d u e t o s e r v e r m o n i t o r t i m e o u t / i,
2217 / c o n n e c t i o n .* ( c l o s e d | r e s e t | t i m e d ? \s * o u t ) / i,
2318 / s e r v e r s e l e c t i o n t i m e d ? \s * o u t / i,
2419 / n o c o n n e c t i o n a v a i l a b l e / i,
2520 / p o o l .* c l e a r e d / i,
2621] ;
2722
28- function errorName ( error : unknown ) : string | undefined {
29- if ( ! ( error instanceof Error ) ) return undefined ;
30- return error . name ;
31- }
32-
33- function errorMessage ( error : unknown ) : string {
34- if ( error instanceof Error ) return error . message ;
35- if ( typeof error === "string" ) return error ;
36- return "" ;
37- }
38-
3923export function isTransientMongoNetworkError ( error : unknown ) : boolean {
40- const name = errorName ( error ) ;
41- if ( name !== undefined && TRANSIENT_MONGO_ERROR_NAMES . has ( name ) ) {
42- return true ;
43- }
44-
45- const message = errorMessage ( error ) ;
46- if ( message . length === 0 ) return false ;
47-
24+ if ( ! ( error instanceof Error ) ) return false ;
25+ if ( TRANSIENT_MONGO_ERROR_NAMES . has ( error . name ) ) return true ;
26+ if ( error . message . length === 0 ) return false ;
4827 return TRANSIENT_MONGO_MESSAGE_PATTERNS . some ( ( pattern ) =>
49- pattern . test ( message ) ,
28+ pattern . test ( error . message ) ,
5029 ) ;
5130}
5231
@@ -64,18 +43,16 @@ export async function withTransientMongoRetry<T>(
6443 options . sleep ??
6544 ( ( ms : number ) => new Promise ( ( resolve ) => setTimeout ( resolve , ms ) ) ) ;
6645
67- let lastError : unknown ;
68- for ( let attempt = 1 ; attempt <= attempts ; attempt += 1 ) {
46+ let attempt = 0 ;
47+ while ( true ) {
48+ attempt += 1 ;
6949 try {
7050 return await operation ( ) ;
7151 } catch ( error ) {
72- lastError = error ;
73- const canRetry =
74- attempt < attempts && isTransientMongoNetworkError ( error ) ;
75- if ( ! canRetry ) throw error ;
52+ if ( attempt >= attempts || ! isTransientMongoNetworkError ( error ) ) {
53+ throw error ;
54+ }
7655 await sleep ( delayMs * attempt ) ;
7756 }
7857 }
79-
80- throw lastError ;
8158}
0 commit comments