From 4e3f7b8ceb9d651e102e68f53dfff8d1a4ca4c9e Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 4 Mar 2026 07:53:02 +0000 Subject: [PATCH] fix: save session data when session id is regenerated --- .changeset/fix-session-regenerate-dirty.md | 7 ++++ packages/astro/src/core/session/runtime.ts | 1 + .../test/units/sessions/astro-session.test.js | 33 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 .changeset/fix-session-regenerate-dirty.md diff --git a/.changeset/fix-session-regenerate-dirty.md b/.changeset/fix-session-regenerate-dirty.md new file mode 100644 index 000000000000..efed9ddca719 --- /dev/null +++ b/.changeset/fix-session-regenerate-dirty.md @@ -0,0 +1,7 @@ +--- +'astro': patch +--- + +Fixes a bug that caused `session.regenerate()` to silently lose session data + +Previously, regenerated session data was not saved under the new session ID unless `set()` was also called. diff --git a/packages/astro/src/core/session/runtime.ts b/packages/astro/src/core/session/runtime.ts index 4c8c62179323..d814ca95e528 100644 --- a/packages/astro/src/core/session/runtime.ts +++ b/packages/astro/src/core/session/runtime.ts @@ -243,6 +243,7 @@ export class AstroSession { // Create new session this.#sessionID = crypto.randomUUID(); this.#data = data; + this.#dirty = true; await this.#setCookie(); // Clean up old session asynchronously diff --git a/packages/astro/test/units/sessions/astro-session.test.js b/packages/astro/test/units/sessions/astro-session.test.js index d5c9e4c651dc..51ffdba38df1 100644 --- a/packages/astro/test/units/sessions/astro-session.test.js +++ b/packages/astro/test/units/sessions/astro-session.test.js @@ -131,6 +131,39 @@ describe('AstroSession - Session Regeneration', () => { assert.notEqual(initialId, newId); }); + + it('should persist data after regeneration without a subsequent set()', async () => { + const store = new Map(); + const mockStorage = { + get: async (key) => { + const raw = store.get(key); + return raw ? JSON.parse(raw) : null; + }, + setItem: async (key, value) => { + store.set(key, value); + }, + removeItem: async (key) => { + store.delete(key); + }, + }; + + const session = createSession(defaultConfig, defaultMockCookies, mockStorage); + + session.set('user', 'alice'); + await session[PERSIST_SYMBOL](); + + await session.regenerate(); + await session[PERSIST_SYMBOL](); + + // Create a new session that reads from the same storage + const newSession = createSession(defaultConfig, { + ...defaultMockCookies, + get: () => ({ value: session.sessionID }), + }, mockStorage); + + const value = await newSession.get('user'); + assert.equal(value, 'alice'); + }); }); describe('AstroSession - Data Persistence', () => {