diff --git a/.changeset/odd-coats-shake.md b/.changeset/odd-coats-shake.md new file mode 100644 index 000000000000..bcd7f4496860 --- /dev/null +++ b/.changeset/odd-coats-shake.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Fix session store subscription tracking during SSR diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index ce1f0c45c17a..a9d8fa509e54 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -91,7 +91,14 @@ export async function render_response({ stores: { page: writable(null), navigating: writable(null), - session, + /** @type {import('svelte/store').Writable} */ + session: { + ...session, + subscribe: (fn) => { + is_private = true; + return session.subscribe(fn); + } + }, updated }, /** @type {import('types').Page} */ @@ -129,17 +136,7 @@ export async function render_response({ props[`props_${i}`] = await branch[i].loaded.props; } - let session_tracking_active = false; - const unsubscribe = session.subscribe(() => { - if (session_tracking_active) is_private = true; - }); - session_tracking_active = true; - - try { - rendered = options.root.render(props); - } finally { - unsubscribe(); - } + rendered = options.root.render(props); } else { rendered = { head: '', html: '', css: { code: '', map: null } }; } diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte new file mode 100644 index 000000000000..3163da147f65 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte @@ -0,0 +1,16 @@ + + + + +

this page will be cached for 30 seconds ({session_exists})

diff --git a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session.svelte b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte similarity index 66% rename from packages/kit/test/apps/basics/src/routes/caching/private/uses-session.svelte rename to packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte index eb32f9809fad..5a0529998970 100644 --- a/packages/kit/test/apps/basics/src/routes/caching/private/uses-session.svelte +++ b/packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte @@ -12,4 +12,8 @@ } -

this page will be cached for 30 seconds

+ + +

this page will be cached for 30 seconds ({session_exists})

diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 507f494ccdce..ee1add1364ac 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -305,8 +305,13 @@ test.describe.parallel('Caching', () => { expect(response.headers()['cache-control']).toBe('public, max-age=30'); }); - test('sets cache-control: private if page uses session', async ({ request }) => { - const response = await request.get('/caching/private/uses-session'); + test('sets cache-control: private if page uses session in load', async ({ request }) => { + const response = await request.get('/caching/private/uses-session-in-load'); + expect(response.headers()['cache-control']).toBe('private, max-age=30'); + }); + + test('sets cache-control: private if page uses session in init', async ({ request }) => { + const response = await request.get('/caching/private/uses-session-in-init'); expect(response.headers()['cache-control']).toBe('private, max-age=30'); });