@@ -14,14 +14,26 @@ import type {
1414 AuthContext ,
1515 GetClientIpFn ,
1616 SessionConfig ,
17+ SessionTableConfig ,
1718} from "@private-landing/types" ;
1819import { defaultSessionConfig } from "../config" ;
1920import type { SessionService } from "./session-service" ;
2021
22+ /** Default table/column names — matches session-service.ts defaults */
23+ const DEFAULT_TABLE_CONFIG : Required < SessionTableConfig > = {
24+ tableName : "session" ,
25+ idColumn : "id" ,
26+ userIdColumn : "user_id" ,
27+ userAgentColumn : "user_agent" ,
28+ ipAddressColumn : "ip_address" ,
29+ expiresAtColumn : "expires_at" ,
30+ createdAtColumn : "created_at" ,
31+ } ;
32+
2133/**
2234 * Configuration for the mirrored session decorator.
2335 */
24- export interface MirroredSessionServiceConfig {
36+ export interface MirroredSessionServiceConfig extends SessionTableConfig {
2537 /** The inner session service to decorate (typically cache-backed) */
2638 inner : SessionService ;
2739 /** Factory that creates a DB client for SQL writes */
@@ -41,7 +53,13 @@ export interface MirroredSessionServiceConfig {
4153export function createMirroredSessionService (
4254 config : MirroredSessionServiceConfig ,
4355) : SessionService {
44- const { inner, createDbClient = defaultCreateDbClient , getClientIp } = config ;
56+ const {
57+ inner,
58+ createDbClient = defaultCreateDbClient ,
59+ getClientIp,
60+ ...tableConfig
61+ } = config ;
62+ const rc = { ...DEFAULT_TABLE_CONFIG , ...tableConfig } ;
4563
4664 return {
4765 async createSession (
@@ -67,7 +85,7 @@ export function createMirroredSessionService(
6785 const db = createDbClient ( ctx . env ) ;
6886
6987 await db . execute ( {
70- sql : `INSERT INTO session (id, user_id, user_agent, ip_address, expires_at, created_at )
88+ sql : `INSERT INTO ${ rc . tableName } ( ${ rc . idColumn } , ${ rc . userIdColumn } , ${ rc . userAgentColumn } , ${ rc . ipAddressColumn } , ${ rc . expiresAtColumn } , ${ rc . createdAtColumn } )
7189 VALUES (?, ?, ?, ?, datetime('now', '+' || ? || ' seconds'), datetime('now'))` ,
7290 args : [
7391 sessionId ,
@@ -81,13 +99,13 @@ export function createMirroredSessionService(
8199 // Mirror the session limit enforcement (expire oldest beyond maxSessions)
82100 await db . execute ( {
83101 sql : `WITH ranked AS (
84- SELECT id , ROW_NUMBER() OVER (
85- PARTITION BY user_id ORDER BY created_at DESC
86- ) AS rn FROM session
87- WHERE user_id = ? AND expires_at > datetime('now')
102+ SELECT ${ rc . idColumn } , ROW_NUMBER() OVER (
103+ PARTITION BY ${ rc . userIdColumn } ORDER BY ${ rc . createdAtColumn } DESC
104+ ) AS rn FROM ${ rc . tableName }
105+ WHERE ${ rc . userIdColumn } = ? AND ${ rc . expiresAtColumn } > datetime('now')
88106 )
89- UPDATE session SET expires_at = datetime('now')
90- WHERE id IN (SELECT id FROM ranked WHERE rn > ?)` ,
107+ UPDATE ${ rc . tableName } SET ${ rc . expiresAtColumn } = datetime('now')
108+ WHERE ${ rc . idColumn } IN (SELECT ${ rc . idColumn } FROM ranked WHERE rn > ?)` ,
91109 args : [ userId , sessionConfig . maxSessions ] ,
92110 } ) ;
93111 } catch ( error ) {
@@ -107,7 +125,7 @@ export function createMirroredSessionService(
107125 if ( payload ?. sid ) {
108126 const db = createDbClient ( ctx . env ) ;
109127 await db . execute ( {
110- sql : " UPDATE session SET expires_at = datetime('now') WHERE id = ?" ,
128+ sql : ` UPDATE ${ rc . tableName } SET ${ rc . expiresAtColumn } = datetime('now') WHERE ${ rc . idColumn } = ?` ,
111129 args : [ payload . sid ] ,
112130 } ) ;
113131 }
@@ -125,7 +143,7 @@ export function createMirroredSessionService(
125143 try {
126144 const db = createDbClient ( ctx . env ) ;
127145 await db . execute ( {
128- sql : " UPDATE session SET expires_at = datetime('now') WHERE user_id = ? AND expires_at > datetime('now')" ,
146+ sql : ` UPDATE ${ rc . tableName } SET ${ rc . expiresAtColumn } = datetime('now') WHERE ${ rc . userIdColumn } = ? AND ${ rc . expiresAtColumn } > datetime('now')` ,
129147 args : [ userId ] ,
130148 } ) ;
131149 } catch ( error ) {
0 commit comments