Skip to content

Commit 8e0dcd4

Browse files
Harden consumeTrackingStream error callback coverage
Co-authored-by: Eric Allam <eric@trigger.dev>
1 parent ebd39aa commit 8e0dcd4

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

packages/ai/src/chatTransport.test.ts

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,6 +1406,117 @@ describe("TriggerChatTransport", function () {
14061406
expect(runStore.get("chat-tracking-error")).toBeUndefined();
14071407
});
14081408

1409+
it("normalizes non-Error consumeTrackingStream failures before reporting onError", async function () {
1410+
const errors: TriggerChatTransportError[] = [];
1411+
const runStore = new TrackedRunStore();
1412+
1413+
const server = await startServer(function (req, res) {
1414+
if (req.method === "POST" && req.url === "/api/v1/tasks/chat-task/trigger") {
1415+
res.writeHead(200, {
1416+
"content-type": "application/json",
1417+
"x-trigger-jwt": "pk_run_tracking_string_error",
1418+
});
1419+
res.end(JSON.stringify({ id: "run_tracking_string_error" }));
1420+
return;
1421+
}
1422+
1423+
res.writeHead(404);
1424+
res.end();
1425+
});
1426+
1427+
const transport = new TriggerChatTransport({
1428+
task: "chat-task",
1429+
stream: "chat-stream",
1430+
accessToken: "pk_trigger",
1431+
baseURL: server.url,
1432+
runStore,
1433+
onError: function onError(error) {
1434+
errors.push(error);
1435+
},
1436+
});
1437+
1438+
(transport as any).fetchRunStream = async function fetchRunStream() {
1439+
return new ReadableStream({
1440+
start(controller) {
1441+
controller.error("tracking string failure");
1442+
},
1443+
});
1444+
};
1445+
1446+
const stream = await transport.sendMessages({
1447+
trigger: "submit-message",
1448+
chatId: "chat-tracking-string-error",
1449+
messageId: undefined,
1450+
messages: [],
1451+
abortSignal: undefined,
1452+
});
1453+
1454+
await expect(readChunks(stream)).rejects.toBe("tracking string failure");
1455+
1456+
await waitForCondition(function () {
1457+
return errors.length === 1;
1458+
});
1459+
1460+
expect(errors[0]).toMatchObject({
1461+
phase: "consumeTrackingStream",
1462+
chatId: "chat-tracking-string-error",
1463+
runId: "run_tracking_string_error",
1464+
});
1465+
expect(errors[0]?.error.message).toBe("tracking string failure");
1466+
expect(runStore.get("chat-tracking-string-error")).toBeUndefined();
1467+
});
1468+
1469+
it("ignores onError callback failures during consumeTrackingStream errors", async function () {
1470+
const runStore = new TrackedRunStore();
1471+
1472+
const server = await startServer(function (req, res) {
1473+
if (req.method === "POST" && req.url === "/api/v1/tasks/chat-task/trigger") {
1474+
res.writeHead(200, {
1475+
"content-type": "application/json",
1476+
"x-trigger-jwt": "pk_run_tracking_onerror_failure",
1477+
});
1478+
res.end(JSON.stringify({ id: "run_tracking_onerror_failure" }));
1479+
return;
1480+
}
1481+
1482+
res.writeHead(404);
1483+
res.end();
1484+
});
1485+
1486+
const transport = new TriggerChatTransport({
1487+
task: "chat-task",
1488+
stream: "chat-stream",
1489+
accessToken: "pk_trigger",
1490+
baseURL: server.url,
1491+
runStore,
1492+
onError: async function onError() {
1493+
throw new Error("onError failed");
1494+
},
1495+
});
1496+
1497+
(transport as any).fetchRunStream = async function fetchRunStream() {
1498+
return new ReadableStream({
1499+
start(controller) {
1500+
controller.error(new Error("tracking failed root cause"));
1501+
},
1502+
});
1503+
};
1504+
1505+
const stream = await transport.sendMessages({
1506+
trigger: "submit-message",
1507+
chatId: "chat-tracking-onerror-failure",
1508+
messageId: undefined,
1509+
messages: [],
1510+
abortSignal: undefined,
1511+
});
1512+
1513+
await expect(readChunks(stream)).rejects.toThrowError("tracking failed root cause");
1514+
1515+
await waitForCondition(function () {
1516+
return runStore.get("chat-tracking-onerror-failure") === undefined;
1517+
});
1518+
});
1519+
14091520
it("reports reconnect failures through onError", async function () {
14101521
const errors: TriggerChatTransportError[] = [];
14111522
const runStore = new InMemoryTriggerChatRunStore();

0 commit comments

Comments
 (0)