@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
text/typescript
/**
* 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
};
}
}