From 4d00645adb0370650049eb04ebf1094fc97ab4d5 Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Sun, 12 Apr 2026 21:27:01 +0800 Subject: [PATCH] feat(server): redis session storage and ttl helper Made-with: Cursor --- server/utils/session-redis.ts | 37 +++++++++++++++++++++++++++++++++++++ server/utils/session-ttl.ts | 5 +++++ test/unit/session-ttl.test.ts | 17 +++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 server/utils/session-redis.ts create mode 100644 server/utils/session-ttl.ts create mode 100644 test/unit/session-ttl.test.ts diff --git a/server/utils/session-redis.ts b/server/utils/session-redis.ts new file mode 100644 index 0000000..7eeac59 --- /dev/null +++ b/server/utils/session-redis.ts @@ -0,0 +1,37 @@ +import { getRedis } from "./redis"; +import { sessionTtlSeconds } from "./session-ttl"; + +export type SessionPayload = { + userId: number; + sessionVersion: number; + createdAt: string; +}; + +const sessionKey = (id: string) => `sess:${id}`; + +export async function createSession( + sessionId: string, + payload: SessionPayload, +): Promise { + const redis = getRedis(); + const ttl = sessionTtlSeconds(); + await redis.set(sessionKey(sessionId), JSON.stringify(payload), "EX", ttl); +} + +export async function readSession( + sessionId: string, +): Promise { + const redis = getRedis(); + const raw = await redis.get(sessionKey(sessionId)); + if (!raw) return null; + try { + return JSON.parse(raw) as SessionPayload; + } catch { + return null; + } +} + +export async function deleteSession(sessionId: string): Promise { + const redis = getRedis(); + await redis.del(sessionKey(sessionId)); +} diff --git a/server/utils/session-ttl.ts b/server/utils/session-ttl.ts new file mode 100644 index 0000000..ada0896 --- /dev/null +++ b/server/utils/session-ttl.ts @@ -0,0 +1,5 @@ +export function sessionTtlSeconds(): number { + const raw = process.env.SESSION_TTL_SECONDS; + const n = raw ? Number(raw) : NaN; + return Number.isFinite(n) && n > 0 ? n : 604800; +} diff --git a/test/unit/session-ttl.test.ts b/test/unit/session-ttl.test.ts new file mode 100644 index 0000000..44d3603 --- /dev/null +++ b/test/unit/session-ttl.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it, beforeEach } from "bun:test"; +import { sessionTtlSeconds } from "../../server/utils/session-ttl"; + +describe("sessionTtlSeconds", () => { + beforeEach(() => { + delete process.env.SESSION_TTL_SECONDS; + }); + + it("defaults to 7d", () => { + expect(sessionTtlSeconds()).toBe(604800); + }); + + it("respects env", () => { + process.env.SESSION_TTL_SECONDS = "120"; + expect(sessionTtlSeconds()).toBe(120); + }); +});