@d8a-tech/wt 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/dist/browser_entry.d.ts +1 -0
  4. package/dist/cookies/consent.d.ts +4 -0
  5. package/dist/cookies/cookie_jar.d.ts +48 -0
  6. package/dist/cookies/cookie_settings.d.ts +23 -0
  7. package/dist/cookies/d8a_cookies.d.ts +71 -0
  8. package/dist/cookies/identity.d.ts +89 -0
  9. package/dist/cookies/session_manager.d.ts +36 -0
  10. package/dist/ga4/consent_wire.d.ts +38 -0
  11. package/dist/ga4/gtag_mapper.d.ts +46 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.min.mjs +3 -0
  14. package/dist/index.min.mjs.map +7 -0
  15. package/dist/install.d.ts +23 -0
  16. package/dist/runtime/anon_cid.d.ts +13 -0
  17. package/dist/runtime/browser_context.d.ts +2 -0
  18. package/dist/runtime/config_resolver.d.ts +4 -0
  19. package/dist/runtime/consent_resolver.d.ts +7 -0
  20. package/dist/runtime/consent_update_ping.d.ts +10 -0
  21. package/dist/runtime/d8a_global.d.ts +11 -0
  22. package/dist/runtime/debug_logger.d.ts +6 -0
  23. package/dist/runtime/dispatcher.d.ts +18 -0
  24. package/dist/runtime/engagement_timer.d.ts +21 -0
  25. package/dist/runtime/enhanced_measurement.d.ts +14 -0
  26. package/dist/runtime/gtag_consent_bridge.d.ts +9 -0
  27. package/dist/runtime/linker.d.ts +53 -0
  28. package/dist/runtime/param_precedence.d.ts +27 -0
  29. package/dist/runtime/queue_consumer.d.ts +12 -0
  30. package/dist/runtime/runtime_names.d.ts +12 -0
  31. package/dist/runtime/state.d.ts +2 -0
  32. package/dist/runtime/uach.d.ts +31 -0
  33. package/dist/transport/send.d.ts +20 -0
  34. package/dist/types.d.ts +144 -0
  35. package/dist/utils/endpoint.d.ts +14 -0
  36. package/dist/utils/gtag_primitives.d.ts +8 -0
  37. package/dist/utils/is_record.d.ts +1 -0
  38. package/dist/utils/window_slots.d.ts +4 -0
  39. package/dist/web-tracker.min.js +3 -0
  40. package/dist/web-tracker.min.js.map +7 -0
  41. package/dist/wt.min.js +3 -0
  42. package/dist/wt.min.js.map +7 -0
  43. package/index.d.ts +167 -0
  44. package/package.json +62 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/window_slots.ts", "../src/runtime/d8a_global.ts", "../src/runtime/state.ts", "../src/runtime/consent_resolver.ts", "../src/runtime/consent_update_ping.ts", "../src/utils/is_record.ts", "../src/runtime/queue_consumer.ts", "../src/cookies/d8a_cookies.ts", "../src/utils/gtag_primitives.ts", "../src/cookies/cookie_jar.ts", "../src/ga4/gtag_mapper.ts", "../src/utils/endpoint.ts", "../src/runtime/browser_context.ts", "../src/transport/send.ts", "../src/cookies/consent.ts", "../src/cookies/identity.ts", "../src/runtime/uach.ts", "../src/ga4/consent_wire.ts", "../src/runtime/anon_cid.ts", "../src/runtime/engagement_timer.ts", "../src/runtime/config_resolver.ts", "../src/runtime/debug_logger.ts", "../src/runtime/param_precedence.ts", "../src/cookies/cookie_settings.ts", "../src/cookies/session_manager.ts", "../src/runtime/dispatcher.ts", "../src/runtime/runtime_names.ts", "../src/runtime/gtag_consent_bridge.ts", "../src/runtime/enhanced_measurement.ts", "../src/runtime/linker.ts", "../src/install.ts", "../src/browser_entry.ts"],
