{"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport const SESSION_TIMEOUT = 30 * 60 * 1000;\n\nclass Session {\n  private id: string;\n  private startTime: number;\n  private lastActiveTime: number;\n  private accumulatedTime: number;\n\n  private active: boolean;\n  private visible: boolean;\n  private focused: boolean;\n\n  constructor() {\n    this.id = uuidv7();\n    this.startTime = Date.now();\n    this.lastActiveTime = Date.now();\n    this.accumulatedTime = 0;\n\n    this.active = true;\n    this.visible = typeof document !== 'undefined' ? document.visibilityState === 'visible' : true;\n    this.focused = typeof document !== 'undefined' ? document.hasFocus() : true;\n  }\n\n  getId = () => this.id;\n\n  isActive = () => this.active;\n  isVisible = () => this.visible;\n  isFocused = () => this.focused;\n  isExpired = () => Date.now() - this.lastActiveTime > SESSION_TIMEOUT;\n\n  updateLastActiveTime = () => {\n    this.lastActiveTime = Date.now();\n  };\n\n  updateActive = (active: boolean) => {\n    this.active = active;\n  };\n\n  refresh = () => {\n    this.id = uuidv7();\n    this.lastActiveTime = Date.now();\n  };\n\n  updateAccumulator = () => {\n    const now = Date.now();\n    if (this.focused && this.visible && this.active) {\n      const delta = now - this.startTime;\n      if (delta > 0 && delta < SESSION_TIMEOUT) {\n        this.accumulatedTime += delta;\n      }\n    }\n    this.startTime = now;\n  };\n\n  focus = () => {\n    this.updateAccumulator();\n    this.updateLastActiveTime();\n    this.focused = true;\n  };\n\n  blur = () => {\n    this.updateAccumulator();\n    this.focused = false;\n  };\n\n  pageshow = () => {\n    this.updateAccumulator();\n    this.updateLastActiveTime();\n    this.active = true;\n  };\n\n  pagehide = () => {\n    this.updateAccumulator();\n    this.active = false;\n  };\n\n  visibilitychange = (state: DocumentVisibilityState) => {\n    this.updateAccumulator();\n    if (state === 'visible') {\n      this.updateLastActiveTime();\n    }\n    this.visible = state === 'visible';\n  };\n\n  flush = () => {\n    this.updateAccumulator();\n    const engagementTime = this.accumulatedTime;\n    this.accumulatedTime = 0;\n    return engagementTime;\n  };\n}\n\nexport const session = new Session();\n"],"mappings":";AAAA,SAAS,MAAM,cAAc;AAEtB,IAAM,kBAAkB,KAAK,KAAK;AAEzC,IAAM,UAAN,MAAc;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,KAAK,OAAO;AACjB,SAAK,YAAY,KAAK,IAAI;AAC1B,SAAK,iBAAiB,KAAK,IAAI;AAC/B,SAAK,kBAAkB;AAEvB,SAAK,SAAS;AACd,SAAK,UAAU,OAAO,aAAa,cAAc,SAAS,oBAAoB,YAAY;AAC1F,SAAK,UAAU,OAAO,aAAa,cAAc,SAAS,SAAS,IAAI;AAAA,EACzE;AAAA,EAEA,QAAQ,MAAM,KAAK;AAAA,EAEnB,WAAW,MAAM,KAAK;AAAA,EACtB,YAAY,MAAM,KAAK;AAAA,EACvB,YAAY,MAAM,KAAK;AAAA,EACvB,YAAY,MAAM,KAAK,IAAI,IAAI,KAAK,iBAAiB;AAAA,EAErD,uBAAuB,MAAM;AAC3B,SAAK,iBAAiB,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,eAAe,CAAC,WAAoB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAU,MAAM;AACd,SAAK,KAAK,OAAO;AACjB,SAAK,iBAAiB,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,oBAAoB,MAAM;AACxB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,KAAK,WAAW,KAAK,WAAW,KAAK,QAAQ;AAC/C,YAAM,QAAQ,MAAM,KAAK;AACzB,UAAI,QAAQ,KAAK,QAAQ,iBAAiB;AACxC,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,QAAQ,MAAM;AACZ,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO,MAAM;AACX,SAAK,kBAAkB;AACvB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAW,MAAM;AACf,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW,MAAM;AACf,SAAK,kBAAkB;AACvB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,mBAAmB,CAAC,UAAmC;AACrD,SAAK,kBAAkB;AACvB,QAAI,UAAU,WAAW;AACvB,WAAK,qBAAqB;AAAA,IAC5B;AACA,SAAK,UAAU,UAAU;AAAA,EAC3B;AAAA,EAEA,QAAQ,MAAM;AACZ,SAAK,kBAAkB;AACvB,UAAM,iBAAiB,KAAK;AAC5B,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACT;AACF;AAEO,IAAM,UAAU,IAAI,QAAQ;","names":[]}