{"version":3,"file":"sessionState.mjs","names":[],"sources":["../../../src/domain/session/sessionState.ts"],"sourcesContent":["import { dateNow } from '@openobserve/js-core/time'\nimport type { TimeStamp } from '@openobserve/js-core/time'\nimport { isEmptyObject } from '../../tools/utils/objectUtils'\nimport { objectEntries } from '../../tools/utils/polyfills'\nimport { generateUUID } from '../../tools/utils/stringUtils'\nimport type { Configuration } from '../configuration'\nimport { SESSION_EXPIRATION_DELAY, SESSION_TIME_OUT_DELAY } from './sessionConstants'\nimport { isValidSessionString, SESSION_ENTRY_REGEXP, SESSION_ENTRY_SEPARATOR } from './sessionStateValidation'\nexport const EXPIRED = '1'\n\nexport interface SessionState {\n  id?: string\n  created?: string\n  expire?: string\n  isExpired?: typeof EXPIRED\n  anonymousId?: string\n\n  [key: string]: string | undefined\n}\n\nexport function getCreatedDate(state: SessionState): TimeStamp | undefined {\n  return state.created ? (Number(state.created) as TimeStamp) : undefined\n}\n\nexport function getExpireDate(state: SessionState): TimeStamp | undefined {\n  const expireDate = state.expire && (Number(state.expire) as TimeStamp)\n  const createdDate = getCreatedDate(state)\n  if (expireDate && createdDate) {\n    return Math.min(expireDate, createdDate + SESSION_TIME_OUT_DELAY) as TimeStamp\n  }\n}\n\nexport function getExpiredSessionState(\n  previousSessionState: { anonymousId?: string } | undefined,\n  configuration: Configuration\n): SessionState {\n  const expiredSessionState: SessionState = {\n    isExpired: EXPIRED,\n  }\n  if (configuration.trackAnonymousUser && previousSessionState?.anonymousId) {\n    expiredSessionState.anonymousId = previousSessionState?.anonymousId\n  }\n\n  return expiredSessionState\n}\n\nexport function isSessionInNotStartedState(session: SessionState) {\n  return isEmptyObject(session)\n}\n\nexport function isSessionStarted(session: SessionState) {\n  return !isSessionInNotStartedState(session)\n}\n\nexport function isSessionInExpiredState(session: SessionState) {\n  return session.isExpired !== undefined || !isActiveSession(session)\n}\n\n// An active session is a session in either `Tracked` or `NotTracked` state\nfunction isActiveSession(sessionState: SessionState) {\n  const expireDate = getExpireDate(sessionState)\n  return expireDate ? dateNow() < expireDate : false\n}\n\nexport function expandSessionState(session: SessionState) {\n  session.expire = String(dateNow() + SESSION_EXPIRATION_DELAY)\n}\n\nexport function toSessionString(session: SessionState) {\n  return (\n    objectEntries(session)\n      // we use `aid` as a key for anonymousId\n      .map(([key, value]) => (key === 'anonymousId' ? `aid=${value}` : `${key}=${value}`))\n      .join(SESSION_ENTRY_SEPARATOR)\n  )\n}\n\nexport function toSessionState(sessionString: string | undefined | null) {\n  const session: SessionState = {}\n  if (isValidSessionString(sessionString)) {\n    sessionString.split(SESSION_ENTRY_SEPARATOR).forEach((entry) => {\n      const matches = SESSION_ENTRY_REGEXP.exec(entry)\n      if (matches !== null) {\n        const [, key, value] = matches\n        if (key === 'aid') {\n          // we use `aid` as a key for anonymousId\n          session.anonymousId = value\n        } else {\n          session[key] = value\n        }\n      }\n    })\n  }\n  return session\n}\n\nexport function initializeSession(state: SessionState, configuration: Configuration): SessionState {\n  if (isSessionInNotStartedState(state)) {\n    if (configuration.trackAnonymousUser) {\n      state.anonymousId = generateUUID()\n    }\n    return getExpiredSessionState(state, configuration)\n  }\n  return state\n}\n\nexport function expandOrRenew(state: SessionState, configuration: Configuration): SessionState {\n  // prevent renewing if state is altered by a 3rd party (e.g. adblocker deleting the cookie)\n  if (isSessionInNotStartedState(state)) {\n    return state\n  }\n\n  let newState = state\n\n  if (isSessionInExpiredState(state)) {\n    newState = getExpiredSessionState(state, configuration)\n  }\n\n  if (!newState.id) {\n    newState.id = generateUUID()\n    newState.created = String(dateNow())\n  }\n  if (configuration.trackAnonymousUser && !newState.anonymousId) {\n    newState.anonymousId = generateUUID()\n  }\n\n  delete newState.isExpired\n  expandSessionState(newState)\n\n  return newState\n}\n\nexport function expandOnly(state: SessionState): SessionState {\n  if (isSessionInExpiredState(state) || isSessionInNotStartedState(state) || !state.id) {\n    return state\n  }\n  expandSessionState(state)\n  return state\n}\n"],"mappings":";;;;;;AAoBA,SAAgB,eAAe,OAA4C;CACzE,OAAO,MAAM,UAAW,OAAO,MAAM,OAAO,IAAkB,KAAA;AAChE;AAEA,SAAgB,cAAc,OAA4C;CACxE,MAAM,aAAa,MAAM,UAAW,OAAO,MAAM,MAAM;CACvD,MAAM,cAAc,eAAe,KAAK;CACxC,IAAI,cAAc,aAChB,OAAO,KAAK,IAAI,YAAY,cAAc,sBAAsB;AAEpE;AAEA,SAAgB,uBACd,sBACA,eACc;CACd,MAAM,sBAAoC,EACxC,WAAA,IACF;CACA,IAAI,cAAc,sBAAsB,sBAAsB,aAC5D,oBAAoB,cAAc,sBAAsB;CAG1D,OAAO;AACT;AAEA,SAAgB,2BAA2B,SAAuB;CAChE,OAAO,cAAc,OAAO;AAC9B;AAMA,SAAgB,wBAAwB,SAAuB;CAC7D,OAAO,QAAQ,cAAc,KAAA,KAAa,CAAC,gBAAgB,OAAO;AACpE;AAGA,SAAS,gBAAgB,cAA4B;CACnD,MAAM,aAAa,cAAc,YAAY;CAC7C,OAAO,aAAa,QAAQ,IAAI,aAAa;AAC/C;AAEA,SAAgB,mBAAmB,SAAuB;CACxD,QAAQ,SAAS,OAAO,QAAQ,IAAI,wBAAwB;AAC9D;AAEA,SAAgB,gBAAgB,SAAuB;CACrD,OACE,cAAc,OAAO,CAAC,CAEnB,KAAK,CAAC,KAAK,WAAY,QAAQ,gBAAgB,OAAO,UAAU,GAAG,IAAI,GAAG,OAAQ,CAAC,CACnF,KAAA,GAA4B;AAEnC;AAEA,SAAgB,eAAe,eAA0C;CACvE,MAAM,UAAwB,CAAC;CAC/B,IAAI,qBAAqB,aAAa,GACpC,cAAc,MAAA,GAA6B,CAAC,CAAC,SAAS,UAAU;EAC9D,MAAM,UAAU,qBAAqB,KAAK,KAAK;EAC/C,IAAI,YAAY,MAAM;GACpB,MAAM,GAAG,KAAK,SAAS;GACvB,IAAI,QAAQ,OAEV,QAAQ,cAAc;QAEtB,QAAQ,OAAO;EAEnB;CACF,CAAC;CAEH,OAAO;AACT;AAEA,SAAgB,kBAAkB,OAAqB,eAA4C;CACjG,IAAI,2BAA2B,KAAK,GAAG;EACrC,IAAI,cAAc,oBAChB,MAAM,cAAc,aAAa;EAEnC,OAAO,uBAAuB,OAAO,aAAa;CACpD;CACA,OAAO;AACT;AAEA,SAAgB,cAAc,OAAqB,eAA4C;CAE7F,IAAI,2BAA2B,KAAK,GAClC,OAAO;CAGT,IAAI,WAAW;CAEf,IAAI,wBAAwB,KAAK,GAC/B,WAAW,uBAAuB,OAAO,aAAa;CAGxD,IAAI,CAAC,SAAS,IAAI;EAChB,SAAS,KAAK,aAAa;EAC3B,SAAS,UAAU,OAAO,QAAQ,CAAC;CACrC;CACA,IAAI,cAAc,sBAAsB,CAAC,SAAS,aAChD,SAAS,cAAc,aAAa;CAGtC,OAAO,SAAS;CAChB,mBAAmB,QAAQ;CAE3B,OAAO;AACT;AAEA,SAAgB,WAAW,OAAmC;CAC5D,IAAI,wBAAwB,KAAK,KAAK,2BAA2B,KAAK,KAAK,CAAC,MAAM,IAChF,OAAO;CAET,mBAAmB,KAAK;CACxB,OAAO;AACT"}