fix: clean telegram draft preview on dispatch errors

This commit is contained in:
Ayaan Zaidi
2026-02-20 10:37:33 +05:30
parent 0cbf2b3562
commit 00b3837411
2 changed files with 21 additions and 0 deletions

View File

@@ -687,6 +687,20 @@ describe("dispatchTelegramMessage draft streaming", () => {
expect(draftStream.clear).toHaveBeenCalledTimes(1);
});
it("clears preview when dispatcher throws before fallback phase", async () => {
const draftStream = createDraftStream(999);
createTelegramDraftStream.mockReturnValue(draftStream);
dispatchReplyWithBufferedBlockDispatcher.mockRejectedValue(new Error("dispatcher exploded"));
await expect(dispatchWithContext({ context: createContext() })).rejects.toThrow(
"dispatcher exploded",
);
expect(draftStream.stop).toHaveBeenCalledTimes(1);
expect(draftStream.clear).toHaveBeenCalledTimes(1);
expect(deliverReplies).not.toHaveBeenCalled();
});
it("supports concurrent dispatches with independent previews", async () => {
const draftA = createDraftStream(11);
const draftB = createDraftStream(22);

View File

@@ -312,6 +312,7 @@ export const dispatchTelegramMessage = async ({
};
let queuedFinal = false;
let dispatchError: unknown;
try {
({ queuedFinal } = await dispatchReplyWithBufferedBlockDispatcher({
ctx: ctxPayload,
@@ -487,12 +488,15 @@ export const dispatchTelegramMessage = async ({
onModelSelected,
},
}));
} catch (err) {
dispatchError = err;
} finally {
await draftStream?.stop();
}
let sentFallback = false;
try {
if (
!dispatchError &&
!deliveryState.delivered &&
(deliveryState.skippedNonSilent > 0 || deliveryState.failedDeliveries > 0)
) {
@@ -505,6 +509,9 @@ export const dispatchTelegramMessage = async ({
} finally {
await clearDraftPreviewIfNeeded();
}
if (dispatchError) {
throw dispatchError;
}
const hasFinalResponse = queuedFinal || sentFallback;
if (!hasFinalResponse) {