From aaa2875fe1f50ae9eeb144de0640561bfd11660a Mon Sep 17 00:00:00 2001 From: Alina Sireneva Date: Fri, 8 Dec 2023 20:33:41 +0300 Subject: [PATCH] fix(core): support opting out of -503 resending --- .../src/methods/bots/get-callback-answer.ts | 2 +- packages/core/src/network/network-manager.ts | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/client/src/methods/bots/get-callback-answer.ts b/packages/client/src/methods/bots/get-callback-answer.ts index d92a6b44..025d80de 100644 --- a/packages/client/src/methods/bots/get-callback-answer.ts +++ b/packages/client/src/methods/bots/get-callback-answer.ts @@ -56,6 +56,6 @@ export async function getCallbackAnswer( password, game: game, }, - { timeout }, + { timeout, throw503: true }, ) } diff --git a/packages/core/src/network/network-manager.ts b/packages/core/src/network/network-manager.ts index f63403b1..04303442 100644 --- a/packages/core/src/network/network-manager.ts +++ b/packages/core/src/network/network-manager.ts @@ -2,7 +2,7 @@ import { tl } from '@mtcute/tl' import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime' import { ITelegramStorage } from '../storage/index.js' -import { MtArgumentError, MtcuteError } from '../types/index.js' +import { MtArgumentError, MtcuteError, MtTimeoutError } from '../types/index.js' import { ControllablePromise, createControllablePromise, ICryptoProvider, Logger, sleep } from '../utils/index.js' import { assertTypeIs } from '../utils/type-assertions.js' import { ConfigManager } from './config-manager.js' @@ -147,6 +147,14 @@ export interface RpcCallOptions { * Abort signal for the call. */ abortSignal?: AbortSignal + + /** + * Whether we should not retry on -503 errors and throw {@link MtTimeoutError} immediately instead. + * + * Useful for methods like `messages.getBotCallbackAnswer` that reliably return + * -503 in case the upstream bot failed to respond. + */ + throw503?: boolean } /** @@ -639,6 +647,7 @@ export class NetworkManager { const floodSleepThreshold = params?.floodSleepThreshold ?? this.params.floodSleepThreshold const maxRetryCount = params?.maxRetryCount ?? this.params.maxRetryCount + const throw503 = params?.throw503 ?? false // do not send requests that are in flood wait if (this._floodWaitedRequests.has(message._)) { @@ -691,6 +700,10 @@ export class NetworkManager { } if (!(e.code in CLIENT_ERRORS)) { + if (throw503 && e.code === -503) { + throw new MtTimeoutError() + } + this._log.warn('Telegram is having internal issues: %d %s, retrying', e.code, e.message) if (e.text === 'WORKER_BUSY_TOO_LONG_RETRY') {