@datataki/client
Version:
A lightweight client-side event tracking library for modern web applications. Track user sessions, page views, interactions and custom events with minimal setup.
1 lines • 2.43 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:!0}),exports.SessionHandler=void 0;let a=require("../app.constants"),s=require("../managers/session.manager");var e=require("../managers/state.manager");let i=require("../types/event.types");class t extends e.StateManager{constructor(s,e){super(),this.sessionManager=null,this.heartbeatInterval=null,this.eventManager=e,this.storageManager=s}startTracking(){this.sessionManager||(this.checkOrphanedSessions(),this.sessionManager=new s.SessionManager(()=>{var s;this.get("sessionId")||(s=this.sessionManager.startSession(),this.set("sessionId",s),this.trackSession(i.EventType.SESSION_START),this.persistSession(s),this.startHeartbeat())},()=>{this.get("sessionId")&&(this.sessionManager.endSession(),this.trackSession(i.EventType.SESSION_END),this.clearPersistedSession(),this.stopHeartbeat(),this.set("sessionId",null))}),this.startInitialSession())}trackSession(s){this.eventManager.track({type:s})}startInitialSession(){var s;this.get("sessionId")||(s=this.sessionManager.startSession(),this.set("sessionId",s),this.trackSession(i.EventType.SESSION_START),this.persistSession(s),this.startHeartbeat())}stopTracking(){this.sessionManager&&(this.get("sessionId")&&(this.sessionManager.endSession(),this.trackSession(i.EventType.SESSION_END),this.clearPersistedSession(),this.stopHeartbeat(),this.set("sessionId",null)),this.sessionManager.destroy(),this.sessionManager=null)}checkOrphanedSessions(){var s=this.storageManager.getItem(a.SESSION_STORAGE_KEY);if(s)try{var e=JSON.parse(s),t=Date.now()-e.lastHeartbeat;(this.get("config")?.sessionTimeout??a.SESSION_TIMEOUT_MS)<t&&(this.trackSession(i.EventType.SESSION_END),this.clearPersistedSession())}catch{this.clearPersistedSession()}}persistSession(s){s={sessionId:s,startTime:Date.now(),lastHeartbeat:Date.now()};this.storageManager.setItem(a.SESSION_STORAGE_KEY,JSON.stringify(s))}clearPersistedSession(){this.storageManager.removeItem(a.SESSION_STORAGE_KEY)}startHeartbeat(){this.stopHeartbeat(),this.heartbeatInterval=setInterval(()=>{var s=this.storageManager.getItem(a.SESSION_STORAGE_KEY);if(s)try{var e=JSON.parse(s);e.lastHeartbeat=Date.now(),this.storageManager.setItem(a.SESSION_STORAGE_KEY,JSON.stringify(e))}catch{this.clearPersistedSession()}},a.SESSION_HEARTBEAT_INTERVAL_MS)}stopHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}}exports.SessionHandler=t;