{"version":3,"file":"cookieAccess.mjs","names":[],"sources":["../../src/browser/cookieAccess.ts"],"sourcesContent":["import { ONE_MINUTE, ONE_SECOND, dateNow } from '@openobserve/js-core/time'\nimport { setInterval, clearInterval } from '../tools/timer'\nimport { Observable } from '../tools/observable'\nimport { mockable } from '../tools/mockable'\nimport { display } from '../tools/display'\nimport { generateUUID } from '../tools/utils/stringUtils'\nimport { addTelemetryDebug } from '../domain/telemetry'\nimport { globalObject } from '../tools/globalObject'\nimport { addEventListener, DOM_EVENT, isEventSupported } from './addEventListener'\nimport { getCookies, setCookie } from './cookie'\nimport type { CookieOptions } from './cookie'\n\nexport interface CookieAccess {\n  getAll(): Promise<string[]>\n  getAllAndSet(cb: (value: string[]) => { value: string; expireDelay: number }): Promise<void>\n  observable: Observable<void>\n}\n\nexport type CookieAccessFactory = (cookieName: string, cookieOptions: CookieOptions) => CookieAccess\n\nexport async function areCookiesAuthorized(\n  createAccess: CookieAccessFactory,\n  cookieOptions: CookieOptions\n): Promise<boolean> {\n  // Use a unique cookie name to avoid issues when the SDK is initialized multiple times during\n  // the test cookie lifetime\n  const testCookieName = `oo_cookie_test_${generateUUID()}`\n  const testCookieValue = 'test'\n  const access = createAccess(testCookieName, cookieOptions)\n  try {\n    await access.getAllAndSet(() => ({ value: testCookieValue, expireDelay: ONE_MINUTE }))\n    const values = await access.getAll()\n    return values.includes(testCookieValue)\n  } catch (error) {\n    display.error(error)\n    return false\n  } finally {\n    try {\n      await access.getAllAndSet(() => ({ value: '', expireDelay: 0 }))\n    } catch {\n      // Best-effort cleanup\n    }\n  }\n}\n\nexport function createCookieStoreAccess(cookieName: string, cookieOptions: CookieOptions): CookieAccess {\n  const cookieStore = mockable(globalObject.cookieStore)!\n  const observable = new Observable<void>(() => {\n    const listener = addEventListener(cookieStore, DOM_EVENT.CHANGE, (event) => {\n      // Based on our experimentation, we're assuming that entries for the same cookie cannot be in both the 'changed' and 'deleted' arrays.\n      // However, due to ambiguity in the specification, we asked for clarification: https://github.com/WICG/cookie-store/issues/226\n      const changeEvent =\n        event.changed.some((event) => event.name === cookieName) ||\n        event.deleted.some((event) => event.name === cookieName)\n      if (changeEvent) {\n        observable.notify()\n      }\n    })\n    return listener.stop\n  })\n\n  return {\n    async getAll() {\n      const items = await cookieStore.getAll(cookieName)\n      return items.map((item) => item.value)\n    },\n\n    async getAllAndSet(cb: (value: string[]) => { value: string; expireDelay: number }) {\n      const items = await cookieStore.getAll(cookieName)\n\n      const currentValues = items.map((item) => item.value)\n      const { value, expireDelay } = cb(currentValues)\n\n      try {\n        await cookieStore.set({\n          name: cookieName,\n          value,\n          expires: dateNow() + expireDelay,\n          path: '/',\n          sameSite: cookieOptions.crossSite ? 'none' : 'strict',\n          domain: cookieOptions.domain,\n          secure: cookieOptions.secure,\n          partitioned: cookieOptions.partitioned,\n        })\n      } catch (error) {\n        const documentCookies = getCookies(cookieName)\n        // monitor-until: 2026-07-01\n        addTelemetryDebug('Failed to set cookie using Cookie Store API', {\n          'error.message': (error as Error).message,\n          newValue: value,\n          cookieOptions: {\n            ...cookieOptions,\n          },\n          cookies: items.map((item) => ({\n            ...item,\n          })),\n          cookieCount: items.length,\n          documentCookies,\n        })\n      }\n    },\n\n    observable,\n  }\n}\n\nexport const WATCH_COOKIE_INTERVAL_DELAY = ONE_SECOND\nexport function createDocumentCookieAccess(cookieName: string, cookieOptions: CookieOptions): CookieAccess {\n  let previousCookieValues = getCookies(cookieName)\n\n  const observable = new Observable<void>(() => {\n    const watchCookieIntervalId = setInterval(() => {\n      const cookieValues = getCookies(cookieName)\n      notifyCookieValueIfChanged(cookieValues)\n    }, WATCH_COOKIE_INTERVAL_DELAY)\n\n    return () => {\n      clearInterval(watchCookieIntervalId)\n    }\n  })\n\n  function notifyCookieValueIfChanged(cookieValues: string[]) {\n    if (String(cookieValues) !== String(previousCookieValues)) {\n      previousCookieValues = cookieValues\n      observable.notify()\n    }\n  }\n\n  return {\n    getAll() {\n      return Promise.resolve(getCookies(cookieName))\n    },\n\n    async getAllAndSet(cb: (value: string[]) => { value: string; expireDelay: number }) {\n      const currentValue = getCookies(cookieName)\n      const { value, expireDelay } = cb(currentValue)\n      setCookie(cookieName, value, expireDelay, cookieOptions)\n      await Promise.resolve()\n      notifyCookieValueIfChanged([value])\n    },\n\n    observable,\n  }\n}\n\n// Salesforce LWS does not support the change event of CookieStore objects. https://developer.salesforce.com/tools/lws-distortion-viewer\nexport function isCookieStoreSupported(): boolean {\n  const cookieStore = mockable(globalObject.cookieStore)\n  return Boolean(cookieStore && isEventSupported(cookieStore, DOM_EVENT.CHANGE))\n}\n"],"mappings":";;;;;;;;;;;AAoBA,eAAsB,qBACpB,cACA,eACkB;CAGlB,MAAM,iBAAiB,kBAAkB,aAAa;CACtD,MAAM,kBAAkB;CACxB,MAAM,SAAS,aAAa,gBAAgB,aAAa;CACzD,IAAI;EACF,MAAM,OAAO,oBAAoB;GAAE,OAAO;GAAiB,aAAa;EAAW,EAAE;EAErF,QAAO,MADc,OAAO,OAAO,EAAA,CACrB,SAAS,eAAe;CACxC,SAAS,OAAO;EACd,QAAQ,MAAM,KAAK;EACnB,OAAO;CACT,UAAU;EACR,IAAI;GACF,MAAM,OAAO,oBAAoB;IAAE,OAAO;IAAI,aAAa;GAAE,EAAE;EACjE,QAAQ,CAER;CACF;AACF;AAEA,SAAgB,wBAAwB,YAAoB,eAA4C;CACtG,MAAM,cAAc,SAAS,aAAa,WAAW;CACrD,MAAM,aAAa,IAAI,iBAAuB;EAW5C,OAViB,iBAAiB,aAAA,WAAgC,UAAU;GAM1E,IAFE,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,UAAU,KACvD,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,UAAU,GAEvD,WAAW,OAAO;EAEtB,CACc,CAAC,CAAC;CAClB,CAAC;CAED,OAAO;EACL,MAAM,SAAS;GAEb,QAAO,MADa,YAAY,OAAO,UAAU,EAAA,CACpC,KAAK,SAAS,KAAK,KAAK;EACvC;EAEA,MAAM,aAAa,IAAiE;GAClF,MAAM,QAAQ,MAAM,YAAY,OAAO,UAAU;GAGjD,MAAM,EAAE,OAAO,gBAAgB,GADT,MAAM,KAAK,SAAS,KAAK,KACD,CAAC;GAE/C,IAAI;IACF,MAAM,YAAY,IAAI;KACpB,MAAM;KACN;KACA,SAAS,QAAQ,IAAI;KACrB,MAAM;KACN,UAAU,cAAc,YAAY,SAAS;KAC7C,QAAQ,cAAc;KACtB,QAAQ,cAAc;KACtB,aAAa,cAAc;IAC7B,CAAC;GACH,SAAS,OAAO;IACd,MAAM,kBAAkB,WAAW,UAAU;IAE7C,kBAAkB,+CAA+C;KAC/D,iBAAkB,MAAgB;KAClC,UAAU;KACV,eAAe,EACb,GAAG,cACL;KACA,SAAS,MAAM,KAAK,UAAU,EAC5B,GAAG,KACL,EAAE;KACF,aAAa,MAAM;KACnB;IACF,CAAC;GACH;EACF;EAEA;CACF;AACF;AAEA,MAAa,8BAA8B;AAC3C,SAAgB,2BAA2B,YAAoB,eAA4C;CACzG,IAAI,uBAAuB,WAAW,UAAU;CAEhD,MAAM,aAAa,IAAI,iBAAuB;EAC5C,MAAM,wBAAwB,kBAAkB;GAE9C,2BADqB,WAAW,UACM,CAAC;EACzC,GAAG,2BAA2B;EAE9B,aAAa;GACX,cAAc,qBAAqB;EACrC;CACF,CAAC;CAED,SAAS,2BAA2B,cAAwB;EAC1D,IAAI,OAAO,YAAY,MAAM,OAAO,oBAAoB,GAAG;GACzD,uBAAuB;GACvB,WAAW,OAAO;EACpB;CACF;CAEA,OAAO;EACL,SAAS;GACP,OAAO,QAAQ,QAAQ,WAAW,UAAU,CAAC;EAC/C;EAEA,MAAM,aAAa,IAAiE;GAElF,MAAM,EAAE,OAAO,gBAAgB,GADV,WAAW,UACa,CAAC;GAC9C,UAAU,YAAY,OAAO,aAAa,aAAa;GACvD,MAAM,QAAQ,QAAQ;GACtB,2BAA2B,CAAC,KAAK,CAAC;EACpC;EAEA;CACF;AACF;AAGA,SAAgB,yBAAkC;CAChD,MAAM,cAAc,SAAS,aAAa,WAAW;CACrD,OAAO,QAAQ,eAAe,iBAAiB,aAAA,QAA6B,CAAC;AAC/E"}