Skip to content

Commit 1c0b6b6

Browse files
authored
fix session subscription tracking (#4550)
* fix session subscription tracking - closes #793 * simplify * fix/simplify
1 parent d9a07c7 commit 1c0b6b6

File tree

5 files changed

+42
-15
lines changed

5 files changed

+42
-15
lines changed

.changeset/odd-coats-shake.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
Fix session store subscription tracking during SSR

packages/kit/src/runtime/server/page/render.js

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,14 @@ export async function render_response({
9191
stores: {
9292
page: writable(null),
9393
navigating: writable(null),
94-
session,
94+
/** @type {import('svelte/store').Writable<App.Session>} */
95+
session: {
96+
...session,
97+
subscribe: (fn) => {
98+
is_private = true;
99+
return session.subscribe(fn);
100+
}
101+
},
95102
updated
96103
},
97104
/** @type {import('types').Page} */
@@ -129,17 +136,7 @@ export async function render_response({
129136
props[`props_${i}`] = await branch[i].loaded.props;
130137
}
131138

132-
let session_tracking_active = false;
133-
const unsubscribe = session.subscribe(() => {
134-
if (session_tracking_active) is_private = true;
135-
});
136-
session_tracking_active = true;
137-
138-
try {
139-
rendered = options.root.render(props);
140-
} finally {
141-
unsubscribe();
142-
}
139+
rendered = options.root.render(props);
143140
} else {
144141
rendered = { head: '', html: '', css: { code: '', map: null } };
145142
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<script context="module">
2+
/** @type {import('@sveltejs/kit').Load} */
3+
export async function load() {
4+
return {
5+
maxage: 30
6+
};
7+
}
8+
</script>
9+
10+
<script>
11+
import { session } from '$app/stores';
12+
13+
const session_exists = !!$session;
14+
</script>
15+
16+
<h1>this page will be cached for 30 seconds ({session_exists})</h1>

packages/kit/test/apps/basics/src/routes/caching/private/uses-session.svelte renamed to packages/kit/test/apps/basics/src/routes/caching/private/uses-session-in-load.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@
1212
}
1313
</script>
1414

15-
<h1>this page will be cached for 30 seconds</h1>
15+
<script>
16+
export let session_exists;
17+
</script>
18+
19+
<h1>this page will be cached for 30 seconds ({session_exists})</h1>

packages/kit/test/apps/basics/test/test.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,13 @@ test.describe.parallel('Caching', () => {
305305
expect(response.headers()['cache-control']).toBe('public, max-age=30');
306306
});
307307

308-
test('sets cache-control: private if page uses session', async ({ request }) => {
309-
const response = await request.get('/caching/private/uses-session');
308+
test('sets cache-control: private if page uses session in load', async ({ request }) => {
309+
const response = await request.get('/caching/private/uses-session-in-load');
310+
expect(response.headers()['cache-control']).toBe('private, max-age=30');
311+
});
312+
313+
test('sets cache-control: private if page uses session in init', async ({ request }) => {
314+
const response = await request.get('/caching/private/uses-session-in-init');
310315
expect(response.headers()['cache-control']).toBe('private, max-age=30');
311316
});
312317

0 commit comments

Comments
 (0)