diff --git a/packages/app/src/utils/session-export.test.ts b/packages/app/src/utils/session-export.test.ts index ff18a16b7fa3..23d34c8de94d 100644 --- a/packages/app/src/utils/session-export.test.ts +++ b/packages/app/src/utils/session-export.test.ts @@ -16,6 +16,13 @@ describe("sessionExportFilename", () => { test("falls back to id when title and slug are empty", () => { expect(sessionExportFilename({ id: "ses_123" })).toBe("ses_123.json") }) + + test("limits filename length while preserving the extension", () => { + const filename = sessionExportFilename({ id: "ses_123", title: "x".repeat(300) }) + + expect(filename).toBe(`${"x".repeat(250)}.json`) + expect(new TextEncoder().encode(filename)).toHaveLength(255) + }) }) describe("fetchSessionExport", () => { diff --git a/packages/app/src/utils/session-export.ts b/packages/app/src/utils/session-export.ts index 6eb9f9ab6a7c..bf8b3d35d0c3 100644 --- a/packages/app/src/utils/session-export.ts +++ b/packages/app/src/utils/session-export.ts @@ -16,6 +16,8 @@ export type SessionExportClient = { } } +const MAX_EXPORT_BASENAME_LENGTH = 250 + export async function fetchSessionExport(input: { sessionID: string client: SessionExportClient @@ -43,6 +45,7 @@ export function sessionExportFilename(session: { id: string; title?: string; slu const clean = name .toLowerCase() .replace(/[^a-z0-9_-]+/gi, "-") + .slice(0, MAX_EXPORT_BASENAME_LENGTH) .replace(/^-+|-+$/g, "") return `${clean || session.id}.json` }