Skip to content

Commit 7feb3f3

Browse files
committed
fix session subscription tracking - closes #793
1 parent d4ec813 commit 7feb3f3

File tree

5 files changed

+48
-15
lines changed

5 files changed

+48
-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: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,20 @@ export async function render_response({
8484
maxage = loaded.maxage;
8585
});
8686

87-
const session = writable($session);
87+
/** @type {import('svelte/store').Writable<App.Session>} */
88+
const session = {
89+
subscribe: (fn) => {
90+
is_private = true;
91+
fn($session);
92+
return () => {};
93+
},
94+
set: () => {
95+
throw new Error('Cannot write to session during SSR');
96+
},
97+
update: () => {
98+
throw new Error('Cannot write to session during SSR');
99+
}
100+
};
88101

89102
/** @type {Record<string, any>} */
90103
const props = {
@@ -129,17 +142,7 @@ export async function render_response({
129142
props[`props_${i}`] = await branch[i].loaded.props;
130143
}
131144

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-
}
145+
rendered = options.root.render(props);
143146
} else {
144147
rendered = { head: '', html: '', css: { code: '', map: null } };
145148
}
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)