UNPKG

@lucia-auth/adapter-session-unstorage

Version:

Unstorage session adapter for Lucia

70 lines (69 loc) 3.19 kB
import { prefixStorage } from "unstorage"; export const DEFAULT_SESSION_PREFIX = "session"; export const DEFAULT_USER_SESSION_PREFIX = "user_session"; export const unstorageAdapter = (storage, prefixes) => { return () => { const sessionStorage = prefixStorage(storage, prefixes?.session ?? DEFAULT_SESSION_PREFIX); const getUserSessionStorage = (userId) => { const prefix = [ prefixes?.userSession ?? DEFAULT_USER_SESSION_PREFIX, userId ].join(":"); return prefixStorage(storage, prefix); }; return { getSession: async (sessionId) => { const sessionResult = (await sessionStorage.getItem(sessionId)) ?? null; return sessionResult; }, getSessionsByUserId: async (userId) => { const userSessionStorage = getUserSessionStorage(userId); const sessionIds = await userSessionStorage.getKeys(); const sessionResults = await Promise.all(sessionIds.map((sessionId) => { return sessionStorage.getItem(sessionId); })); return sessionResults.filter((sessionResult) => { return sessionResult !== null; }); }, setSession: async (session) => { const userSessionStorage = getUserSessionStorage(session.user_id); await Promise.all([ userSessionStorage.setItem(session.user_id, ""), sessionStorage.setItem(session.id, session, { ttl: Math.floor(Number(session.idle_expires) / 1000) }) ]); }, deleteSession: async (sessionId) => { const sessionResult = (await sessionStorage.getItem(sessionId)) ?? null; if (!sessionResult) return; const sessionUserStorage = getUserSessionStorage(sessionId); await Promise.all([ sessionStorage.removeItem(sessionId), sessionUserStorage.removeItem(sessionId) ]); }, deleteSessionsByUserId: async (userId) => { const userSessionStorage = getUserSessionStorage(userId); const sessionIds = await userSessionStorage.getKeys(); await Promise.all([ ...sessionIds.map((sessionId) => { return sessionStorage.removeItem(sessionId); }), userSessionStorage.clear() ]); }, updateSession: async (sessionId, partialSession) => { const sessionResult = (await sessionStorage.getItem(sessionId)) ?? null; if (!sessionResult) return; const updatedSession = { ...sessionResult, ...partialSession }; await sessionStorage.setItem(sessionId, updatedSession, { ttl: Math.floor(Number(partialSession.idle_expires) / 1000) }); } }; }; };