UNPKG

@adstage/web-sdk

Version:

AdStage Web SDK - Production-ready marketing platform SDK with React Provider support for seamless integration

184 lines (154 loc) 4.65 kB
/** * AdStage SDK - 이벤트용 세션 관리자 * 세션 ID 생성 및 사용자 ID 관리 */ import { DOMUtils } from '../../utils/dom-utils'; export class EventSessionManager { private static _userId?: string; private static _sessionStartTime?: number; /** * 세션 ID 생성 및 반환 (SSR 안전) */ static getSessionId(): string { if (!DOMUtils.isBrowser()) { return 'ssr_session_' + Date.now(); } const stored = sessionStorage.getItem('adstage_session_id'); if (stored) { return stored; } const sessionId = 'session_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now(); sessionStorage.setItem('adstage_session_id', sessionId); // 세션 시작 시간 기록 if (!EventSessionManager._sessionStartTime) { EventSessionManager._sessionStartTime = Date.now(); if (DOMUtils.isBrowser()) { sessionStorage.setItem('adstage_session_start', String(EventSessionManager._sessionStartTime)); } } return sessionId; } /** * 사용자 ID 설정 */ static setUserId(userId: string): void { EventSessionManager._userId = userId; if (DOMUtils.isBrowser()) { localStorage.setItem('adstage_user_id', userId); } } /** * 현재 사용자 ID 반환 */ static getUserId(): string | undefined { // 메모리에 있는 값 우선 반환 if (EventSessionManager._userId) { return EventSessionManager._userId; } // 로컬 스토리지에서 복원 if (DOMUtils.isBrowser()) { const stored = localStorage.getItem('adstage_user_id'); if (stored) { EventSessionManager._userId = stored; return stored; } } return undefined; } /** * 사용자 ID 제거 */ static clearUserId(): void { EventSessionManager._userId = undefined; if (DOMUtils.isBrowser()) { localStorage.removeItem('adstage_user_id'); } } /** * 세션 정보 전체 반환 */ static getSessionInfo(): { sessionId: string; userId?: string; sessionDuration?: number; isNewSession: boolean; } { const sessionId = EventSessionManager.getSessionId(); const userId = EventSessionManager.getUserId(); const isNewSession = EventSessionManager.isNewSession(); const sessionDuration = EventSessionManager.getSessionDuration(); return { sessionId, userId, sessionDuration, isNewSession }; } /** * 새 세션인지 확인 */ static isNewSession(): boolean { if (!DOMUtils.isBrowser()) return true; const sessionId = sessionStorage.getItem('adstage_session_id'); const sessionStart = sessionStorage.getItem('adstage_session_start'); return !sessionId || !sessionStart; } /** * 세션 지속 시간 반환 (ms) */ static getSessionDuration(): number { if (!DOMUtils.isBrowser()) return 0; const sessionStart = sessionStorage.getItem('adstage_session_start'); if (!sessionStart) return 0; return Date.now() - parseInt(sessionStart, 10); } /** * 세션 새로고침 (새로운 세션 ID 생성) */ static refreshSession(): string { if (DOMUtils.isBrowser()) { sessionStorage.removeItem('adstage_session_id'); sessionStorage.removeItem('adstage_session_start'); } EventSessionManager._sessionStartTime = undefined; return EventSessionManager.getSessionId(); } /** * 세션 만료 확인 (24시간 기준) */ static isSessionExpired(maxDurationHours: number = 24): boolean { const duration = EventSessionManager.getSessionDuration(); const maxDuration = maxDurationHours * 60 * 60 * 1000; // ms 변환 return duration > maxDuration; } /** * 세션 통계 반환 (디버깅용) */ static getSessionStats(): { sessionId: string; userId?: string; startTime?: number; duration: number; isExpired: boolean; isNewSession: boolean; } { const sessionId = EventSessionManager.getSessionId(); const userId = EventSessionManager.getUserId(); const duration = EventSessionManager.getSessionDuration(); const isExpired = EventSessionManager.isSessionExpired(); const isNewSession = EventSessionManager.isNewSession(); let startTime: number | undefined; if (DOMUtils.isBrowser()) { const stored = sessionStorage.getItem('adstage_session_start'); startTime = stored ? parseInt(stored, 10) : undefined; } return { sessionId, userId, startTime, duration, isExpired, isNewSession }; } }