UNPKG

overcentric

Version:

A lightweight, privacy-focused toolkit for modern SaaS web applications

94 lines (93 loc) 3.67 kB
import { generateUuid } from './identity'; const SESSION_KEY = 'overcentric_session'; const SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes in milliseconds const NAVIGATION_TIMEOUT = 10 * 60 * 1000; // 10 minutes in milliseconds /** * Get or create a session ID. * @returns The current session ID */ export function getSessionId() { const now = Date.now(); const storedSession = localStorage.getItem(SESSION_KEY); if (storedSession) { try { const session = JSON.parse(storedSession); const inactivityTime = now - session.lastActivity; const navigationTime = session.lastVisibilityChange ? now - session.lastVisibilityChange : 0; // Check both inactivity timeout and navigation timeout if (inactivityTime < SESSION_TIMEOUT && navigationTime < NAVIGATION_TIMEOUT) { // Update last activity and return existing session session.lastActivity = now; localStorage.setItem(SESSION_KEY, JSON.stringify(session)); return session.id; } } catch (error) { console.error('Error parsing stored session:', error); } } // Create new session const newSession = { id: generateUuid(), lastActivity: now }; localStorage.setItem(SESSION_KEY, JSON.stringify(newSession)); return newSession.id; } /** * Update the last activity timestamp for the current session. * @returns void */ export function updateSessionActivity() { const storedSession = localStorage.getItem(SESSION_KEY); if (storedSession) { try { const session = JSON.parse(storedSession); session.lastActivity = Date.now(); localStorage.setItem(SESSION_KEY, JSON.stringify(session)); } catch (error) { console.error('Error updating session activity:', error); } } } /** * Handle visibility change events * @returns void */ export function initVisibilityTracking() { document.addEventListener('visibilitychange', () => { const storedSession = localStorage.getItem(SESSION_KEY); if (storedSession) { try { const session = JSON.parse(storedSession); if (document.visibilityState === 'hidden') { // User navigated away, store the timestamp session.lastVisibilityChange = Date.now(); localStorage.setItem(SESSION_KEY, JSON.stringify(session)); } else { // User returned, check if we need a new session const navigationTime = Date.now() - (session.lastVisibilityChange || 0); if (navigationTime >= NAVIGATION_TIMEOUT) { // Create new session if user was away for more than 2 minutes const newSession = { id: generateUuid(), lastActivity: Date.now() }; localStorage.setItem(SESSION_KEY, JSON.stringify(newSession)); } else { // User returned within timeout, update activity delete session.lastVisibilityChange; session.lastActivity = Date.now(); localStorage.setItem(SESSION_KEY, JSON.stringify(session)); } } } catch (error) { console.error('Error handling visibility change:', error); } } }); }