From 43086d32d720a0ca6c999633d5fade2cfaa7574d Mon Sep 17 00:00:00 2001 From: MarsDoge Date: Tue, 17 Mar 2026 17:57:45 +0800 Subject: [PATCH] fix(telegram): retry 421 misdirected request responses --- src/infra/retry-policy.test.ts | 16 ++++++++++++++++ src/infra/retry-policy.ts | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/infra/retry-policy.test.ts b/src/infra/retry-policy.test.ts index be0e4d91de3..6b74e07ce21 100644 --- a/src/infra/retry-policy.test.ts +++ b/src/infra/retry-policy.test.ts @@ -81,6 +81,22 @@ describe("createTelegramRetryRunner", () => { expectedCalls: 1, expectedError: "permission denied", }, + { + name: "retries misdirected request errors from Telegram edge nodes", + runnerOptions: { + retry: ZERO_DELAY_RETRY, + }, + fnSteps: [ + { + type: "reject" as const, + value: Object.assign(new Error("421 Misdirected Request"), { + status: 421, + }), + }, + ], + expectedCalls: 3, + expectedError: "421 Misdirected Request", + }, { name: "keeps retrying retriable errors until attempts are exhausted", runnerOptions: { diff --git a/src/infra/retry-policy.ts b/src/infra/retry-policy.ts index 725357b440e..e51a0318d0c 100644 --- a/src/infra/retry-policy.ts +++ b/src/infra/retry-policy.ts @@ -19,7 +19,8 @@ export const TELEGRAM_RETRY_DEFAULTS = { jitter: 0.1, }; -const TELEGRAM_RETRY_RE = /429|timeout|connect|reset|closed|unavailable|temporarily/i; +const TELEGRAM_RETRY_RE = + /429|421|timeout|connect|reset|closed|unavailable|temporarily|misdirected request/i; const log = createSubsystemLogger("retry-policy"); function resolveTelegramShouldRetry(params: {