overcentric
Version:
A lightweight, privacy-focused toolkit for modern SaaS web applications
94 lines (93 loc) • 3.67 kB
JavaScript
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);
}
}
});
}