From 4d730c8747efa1bcd6cae888026012a575a8cfef Mon Sep 17 00:00:00 2001 From: Dotta Date: Sun, 19 Apr 2026 07:55:15 -0500 Subject: [PATCH] Fix heartbeat runs on legacy SQL_ASCII databases --- packages/adapter-utils/src/server-utils.ts | 1 + server/src/services/heartbeat.ts | 73 ---------------------- 2 files changed, 1 insertion(+), 73 deletions(-) diff --git a/packages/adapter-utils/src/server-utils.ts b/packages/adapter-utils/src/server-utils.ts index 4b3c4a792d4..ec23ba914e2 100644 --- a/packages/adapter-utils/src/server-utils.ts +++ b/packages/adapter-utils/src/server-utils.ts @@ -212,6 +212,7 @@ export function appendWithByteCap(prev: string, chunk: string, cap = MAX_CAPTURE while (start < buffer.length && (buffer[start]! & 0xc0) === 0x80) start += 1; return buffer.subarray(start).toString("utf8"); } + function resumeReadable(readable: { resume: () => unknown; destroyed?: boolean } | null | undefined) { if (!readable || readable.destroyed) return; readable.resume(); diff --git a/server/src/services/heartbeat.ts b/server/src/services/heartbeat.ts index 32421fc2c28..17b8b551379 100644 --- a/server/src/services/heartbeat.ts +++ b/server/src/services/heartbeat.ts @@ -630,79 +630,6 @@ const heartbeatRunIssueSummaryColumns = { function appendExcerpt(prev: string, chunk: string) { return appendWithByteCap(prev, chunk, MAX_EXCERPT_BYTES); } - -function truncateRunEventString(value: string) { - if (value.length <= MAX_RUN_EVENT_PAYLOAD_STRING_CHARS) return value; - const omittedChars = value.length - MAX_RUN_EVENT_PAYLOAD_STRING_CHARS; - return `${value.slice(0, MAX_RUN_EVENT_PAYLOAD_STRING_CHARS)}\n[truncated ${omittedChars} chars]`; -} - -function boundRunEventValue(value: unknown, depth: number, seen: WeakSet): unknown { - if (typeof value === "string") { - return truncateRunEventString(value); - } - if ( - value === null - || typeof value === "number" - || typeof value === "boolean" - ) { - return value; - } - if (value instanceof Date) { - return value.toISOString(); - } - if (Array.isArray(value)) { - if (depth >= MAX_RUN_EVENT_PAYLOAD_DEPTH) { - return { - _truncated: true, - type: "array", - originalLength: value.length, - }; - } - const bounded = value - .slice(0, MAX_RUN_EVENT_PAYLOAD_ARRAY_ITEMS) - .map((entry) => boundRunEventValue(entry, depth + 1, seen)); - if (value.length > MAX_RUN_EVENT_PAYLOAD_ARRAY_ITEMS) { - bounded.push({ - _truncated: true, - omittedItems: value.length - MAX_RUN_EVENT_PAYLOAD_ARRAY_ITEMS, - }); - } - return bounded; - } - if (typeof value !== "object" || value === undefined) { - return null; - } - if (seen.has(value)) { - return "[Circular]"; - } - seen.add(value); - const entries = Object.entries(value as Record); - if (depth >= MAX_RUN_EVENT_PAYLOAD_DEPTH) { - const bounded = { - _truncated: true, - type: "object", - keys: entries.map(([key]) => key).slice(0, 20), - }; - seen.delete(value); - return bounded; - } - - const out: Record = {}; - for (const [key, entryValue] of entries.slice(0, MAX_RUN_EVENT_PAYLOAD_OBJECT_KEYS)) { - out[key] = boundRunEventValue(entryValue, depth + 1, seen); - } - if (entries.length > MAX_RUN_EVENT_PAYLOAD_OBJECT_KEYS) { - out._truncated = true; - out._omittedKeys = entries.length - MAX_RUN_EVENT_PAYLOAD_OBJECT_KEYS; - } - seen.delete(value); - return out; -} - -export function boundHeartbeatRunEventPayloadForStorage(payload: Record): Record { - const bounded = boundRunEventValue(payload, 0, new WeakSet()); - return parseObject(bounded) ?? { _truncated: true }; } function truncateRunEventString(value: string) {