From ccd8648b96eeaddaa6b8d9b7523cd9b1a745611e Mon Sep 17 00:00:00 2001 From: bharathkumar39293 Date: Wed, 28 Jan 2026 12:15:27 +0530 Subject: [PATCH] fix(webapp): preserve data integrity for non-JSON payloads in replay This fix removes the unintended Zod transformation and JSON enforcement in the ReplayRunData schema. It also refines the UI editability rules to be storage-based (not MIME-based) and adds a 512KB safety threshold for browser performance. --- .../components/runs/v3/ReplayRunDialog.tsx | 23 +++++++++++-------- apps/webapp/app/v3/replayTask.ts | 20 +--------------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/apps/webapp/app/components/runs/v3/ReplayRunDialog.tsx b/apps/webapp/app/components/runs/v3/ReplayRunDialog.tsx index 9192020e1b..3493b752ca 100644 --- a/apps/webapp/app/components/runs/v3/ReplayRunDialog.tsx +++ b/apps/webapp/app/components/runs/v3/ReplayRunDialog.tsx @@ -88,8 +88,7 @@ function ReplayContent({ runFriendlyId, failedRedirect }: ReplayRunDialogProps) } queueFetcher.load( - `/resources/orgs/${params.organizationSlug}/projects/${ - params.projectParam + `/resources/orgs/${params.organizationSlug}/projects/${params.projectParam }/env/${envSlug}/queues?${searchParams.toString()}` ); } @@ -163,9 +162,9 @@ function ReplayForm({ const isSubmitting = navigation.formAction === formAction; - const editablePayload = - replayData.payloadType === "application/json" || - replayData.payloadType === "application/super+json"; + const isLargePayload = replayData.payloadType === "application/store"; + const isTooLargeToEdit = (replayData.payload?.length ?? 0) > 512 * 1024; + const editablePayload = !isLargePayload && !isTooLargeToEdit; const [tab, setTab] = useState<"payload" | "metadata">(editablePayload ? "payload" : "metadata"); @@ -275,10 +274,16 @@ function ReplayForm({ - Payload is not editable for runs with{" "} - - large payloads. - + {isLargePayload ? ( + <> + Payload is not editable for runs with{" "} + + large payloads. + + + ) : ( + "Payload is too large to edit." + )} } /> diff --git a/apps/webapp/app/v3/replayTask.ts b/apps/webapp/app/v3/replayTask.ts index 90897cf7c2..6ee6ced33d 100644 --- a/apps/webapp/app/v3/replayTask.ts +++ b/apps/webapp/app/v3/replayTask.ts @@ -4,25 +4,7 @@ import { RunOptionsData } from "./testTask"; export const ReplayRunData = z .object({ environment: z.string().optional(), - payload: z - .string() - .optional() - .transform((val, ctx) => { - if (!val) { - return "{}"; - } - - try { - JSON.parse(val); - return val; - } catch { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: "Payload must be a valid JSON string", - }); - return z.NEVER; - } - }), + payload: z.string().optional(), metadata: z .string() .optional()