diff --git a/apps/nextjs/src/app/[locale]/_client-providers/query-persistence.ts b/apps/nextjs/src/app/[locale]/_client-providers/query-persistence.ts index 9dbcfe169..8411eb8d2 100644 --- a/apps/nextjs/src/app/[locale]/_client-providers/query-persistence.ts +++ b/apps/nextjs/src/app/[locale]/_client-providers/query-persistence.ts @@ -214,10 +214,26 @@ export const createSessionQueryPersister = ( remainingBytes -= queryBytes; } - return { + const buildCandidate = (queryCount: number): PersistedClient => ({ ...limitedClient, - clientState: { ...limitedClient.clientState, queries: selectedQueries }, - }; + clientState: { ...limitedClient.clientState, queries: selectedQueries.slice(0, queryCount) }, + }); + let minimumQueryCount = 0; + let maximumQueryCount = selectedQueries.length; + + while (minimumQueryCount < maximumQueryCount) { + const queryCount = Math.ceil((minimumQueryCount + maximumQueryCount) / 2); + const candidate = buildCandidate(queryCount); + if (measureSerializedBytes(candidate) <= queryPersistenceMaxCacheBytes) { + minimumQueryCount = queryCount; + } else { + maximumQueryCount = queryCount - 1; + } + } + + const candidate = buildCandidate(minimumQueryCount); + if (measureSerializedBytes(candidate) > queryPersistenceMaxCacheBytes) return undefined; + return candidate; }; const persistNow = (client: PersistedClient) => { diff --git a/apps/nextjs/src/app/api/demo-assets/overview/route.ts b/apps/nextjs/src/app/api/demo-assets/overview/route.ts index 401e97564..487caf6c4 100644 --- a/apps/nextjs/src/app/api/demo-assets/overview/route.ts +++ b/apps/nextjs/src/app/api/demo-assets/overview/route.ts @@ -50,7 +50,7 @@ const overview = ` export const GET = () => new Response(overview, { headers: { - "Cache-Control": "public, max-age=31536000, immutable", + "Cache-Control": "public, max-age=3600", "Content-Type": "text/html; charset=utf-8", }, }); diff --git a/apps/nextjs/src/app/api/demo-assets/video/route.ts b/apps/nextjs/src/app/api/demo-assets/video/route.ts index c4ef08adb..47c74d125 100644 --- a/apps/nextjs/src/app/api/demo-assets/video/route.ts +++ b/apps/nextjs/src/app/api/demo-assets/video/route.ts @@ -4,7 +4,7 @@ const videoBase64 = export const GET = () => new Response(Buffer.from(videoBase64, "base64"), { headers: { - "Cache-Control": "public, max-age=31536000, immutable", + "Cache-Control": "public, max-age=3600", "Content-Type": "video/mp4", }, }); diff --git a/packages/api/src/router/widgets/immich.ts b/packages/api/src/router/widgets/immich.ts index 220e67a14..835f96996 100644 --- a/packages/api/src/router/widgets/immich.ts +++ b/packages/api/src/router/widgets/immich.ts @@ -51,7 +51,7 @@ export const immichRouter = createTRPCRouter({ .concat(createImmichIntegrationMiddleware("query")) .query(async ({ ctx, input }) => { if (ctx.integration.kind === "mock") { - if (input.limit === undefined) return mockWidgetData.immichAlbums; + if (input.limit === undefined) return [...mockWidgetData.immichAlbums]; return mockWidgetData.immichAlbums.slice(0, input.limit); } const innerHandler = immichAlbumsRequestHandler.handler(