import {dbProvider} from "./db-provider"; import {value as createSql} from "./db-session-create_sql"; import {value as deleteSql} from "./db-session-delete_sql"; import {value as expireSql} from "./db-session-expire_sql"; import {value as updateSql} from "./db-session-update_sql"; import {value as verifySql} from "./db-session-verify_sql"; import debugCtor = require("debug"); const debug = debugCtor("db:session"); export function dbSessionCtor(dbProvider) { return { api: { /* return {sessionId:} */ async create(): Promise<{ sessionId: string, data: object }> { const dbs = await dbProvider(); const result = await dbs.write.one(createSql); debug(`create result: ${JSON.stringify(result)}`); if (!result || !result.id) { throw Error("could not create a new session."); } return {sessionId: result.id, data: result.data}; }, /* return {sessionId: userId:, data:} or null */ async verify(sessionId: string): Promise<{ sessionId: string, data: object, userId: string } | null> { const dbs = await dbProvider(); const result: { user_id: string, data: object } = await dbs.read.oneOrNone( verifySql, { sessionId, }, ); debug(`verify result: ${JSON.stringify(result)}`); if (result) { return {sessionId, userId: result.user_id, data: result.data}; } return null; }, /* data is persisted and expiry is extended by expiryInterval milliseconds */ async update(sessionInfo: { sessionId: string, data: object, userId: string }, expiryInterval: number): Promise { const dbs = await dbProvider(); const result = await dbs.write.result( updateSql, { sessionId: sessionInfo.sessionId, userId: sessionInfo.userId, data: sessionInfo.data, expiryInterval, }, ); debug(`update result: ${JSON.stringify(result)}`); }, /* expire old sessions */ async expire(): Promise { const dbs = await dbProvider(); const result = await dbs.delete.result(expireSql); debug(`expire result: ${JSON.stringify(result)}`); }, async delete(sessionId: string): Promise { const dbs = await dbProvider(); const result = await dbs.delete.result(deleteSql, {sessionId}); debug(`delete result: ${JSON.stringify(result)}`); }, }, dbProvider, }; } export const dbSession = dbSessionCtor(dbProvider).api;