From 1c0b6b6912d640e6cc626c4afc4f34683a01f03e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 8 Apr 2022 13:03:30 -0400 Subject: [PATCH] fix session subscription tracking (#4550) * fix session subscription tracking - closes #793 * simplify * fix/simplify --- .changeset/odd-coats-shake.md | 5 +++++ .../kit/src/runtime/server/page/render.js | 21 ++++++++----------- .../private/uses-session-in-init.svelte | 16 ++++++++++++++ ...ion.svelte => uses-session-in-load.svelte} | 6 +++++- packages/kit/test/apps/basics/test/test.js | 9 ++++++-- 5 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 .changeset/odd-coats-shake.md create mode 100644 packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-init.svelte rename packages/kit/test/apps/basics/src/routes/caching/private/{uses-session.svelte => uses-session-in-load.svelte} (66%) 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'); });