Skip to content

Commit 4adc773

Browse files
authored
Auto-resolve payload/output presigned urls when retrieving a run with runs.retrieve (#1317)
1 parent b5cdb0c commit 4adc773

File tree

4 files changed

+99
-7
lines changed

4 files changed

+99
-7
lines changed

.changeset/polite-tables-exercise.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@trigger.dev/sdk": patch
3+
"@trigger.dev/core": patch
4+
---
5+
6+
Auto-resolve payload/output presigned urls when retrieving a run with runs.retrieve

packages/core/src/v3/utils/ioSerialization.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,31 @@ export async function conditionallyImportPacket(
160160
}
161161
}
162162

163+
export async function resolvePresignedPacketUrl(
164+
url: string,
165+
tracer?: TriggerTracer
166+
): Promise<any | undefined> {
167+
try {
168+
const response = await fetch(url);
169+
170+
if (!response.ok) {
171+
return;
172+
}
173+
174+
const data = await response.text();
175+
const dataType = response.headers.get("content-type") ?? "application/json";
176+
177+
const packet = {
178+
data,
179+
dataType,
180+
};
181+
182+
return await parsePacket(packet);
183+
} catch (error) {
184+
return;
185+
}
186+
}
187+
163188
async function importPacket(packet: IOPacket, span?: Span): Promise<IOPacket> {
164189
if (!packet.data) {
165190
return packet;

packages/trigger-sdk/src/v3/runs.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {
33
ListProjectRunsQueryParams,
44
ListRunsQueryParams,
55
RescheduleRunRequestBody,
6+
TriggerTracer,
67
} from "@trigger.dev/core/v3";
78
import {
89
ApiPromise,
@@ -19,6 +20,7 @@ import {
1920
} from "@trigger.dev/core/v3";
2021
import { AnyTask, Prettify, RunHandle, Task, apiClientMissingError } from "./shared.js";
2122
import { tracer } from "./tracer.js";
23+
import { resolvePresignedPacketUrl } from "@trigger.dev/core/v3/utils/ioSerialization";
2224

2325
export type RetrieveRunResult<TRunId> = Prettify<
2426
TRunId extends RunHandle<infer TOutput>
@@ -183,13 +185,31 @@ function retrieveRun<TRunId extends RunHandle<any> | AnyTask | string>(
183185
requestOptions
184186
);
185187

186-
if (typeof runId === "string") {
187-
return apiClient.retrieveRun(runId, $requestOptions) as ApiPromise<RetrieveRunResult<TRunId>>;
188-
} else {
189-
return apiClient.retrieveRun(runId.id, $requestOptions) as ApiPromise<
190-
RetrieveRunResult<TRunId>
191-
>;
188+
const $runId = typeof runId === "string" ? runId : runId.id;
189+
190+
return apiClient.retrieveRun($runId, $requestOptions).then((retrievedRun) => {
191+
return resolvePayloadAndOutputUrls(retrievedRun);
192+
}) as ApiPromise<RetrieveRunResult<TRunId>>;
193+
}
194+
195+
async function resolvePayloadAndOutputUrls(run: RetrieveRunResult<any>) {
196+
const resolvedRun = { ...run };
197+
198+
if (run.payloadPresignedUrl && run.outputPresignedUrl) {
199+
const [payload, output] = await Promise.all([
200+
resolvePresignedPacketUrl(run.payloadPresignedUrl, tracer),
201+
resolvePresignedPacketUrl(run.outputPresignedUrl, tracer),
202+
]);
203+
204+
resolvedRun.payload = payload;
205+
resolvedRun.output = output;
206+
} else if (run.payloadPresignedUrl) {
207+
resolvedRun.payload = await resolvePresignedPacketUrl(run.payloadPresignedUrl, tracer);
208+
} else if (run.outputPresignedUrl) {
209+
resolvedRun.output = await resolvePresignedPacketUrl(run.outputPresignedUrl, tracer);
192210
}
211+
212+
return resolvedRun;
193213
}
194214

195215
function replayRun(

references/v3-catalog/src/trigger/sdkUsage.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,51 @@ export const sdkUsage = task({
119119

120120
export const sdkChild = task({
121121
id: "sdk-child",
122-
run: async (payload: any) => {},
122+
run: async (payload: any) => {
123+
return payload;
124+
},
123125
});
124126

125127
export const sdkSchedule = schedules.task({
126128
id: "sdk-schedule",
127129
run: async (payload: any) => {},
128130
});
131+
132+
export const autoResolvePayloadAndOutput = task({
133+
id: "auto-resolve-payload-and-output",
134+
run: async (payload: any, { ctx }) => {
135+
// Generate a large JSON payload (bigger than 128KB)
136+
const childPayload = Array.from({ length: 10000 }, () => ({
137+
key: "value",
138+
date: new Date(),
139+
}));
140+
141+
const handle = await tasks.trigger<typeof sdkChild>("sdk-child", childPayload);
142+
143+
const childRun = await runs.retrieve(handle.id);
144+
145+
if (childRun.payload) {
146+
console.log("Child run payload exists", {
147+
payloadPresignedUrl: childRun.payloadPresignedUrl,
148+
});
149+
} else {
150+
console.log("Child run payload does not exist", {
151+
payloadPresignedUrl: childRun.payloadPresignedUrl,
152+
});
153+
}
154+
155+
await runs.poll(handle.id);
156+
157+
const finishedRun = await runs.retrieve(handle.id);
158+
159+
if (finishedRun.output) {
160+
console.log("Finished run output exists", {
161+
outputPresignedUrl: finishedRun.outputPresignedUrl,
162+
});
163+
} else {
164+
console.log("Finished run payload does not exist", {
165+
outputPresignedUrl: finishedRun.outputPresignedUrl,
166+
});
167+
}
168+
},
169+
});

0 commit comments

Comments
 (0)