From c650d2c8c96b7c12e5cbedb8a70bd36a3bdb3def Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 29 Jul 2026 04:02:55 -0400 Subject: [PATCH] fix(telegram): keep update retry checks read-only (#115613) Use the non-mutating dedupe-cache contract when checking unaccepted Telegram updates. Preserve active handler and completed-update deduplication while allowing a real update to be accepted after repeated handler skip probes. Fixes #105192 --- .../telegram/src/bot-update-tracker.test.ts | 19 +++++++++++++++++++ extensions/telegram/src/bot-update-tracker.ts | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/extensions/telegram/src/bot-update-tracker.test.ts b/extensions/telegram/src/bot-update-tracker.test.ts index 799d52d716b6..8760a298d6c0 100644 --- a/extensions/telegram/src/bot-update-tracker.test.ts +++ b/extensions/telegram/src/bot-update-tracker.test.ts @@ -437,6 +437,25 @@ describe("createTelegramUpdateTracker", () => { }); }); + it("does not record an update when checking handler dispatch before acceptance", () => { + const onSkip = vi.fn(); + const tracker = createTelegramUpdateTracker({ initialUpdateId: 300, onSkip }); + const ctx = updateCtx(301); + + expect(tracker.shouldSkipHandlerDispatch(ctx)).toBe(false); + expect(tracker.shouldSkipHandlerDispatch(ctx)).toBe(false); + expect(onSkip).not.toHaveBeenCalled(); + + const accepted = tracker.beginUpdate(ctx); + if (!accepted.accepted) { + throw new Error("expected read-only skip checks to leave the update retryable"); + } + + expect(tracker.shouldSkipHandlerDispatch(ctx)).toBe(false); + tracker.finishUpdate(accepted.update, { completed: true }); + expect(tracker.shouldSkipHandlerDispatch(ctx)).toBe(true); + }); + it("dedupes handler dispatch separately from the accepted watermark", () => { const onSkip = vi.fn(); const tracker = createTelegramUpdateTracker({ initialUpdateId: 300, onSkip }); diff --git a/extensions/telegram/src/bot-update-tracker.ts b/extensions/telegram/src/bot-update-tracker.ts index e04d0740d756..9f54add9d84d 100644 --- a/extensions/telegram/src/bot-update-tracker.ts +++ b/extensions/telegram/src/bot-update-tracker.ts @@ -306,7 +306,7 @@ export function createTelegramUpdateTracker(options: TelegramUpdateTrackerOption activeHandledUpdateKeys.set(key, true); return false; } - const skipped = recentUpdates.check(key); + const skipped = recentUpdates.peek(key); if (skipped) { skip(key); }