Skip to content

Commit 80dcd2d

Browse files
Cover repeated inactive cleanup failures with per-attempt onError
Co-authored-by: Eric Allam <eric@trigger.dev>
1 parent 81d62b5 commit 80dcd2d

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

packages/ai/src/chatTransport.test.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,59 @@ describe("TriggerChatTransport", function () {
625625
expect(errors[0]?.error.message).toBe("cleanup delete failed");
626626
});
627627

628+
it("retries inactive cleanup and reports each persistent delete failure", async function () {
629+
const errors: TriggerChatTransportError[] = [];
630+
const runStore = new AlwaysFailCleanupDeleteRunStore();
631+
runStore.set({
632+
chatId: "chat-inactive-delete-always-fails",
633+
runId: "run_inactive_delete_always_fails",
634+
publicAccessToken: "pk_inactive_delete_always_fails",
635+
streamKey: "chat-stream",
636+
lastEventId: "10-0",
637+
isActive: false,
638+
});
639+
640+
const transport = new TriggerChatTransport({
641+
task: "chat-task",
642+
stream: "chat-stream",
643+
accessToken: "pk_trigger",
644+
runStore,
645+
onError: function onError(error) {
646+
errors.push(error);
647+
},
648+
});
649+
650+
let fetchCalls = 0;
651+
(transport as any).fetchRunStream = async function fetchRunStream() {
652+
fetchCalls += 1;
653+
throw new Error("unexpected reconnect fetch");
654+
};
655+
656+
const firstReconnect = await transport.reconnectToStream({
657+
chatId: "chat-inactive-delete-always-fails",
658+
});
659+
const secondReconnect = await transport.reconnectToStream({
660+
chatId: "chat-inactive-delete-always-fails",
661+
});
662+
663+
expect(firstReconnect).toBeNull();
664+
expect(secondReconnect).toBeNull();
665+
expect(fetchCalls).toBe(0);
666+
expect(errors).toHaveLength(2);
667+
expect(errors[0]).toMatchObject({
668+
phase: "reconnect",
669+
chatId: "chat-inactive-delete-always-fails",
670+
runId: "run_inactive_delete_always_fails",
671+
});
672+
expect(errors[1]).toMatchObject({
673+
phase: "reconnect",
674+
chatId: "chat-inactive-delete-always-fails",
675+
runId: "run_inactive_delete_always_fails",
676+
});
677+
expect(errors[0]?.error.message).toBe("cleanup delete always fails");
678+
expect(errors[1]?.error.message).toBe("cleanup delete always fails");
679+
});
680+
628681
it("retries inactive reconnect cleanup on subsequent reconnect attempts", async function () {
629682
const errors: TriggerChatTransportError[] = [];
630683
const runStore = new FailingCleanupDeleteRunStore(1);
@@ -3802,6 +3855,12 @@ class FailingCleanupDeleteValueRunStore extends InMemoryTriggerChatRunStore {
38023855
}
38033856
}
38043857

3858+
class AlwaysFailCleanupDeleteRunStore extends InMemoryTriggerChatRunStore {
3859+
public delete(_chatId: string): void {
3860+
throw new Error("cleanup delete always fails");
3861+
}
3862+
}
3863+
38053864
class FailingCleanupSetAndDeleteRunStore extends InMemoryTriggerChatRunStore {
38063865
private setCallCount = 0;
38073866
public readonly setCalls: string[] = [];

0 commit comments

Comments
 (0)