From f866e57de3d67251451b9c80dbea67980b02e05e Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 8 Mar 2026 01:09:36 +0000 Subject: [PATCH] refactor(telegram): dedupe non-idempotent request setup --- src/telegram/send.ts | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/telegram/send.ts b/src/telegram/send.ts index 83d550b7498..329329a07ff 100644 --- a/src/telegram/send.ts +++ b/src/telegram/send.ts @@ -436,6 +436,24 @@ function createRequestWithChatNotFound(params: { }); } +function createTelegramNonIdempotentRequestWithDiag(params: { + cfg: ReturnType; + account: ResolvedTelegramAccount; + retry?: RetryConfig; + verbose?: boolean; + useApiErrorLogging?: boolean; +}): TelegramRequestWithDiag { + return createTelegramRequestWithDiag({ + cfg: params.cfg, + account: params.account, + retry: params.retry, + verbose: params.verbose, + useApiErrorLogging: params.useApiErrorLogging, + shouldRetry: (err) => isSafeToRetrySendError(err), + strictShouldRetry: true, + }); +} + export function buildInlineKeyboard( buttons?: TelegramSendOpts["buttons"], ): InlineKeyboardMarkup | undefined { @@ -489,13 +507,11 @@ export async function sendMessageTelegram( quoteText: opts.quoteText, }); const hasThreadParams = Object.keys(threadParams).length > 0; - const requestWithDiag = createTelegramRequestWithDiag({ + const requestWithDiag = createTelegramNonIdempotentRequestWithDiag({ cfg, account, retry: opts.retry, verbose: opts.verbose, - shouldRetry: (err) => isSafeToRetrySendError(err), - strictShouldRetry: true, }); const requestWithChatNotFound = createRequestWithChatNotFound({ requestWithDiag, @@ -1097,13 +1113,11 @@ export async function sendPollTelegram( // Build poll options as simple strings (Grammy accepts string[] or InputPollOption[]) const pollOptions = normalizedPoll.options; - const requestWithDiag = createTelegramRequestWithDiag({ + const requestWithDiag = createTelegramNonIdempotentRequestWithDiag({ cfg, account, retry: opts.retry, verbose: opts.verbose, - shouldRetry: (err) => isSafeToRetrySendError(err), - strictShouldRetry: true, }); const requestWithChatNotFound = createRequestWithChatNotFound({ requestWithDiag, @@ -1218,22 +1232,12 @@ export async function createForumTopicTelegram( verbose: opts.verbose, }); - const request = createTelegramRetryRunner({ + const requestWithDiag = createTelegramNonIdempotentRequestWithDiag({ + cfg, + account, retry: opts.retry, - configRetry: account.config.retry, verbose: opts.verbose, - shouldRetry: (err) => isSafeToRetrySendError(err), - strictShouldRetry: true, }); - const logHttpError = createTelegramHttpLogger(cfg); - const requestWithDiag = (fn: () => Promise, label?: string) => - withTelegramApiErrorLogging({ - operation: label ?? "request", - fn: () => request(fn, label), - }).catch((err) => { - logHttpError(label ?? "request", err); - throw err; - }); const extra: Record = {}; if (opts.iconColor != null) {