UNPKG

@compas/store

Version:

Postgres & S3-compatible wrappers for common things

96 lines (85 loc) 2.95 kB
import { eventStart, eventStop, newEventFromEvent } from "@compas/stdlib"; import { sessionStoreCleanupExpiredSessions } from "./session-store.js"; /** * Returns a {@link QueueWorkerHandler} that removes expired and revoked sessions via * {@link sessionStoreCleanupExpiredSessions}. By default, removes expired and revoked * sessions after 14 days. * * If 'maxSessionLifetimeInDays' is provided, even active sessions will be removed if * they are created 'maxSessionLifetimeInDays'-days ago. * * Recommended interval: daily * Recommended cronExpression: 0 2 * * * * * @param {{ * maxRevokedAgeInDays?: number, * maxSessionLifetimeInDays?: number, * }} [options] * @returns {import("./queue-worker.js").QueueWorkerHandler} */ export function jobSessionStoreCleanup(options) { /** * @param {import("@compas/stdlib").InsightEvent} event * @param {import("postgres").Sql<{}>} sql * @returns {Promise<void>} */ return async function jobSessionStoreCleanup(event, sql) { eventStart(event, "job.sessionStoreCleanup"); await sessionStoreCleanupExpiredSessions( newEventFromEvent(event), sql, options?.maxRevokedAgeInDays ?? 14, options?.maxSessionLifetimeInDays, ); eventStop(event); }; } /** * A {@link QueueWorkerHandler} to process reported leaked sessions. These jobs occur * when the session store finds that refresh token is used multiple times. The job is * able to either process the leaked session in to a report and log it via `type: * "sessionStore.leakedSession.report"` or is able to dump the raw session information * via `type: "sessionStore.leakedSession.dump"` * * @param {{ * useDump?: boolean, * }} [options] * @returns {import("./queue-worker.js").QueueWorkerHandler} */ export function jobSessionStoreProcessLeakedSession(options) { /** * @param {import("@compas/stdlib").InsightEvent} event * @param {import("postgres").Sql<{}>} sql * @param {import("./generated/common/types.d.ts").StoreJob} job * @returns {void} */ return function jobSessionStoreProcessLeakedSession(event, sql, job) { eventStart(event, "job.sessionStoreProcessLeakedSession"); if (options?.useDump) { event.log.info({ type: "sessionStore.leakedSession.dump", session: job.data.report.session, }); eventStop(event); return; } const session = job.data.report.session; const sessionCreated = new Date(session.createdAt); const sessionRevoked = new Date(session.revokedAt); const lastRefreshTimes = session.tokens .slice(session.tokens.length - 4) .map((it) => ({ createdAt: new Date(it.createdAt), revokedAt: new Date(it.revokedAt), })); event.log.info({ type: "sessionStore.leakedSession.report", session: { sessionCreated, sessionRevoked, lastRefreshTimes, }, }); eventStop(event); }; }