Skip to content

Commit 55a44c0

Browse files
committed
Allow replaying and editing SuperJSON payloads
1 parent 427054f commit 55a44c0

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

apps/webapp/app/components/runs/v3/ReplayRunDialog.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ function ReplayForm({
6767
const formAction = `/resources/taskruns/${runFriendlyId}/replay`;
6868
const isSubmitting = navigation.formAction === formAction;
6969

70-
const editablePayload = payloadType === "application/json";
70+
const editablePayload =
71+
payloadType === "application/json" || payloadType === "application/super+json";
7172

7273
const submitForm = useCallback(
7374
(e: React.FormEvent<HTMLFormElement>) => {

apps/webapp/app/v3/services/replayTaskRun.server.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1-
import { conditionallyImportPacket, IOPacket, parsePacket, RunTags } from "@trigger.dev/core/v3";
1+
import {
2+
conditionallyImportPacket,
3+
IOPacket,
4+
parsePacket,
5+
RunTags,
6+
stringifyIO,
7+
} from "@trigger.dev/core/v3";
8+
import { replaceSuperJsonPayload } from "@trigger.dev/core/v3/utils/ioSerialization";
29
import { TaskRun } from "@trigger.dev/database";
310
import { findEnvironmentById } from "~/models/runtimeEnvironment.server";
11+
import { getTagsForRunId } from "~/models/taskRunTag.server";
412
import { logger } from "~/services/logger.server";
513
import { BaseService } from "./baseService.server";
614
import { OutOfEntitlementError, TriggerTaskService } from "./triggerTask.server";
7-
import { getTagsForRunId } from "~/models/taskRunTag.server";
815

916
type OverrideOptions = {
1017
environmentId?: string;
@@ -28,10 +35,18 @@ export class ReplayTaskRunService extends BaseService {
2835
let payloadPacket: IOPacket;
2936

3037
if (overrideOptions?.payload) {
31-
payloadPacket = await conditionallyImportPacket({
32-
data: overrideOptions.payload,
33-
dataType: "application/json",
34-
});
38+
if (existingTaskRun.payloadType === "application/super+json") {
39+
const newPayload = await replaceSuperJsonPayload(
40+
existingTaskRun.payload,
41+
overrideOptions.payload
42+
);
43+
payloadPacket = await stringifyIO(newPayload);
44+
} else {
45+
payloadPacket = await conditionallyImportPacket({
46+
data: overrideOptions.payload,
47+
dataType: existingTaskRun.payloadType,
48+
});
49+
}
3550
} else {
3651
payloadPacket = await conditionallyImportPacket({
3752
data: existingTaskRun.payload,

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,3 +351,16 @@ function safeJsonParse(value: string): any {
351351
return;
352352
}
353353
}
354+
355+
export async function replaceSuperJsonPayload(original: string, newPayload: string) {
356+
const superjson = await loadSuperJSON();
357+
const originalObject = superjson.parse(original);
358+
const { meta } = superjson.serialize(originalObject);
359+
360+
const newSuperJson = {
361+
json: JSON.parse(newPayload) as any,
362+
meta,
363+
};
364+
365+
return superjson.deserialize(newSuperJson);
366+
}

0 commit comments

Comments
 (0)