4
+ "sourcesContent": ["import type { WindowLike } from \"../types.ts\";\n\ntype WindowSlotContainer = WindowLike & Record<string, unknown>;\n\nfunction windowDict(w: WindowLike): WindowSlotContainer {\n // WindowLike intentionally does NOT have an index signature because we want it to remain\n // assignable from the real `window` object. Keep the string-key indexing isolated here.\n return w as WindowSlotContainer;\n}\n\nexport function getWindowSlot<T = unknown>(w: WindowLike, key: string): T | undefined {\n return windowDict(w)[key] as T | undefined;\n}\n\nexport function setWindowSlot<T = unknown>(w: WindowLike, key: string, value: T) {\n windowDict(w)[key] = value;\n}\n\nexport function ensureArraySlot<T = unknown>(w: WindowLike, key: string): T[] {\n const v = getWindowSlot<unknown>(w, key);\n if (Array.isArray(v)) return v;\n const arr: T[] = [];\n setWindowSlot<T[]>(w, key, arr);\n return arr;\n}\n", "/**\n * Creates a `d8a(...)` function compatible with the snippet API.\n *\n * Required behavior:\n * - `d8a('event', ...)` behaves the same as `d8a.event(...)` etc.\n * - The function form pushes to `dataLayer`.\n */\nimport { ensureArraySlot } from \"../utils/window_slots.ts\";\n\nexport function createD8aGlobal({\n windowRef,\n dataLayerName = \"d8aLayer\",\n}: {\n windowRef: import(\"../types.ts\").WindowLike;\n dataLayerName?: string;\n}) {\n const w = windowRef;\n if (!w) throw new Error(\"createD8aGlobal: windowRef is required\");\n\n function d8a(..._args: unknown[]) {\n // We intentionally ignore `_args` and push the raw `arguments` object (snippet compatibility).\n void _args;\n // Match the snippet: push the raw arguments so a loader can interpret them.\n const dl = dataLayerName;\n const arr = ensureArraySlot<unknown>(w, dl);\n arr.push(arguments);\n }\n\n // Method aliases (same behavior as commands).\n d8a.js = (date: unknown) => d8a(\"js\", date);\n d8a.config = (propertyId: unknown, params: unknown) => d8a(\"config\", propertyId, params);\n d8a.event = (eventName: unknown, params: unknown) => d8a(\"event\", eventName, params);\n d8a.set = (a: unknown, b?: unknown) => (b === undefined ? d8a(\"set\", a) : d8a(\"set\", a, b));\n d8a.consent = (action: unknown, state: unknown) => d8a(\"consent\", action, state);\n\n return d8a;\n}\n", "import type { RuntimeState } from \"../types.ts\";\n\nexport function createRuntimeState(): RuntimeState {\n const state: RuntimeState = {\n jsDate: null,\n pageLoadMs: null, // maps to GA `_p`\n // Multi-property support:\n // - propertyIds preserves insertion order for default fan-out routing\n // - propertyConfigs holds per-property config objects as passed to `config()`\n // - primaryPropertyId is the first configured property\n propertyIds: [],\n propertyConfigs: {},\n primaryPropertyId: \"\",\n consent: {}, // effective consent state (default + update merged)\n consentDefault: {},\n consentUpdate: {},\n\n // If gtag/GTM is present and pushes consent commands into `window.dataLayer`,\n // we mirror those here and prefer them over d8a's own consent commands.\n consentGtag: {},\n consentDefaultGtag: {},\n consentUpdateGtag: {},\n\n userId: null,\n set: {},\n linker: { domains: [] },\n incomingDl: null,\n events: [],\n __onEvent: null,\n __onConfig: null,\n __onSet: null,\n\n // Request-scoped counters/timing\n hitCounter: 0, // maps to `_s`\n // `_et` is computed from an engagement timer (not wall-clock delta),\n // but we still keep session-level engagement accumulation to flip `g` in session context cookie.\n sessionEngagementMs: 0,\n sessionEngaged: false,\n\n // Cookieless (analytics_storage denied) ephemeral identity.\n // We keep this in-memory for the lifetime of the page so SPAs can have a\n // stable identifier without reading/writing cookies.\n anonCid: null,\n\n // Tracks the last applied cookie attribute signature so we can apply\n // security-related cookie attribute changes even when cookie_update=false.\n // Note: when cookie_update=false we do not refresh/update cookie values; only attributes may be rewritten.\n cookieAttrsSig: null,\n\n // Multi-property shared session state:\n // We compute session tokens once per event and write the same serialized\n // value to each destination property cookie.\n sharedSessionTokens: null,\n sharedSessionValue: null,\n\n // Enhanced measurement\n emInstalled: false,\n emSiteSearchFired: false,\n\n // Consent transition tracking (for best-effort consent-update pings).\n // We track the *effective* Consent Mode value (preferring mirrored gtag consent if present).\n __lastEffectiveAnalyticsStorage: undefined,\n };\n return state;\n}\n", "import type { ConsentState, RuntimeState } from \"../types.ts\";\n\nexport function getEffectiveConsent(getState: () => RuntimeState): ConsentState {\n const s = typeof getState === \"function\" ? getState() : null;\n const g = s?.consentGtag && typeof s.consentGtag === \"object\" ? s.consentGtag : {};\n if (g && Object.keys(g).length > 0) return g;\n return s?.consent && typeof s.consent === \"object\" ? s.consent : {};\n}\n\nexport function getConsentParts(getState: () => RuntimeState): {\n consent: ConsentState;\n consentDefault: ConsentState;\n consentUpdate: ConsentState;\n} {\n const s = typeof getState === \"function\" ? getState() : null;\n const gConsent = s?.consentGtag && typeof s.consentGtag === \"object\" ? s.consentGtag : {};\n const gDefault =\n s?.consentDefaultGtag && typeof s.consentDefaultGtag === \"object\" ? s.consentDefaultGtag : {};\n const gUpdate =\n s?.consentUpdateGtag && typeof s.consentUpdateGtag === \"object\" ? s.consentUpdateGtag : {};\n const hasGtag =\n (gConsent && Object.keys(gConsent).length > 0) ||\n (gDefault && Object.keys(gDefault).length > 0) ||\n (gUpdate && Object.keys(gUpdate).length > 0);\n\n if (hasGtag) {\n return { consent: gConsent, consentDefault: gDefault, consentUpdate: gUpdate };\n }\n\n return {\n consent: s?.consent && typeof s.consent === \"object\" ? s.consent : {},\n consentDefault:\n s?.consentDefault && typeof s.consentDefault === \"object\" ? s.consentDefault : {},\n consentUpdate: s?.consentUpdate && typeof s.consentUpdate === \"object\" ? s.consentUpdate : {},\n };\n}\n", "import { getEffectiveConsent } from \"./consent_resolver.ts\";\nimport type { RuntimeState } from \"../types.ts\";\n\nfunction scheduleMicrotask(fn: () => void) {\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(fn);\n return;\n }\n // Fallback (older environments)\n Promise.resolve().then(fn);\n}\n\n/**\n * Tracks effective `analytics_storage` and emits a best-effort ping when it changes.\n *\n * Behavior:\n * - Only fires if at least one property is configured.\n * - Emits `user_engagement` with `consent_update=1` as an event param.\n * - Uses effective consent (prefers mirrored gtag/GTM consent if present).\n */\nexport function maybeEmitConsentUpdatePing(getState: () => RuntimeState) {\n const s = typeof getState === \"function\" ? getState() : null;\n if (!s) return;\n\n const consent = getEffectiveConsent(getState);\n const next =\n consent && typeof consent.analytics_storage === \"string\"\n ? consent.analytics_storage\n : undefined;\n\n const prev = s.__lastEffectiveAnalyticsStorage;\n // First observation initializes consent state; no ping.\n // We also start a one-tick \"init window\" so immediate default->update (same tick)\n // is treated as initial consent setup rather than a user-visible consent change.\n if (prev === undefined) {\n s.__lastEffectiveAnalyticsStorage = next;\n if (!s.__consentPingInitScheduled) {\n s.__consentPingInitScheduled = true;\n scheduleMicrotask(() => {\n s.__consentPingInitDone = true;\n });\n }\n return;\n }\n\n if (next === prev) return;\n s.__lastEffectiveAnalyticsStorage = next;\n\n // Suppress pings during the initialization tick (matches gtag behavior for\n // immediate default+update sequences during boot).\n if (!s.__consentPingInitDone) return;\n\n // Drop before config: no destinations exist yet.\n if (!Array.isArray(s.propertyIds) || s.propertyIds.length === 0) return;\n if (typeof s.__onEvent !== \"function\") return;\n\n s.__onEvent(\"user_engagement\", { consent_update: 1 });\n}\n", "export function isRecord(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === \"object\" && !Array.isArray(v);\n}\n", "import { createRuntimeState } from \"./state.ts\";\nimport { maybeEmitConsentUpdatePing } from \"./consent_update_ping.ts\";\nimport { isRecord } from \"../utils/is_record.ts\";\nimport { ensureArraySlot, getWindowSlot } from \"../utils/window_slots.ts\";\nimport type {\n ConsentState,\n LinkerConfig,\n LinkerUrlPosition,\n PropertyConfig,\n RuntimeState,\n SetCommandArgs,\n WindowLike,\n} from \"../types.ts\";\n\n/**\n * Consumes a dataLayer-like queue on `window` used by the snippet/global function\n * (default: `window.d8aLayer`).\n *\n * - The snippet pushes `arguments` (array-like) or arrays into `window[dataLayerName]`.\n * - The runtime drains existing entries and then patches `push` to intercept future commands.\n *\n */\ntype QueueItem = unknown; // can be `arguments` (array-like) or an actual array\ntype NormalizedArgs = unknown[] | null;\ntype DataLayerLike = Array<unknown> & {\n push: (...args: unknown[]) => number;\n __d8aQueueConsumerPatched?: boolean;\n __d8aQueueConsumerOriginalPush?: ((...args: unknown[]) => number) | null;\n};\n\nfunction readUserIdFromObject(v: unknown) {\n if (!isRecord(v)) return null;\n const raw = v.user_id;\n if (typeof raw !== \"string\") return null;\n const trimmed = raw.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction readSendPageViewFromConfig(v: unknown) {\n if (!isRecord(v)) return undefined;\n const raw = v.send_page_view;\n return typeof raw === \"boolean\" ? raw : undefined;\n}\n\nfunction readConsentPatch(v: unknown): ConsentState {\n return isRecord(v) ? v : {};\n}\n\nfunction mergeLinkerConfig(state: RuntimeState, patch: unknown) {\n if (!state) return;\n if (!isRecord(patch)) return;\n\n const next: LinkerConfig = { ...(state.linker || { domains: [] }) };\n\n const domainsRaw = patch.domains;\n if (Array.isArray(domainsRaw)) {\n const domains = domainsRaw\n .filter((x) => typeof x === \"string\" && x.trim())\n .map((x) => x.trim());\n next.domains = domains;\n }\n\n const acceptIncomingRaw = patch.accept_incoming;\n if (typeof acceptIncomingRaw === \"boolean\") next.accept_incoming = acceptIncomingRaw;\n\n const decorateFormsRaw = patch.decorate_forms;\n if (typeof decorateFormsRaw === \"boolean\") next.decorate_forms = decorateFormsRaw;\n\n const urlPosRaw = patch.url_position;\n const urlPos = typeof urlPosRaw === \"string\" ? urlPosRaw : \"\";\n if (urlPos === \"query\" || urlPos === \"fragment\") next.url_position = urlPos as LinkerUrlPosition;\n\n if (!Array.isArray(next.domains)) next.domains = [];\n state.linker = next;\n}\n\nexport function createQueueConsumer({\n windowRef,\n dataLayerName = \"d8aLayer\",\n}: {\n windowRef?: WindowLike;\n dataLayerName?: string;\n}) {\n if (!windowRef) throw new Error(\"createQueueConsumer: windowRef is required\");\n const w = windowRef;\n\n const state: RuntimeState = createRuntimeState();\n let started = false;\n let originalPush: ((...args: unknown[]) => number) | null = null;\n let patched = false;\n\n function normalizeDataLayerItem(item: QueueItem): NormalizedArgs {\n // Snippet pushes `arguments` (array-like, not a real array).\n const maybeArrayLikeLength = isRecord(item) ? item.length : null;\n if (item && typeof maybeArrayLikeLength === \"number\" && typeof item !== \"string\") {\n return Array.from(item as ArrayLike<unknown>);\n }\n if (Array.isArray(item)) return item;\n return null;\n }\n\n function handleCommand(args: unknown[]) {\n const cmd = args[0];\n const a = args[1];\n const b = args[2];\n switch (String(cmd || \"\")) {\n case \"js\": {\n // Note: `d8a('js', ...)` is snippet-compatible; callers may pass various values.\n // We preserve runtime behavior by passing the value through to Date() coercion,\n // while keeping TypeScript happy without `any`.\n state.jsDate = a instanceof Date ? a : new Date(a as string | number | Date);\n if (\n state.pageLoadMs == null &&\n state.jsDate instanceof Date &&\n !Number.isNaN(state.jsDate.getTime())\n ) {\n state.pageLoadMs = state.jsDate.getTime();\n }\n return;\n }\n case \"config\": {\n const propertyId = String(a || \"\");\n if (!propertyId) return;\n\n if (!state.propertyIds.includes(propertyId)) state.propertyIds.push(propertyId);\n\n if (!state.primaryPropertyId) {\n state.primaryPropertyId = propertyId;\n }\n\n const existingCfg: PropertyConfig = state.propertyConfigs[propertyId] || {};\n const patchCfg: PropertyConfig = isRecord(b) ? b : {};\n state.propertyConfigs[propertyId] = { ...existingCfg, ...patchCfg };\n\n const userId = readUserIdFromObject(patchCfg);\n if (userId) state.userId = userId;\n\n if (typeof state.__onConfig === \"function\") {\n state.__onConfig(propertyId, patchCfg);\n }\n\n const sendPv = readSendPageViewFromConfig(patchCfg);\n if (sendPv !== false && typeof state.__onEvent === \"function\") {\n // Auto page_view on config unless explicitly disabled.\n // Target only the configured property to avoid fan-out duplication per config call.\n state.__onEvent(\"page_view\", { send_to: propertyId });\n }\n return;\n }\n case \"consent\": {\n const action = String(a || \"\");\n if (action === \"default\" || action === \"update\") {\n const patch = readConsentPatch(b);\n if (action === \"default\") {\n state.consentDefault = { ...(state.consentDefault || {}), ...(patch || {}) };\n } else {\n state.consentUpdate = { ...(state.consentUpdate || {}), ...(patch || {}) };\n }\n state.consent = { ...(state.consentDefault || {}), ...(state.consentUpdate || {}) };\n maybeEmitConsentUpdatePing(() => state);\n }\n return;\n }\n case \"set\": {\n // Supported:\n // - d8a('set', { ... }) (existing behavior; global defaults)\n // - d8a('set', '<field>', <value>)\n if (typeof a === \"string\" && a.trim()) {\n const field = a.trim();\n // Special-case linker: d8a('set','linker',{...})\n if (field === \"linker\") {\n mergeLinkerConfig(state, b);\n } else {\n state.set = { ...(state.set || {}), [field]: b };\n }\n // Keep `user_id` mirrored in state.userId for convenience.\n if (field === \"user_id\" && typeof b === \"string\" && b.trim()) {\n state.userId = b.trim();\n }\n const payload: SetCommandArgs = { type: \"field\", field, value: b };\n state.__onSet?.(payload);\n return;\n }\n\n if (isRecord(a)) {\n // Restore object-form `set` (existing behavior).\n state.set = { ...(state.set || {}), ...a };\n const userId = readUserIdFromObject(a);\n if (userId) state.userId = userId;\n // Support configuring linker via object-form `set` for consistency with other fields:\n // d8a('set', { user_id: '...', linker: { ... } })\n if (\"linker\" in a) {\n mergeLinkerConfig(state, (a as any).linker);\n }\n const payload: SetCommandArgs = { type: \"object\", obj: a };\n state.__onSet?.(payload);\n }\n return;\n }\n case \"event\": {\n // Store for debugging/tests; the dispatcher is responsible for mapping + sending.\n const params = isRecord(b) ? b : {};\n state.events.push({ name: String(a || \"\"), params });\n if (typeof state.__onEvent === \"function\") {\n state.__onEvent(String(a || \"\"), params);\n }\n return;\n }\n default:\n // Unknown commands are ignored.\n return;\n }\n }\n\n function drainExisting() {\n const dl = dataLayerName;\n const existing = getWindowSlot<unknown>(w, dl);\n const items = Array.isArray(existing) ? existing : ensureArraySlot<unknown>(w, dl);\n for (const item of items) {\n const args = normalizeDataLayerItem(item);\n if (!args) continue;\n handleCommand(args);\n }\n }\n\n function patchPush() {\n const dl = dataLayerName;\n const dlArr = ensureArraySlot<unknown>(w, dl) as DataLayerLike;\n if (dlArr.__d8aQueueConsumerPatched) {\n // If already patched, reuse the original push so stop() can restore it.\n originalPush = dlArr.__d8aQueueConsumerOriginalPush || null;\n patched = false;\n return;\n }\n\n originalPush = dlArr.push.bind(dlArr);\n dlArr.__d8aQueueConsumerOriginalPush = originalPush;\n dlArr.push = function patchedPush(...forwarded: unknown[]) {\n const item = forwarded[0];\n const args = normalizeDataLayerItem(item);\n if (args) handleCommand(args);\n return (originalPush as (...args: unknown[]) => number)(...forwarded);\n };\n dlArr.__d8aQueueConsumerPatched = true;\n patched = true;\n }\n\n function start() {\n if (started) return;\n started = true;\n drainExisting();\n patchPush();\n }\n\n return {\n start,\n getState: () => state,\n setOnEvent: (fn: RuntimeState[\"__onEvent\"]) => {\n state.__onEvent = fn;\n },\n setOnConfig: (fn: RuntimeState[\"__onConfig\"]) => {\n state.__onConfig = fn;\n },\n setOnSet: (fn: RuntimeState[\"__onSet\"]) => {\n state.__onSet = fn;\n },\n stop: () => {\n if (!started) return;\n const dl = dataLayerName;\n const dlArrMaybe = getWindowSlot<unknown>(w, dl);\n if (patched && originalPush && Array.isArray(dlArrMaybe)) {\n const dlArr = dlArrMaybe as DataLayerLike;\n dlArr.push = originalPush;\n try {\n delete dlArr.__d8aQueueConsumerPatched;\n delete dlArr.__d8aQueueConsumerOriginalPush;\n } catch {\n // ignore\n }\n }\n started = false;\n },\n };\n}\n", "function nowSeconds(nowMs: unknown) {\n return Math.floor((Number(nowMs ?? Date.now()) || Date.now()) / 1000);\n}\n\nfunction randInt31() {\n return Math.floor(Math.random() * 2147483647);\n}\n\nexport function applyCookiePrefix(cookiePrefix: unknown, cookieName: unknown) {\n const p = typeof cookiePrefix === \"string\" ? cookiePrefix : \"\";\n const n = String(cookieName || \"\");\n if (!p) return n;\n // Avoid awkward double underscores if caller uses a trailing \"_\" prefix.\n if (p.endsWith(\"_\") && n.startsWith(\"_\")) return `${p.slice(0, -1)}${n}`;\n return `${p}${n}`;\n}\n\nexport function buildD8aClientCookieName(cookiePrefix?: unknown) {\n return applyCookiePrefix(cookiePrefix, \"_d8a\");\n}\n\nexport function buildD8aCookieName(propertyId: unknown, cookiePrefix?: unknown) {\n return applyCookiePrefix(cookiePrefix, `_d8a_${propertyId}`);\n}\n\nexport function parseD8aClientCookie(value: unknown) {\n const v = String(value || \"\");\n // Expected: C1.1.<part1>.<part2>\n const m = v.match(/^C1\\.1\\.([0-9]+)\\.([0-9]+)$/);\n if (!m) return null;\n return { cid: `${m[1]}.${m[2]}` };\n}\n\n/**\n * Generates the core cid parts (random + timestamp).\n * Shared by both cookie-based and anonymous cid flows.\n */\nexport function generateCidParts({ nowMs }: { nowMs?: unknown } = {}) {\n return {\n random: randInt31(),\n timestampSec: nowSeconds(nowMs),\n };\n}\n\n/**\n * Formats cid parts into the canonical cid string.\n */\nexport function formatCid({ random, timestampSec }: { random: unknown; timestampSec: unknown }) {\n return `${random}.${timestampSec}`;\n}\n\nexport function buildD8aClientCookieValue({ nowMs }: { nowMs?: unknown } = {}) {\n const { random, timestampSec } = generateCidParts({ nowMs });\n // C1.1.<rand>.<timestampSeconds>\n return `C1.1.${random}.${timestampSec}`;\n}\n\nexport function buildD8aClientCookieValueFromCid(cid: unknown) {\n const v = String(cid || \"\").trim();\n // cid format: <rand>.<timestampSeconds>\n const m = v.match(/^([0-9]+)\\.([0-9]+)$/);\n if (!m) return null;\n return `C1.1.${m[1]}.${m[2]}`;\n}\n\nconst SESSION_PREFIX = \"S1.1.\";\nconst KNOWN_KEYS = new Set([\"s\", \"o\", \"g\", \"t\", \"j\", \"d\"]);\n\nexport type SessionToken = { key: string; val: string; raw?: string; known: boolean };\n\nfunction tokenizeSessionCookie(raw: unknown) {\n const v = String(raw || \"\");\n if (!v.startsWith(SESSION_PREFIX)) return null;\n const rest = v.slice(SESSION_PREFIX.length);\n const tokens = rest\n .split(\"$\")\n .map((t) => t.trim())\n .filter(Boolean);\n const parsed: SessionToken[] = tokens.map((tok) => {\n const key = tok[0];\n const val = tok.slice(1);\n return { key, val, raw: tok, known: KNOWN_KEYS.has(key) };\n });\n return parsed;\n}\n\nfunction detokenizeSessionCookie(tokens: SessionToken[]) {\n const rawTokens = tokens.map((t) => `${t.key}${t.val}`);\n return `${SESSION_PREFIX}${rawTokens.join(\"$\")}`;\n}\n\nfunction getToken(tokens: SessionToken[], key: string) {\n const t = tokens.find((x) => x.key === key);\n return t ? t.val : null;\n}\n\nfunction setToken(tokens: SessionToken[], key: string, val: unknown) {\n const idx = tokens.findIndex((x) => x.key === key);\n if (idx >= 0) tokens[idx] = { ...tokens[idx], val: String(val), known: KNOWN_KEYS.has(key) };\n else tokens.push({ key, val: String(val), known: KNOWN_KEYS.has(key) });\n}\n\nfunction generateOpaqueSessionId() {\n // Opaque, high-entropy-ish, URL-safe.\n const a = randInt31().toString(36);\n const b = randInt31().toString(36);\n const c = randInt31().toString(36);\n return `${a}${b}${c}`;\n}\n\nexport function parseD8aSessionCookie(value: unknown) {\n const tokens = tokenizeSessionCookie(value);\n if (!tokens) return null;\n\n const sid = getToken(tokens, \"s\");\n const sct = getToken(tokens, \"o\");\n const last = getToken(tokens, \"t\");\n const segRaw = getToken(tokens, \"g\");\n\n const sidNum = sid != null ? Number(sid) : NaN;\n const sctNum = sct != null ? Number(sct) : NaN;\n const lastNum = last != null ? Number(last) : NaN;\n const segNum = segRaw != null ? Number(segRaw) : NaN;\n\n return {\n tokens,\n sid: Number.isFinite(sidNum) ? sidNum : null,\n sct: Number.isFinite(sctNum) ? sctNum : null,\n lastEventTs: Number.isFinite(lastNum) ? lastNum : null,\n seg: Number.isFinite(segNum) ? segNum : null,\n };\n}\n\n/**\n * Updates an existing session cookie tokens array or creates a new one.\n *\n * This is intentionally minimal in the current implementation:\n * - inactivity timeout creates a new session (new `s`, increment `o`)\n * - every event updates `t` and increments `j`\n * - preserves unknown tokens and token order where possible\n */\nexport function updateD8aSessionCookieTokens(\n existingTokens: SessionToken[] | null,\n { nowMs, sessionTimeoutMs }: { nowMs?: unknown; sessionTimeoutMs?: unknown } = {},\n) {\n const now = nowSeconds(nowMs);\n const timeoutSec = Math.floor((Number(sessionTimeoutMs ?? 30 * 60 * 1000) || 0) / 1000);\n\n const isValid = Array.isArray(existingTokens) && existingTokens.length > 0;\n let tokens: SessionToken[] = isValid ? existingTokens.map((t) => ({ ...t })) : [];\n\n if (!isValid) {\n setToken(tokens, \"s\", now);\n setToken(tokens, \"o\", 1);\n setToken(tokens, \"g\", 0);\n setToken(tokens, \"t\", now);\n setToken(tokens, \"j\", 0);\n setToken(tokens, \"d\", generateOpaqueSessionId());\n return { tokens, isNewSession: true };\n }\n\n const last = Number(getToken(tokens, \"t\") ?? NaN);\n const lastOk = Number.isFinite(last);\n const expired = !lastOk || now - last > timeoutSec;\n\n if (expired) {\n const prevSct = Number(getToken(tokens, \"o\") ?? NaN);\n const nextSct = Number.isFinite(prevSct) ? prevSct + 1 : 1;\n setToken(tokens, \"s\", now);\n setToken(tokens, \"o\", nextSct);\n setToken(tokens, \"g\", 0);\n setToken(tokens, \"t\", now);\n setToken(tokens, \"j\", 0);\n setToken(tokens, \"d\", generateOpaqueSessionId());\n return { tokens, isNewSession: true };\n }\n\n // Same session.\n const prevJ = Number(getToken(tokens, \"j\") ?? 0);\n setToken(tokens, \"j\", Number.isFinite(prevJ) ? prevJ + 1 : 1);\n setToken(tokens, \"t\", now);\n return { tokens, isNewSession: false };\n}\n\nexport function serializeD8aSessionCookieTokens(tokens: SessionToken[]) {\n return detokenizeSessionCookie(tokens);\n}\n\nexport const __internal = {\n SESSION_PREFIX,\n tokenizeSessionCookie,\n detokenizeSessionCookie,\n getToken,\n setToken,\n nowSeconds,\n applyCookiePrefix,\n};\n", "/**\n * Small helpers used to implement a gtag-compatible integration surface.\n *\n * Important: this code is a clean reimplementation of behaviors we need for compatibility\n * (e.g. cookie domain candidate ordering).\n */\n\nexport function getCookieDomainCandidates(hostname: unknown) {\n const host = String(hostname || \"\").trim();\n if (!host) return [\"none\"];\n\n const parts = host.split(\".\");\n\n // IP address detection: treat IPv4-like hostnames as host-only cookie candidates.\n if (parts.length === 4) {\n const last = parts[parts.length - 1];\n if (String(Number(last)) === last) return [\"none\"];\n }\n\n // Broadest-to-narrowest to prefer the widest cookie domain that still works.\n // For docs.d8a.tech => [\"d8a.tech\", \"docs.d8a.tech\", \"none\"]\n const out: string[] = [];\n for (let i = parts.length - 2; i >= 0; i -= 1) {\n out.push(parts.slice(i).join(\".\"));\n }\n out.push(\"none\");\n return out;\n}\n\nexport function stripTrailingSlashes(s: unknown) {\n return String(s).replace(/\\/+$/, \"\");\n}\n", "import { getCookieDomainCandidates } from \"../utils/gtag_primitives.ts\";\n\ntype CookieMap = Map<string, string>;\n\ntype DocumentLike = {\n cookie: string;\n};\n\ntype WindowRefLike = {\n document?: DocumentLike;\n location?: { protocol?: string; hostname?: string };\n};\n\ntype CookieSetOptions = {\n path?: string;\n domain?: string;\n sameSite?: string;\n secure?: boolean;\n maxAgeSeconds?: number | null;\n expires?: Date | null;\n};\n\ntype CookieSetAttempt = {\n candidate: string;\n domain: string | null;\n cookieStr: string;\n before: string;\n after: string;\n readBack: string | undefined;\n stuck: boolean;\n};\n\ntype CookieSetResult = {\n ok: boolean;\n domain: string | null;\n cookieStr: string | null;\n attempts: CookieSetAttempt[];\n};\n\nfunction parseCookieHeader(header: unknown): CookieMap {\n const out: CookieMap = new Map();\n const raw = String(header || \"\");\n if (!raw) return out;\n for (const part of raw.split(\";\")) {\n const s = part.trim();\n if (!s) continue;\n const idx = s.indexOf(\"=\");\n if (idx < 0) continue;\n const name = s.slice(0, idx).trim();\n const value = s.slice(idx + 1).trim();\n if (!name) continue;\n out.set(name, value);\n }\n return out;\n}\n\nexport { parseCookieHeader };\n\nfunction isHttps(w: WindowRefLike) {\n try {\n return String(w?.location?.protocol || \"\").toLowerCase() === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction buildSetCookieString(name: string, value: string, attrs: Record<string, unknown>) {\n const parts: string[] = [];\n parts.push(`${name}=${value}`);\n if (attrs.path) parts.push(`Path=${String(attrs.path)}`);\n if (attrs.expires) parts.push(`Expires=${(attrs.expires as Date).toUTCString()}`);\n if (attrs.maxAgeSeconds != null) parts.push(`Max-Age=${String(attrs.maxAgeSeconds)}`);\n if (attrs.sameSite) parts.push(`SameSite=${String(attrs.sameSite)}`);\n if (attrs.domain) parts.push(`Domain=${String(attrs.domain)}`);\n if (attrs.secure) parts.push(\"Secure\");\n return parts.join(\"; \");\n}\n\nfunction ensureDotDomain(domain: string) {\n if (!domain) return domain;\n if (domain === \"none\") return null;\n return domain.startsWith(\".\") ? domain : `.${domain}`;\n}\n\nexport function createCookieJar({ windowRef }: { windowRef: WindowRefLike }) {\n const w = windowRef;\n if (!w?.document) throw new Error(\"createCookieJar: windowRef.document is required\");\n const doc = w.document;\n\n function getAll() {\n return parseCookieHeader(w.document?.cookie);\n }\n\n function get(name: string) {\n return getAll().get(name);\n }\n\n /**\n * Sets a cookie, optionally using `domain: 'auto'` to select a\n * domain that sticks by trying candidates broadest-first.\n *\n * Returns an object describing what it did; primarily useful for debugging/tests.\n */\n function set(name: string, value: string, opts: CookieSetOptions = {}): CookieSetResult {\n const path = opts.path || \"/\";\n const https = isHttps(w);\n // Browsers require Secure for SameSite=None cookies. On http://, we can't set\n // Secure cookies, so we downgrade SameSite=None to Lax for local dev.\n const requestedSameSite = opts.sameSite || \"Lax\";\n const sameSite =\n !https && String(requestedSameSite).toLowerCase() === \"none\" ? \"Lax\" : requestedSameSite;\n // Browsers won't accept `Secure` cookies on non-HTTPS pages. For local dev\n // (http://), we ignore an explicit Secure request rather than failing to\n // set/update the cookie at all.\n const secure = opts.secure != null ? !!opts.secure && https : https;\n const maxAgeSeconds = opts.maxAgeSeconds ?? null;\n const expires = opts.expires ?? null;\n\n const baseAttrs = { path, sameSite, secure, maxAgeSeconds, expires };\n\n const domainOpt = opts.domain || \"auto\";\n const host = String(w.location?.hostname || \"\");\n const candidates = domainOpt === \"auto\" ? getCookieDomainCandidates(host) : [domainOpt];\n\n // gtag semantics: \"none\" means host-only (no domain attribute).\n const attempts: CookieSetAttempt[] = [];\n for (const candidate of candidates) {\n const domain = ensureDotDomain(candidate);\n const cookieStr = buildSetCookieString(name, value, { ...baseAttrs, domain });\n\n const before = String(doc.cookie || \"\");\n doc.cookie = cookieStr;\n const after = String(doc.cookie || \"\");\n\n const stuck = before !== after || get(name) === value;\n attempts.push({\n candidate,\n domain: candidate === \"none\" ? null : domain,\n cookieStr,\n before,\n after,\n readBack: get(name),\n stuck,\n });\n if (stuck) {\n return { ok: true, domain: candidate === \"none\" ? null : domain, cookieStr, attempts };\n }\n }\n\n return { ok: false, domain: null, cookieStr: null, attempts };\n }\n\n function del(name: string, opts: CookieSetOptions = {}) {\n // Delete by setting an expired cookie; attempt with same domain selection.\n return set(name, \"deleted\", { ...opts, expires: new Date(0) });\n }\n\n return { get, set, del, __internal: { parseCookieHeader, buildSetCookieString } };\n}\n", "import {\n buildD8aClientCookieName,\n buildD8aCookieName,\n parseD8aClientCookie,\n parseD8aSessionCookie,\n} from \"../cookies/d8a_cookies.ts\";\nimport { parseCookieHeader } from \"../cookies/cookie_jar.ts\";\nimport type { BrowserContext, ConsentState } from \"../types.ts\";\n\nconst CORE_ECOMMERCE_NUMBER = new Set([\"value\", \"tax\", \"shipping\"]);\n\nconst ITEM_KEY_MAP: Record<string, string> = {\n item_id: \"id\",\n item_name: \"nm\",\n affiliation: \"af\",\n coupon: \"cp\",\n discount: \"ds\",\n index: \"lp\",\n item_brand: \"br\",\n item_category: \"ca\",\n item_category2: \"c2\",\n item_category3: \"c3\",\n item_category4: \"c4\",\n item_category5: \"c5\",\n item_list_id: \"li\",\n item_list_name: \"ln\",\n item_variant: \"va\",\n location_id: \"lo\",\n price: \"pr\",\n quantity: \"qt\",\n promotion_id: \"pi\",\n promotion_name: \"pn\",\n};\n\n// Note: we intentionally treat arrays as \"object-like\" here to preserve the historical\n// runtime behavior of `encodeItemToPrValue` (previously `typeof v === \"object\"`).\nfunction isObjectLike(v: unknown): v is Record<string, unknown> {\n return !!v && typeof v === \"object\";\n}\n\nfunction toEpValue(v: unknown) {\n if (v == null) return null;\n if (typeof v === \"string\") return v;\n if (typeof v === \"boolean\") return v ? \"1\" : \"0\";\n if (typeof v === \"number\") return String(v);\n // Arrays: convert to comma-separated string\n if (Array.isArray(v)) return v.join(\",\");\n return String(v);\n}\n\nfunction toEpnValue(v: unknown) {\n if (typeof v === \"number\") return v;\n if (typeof v === \"boolean\") return v ? 1 : 0;\n if (typeof v === \"string\") {\n const n = Number(v);\n return Number.isFinite(n) ? n : null;\n }\n return null;\n}\n\nfunction addEp(params: URLSearchParams, key: string, value: unknown) {\n if (value == null) return;\n params.set(`ep.${key}`, String(value));\n}\n\nfunction addEpn(params: URLSearchParams, key: string, value: unknown) {\n if (value == null) return;\n // Keep numeric formatting stable (72.05 not \"72.0500\")\n params.set(`epn.${key}`, String(value));\n}\n\nexport function encodeItemToPrValue(item: unknown) {\n const it = isObjectLike(item) ? item : {};\n\n const knownParts: string[] = [];\n const customParts: string[] = [];\n\n // Preserve a stable, GA-like ordering: known mapped keys first (in map order),\n // then custom key/value tokens.\n for (const [srcKey, dstKey] of Object.entries(ITEM_KEY_MAP)) {\n if (!(srcKey in it)) continue;\n const v = it[srcKey];\n const str = toEpValue(v);\n if (str == null) continue;\n knownParts.push(`${dstKey}${str}`);\n }\n\n // Custom params: any key not in ITEM_KEY_MAP.\n let idx = 0;\n for (const key of Object.keys(it)) {\n if (key in ITEM_KEY_MAP) continue;\n const v = it[key];\n const str = toEpValue(v);\n if (str == null) continue;\n customParts.push(`k${idx}${key}`);\n customParts.push(`v${idx}${str}`);\n idx += 1;\n }\n\n return [...knownParts, ...customParts].join(\"~\");\n}\n\n/**\n * Builds the query params for a GA4 gtag `/g/collect` request.\n *\n * This returns a URLSearchParams with already-stringified values. The caller is\n * responsible for attaching it to a URL or sending as body.\n */\nexport function buildGa4CollectQueryParams({\n propertyId,\n eventName,\n eventParams,\n cookieHeader,\n clientId,\n userId,\n cookiePrefix,\n ignoreReferrer,\n browser,\n pageLoadMs,\n hitCounter,\n engagementTimeMs,\n uachParams,\n campaign,\n contentGroup,\n consentParams,\n debugMode,\n}: {\n propertyId: string;\n eventName: string;\n eventParams: Record<string, unknown>;\n cookieHeader: string;\n clientId: string | null;\n userId: string | null;\n cookiePrefix: string;\n ignoreReferrer: boolean;\n browser: BrowserContext;\n pageLoadMs: number | null;\n hitCounter: number | null;\n engagementTimeMs: number | null;\n uachParams: Record<string, string> | null;\n campaign: {\n campaign_id?: string | null;\n campaign_source?: string | null;\n campaign_medium?: string | null;\n campaign_name?: string | null;\n campaign_term?: string | null;\n campaign_content?: string | null;\n } | null;\n contentGroup: string | null;\n consentParams: { gcs?: string | null; gcd?: string | null; consent?: ConsentState } | null;\n debugMode: boolean;\n}) {\n const params = new URLSearchParams();\n\n // Core request identity.\n params.set(\"v\", \"2\");\n params.set(\"tid\", String(propertyId || \"\"));\n params.set(\"en\", String(eventName || \"\"));\n\n // GA4-style debug mode:\n // - `_dbg=1` enables DebugView-style ingestion on the backend\n // - `ep.debug_mode=1` is included for parity with gtag semantics\n if (debugMode === true) params.set(\"_dbg\", \"1\");\n\n if (pageLoadMs != null) params.set(\"_p\", String(pageLoadMs));\n if (hitCounter != null) params.set(\"_s\", String(hitCounter));\n if (engagementTimeMs != null) params.set(\"_et\", String(engagementTimeMs));\n\n // Cookies.\n const cookieMap = parseCookieHeader(cookieHeader);\n\n // Client id:\n // - If `clientId` is provided, it wins (used for cookieless / consent denied).\n // - Otherwise derive from the first-party `_d8a` cookie.\n if (clientId != null && String(clientId)) {\n params.set(\"cid\", String(clientId));\n } else {\n const client = parseD8aClientCookie(cookieMap.get(buildD8aClientCookieName(cookiePrefix)));\n if (client?.cid) params.set(\"cid\", client.cid);\n }\n\n // User id (provided by caller): maps to GA `uid`\n if (typeof userId === \"string\" && userId.trim()) {\n params.set(\"uid\", userId.trim());\n }\n\n // Campaign overrides. These map to standard GA parameters.\n const c = campaign || {};\n if (typeof c.campaign_id === \"string\" && c.campaign_id.trim())\n params.set(\"ci\", c.campaign_id.trim());\n if (typeof c.campaign_source === \"string\" && c.campaign_source.trim())\n params.set(\"cs\", c.campaign_source.trim());\n if (typeof c.campaign_medium === \"string\" && c.campaign_medium.trim())\n params.set(\"cm\", c.campaign_medium.trim());\n if (typeof c.campaign_name === \"string\" && c.campaign_name.trim())\n params.set(\"cn\", c.campaign_name.trim());\n if (typeof c.campaign_term === \"string\" && c.campaign_term.trim())\n params.set(\"ct\", c.campaign_term.trim());\n if (typeof c.campaign_content === \"string\" && c.campaign_content.trim())\n params.set(\"cc\", c.campaign_content.trim());\n\n if (typeof contentGroup === \"string\" && contentGroup.trim()) {\n // Use event-param namespace for content group as requested.\n addEp(params, \"content_group\", contentGroup.trim());\n }\n\n const sessionCookieName = buildD8aCookieName(propertyId, cookiePrefix);\n const session = parseD8aSessionCookie(cookieMap.get(sessionCookieName));\n\n // sid: use cookie value or default to current timestamp (seconds since epoch)\n if (session?.sid != null) {\n params.set(\"sid\", String(session.sid));\n } else {\n params.set(\"sid\", String(Math.floor(Date.now() / 1000)));\n }\n\n // sct: use cookie value or default to 1\n if (session?.sct != null) {\n params.set(\"sct\", String(session.sct));\n } else {\n params.set(\"sct\", \"1\");\n }\n\n if (session?.seg != null) params.set(\"seg\", String(session.seg));\n\n const b = browser;\n\n // Browser-derived.\n if (b.dl) params.set(\"dl\", String(b.dl));\n if (b.dt) params.set(\"dt\", String(b.dt));\n // ignore_referrer: include ir=1 only when explicitly enabled\n if (ignoreReferrer === true) params.set(\"ir\", \"1\");\n // Send empty referrer explicitly (GA commonly sends `dr=` for direct).\n params.set(\"dr\", String(b.dr));\n if (b.ul) params.set(\"ul\", String(b.ul));\n if (b.sr) params.set(\"sr\", String(b.sr));\n\n if (uachParams) {\n for (const [k, v] of Object.entries(uachParams)) {\n if (v == null || v === \"\") continue;\n params.set(k, String(v));\n }\n }\n\n if (consentParams) {\n if (consentParams.gcs) params.set(\"gcs\", String(consentParams.gcs));\n if (consentParams.gcd) params.set(\"gcd\", String(consentParams.gcd));\n }\n\n const p = eventParams || {};\n\n if (debugMode === true && !Object.prototype.hasOwnProperty.call(p, \"debug_mode\")) {\n addEp(params, \"debug_mode\", \"1\");\n }\n\n // Ecommerce / reserved keys.\n const currency = p[\"currency\"];\n if (typeof currency === \"string\") params.set(\"cu\", currency);\n if (p[\"transaction_id\"] != null) addEp(params, \"transaction_id\", toEpValue(p[\"transaction_id\"]));\n if (p[\"coupon\"] != null) addEp(params, \"coupon\", toEpValue(p[\"coupon\"]));\n if (p[\"customer_type\"] != null) addEp(params, \"customer_type\", toEpValue(p[\"customer_type\"]));\n\n for (const k of CORE_ECOMMERCE_NUMBER) {\n if (p[k] == null) continue;\n addEpn(params, k, toEpnValue(p[k]));\n }\n\n // Items.\n // GA4 limit: items array can include up to 200 elements.\n // https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtag\n const itemsRaw = p[\"items\"];\n if (Array.isArray(itemsRaw)) {\n const items = itemsRaw.slice(0, 200);\n for (let i = 0; i < items.length; i += 1) {\n const pr = encodeItemToPrValue(items[i]);\n if (pr) params.set(`pr${i + 1}`, pr);\n }\n }\n\n // Generic mapping: remaining keys -> ep/epn based on type.\n for (const key of Object.keys(p)) {\n if (key === \"items\") continue;\n if (key === \"currency\") continue;\n if (key === \"transaction_id\") continue;\n if (key === \"coupon\") continue;\n if (key === \"customer_type\") continue;\n if (CORE_ECOMMERCE_NUMBER.has(key)) continue;\n // Reserved keys we handle elsewhere (config/set overrides)\n if (key === \"user_id\") continue;\n if (key === \"client_id\") continue;\n if (key === \"campaign_id\") continue;\n if (key === \"campaign_source\") continue;\n if (key === \"campaign_medium\") continue;\n if (key === \"campaign_name\") continue;\n if (key === \"campaign_term\") continue;\n if (key === \"campaign_content\") continue;\n if (key === \"page_location\") continue;\n if (key === \"page_title\") continue;\n if (key === \"page_referrer\") continue;\n if (key === \"content_group\") continue;\n if (key === \"ignore_referrer\") continue;\n if (key === \"language\") continue;\n if (key === \"screen_resolution\") continue;\n if (key === \"cookie_domain\") continue;\n if (key === \"cookie_expires\") continue;\n if (key === \"cookie_flags\") continue;\n if (key === \"cookie_path\") continue;\n if (key === \"cookie_prefix\") continue;\n if (key === \"cookie_update\") continue;\n if (key === \"send_page_view\") continue;\n if (key === \"send_to\") continue;\n\n const v = p[key];\n if (typeof v === \"number\") addEpn(params, key, v);\n else addEp(params, key, toEpValue(v));\n }\n\n return params;\n}\n\nexport const __internal = {\n ITEM_KEY_MAP,\n toEpValue,\n toEpnValue,\n};\n", "import { stripTrailingSlashes } from \"./gtag_primitives.ts\";\n\nfunction isProbablyUrl(s: unknown) {\n return /^https?:\\/\\//i.test(String(s || \"\"));\n}\n\ntype TrackingConfigLike = { server_container_url?: string };\n\n/**\n * Resolves the final tracking URL.\n *\n * `server_container_url` is required and is treated as the final endpoint URL.\n * Examples:\n * - Cloud: \"https://global.t.d8a.tech/<property_id>/d/c\"\n * - On-prem: \"https://example.org/d/c\"\n */\nexport function resolveTrackingUrl(configOrUrl?: unknown) {\n // Back-compat: allow passing a string directly (old helper signature).\n if (typeof configOrUrl === \"string\" && isProbablyUrl(configOrUrl)) {\n return resolveTrackingUrl({ server_container_url: configOrUrl });\n }\n\n const cfg =\n configOrUrl && typeof configOrUrl === \"object\" ? (configOrUrl as TrackingConfigLike) : {};\n const baseRaw = (cfg.server_container_url || \"\").trim();\n if (!baseRaw) {\n throw new Error(\"server_container_url is required\");\n }\n return stripTrailingSlashes(baseRaw);\n}\n\nexport const __internal = {\n isProbablyUrl,\n};\n", "import type { BrowserContext, WindowLike } from \"../types.ts\";\n\nexport function getBrowserContext(w: WindowLike): BrowserContext {\n const dl = (() => {\n try {\n return String(w?.location?.href || \"\");\n } catch {\n return \"\";\n }\n })();\n\n const dt = (() => {\n try {\n return String(w?.document?.title || \"\");\n } catch {\n return \"\";\n }\n })();\n\n const dr = (() => {\n try {\n return String(w?.document?.referrer || \"\");\n } catch {\n return \"\";\n }\n })();\n\n const dh = (() => {\n try {\n return String(w?.location?.hostname || \"\");\n } catch {\n return \"\";\n }\n })();\n\n const ul = (() => {\n try {\n return String(w?.navigator?.language || \"\").toLowerCase();\n } catch {\n return \"\";\n }\n })();\n\n const sr = (() => {\n try {\n const sw = w?.screen?.width;\n const sh = w?.screen?.height;\n if (typeof sw === \"number\" && typeof sh === \"number\") return `${sw}x${sh}`;\n } catch {\n // ignore\n }\n return \"\";\n })();\n\n return { dl, dt, dr, dh, ul, sr };\n}\n", "function sleep(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction shouldRetryHttpStatus(status: number) {\n if (status === 429) return true;\n if (status >= 500) return true;\n return false;\n}\n\nimport type { WindowLikeTransport } from \"../types.ts\";\n\nexport async function sendWithRetries({\n url,\n windowRef,\n useBeacon,\n maxRetries = 1,\n initialBackoffMs = 200,\n}: {\n url: string;\n windowRef: WindowLikeTransport;\n useBeacon: boolean;\n maxRetries?: number;\n initialBackoffMs?: number;\n}) {\n const w = windowRef;\n const beacon = w?.navigator?.sendBeacon;\n\n if (useBeacon && typeof beacon === \"function\") {\n // sendBeacon doesn't give us status, so it's best-effort.\n try {\n beacon.call(w.navigator, url);\n return { ok: true, via: \"beacon\" as const };\n } catch {\n // fall back to fetch path\n }\n }\n\n const fetchFn = w?.fetch;\n if (typeof fetchFn !== \"function\") {\n throw new Error(\"fetch is not available\");\n }\n\n const options = {\n method: \"POST\",\n keepalive: true,\n credentials: \"include\",\n cache: \"no-store\",\n redirect: \"follow\",\n mode: \"no-cors\",\n } as const;\n\n let attempt = 0;\n let backoff = initialBackoffMs;\n while (true) {\n attempt += 1;\n try {\n const res = await fetchFn.call(w, url, options);\n\n // With `no-cors`, response is often opaque (status 0). Treat as success.\n const status = typeof res?.status === \"number\" ? res.status : 0;\n if (!shouldRetryHttpStatus(status)) {\n return { ok: true, via: \"fetch\" as const, status };\n }\n } catch {\n // retry below\n }\n\n if (attempt > maxRetries) {\n return { ok: false, via: \"fetch\" as const, status: null };\n }\n await sleep(backoff);\n backoff *= 2;\n }\n}\n", "export type ConsentStateLike = { analytics_storage?: string };\n\nexport function canWriteAnalyticsCookies(consentState: ConsentStateLike) {\n const s = consentState || {};\n // Requirement: if analytics_storage explicitly denied, do not write cookies.\n return String(s.analytics_storage || \"\").toLowerCase() !== \"denied\";\n}\n", "import {\n buildD8aClientCookieValue,\n buildD8aClientCookieValueFromCid,\n buildD8aClientCookieName,\n buildD8aCookieName,\n parseD8aClientCookie,\n parseD8aSessionCookie,\n serializeD8aSessionCookieTokens,\n updateD8aSessionCookieTokens,\n} from \"./d8a_cookies.ts\";\nimport { canWriteAnalyticsCookies } from \"./consent.ts\";\n\nconst TWO_YEARS_SECONDS = 2 * 365 * 24 * 60 * 60;\n\ntype CookieJarLike = {\n get: (name: string) => string | undefined;\n set: (name: string, value: string, opts?: Record<string, unknown>) => unknown;\n};\n\ntype ConsentStateLike = { analytics_storage?: string };\n\nexport function ensureClientId({\n jar,\n consent,\n nowMs,\n cookieDomain = \"auto\",\n cookiePrefix = \"\",\n cookiePath = \"/\",\n cookieSameSite = \"Lax\",\n cookieSecure = undefined,\n cookieMaxAgeSeconds = TWO_YEARS_SECONDS,\n cookieUpdate = true,\n forceCookieAttrsWrite = false,\n}: {\n jar?: CookieJarLike;\n consent?: ConsentStateLike;\n nowMs?: number;\n cookieDomain?: string;\n cookiePrefix?: string;\n cookiePath?: string;\n cookieSameSite?: string;\n cookieSecure?: boolean;\n cookieMaxAgeSeconds?: number;\n cookieUpdate?: boolean;\n forceCookieAttrsWrite?: boolean;\n} = {}) {\n const name = buildD8aClientCookieName(cookiePrefix);\n const existing = jar?.get(name);\n const parsed = parseD8aClientCookie(existing);\n // If cookie exists, we may still need to rewrite it to apply new attributes\n // (SameSite/Secure/max-age/path/domain). This is controlled by cookieUpdate.\n if (parsed?.cid) {\n if (!canWriteAnalyticsCookies(consent || {})) return { cid: parsed.cid, wrote: false };\n // For security-related changes (SameSite/Secure/etc.) we still want to be\n // able to apply updated attributes even if cookie_update is false.\n if (cookieUpdate === false && !forceCookieAttrsWrite) return { cid: parsed.cid, wrote: false };\n jar?.set(name, String(existing || \"\"), {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { cid: parsed.cid, wrote: true };\n }\n\n const newVal = buildD8aClientCookieValue({ nowMs });\n const newParsed = parseD8aClientCookie(newVal);\n const cid = newParsed?.cid || null;\n\n if (!canWriteAnalyticsCookies(consent || {})) {\n // Cookieless: return a generated id but do not persist.\n return { cid, wrote: false };\n }\n\n // Only update cookies when enabled; however, if cookie is missing, we still\n // create it even when cookieUpdate is false.\n if (cookieUpdate === false && existing) return { cid, wrote: false };\n\n jar?.set(name, newVal, {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { cid, wrote: true };\n}\n\n/**\n * Applies an explicit client id to the d8a client cookie, honoring cookie_update\n * semantics: do not overwrite existing cookies when cookie_update=false,\n * but still create missing cookies.\n */\nexport function applyClientIdCookie({\n jar,\n cid,\n consent,\n cookieDomain = \"auto\",\n cookiePrefix = \"\",\n cookiePath = \"/\",\n cookieSameSite = \"Lax\",\n cookieSecure = undefined,\n cookieMaxAgeSeconds = TWO_YEARS_SECONDS,\n cookieUpdate = true,\n forceCookieAttrsWrite = false,\n}: {\n jar?: CookieJarLike;\n cid?: unknown;\n consent?: ConsentStateLike;\n cookieDomain?: string;\n cookiePrefix?: string;\n cookiePath?: string;\n cookieSameSite?: string;\n cookieSecure?: boolean;\n cookieMaxAgeSeconds?: number;\n cookieUpdate?: boolean;\n forceCookieAttrsWrite?: boolean;\n} = {}) {\n const cidStr = typeof cid === \"string\" ? cid.trim() : String(cid || \"\").trim();\n const cookieValue = buildD8aClientCookieValueFromCid(cidStr);\n if (!cookieValue) return { cid: null, wrote: false };\n\n const name = buildD8aClientCookieName(cookiePrefix);\n const existing = jar?.get(name);\n const parsed = parseD8aClientCookie(existing);\n const existingCid = parsed?.cid || null;\n\n if (!canWriteAnalyticsCookies(consent || {})) return { cid: cidStr, wrote: false };\n\n // If cookie exists and updates are disabled, don't overwrite its value.\n if (existing && cookieUpdate === false) {\n if (!forceCookieAttrsWrite) return { cid: existingCid || cidStr, wrote: false };\n jar?.set(name, String(existing || \"\"), {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { cid: existingCid || cidStr, wrote: true };\n }\n\n // Create missing cookie even when cookie_update=false.\n jar?.set(name, cookieValue, {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { cid: cidStr, wrote: true };\n}\n\n/**\n * Applies an explicit serialized session cookie value to a d8a per-property cookie,\n * honoring cookie_update semantics: do not overwrite existing cookies when cookie_update=false,\n * but still create missing cookies.\n */\nexport function applySessionCookie({\n jar,\n propertyId,\n value,\n consent,\n cookieDomain = \"auto\",\n cookiePrefix = \"\",\n cookiePath = \"/\",\n cookieSameSite = \"Lax\",\n cookieSecure = undefined,\n cookieMaxAgeSeconds = TWO_YEARS_SECONDS,\n cookieUpdate = true,\n forceCookieAttrsWrite = false,\n}: {\n jar?: CookieJarLike;\n propertyId?: string;\n value?: unknown;\n consent?: ConsentStateLike;\n cookieDomain?: string;\n cookiePrefix?: string;\n cookiePath?: string;\n cookieSameSite?: string;\n cookieSecure?: boolean;\n cookieMaxAgeSeconds?: number;\n cookieUpdate?: boolean;\n forceCookieAttrsWrite?: boolean;\n} = {}) {\n const pid = String(propertyId || \"\");\n if (!pid) return { wrote: false };\n const rawValue = String(value || \"\");\n // Basic validation: only accept well-formed d8a session cookie values.\n if (!parseD8aSessionCookie(rawValue)?.tokens) return { wrote: false };\n\n const name = buildD8aCookieName(pid, cookiePrefix);\n const existing = jar?.get(name);\n\n if (!canWriteAnalyticsCookies(consent || {})) return { wrote: false };\n\n if (existing && cookieUpdate === false) {\n if (!forceCookieAttrsWrite) return { wrote: false };\n jar?.set(name, String(existing || \"\"), {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { wrote: true };\n }\n\n // Create missing cookie even when cookie_update=false.\n jar?.set(name, rawValue, {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { wrote: true };\n}\n\nexport function ensureSession({\n jar,\n propertyId,\n consent,\n nowMs,\n cookieDomain = \"auto\",\n cookiePrefix = \"\",\n cookiePath = \"/\",\n cookieSameSite = \"Lax\",\n cookieSecure = undefined,\n cookieMaxAgeSeconds = TWO_YEARS_SECONDS,\n cookieUpdate = true,\n forceCookieAttrsWrite = false,\n sessionTimeoutMs,\n}: {\n jar?: CookieJarLike;\n propertyId?: string;\n consent?: ConsentStateLike;\n nowMs?: number;\n cookieDomain?: string;\n cookiePrefix?: string;\n cookiePath?: string;\n cookieSameSite?: string;\n cookieSecure?: boolean;\n cookieMaxAgeSeconds?: number;\n cookieUpdate?: boolean;\n forceCookieAttrsWrite?: boolean;\n sessionTimeoutMs?: number;\n} = {}) {\n const name = buildD8aCookieName(propertyId, cookiePrefix);\n const existing = jar?.get(name);\n const parsed = parseD8aSessionCookie(existing);\n\n // If cookie_update is disabled and the cookie already exists, don't refresh it.\n if (cookieUpdate === false && parsed?.tokens) {\n if (!canWriteAnalyticsCookies(consent || {})) {\n return { sid: parsed.sid, sct: parsed.sct, isNewSession: false, wrote: false };\n }\n if (!forceCookieAttrsWrite) {\n return { sid: parsed.sid, sct: parsed.sct, isNewSession: false, wrote: false };\n }\n // Apply updated cookie attributes without changing the cookie value/tokens.\n jar?.set(name, String(existing || \"\"), {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { sid: parsed.sid, sct: parsed.sct, isNewSession: false, wrote: true };\n }\n\n const updated = updateD8aSessionCookieTokens(parsed?.tokens || null, { nowMs, sessionTimeoutMs });\n const value = serializeD8aSessionCookieTokens(updated.tokens);\n\n const sid = Number(updated.tokens.find((t) => t.key === \"s\")?.val ?? NaN);\n const sct = Number(updated.tokens.find((t) => t.key === \"o\")?.val ?? NaN);\n\n const sidOk = Number.isFinite(sid) ? sid : null;\n const sctOk = Number.isFinite(sct) ? sct : null;\n\n if (!canWriteAnalyticsCookies(consent || {})) {\n return { sid: sidOk, sct: sctOk, isNewSession: updated.isNewSession, wrote: false };\n }\n\n jar?.set(name, value, {\n domain: cookieDomain,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n return { sid: sidOk, sct: sctOk, isNewSession: updated.isNewSession, wrote: true };\n}\n", "/**\n * User-Agent Client Hints (UA-CH) helpers.\n *\n * - Fetches high-entropy UA-CH values when supported (`navigator.userAgentData`)\n * - Caches the result on `window.d8a_tag_data` so it is fetched at most once per page\n * - Maps cached UA-CH fields into GA4-style query params (uaa/uab/uafvl/...)\n */\nconst HIGH_ENTROPY_KEYS = [\n \"platform\",\n \"platformVersion\",\n \"architecture\",\n \"model\",\n \"bitness\",\n \"fullVersionList\",\n \"wow64\",\n \"mobile\",\n] as const;\n\ntype UachFullVersion = { brand?: string; version?: string };\n\ntype Uach = {\n architecture?: string;\n bitness?: string;\n fullVersionList?: UachFullVersion[];\n mobile?: boolean;\n model?: string;\n platform?: string;\n platformVersion?: string;\n wow64?: boolean;\n};\n\ntype UserAgentDataLike = {\n // UA-CH API accepts an array of hints; treat it as readonly to allow `as const` lists.\n getHighEntropyValues: (hints: readonly string[]) => Promise<Uach>;\n};\n\ntype UachStore = {\n uach?: Uach;\n uach_promise?: Promise<Uach>;\n};\n\ntype WindowLike = import(\"../types.ts\").WindowLike;\ntype WindowUachCapable = WindowLike & {\n navigator: NonNullable<WindowLike[\"navigator\"]> & { userAgentData: UserAgentDataLike };\n};\n\nimport { isRecord } from \"../utils/is_record.ts\";\n\nfunction getStore(w: WindowLike) {\n // Keep a singleton cache object on window so we only fetch UA-CH values once per page.\n w.d8a_tag_data = w.d8a_tag_data || {};\n const store = w.d8a_tag_data;\n const existing = store.uach_store;\n if (!isRecord(existing)) {\n store.uach_store = {} as UachStore;\n }\n return store.uach_store as UachStore;\n}\n\nexport function hasUachApi(w: WindowLike): w is WindowUachCapable {\n const nav = w.navigator;\n if (!isRecord(nav)) return false;\n const uad = nav.userAgentData;\n if (!isRecord(uad)) return false;\n const ghev = uad.getHighEntropyValues;\n return typeof ghev === \"function\";\n}\n\nexport function getUachCached(w: WindowLike) {\n const store = getStore(w);\n return store.uach || null;\n}\n\nexport function fetchUach(w: WindowLike) {\n if (!hasUachApi(w)) return null;\n const store = getStore(w);\n if (store.uach_promise) return store.uach_promise;\n\n store.uach_promise = w.navigator.userAgentData\n .getHighEntropyValues(HIGH_ENTROPY_KEYS)\n .then((d: Uach) => {\n store.uach = store.uach || d;\n return store.uach;\n });\n return store.uach_promise;\n}\n\nfunction enc(v: unknown) {\n return encodeURIComponent(String(v || \"\"));\n}\n\nexport function uachToParams(uach: Uach | null) {\n if (!uach) return null;\n const out: Record<string, string> = {};\n\n if (uach.architecture) out.uaa = String(uach.architecture);\n if (uach.bitness) out.uab = String(uach.bitness);\n if (Array.isArray(uach.fullVersionList)) {\n out.uafvl = uach.fullVersionList\n .map((c) => `${enc(c.brand || \"\")};${enc(c.version || \"\")}`)\n .join(\"|\");\n }\n out.uamb = uach.mobile ? \"1\" : \"0\";\n if (uach.model) out.uam = String(uach.model);\n if (uach.platform) out.uap = String(uach.platform);\n if (uach.platformVersion) out.uapv = String(uach.platformVersion);\n out.uaw = uach.wow64 ? \"1\" : \"0\";\n\n return out;\n}\n\nexport const __internal = { HIGH_ENTROPY_KEYS };\n", "import type { ConsentState } from \"../types.ts\";\n\nfunction encodeConsentStateBit(a: unknown) {\n // Encode consent state into the `gcs` bit representation used by the Google tag / GA4 collect\n // wire format:\n // - 1 => \"1\"\n // - 2 or 4 => \"0\"\n // - else => \"-\"\n switch (a) {\n case 1:\n return \"1\";\n case 2:\n case 4:\n return \"0\";\n default:\n return \"-\";\n }\n}\n\nfunction consentStatusToQl(status: unknown) {\n // Map consent status to the internal states used by `buildGcs`.\n // - granted => 1 (\"1\")\n // - denied => 2 (\"0\")\n // - undefined => 1 (treat as granted by default in our tracker)\n const s = String(status || \"\").toLowerCase();\n if (s === \"denied\") return 2;\n return 1;\n}\n\n/**\n * Build `gcs` in the shape expected by the Google tag / GA4 collect wire format:\n * `G1` + encode(ad_storage_state) + encode(analytics_storage_state)\n */\nexport function buildGcs({ consent }: { consent: ConsentState }) {\n const c = consent || {};\n const ad = consentStatusToQl(c.ad_storage);\n const an = consentStatusToQl(c.analytics_storage);\n return `G1${encodeConsentStateBit(ad)}${encodeConsentStateBit(an)}`;\n}\n\n/**\n * Build `gcd` based on Consent Mode v2 state transitions.\n *\n * Uses the letter meanings described in Simo Ahava\u2019s Consent Mode v2 guide:\n * - `l`: not set\n * - `p`: denied by default (no update)\n * - `q`: denied by default and after update\n * - `t`: granted by default (no update)\n * - `r`: denied by default, granted after update\n * - `m`: denied after update (no default)\n * - `n`: granted after update (no default)\n * - `u`: granted by default, denied after update\n * - `v`: granted by default and after update\n *\n * Reference: https://www.simoahava.com/analytics/consent-mode-v2-google-tags/\n *\n * Note: The official `gcd` encoding contains more metadata than just the\n * consent transitions. For our purposes we encode the transition letters for\n * the 4 main consent signals and preserve the observed framing:\n * - prefix: `13`\n * - suffix: `l1`\n *\n * This ensures the known baselines match:\n * - all denied (default denied, no update): `13p3p3p2p5l1`\n * - all granted (default denied, update granted): `13r3r3r2r5l1`\n */\nexport function buildGcd({\n consentDefault,\n consentUpdate,\n}: {\n consentDefault: ConsentState;\n consentUpdate: ConsentState;\n}) {\n const d = consentDefault || {};\n const u = consentUpdate || {};\n\n function status(v: unknown) {\n const s = String(v || \"\").toLowerCase();\n if (s === \"granted\") return \"granted\";\n if (s === \"denied\") return \"denied\";\n return null;\n }\n\n function letterFor(def: unknown, upd: unknown) {\n const defS = status(def);\n const updS = status(upd);\n\n // no default, no update\n if (!defS && !updS) return \"l\";\n\n // default only\n if (defS === \"denied\" && !updS) return \"p\";\n if (defS === \"granted\" && !updS) return \"t\";\n\n // update only\n if (!defS && updS === \"denied\") return \"m\";\n if (!defS && updS === \"granted\") return \"n\";\n\n // both present\n if (defS === \"denied\" && updS === \"denied\") return \"q\";\n if (defS === \"granted\" && updS === \"granted\") return \"v\";\n if (defS === \"denied\" && updS === \"granted\") return \"r\";\n if (defS === \"granted\" && updS === \"denied\") return \"u\";\n\n return \"l\";\n }\n\n // The digits after each letter match the observed Consent Mode v2 wire strings.\n const parts: Array<[string, string]> = [\n [\"ad_storage\", \"3\"],\n [\"analytics_storage\", \"3\"],\n [\"ad_user_data\", \"2\"],\n [\"ad_personalization\", \"5\"],\n ];\n\n let out = \"13\";\n for (const [k, digit] of parts) {\n out += `${letterFor(d[k], u[k])}${digit}`;\n }\n out += \"l1\";\n return out;\n}\n", "import { generateCidParts, formatCid } from \"../cookies/d8a_cookies.ts\";\n\n/**\n * Generates a cookieless cid using the same logic as our normal `_d8a` cookie\n * value generator, but without persisting it anywhere.\n *\n * This keeps the cid format consistent across consented and non-consented flows.\n */\nexport function generateAnonCid() {\n const parts = generateCidParts({ nowMs: Date.now() });\n return formatCid(parts);\n}\n\nexport function getOrCreateAnonCid({\n windowRef,\n state,\n}: {\n windowRef?: unknown;\n state?: { anonCid?: string | null } | null;\n}) {\n // windowRef kept for future use (e.g., crypto-based generator), but not needed today.\n void windowRef;\n if (!state) return generateAnonCid();\n if (typeof state.anonCid === \"string\" && state.anonCid) return state.anonCid;\n state.anonCid = generateAnonCid();\n return state.anonCid;\n}\n", "/**\n * Engagement timer\n *\n * Counts time only while the page is:\n * - focused\n * - visible\n * - active (not pagehidden)\n *\n */\nimport type { WindowLike } from \"../types.ts\";\n\nexport function createEngagementTimer({\n windowRef,\n nowMs = () => Date.now(),\n}: {\n windowRef?: WindowLike;\n nowMs?: () => number;\n} = {}) {\n if (!windowRef) throw new Error(\"createEngagementTimer: windowRef is required\");\n const w = windowRef;\n\n let started = false;\n let hasFocus = true;\n let isVisible = true;\n let isActive = true;\n\n let runningSinceMs: number | null = null;\n let accumulatedMs = 0;\n\n function readHasFocus() {\n try {\n if (typeof w.hasFocus === \"function\") return !!w.hasFocus();\n if (typeof w.document?.hasFocus === \"function\") return !!w.document.hasFocus();\n } catch {\n // ignore\n }\n return true;\n }\n\n function readIsVisible() {\n try {\n // In browsers: document.hidden is boolean.\n if (typeof w.document?.hidden === \"boolean\") return !w.document.hidden;\n if (typeof w.document?.visibilityState === \"string\")\n return w.document.visibilityState !== \"hidden\";\n } catch {\n // ignore\n }\n return true;\n }\n\n function shouldRun() {\n return hasFocus && isVisible && isActive;\n }\n\n function sync() {\n const now = nowMs();\n if (runningSinceMs != null) {\n const delta = Math.max(0, now - runningSinceMs);\n accumulatedMs += delta;\n runningSinceMs = now;\n }\n\n if (shouldRun()) {\n if (runningSinceMs == null) runningSinceMs = now;\n } else {\n runningSinceMs = null;\n }\n }\n\n function onFocus() {\n sync();\n hasFocus = true;\n sync();\n }\n\n function onBlur() {\n sync();\n hasFocus = false;\n sync();\n }\n\n function onVisibilityChange() {\n sync();\n isVisible = readIsVisible();\n sync();\n }\n\n function onPageShow() {\n sync();\n isActive = true;\n sync();\n }\n\n function onPageHide() {\n sync();\n isActive = false;\n sync();\n }\n\n function start() {\n if (started) return;\n started = true;\n\n hasFocus = readHasFocus();\n isVisible = readIsVisible();\n isActive = true;\n sync();\n\n if (typeof w.addEventListener === \"function\") {\n w.addEventListener(\"focus\", onFocus);\n w.addEventListener(\"blur\", onBlur);\n w.addEventListener(\"pageshow\", onPageShow);\n w.addEventListener(\"pagehide\", onPageHide);\n }\n if (typeof w.document?.addEventListener === \"function\") {\n w.document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n }\n\n function peek() {\n sync();\n return accumulatedMs | 0;\n }\n\n function getAndReset() {\n sync();\n const out = accumulatedMs | 0;\n accumulatedMs = 0;\n runningSinceMs = shouldRun() ? nowMs() : null;\n return out;\n }\n\n return { start, peek, getAndReset, __internal: { sync } };\n}\n", "import type { PropertyConfig, RuntimeState } from \"../types.ts\";\n\nexport function getPropertyIds(getState: () => RuntimeState) {\n const s = typeof getState === \"function\" ? getState() : null;\n if (Array.isArray(s?.propertyIds) && s.propertyIds.length > 0) return s.propertyIds.slice();\n return [];\n}\n\nexport function getPropertyConfig(\n getState: () => RuntimeState,\n propertyId: string,\n): PropertyConfig {\n const s = typeof getState === \"function\" ? getState() : null;\n const cfg = s?.propertyConfigs?.[propertyId];\n return cfg && typeof cfg === \"object\" ? cfg : {};\n}\n\nexport function getSetParams(getState: () => RuntimeState): Record<string, unknown> {\n const s = typeof getState === \"function\" ? getState() : null;\n return s?.set && typeof s.set === \"object\" ? s.set : {};\n}\n", "export function createDebugLogger({ enabled }: { enabled?: boolean }) {\n return {\n enabled: enabled === true,\n log: (...args: unknown[]) => {\n if (enabled !== true) return;\n try {\n console.log(...args);\n } catch {\n // ignore\n }\n },\n };\n}\n", "/**\n * Param resolution helpers with precedence rules:\n * - event params (per-event) override\n * - config params (per-property) fallback\n * - set params (global defaults) fallback\n *\n * `resolveString` returns a trimmed, non-empty string or null.\n * `resolveBool` returns a boolean or null.\n */\nexport function resolveWithPrecedence({\n key,\n eventParams,\n config,\n setParams,\n}: {\n key: string;\n eventParams?: Record<string, unknown> | null;\n config?: Record<string, unknown> | null;\n setParams?: Record<string, unknown> | null;\n}) {\n const ep = eventParams || {};\n const cfg = config || {};\n const sp = setParams || {};\n if (Object.prototype.hasOwnProperty.call(ep, key) && ep[key] != null) return ep[key];\n if (Object.prototype.hasOwnProperty.call(cfg, key) && cfg[key] != null) return cfg[key];\n if (Object.prototype.hasOwnProperty.call(sp, key) && sp[key] != null) return sp[key];\n return null;\n}\n\nexport function resolveString({\n key,\n eventParams,\n config,\n setParams,\n}: {\n key: string;\n eventParams?: Record<string, unknown> | null;\n config?: Record<string, unknown> | null;\n setParams?: Record<string, unknown> | null;\n}) {\n const v = resolveWithPrecedence({ key, eventParams, config, setParams });\n return typeof v === \"string\" && v.trim() ? v.trim() : null;\n}\n\nexport function resolveBool({\n key,\n eventParams,\n config,\n setParams,\n}: {\n key: string;\n eventParams?: Record<string, unknown> | null;\n config?: Record<string, unknown> | null;\n setParams?: Record<string, unknown> | null;\n}) {\n const v = resolveWithPrecedence({ key, eventParams, config, setParams });\n if (typeof v === \"boolean\") return v;\n return null;\n}\n", "type CookieFlagsParsed = { secure?: boolean; sameSite?: \"Lax\" | \"Strict\" | \"None\" };\n\nfunction parseCookieFlags(cookieFlags: unknown): CookieFlagsParsed {\n const raw = typeof cookieFlags === \"string\" ? cookieFlags : \"\";\n if (!raw.trim()) return {};\n const parts = raw\n .split(\";\")\n .map((s) => s.trim())\n .filter(Boolean);\n const out: CookieFlagsParsed = {};\n for (const p of parts) {\n const lower = p.toLowerCase();\n if (lower === \"secure\") out.secure = true;\n if (lower.startsWith(\"samesite=\")) {\n const vRaw = p.split(\"=\").slice(1).join(\"=\").trim();\n const v = vRaw.toLowerCase();\n if (v === \"lax\") out.sameSite = \"Lax\";\n if (v === \"strict\") out.sameSite = \"Strict\";\n if (v === \"none\") out.sameSite = \"None\";\n }\n }\n return out;\n}\n\ntype DebugEnabledFn = (args: {\n config: Record<string, unknown>;\n setParams: Record<string, unknown>;\n}) => boolean;\n\nimport { isRecord } from \"../utils/is_record.ts\";\n\nexport type CookieSettings = {\n cookieDomain: string;\n cookiePrefix: string;\n cookiePath: string;\n cookieSameSite: \"Lax\" | \"Strict\" | \"None\";\n cookieSecure: boolean;\n cookieUpdate: boolean;\n cookieMaxAgeSeconds: number;\n forceCookieAttrsWrite: boolean;\n debug: boolean;\n};\n\nexport function resolveCookieSettings({\n propertyCfg,\n setParams,\n https,\n state,\n isDebugEnabled,\n}: {\n propertyCfg?: import(\"../types.ts\").PropertyConfig;\n setParams?: Record<string, unknown>;\n https?: boolean;\n state?: import(\"../types.ts\").RuntimeState;\n isDebugEnabled?: DebugEnabledFn;\n}): CookieSettings {\n const cfg: Record<string, unknown> = isRecord(propertyCfg) ? propertyCfg : {};\n const sp: Record<string, unknown> = isRecord(setParams) ? setParams : {};\n\n const cookieDomainRaw = cfg.cookie_domain ?? sp.cookie_domain;\n const cookieDomain =\n typeof cookieDomainRaw === \"string\" && cookieDomainRaw.trim()\n ? cookieDomainRaw\n : cookieDomainRaw == null\n ? \"auto\"\n : String(cookieDomainRaw);\n\n const cookiePrefixRaw = cfg.cookie_prefix ?? sp.cookie_prefix;\n const cookiePrefix = typeof cookiePrefixRaw === \"string\" ? cookiePrefixRaw : \"\";\n\n const cookiePathRaw = cfg.cookie_path ?? sp.cookie_path;\n const cookiePath =\n typeof cookiePathRaw === \"string\" && cookiePathRaw.trim() ? cookiePathRaw : \"/\";\n\n const cookieUpdateRaw = cfg.cookie_update ?? sp.cookie_update;\n const cookieUpdate = typeof cookieUpdateRaw === \"boolean\" ? cookieUpdateRaw : true;\n\n // NOTE: Do not default this to null; Number(null) === 0 which would set Max-Age=0\n // and immediately delete cookies in browsers.\n const cookieExpires = cfg.cookie_expires ?? sp.cookie_expires;\n const parsedExpires = Number.isFinite(Number(cookieExpires)) ? Number(cookieExpires) : null;\n // Default lifetime: 2 years for both client + per-property cookies.\n // (The per-property cookie contains session state, but the cookie itself persists.)\n const cookieMaxAgeSeconds = parsedExpires != null ? parsedExpires : 2 * 365 * 24 * 60 * 60;\n\n const flagsRaw = cfg.cookie_flags ?? sp.cookie_flags ?? \"\";\n const flags = parseCookieFlags(flagsRaw);\n const cookieSameSite: \"Lax\" | \"Strict\" | \"None\" = flags.sameSite || \"Lax\";\n // Cookie flags can request Secure, but we never set Secure on non-HTTPS pages.\n const cookieSecure = https === true && flags.secure === true ? true : https === true;\n const debug =\n typeof isDebugEnabled === \"function\" ? isDebugEnabled({ config: cfg, setParams: sp }) : false;\n\n // Detect attribute changes so we can apply security changes even when cookie_update=false.\n const sig = JSON.stringify({\n domain: cookieDomain,\n prefix: cookiePrefix,\n path: cookiePath,\n sameSite: cookieSameSite,\n secure: cookieSecure,\n maxAgeSeconds: cookieMaxAgeSeconds,\n });\n const sigKey = `${cookiePrefix}|${cookieDomain}|${cookiePath}`;\n if (state && !state.cookieAttrsSig) state.cookieAttrsSig = {};\n const prev = state?.cookieAttrsSig ? state.cookieAttrsSig[sigKey] : undefined;\n const forceCookieAttrsWrite = prev !== sig;\n if (state?.cookieAttrsSig) state.cookieAttrsSig[sigKey] = sig;\n\n return {\n cookieDomain,\n cookiePrefix,\n cookiePath,\n cookieSameSite,\n cookieSecure,\n cookieUpdate,\n cookieMaxAgeSeconds,\n forceCookieAttrsWrite,\n debug,\n };\n}\n", "import {\n buildD8aCookieName,\n parseD8aSessionCookie,\n serializeD8aSessionCookieTokens,\n updateD8aSessionCookieTokens,\n __internal as d8aCookiesInternal,\n} from \"./d8a_cookies.ts\";\nimport type { PropertyConfig, RuntimeState } from \"../types.ts\";\nimport type { CookieSettings } from \"./cookie_settings.ts\";\nimport { isRecord } from \"../utils/is_record.ts\";\n\ntype CookieJarLike = {\n get: (name: string) => string | undefined;\n set: (\n name: string,\n value: string,\n opts?: {\n domain?: string;\n path?: string;\n sameSite?: string;\n secure?: boolean;\n maxAgeSeconds?: number;\n },\n ) =>\n | { ok?: boolean; domain?: string | null; cookieStr?: string | null; attempts?: unknown[] }\n | unknown;\n};\n\nfunction pickCookieSetDebugFields(res: unknown) {\n if (!isRecord(res)) return {};\n return {\n ok: res.ok,\n domain: res.domain,\n cookieStr: res.cookieStr,\n attempts: res.attempts,\n };\n}\n\n/**\n * Updates shared session tokens once per event and writes the same serialized\n * session cookie value to each destination property cookie (when allowed).\n *\n * This preserves the current dispatcher behavior while making it testable and reusable.\n */\nexport function updateAndWriteSharedSession({\n state,\n destinations,\n jar,\n getPropertyConfig,\n resolveCookieSettings,\n sessionTimeoutMs,\n engagementTimeMs,\n engagedThresholdMs,\n nowMs,\n log,\n}: {\n state: RuntimeState;\n destinations: string[];\n jar: CookieJarLike;\n getPropertyConfig: (pid: string) => PropertyConfig;\n resolveCookieSettings: (pcfg: PropertyConfig) => CookieSettings;\n sessionTimeoutMs?: number;\n engagementTimeMs?: number;\n engagedThresholdMs?: number;\n nowMs?: number;\n log?: ((...args: unknown[]) => void) | null;\n}) {\n if (!state) return;\n if (!Array.isArray(destinations) || destinations.length === 0) return;\n if (!jar) return;\n if (typeof getPropertyConfig !== \"function\") return;\n if (typeof resolveCookieSettings !== \"function\") return;\n\n const now = Number.isFinite(Number(nowMs)) ? Number(nowMs) : Date.now();\n\n let tokens = Array.isArray(state.sharedSessionTokens) ? state.sharedSessionTokens : null;\n if (!tokens) {\n // Try to parse from any existing per-property cookie.\n for (const pid of destinations) {\n const pcfg = getPropertyConfig(pid);\n const cs = resolveCookieSettings(pcfg);\n const cookieName = buildD8aCookieName(pid, cs.cookiePrefix);\n const existing = jar.get(cookieName);\n const parsed = parseD8aSessionCookie(existing);\n if (parsed?.tokens) {\n tokens = parsed.tokens;\n break;\n }\n }\n }\n\n const updated = updateD8aSessionCookieTokens(tokens || null, { nowMs: now, sessionTimeoutMs });\n\n // Track engagement within the current session and flip `g` once threshold is reached.\n if (updated.isNewSession) {\n state.sessionEngagementMs = 0;\n state.sessionEngaged = false;\n }\n const prevG = d8aCookiesInternal.getToken(updated.tokens, \"g\");\n state.sessionEngagementMs =\n (Number(state.sessionEngagementMs) || 0) + (Number(engagementTimeMs) || 0);\n if (\n !state.sessionEngaged &&\n Number(engagedThresholdMs) > 0 &&\n state.sessionEngagementMs >= Number(engagedThresholdMs)\n ) {\n d8aCookiesInternal.setToken(updated.tokens, \"g\", 1);\n state.sessionEngaged = true;\n }\n const nextG = d8aCookiesInternal.getToken(updated.tokens, \"g\");\n const shouldWriteSessionValue = updated.isNewSession || prevG !== nextG;\n\n state.sharedSessionTokens = updated.tokens;\n state.sharedSessionValue = serializeD8aSessionCookieTokens(updated.tokens);\n\n // Write the same session cookie value to every destination property cookie.\n for (const pid of destinations) {\n const pcfg = getPropertyConfig(pid);\n const cs = resolveCookieSettings(pcfg);\n const cookieName = buildD8aCookieName(pid, cs.cookiePrefix);\n const existing = jar.get(cookieName);\n\n if (!existing) {\n // Always create missing cookie (recreation behavior).\n const res = jar.set(cookieName, state.sharedSessionValue, {\n domain: cs.cookieDomain,\n path: cs.cookiePath,\n sameSite: cs.cookieSameSite,\n secure: cs.cookieSecure,\n maxAgeSeconds: cs.cookieMaxAgeSeconds ?? undefined,\n });\n if (cs.debug)\n log?.(\"[d8a] set session cookie (create)\", {\n pid,\n cookieName,\n ...pickCookieSetDebugFields(res),\n cookieReadBack: jar.get(cookieName),\n });\n continue;\n }\n\n if (cs.cookieUpdate === true || shouldWriteSessionValue) {\n const res = jar.set(cookieName, state.sharedSessionValue, {\n domain: cs.cookieDomain,\n path: cs.cookiePath,\n sameSite: cs.cookieSameSite,\n secure: cs.cookieSecure,\n maxAgeSeconds: cs.cookieMaxAgeSeconds ?? undefined,\n });\n if (cs.debug)\n log?.(\"[d8a] set session cookie (value+attrs update)\", {\n pid,\n cookieName,\n ...pickCookieSetDebugFields(res),\n cookieReadBack: jar.get(cookieName),\n });\n continue;\n }\n\n if (cs.forceCookieAttrsWrite) {\n // Security attribute change: rewrite attrs without changing value when cookie_update=false.\n const res = jar.set(cookieName, existing, {\n domain: cs.cookieDomain,\n path: cs.cookiePath,\n sameSite: cs.cookieSameSite,\n secure: cs.cookieSecure,\n maxAgeSeconds: cs.cookieMaxAgeSeconds ?? undefined,\n });\n if (cs.debug)\n log?.(\"[d8a] set session cookie (attrs update)\", {\n pid,\n cookieName,\n ...pickCookieSetDebugFields(res),\n cookieReadBack: jar.get(cookieName),\n });\n continue;\n }\n\n if (cs.debug) {\n log?.(\"[d8a] set session cookie (no write)\", {\n pid,\n cookieName,\n reason:\n \"cookie_update=false and session value unchanged and force_cookie_attrs_write=false\",\n cookieUpdate: cs.cookieUpdate,\n shouldWriteSessionValue,\n forceCookieAttrsWrite: cs.forceCookieAttrsWrite,\n cookieReadBack: jar.get(cookieName),\n });\n }\n }\n}\n", "import { buildGa4CollectQueryParams } from \"../ga4/gtag_mapper.ts\";\nimport { resolveTrackingUrl } from \"../utils/endpoint.ts\";\nimport { getBrowserContext } from \"./browser_context.ts\";\nimport { sendWithRetries } from \"../transport/send.ts\";\nimport { createCookieJar } from \"../cookies/cookie_jar.ts\";\nimport { ensureClientId } from \"../cookies/identity.ts\";\nimport { buildD8aClientCookieName } from \"../cookies/d8a_cookies.ts\";\nimport { fetchUach, getUachCached, uachToParams } from \"./uach.ts\";\nimport { buildGcd, buildGcs } from \"../ga4/consent_wire.ts\";\nimport { getOrCreateAnonCid } from \"./anon_cid.ts\";\nimport { createEngagementTimer } from \"./engagement_timer.ts\";\nimport { getPropertyConfig, getPropertyIds } from \"./config_resolver.ts\";\nimport { getConsentParts, getEffectiveConsent } from \"./consent_resolver.ts\";\nimport { createDebugLogger } from \"./debug_logger.ts\";\nimport { resolveBool, resolveString } from \"./param_precedence.ts\";\nimport { resolveCookieSettings } from \"../cookies/cookie_settings.ts\";\nimport { updateAndWriteSharedSession } from \"../cookies/session_manager.ts\";\nimport { isRecord } from \"../utils/is_record.ts\";\nimport type { BrowserContext, PropertyConfig, RuntimeState, WindowLike } from \"../types.ts\";\n\nfunction normalizeSendTo(v: unknown) {\n if (typeof v === \"string\" && v.trim()) return [v.trim()];\n if (Array.isArray(v))\n return v.filter((x) => typeof x === \"string\" && x.trim()).map((x) => String(x).trim());\n return null;\n}\n\nexport function createDispatcher({\n windowRef,\n getState,\n}: {\n windowRef: WindowLike;\n getState: () => RuntimeState;\n}) {\n const w = windowRef;\n if (!w) throw new Error(\"createDispatcher: windowRef is required\");\n\n const queue: Array<{ name: string; params: Record<string, unknown> }> = [];\n let timerId: number | null = null;\n let lifecycleAttached = false;\n const jar = createCookieJar({ windowRef: w });\n\n // Kick off UA-CH fetching early, but don't block sends.\n fetchUach(w);\n\n // Engagement timer for `_et`.\n const engagementTimer = createEngagementTimer({ windowRef: w });\n engagementTimer.start();\n\n // Avoid emitting user_engagement on every tab switch. Only emit on\n // visibilitychange(hidden) when we have at least N ms of engaged time to flush.\n // Default 10s (configurable via `session_engagement_time_sec`).\n const USER_ENGAGEMENT_VISIBILITY_MIN_MS = 10_000;\n\n function getPrimaryConfig() {\n const ids = getPropertyIds(getState);\n const primaryId = ids[0] || \"\";\n return primaryId ? getPropertyConfig(getState, primaryId) : {};\n }\n\n function isDebugEnabled({ config, setParams }: { config: unknown; setParams: unknown }) {\n const cfg = isRecord(config) ? config : {};\n const sp = isRecord(setParams) ? setParams : {};\n return cfg.debug_mode === true || sp.debug_mode === true;\n }\n\n function isHttps() {\n try {\n return String(w?.location?.protocol || \"\").toLowerCase() === \"https:\";\n } catch {\n return false;\n }\n }\n\n function ensurePageLoadMs() {\n const s = getState();\n if (!s) return null;\n if (s.pageLoadMs != null) return s.pageLoadMs;\n if (s.jsDate instanceof Date && !Number.isNaN(s.jsDate.getTime())) {\n s.pageLoadMs = s.jsDate.getTime();\n return s.pageLoadMs;\n }\n s.pageLoadMs = Date.now();\n return s.pageLoadMs;\n }\n\n function enqueueEvent(name: string, params: Record<string, unknown>) {\n queue.push({ name, params: params || {} });\n\n const cfg = getPrimaryConfig();\n const maxBatchSize = Number(cfg?.max_batch_size ?? 25);\n if (queue.length >= maxBatchSize) {\n flush({ useBeacon: false });\n return;\n }\n\n ensureTimer();\n }\n\n function ensureTimer() {\n if (timerId != null) return;\n const cfg = getPrimaryConfig();\n const interval = Number(cfg?.flush_interval_ms ?? 1000);\n timerId = w.setTimeout(() => {\n timerId = null;\n flush({ useBeacon: false });\n }, interval);\n }\n\n async function flush({ useBeacon }: { useBeacon: boolean }) {\n if (timerId != null) {\n w.clearTimeout(timerId);\n timerId = null;\n }\n if (queue.length === 0) return { sent: 0 };\n\n const propertyIds = getPropertyIds(getState);\n const primaryId = propertyIds[0] || \"\";\n const cfgPrimary = primaryId ? getPropertyConfig(getState, primaryId) : {};\n const maxBatchSize = Number(cfgPrimary?.max_batch_size ?? 25);\n const batch = queue.splice(0, maxBatchSize);\n\n const consent = getEffectiveConsent(getState);\n const consentParts = getConsentParts(getState);\n const sessionTimeoutMsRaw = cfgPrimary[\"session_timeout_ms\"];\n const sessionTimeoutMs =\n typeof sessionTimeoutMsRaw === \"number\" ? sessionTimeoutMsRaw : 30 * 60 * 1000;\n const state = getState();\n const pageLoadMs = ensurePageLoadMs();\n\n const analyticsStorage = String(consent?.analytics_storage || \"\").toLowerCase();\n const analyticsDenied = analyticsStorage === \"denied\";\n const setParams = state?.set && typeof state.set === \"object\" ? state.set : {};\n const https = isHttps();\n const debugPrimary = isDebugEnabled({ config: cfgPrimary, setParams });\n const engagedThresholdSecRaw =\n cfgPrimary?.session_engagement_time_sec ?? setParams?.session_engagement_time_sec ?? 10;\n const engagedThresholdSec = Number.isFinite(Number(engagedThresholdSecRaw))\n ? Number(engagedThresholdSecRaw)\n : 10;\n const engagedThresholdMs = Math.max(0, Math.floor(engagedThresholdSec * 1000));\n\n const logger = createDebugLogger({ enabled: debugPrimary });\n logger.log(\"[d8a] flush\", {\n href: String(w?.location?.href || \"\"),\n propertyIds,\n analyticsStorage: analyticsStorage || \"(unset)\",\n analyticsDenied,\n cookieHeader: String(w?.document?.cookie || \"\"),\n });\n\n function resolveCookiesFor(propertyCfg: PropertyConfig) {\n return resolveCookieSettings({\n propertyCfg,\n setParams,\n https,\n state,\n isDebugEnabled,\n });\n }\n\n let sent = 0;\n for (const ev of batch) {\n const rawParams = isRecord(ev.params) ? ev.params : {};\n const sendTo = normalizeSendTo(rawParams[\"send_to\"]);\n const destinations = sendTo ? sendTo : propertyIds;\n if (!destinations || destinations.length === 0) continue;\n\n // Remove routing metadata from params so it doesn't end up in `ep.*`.\n const eventParams: Record<string, unknown> = { ...rawParams };\n delete eventParams[\"send_to\"];\n\n // Engagement time `_et`: active+visible+focused time since last reset.\n // We compute this once per event and reuse it:\n // - send as `_et`\n // - accumulate to flip session engagement (`seg`) after N seconds\n const engagementTimeMs = engagementTimer.getAndReset();\n\n // Shared session update (one per event) to keep per-property cookies identical.\n if (!analyticsDenied && state) {\n updateAndWriteSharedSession({\n state,\n destinations,\n jar,\n getPropertyConfig: (pid: string) => getPropertyConfig(getState, pid),\n resolveCookieSettings: resolveCookiesFor,\n sessionTimeoutMs,\n engagementTimeMs,\n engagedThresholdMs,\n nowMs: Date.now(),\n log: logger.enabled ? logger.log : null,\n });\n }\n\n // Maintain GA hit counter `_s` per session (shared).\n if (state) state.hitCounter = (state.hitCounter || 0) + 1;\n\n const sendPromises: Array<Promise<unknown>> = [];\n for (const pid of destinations) {\n const pcfg = getPropertyConfig(getState, pid);\n const collectBase = resolveTrackingUrl(pcfg);\n const cs = resolveCookiesFor(pcfg);\n\n const resolvedUserId = resolveString({\n key: \"user_id\",\n eventParams,\n config: pcfg,\n setParams,\n });\n const resolvedClientId = resolveString({\n key: \"client_id\",\n eventParams,\n config: pcfg,\n setParams,\n });\n const resolvedDebugMode =\n resolveBool({ key: \"debug_mode\", eventParams, config: pcfg, setParams }) === true;\n\n const campaign = {\n campaign_id: resolveString({ key: \"campaign_id\", eventParams, config: pcfg, setParams }),\n campaign_source: resolveString({\n key: \"campaign_source\",\n eventParams,\n config: pcfg,\n setParams,\n }),\n campaign_medium: resolveString({\n key: \"campaign_medium\",\n eventParams,\n config: pcfg,\n setParams,\n }),\n campaign_name: resolveString({\n key: \"campaign_name\",\n eventParams,\n config: pcfg,\n setParams,\n }),\n campaign_term: resolveString({\n key: \"campaign_term\",\n eventParams,\n config: pcfg,\n setParams,\n }),\n campaign_content: resolveString({\n key: \"campaign_content\",\n eventParams,\n config: pcfg,\n setParams,\n }),\n };\n const contentGroup = resolveString({\n key: \"content_group\",\n eventParams,\n config: pcfg,\n setParams,\n });\n\n const ignoreReferrer =\n resolveBool({ key: \"ignore_referrer\", eventParams, config: pcfg, setParams }) === true;\n\n const browser: BrowserContext & Record<string, unknown> = { ...getBrowserContext(w) };\n const pageLocation = resolveString({\n key: \"page_location\",\n eventParams,\n config: pcfg,\n setParams,\n });\n const pageTitle = resolveString({\n key: \"page_title\",\n eventParams,\n config: pcfg,\n setParams,\n });\n const pageReferrer = resolveString({\n key: \"page_referrer\",\n eventParams,\n config: pcfg,\n setParams,\n });\n const language = resolveString({ key: \"language\", eventParams, config: pcfg, setParams });\n const screenResolution = resolveString({\n key: \"screen_resolution\",\n eventParams,\n config: pcfg,\n setParams,\n });\n\n if (pageLocation) browser.dl = pageLocation;\n if (pageTitle) browser.dt = pageTitle;\n if (pageReferrer != null) browser.dr = pageReferrer;\n if (language) browser.ul = language;\n if (screenResolution) browser.sr = screenResolution;\n\n // Ensure client cookie exists for this property cookie namespace (if allowed).\n if (!analyticsDenied) {\n if (cs.debug) {\n const clientCookieName = buildD8aClientCookieName(cs.cookiePrefix);\n const clientCookieBefore = jar.get(clientCookieName);\n const clientRes = ensureClientId({\n jar,\n consent,\n cookieDomain: cs.cookieDomain,\n cookiePrefix: cs.cookiePrefix,\n cookiePath: cs.cookiePath,\n cookieSameSite: cs.cookieSameSite,\n cookieSecure: cs.cookieSecure,\n cookieMaxAgeSeconds: cs.cookieMaxAgeSeconds ?? undefined,\n cookieUpdate: cs.cookieUpdate,\n forceCookieAttrsWrite: cs.forceCookieAttrsWrite,\n });\n\n const clientCookieAction = !clientRes?.wrote\n ? \"no write\"\n : clientCookieBefore\n ? \"attrs update\"\n : \"create\";\n logger.log(`[d8a] set client cookie (${clientCookieAction})`, {\n pid,\n cookiePrefix: cs.cookiePrefix,\n result: clientRes,\n cookieName: clientCookieName,\n cookieBefore: clientCookieBefore,\n cookieReadBack: jar.get(clientCookieName),\n documentCookie: String(w?.document?.cookie || \"\"),\n });\n } else {\n ensureClientId({\n jar,\n consent,\n cookieDomain: cs.cookieDomain,\n cookiePrefix: cs.cookiePrefix,\n cookiePath: cs.cookiePath,\n cookieSameSite: cs.cookieSameSite,\n cookieSecure: cs.cookieSecure,\n cookieMaxAgeSeconds: cs.cookieMaxAgeSeconds ?? undefined,\n cookieUpdate: cs.cookieUpdate,\n forceCookieAttrsWrite: cs.forceCookieAttrsWrite,\n });\n }\n }\n\n const q = buildGa4CollectQueryParams({\n propertyId: pid,\n eventName: ev.name,\n eventParams,\n cookieHeader: analyticsDenied ? \"\" : String(w.document?.cookie || \"\"),\n clientId:\n resolvedClientId ||\n (analyticsDenied ? getOrCreateAnonCid({ windowRef: w, state }) : null),\n userId: resolvedUserId,\n cookiePrefix: cs.cookiePrefix,\n browser,\n ignoreReferrer,\n pageLoadMs: pageLoadMs != null ? Number(pageLoadMs) : null,\n hitCounter: state?.hitCounter ?? null,\n engagementTimeMs: engagementTimeMs != null ? Number(engagementTimeMs) : null,\n uachParams: uachToParams(getUachCached(w)),\n campaign,\n contentGroup: contentGroup || null,\n consentParams: {\n gcs: buildGcs({ consent: consentParts.consent }),\n gcd: buildGcd({\n consentDefault: consentParts.consentDefault,\n consentUpdate: consentParts.consentUpdate,\n }),\n },\n debugMode: resolvedDebugMode,\n });\n const url = `${collectBase}?${q.toString()}`;\n sendPromises.push(sendWithRetries({ url, windowRef: w, useBeacon }));\n }\n if (sendPromises.length > 0) {\n await Promise.all(sendPromises);\n sent += sendPromises.length;\n }\n }\n\n // If there are more events pending, schedule another flush.\n if (queue.length > 0) ensureTimer();\n return { sent };\n }\n\n function flushNow({ useBeacon = false }: { useBeacon?: boolean } = {}) {\n return flush({ useBeacon: useBeacon === true });\n }\n\n function attachLifecycleFlush() {\n if (!w?.addEventListener) return;\n if (lifecycleAttached) return;\n lifecycleAttached = true;\n\n w.addEventListener(\"pagehide\", () => {\n // Ensure user_engagement carries the accumulated engagement time.\n try {\n const ids = getPropertyIds(getState);\n if (ids.length > 0 && engagementTimer.peek() > 0) {\n queue.unshift({ name: \"user_engagement\", params: {} });\n }\n } catch {\n // ignore\n }\n flush({ useBeacon: false });\n });\n\n if (w.document?.addEventListener) {\n w.document.addEventListener(\"visibilitychange\", () => {\n if (w.document.hidden) {\n try {\n const ids = getPropertyIds(getState);\n if (ids.length > 0 && engagementTimer.peek() >= USER_ENGAGEMENT_VISIBILITY_MIN_MS) {\n queue.unshift({ name: \"user_engagement\", params: {} });\n }\n } catch {\n // ignore\n }\n // Always use fetch(keepalive) on lifecycle flushes (no sendBeacon/ping).\n flush({ useBeacon: false });\n }\n });\n }\n }\n\n return { enqueueEvent, flush, flushNow, attachLifecycleFlush };\n}\n", "function safeString(v: unknown) {\n return typeof v === \"string\" ? v : \"\";\n}\n\nimport { isRecord } from \"../utils/is_record.ts\";\n\ntype CurrentScriptLike = { src?: unknown };\ntype DocumentLike = { currentScript?: unknown; location?: { href?: unknown } };\n\nfunction detectFromCurrentScript(documentRef: unknown, key: string) {\n try {\n const doc = isRecord(documentRef) ? (documentRef as DocumentLike) : null;\n const cs = doc && isRecord(doc.currentScript) ? (doc.currentScript as CurrentScriptLike) : null;\n const src = safeString(cs?.src);\n if (!src) return \"\";\n const baseHref = doc && isRecord(doc.location) ? safeString(doc.location?.href) : \"\";\n const u = new URL(src, baseHref || undefined);\n return safeString(u.searchParams.get(key));\n } catch {\n return \"\";\n }\n}\n\nexport function resolveDataLayerName({\n windowRef,\n dataLayerName,\n}: {\n windowRef?: import(\"../types.ts\").WindowLike;\n dataLayerName?: unknown;\n}) {\n // Explicit override (ESM usage or programmatic install)\n if (typeof dataLayerName === \"string\" && dataLayerName.trim()) return dataLayerName.trim();\n\n // Optional global hint (script-tag usage if desired)\n const hinted = safeString(windowRef?.d8aDataLayerName);\n if (hinted.trim()) return hinted.trim();\n\n // Script src query param `?l=...`\n const fromScript = detectFromCurrentScript(windowRef?.document, \"l\");\n if (fromScript.trim()) return fromScript.trim();\n\n // Default to avoid collisions with GTM/gtag which commonly use `dataLayer`.\n return \"d8aLayer\";\n}\n\nexport function resolveGlobalName({\n windowRef,\n globalName,\n}: {\n windowRef?: import(\"../types.ts\").WindowLike;\n globalName?: unknown;\n}) {\n // Explicit override (ESM usage or programmatic install)\n if (typeof globalName === \"string\" && globalName.trim()) return globalName.trim();\n\n // Optional global hint (script-tag usage if desired)\n const hinted = safeString(windowRef?.d8aGlobalName);\n if (hinted.trim()) return hinted.trim();\n\n // Script src query param `?g=...`\n const fromScript = detectFromCurrentScript(windowRef?.document, \"g\");\n if (fromScript.trim()) return fromScript.trim();\n\n return \"d8a\";\n}\n\nexport function resolveGtagDataLayerName({\n windowRef,\n gtagDataLayerName,\n}: {\n windowRef?: import(\"../types.ts\").WindowLike;\n gtagDataLayerName?: unknown;\n}) {\n // Explicit override (ESM usage or programmatic install)\n if (typeof gtagDataLayerName === \"string\" && gtagDataLayerName.trim())\n return gtagDataLayerName.trim();\n\n // Optional global hint (script-tag usage if desired)\n const hinted = safeString(windowRef?.d8aGtagDataLayerName);\n if (hinted.trim()) return hinted.trim();\n\n // Script src query param `?gl=...` (consent queue name)\n const fromScript = detectFromCurrentScript(windowRef?.document, \"gl\");\n if (fromScript.trim()) return fromScript.trim();\n\n // Default gtag/GTM queue name.\n return \"dataLayer\";\n}\n", "/**\n * Mirrors Consent Mode commands pushed into `window.dataLayer` (via `gtag(...)`)\n * into d8a runtime state.\n *\n * Requirement: prefer gtag consent state if available; fall back to d8a consent\n * otherwise.\n *\n * We intentionally only consume `consent` commands and leave all other gtag/GTM\n * plumbing alone.\n */\nimport { maybeEmitConsentUpdatePing } from \"./consent_update_ping.ts\";\nimport { isRecord } from \"../utils/is_record.ts\";\nimport type { ConsentState, RuntimeState, WindowLike } from \"../types.ts\";\nimport { ensureArraySlot, getWindowSlot, setWindowSlot } from \"../utils/window_slots.ts\";\n\nconst HUBS_KEY = \"__d8aConsentBridgeHubs\";\n\ntype DataLayerLike = Array<unknown> & {\n push: (...args: unknown[]) => number;\n __d8aConsentBridgePatched?: boolean;\n};\n\ntype DataLayerHub = {\n subscribers: Set<(args: unknown[]) => void>;\n originalPush: ((...args: unknown[]) => number) | null;\n patched: boolean;\n dataLayerName: string;\n};\n\ntype HubsMap = Record<string, DataLayerHub>;\n\ntype ConsentAction = \"default\" | \"update\";\ntype GtagConsentCommand = [\"consent\", ConsentAction, ConsentState];\n\nfunction isHubsMap(v: unknown): v is HubsMap {\n // This slot is owned by this module, so the same `isRecord()` check we used before\n // is sufficient for our type purposes (behavior-preserving).\n return isRecord(v);\n}\n\nfunction getHub(w: WindowLike, dataLayerName: unknown) {\n if (!w) return null;\n const dl = String(dataLayerName || \"dataLayer\");\n const existingHubs = getWindowSlot<unknown>(w, HUBS_KEY);\n const hubs: HubsMap = isHubsMap(existingHubs) ? existingHubs : {};\n if (!existingHubs || existingHubs !== hubs) setWindowSlot(w, HUBS_KEY, hubs);\n\n const existing = hubs[dl];\n if (existing && typeof existing === \"object\") return existing;\n\n const hub: DataLayerHub = {\n subscribers: new Set<(args: unknown[]) => void>(),\n originalPush: null,\n patched: false,\n dataLayerName: dl,\n };\n hubs[dl] = hub;\n return hub;\n}\n\nexport function createGtagConsentBridge({\n windowRef,\n getState,\n dataLayerName = \"dataLayer\",\n}: {\n windowRef?: WindowLike;\n getState: () => RuntimeState;\n dataLayerName?: string;\n}) {\n if (!windowRef) throw new Error(\"createGtagConsentBridge: windowRef is required\");\n const w = windowRef;\n if (!w) throw new Error(\"createGtagConsentBridge: windowRef is required\");\n if (typeof getState !== \"function\")\n throw new Error(\"createGtagConsentBridge: getState is required\");\n\n let started = false;\n let unsubscribe: null | (() => void) = null;\n\n function normalizeDataLayerItem(item: unknown) {\n // gtag snippet pushes `arguments` (array-like), but sometimes arrays are used.\n const maybeArrayLikeLength = isRecord(item) ? item.length : null;\n if (item && typeof maybeArrayLikeLength === \"number\" && typeof item !== \"string\") {\n try {\n return Array.from(item as ArrayLike<unknown>);\n } catch {\n return null;\n }\n }\n if (Array.isArray(item)) return item;\n return null;\n }\n\n function applyConsentPatch({ action, patch }: { action: string; patch: ConsentState }) {\n const state = getState();\n if (!state) return;\n\n if (action === \"default\") {\n state.consentDefaultGtag = { ...(state.consentDefaultGtag || {}), ...(patch || {}) };\n } else if (action === \"update\") {\n state.consentUpdateGtag = { ...(state.consentUpdateGtag || {}), ...(patch || {}) };\n } else {\n return;\n }\n state.consentGtag = { ...(state.consentDefaultGtag || {}), ...(state.consentUpdateGtag || {}) };\n maybeEmitConsentUpdatePing(getState);\n }\n\n function parseConsentCommand(args: unknown[]): GtagConsentCommand | null {\n const [cmd, a, b] = args;\n if (cmd !== \"consent\") return null;\n const action = String(a || \"\");\n if (action !== \"default\" && action !== \"update\") return null;\n if (!isRecord(b)) return null;\n return [\"consent\", action, b];\n }\n\n function handleArgs(args: unknown[]) {\n const c = parseConsentCommand(args);\n if (!c) return;\n const [, action, patch] = c;\n applyConsentPatch({ action, patch });\n }\n\n function drainExisting() {\n const dl = dataLayerName;\n const dlArr = getWindowSlot<unknown>(w, dl);\n if (!Array.isArray(dlArr)) return;\n for (const item of dlArr) {\n const args = normalizeDataLayerItem(item);\n if (!args) continue;\n handleArgs(args);\n }\n }\n\n function patchPush() {\n const dl = dataLayerName;\n const dlArr = ensureArraySlot<unknown>(w, dl) as DataLayerLike;\n\n const hub = getHub(w, dl);\n if (!hub) return;\n\n // Avoid double-patching (hub fan-outs to all subscribers).\n if (hub.patched) return;\n\n hub.originalPush = dlArr.push.bind(dlArr);\n dlArr.push = function patchedPush(...forwarded: unknown[]) {\n const item = forwarded[0];\n const args = normalizeDataLayerItem(item);\n if (args) {\n for (const sub of hub.subscribers) {\n try {\n sub(args);\n } catch {\n // ignore subscriber errors\n }\n }\n }\n return (hub.originalPush as (...args: unknown[]) => number)(...forwarded);\n };\n hub.patched = true;\n dlArr.__d8aConsentBridgePatched = true;\n }\n\n function start() {\n if (started) return;\n started = true;\n\n const hub = getHub(w, dataLayerName);\n if (!hub) return;\n hub.subscribers.add(handleArgs);\n unsubscribe = () => {\n hub.subscribers.delete(handleArgs);\n };\n\n drainExisting();\n patchPush();\n }\n\n return {\n start,\n stop: () => {\n if (!started) return;\n const dl = dataLayerName;\n const hub = getHub(w, dl);\n if (!hub) return;\n if (typeof unsubscribe === \"function\") unsubscribe();\n unsubscribe = null;\n\n const dlArrMaybe = getWindowSlot<unknown>(w, dl);\n if (hub.subscribers.size === 0 && hub.originalPush && Array.isArray(dlArrMaybe)) {\n const dlArr = dlArrMaybe as DataLayerLike;\n dlArr.push = hub.originalPush;\n hub.originalPush = null;\n hub.patched = false;\n try {\n delete dlArr.__d8aConsentBridgePatched;\n const maybeHubs = getWindowSlot<unknown>(w, HUBS_KEY);\n const hubs = isRecord(maybeHubs) ? (maybeHubs as HubsMap) : null;\n if (hubs) {\n delete hubs[dl];\n if (Object.keys(hubs).length === 0) setWindowSlot(w, HUBS_KEY, undefined);\n }\n } catch {\n // ignore\n }\n }\n started = false;\n },\n };\n}\n", "import { getPropertyConfig, getPropertyIds, getSetParams } from \"./config_resolver.ts\";\nimport type { RuntimeState, WindowLike } from \"../types.ts\";\nimport { isRecord } from \"../utils/is_record.ts\";\n\nfunction parseList(v: unknown, fallback: string[] = []) {\n if (Array.isArray(v)) return v.map((x) => String(x).trim()).filter(Boolean);\n if (typeof v === \"string\") {\n return v\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return fallback;\n}\n\nfunction safeUrl(href: unknown, baseHref: unknown) {\n try {\n return new URL(String(href || \"\"), baseHref ? String(baseHref) : undefined);\n } catch {\n return null;\n }\n}\n\ntype NodeLike = Record<string, unknown> & { parentNode?: unknown; tagName?: unknown };\ntype ElementLike = NodeLike & { getAttribute?: (name: string) => unknown };\n\nfunction closestAnchor(node: unknown) {\n let n = node;\n for (let i = 0; i < 100 && n; i += 1) {\n const nn = isRecord(n) ? (n as NodeLike) : null;\n const tag = String(nn?.tagName || \"\").toLowerCase();\n if (tag === \"a\" || tag === \"area\") return n;\n n = (nn?.parentNode as unknown) || null;\n }\n return null;\n}\n\nfunction getAttr(el: unknown, name: string) {\n if (!el) return null;\n const ee = isRecord(el) ? (el as ElementLike) : null;\n try {\n if (typeof ee?.getAttribute === \"function\") {\n const attr = ee.getAttribute(name);\n if (attr != null) return attr;\n }\n } catch {\n // ignore\n }\n const v = ee ? ee[name] : null;\n return v != null ? String(v) : null;\n}\n\nfunction isHttpUrl(u: unknown) {\n const p = String((u as { protocol?: unknown } | null)?.protocol || \"\").toLowerCase();\n return p === \"http:\" || p === \"https:\";\n}\n\nfunction hostnameMatches(host: unknown, domain: unknown) {\n const h = String(host || \"\").toLowerCase();\n const d = String(domain || \"\")\n .toLowerCase()\n .replace(/^\\./, \"\");\n if (!h || !d) return false;\n return h === d || h.endsWith(`.${d}`);\n}\n\nfunction fileNameFromUrl(u: unknown) {\n const p = String((u as { pathname?: unknown } | null)?.pathname || \"\");\n const seg = p.split(\"/\").filter(Boolean).slice(-1)[0] || \"\";\n return seg;\n}\n\nfunction fileExtension(name: unknown) {\n const n = String(name || \"\");\n const idx = n.lastIndexOf(\".\");\n if (idx < 0) return \"\";\n return n.slice(idx + 1).toLowerCase();\n}\n\nfunction normalizeWhitespace(s: unknown) {\n return String(s || \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction getLinkId(a: unknown) {\n const v = getAttr(a, \"id\");\n const out = normalizeWhitespace(v);\n return out || null;\n}\n\nfunction getLinkClasses(a: unknown) {\n // Most reliable is className; fall back to attribute.\n const v = getAttr(a, \"className\") || getAttr(a, \"class\");\n const out = normalizeWhitespace(v);\n return out || null;\n}\n\nfunction getLinkText(a: unknown) {\n const v = getAttr(a, \"textContent\") || getAttr(a, \"innerText\");\n const out = normalizeWhitespace(v);\n return out || null;\n}\n\nexport function createEnhancedMeasurement({\n windowRef,\n getState,\n dispatcher,\n}: {\n windowRef: WindowLike;\n getState: () => RuntimeState;\n dispatcher: {\n enqueueEvent: (name: string, params: Record<string, unknown>) => void;\n flushNow?: (opts?: { useBeacon?: boolean }) => unknown;\n };\n}) {\n const w = windowRef;\n if (!w) throw new Error(\"createEnhancedMeasurement: windowRef is required\");\n if (typeof getState !== \"function\")\n throw new Error(\"createEnhancedMeasurement: getState is required\");\n if (!dispatcher) throw new Error(\"createEnhancedMeasurement: dispatcher is required\");\n\n type BoolKey = \"site_search_enabled\" | \"outbound_clicks_enabled\" | \"file_downloads_enabled\";\n type ListKey =\n | \"site_search_query_params\"\n | \"outbound_exclude_domains\"\n | \"file_download_extensions\";\n\n function readBoolKey(source: Record<string, unknown>, key: BoolKey): boolean | undefined {\n const v = source[key];\n return typeof v === \"boolean\" ? v : undefined;\n }\n\n function readListKey(source: Record<string, unknown>, key: ListKey): unknown {\n return source[key];\n }\n\n function isEnabledForProperty({\n propertyId,\n key,\n defaultValue,\n }: {\n propertyId: string;\n key: BoolKey;\n defaultValue: boolean;\n }) {\n const setParams = getSetParams(getState);\n const cfg = getPropertyConfig(getState, propertyId);\n const c = readBoolKey(cfg, key);\n if (c != null) return c;\n const s = readBoolKey(setParams, key);\n if (s != null) return s;\n return defaultValue;\n }\n\n function getListForProperty({\n propertyId,\n key,\n defaultList,\n }: {\n propertyId: string;\n key: ListKey;\n defaultList: string[];\n }) {\n const setParams = getSetParams(getState);\n const cfg = getPropertyConfig(getState, propertyId);\n const cfgV = readListKey(cfg, key);\n const setV = readListKey(setParams, key);\n if (cfgV != null) return parseList(cfgV, defaultList);\n if (setV != null) return parseList(setV, defaultList);\n return defaultList;\n }\n\n function markInstalledOnce() {\n const s = getState();\n if (!s) return false;\n if (s.emInstalled) return false;\n s.emInstalled = true;\n return true;\n }\n\n function markSiteSearchOnce() {\n const s = getState();\n if (!s) return false;\n if (s.emSiteSearchFired) return false;\n s.emSiteSearchFired = true;\n return true;\n }\n\n function maybeFireSiteSearch() {\n const propertyIds = getPropertyIds(getState);\n // If no properties are configured yet, do nothing (and don't mark fired).\n if (propertyIds.length === 0) return;\n\n // Only run once per page load per instance (user request: no SPA tracking).\n if (!markSiteSearchOnce()) return;\n\n const search = String(w?.location?.search || \"\");\n if (!search || search === \"?\") return;\n const sp = new URLSearchParams(search.startsWith(\"?\") ? search.slice(1) : search);\n\n const defaultKeys = [\"q\", \"s\", \"search\", \"query\", \"keyword\"];\n\n // Determine which properties have a search term, and group by term value.\n const termToProps = new Map<string, string[]>();\n for (const pid of propertyIds) {\n const enabled = isEnabledForProperty({\n propertyId: pid,\n key: \"site_search_enabled\",\n defaultValue: true,\n });\n if (!enabled) continue;\n const keys = getListForProperty({\n propertyId: pid,\n key: \"site_search_query_params\",\n defaultList: defaultKeys,\n });\n let found = \"\";\n for (const k of keys) {\n const v = sp.get(k);\n if (v && String(v).trim()) {\n found = String(v).trim();\n break;\n }\n }\n if (!found) continue;\n const list = termToProps.get(found) || [];\n list.push(pid);\n termToProps.set(found, list);\n }\n\n for (const [term, pids] of termToProps.entries()) {\n dispatcher.enqueueEvent(\"view_search_results\", {\n search_term: term,\n send_to: pids,\n });\n }\n }\n\n function shouldTrackOutbound({\n propertyId,\n linkHostname,\n }: {\n propertyId: string;\n linkHostname: string;\n }) {\n const enabled = isEnabledForProperty({\n propertyId,\n key: \"outbound_clicks_enabled\",\n defaultValue: true,\n });\n if (!enabled) return false;\n\n const excludes = getListForProperty({\n propertyId,\n key: \"outbound_exclude_domains\",\n defaultList: [String(w?.location?.hostname || \"\")],\n });\n for (const d of excludes) {\n if (hostnameMatches(linkHostname, d)) return false;\n }\n return true;\n }\n\n function shouldTrackDownload({ propertyId, ext }: { propertyId: string; ext: string }) {\n const enabled = isEnabledForProperty({\n propertyId,\n key: \"file_downloads_enabled\",\n defaultValue: true,\n });\n if (!enabled) return false;\n const list = getListForProperty({\n propertyId,\n key: \"file_download_extensions\",\n defaultList: [\n \"pdf\",\n \"doc\",\n \"docx\",\n \"xls\",\n \"xlsx\",\n \"ppt\",\n \"pptx\",\n \"csv\",\n \"txt\",\n \"rtf\",\n \"zip\",\n \"rar\",\n \"7z\",\n \"dmg\",\n \"exe\",\n \"apk\",\n ],\n });\n const set = new Set(list.map((x) => String(x).toLowerCase().replace(/^\\./, \"\")));\n return !!ext && set.has(String(ext).toLowerCase().replace(/^\\./, \"\"));\n }\n\n function onClick(evt: unknown) {\n const propertyIds = getPropertyIds(getState);\n if (propertyIds.length === 0) return;\n\n const target = isRecord(evt) ? evt.target : null;\n const a = closestAnchor(target);\n if (!a) return;\n\n const href = getAttr(a, \"href\");\n if (!href) return;\n const u = safeUrl(href, String(w?.location?.href || \"\"));\n if (!u || !isHttpUrl(u)) return;\n\n const linkUrl = String(u.href || \"\");\n const linkHostname = String(u.hostname || \"\");\n\n const linkId = getLinkId(a);\n const linkClasses = getLinkClasses(a);\n const linkText = getLinkText(a);\n\n const fileName = fileNameFromUrl(u) || getAttr(a, \"download\") || \"\";\n const ext = fileExtension(fileName);\n\n // Determine destinations per-event (per-property config).\n const downloadDestinations: string[] = [];\n const outboundDestinations: string[] = [];\n for (const pid of propertyIds) {\n if (shouldTrackDownload({ propertyId: pid, ext })) downloadDestinations.push(pid);\n if (shouldTrackOutbound({ propertyId: pid, linkHostname })) outboundDestinations.push(pid);\n }\n\n // Prefer file_download over outbound click if both apply.\n if (downloadDestinations.length > 0) {\n dispatcher.enqueueEvent(\"file_download\", {\n link_url: linkUrl,\n ...(linkId ? { link_id: linkId } : {}),\n ...(linkClasses ? { link_classes: linkClasses } : {}),\n ...(linkText ? { link_text: linkText } : {}),\n file_name: fileName,\n file_extension: ext,\n send_to: downloadDestinations,\n });\n // For click-driven events prefer fetch(keepalive) instead of sendBeacon,\n // since some browsers/extensions block beacons/pings by default.\n dispatcher.flushNow?.({ useBeacon: false });\n return;\n }\n\n if (outboundDestinations.length > 0) {\n dispatcher.enqueueEvent(\"click\", {\n link_url: linkUrl,\n ...(linkId ? { link_id: linkId } : {}),\n ...(linkClasses ? { link_classes: linkClasses } : {}),\n link_domain: linkHostname,\n outbound: \"1\",\n send_to: outboundDestinations,\n });\n // For click-driven events prefer fetch(keepalive) instead of sendBeacon,\n // since some browsers/extensions block beacons/pings by default.\n dispatcher.flushNow?.({ useBeacon: false });\n }\n }\n\n function start() {\n // Attach listeners only once per instance.\n if (!markInstalledOnce()) return;\n\n // Site search: check once on page load (after config is available). If config\n // isn't available yet (programmatic installs), retry once asynchronously.\n try {\n maybeFireSiteSearch();\n if (!getState()?.emSiteSearchFired && typeof w?.setTimeout === \"function\") {\n w.setTimeout(() => {\n try {\n maybeFireSiteSearch();\n } catch {\n // ignore\n }\n }, 0);\n }\n } catch {\n // ignore\n }\n\n // Outbound/download: click listeners.\n const doc = w?.document;\n if (doc && typeof doc.addEventListener === \"function\") {\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"auxclick\", onClick, true);\n }\n }\n\n function onConfig() {\n try {\n maybeFireSiteSearch();\n } catch {\n // ignore\n }\n }\n\n return { start, onConfig };\n}\n", "import { parseCookieHeader, createCookieJar } from \"../cookies/cookie_jar.ts\";\nimport {\n buildD8aClientCookieName,\n buildD8aCookieName,\n parseD8aClientCookie,\n parseD8aSessionCookie,\n} from \"../cookies/d8a_cookies.ts\";\nimport { applyClientIdCookie, applySessionCookie } from \"../cookies/identity.ts\";\nimport { resolveCookieSettings, type CookieSettings } from \"../cookies/cookie_settings.ts\";\nimport { getEffectiveConsent } from \"./consent_resolver.ts\";\nimport { getPropertyConfig, getPropertyIds, getSetParams } from \"./config_resolver.ts\";\nimport { isRecord } from \"../utils/is_record.ts\";\nimport { getWindowSlot, setWindowSlot } from \"../utils/window_slots.ts\";\nimport type {\n IncomingDlPayload,\n LinkerConfig,\n LinkerUrlPosition,\n RuntimeState,\n WindowLike,\n} from \"../types.ts\";\n\nconst DL_PARAM = \"_dl\";\nconst DL_VERSION = \"1\";\n\n// Web-safe base64 (Base64URL alphabet, RFC 4648 \u00A75)\nconst B64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\nconst B64_PAD = \"=\";\nlet B64_REV: Record<string, number> | null = null;\nfunction b64Rev() {\n if (B64_REV) return B64_REV;\n const rev: Record<string, number> = {};\n for (let i = 0; i < B64_ALPHABET.length; i += 1) rev[B64_ALPHABET[i]!] = i;\n // Accept both padded and unpadded inputs, and tolerate '.' as padding for backward compatibility.\n rev[B64_PAD] = 64;\n rev[\".\"] = 64;\n B64_REV = rev;\n return rev;\n}\n\nfunction utf8Encode(s: string): Uint8Array {\n try {\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s);\n } catch {\n // ignore\n }\n // ASCII-safe fallback (cookie values should be ASCII)\n const out = new Uint8Array(s.length);\n for (let i = 0; i < s.length; i += 1) out[i] = s.charCodeAt(i) & 0xff;\n return out;\n}\n\nfunction utf8Decode(bytes: Uint8Array): string {\n try {\n if (typeof TextDecoder !== \"undefined\") return new TextDecoder().decode(bytes);\n } catch {\n // ignore\n }\n let s = \"\";\n for (let i = 0; i < bytes.length; i += 1) s += String.fromCharCode(bytes[i]!);\n return s;\n}\n\nfunction webSafeBase64Encode(raw: string): string {\n const bytes = utf8Encode(raw);\n const out: string[] = [];\n for (let i = 0; i < bytes.length; i += 3) {\n const has2 = i + 1 < bytes.length;\n const has3 = i + 2 < bytes.length;\n const b1 = bytes[i]!;\n const b2 = has2 ? bytes[i + 1]! : 0;\n const b3 = has3 ? bytes[i + 2]! : 0;\n\n const c1 = b1 >> 2;\n const c2 = ((b1 & 0x03) << 4) | (b2 >> 4);\n let c3 = ((b2 & 0x0f) << 2) | (b3 >> 6);\n let c4 = b3 & 0x3f;\n if (!has3) {\n c4 = 64; // '.'\n if (!has2) c3 = 64; // '.'\n }\n out.push(\n B64_ALPHABET[c1]!,\n B64_ALPHABET[c2]!,\n c3 === 64 ? B64_PAD : B64_ALPHABET[c3]!,\n c4 === 64 ? B64_PAD : B64_ALPHABET[c4]!,\n );\n }\n // Strip padding to keep URLs short (decoder tolerates missing padding).\n return out.join(\"\").replace(/=+$/, \"\");\n}\n\nfunction webSafeBase64Decode(enc: string): string {\n const s = String(enc || \"\");\n const rev = b64Rev();\n const bytes: number[] = [];\n let i = 0;\n\n function next(defaultValue: number): number {\n for (; i < s.length; ) {\n const ch = s.charAt(i++);\n const v = rev[ch];\n if (v != null) return v;\n if (!/^[\\s\\xa0]*$/.test(ch)) throw new Error(`Invalid base64 char: ${ch}`);\n }\n return defaultValue;\n }\n\n for (;;) {\n const e = next(-1);\n const f = next(0);\n const g = next(64);\n const h = next(64);\n\n // End of input\n if (h === 64 && e === -1) break;\n\n bytes.push(((e << 2) | (f >> 4)) & 0xff);\n if (g !== 64) {\n bytes.push((((f << 4) & 0xf0) | (g >> 2)) & 0xff);\n if (h !== 64) bytes.push((((g << 6) & 0xc0) | h) & 0xff);\n }\n }\n\n return utf8Decode(new Uint8Array(bytes));\n}\n\nfunction isHttps(w: WindowLike) {\n try {\n return String(w?.location?.protocol || \"\").toLowerCase() === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction resolveLinkerConfig(cfg: LinkerConfig): Required<LinkerConfig> {\n const domains = Array.isArray(cfg?.domains)\n ? cfg.domains.filter((x) => typeof x === \"string\")\n : [];\n const hasDomains = domains.length > 0;\n return {\n domains,\n accept_incoming: typeof cfg?.accept_incoming === \"boolean\" ? cfg.accept_incoming : hasDomains,\n decorate_forms: typeof cfg?.decorate_forms === \"boolean\" ? cfg.decorate_forms : false,\n url_position: cfg?.url_position === \"fragment\" ? \"fragment\" : \"query\",\n };\n}\n\nfunction splitUrl(u: string) {\n // Split into base/query/fragment.\n const m = String(u || \"\").match(/([^?#]+)(\\?[^#]*)?(#.*)?/);\n if (!m) return { base: String(u || \"\"), query: \"\", fragment: \"\" };\n return { base: m[1] || \"\", query: m[2] || \"\", fragment: m[3] || \"\" };\n}\n\nfunction parseParams(part: string, lead: \"?\" | \"#\") {\n const raw = String(part || \"\");\n const s = raw.startsWith(lead) ? raw.slice(1) : raw;\n const out: Array<[string, string]> = [];\n if (!s) return out;\n for (const kv of s.split(\"&\")) {\n const item = kv.trim();\n if (!item) continue;\n const idx = item.indexOf(\"=\");\n if (idx < 0) {\n out.push([decodeURIComponent(item), \"\"]);\n continue;\n }\n const k = decodeURIComponent(item.slice(0, idx));\n const v = decodeURIComponent(item.slice(idx + 1));\n out.push([k, v]);\n }\n return out;\n}\n\nfunction buildParams(pairs: Array<[string, string]>, lead: \"?\" | \"#\") {\n if (!pairs || pairs.length === 0) return \"\";\n const encoded = pairs\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join(\"&\");\n return lead + encoded;\n}\n\nfunction getParamFromUrl(\n url: string,\n name: string,\n): { value: string | null; where: \"query\" | \"fragment\" | null } {\n const { query, fragment } = splitUrl(url);\n for (const [k, v] of parseParams(query, \"?\")) {\n if (k === name) return { value: v, where: \"query\" };\n }\n for (const [k, v] of parseParams(fragment, \"#\")) {\n if (k === name) return { value: v, where: \"fragment\" };\n }\n return { value: null, where: null };\n}\n\nfunction stripParamFromUrl(url: string, name: string) {\n const { base, query, fragment } = splitUrl(url);\n const q = parseParams(query, \"?\").filter(([k]) => k !== name);\n const f = parseParams(fragment, \"#\").filter(([k]) => k !== name);\n return `${base}${buildParams(q, \"?\")}${buildParams(f, \"#\")}`;\n}\n\nfunction setParamInUrl(url: string, name: string, value: string, pos: LinkerUrlPosition) {\n const { base, query, fragment } = splitUrl(url);\n if (pos === \"fragment\") {\n const f = parseParams(fragment, \"#\").filter(([k]) => k !== name);\n f.push([name, value]);\n return `${base}${query}${buildParams(f, \"#\")}`;\n }\n const q = parseParams(query, \"?\").filter(([k]) => k !== name);\n q.push([name, value]);\n return `${base}${buildParams(q, \"?\")}${fragment}`;\n}\n\nfunction getHostnameFromUrl(url: string, baseHref: string | undefined) {\n try {\n // Prefer URL for correctness (handles relative urls)\n const u = new URL(url, baseHref || \"https://example.invalid/\");\n return String(u.hostname || \"\");\n } catch {\n // Very small fallback: try to parse `//host/` form.\n const m = String(url || \"\").match(/^https?:\\/\\/([^/]+)/i);\n return m ? String(m[1] || \"\") : \"\";\n }\n}\n\nfunction shouldDecorateHost(hostname: string, domains: string[]) {\n const host = String(hostname || \"\");\n if (!host) return false;\n for (const d of domains) {\n const dom = String(d || \"\").trim();\n if (!dom) continue;\n if (host.indexOf(dom) >= 0) return true;\n }\n return false;\n}\n\n// CRC32 (base36) fingerprint hash\nlet CRC_TABLE: number[] | null = null;\nfunction crcTable() {\n if (CRC_TABLE) return CRC_TABLE;\n const t: number[] = new Array(256);\n for (let i = 0; i < 256; i += 1) {\n let c = i;\n for (let j = 0; j < 8; j += 1) {\n c = c & 1 ? (c >>> 1) ^ 0xedb88320 : c >>> 1;\n }\n t[i] = c >>> 0;\n }\n CRC_TABLE = t;\n return t;\n}\n\nfunction crc32Base36(s: string) {\n const tbl = crcTable();\n let crc = 0xffffffff;\n for (let i = 0; i < s.length; i += 1) {\n const code = s.charCodeAt(i);\n crc = (crc >>> 8) ^ tbl[(crc ^ code) & 0xff];\n }\n const out = (crc ^ 0xffffffff) >>> 0;\n return out.toString(36);\n}\n\nfunction fingerprintHash({\n payload,\n offset,\n windowRef,\n}: {\n payload: string;\n offset: number;\n windowRef: WindowLike;\n}) {\n const ua =\n String((windowRef.navigator as any)?.userAgent || \"\") ||\n String((windowRef as any)?.navigator?.userAgent || \"\");\n const tz = new Date().getTimezoneOffset();\n const lang =\n String(windowRef.navigator?.language || \"\") ||\n String((windowRef.navigator as any)?.userLanguage || \"\");\n const minuteIndex = Math.floor(Date.now() / 60_000) - (Number(offset) || 0);\n return crc32Base36([ua, tz, lang, minuteIndex, payload].join(\"*\"));\n}\n\nfunction encodeDl({\n cookies,\n ts,\n windowRef,\n}: {\n cookies: Record<string, string>;\n ts: number;\n windowRef: WindowLike;\n}) {\n const pairs: Array<[string, string]> = [];\n pairs.push([\"ts\", String(ts)]);\n for (const [k, v] of Object.entries(cookies || {})) {\n if (!k) continue;\n if (v == null) continue;\n pairs.push([k, String(v)]);\n }\n // Deterministic ordering (helps hashing + tests)\n const stable = pairs.slice(1).sort((a, b) => a[0].localeCompare(b[0]));\n const kv = [pairs[0], ...stable];\n // Encode values in web-safe base64 to avoid plaintext + reduce URL length vs percent-encoding.\n const payload = kv.map(([k, v]) => `${k}*${webSafeBase64Encode(v)}`).join(\"*\");\n const hash = fingerprintHash({ payload, offset: 0, windowRef });\n return `${DL_VERSION}*${hash}*${payload}`;\n}\n\nfunction decodeDl({\n value,\n windowRef,\n ttlMs = 2 * 60 * 1000,\n}: {\n value: string;\n windowRef: WindowLike;\n ttlMs?: number;\n}): IncomingDlPayload | null {\n const raw = String(value || \"\");\n if (!raw) return null;\n const parts = raw.split(\"*\").filter((x) => x !== \"\");\n if (parts.length < 5) return null;\n const version = parts[0];\n const hash = parts[1];\n if (version !== DL_VERSION) return null;\n\n // Reconstruct payload string as `<k>*<encodedV>*<k>*<encodedV>...`\n const payloadParts = parts.slice(2);\n const payload = payloadParts.join(\"*\");\n let hashOk = false;\n for (let off = 0; off < 3; off += 1) {\n if (fingerprintHash({ payload, offset: off, windowRef }) === hash) {\n hashOk = true;\n break;\n }\n }\n if (!hashOk) return null;\n\n // Parse key/value pairs out of the payload.\n const kvRaw = payloadParts;\n const kv: Record<string, string> = {};\n for (let i = 0; i + 1 < kvRaw.length; i += 2) {\n const k = kvRaw[i];\n const encV = kvRaw[i + 1];\n if (!k) continue;\n // New format: web-safe base64, but accept legacy encodeURIComponent values for compatibility.\n try {\n kv[k] = webSafeBase64Decode(encV || \"\");\n } catch {\n kv[k] = decodeURIComponent(encV || \"\");\n }\n }\n const ts = Number(kv.ts);\n if (!Number.isFinite(ts)) return null;\n const age = Date.now() - ts;\n if (!(age >= 0 && age <= ttlMs)) return null;\n\n const cookies: Record<string, string> = {};\n for (const [k, v] of Object.entries(kv)) {\n if (k === \"ts\") continue;\n if (!k) continue;\n if (v == null) continue;\n cookies[k] = String(v);\n }\n return { ts, cookies };\n}\n\ntype CookieSpec =\n | { kind: \"client\"; name: string; settings: CookieSettings; getState: () => RuntimeState }\n | {\n kind: \"session\";\n name: string;\n propertyId: string;\n settings: CookieSettings;\n getState: () => RuntimeState;\n };\n\nconst LINKER_COORDINATOR_SLOT = \"__d8a_linker_coordinator\";\n\ntype SharedLinkerCoordinator = ReturnType<typeof createSharedLinkerCoordinator>;\n\nfunction buildCookieSpecsUnion({\n getStates,\n windowRef,\n}: {\n getStates: Array<() => RuntimeState>;\n windowRef: WindowLike;\n}): Record<string, CookieSpec> {\n const https = isHttps(windowRef);\n const specs: Record<string, CookieSpec> = {};\n\n const prefixes = new Map<string, { settings: CookieSettings; getState: () => RuntimeState }>();\n\n for (const getState of getStates) {\n const s = getState();\n const sp = getSetParams(getState);\n const pids = getPropertyIds(getState);\n if (pids && pids.length > 0) {\n for (const pid of pids) {\n const pcfg = getPropertyConfig(getState, pid);\n const cs = resolveCookieSettings({ propertyCfg: pcfg, setParams: sp, https, state: s });\n\n const sessName = buildD8aCookieName(pid, cs.cookiePrefix);\n if (!specs[sessName]) {\n specs[sessName] = {\n kind: \"session\",\n name: sessName,\n propertyId: pid,\n settings: cs,\n getState,\n };\n }\n\n if (!prefixes.has(cs.cookiePrefix))\n prefixes.set(cs.cookiePrefix, { settings: cs, getState });\n }\n continue;\n }\n\n // If no properties are configured yet, still include the client cookie for the current\n // cookie namespace derived from global `set` params. This matches the previous behavior\n // and allows decoration/acceptance early in the page lifecycle.\n const cs = resolveCookieSettings({ propertyCfg: {}, setParams: sp, https, state: s });\n if (!prefixes.has(cs.cookiePrefix)) prefixes.set(cs.cookiePrefix, { settings: cs, getState });\n }\n\n for (const [prefix, entry] of prefixes.entries()) {\n const clientName = buildD8aClientCookieName(prefix);\n if (!specs[clientName]) {\n specs[clientName] = {\n kind: \"client\",\n name: clientName,\n settings: entry.settings,\n getState: entry.getState,\n };\n }\n }\n\n return specs;\n}\n\nfunction createSharedLinkerCoordinator({ windowRef }: { windowRef: WindowLike }) {\n const w = windowRef;\n if (!w) throw new Error(\"createSharedLinkerCoordinator: windowRef is required\");\n const jar = createCookieJar({ windowRef: w });\n\n const runtimes = new Set<() => RuntimeState>();\n\n function isDebugEnabled(): boolean {\n for (const gs of runtimes.values()) {\n try {\n const s = gs();\n if ((s as any)?.set && (s as any).set.debug_mode === true) return true;\n const cfgs = (s as any)?.propertyConfigs;\n if (cfgs && typeof cfgs === \"object\") {\n for (const v of Object.values(cfgs)) {\n if (isRecord(v) && v.debug_mode === true) return true;\n }\n }\n } catch {\n // ignore\n }\n }\n return false;\n }\n\n function dbg(...args: unknown[]) {\n if (!isDebugEnabled()) return;\n try {\n console.log(\"[d8a][linker]\", ...args);\n } catch {\n // ignore\n }\n }\n\n // Global merged config:\n // - domains: union\n // - other fields: last-write-wins\n let rev = 0;\n const domains = new Set<string>();\n let acceptIncoming: { value: boolean; rev: number } | null = null;\n let decorateForms: { value: boolean; rev: number } | null = null;\n let urlPosition: { value: LinkerUrlPosition; rev: number } | null = null;\n\n // Pending incoming payload (parsed once, applied once).\n let incomingDl: IncomingDlPayload | null = null;\n\n let started = false;\n let formSubmitPatched = false;\n let originalFormSubmit: unknown = null;\n\n function getStatesList() {\n return Array.from(runtimes.values());\n }\n\n function currentConfig(): Required<LinkerConfig> {\n const doms = Array.from(domains.values()).sort();\n const hasDomains = doms.length > 0;\n return {\n domains: doms,\n accept_incoming: acceptIncoming ? acceptIncoming.value : hasDomains,\n decorate_forms: decorateForms ? decorateForms.value : false,\n url_position: urlPosition ? urlPosition.value : \"query\",\n };\n }\n\n function updateConfigPatch(patch: unknown) {\n if (!isRecord(patch)) return;\n rev += 1;\n\n const domainsRaw = patch.domains;\n if (Array.isArray(domainsRaw)) {\n for (const x of domainsRaw) {\n if (typeof x !== \"string\") continue;\n const v = x.trim();\n if (!v) continue;\n domains.add(v);\n }\n }\n\n const acceptIncomingRaw = patch.accept_incoming;\n if (typeof acceptIncomingRaw === \"boolean\") acceptIncoming = { value: acceptIncomingRaw, rev };\n\n const decorateFormsRaw = patch.decorate_forms;\n if (typeof decorateFormsRaw === \"boolean\") decorateForms = { value: decorateFormsRaw, rev };\n\n const urlPosRaw = patch.url_position;\n const urlPos = typeof urlPosRaw === \"string\" ? urlPosRaw : \"\";\n if (urlPos === \"query\" || urlPos === \"fragment\")\n urlPosition = { value: urlPos as LinkerUrlPosition, rev };\n }\n\n function mergeConfigSnapshot(cfg: unknown) {\n updateConfigPatch(cfg);\n }\n\n function registerRuntime(getState: () => RuntimeState) {\n runtimes.add(getState);\n // Best-effort: seed config from current state snapshot (helps tests and edge cases).\n try {\n mergeConfigSnapshot(getState().linker);\n } catch {\n // ignore\n }\n return () => {\n runtimes.delete(getState);\n };\n }\n\n function tryStripDlFromUrl(where: \"query\" | \"fragment\" | null) {\n if (!where) return;\n const href = String(w.location?.href || \"\");\n if (!href) return;\n const next = stripParamFromUrl(href, DL_PARAM);\n if (next !== href && typeof w.history?.replaceState === \"function\") {\n try {\n w.history.replaceState({}, \"\", next);\n } catch {\n // ignore\n }\n if (w.location) w.location.href = next;\n }\n }\n\n function parseIncomingFromLocation() {\n const href = String(w.location?.href || \"\");\n if (!href) return;\n const { value, where } = getParamFromUrl(href, DL_PARAM);\n if (!value) return;\n const decoded = decodeDl({ value, windowRef: w });\n if (decoded) {\n incomingDl = decoded;\n dbg(\"parsed incoming _dl\", {\n cookieNames: Object.keys(decoded.cookies || {}),\n ts: decoded.ts,\n where,\n });\n }\n // Strip regardless of decode success.\n tryStripDlFromUrl(where);\n }\n\n function buildOutgoingCookies(): Record<string, string> {\n const specs = buildCookieSpecsUnion({ getStates: getStatesList(), windowRef: w });\n const header = String(w.document?.cookie || \"\");\n const all = parseCookieHeader(header);\n const out: Record<string, string> = {};\n for (const spec of Object.values(specs)) {\n const v = all.get(spec.name);\n if (!v) continue;\n if (spec.kind === \"client\" && !parseD8aClientCookie(v)?.cid) continue;\n if (spec.kind === \"session\" && !parseD8aSessionCookie(v)?.tokens) continue;\n out[spec.name] = v;\n }\n return out;\n }\n\n function buildDlValue(): string | null {\n const cfg = currentConfig();\n if (!cfg.domains || cfg.domains.length === 0) return null;\n const cookies = buildOutgoingCookies();\n if (!cookies || Object.keys(cookies).length === 0) return null;\n const ts = Date.now();\n return encodeDl({ cookies, ts, windowRef: w });\n }\n\n function decorateUrlIfNeeded(rawUrl: string): string {\n const cfg = currentConfig();\n if (!cfg.domains || cfg.domains.length === 0) return rawUrl;\n const value = buildDlValue();\n if (!value) return rawUrl;\n\n const host = getHostnameFromUrl(rawUrl, String(w.location?.href || \"\"));\n if (!shouldDecorateHost(host, cfg.domains)) return rawUrl;\n\n return setParamInUrl(rawUrl, DL_PARAM, value, cfg.url_position);\n }\n\n function decorateAnchor(el: unknown) {\n if (!isRecord(el)) return;\n const href = typeof el.href === \"string\" ? el.href : null;\n if (!href) return;\n const next = decorateUrlIfNeeded(href);\n if (next !== href) {\n try {\n (el as any).href = next;\n } catch {\n // ignore\n }\n }\n }\n\n function decorateForm(el: unknown) {\n if (!isRecord(el)) return;\n const cfg = currentConfig();\n if (!cfg.decorate_forms) return;\n const action = typeof el.action === \"string\" ? el.action : \"\";\n if (!action) return;\n const value = buildDlValue();\n if (!value) return;\n\n const host = getHostnameFromUrl(action, String(w.location?.href || \"\"));\n if (!shouldDecorateHost(host, cfg.domains)) return;\n\n const method = typeof el.method === \"string\" ? el.method.toLowerCase() : \"\";\n if (cfg.url_position === \"query\" && method === \"get\") {\n const children = Array.isArray((el as any).childNodes) ? (el as any).childNodes : [];\n let found = false;\n for (const c of children) {\n if (!isRecord(c)) continue;\n if (String((c as any).name || \"\") === DL_PARAM) {\n try {\n (c as any).value = value;\n } catch {\n // ignore\n }\n found = true;\n break;\n }\n }\n if (!found && typeof (w.document as any)?.createElement === \"function\") {\n try {\n const input = (w.document as any).createElement(\"input\");\n input.setAttribute(\"type\", \"hidden\");\n input.setAttribute(\"name\", DL_PARAM);\n input.setAttribute(\"value\", value);\n (el as any).appendChild?.(input);\n } catch {\n // ignore\n }\n }\n return;\n }\n\n const nextAction = setParamInUrl(action, DL_PARAM, value, cfg.url_position);\n if (nextAction !== action) {\n try {\n (el as any).action = nextAction;\n } catch {\n // ignore\n }\n }\n }\n\n function findClosestTarget(start: unknown, tags: string[]): unknown | null {\n let cur: any = start;\n for (let i = 0; i < 8; i += 1) {\n if (!cur || typeof cur !== \"object\") return null;\n const tag = String(cur.tagName || \"\").toUpperCase();\n if (tags.includes(tag)) return cur;\n cur = cur.parentElement || cur.parentNode || null;\n }\n return null;\n }\n\n function onMouseDown(ev: unknown) {\n const t = isRecord(ev) ? (ev as any).target : null;\n const a = findClosestTarget(t, [\"A\"]);\n if (a) decorateAnchor(a);\n }\n\n function onKeyUp(ev: unknown) {\n const t = isRecord(ev) ? (ev as any).target : null;\n const a = findClosestTarget(t, [\"A\"]);\n if (a) decorateAnchor(a);\n }\n\n function onSubmit(ev: unknown) {\n const t = isRecord(ev) ? (ev as any).target : null;\n const f = findClosestTarget(t, [\"FORM\"]);\n if (f) decorateForm(f);\n }\n\n function applyIncomingIfReady() {\n const cfg = currentConfig();\n if (!cfg.accept_incoming) return;\n if (!incomingDl) return;\n\n const getStates = getStatesList();\n const primaryGetState = getStates[0] || null;\n const consent = primaryGetState ? getEffectiveConsent(primaryGetState) : {};\n const analyticsDenied =\n String((consent as any)?.analytics_storage || \"\").toLowerCase() === \"denied\";\n\n if (analyticsDenied) {\n let cid: string | null = null;\n for (const v of Object.values(incomingDl.cookies)) {\n const parsed = parseD8aClientCookie(v);\n if (parsed?.cid) {\n cid = parsed.cid;\n break;\n }\n }\n if (cid) {\n for (const gs of getStates) {\n try {\n gs().anonCid = cid;\n gs().incomingDl = null;\n } catch {\n // ignore\n }\n }\n }\n incomingDl = null;\n return;\n }\n\n const specs = buildCookieSpecsUnion({ getStates, windowRef: w });\n\n // If we don't yet have enough config to recognize any cookies in the payload,\n // keep the payload around and retry later (for example, after `config()` registers\n // property IDs / cookie prefixes). This is important because `set('linker', ...)`\n // may be processed before any `config()` calls.\n let hasAnyRelevantCookie = false;\n for (const name of Object.keys(incomingDl.cookies || {})) {\n if (specs[name]) {\n hasAnyRelevantCookie = true;\n break;\n }\n }\n if (!hasAnyRelevantCookie) return;\n\n // Apply cookies that we can recognize *now*, but keep the rest so they can be\n // applied later when additional property configs (and thus cookie specs) become known.\n for (const [name, value] of Object.entries(incomingDl.cookies || {})) {\n const spec = specs[name];\n if (!spec) continue;\n if (spec.kind === \"client\") {\n const parsed = parseD8aClientCookie(value);\n if (!parsed?.cid) continue;\n const before = jar.get(spec.name);\n applyClientIdCookie({\n jar,\n cid: parsed.cid,\n consent,\n cookieDomain: spec.settings.cookieDomain,\n cookiePrefix: spec.settings.cookiePrefix,\n cookiePath: spec.settings.cookiePath,\n cookieSameSite: spec.settings.cookieSameSite,\n cookieSecure: spec.settings.cookieSecure,\n cookieMaxAgeSeconds: spec.settings.cookieMaxAgeSeconds,\n cookieUpdate: spec.settings.cookieUpdate,\n forceCookieAttrsWrite: spec.settings.forceCookieAttrsWrite,\n });\n const after = jar.get(spec.name);\n dbg(\"applied client cookie\", {\n name: spec.name,\n cid: parsed.cid,\n cookieUpdate: spec.settings.cookieUpdate,\n before,\n after,\n });\n // Consider this cookie handled (even if cookie_update=false prevents overwriting).\n delete (incomingDl.cookies as any)[name];\n continue;\n }\n if (spec.kind === \"session\") {\n const s = spec.getState();\n const sp = getSetParams(spec.getState);\n const https = isHttps(w);\n const pcfg = getPropertyConfig(spec.getState, spec.propertyId);\n const cs = resolveCookieSettings({ propertyCfg: pcfg, setParams: sp, https, state: s });\n const parsed = parseD8aSessionCookie(value);\n const before = jar.get(spec.name);\n const res = applySessionCookie({\n jar,\n propertyId: spec.propertyId,\n value,\n consent,\n cookieDomain: cs.cookieDomain,\n cookiePrefix: cs.cookiePrefix,\n cookiePath: cs.cookiePath,\n cookieSameSite: cs.cookieSameSite,\n cookieSecure: cs.cookieSecure,\n cookieMaxAgeSeconds: cs.cookieMaxAgeSeconds,\n cookieUpdate: cs.cookieUpdate,\n forceCookieAttrsWrite: cs.forceCookieAttrsWrite,\n });\n const after = jar.get(spec.name);\n dbg(\"applied session cookie\", {\n name: spec.name,\n propertyId: spec.propertyId,\n cookieUpdate: cs.cookieUpdate,\n wrote: (res as any)?.wrote === true,\n sid: parsed?.sid,\n sct: parsed?.sct,\n before,\n after,\n });\n // Seed runtime shared session state so the first auto page_view doesn't\n // overwrite an incoming linker session with a freshly generated one.\n if ((res as any)?.wrote && parsed?.tokens) {\n s.sharedSessionTokens = parsed.tokens;\n s.sharedSessionValue = String(value || \"\");\n dbg(\"seeded shared session state\", { propertyId: spec.propertyId });\n }\n delete (incomingDl.cookies as any)[name];\n }\n }\n\n // If all cookies from the payload have been handled, clear the payload.\n if (!incomingDl.cookies || Object.keys(incomingDl.cookies).length === 0) {\n // Clear any per-runtime pending payloads after applying.\n for (const gs of getStates) {\n try {\n gs().incomingDl = null;\n } catch {\n // ignore\n }\n }\n incomingDl = null;\n }\n }\n\n function patchFormSubmit() {\n if (formSubmitPatched) return;\n const proto = (w as any).HTMLFormElement?.prototype;\n const submit = proto?.submit;\n if (typeof submit !== \"function\") return;\n originalFormSubmit = submit;\n proto.submit = function patchedSubmit(this: unknown) {\n try {\n decorateForm(this);\n } catch {\n // ignore\n }\n return submit.call(this);\n };\n formSubmitPatched = true;\n }\n\n function start() {\n if (started) return;\n started = true;\n parseIncomingFromLocation();\n applyIncomingIfReady();\n\n w.document?.addEventListener?.(\"mousedown\", onMouseDown);\n w.document?.addEventListener?.(\"keyup\", onKeyUp);\n w.document?.addEventListener?.(\"submit\", onSubmit);\n patchFormSubmit();\n }\n\n function stop() {\n if (!started) return;\n started = false;\n w.document?.removeEventListener?.(\"mousedown\", onMouseDown);\n w.document?.removeEventListener?.(\"keyup\", onKeyUp);\n w.document?.removeEventListener?.(\"submit\", onSubmit);\n if (formSubmitPatched) {\n const proto = (w as any).HTMLFormElement?.prototype;\n if (proto && originalFormSubmit) {\n try {\n proto.submit = originalFormSubmit;\n } catch {\n // ignore\n }\n }\n formSubmitPatched = false;\n originalFormSubmit = null;\n }\n }\n\n return {\n start,\n stop,\n applyIncomingIfReady,\n registerRuntime,\n updateConfigPatch,\n // exported for tests\n __internal: {\n encodeDl,\n decodeDl,\n decorateUrlIfNeeded,\n stripParamFromUrl,\n setParamInUrl,\n resolveLinkerConfig,\n },\n };\n}\n\nexport function getSharedLinkerCoordinator({\n windowRef,\n}: {\n windowRef: WindowLike;\n}): SharedLinkerCoordinator {\n const w = windowRef;\n const existing = getWindowSlot<SharedLinkerCoordinator>(w, LINKER_COORDINATOR_SLOT);\n if (existing) return existing;\n const created = createSharedLinkerCoordinator({ windowRef: w });\n setWindowSlot(w, LINKER_COORDINATOR_SLOT, created);\n return created;\n}\n\nexport function createLinker({\n windowRef,\n getState,\n}: {\n windowRef: WindowLike;\n getState: () => RuntimeState;\n}) {\n const coordinator = getSharedLinkerCoordinator({ windowRef });\n const unregister = coordinator.registerRuntime(getState);\n\n return {\n start: () => coordinator.start(),\n stop: () => unregister(),\n applyIncomingIfReady: () => coordinator.applyIncomingIfReady(),\n updateConfigPatch: (patch: unknown) => coordinator.updateConfigPatch(patch),\n // exported for tests\n __internal: coordinator.__internal,\n };\n}\n", "import { createD8aGlobal } from \"./runtime/d8a_global.ts\";\nimport { createQueueConsumer } from \"./runtime/queue_consumer.ts\";\nimport { createDispatcher } from \"./runtime/dispatcher.ts\";\nimport {\n resolveDataLayerName,\n resolveGlobalName,\n resolveGtagDataLayerName,\n} from \"./runtime/runtime_names.ts\";\nimport { createGtagConsentBridge } from \"./runtime/gtag_consent_bridge.ts\";\nimport { createEnhancedMeasurement } from \"./runtime/enhanced_measurement.ts\";\nimport { createLinker } from \"./runtime/linker.ts\";\nimport type { D8aTagData, WindowLike } from \"./types.ts\";\nimport { ensureArraySlot, getWindowSlot, setWindowSlot } from \"./utils/window_slots.ts\";\n\ntype InstallResult = {\n consumer: ReturnType<typeof createQueueConsumer>;\n dispatcher: ReturnType<typeof createDispatcher>;\n dataLayerName: string;\n globalName: string;\n};\n\n/**\n * Installs the tracker runtime and begins consuming queued `dataLayer` entries.\n *\n * This is the programmatic installer used by both consumption modes:\n * - script-tag bundle (`src/browser_entry.ts`) installs on load\n * - ESM usage (`src/index.ts`) can call this explicitly\n */\nexport function installD8a({\n windowRef = window,\n dataLayerName,\n globalName,\n gtagDataLayerName,\n}: {\n windowRef?: WindowLike;\n dataLayerName?: unknown;\n globalName?: unknown;\n gtagDataLayerName?: unknown;\n} = {}) {\n const w = windowRef;\n if (!w) throw new Error(\"installD8a: window is required\");\n\n // Keep installation records on window, so repeated installs with the\n // same names are safe, but multiple tracker instances can still be created when\n // users provide different `dataLayerName` and/or `globalName` (see example/index.html).\n w.d8a_tag_data = w.d8a_tag_data || {};\n type InstallStores = D8aTagData & {\n __d8aInstallResults?: Record<string, InstallResult>;\n __d8aInstallResultsByDataLayer?: Record<string, InstallResult>;\n };\n const tagData = w.d8a_tag_data as InstallStores;\n\n const dl = resolveDataLayerName({ windowRef: w, dataLayerName });\n const gn = resolveGlobalName({ windowRef: w, globalName });\n const gdl = resolveGtagDataLayerName({ windowRef: w, gtagDataLayerName });\n\n if (!tagData.__d8aInstallResults) tagData.__d8aInstallResults = {};\n if (!tagData.__d8aInstallResultsByDataLayer) tagData.__d8aInstallResultsByDataLayer = {};\n const installResults = tagData.__d8aInstallResults;\n const installResultsByDl = tagData.__d8aInstallResultsByDataLayer;\n const key = `${dl}|${gn}`;\n if (installResults[key]) {\n return installResults[key];\n }\n\n ensureArraySlot<unknown>(w, dl);\n\n // If the data layer is already being consumed by an existing runtime, create an alias\n // result for this (dl|gn) pair without creating a second consumer/dispatcher.\n const existingForDl = installResultsByDl[dl] || null;\n if (existingForDl) {\n // Ensure the requested global exists and points at this data layer.\n if (typeof getWindowSlot<unknown>(w, gn) !== \"function\") {\n setWindowSlot(w, gn, createD8aGlobal({ windowRef: w, dataLayerName: dl }));\n }\n\n const alias = {\n consumer: existingForDl.consumer,\n dispatcher: existingForDl.dispatcher,\n dataLayerName: dl,\n globalName: gn,\n };\n installResults[key] = alias;\n return alias;\n }\n\n // If the user already defined a snippet `d8a()` (or custom global) that pushes into dataLayer,\n // leave it alone. Otherwise create the global function.\n if (typeof getWindowSlot<unknown>(w, gn) !== \"function\") {\n setWindowSlot(w, gn, createD8aGlobal({ windowRef: w, dataLayerName: dl }));\n }\n\n const consumer = createQueueConsumer({ windowRef: w, dataLayerName: dl });\n\n const onConfigCbs: Array<(propertyId: string, patchCfg: Record<string, unknown>) => void> = [];\n consumer.setOnConfig((propertyId, patchCfg) => {\n for (const cb of onConfigCbs) cb(propertyId, patchCfg);\n });\n\n const onSetCbs: Array<(args: unknown) => void> = [];\n consumer.setOnSet((args) => {\n for (const cb of onSetCbs) cb(args);\n });\n\n const dispatcher = createDispatcher({ windowRef: w, getState: consumer.getState });\n dispatcher.attachLifecycleFlush();\n consumer.setOnEvent((name: string, params: Record<string, unknown>) => {\n dispatcher.enqueueEvent(name, params);\n });\n\n // Cross-domain linker (`_dl`) for client/session continuity across unrelated domains.\n const linker = createLinker({ windowRef: w, getState: consumer.getState });\n linker.start();\n // Apply pending incoming payload when:\n // - linker config changes (accept_incoming/domains)\n // - new properties are configured (cookie settings become known)\n onSetCbs.push((args) => {\n // Keep shared linker config in sync (when multiple runtimes are installed).\n if (\n args &&\n typeof args === \"object\" &&\n (args as any).type === \"field\" &&\n (args as any).field === \"linker\"\n ) {\n linker.updateConfigPatch((args as any).value);\n }\n if (args && typeof args === \"object\" && (args as any).type === \"object\") {\n linker.updateConfigPatch((args as any)?.obj?.linker);\n }\n linker.applyIncomingIfReady();\n });\n onConfigCbs.push(() => linker.applyIncomingIfReady());\n\n // If gtag/GTM is present, prefer consent pushed into `window.dataLayer`.\n // This runs regardless of d8a's own dataLayerName to avoid requiring users\n // to align queue names.\n const gtagConsentBridge = createGtagConsentBridge({\n windowRef: w,\n getState: consumer.getState,\n dataLayerName: gdl,\n });\n\n consumer.start();\n gtagConsentBridge.start();\n\n // Enhanced measurement\n try {\n const em = createEnhancedMeasurement({ windowRef: w, getState: consumer.getState, dispatcher });\n onConfigCbs.push(() => em.onConfig());\n em.start();\n } catch {\n // ignore\n }\n\n const result = { consumer, dispatcher, dataLayerName: dl, globalName: gn };\n installResults[key] = result;\n installResultsByDl[dl] = result;\n return result;\n}\n", "import { installD8a } from \"./install.ts\";\n\n// Production bundle entrypoint (script-tag use for web-tracker).\n// This must be side-effect only: it should install immediately on load.\ninstallD8a();\n"],
5
+ "mappings": "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",
6
+ "names": ["getWindowSlot", "w", "key", "setWindowSlot", "value", "ensureArraySlot", "v", "arr", "createD8aGlobal", "windowRef", "dataLayerName", "w", "d8a", "_args", "ensureArraySlot", "date", "propertyId", "params", "eventName", "a", "b", "action", "state", "createRuntimeState", "getEffectiveConsent", "getState", "s", "g", "getConsentParts", "gConsent", "gDefault", "gUpdate", "scheduleMicrotask", "fn", "maybeEmitConsentUpdatePing", "getState", "s", "consent", "getEffectiveConsent", "next", "prev", "isRecord", "v", "readUserIdFromObject", "v", "isRecord", "raw", "trimmed", "readSendPageViewFromConfig", "readConsentPatch", "mergeLinkerConfig", "state", "patch", "next", "domainsRaw", "domains", "x", "acceptIncomingRaw", "decorateFormsRaw", "urlPosRaw", "urlPos", "createQueueConsumer", "windowRef", "dataLayerName", "w", "createRuntimeState", "started", "originalPush", "patched", "normalizeDataLayerItem", "item", "maybeArrayLikeLength", "handleCommand", "args", "_a", "_b", "cmd", "a", "b", "propertyId", "existingCfg", "patchCfg", "userId", "action", "maybeEmitConsentUpdatePing", "field", "payload", "params", "drainExisting", "dl", "existing", "getWindowSlot", "items", "ensureArraySlot", "patchPush", "dlArr", "forwarded", "start", "fn", "dlArrMaybe", "e", "nowSeconds", "nowMs", "randInt31", "applyCookiePrefix", "cookiePrefix", "cookieName", "p", "n", "buildD8aClientCookieName", "buildD8aCookieName", "propertyId", "parseD8aClientCookie", "value", "m", "generateCidParts", "formatCid", "random", "timestampSec", "buildD8aClientCookieValue", "buildD8aClientCookieValueFromCid", "cid", "SESSION_PREFIX", "KNOWN_KEYS", "tokenizeSessionCookie", "raw", "v", "t", "tok", "key", "val", "detokenizeSessionCookie", "tokens", "rawTokens", "getToken", "x", "setToken", "idx", "generateOpaqueSessionId", "a", "b", "c", "parseD8aSessionCookie", "sid", "sct", "last", "segRaw", "sidNum", "sctNum", "lastNum", "segNum", "updateD8aSessionCookieTokens", "existingTokens", "sessionTimeoutMs", "_a", "_b", "_c", "now", "timeoutSec", "isValid", "prevSct", "nextSct", "prevJ", "serializeD8aSessionCookieTokens", "__internal", "getCookieDomainCandidates", "hostname", "host", "parts", "last", "out", "i", "stripTrailingSlashes", "s", "parseCookieHeader", "header", "out", "raw", "part", "s", "idx", "name", "value", "isHttps", "w", "_a", "e", "buildSetCookieString", "name", "value", "attrs", "parts", "ensureDotDomain", "domain", "createCookieJar", "windowRef", "doc", "getAll", "parseCookieHeader", "get", "set", "opts", "_b", "_c", "path", "https", "requestedSameSite", "sameSite", "secure", "maxAgeSeconds", "expires", "baseAttrs", "domainOpt", "host", "candidates", "getCookieDomainCandidates", "attempts", "candidate", "cookieStr", "before", "after", "stuck", "del", "CORE_ECOMMERCE_NUMBER", "ITEM_KEY_MAP", "isObjectLike", "v", "toEpValue", "toEpnValue", "addEp", "params", "key", "value", "addEpn", "encodeItemToPrValue", "item", "it", "knownParts", "customParts", "srcKey", "dstKey", "str", "idx", "buildGa4CollectQueryParams", "propertyId", "eventName", "eventParams", "cookieHeader", "clientId", "userId", "cookiePrefix", "ignoreReferrer", "browser", "pageLoadMs", "hitCounter", "engagementTimeMs", "uachParams", "campaign", "contentGroup", "consentParams", "debugMode", "cookieMap", "parseCookieHeader", "client", "parseD8aClientCookie", "buildD8aClientCookieName", "c", "sessionCookieName", "buildD8aCookieName", "session", "parseD8aSessionCookie", "b", "k", "p", "currency", "itemsRaw", "items", "i", "pr", "isProbablyUrl", "s", "resolveTrackingUrl", "configOrUrl", "baseRaw", "stripTrailingSlashes", "getBrowserContext", "w", "dl", "_a", "e", "dt", "dr", "dh", "ul", "sr", "_b", "sw", "sh", "sleep", "ms", "r", "shouldRetryHttpStatus", "status", "sendWithRetries", "url", "windowRef", "useBeacon", "maxRetries", "initialBackoffMs", "_a", "w", "beacon", "e", "fetchFn", "options", "attempt", "backoff", "res", "canWriteAnalyticsCookies", "consentState", "TWO_YEARS_SECONDS", "ensureClientId", "jar", "consent", "nowMs", "cookieDomain", "cookiePrefix", "cookiePath", "cookieSameSite", "cookieSecure", "cookieMaxAgeSeconds", "cookieUpdate", "forceCookieAttrsWrite", "name", "buildD8aClientCookieName", "existing", "parsed", "parseD8aClientCookie", "canWriteAnalyticsCookies", "newVal", "buildD8aClientCookieValue", "newParsed", "cid", "applyClientIdCookie", "cidStr", "cookieValue", "buildD8aClientCookieValueFromCid", "existingCid", "applySessionCookie", "propertyId", "value", "_a", "pid", "rawValue", "parseD8aSessionCookie", "buildD8aCookieName", "HIGH_ENTROPY_KEYS", "getStore", "w", "store", "existing", "isRecord", "hasUachApi", "nav", "uad", "getUachCached", "fetchUach", "d", "enc", "v", "uachToParams", "uach", "out", "c", "encodeConsentStateBit", "a", "consentStatusToQl", "status", "buildGcs", "consent", "c", "ad", "an", "buildGcd", "consentDefault", "consentUpdate", "d", "u", "v", "s", "letterFor", "def", "upd", "defS", "updS", "parts", "out", "k", "digit", "generateAnonCid", "parts", "generateCidParts", "formatCid", "getOrCreateAnonCid", "windowRef", "state", "createEngagementTimer", "windowRef", "nowMs", "w", "started", "hasFocus", "isVisible", "isActive", "runningSinceMs", "accumulatedMs", "readHasFocus", "_a", "e", "readIsVisible", "_b", "shouldRun", "sync", "now", "delta", "onFocus", "onBlur", "onVisibilityChange", "onPageShow", "onPageHide", "start", "peek", "getAndReset", "out", "getPropertyIds", "getState", "s", "getPropertyConfig", "propertyId", "_a", "cfg", "getSetParams", "createDebugLogger", "enabled", "args", "e", "resolveWithPrecedence", "key", "eventParams", "config", "setParams", "ep", "cfg", "sp", "resolveString", "v", "resolveBool", "parseCookieFlags", "cookieFlags", "raw", "parts", "s", "out", "p", "lower", "v", "resolveCookieSettings", "propertyCfg", "setParams", "https", "state", "isDebugEnabled", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "cfg", "isRecord", "sp", "cookieDomainRaw", "cookieDomain", "cookiePrefixRaw", "cookiePrefix", "cookiePathRaw", "cookiePath", "cookieUpdateRaw", "cookieUpdate", "cookieExpires", "parsedExpires", "cookieMaxAgeSeconds", "flagsRaw", "flags", "cookieSameSite", "cookieSecure", "debug", "sig", "sigKey", "forceCookieAttrsWrite", "pickCookieSetDebugFields", "res", "isRecord", "updateAndWriteSharedSession", "state", "destinations", "jar", "getPropertyConfig", "resolveCookieSettings", "sessionTimeoutMs", "engagementTimeMs", "engagedThresholdMs", "nowMs", "log", "_a", "_b", "_c", "now", "tokens", "pid", "pcfg", "cs", "cookieName", "buildD8aCookieName", "existing", "parsed", "parseD8aSessionCookie", "updated", "updateD8aSessionCookieTokens", "prevG", "__internal", "nextG", "shouldWriteSessionValue", "serializeD8aSessionCookieTokens", "normalizeSendTo", "v", "x", "createDispatcher", "windowRef", "getState", "w", "queue", "timerId", "lifecycleAttached", "jar", "createCookieJar", "fetchUach", "engagementTimer", "createEngagementTimer", "USER_ENGAGEMENT_VISIBILITY_MIN_MS", "getPrimaryConfig", "primaryId", "getPropertyIds", "getPropertyConfig", "isDebugEnabled", "config", "setParams", "cfg", "isRecord", "sp", "isHttps", "_a", "e", "ensurePageLoadMs", "s", "enqueueEvent", "name", "params", "maxBatchSize", "flush", "ensureTimer", "interval", "useBeacon", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "propertyIds", "cfgPrimary", "batch", "consent", "getEffectiveConsent", "consentParts", "getConsentParts", "sessionTimeoutMsRaw", "sessionTimeoutMs", "state", "pageLoadMs", "analyticsStorage", "analyticsDenied", "https", "debugPrimary", "engagedThresholdSecRaw", "engagedThresholdSec", "engagedThresholdMs", "logger", "createDebugLogger", "resolveCookiesFor", "propertyCfg", "resolveCookieSettings", "sent", "ev", "rawParams", "sendTo", "destinations", "eventParams", "engagementTimeMs", "updateAndWriteSharedSession", "pid", "sendPromises", "pcfg", "collectBase", "resolveTrackingUrl", "cs", "resolvedUserId", "resolveString", "resolvedClientId", "resolvedDebugMode", "resolveBool", "campaign", "contentGroup", "ignoreReferrer", "browser", "getBrowserContext", "pageLocation", "pageTitle", "pageReferrer", "language", "screenResolution", "clientCookieName", "buildD8aClientCookieName", "clientCookieBefore", "clientRes", "ensureClientId", "clientCookieAction", "q", "buildGa4CollectQueryParams", "getOrCreateAnonCid", "uachToParams", "getUachCached", "buildGcs", "buildGcd", "url", "sendWithRetries", "flushNow", "attachLifecycleFlush", "safeString", "v", "detectFromCurrentScript", "documentRef", "key", "_a", "doc", "isRecord", "cs", "src", "baseHref", "u", "e", "resolveDataLayerName", "windowRef", "dataLayerName", "hinted", "fromScript", "resolveGlobalName", "globalName", "resolveGtagDataLayerName", "gtagDataLayerName", "HUBS_KEY", "isHubsMap", "v", "isRecord", "getHub", "w", "dataLayerName", "dl", "existingHubs", "getWindowSlot", "hubs", "setWindowSlot", "existing", "hub", "createGtagConsentBridge", "windowRef", "getState", "started", "unsubscribe", "normalizeDataLayerItem", "item", "maybeArrayLikeLength", "e", "applyConsentPatch", "action", "patch", "state", "maybeEmitConsentUpdatePing", "parseConsentCommand", "args", "cmd", "a", "b", "handleArgs", "c", "drainExisting", "dlArr", "patchPush", "ensureArraySlot", "forwarded", "sub", "start", "dlArrMaybe", "maybeHubs", "parseList", "v", "fallback", "x", "s", "safeUrl", "href", "baseHref", "e", "closestAnchor", "node", "i", "nn", "isRecord", "tag", "getAttr", "el", "name", "ee", "attr", "isHttpUrl", "u", "p", "hostnameMatches", "host", "domain", "h", "d", "fileNameFromUrl", "fileExtension", "idx", "normalizeWhitespace", "getLinkId", "a", "getLinkClasses", "getLinkText", "createEnhancedMeasurement", "windowRef", "getState", "dispatcher", "w", "readBoolKey", "source", "key", "readListKey", "isEnabledForProperty", "propertyId", "defaultValue", "setParams", "getSetParams", "cfg", "getPropertyConfig", "c", "getListForProperty", "defaultList", "cfgV", "setV", "markInstalledOnce", "markSiteSearchOnce", "maybeFireSiteSearch", "_a", "propertyIds", "getPropertyIds", "search", "sp", "defaultKeys", "termToProps", "pid", "keys", "found", "k", "list", "term", "pids", "shouldTrackOutbound", "linkHostname", "excludes", "shouldTrackDownload", "ext", "set", "onClick", "evt", "_b", "_c", "target", "linkUrl", "linkId", "linkClasses", "linkText", "fileName", "downloadDestinations", "outboundDestinations", "start", "doc", "onConfig", "DL_PARAM", "DL_VERSION", "B64_ALPHABET", "B64_PAD", "B64_REV", "b64Rev", "rev", "i", "utf8Encode", "s", "e", "out", "utf8Decode", "bytes", "webSafeBase64Encode", "raw", "has2", "has3", "b1", "b2", "b3", "c1", "c2", "c3", "c4", "webSafeBase64Decode", "enc", "next", "defaultValue", "ch", "v", "f", "g", "h", "isHttps", "w", "_a", "resolveLinkerConfig", "cfg", "domains", "x", "hasDomains", "splitUrl", "u", "m", "parseParams", "part", "lead", "kv", "item", "idx", "k", "buildParams", "pairs", "encoded", "getParamFromUrl", "url", "name", "query", "fragment", "stripParamFromUrl", "base", "q", "setParamInUrl", "value", "pos", "getHostnameFromUrl", "baseHref", "shouldDecorateHost", "hostname", "host", "d", "dom", "CRC_TABLE", "crcTable", "t", "c", "j", "crc32Base36", "tbl", "crc", "code", "fingerprintHash", "payload", "offset", "windowRef", "_b", "_c", "_d", "ua", "tz", "lang", "minuteIndex", "encodeDl", "cookies", "ts", "stable", "a", "b", "hash", "decodeDl", "ttlMs", "parts", "version", "payloadParts", "hashOk", "off", "kvRaw", "encV", "age", "LINKER_COORDINATOR_SLOT", "buildCookieSpecsUnion", "getStates", "https", "specs", "prefixes", "getState", "sp", "getSetParams", "pids", "getPropertyIds", "pid", "pcfg", "getPropertyConfig", "cs", "resolveCookieSettings", "sessName", "buildD8aCookieName", "prefix", "entry", "clientName", "buildD8aClientCookieName", "createSharedLinkerCoordinator", "jar", "createCookieJar", "runtimes", "isDebugEnabled", "gs", "cfgs", "isRecord", "dbg", "args", "acceptIncoming", "decorateForms", "urlPosition", "incomingDl", "started", "formSubmitPatched", "originalFormSubmit", "getStatesList", "currentConfig", "doms", "updateConfigPatch", "patch", "domainsRaw", "acceptIncomingRaw", "decorateFormsRaw", "urlPosRaw", "urlPos", "mergeConfigSnapshot", "registerRuntime", "tryStripDlFromUrl", "where", "href", "parseIncomingFromLocation", "decoded", "buildOutgoingCookies", "header", "all", "parseCookieHeader", "spec", "parseD8aClientCookie", "parseD8aSessionCookie", "buildDlValue", "decorateUrlIfNeeded", "rawUrl", "decorateAnchor", "el", "decorateForm", "action", "method", "children", "found", "input", "nextAction", "findClosestTarget", "start", "tags", "cur", "tag", "onMouseDown", "ev", "onKeyUp", "onSubmit", "applyIncomingIfReady", "primaryGetState", "consent", "getEffectiveConsent", "cid", "parsed", "hasAnyRelevantCookie", "before", "applyClientIdCookie", "after", "res", "applySessionCookie", "patchFormSubmit", "proto", "submit", "_e", "_f", "stop", "_g", "getSharedLinkerCoordinator", "existing", "getWindowSlot", "created", "setWindowSlot", "createLinker", "coordinator", "unregister", "installD8a", "windowRef", "dataLayerName", "globalName", "gtagDataLayerName", "w", "tagData", "dl", "resolveDataLayerName", "gn", "resolveGlobalName", "gdl", "resolveGtagDataLayerName", "installResults", "installResultsByDl", "key", "ensureArraySlot", "existingForDl", "getWindowSlot", "setWindowSlot", "createD8aGlobal", "alias", "consumer", "createQueueConsumer", "onConfigCbs", "propertyId", "patchCfg", "cb", "onSetCbs", "args", "dispatcher", "createDispatcher", "name", "params", "linker", "createLinker", "_a", "gtagConsentBridge", "createGtagConsentBridge", "em", "createEnhancedMeasurement", "e", "result", "installD8a"]
7
+ }