@@ -957,7 +957,7 @@ describe("resolveTelegramFetch", () => {
957957 expect ( eighthDispatcher ) . toBe ( firstDispatcher ) ;
958958 expect ( ninthDispatcher ) . toBe ( firstDispatcher ) ;
959959 expectPinnedFallbackIpDispatcher ( 3 ) ;
960- expectLoggerMessageContaining ( loggerWarn , "fetch fallback: DNS-resolved IP unreachable " ) ;
960+ expectLoggerMessageContaining ( loggerWarn , "fetch fallback: primary connection path failed " ) ;
961961 expectLoggerMessageContaining (
962962 loggerDebug ,
963963 "fetch fallback: recovered from attempt 2 to attempt 0" ,
@@ -1193,6 +1193,31 @@ describe("resolveTelegramFetch", () => {
11931193 expect ( undiciFetch ) . toHaveBeenCalledTimes ( 1 ) ;
11941194 } ) ;
11951195
1196+ it ( "does not automatically retry structured EADDRNOTAVAIL fetch failures" , async ( ) => {
1197+ const fetchError = buildFetchFallbackError ( "EADDRNOTAVAIL" ) ;
1198+ undiciFetch . mockRejectedValue ( fetchError ) ;
1199+
1200+ const resolved = resolveTelegramFetchOrThrow ( undefined , STICKY_IPV4_FALLBACK_NETWORK ) ;
1201+
1202+ await expect ( resolved ( "https://api.telegram.org/botx/sendMessage" ) ) . rejects . toThrow (
1203+ "fetch failed" ,
1204+ ) ;
1205+
1206+ expect ( undiciFetch ) . toHaveBeenCalledTimes ( 1 ) ;
1207+ } ) ;
1208+
1209+ it ( "preserves EADDRNOTAVAIL in forced fallback diagnostics" , ( ) => {
1210+ const transport = resolveTelegramTransport ( undefined , STICKY_IPV4_FALLBACK_NETWORK ) ;
1211+ const fetchError = buildFetchFallbackError ( "EADDRNOTAVAIL" ) ;
1212+
1213+ expect ( transport . forceFallback ?.( "probe timeout/network error" , fetchError ) ) . toBe ( true ) ;
1214+ expect ( transport . forceFallback ?.( "probe timeout/network error" , fetchError ) ) . toBe ( true ) ;
1215+
1216+ expectLoggerMessageContaining ( loggerWarn , "primary connection path failed" ) ;
1217+ expectLoggerMessageContaining ( loggerWarn , "codes=EADDRNOTAVAIL" ) ;
1218+ expectNoLoggerMessageContaining ( loggerWarn , "DNS-resolved IP unreachable" ) ;
1219+ } ) ;
1220+
11961221 it ( "retries sticky fallback when the local network is down during connect" , async ( ) => {
11971222 undiciFetch
11981223 . mockRejectedValueOnce ( buildFetchFallbackError ( "ENETDOWN" ) )
0 commit comments