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); }