Browse Source

feat(server): redis session storage and ttl helper

Made-with: Cursor
feat/auth-user
npmrun 6 days ago
parent
commit
4d00645adb
  1. 37
      server/utils/session-redis.ts
  2. 5
      server/utils/session-ttl.ts
  3. 17
      test/unit/session-ttl.test.ts

37
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<void> {
const redis = getRedis();
const ttl = sessionTtlSeconds();
await redis.set(sessionKey(sessionId), JSON.stringify(payload), "EX", ttl);
}
export async function readSession(
sessionId: string,
): Promise<SessionPayload | null> {
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<void> {
const redis = getRedis();
await redis.del(sessionKey(sessionId));
}

5
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;
}

17
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);
});
});
Loading…
Cancel
Save