alphana-sdk 2.0.3 → 2.0.5

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/index.ts","../../src/react/provider.tsx","../../src/utils/api-base.ts","../../src/utils/collect-payload.ts","../../src/utils/session.ts","../../src/utils/normalize-tracker-path.ts","../../src/core/navigation.ts","../../src/core/time.ts","../../src/utils/throttle.ts","../../src/core/heatmap.ts","../../src/utils/compress.ts","../../src/utils/ingest-fetch.ts","../../src/core/logger.ts","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/utils.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/types/dist/types.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/mutation.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observer.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/cross-origin-iframe-mirror.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/iframe-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/tslib/tslib.es6.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/image-bitmap-data-url-worker.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/index.js","../../src/core/session-replay.ts","../../src/core/client-context.ts","../../src/core/element-bindings.ts","../../src/core/consent-banner.ts","../../src/core/consent-storage.ts","../../src/tracker.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"sourcesContent":["export { UserTrackerProvider } from \"./provider\";\nexport type { UserTrackerProviderProps } from \"./provider\";\nexport {\n useTracker,\n usePageView,\n useHeatmapData,\n usePageViews,\n useTrackRevenue,\n useTrackGoal,\n useTrackJourneyStep,\n useTimeSpent,\n useFeatureFlags,\n useFeatureFlagEnabled,\n useAbTests,\n useAbVariant,\n useIsAbVariant,\n} from \"./hooks\";\n","import { useEffect, useRef, type ReactNode } from \"react\";\nimport { UserTracker } from \"../tracker\";\nimport type { TrackerConfig } from \"../types\";\nimport { TrackerContext } from \"./context\";\n\nexport interface UserTrackerProviderProps {\n /** Tracker configuration. Captured on first render — changes are ignored. */\n config?: TrackerConfig;\n children: ReactNode;\n}\n\n/**\n * Wraps your application (or a subtree) and provides a `UserTracker` instance\n * via React context.\n *\n * The tracker is created once, initialized on mount, and destroyed on unmount.\n *\n * **Next.js App Router** — mark your layout wrapper as a Client Component:\n * ```tsx\n * 'use client';\n * import { UserTrackerProvider } from 'user-tracker/react';\n * export default function RootLayout({ children }) {\n * return <UserTrackerProvider config={{ endpoint: '/api/events' }}>{children}</UserTrackerProvider>;\n * }\n * ```\n */\nexport function UserTrackerProvider({\n config = {},\n children,\n}: UserTrackerProviderProps) {\n // Create the tracker instance exactly once (lazy ref initialisation).\n const trackerRef = useRef<UserTracker | null>(null);\n if (trackerRef.current === null) {\n trackerRef.current = new UserTracker(config);\n }\n\n useEffect(() => {\n const tracker = trackerRef.current!;\n tracker.init();\n return () => tracker.destroy();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <TrackerContext.Provider value={trackerRef.current}>\n {children}\n </TrackerContext.Provider>\n );\n}\n","/** Derive API root from events endpoint, e.g. `…/api/events` → `…/api`. */\nexport function apiBaseFromEventsEndpoint(endpoint: string): string {\n return endpoint.replace(/\\/events\\/?$/, \"\");\n}\n\n/** Unified ingest URL derived from the events endpoint. */\nexport function collectUrlFromEventsEndpoint(endpoint: string): string {\n return `${apiBaseFromEventsEndpoint(endpoint)}/collect`;\n}\n","import type { LogEntry } from \"../core/logger\";\nimport type { TrackerEvent } from \"../types\";\n\nexport type CollectEnvelope = Record<string, unknown>;\n\nexport function buildCollectBatchBody(\n events: TrackerEvent[],\n ctx: { appId?: string; visitorId?: string; sessionId: string },\n): CollectEnvelope {\n return {\n ...(ctx.appId ? { appId: ctx.appId } : {}),\n visitorId: ctx.visitorId,\n events: events.map((e) => ({\n sessionId: ctx.sessionId,\n type: e.type,\n data: e.data,\n })),\n };\n}\n\nexport function buildCollectHeartbeatBody(params: {\n sessionId: string;\n visitorId?: string;\n path: string;\n active: boolean;\n appId?: string;\n}): CollectEnvelope {\n return {\n ...(params.appId ? { appId: params.appId } : {}),\n visitorId: params.visitorId,\n heartbeat: {\n sessionId: params.sessionId,\n visitorId: params.visitorId,\n path: params.path,\n active: params.active,\n ...(params.appId ? { appId: params.appId } : {}),\n },\n };\n}\n\nexport function buildCollectLogBody(entry: LogEntry): CollectEnvelope {\n return {\n ...(entry.appId ? { appId: entry.appId } : {}),\n log: entry,\n };\n}\n","const SESSION_STORAGE_KEY = \"__ut_sid__\";\nconst VISITOR_STORAGE_KEY = \"__ut_vid__\";\n\n/** Generate a RFC-4122 v4 UUID using the native crypto API with a fallback. */\nexport function generateSessionId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n // Math.random fallback (not cryptographically secure, but sufficient for analytics)\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Retrieve the session ID from sessionStorage, or create and persist a new one.\n * Falls back to an in-memory ID when sessionStorage is unavailable (e.g. SSR).\n */\nexport function getOrCreateSessionId(): string {\n if (typeof sessionStorage === \"undefined\") return generateSessionId();\n try {\n const existing = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n const id = generateSessionId();\n sessionStorage.setItem(SESSION_STORAGE_KEY, id);\n return id;\n } catch {\n return generateSessionId();\n }\n}\n\n/**\n * Retrieve the visitor ID from localStorage (persists across sessions/tabs),\n * or create and store a new one. Returns a temporary in-memory ID when\n * localStorage is unavailable.\n */\nexport function getOrCreateVisitorId(): string {\n if (typeof localStorage === \"undefined\") return generateSessionId();\n try {\n const existing = localStorage.getItem(VISITOR_STORAGE_KEY);\n if (existing) return existing;\n const id = generateSessionId();\n localStorage.setItem(VISITOR_STORAGE_KEY, id);\n return id;\n } catch {\n return generateSessionId();\n }\n}\n\n/** Read a previously persisted visitor ID without creating one. */\nexport function peekVisitorId(): string | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n return localStorage.getItem(VISITOR_STORAGE_KEY);\n } catch {\n return null;\n }\n}\n\n/** Persist a visitor ID (used after cookie consent is granted). */\nexport function persistVisitorId(id: string): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(VISITOR_STORAGE_KEY, id);\n } catch {\n /* private mode / quota */\n }\n}\n","/**\n * Canonical URL path (+ optional query) for analytics / heatmap matching.\n *\n * Next.js `usePathname()` often returns percent-encoded segments while\n * `window.location.pathname` is decoded — without normalization the backend\n * cannot match registered heatmap pages or aggregate the same route.\n */\nexport function normalizeTrackerPath(path: string): string {\n if (!path) return path;\n const q = path.indexOf(\"?\");\n const pathname = q >= 0 ? path.slice(0, q) : path;\n const search = q >= 0 ? path.slice(q) : \"\";\n\n let out = pathname;\n for (let i = 0; i < 5; i++) {\n try {\n const dec = decodeURIComponent(out);\n if (dec === out) break;\n out = dec;\n } catch {\n break;\n }\n }\n\n let s = search;\n for (let i = 0; i < 5; i++) {\n try {\n const dec = decodeURIComponent(s);\n if (dec === s) break;\n s = dec;\n } catch {\n break;\n }\n }\n\n return out + s;\n}\n","import type { TrackerEvent } from \"../types\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\n\ntype EmitFn = (event: TrackerEvent) => void;\n\ninterface NavigationPluginOptions {\n emit: EmitFn;\n sessionId: string;\n}\n\n/** Persisted across full page loads (same tab, same origin) for MPA U-turn detection. */\nconst SS_LAST_PV_PATH = \"__ut_last_pv_path__\";\nconst SS_LAST_PV_ENTRY_MS = \"__ut_last_pv_entry_ms__\";\n\nfunction safeSessionStorageGet(key: string): string | null {\n if (typeof sessionStorage === \"undefined\") return null;\n try {\n return sessionStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSessionStorageSet(key: string, value: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n try {\n sessionStorage.setItem(key, value);\n } catch {\n /* quota / private mode */\n }\n}\n\nfunction persistLastPageView(path: string, pageEntryMs: number): void {\n safeSessionStorageSet(SS_LAST_PV_PATH, path);\n safeSessionStorageSet(SS_LAST_PV_ENTRY_MS, String(pageEntryMs));\n}\n\n/**\n * `navigate` | `reload` | `back_forward` | `prerender`, or legacy back/forward.\n */\nfunction getNavigationEntryType(): string | undefined {\n if (typeof performance === \"undefined\") return undefined;\n const list = performance.getEntriesByType(\n \"navigation\",\n ) as PerformanceNavigationTiming[];\n const nav = list[0];\n if (nav?.type) return nav.type;\n const legacy = (\n performance as unknown as { navigation?: { type?: number } }\n ).navigation;\n if (legacy?.type === 2) return \"back_forward\";\n return undefined;\n}\n\n/**\n * Tracks SPA route changes by monkey-patching history.pushState /\n * history.replaceState and listening to the popstate event.\n *\n * For every navigation it:\n * 1. Emits a `pageview` event.\n * 2. Dispatches the custom DOM event `tracker:navigate` so that other\n * plugins (TimePlugin, HeatmapPlugin) can react without having to\n * duplicate the pushState patching.\n * 3. Detects U-turns: if the user leaves a page in ≤5 s, a `uturn` event\n * is emitted with the time-on-page and destination path.\n *\n * **Multi-page sites (WordPress, etc.):** full reloads do not call\n * `pushState`. On browser Back/Forward, a new document loads; we detect\n * `PerformanceNavigationTiming.type === \"back_forward\"` and compare the\n * previous URL + entry time stored in `sessionStorage` to emit the same\n * `uturn` event as SPAs.\n *\n * Next.js App Router note:\n * The App Router manages navigation internally; use `usePageView(pathname)`\n * from `user-tracker/react` together with `usePathname()` instead.\n */\nexport class NavigationPlugin {\n private readonly emit: EmitFn;\n private readonly sessionId: string;\n private previousPath = \"\";\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private pageEntryTime = 0;\n private static readonly UTURN_THRESHOLD_MS = 5_000;\n\n constructor({ emit, sessionId }: NavigationPluginOptions) {\n this.emit = emit;\n this.sessionId = sessionId;\n }\n\n init(): void {\n const newPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n\n // MPA: user returned via history after a full page load (e.g. WordPress).\n if (getNavigationEntryType() === \"back_forward\") {\n this.tryEmitMpaHistoryTraversalUturn(newPath);\n }\n\n this.recordPageView(newPath);\n\n window.addEventListener(\"popstate\", this.handlePopState);\n\n // Patch pushState\n this.originalPushState = history.pushState.bind(history);\n const origPush = this.originalPushState;\n history.pushState = (state, title, url): void => {\n origPush(state, title, url);\n this.handleNavigation();\n };\n\n // Patch replaceState\n this.originalReplaceState = history.replaceState.bind(history);\n const origReplace = this.originalReplaceState;\n history.replaceState = (state, title, url): void => {\n origReplace(state, title, url);\n this.handleNavigation();\n };\n }\n\n destroy(): void {\n window.removeEventListener(\"popstate\", this.handlePopState);\n if (this.originalPushState) history.pushState = this.originalPushState;\n if (this.originalReplaceState)\n history.replaceState = this.originalReplaceState;\n }\n\n // Arrow property → always bound to `this`, safe to use as event listener.\n private handlePopState = (): void => {\n this.handleNavigation();\n };\n\n /**\n * After a full navigation away from `lastPath`, sessionStorage still holds\n * that page's path and entry time. If this load is a history traversal to a\n * *different* URL and dwell time on the previous page was ≤ threshold, emit\n * `uturn` (same semantics as SPA `handleNavigation`).\n */\n private tryEmitMpaHistoryTraversalUturn(newPath: string): void {\n const lastPath = safeSessionStorageGet(SS_LAST_PV_PATH);\n const lastMsRaw = safeSessionStorageGet(SS_LAST_PV_ENTRY_MS);\n const lastEntryMs = lastMsRaw ? Number(lastMsRaw) : 0;\n if (!lastPath || !Number.isFinite(lastEntryMs) || lastEntryMs <= 0) return;\n if (normalizeTrackerPath(lastPath) === newPath) return;\n\n const timeOnPage = Date.now() - lastEntryMs;\n if (timeOnPage < 0 || timeOnPage > NavigationPlugin.UTURN_THRESHOLD_MS)\n return;\n\n this.emitUturn(normalizeTrackerPath(lastPath), newPath, timeOnPage);\n }\n\n private handleNavigation(): void {\n const newPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n if (newPath === this.previousPath) return; // hash-only or duplicate call\n\n // U-turn detection: user left the previous page very quickly.\n if (this.previousPath && this.pageEntryTime > 0) {\n const timeOnPage = Date.now() - this.pageEntryTime;\n if (timeOnPage <= NavigationPlugin.UTURN_THRESHOLD_MS) {\n this.emitUturn(this.previousPath, newPath, timeOnPage);\n }\n }\n\n this.recordPageView(newPath);\n }\n\n private emitUturn(\n fromPath: string,\n toPath: string,\n timeOnPageMs: number,\n ): void {\n this.emit({\n type: \"uturn\",\n data: {\n fromPath,\n toPath,\n timeOnPageMs,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n },\n });\n }\n\n private recordPageView(path: string): void {\n const p = normalizeTrackerPath(path);\n this.previousPath = p;\n this.pageEntryTime = Date.now();\n\n persistLastPageView(p, this.pageEntryTime);\n\n this.emit({\n type: \"pageview\",\n data: {\n path: p,\n title: document.title,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n referrer: document.referrer || undefined,\n },\n });\n\n // Notify other plugins via a custom DOM event (synchronous dispatch).\n window.dispatchEvent(\n new CustomEvent(\"tracker:navigate\", {\n detail: { path: p, title: document.title },\n }),\n );\n }\n}\n","import type { TrackerEvent } from \"../types\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\n\ntype EmitFn = (event: TrackerEvent) => void;\n\ninterface TimePluginOptions {\n emit: EmitFn;\n sessionId: string;\n}\n\n/**\n * Tracks the time a user spends on each page.\n *\n * - Starts a timer when the page becomes active (init / tab focus).\n * - Stops and emits a `timespent` event when:\n * • The user navigates away (tracker:navigate)\n * • The tab is hidden (visibilitychange)\n * • The page is unloading (beforeunload / pagehide)\n * - Resumes timing when the tab becomes visible again.\n */\nexport class TimePlugin {\n private readonly emit: EmitFn;\n private readonly sessionId: string;\n private currentPath = \"\";\n private startTime = 0;\n private tracking = false;\n\n constructor({ emit, sessionId }: TimePluginOptions) {\n this.emit = emit;\n this.sessionId = sessionId;\n }\n\n init(): void {\n this.currentPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n this.startTracking();\n\n window.addEventListener(\"tracker:navigate\", this.handleNavigate);\n document.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n window.addEventListener(\"beforeunload\", this.handleUnload);\n window.addEventListener(\"pagehide\", this.handleUnload);\n }\n\n destroy(): void {\n this.stopTracking();\n window.removeEventListener(\"tracker:navigate\", this.handleNavigate);\n document.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n window.removeEventListener(\"beforeunload\", this.handleUnload);\n window.removeEventListener(\"pagehide\", this.handleUnload);\n }\n\n private startTracking(): void {\n this.startTime = Date.now();\n this.tracking = true;\n }\n\n private stopTracking(): void {\n if (!this.tracking || !this.currentPath) return;\n const duration = Date.now() - this.startTime;\n if (duration < 100) {\n this.tracking = false;\n return; // Ignore sub-100 ms blips (e.g. rapid navigations).\n }\n this.emit({\n type: \"timespent\",\n data: {\n path: this.currentPath,\n duration,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n },\n });\n this.tracking = false;\n }\n\n private handleNavigate = (e: CustomEvent<{ path: string }>): void => {\n this.stopTracking();\n this.currentPath = normalizeTrackerPath(e.detail.path);\n this.startTracking();\n };\n\n private handleVisibilityChange = (): void => {\n if (document.hidden) {\n this.stopTracking();\n } else {\n this.startTracking();\n }\n };\n\n private handleUnload = (): void => {\n this.stopTracking();\n };\n}\n","/**\n * Returns a function that invokes `fn` at most once every `delay` ms.\n * The first call in a new window is executed immediately.\n */\nexport function throttle<Args extends unknown[]>(\n fn: (...args: Args) => void,\n delay: number,\n): (...args: Args) => void {\n let lastCall = 0;\n return (...args: Args): void => {\n const now = Date.now();\n if (now - lastCall >= delay) {\n lastCall = now;\n fn(...args);\n }\n };\n}\n","import type { TrackerEvent, HeatmapPoint } from \"../types\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\nimport { throttle } from \"../utils/throttle\";\n\ntype EmitFn = (event: TrackerEvent) => void;\n\n/**\n * Elements we anchor clicks to. MUST stay in sync with the backend screenshot\n * rect-map collector so a click's selector resolves to a captured rect.\n */\nconst ANCHOR_SELECTOR =\n \"a,button,input,select,textarea,label,summary,img,\" +\n \"[role],[onclick],[data-track-label],[data-test-target],[id],\" +\n \"h1,h2,h3,h4,h5,h6\";\n\nconst SELECTOR_ID_RE = /^[A-Za-z][\\w-]*$/;\n\n/**\n * Build a stable CSS selector for `el`. MUST produce the same string as the\n * backend's `collectElementRects` so element-relative clicks line up.\n */\nfunction buildSelector(el: Element | null): string {\n if (!el || el.nodeType !== 1) return \"\";\n const elId = (el as HTMLElement).id;\n if (elId && SELECTOR_ID_RE.test(elId)) return \"#\" + elId;\n const parts: string[] = [];\n let node: Element | null = el;\n let depth = 0;\n while (node && node.nodeType === 1 && node !== document.body && depth < 5) {\n const nid = (node as HTMLElement).id;\n if (nid && SELECTOR_ID_RE.test(nid)) {\n parts.unshift(\"#\" + nid);\n break;\n }\n const tag = node.tagName.toLowerCase();\n let nth = 1;\n let sib = node.previousElementSibling;\n while (sib) {\n if (sib.tagName === node.tagName) nth++;\n sib = sib.previousElementSibling;\n }\n parts.unshift(tag + \":nth-of-type(\" + nth + \")\");\n node = node.parentElement;\n depth++;\n }\n return parts.join(\">\");\n}\n\ninterface AnchorInfo {\n selector?: string;\n relX?: number;\n relY?: number;\n}\n\n/**\n * Resolve the nearest anchorable element for a click and the click position as\n * a fraction (0–1) inside that element's box. Returns empty when no suitable\n * element is found (renderer then falls back to page percentages).\n */\nfunction getClickAnchor(\n target: EventTarget | null,\n clientX: number,\n clientY: number,\n): AnchorInfo {\n const el = target instanceof Element ? target : null;\n if (!el) return {};\n const anchor = el.closest(ANCHOR_SELECTOR);\n if (!anchor) return {};\n const selector = buildSelector(anchor);\n if (!selector) return {};\n const rect = anchor.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return { selector };\n const relX = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width));\n const relY = Math.min(1, Math.max(0, (clientY - rect.top) / rect.height));\n return {\n selector,\n relX: Math.round(relX * 1000) / 1000,\n relY: Math.round(relY * 1000) / 1000,\n };\n}\n\ninterface HeatmapPluginOptions {\n emit: EmitFn;\n sessionId: string;\n /** Fraction of mousemove / scroll events to sample (0–1). Default: 0.3 */\n sampleRate?: number;\n /** Maximum points stored per page before recording stops. Default: 2000 */\n maxPoints?: number;\n /**\n * If provided, heatmap data will only be collected for paths in this list.\n * Normally omit this — register pages in the dashboard instead; the backend\n * drops points for unregistered paths.\n */\n allowedPaths?: string[];\n}\n\n/**\n * Collects mouse-move, click, and scroll positions for heatmap analysis.\n *\n * Also detects rage clicks (≥3 clicks within 1 s in a 50 px radius) and emits\n * a `rageclik` event so the backend can surface problematic UI hotspots.\n *\n * Click events include an optional `target` field containing a human-readable\n * label for the clicked element (aria-label › id › button/link text).\n */\nexport class HeatmapPlugin {\n private readonly emit: EmitFn;\n private readonly sessionId: string;\n private readonly sampleRate: number;\n private readonly maxPoints: number;\n private readonly allowedPaths: Set<string> | null;\n private currentPath = \"\";\n private pointCounts: Record<string, number> = {};\n /** Deepest scroll reach (% of page height) recorded per path this session. */\n private maxScrollDepth: Record<string, number> = {};\n\n // Rage-click detection state\n private recentClicks: { x: number; y: number; t: number }[] = [];\n private static readonly RAGE_THRESHOLD = 3;\n private static readonly RAGE_WINDOW_MS = 1_000;\n private static readonly RAGE_RADIUS_PX = 50;\n\n private readonly throttledMouseMove: (e: MouseEvent) => void;\n private readonly throttledScroll: () => void;\n\n constructor({\n emit,\n sessionId,\n sampleRate = 0.3,\n maxPoints = 2000,\n allowedPaths,\n }: HeatmapPluginOptions) {\n this.emit = emit;\n this.sessionId = sessionId;\n this.sampleRate = sampleRate;\n this.maxPoints = maxPoints;\n this.allowedPaths =\n allowedPaths && allowedPaths.length > 0\n ? new Set(allowedPaths.map((p) => normalizeTrackerPath(p)))\n : null;\n\n this.throttledMouseMove = throttle(this.handleMouseMove, 50);\n this.throttledScroll = throttle(this.handleScroll, 100);\n }\n\n init(): void {\n this.currentPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n\n document.addEventListener(\"mousemove\", this.throttledMouseMove);\n document.addEventListener(\"click\", this.handleClick);\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\n passive: true,\n });\n window.addEventListener(\"scroll\", this.throttledScroll, { passive: true });\n window.addEventListener(\"tracker:navigate\", this.handleNavigate);\n }\n\n destroy(): void {\n document.removeEventListener(\"mousemove\", this.throttledMouseMove);\n document.removeEventListener(\"click\", this.handleClick);\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\n window.removeEventListener(\"scroll\", this.throttledScroll);\n window.removeEventListener(\"tracker:navigate\", this.handleNavigate);\n }\n\n private canRecord(): boolean {\n if (\n this.allowedPaths !== null &&\n !this.allowedPaths.has(this.currentPath)\n ) {\n return false;\n }\n return (this.pointCounts[this.currentPath] ?? 0) < this.maxPoints;\n }\n\n private recordPoint(\n point: Omit<HeatmapPoint, \"path\" | \"timestamp\" | \"sessionId\">,\n ): void {\n if (!this.canRecord()) return;\n this.pointCounts[this.currentPath] =\n (this.pointCounts[this.currentPath] ?? 0) + 1;\n this.emit({\n type: \"heatmap\",\n data: {\n ...point,\n path: this.currentPath,\n timestamp: Date.now(),\n },\n });\n }\n\n /** Extract a human-readable label for the clicked element. */\n private getClickTarget(e: MouseEvent): string | undefined {\n const el = e.target as HTMLElement | null;\n if (!el) return undefined;\n const label =\n el.getAttribute(\"aria-label\") ||\n el.closest(\"[aria-label]\")?.getAttribute(\"aria-label\") ||\n el.getAttribute(\"data-track-label\") ||\n el.getAttribute(\"id\") ||\n (el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement\n ? el.innerText?.trim().slice(0, 60)\n : el.closest(\"button, a\")?.textContent?.trim().slice(0, 60));\n return label || undefined;\n }\n\n /** Detect rage-click bursts and emit a `rageclik` event when found. */\n private checkRageClick(x: number, y: number, path: string): void {\n const now = Date.now();\n this.recentClicks = this.recentClicks.filter(\n (c) => now - c.t < HeatmapPlugin.RAGE_WINDOW_MS,\n );\n this.recentClicks.push({ x, y, t: now });\n\n const nearby = this.recentClicks.filter(\n (c) => Math.hypot(c.x - x, c.y - y) <= HeatmapPlugin.RAGE_RADIUS_PX,\n );\n\n if (nearby.length >= HeatmapPlugin.RAGE_THRESHOLD) {\n this.emit({\n type: \"rageclik\",\n data: {\n path,\n x,\n y,\n count: nearby.length,\n timestamp: now,\n sessionId: this.sessionId,\n },\n });\n // Reset to avoid continuously re-triggering in the same burst.\n this.recentClicks = [];\n }\n }\n\n private handleMouseMove = (e: MouseEvent): void => {\n if (Math.random() > this.sampleRate) return;\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const absY = e.clientY + window.scrollY;\n this.recordPoint({\n x: e.clientX,\n y: absY,\n xPct: pageWidth > 0 ? (e.clientX / pageWidth) * 100 : 0,\n yPct: pageHeight > 0 ? (absY / pageHeight) * 100 : 0,\n pw: pageWidth,\n ph: pageHeight,\n vw: window.innerWidth,\n type: \"move\",\n });\n };\n\n private handleClick = (e: MouseEvent): void => {\n // Skip if a touchend already recorded this tap (within 500 ms)\n if (Date.now() - this.lastTouchTime < 500) return;\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const absY = e.clientY + window.scrollY;\n const target = this.getClickTarget(e);\n const anchor = getClickAnchor(e.target, e.clientX, e.clientY);\n this.recordPoint({\n x: e.clientX,\n y: absY,\n xPct: pageWidth > 0 ? (e.clientX / pageWidth) * 100 : 0,\n yPct: pageHeight > 0 ? (absY / pageHeight) * 100 : 0,\n pw: pageWidth,\n ph: pageHeight,\n vw: window.innerWidth,\n type: \"click\",\n ...(target ? { target } : {}),\n ...anchor,\n });\n this.checkRageClick(e.clientX, absY, this.currentPath);\n };\n\n /**\n * Records taps on touch devices.\n * Mobile browsers do fire a synthetic `click` after `touchend`, but some\n * frameworks call `preventDefault()` on touch events which suppresses it.\n * Listening to `touchend` directly ensures taps are always captured.\n * We mark the point with a short-lived flag so the subsequent synthetic\n * `click` event (if it fires) is deduplicated.\n */\n private lastTouchTime = 0;\n\n private handleTouchEnd = (e: TouchEvent): void => {\n const touch = e.changedTouches[0];\n if (!touch) return;\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const absY = touch.clientY + window.scrollY;\n this.lastTouchTime = Date.now();\n const anchor = getClickAnchor(e.target, touch.clientX, touch.clientY);\n this.recordPoint({\n x: touch.clientX,\n y: absY,\n xPct: pageWidth > 0 ? (touch.clientX / pageWidth) * 100 : 0,\n yPct: pageHeight > 0 ? (absY / pageHeight) * 100 : 0,\n pw: pageWidth,\n ph: pageHeight,\n vw: window.innerWidth,\n type: \"click\",\n ...anchor,\n });\n this.checkRageClick(touch.clientX, absY, this.currentPath);\n };\n\n private handleScroll = (): void => {\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n // Reach = how far the BOTTOM of the viewport got, as % of page height. The\n // per-session max of this drives the scroll-depth (\"reach\") heatmap.\n const reachedY = Math.min(pageHeight, scrollY + vh);\n const reachedPct = pageHeight > 0 ? (reachedY / pageHeight) * 100 : 0;\n const prevMax = this.maxScrollDepth[this.currentPath] ?? 0;\n const isNewMax = reachedPct > prevMax + 1;\n if (isNewMax) this.maxScrollDepth[this.currentPath] = reachedPct;\n // Sample to limit volume, but ALWAYS record a freshly reached max depth so\n // the reach curve captures the true deepest point each visitor saw.\n if (!isNewMax && Math.random() > this.sampleRate) return;\n const absX = scrollX + vw / 2;\n this.recordPoint({\n x: vw / 2,\n y: reachedY,\n xPct: pageWidth > 0 ? (absX / pageWidth) * 100 : 50,\n yPct: reachedPct,\n pw: pageWidth,\n ph: pageHeight,\n vw,\n type: \"scroll\",\n });\n };\n\n private handleNavigate = (e: CustomEvent<{ path: string }>): void => {\n this.currentPath = normalizeTrackerPath(e.detail.path);\n };\n}\n","export const ALPHANA_GZIP_MEDIA_TYPE = \"application/x-alphana-gzip\";\n\nexport function isCompressionSupported(): boolean {\n return typeof CompressionStream !== \"undefined\";\n}\n\n/** Gzip-compress a UTF-8 JSON string. Returns null when unsupported or on failure. */\nexport async function compressUtf8(json: string): Promise<Uint8Array | null> {\n if (!isCompressionSupported()) return null;\n\n try {\n const encoded = new TextEncoder().encode(json);\n const stream = new Blob([encoded])\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n } catch {\n return null;\n }\n}\n","import { ALPHANA_GZIP_MEDIA_TYPE, compressUtf8 } from \"./compress\";\n\nconst DEFAULT_THRESHOLD_BYTES = 1024;\n\nexport type IngestFetchOptions = {\n compressPayloads?: boolean;\n compressionThresholdBytes?: number;\n keepalive?: boolean;\n authHeaders?: Record<string, string>;\n};\n\ntype PreparedIngestBody =\n | { codec: \"json\"; body: string; contentType: \"application/json\" }\n | {\n codec: \"gzip\";\n body: Uint8Array;\n contentType: typeof ALPHANA_GZIP_MEDIA_TYPE;\n };\n\nasync function prepareIngestBody(\n jsonBody: string,\n options: IngestFetchOptions,\n forceJson = false,\n): Promise<PreparedIngestBody> {\n const threshold =\n options.compressionThresholdBytes ?? DEFAULT_THRESHOLD_BYTES;\n const shouldCompress =\n !forceJson &&\n options.compressPayloads !== false &&\n jsonBody.length >= threshold;\n\n if (shouldCompress) {\n const compressed = await compressUtf8(jsonBody);\n if (compressed) {\n return {\n codec: \"gzip\",\n body: compressed,\n contentType: ALPHANA_GZIP_MEDIA_TYPE,\n };\n }\n }\n\n return {\n codec: \"json\",\n body: jsonBody,\n contentType: \"application/json\",\n };\n}\n\nasync function sendPreparedIngest(\n url: string,\n prepared: PreparedIngestBody,\n options: IngestFetchOptions,\n): Promise<Response> {\n const headers: Record<string, string> = {\n \"Content-Type\": prepared.contentType,\n ...(prepared.codec === \"gzip\"\n ? { Accept: ALPHANA_GZIP_MEDIA_TYPE }\n : {}),\n ...(options.authHeaders ?? {}),\n };\n\n return fetch(url, {\n method: \"POST\",\n headers,\n body: prepared.body as BodyInit,\n keepalive: options.keepalive ?? false,\n });\n}\n\n/**\n * POST an ingest payload, optionally gzip-compressed.\n * Retries once as JSON when the server rejects gzip (415/400).\n * Errors are swallowed — analytics must never surface to end users.\n */\nexport async function postIngest(\n url: string,\n jsonBody: string,\n options: IngestFetchOptions = {},\n): Promise<void> {\n try {\n const prepared = await prepareIngestBody(jsonBody, options);\n let response = await sendPreparedIngest(url, prepared, options);\n\n if (\n prepared.codec === \"gzip\" &&\n (response.status === 415 || response.status === 400)\n ) {\n const fallback = await prepareIngestBody(jsonBody, options, true);\n response = await sendPreparedIngest(url, fallback, options);\n }\n } catch {\n // Intentionally silent.\n }\n}\n\n/**\n * Best-effort unload flush. Large/compressible payloads use keepalive fetch;\n * small unauthenticated payloads may still use sendBeacon with JSON.\n */\nexport function postIngestBeacon(\n url: string,\n jsonBody: string,\n options: IngestFetchOptions = {},\n): void {\n const threshold =\n options.compressionThresholdBytes ?? DEFAULT_THRESHOLD_BYTES;\n const wantsCompression =\n options.compressPayloads !== false && jsonBody.length >= threshold;\n\n if (wantsCompression || Object.keys(options.authHeaders ?? {}).length > 0) {\n void postIngest(url, jsonBody, { ...options, keepalive: true });\n return;\n }\n\n if (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n const blob = new Blob([jsonBody], { type: \"application/json\" });\n const accepted = navigator.sendBeacon(url, blob);\n if (accepted) return;\n }\n\n void postIngest(url, jsonBody, { ...options, keepalive: true });\n}\n","import { collectUrlFromEventsEndpoint } from \"../utils/api-base\";\nimport { buildCollectLogBody } from \"../utils/collect-payload\";\nimport { postIngest } from \"../utils/ingest-fetch\";\n\nexport type LogLevel = \"info\" | \"warn\" | \"error\";\n\nexport interface LogEntry {\n sessionId?: string;\n appId?: string;\n level: LogLevel;\n message: string;\n url?: string;\n stack?: string;\n meta?: Record<string, unknown>;\n timestamp: number;\n}\n\ntype ConsoleFn = (...args: unknown[]) => void;\n\n/**\n * Automatically captures console.info/warn/error output and unhandled errors,\n * then ships them to the unified `/api/collect` ingest endpoint.\n *\n * All console methods are restored exactly in `destroy()`.\n */\nexport class LogCapture {\n private readonly collectUrl: string;\n private readonly sessionId: string;\n private readonly appId?: string;\n private readonly authHeaders: Record<string, string>;\n private readonly compressPayloads: boolean;\n private readonly compressionThresholdBytes: number;\n\n // Original console methods preserved so we can restore them.\n private origInfo!: ConsoleFn;\n private origWarn!: ConsoleFn;\n private origError!: ConsoleFn;\n\n private prevOnError: OnErrorEventHandler = null;\n private prevOnUnhandledRejection:\n | ((e: PromiseRejectionEvent) => void)\n | null = null;\n\n private initialized = false;\n\n constructor(options: {\n endpoint: string;\n collectEndpoint?: string;\n sessionId: string;\n secretKey?: string;\n appId?: string;\n compressPayloads?: boolean;\n compressionThresholdBytes?: number;\n }) {\n this.collectUrl =\n options.collectEndpoint ??\n collectUrlFromEventsEndpoint(options.endpoint);\n this.sessionId = options.sessionId;\n this.appId = options.appId;\n this.authHeaders = options.secretKey\n ? { Authorization: `Bearer ${options.secretKey}` }\n : {};\n this.compressPayloads = options.compressPayloads ?? true;\n this.compressionThresholdBytes = options.compressionThresholdBytes ?? 1024;\n }\n\n init(): void {\n if (typeof window === \"undefined\" || this.initialized) return;\n\n this.origInfo = console.info.bind(console);\n this.origWarn = console.warn.bind(console);\n this.origError = console.error.bind(console);\n\n console.info = (...args: unknown[]) => {\n this.origInfo(...args);\n this.send(\"info\", this.format(args));\n };\n\n console.warn = (...args: unknown[]) => {\n this.origWarn(...args);\n this.send(\"warn\", this.format(args));\n };\n\n console.error = (...args: unknown[]) => {\n this.origError(...args);\n const [first] = args;\n const stack = first instanceof Error ? first.stack : undefined;\n this.send(\"error\", this.format(args), { stack });\n };\n\n this.prevOnError = window.onerror;\n window.onerror = (msg, src, line, col, err) => {\n this.send(\"error\", String(msg), {\n stack: err?.stack,\n meta: { src, line, col },\n });\n if (typeof this.prevOnError === \"function\") {\n return this.prevOnError(msg, src, line, col, err);\n }\n return false;\n };\n\n this.prevOnUnhandledRejection = (e: PromiseRejectionEvent) => {\n const reason = e.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : String(reason ?? \"Unhandled promise rejection\");\n this.send(\"error\", message, {\n stack: reason instanceof Error ? reason.stack : undefined,\n });\n };\n window.addEventListener(\n \"unhandledrejection\",\n this.prevOnUnhandledRejection,\n );\n\n this.initialized = true;\n }\n\n destroy(): void {\n if (!this.initialized) return;\n console.info = this.origInfo;\n console.warn = this.origWarn;\n console.error = this.origError;\n\n window.onerror = this.prevOnError;\n if (this.prevOnUnhandledRejection) {\n window.removeEventListener(\n \"unhandledrejection\",\n this.prevOnUnhandledRejection,\n );\n }\n this.initialized = false;\n }\n\n /** Manually capture a log entry (e.g. from try/catch). */\n capture(\n level: LogLevel,\n message: string,\n extra?: { stack?: string; meta?: Record<string, unknown> },\n ): void {\n this.send(level, message, extra);\n }\n\n private format(args: unknown[]): string {\n return args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === \"object\") {\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n }\n return String(a);\n })\n .join(\" \");\n }\n\n private send(\n level: LogLevel,\n message: string,\n extra?: { stack?: string; meta?: Record<string, unknown> },\n ): void {\n const entry: LogEntry = {\n sessionId: this.sessionId,\n ...(this.appId ? { appId: this.appId } : {}),\n level,\n message,\n url: typeof window !== \"undefined\" ? window.location.href : undefined,\n stack: extra?.stack,\n meta: extra?.meta,\n timestamp: Date.now(),\n };\n const body = JSON.stringify(buildCollectLogBody(entry));\n\n void postIngest(this.collectUrl, body, {\n compressPayloads: this.compressPayloads,\n compressionThresholdBytes: this.compressionThresholdBytes,\n authHeaders: this.authHeaders,\n keepalive: true,\n }).catch((err: unknown) => {\n if (this.origError) {\n this.origError(\"[user-tracker] Failed to send log:\", err);\n }\n });\n }\n}\n","var NodeType;\r\n(function (NodeType) {\r\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n var host = n === null || n === void 0 ? void 0 : n.host;\r\n return Boolean((host === null || host === void 0 ? void 0 : host.shadowRoot) === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n if (cssText.includes(' background-clip: text;') &&\r\n !cssText.includes(' -webkit-background-clip: text;')) {\r\n cssText = cssText.replace(' background-clip: text;', ' -webkit-background-clip: text; background-clip: text;');\r\n }\r\n return cssText;\r\n}\r\nfunction getCssRulesString(s) {\r\n try {\r\n var rules = s.rules || s.cssRules;\r\n return rules\r\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules).map(getCssRuleString).join(''))\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n}\r\nfunction getCssRuleString(rule) {\r\n var cssStringified = rule.cssText;\r\n if (isCSSImportRule(rule)) {\r\n try {\r\n cssStringified = getCssRulesString(rule.styleSheet) || cssStringified;\r\n }\r\n catch (_a) {\r\n }\r\n }\r\n return cssStringified;\r\n}\r\nfunction isCSSImportRule(rule) {\r\n return 'styleSheet' in rule;\r\n}\r\nvar Mirror = (function () {\r\n function Mirror() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n Mirror.prototype.getId = function (n) {\r\n var _a;\r\n if (!n)\r\n return -1;\r\n var id = (_a = this.getMeta(n)) === null || _a === void 0 ? void 0 : _a.id;\r\n return id !== null && id !== void 0 ? id : -1;\r\n };\r\n Mirror.prototype.getNode = function (id) {\r\n return this.idNodeMap.get(id) || null;\r\n };\r\n Mirror.prototype.getIds = function () {\r\n return Array.from(this.idNodeMap.keys());\r\n };\r\n Mirror.prototype.getMeta = function (n) {\r\n return this.nodeMetaMap.get(n) || null;\r\n };\r\n Mirror.prototype.removeNodeFromMap = function (n) {\r\n var _this = this;\r\n var id = this.getId(n);\r\n this.idNodeMap[\"delete\"](id);\r\n if (n.childNodes) {\r\n n.childNodes.forEach(function (childNode) {\r\n return _this.removeNodeFromMap(childNode);\r\n });\r\n }\r\n };\r\n Mirror.prototype.has = function (id) {\r\n return this.idNodeMap.has(id);\r\n };\r\n Mirror.prototype.hasNode = function (node) {\r\n return this.nodeMetaMap.has(node);\r\n };\r\n Mirror.prototype.add = function (n, meta) {\r\n var id = meta.id;\r\n this.idNodeMap.set(id, n);\r\n this.nodeMetaMap.set(n, meta);\r\n };\r\n Mirror.prototype.replace = function (id, n) {\r\n var oldNode = this.getNode(id);\r\n if (oldNode) {\r\n var meta = this.nodeMetaMap.get(oldNode);\r\n if (meta)\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n this.idNodeMap.set(id, n);\r\n };\r\n Mirror.prototype.reset = function () {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n };\r\n return Mirror;\r\n}());\r\nfunction createMirror() {\r\n return new Mirror();\r\n}\r\nfunction maskInputValue(_a) {\r\n var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn;\r\n var text = value || '';\r\n if (maskInputOptions[tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n if (maskInputFn) {\r\n text = maskInputFn(text);\r\n }\r\n else {\r\n text = '*'.repeat(text.length);\r\n }\r\n }\r\n return text;\r\n}\r\nvar ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n var ctx = canvas.getContext('2d');\r\n if (!ctx)\r\n return true;\r\n var chunkSize = 50;\r\n for (var x = 0; x < canvas.width; x += chunkSize) {\r\n for (var y = 0; y < canvas.height; y += chunkSize) {\r\n var getImageData = ctx.getImageData;\r\n var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n : getImageData;\r\n var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n if (pixelBuffer.some(function (pixel) { return pixel !== 0; }))\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\n\nvar _id = 1;\r\nvar tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nvar IGNORED_NODE = -2;\r\nfunction genId() {\r\n return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n if (element instanceof HTMLFormElement) {\r\n return 'form';\r\n }\r\n var processedTagName = element.tagName.toLowerCase().trim();\r\n if (tagNameRegex.test(processedTagName)) {\r\n return 'div';\r\n }\r\n return processedTagName;\r\n}\r\nfunction stringifyStyleSheet(sheet) {\r\n return sheet.cssRules\r\n ? Array.from(sheet.cssRules)\r\n .map(function (rule) { return rule.cssText || ''; })\r\n .join('')\r\n : '';\r\n}\r\nfunction extractOrigin(url) {\r\n var origin = '';\r\n if (url.indexOf('//') > -1) {\r\n origin = url.split('/').slice(0, 3).join('/');\r\n }\r\n else {\r\n origin = url.split('/')[0];\r\n }\r\n origin = origin.split('?')[0];\r\n return origin;\r\n}\r\nvar canvasService;\r\nvar canvasCtx;\r\nvar URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nvar RELATIVE_PATH = /^(?!www\\.|(?:http|ftp)s?:\\/\\/|[A-Za-z]:\\\\|\\/\\/|#).*/;\r\nvar DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) {\r\n var filePath = path1 || path2 || path3;\r\n var maybeQuote = quote1 || quote2 || '';\r\n if (!filePath) {\r\n return origin;\r\n }\r\n if (!RELATIVE_PATH.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (DATA_URI.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (filePath[0] === '/') {\r\n return \"url(\".concat(maybeQuote).concat(extractOrigin(href) + filePath).concat(maybeQuote, \")\");\r\n }\r\n var stack = href.split('/');\r\n var parts = filePath.split('/');\r\n stack.pop();\r\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\r\n var part = parts_1[_i];\r\n if (part === '.') {\r\n continue;\r\n }\r\n else if (part === '..') {\r\n stack.pop();\r\n }\r\n else {\r\n stack.push(part);\r\n }\r\n }\r\n return \"url(\".concat(maybeQuote).concat(stack.join('/')).concat(maybeQuote, \")\");\r\n });\r\n}\r\nvar SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nvar SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n if (attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var pos = 0;\r\n function collectCharacters(regEx) {\r\n var chars;\r\n var match = regEx.exec(attributeValue.substring(pos));\r\n if (match) {\r\n chars = match[0];\r\n pos += chars.length;\r\n return chars;\r\n }\r\n return '';\r\n }\r\n var output = [];\r\n while (true) {\r\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n if (pos >= attributeValue.length) {\r\n break;\r\n }\r\n var url = collectCharacters(SRCSET_NOT_SPACES);\r\n if (url.slice(-1) === ',') {\r\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n output.push(url);\r\n }\r\n else {\r\n var descriptorsStr = '';\r\n url = absoluteToDoc(doc, url);\r\n var inParens = false;\r\n while (true) {\r\n var c = attributeValue.charAt(pos);\r\n if (c === '') {\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (!inParens) {\r\n if (c === ',') {\r\n pos += 1;\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (c === '(') {\r\n inParens = true;\r\n }\r\n }\r\n else {\r\n if (c === ')') {\r\n inParens = false;\r\n }\r\n }\r\n descriptorsStr += c;\r\n pos += 1;\r\n }\r\n }\r\n }\r\n return output.join(', ');\r\n}\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n if (!attributeValue || attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var a = doc.createElement('a');\r\n a.href = attributeValue;\r\n return a.href;\r\n}\r\nfunction isSVGElement(el) {\r\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref() {\r\n var a = document.createElement('a');\r\n a.href = '';\r\n return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value) {\r\n if (name === 'src' ||\r\n (name === 'href' && value && !(tagName === 'use' && value[0] === '#'))) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'xlink:href' && value && value[0] !== '#') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'background' &&\r\n value &&\r\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'srcset' && value) {\r\n return getAbsoluteSrcsetString(doc, value);\r\n }\r\n else if (name === 'style' && value) {\r\n return absoluteToStylesheet(value, getHref());\r\n }\r\n else if (tagName === 'object' && name === 'data' && value) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else {\r\n return value;\r\n }\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector) {\r\n if (typeof blockClass === 'string') {\r\n if (element.classList.contains(blockClass)) {\r\n return true;\r\n }\r\n }\r\n else {\r\n for (var eIndex = element.classList.length; eIndex--;) {\r\n var className = element.classList[eIndex];\r\n if (blockClass.test(className)) {\r\n return true;\r\n }\r\n }\r\n }\r\n if (blockSelector) {\r\n return element.matches(blockSelector);\r\n }\r\n return false;\r\n}\r\nfunction classMatchesRegex(node, regex, checkAncestors) {\r\n if (!node)\r\n return false;\r\n if (node.nodeType !== node.ELEMENT_NODE) {\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n }\r\n for (var eIndex = node.classList.length; eIndex--;) {\r\n var className = node.classList[eIndex];\r\n if (regex.test(className)) {\r\n return true;\r\n }\r\n }\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector) {\r\n var el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (el === null)\r\n return false;\r\n if (typeof maskTextClass === 'string') {\r\n if (el.classList.contains(maskTextClass))\r\n return true;\r\n if (el.closest(\".\".concat(maskTextClass)))\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, maskTextClass, true))\r\n return true;\r\n }\r\n if (maskTextSelector) {\r\n if (el.matches(maskTextSelector))\r\n return true;\r\n if (el.closest(maskTextSelector))\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n var win = iframeEl.contentWindow;\r\n if (!win) {\r\n return;\r\n }\r\n var fired = false;\r\n var readyState;\r\n try {\r\n readyState = win.document.readyState;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (readyState !== 'complete') {\r\n var timer_1 = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, iframeLoadTimeout);\r\n iframeEl.addEventListener('load', function () {\r\n clearTimeout(timer_1);\r\n fired = true;\r\n listener();\r\n });\r\n return;\r\n }\r\n var blankUrl = 'about:blank';\r\n if (win.location.href !== blankUrl ||\r\n iframeEl.src === blankUrl ||\r\n iframeEl.src === '') {\r\n setTimeout(listener, 0);\r\n return iframeEl.addEventListener('load', listener);\r\n }\r\n iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n var fired = false;\r\n var styleSheetLoaded;\r\n try {\r\n styleSheetLoaded = link.sheet;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (styleSheetLoaded)\r\n return;\r\n var timer = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, styleSheetLoadTimeout);\r\n link.addEventListener('load', function () {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n}\r\nfunction serializeNode(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c;\r\n var rootId = getRootId(doc, mirror);\r\n switch (n.nodeType) {\r\n case n.DOCUMENT_NODE:\r\n if (n.compatMode !== 'CSS1Compat') {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n compatMode: n.compatMode\r\n };\r\n }\r\n else {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: []\r\n };\r\n }\r\n case n.DOCUMENT_TYPE_NODE:\r\n return {\r\n type: NodeType.DocumentType,\r\n name: n.name,\r\n publicId: n.publicId,\r\n systemId: n.systemId,\r\n rootId: rootId\r\n };\r\n case n.ELEMENT_NODE:\r\n return serializeElementNode(n, {\r\n doc: doc,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement,\r\n rootId: rootId\r\n });\r\n case n.TEXT_NODE:\r\n return serializeTextNode(n, {\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n maskTextFn: maskTextFn,\r\n rootId: rootId\r\n });\r\n case n.CDATA_SECTION_NODE:\r\n return {\r\n type: NodeType.CDATA,\r\n textContent: '',\r\n rootId: rootId\r\n };\r\n case n.COMMENT_NODE:\r\n return {\r\n type: NodeType.Comment,\r\n textContent: n.textContent || '',\r\n rootId: rootId\r\n };\r\n default:\r\n return false;\r\n }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n if (!mirror.hasNode(doc))\r\n return undefined;\r\n var docId = mirror.getId(doc);\r\n return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n var _a;\r\n var maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, maskTextFn = options.maskTextFn, rootId = options.rootId;\r\n var parentTagName = n.parentNode && n.parentNode.tagName;\r\n var textContent = n.textContent;\r\n var isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n var isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n if (isStyle && textContent) {\r\n try {\r\n if (n.nextSibling || n.previousSibling) {\r\n }\r\n else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) {\r\n textContent = stringifyStyleSheet(n.parentNode.sheet);\r\n }\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot get CSS styles from text's parentNode. Error: \".concat(err), n);\r\n }\r\n textContent = absoluteToStylesheet(textContent, getHref());\r\n }\r\n if (isScript) {\r\n textContent = 'SCRIPT_PLACEHOLDER';\r\n }\r\n if (!isStyle &&\r\n !isScript &&\r\n textContent &&\r\n needMaskingText(n, maskTextClass, maskTextSelector)) {\r\n textContent = maskTextFn\r\n ? maskTextFn(textContent)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n return {\r\n type: NodeType.Text,\r\n textContent: textContent || '',\r\n isStyle: isStyle,\r\n rootId: rootId\r\n };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c, rootId = options.rootId;\r\n var needBlock = _isBlockedElement(n, blockClass, blockSelector);\r\n var tagName = getValidTagName(n);\r\n var attributes = {};\r\n var len = n.attributes.length;\r\n for (var i = 0; i < len; i++) {\r\n var attr = n.attributes[i];\r\n attributes[attr.name] = transformAttribute(doc, tagName, attr.name, attr.value);\r\n }\r\n if (tagName === 'link' && inlineStylesheet) {\r\n var stylesheet = Array.from(doc.styleSheets).find(function (s) {\r\n return s.href === n.href;\r\n });\r\n var cssText = null;\r\n if (stylesheet) {\r\n cssText = getCssRulesString(stylesheet);\r\n }\r\n if (cssText) {\r\n delete attributes.rel;\r\n delete attributes.href;\r\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n }\r\n }\r\n if (tagName === 'style' &&\r\n n.sheet &&\r\n !(n.innerText || n.textContent || '').trim().length) {\r\n var cssText = getCssRulesString(n.sheet);\r\n if (cssText) {\r\n attributes._cssText = absoluteToStylesheet(cssText, getHref());\r\n }\r\n }\r\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\r\n var value = n.value;\r\n var checked = n.checked;\r\n if (attributes.type !== 'radio' &&\r\n attributes.type !== 'checkbox' &&\r\n attributes.type !== 'submit' &&\r\n attributes.type !== 'button' &&\r\n value) {\r\n attributes.value = maskInputValue({\r\n type: attributes.type,\r\n tagName: tagName,\r\n value: value,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn\r\n });\r\n }\r\n else if (checked) {\r\n attributes.checked = checked;\r\n }\r\n }\r\n if (tagName === 'option') {\r\n if (n.selected && !maskInputOptions['select']) {\r\n attributes.selected = true;\r\n }\r\n else {\r\n delete attributes.selected;\r\n }\r\n }\r\n if (tagName === 'canvas' && recordCanvas) {\r\n if (n.__context === '2d') {\r\n if (!is2DCanvasBlank(n)) {\r\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n }\r\n else if (!('__context' in n)) {\r\n var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n var blankCanvas = document.createElement('canvas');\r\n blankCanvas.width = n.width;\r\n blankCanvas.height = n.height;\r\n var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n if (canvasDataURL !== blankCanvasDataURL) {\r\n attributes.rr_dataURL = canvasDataURL;\r\n }\r\n }\r\n }\r\n if (tagName === 'img' && inlineImages) {\r\n if (!canvasService) {\r\n canvasService = doc.createElement('canvas');\r\n canvasCtx = canvasService.getContext('2d');\r\n }\r\n var image_1 = n;\r\n var oldValue_1 = image_1.crossOrigin;\r\n image_1.crossOrigin = 'anonymous';\r\n var recordInlineImage = function () {\r\n try {\r\n canvasService.width = image_1.naturalWidth;\r\n canvasService.height = image_1.naturalHeight;\r\n canvasCtx.drawImage(image_1, 0, 0);\r\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot inline img src=\".concat(image_1.currentSrc, \"! Error: \").concat(err));\r\n }\r\n oldValue_1\r\n ? (attributes.crossOrigin = oldValue_1)\r\n : image_1.removeAttribute('crossorigin');\r\n };\r\n if (image_1.complete && image_1.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image_1.onload = recordInlineImage;\r\n }\r\n if (tagName === 'audio' || tagName === 'video') {\r\n attributes.rr_mediaState = n.paused\r\n ? 'paused'\r\n : 'played';\r\n attributes.rr_mediaCurrentTime = n.currentTime;\r\n }\r\n if (!newlyAddedElement) {\r\n if (n.scrollLeft) {\r\n attributes.rr_scrollLeft = n.scrollLeft;\r\n }\r\n if (n.scrollTop) {\r\n attributes.rr_scrollTop = n.scrollTop;\r\n }\r\n }\r\n if (needBlock) {\r\n var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height;\r\n attributes = {\r\n \"class\": attributes[\"class\"],\r\n rr_width: \"\".concat(width, \"px\"),\r\n rr_height: \"\".concat(height, \"px\")\r\n };\r\n }\r\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n if (!n.contentDocument) {\r\n attributes.rr_src = attributes.src;\r\n }\r\n delete attributes.src;\r\n }\r\n return {\r\n type: NodeType.Element,\r\n tagName: tagName,\r\n attributes: attributes,\r\n childNodes: [],\r\n isSVG: isSVGElement(n) || undefined,\r\n needBlock: needBlock,\r\n rootId: rootId\r\n };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n if (maybeAttr === undefined) {\r\n return '';\r\n }\r\n else {\r\n return maybeAttr.toLowerCase();\r\n }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n return true;\r\n }\r\n else if (sn.type === NodeType.Element) {\r\n if (slimDOMOptions.script &&\r\n (sn.tagName === 'script' ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'preload' &&\r\n sn.attributes.as === 'script') ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'prefetch' &&\r\n typeof sn.attributes.href === 'string' &&\r\n sn.attributes.href.endsWith('.js')))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headFavicon &&\r\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n (sn.tagName === 'meta' &&\r\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n return true;\r\n }\r\n else if (sn.tagName === 'meta') {\r\n if (slimDOMOptions.headMetaDescKeywords &&\r\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaSocial &&\r\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaRobots &&\r\n (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaHttpEquiv &&\r\n sn.attributes['http-equiv'] !== undefined) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaAuthorship &&\r\n (lowerIfExists(sn.attributes.name) === 'author' ||\r\n lowerIfExists(sn.attributes.name) === 'generator' ||\r\n lowerIfExists(sn.attributes.name) === 'framework' ||\r\n lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n lowerIfExists(sn.attributes.name) === 'progid' ||\r\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaVerification &&\r\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n lowerIfExists(sn.attributes.name) === 'verification' ||\r\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.inlineStylesheet, inlineStylesheet = _b === void 0 ? true : _b, _c = options.maskInputOptions, maskInputOptions = _c === void 0 ? {} : _c, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, slimDOMOptions = options.slimDOMOptions, _d = options.dataURLOptions, dataURLOptions = _d === void 0 ? {} : _d, _e = options.inlineImages, inlineImages = _e === void 0 ? false : _e, _f = options.recordCanvas, recordCanvas = _f === void 0 ? false : _f, onSerialize = options.onSerialize, onIframeLoad = options.onIframeLoad, _g = options.iframeLoadTimeout, iframeLoadTimeout = _g === void 0 ? 5000 : _g, onStylesheetLoad = options.onStylesheetLoad, _h = options.stylesheetLoadTimeout, stylesheetLoadTimeout = _h === void 0 ? 5000 : _h, _j = options.keepIframeSrcFn, keepIframeSrcFn = _j === void 0 ? function () { return false; } : _j, _k = options.newlyAddedElement, newlyAddedElement = _k === void 0 ? false : _k;\r\n var _l = options.preserveWhiteSpace, preserveWhiteSpace = _l === void 0 ? true : _l;\r\n var _serializedNode = serializeNode(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement\r\n });\r\n if (!_serializedNode) {\r\n console.warn(n, 'not serialized');\r\n return null;\r\n }\r\n var id;\r\n if (mirror.hasNode(n)) {\r\n id = mirror.getId(n);\r\n }\r\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n (!preserveWhiteSpace &&\r\n _serializedNode.type === NodeType.Text &&\r\n !_serializedNode.isStyle &&\r\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n id = IGNORED_NODE;\r\n }\r\n else {\r\n id = genId();\r\n }\r\n var serializedNode = Object.assign(_serializedNode, { id: id });\r\n mirror.add(n, serializedNode);\r\n if (id === IGNORED_NODE) {\r\n return null;\r\n }\r\n if (onSerialize) {\r\n onSerialize(n);\r\n }\r\n var recordChild = !skipChild;\r\n if (serializedNode.type === NodeType.Element) {\r\n recordChild = recordChild && !serializedNode.needBlock;\r\n delete serializedNode.needBlock;\r\n var shadowRoot = n.shadowRoot;\r\n if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n serializedNode.isShadowHost = true;\r\n }\r\n if ((serializedNode.type === NodeType.Document ||\r\n serializedNode.type === NodeType.Element) &&\r\n recordChild) {\r\n if (slimDOMOptions.headWhitespace &&\r\n serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'head') {\r\n preserveWhiteSpace = false;\r\n }\r\n var bypassOptions = {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: skipChild,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n };\r\n for (var _i = 0, _m = Array.from(n.childNodes); _i < _m.length; _i++) {\r\n var childN = _m[_i];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n if (isElement(n) && n.shadowRoot) {\r\n for (var _o = 0, _p = Array.from(n.shadowRoot.childNodes); _o < _p.length; _o++) {\r\n var childN = _p[_o];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n isNativeShadowDom(n.shadowRoot) &&\r\n (serializedChildNode.isShadow = true);\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n }\r\n }\r\n if (n.parentNode &&\r\n isShadowRoot(n.parentNode) &&\r\n isNativeShadowDom(n.parentNode)) {\r\n serializedNode.isShadow = true;\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'iframe') {\r\n onceIframeLoaded(n, function () {\r\n var iframeDoc = n.contentDocument;\r\n if (iframeDoc && onIframeLoad) {\r\n var serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n doc: iframeDoc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedIframeNode) {\r\n onIframeLoad(n, serializedIframeNode);\r\n }\r\n }\r\n }, iframeLoadTimeout);\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'link' &&\r\n serializedNode.attributes.rel === 'stylesheet') {\r\n onceStylesheetLoaded(n, function () {\r\n if (onStylesheetLoad) {\r\n var serializedLinkNode = serializeNodeWithId(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedLinkNode) {\r\n onStylesheetLoad(n, serializedLinkNode);\r\n }\r\n }\r\n }, stylesheetLoadTimeout);\r\n }\r\n return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n var _a = options || {}, _b = _a.mirror, mirror = _b === void 0 ? new Mirror() : _b, _c = _a.blockClass, blockClass = _c === void 0 ? 'rr-block' : _c, _d = _a.blockSelector, blockSelector = _d === void 0 ? null : _d, _e = _a.maskTextClass, maskTextClass = _e === void 0 ? 'rr-mask' : _e, _f = _a.maskTextSelector, maskTextSelector = _f === void 0 ? null : _f, _g = _a.inlineStylesheet, inlineStylesheet = _g === void 0 ? true : _g, _h = _a.inlineImages, inlineImages = _h === void 0 ? false : _h, _j = _a.recordCanvas, recordCanvas = _j === void 0 ? false : _j, _k = _a.maskAllInputs, maskAllInputs = _k === void 0 ? false : _k, maskTextFn = _a.maskTextFn, maskInputFn = _a.maskInputFn, _l = _a.slimDOM, slimDOM = _l === void 0 ? false : _l, dataURLOptions = _a.dataURLOptions, preserveWhiteSpace = _a.preserveWhiteSpace, onSerialize = _a.onSerialize, onIframeLoad = _a.onIframeLoad, iframeLoadTimeout = _a.iframeLoadTimeout, onStylesheetLoad = _a.onStylesheetLoad, stylesheetLoadTimeout = _a.stylesheetLoadTimeout, _m = _a.keepIframeSrcFn, keepIframeSrcFn = _m === void 0 ? function () { return false; } : _m;\r\n var maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true\r\n }\r\n : maskAllInputs === false\r\n ? {\r\n password: true\r\n }\r\n : maskAllInputs;\r\n var slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n ?\r\n {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaDescKeywords: slimDOM === 'all',\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaAuthorship: true,\r\n headMetaVerification: true\r\n }\r\n : slimDOM === false\r\n ? {}\r\n : slimDOM;\r\n return serializeNodeWithId(n, {\r\n doc: n,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: false\r\n });\r\n}\r\n\nvar commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options) {\r\n if (options === void 0) { options = {}; }\r\n var lineno = 1;\r\n var column = 1;\r\n function updatePosition(str) {\r\n var lines = str.match(/\\n/g);\r\n if (lines) {\r\n lineno += lines.length;\r\n }\r\n var i = str.lastIndexOf('\\n');\r\n column = i === -1 ? column + str.length : str.length - i;\r\n }\r\n function position() {\r\n var start = { line: lineno, column: column };\r\n return function (node) {\r\n node.position = new Position(start);\r\n whitespace();\r\n return node;\r\n };\r\n }\r\n var Position = (function () {\r\n function Position(start) {\r\n this.start = start;\r\n this.end = { line: lineno, column: column };\r\n this.source = options.source;\r\n }\r\n return Position;\r\n }());\r\n Position.prototype.content = css;\r\n var errorsList = [];\r\n function error(msg) {\r\n var err = new Error(\"\".concat(options.source || '', \":\").concat(lineno, \":\").concat(column, \": \").concat(msg));\r\n err.reason = msg;\r\n err.filename = options.source;\r\n err.line = lineno;\r\n err.column = column;\r\n err.source = css;\r\n if (options.silent) {\r\n errorsList.push(err);\r\n }\r\n else {\r\n throw err;\r\n }\r\n }\r\n function stylesheet() {\r\n var rulesList = rules();\r\n return {\r\n type: 'stylesheet',\r\n stylesheet: {\r\n source: options.source,\r\n rules: rulesList,\r\n parsingErrors: errorsList\r\n }\r\n };\r\n }\r\n function open() {\r\n return match(/^{\\s*/);\r\n }\r\n function close() {\r\n return match(/^}/);\r\n }\r\n function rules() {\r\n var node;\r\n var rules = [];\r\n whitespace();\r\n comments(rules);\r\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n if (node !== false) {\r\n rules.push(node);\r\n comments(rules);\r\n }\r\n }\r\n return rules;\r\n }\r\n function match(re) {\r\n var m = re.exec(css);\r\n if (!m) {\r\n return;\r\n }\r\n var str = m[0];\r\n updatePosition(str);\r\n css = css.slice(str.length);\r\n return m;\r\n }\r\n function whitespace() {\r\n match(/^\\s*/);\r\n }\r\n function comments(rules) {\r\n if (rules === void 0) { rules = []; }\r\n var c;\r\n while ((c = comment())) {\r\n if (c !== false) {\r\n rules.push(c);\r\n }\r\n c = comment();\r\n }\r\n return rules;\r\n }\r\n function comment() {\r\n var pos = position();\r\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n return;\r\n }\r\n var i = 2;\r\n while ('' !== css.charAt(i) &&\r\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n ++i;\r\n }\r\n i += 2;\r\n if ('' === css.charAt(i - 1)) {\r\n return error('End of comment missing');\r\n }\r\n var str = css.slice(2, i - 2);\r\n column += 2;\r\n updatePosition(str);\r\n css = css.slice(i);\r\n column += 2;\r\n return pos({\r\n type: 'comment',\r\n comment: str\r\n });\r\n }\r\n function selector() {\r\n var m = match(/^([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n return trim(m[0])\r\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\r\n return m.replace(/,/g, '\\u200C');\r\n })\r\n .split(/\\s*(?![^(]*\\)),\\s*/)\r\n .map(function (s) {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n function declaration() {\r\n var pos = position();\r\n var propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n if (!propMatch) {\r\n return;\r\n }\r\n var prop = trim(propMatch[0]);\r\n if (!match(/^:\\s*/)) {\r\n return error(\"property missing ':'\");\r\n }\r\n var val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n var ret = pos({\r\n type: 'declaration',\r\n property: prop.replace(commentre, ''),\r\n value: val ? trim(val[0]).replace(commentre, '') : ''\r\n });\r\n match(/^[;\\s]*/);\r\n return ret;\r\n }\r\n function declarations() {\r\n var decls = [];\r\n if (!open()) {\r\n return error(\"missing '{'\");\r\n }\r\n comments(decls);\r\n var decl;\r\n while ((decl = declaration())) {\r\n if (decl !== false) {\r\n decls.push(decl);\r\n comments(decls);\r\n }\r\n decl = declaration();\r\n }\r\n if (!close()) {\r\n return error(\"missing '}'\");\r\n }\r\n return decls;\r\n }\r\n function keyframe() {\r\n var m;\r\n var vals = [];\r\n var pos = position();\r\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n vals.push(m[1]);\r\n match(/^,\\s*/);\r\n }\r\n if (!vals.length) {\r\n return;\r\n }\r\n return pos({\r\n type: 'keyframe',\r\n values: vals,\r\n declarations: declarations()\r\n });\r\n }\r\n function atkeyframes() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = m[1];\r\n m = match(/^([-\\w]+)\\s*/);\r\n if (!m) {\r\n return error('@keyframes missing name');\r\n }\r\n var name = m[1];\r\n if (!open()) {\r\n return error(\"@keyframes missing '{'\");\r\n }\r\n var frame;\r\n var frames = comments();\r\n while ((frame = keyframe())) {\r\n frames.push(frame);\r\n frames = frames.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@keyframes missing '}'\");\r\n }\r\n return pos({\r\n type: 'keyframes',\r\n name: name,\r\n vendor: vendor,\r\n keyframes: frames\r\n });\r\n }\r\n function atsupports() {\r\n var pos = position();\r\n var m = match(/^@supports *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var supports = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@supports missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@supports missing '}'\");\r\n }\r\n return pos({\r\n type: 'supports',\r\n supports: supports,\r\n rules: style\r\n });\r\n }\r\n function athost() {\r\n var pos = position();\r\n var m = match(/^@host\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@host missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@host missing '}'\");\r\n }\r\n return pos({\r\n type: 'host',\r\n rules: style\r\n });\r\n }\r\n function atmedia() {\r\n var pos = position();\r\n var m = match(/^@media *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var media = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@media missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@media missing '}'\");\r\n }\r\n return pos({\r\n type: 'media',\r\n media: media,\r\n rules: style\r\n });\r\n }\r\n function atcustommedia() {\r\n var pos = position();\r\n var m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n if (!m) {\r\n return;\r\n }\r\n return pos({\r\n type: 'custom-media',\r\n name: trim(m[1]),\r\n media: trim(m[2])\r\n });\r\n }\r\n function atpage() {\r\n var pos = position();\r\n var m = match(/^@page */);\r\n if (!m) {\r\n return;\r\n }\r\n var sel = selector() || [];\r\n if (!open()) {\r\n return error(\"@page missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@page missing '}'\");\r\n }\r\n return pos({\r\n type: 'page',\r\n selectors: sel,\r\n declarations: decls\r\n });\r\n }\r\n function atdocument() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = trim(m[1]);\r\n var doc = trim(m[2]);\r\n if (!open()) {\r\n return error(\"@document missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@document missing '}'\");\r\n }\r\n return pos({\r\n type: 'document',\r\n document: doc,\r\n vendor: vendor,\r\n rules: style\r\n });\r\n }\r\n function atfontface() {\r\n var pos = position();\r\n var m = match(/^@font-face\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@font-face missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@font-face missing '}'\");\r\n }\r\n return pos({\r\n type: 'font-face',\r\n declarations: decls\r\n });\r\n }\r\n var atimport = _compileAtrule('import');\r\n var atcharset = _compileAtrule('charset');\r\n var atnamespace = _compileAtrule('namespace');\r\n function _compileAtrule(name) {\r\n var re = new RegExp('^@' + name + '\\\\s*([^;]+);');\r\n return function () {\r\n var pos = position();\r\n var m = match(re);\r\n if (!m) {\r\n return;\r\n }\r\n var ret = { type: name };\r\n ret[name] = m[1].trim();\r\n return pos(ret);\r\n };\r\n }\r\n function atrule() {\r\n if (css[0] !== '@') {\r\n return;\r\n }\r\n return (atkeyframes() ||\r\n atmedia() ||\r\n atcustommedia() ||\r\n atsupports() ||\r\n atimport() ||\r\n atcharset() ||\r\n atnamespace() ||\r\n atdocument() ||\r\n atpage() ||\r\n athost() ||\r\n atfontface());\r\n }\r\n function rule() {\r\n var pos = position();\r\n var sel = selector();\r\n if (!sel) {\r\n return error('selector missing');\r\n }\r\n comments();\r\n return pos({\r\n type: 'rule',\r\n selectors: sel,\r\n declarations: declarations()\r\n });\r\n }\r\n return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n var isNode = obj && typeof obj.type === 'string';\r\n var childParent = isNode ? obj : parent;\r\n for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n var k = _a[_i];\r\n var value = obj[k];\r\n if (Array.isArray(value)) {\r\n value.forEach(function (v) {\r\n addParent(v, childParent);\r\n });\r\n }\r\n else if (value && typeof value === 'object') {\r\n addParent(value, childParent);\r\n }\r\n }\r\n if (isNode) {\r\n Object.defineProperty(obj, 'parent', {\r\n configurable: true,\r\n writable: true,\r\n enumerable: false,\r\n value: parent || null\r\n });\r\n }\r\n return obj;\r\n}\n\nvar tagMap = {\r\n script: 'noscript',\r\n altglyph: 'altGlyph',\r\n altglyphdef: 'altGlyphDef',\r\n altglyphitem: 'altGlyphItem',\r\n animatecolor: 'animateColor',\r\n animatemotion: 'animateMotion',\r\n animatetransform: 'animateTransform',\r\n clippath: 'clipPath',\r\n feblend: 'feBlend',\r\n fecolormatrix: 'feColorMatrix',\r\n fecomponenttransfer: 'feComponentTransfer',\r\n fecomposite: 'feComposite',\r\n feconvolvematrix: 'feConvolveMatrix',\r\n fediffuselighting: 'feDiffuseLighting',\r\n fedisplacementmap: 'feDisplacementMap',\r\n fedistantlight: 'feDistantLight',\r\n fedropshadow: 'feDropShadow',\r\n feflood: 'feFlood',\r\n fefunca: 'feFuncA',\r\n fefuncb: 'feFuncB',\r\n fefuncg: 'feFuncG',\r\n fefuncr: 'feFuncR',\r\n fegaussianblur: 'feGaussianBlur',\r\n feimage: 'feImage',\r\n femerge: 'feMerge',\r\n femergenode: 'feMergeNode',\r\n femorphology: 'feMorphology',\r\n feoffset: 'feOffset',\r\n fepointlight: 'fePointLight',\r\n fespecularlighting: 'feSpecularLighting',\r\n fespotlight: 'feSpotLight',\r\n fetile: 'feTile',\r\n feturbulence: 'feTurbulence',\r\n foreignobject: 'foreignObject',\r\n glyphref: 'glyphRef',\r\n lineargradient: 'linearGradient',\r\n radialgradient: 'radialGradient'\r\n};\r\nfunction getTagName(n) {\r\n var tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n if (tagName === 'link' && n.attributes._cssText) {\r\n tagName = 'style';\r\n }\r\n return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nvar HOVER_SELECTOR = /([^\\\\]):hover/;\r\nvar HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n var cachedStyle = cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.get(cssText);\r\n if (cachedStyle)\r\n return cachedStyle;\r\n var ast = parse(cssText, {\r\n silent: true\r\n });\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n var selectors = [];\r\n ast.stylesheet.rules.forEach(function (rule) {\r\n if ('selectors' in rule) {\r\n (rule.selectors || []).forEach(function (selector) {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n selectors.push(selector);\r\n }\r\n });\r\n }\r\n });\r\n if (selectors.length === 0) {\r\n return cssText;\r\n }\r\n var selectorMatcher = new RegExp(selectors\r\n .filter(function (selector, index) { return selectors.indexOf(selector) === index; })\r\n .sort(function (a, b) { return b.length - a.length; })\r\n .map(function (selector) {\r\n return escapeRegExp(selector);\r\n })\r\n .join('|'), 'g');\r\n var result = cssText.replace(selectorMatcher, function (selector) {\r\n var newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n return \"\".concat(selector, \", \").concat(newSelector);\r\n });\r\n cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.set(cssText, result);\r\n return result;\r\n}\r\nfunction createCache() {\r\n var stylesWithHoverClass = new Map();\r\n return {\r\n stylesWithHoverClass: stylesWithHoverClass\r\n };\r\n}\r\nfunction buildNode(n, options) {\r\n var doc = options.doc, hackCss = options.hackCss, cache = options.cache;\r\n switch (n.type) {\r\n case NodeType.Document:\r\n return doc.implementation.createDocument(null, '', null);\r\n case NodeType.DocumentType:\r\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n case NodeType.Element: {\r\n var tagName = getTagName(n);\r\n var node_1;\r\n if (n.isSVG) {\r\n node_1 = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n }\r\n else {\r\n node_1 = doc.createElement(tagName);\r\n }\r\n var specialAttributes = {};\r\n for (var name_1 in n.attributes) {\r\n if (!Object.prototype.hasOwnProperty.call(n.attributes, name_1)) {\r\n continue;\r\n }\r\n var value = n.attributes[name_1];\r\n if (tagName === 'option' &&\r\n name_1 === 'selected' &&\r\n value === false) {\r\n continue;\r\n }\r\n if (value === true)\r\n value = '';\r\n if (name_1.startsWith('rr_')) {\r\n specialAttributes[name_1] = value;\r\n continue;\r\n }\r\n var isTextarea = tagName === 'textarea' && name_1 === 'value';\r\n var isRemoteOrDynamicCss = tagName === 'style' && name_1 === '_cssText';\r\n if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n value = addHoverClass(value, cache);\r\n }\r\n if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n var child = doc.createTextNode(value);\r\n for (var _i = 0, _a = Array.from(node_1.childNodes); _i < _a.length; _i++) {\r\n var c = _a[_i];\r\n if (c.nodeType === node_1.TEXT_NODE) {\r\n node_1.removeChild(c);\r\n }\r\n }\r\n node_1.appendChild(child);\r\n continue;\r\n }\r\n try {\r\n if (n.isSVG && name_1 === 'xlink:href') {\r\n node_1.setAttributeNS('http://www.w3.org/1999/xlink', name_1, value.toString());\r\n }\r\n else if (name_1 === 'onload' ||\r\n name_1 === 'onclick' ||\r\n name_1.substring(0, 7) === 'onmouse') {\r\n node_1.setAttribute('_' + name_1, value.toString());\r\n }\r\n else if (tagName === 'meta' &&\r\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n name_1 === 'content') {\r\n node_1.setAttribute('csp-content', value.toString());\r\n continue;\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'preload' &&\r\n n.attributes.as === 'script') {\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'prefetch' &&\r\n typeof n.attributes.href === 'string' &&\r\n n.attributes.href.endsWith('.js')) {\r\n }\r\n else if (tagName === 'img' &&\r\n n.attributes.srcset &&\r\n n.attributes.rr_dataURL) {\r\n node_1.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n }\r\n else {\r\n node_1.setAttribute(name_1, value.toString());\r\n }\r\n }\r\n catch (error) {\r\n }\r\n }\r\n var _loop_1 = function (name_2) {\r\n var value = specialAttributes[name_2];\r\n if (tagName === 'canvas' && name_2 === 'rr_dataURL') {\r\n var image_1 = document.createElement('img');\r\n image_1.onload = function () {\r\n var ctx = node_1.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(image_1, 0, 0, image_1.width, image_1.height);\r\n }\r\n };\r\n image_1.src = value.toString();\r\n if (node_1.RRNodeType)\r\n node_1.rr_dataURL = value.toString();\r\n }\r\n else if (tagName === 'img' && name_2 === 'rr_dataURL') {\r\n var image = node_1;\r\n if (!image.currentSrc.startsWith('data:')) {\r\n image.setAttribute('rrweb-original-src', n.attributes.src);\r\n image.src = value.toString();\r\n }\r\n }\r\n if (name_2 === 'rr_width') {\r\n node_1.style.width = value.toString();\r\n }\r\n else if (name_2 === 'rr_height') {\r\n node_1.style.height = value.toString();\r\n }\r\n else if (name_2 === 'rr_mediaCurrentTime' &&\r\n typeof value === 'number') {\r\n node_1.currentTime = value;\r\n }\r\n else if (name_2 === 'rr_mediaState') {\r\n switch (value) {\r\n case 'played':\r\n node_1\r\n .play()[\"catch\"](function (e) { return console.warn('media playback error', e); });\r\n break;\r\n case 'paused':\r\n node_1.pause();\r\n break;\r\n }\r\n }\r\n };\r\n for (var name_2 in specialAttributes) {\r\n _loop_1(name_2);\r\n }\r\n if (n.isShadowHost) {\r\n if (!node_1.shadowRoot) {\r\n node_1.attachShadow({ mode: 'open' });\r\n }\r\n else {\r\n while (node_1.shadowRoot.firstChild) {\r\n node_1.shadowRoot.removeChild(node_1.shadowRoot.firstChild);\r\n }\r\n }\r\n }\r\n return node_1;\r\n }\r\n case NodeType.Text:\r\n return doc.createTextNode(n.isStyle && hackCss\r\n ? addHoverClass(n.textContent, cache)\r\n : n.textContent);\r\n case NodeType.CDATA:\r\n return doc.createCDATASection(n.textContent);\r\n case NodeType.Comment:\r\n return doc.createComment(n.textContent);\r\n default:\r\n return null;\r\n }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n var doc = options.doc, mirror = options.mirror, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.hackCss, hackCss = _b === void 0 ? true : _b, afterAppend = options.afterAppend, cache = options.cache;\r\n var node = buildNode(n, { doc: doc, hackCss: hackCss, cache: cache });\r\n if (!node) {\r\n return null;\r\n }\r\n if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n mirror.replace(n.rootId, doc);\r\n }\r\n if (n.type === NodeType.Document) {\r\n doc.close();\r\n doc.open();\r\n if (n.compatMode === 'BackCompat' &&\r\n n.childNodes &&\r\n n.childNodes[0].type !== NodeType.DocumentType) {\r\n if (n.childNodes[0].type === NodeType.Element &&\r\n 'xmlns' in n.childNodes[0].attributes &&\r\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n }\r\n else {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n }\r\n }\r\n node = doc;\r\n }\r\n mirror.add(node, n);\r\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n !skipChild) {\r\n for (var _i = 0, _c = n.childNodes; _i < _c.length; _i++) {\r\n var childN = _c[_i];\r\n var childNode = buildNodeWithSN(childN, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n if (!childNode) {\r\n console.warn('Failed to rebuild', childN);\r\n continue;\r\n }\r\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n node.shadowRoot.appendChild(childNode);\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n if (afterAppend) {\r\n afterAppend(childNode, childN.id);\r\n }\r\n }\r\n }\r\n return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n function walk(node) {\r\n onVisit(node);\r\n }\r\n for (var _i = 0, _a = mirror.getIds(); _i < _a.length; _i++) {\r\n var id = _a[_i];\r\n if (mirror.has(id)) {\r\n walk(mirror.getNode(id));\r\n }\r\n }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n var n = mirror.getMeta(node);\r\n if ((n === null || n === void 0 ? void 0 : n.type) !== NodeType.Element) {\r\n return;\r\n }\r\n var el = node;\r\n for (var name_3 in n.attributes) {\r\n if (!(Object.prototype.hasOwnProperty.call(n.attributes, name_3) &&\r\n name_3.startsWith('rr_'))) {\r\n continue;\r\n }\r\n var value = n.attributes[name_3];\r\n if (name_3 === 'rr_scrollLeft') {\r\n el.scrollLeft = value;\r\n }\r\n if (name_3 === 'rr_scrollTop') {\r\n el.scrollTop = value;\r\n }\r\n }\r\n}\r\nfunction rebuild(n, options) {\r\n var doc = options.doc, onVisit = options.onVisit, _a = options.hackCss, hackCss = _a === void 0 ? true : _a, afterAppend = options.afterAppend, cache = options.cache, _b = options.mirror, mirror = _b === void 0 ? new Mirror() : _b;\r\n var node = buildNodeWithSN(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n visit(mirror, function (visitedNode) {\r\n if (onVisit) {\r\n onVisit(visitedNode);\r\n }\r\n handleScroll(visitedNode, mirror);\r\n });\r\n return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, classMatchesRegex, createCache, createMirror, genId, getCssRuleString, getCssRulesString, is2DCanvasBlank, isCSSImportRule, isElement, isNativeShadowDom, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, snapshot, transformAttribute };\n","import { classMatchesRegex, IGNORED_NODE, isShadowRoot } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target = document) {\r\n const options = { capture: true, passive: true };\r\n target.addEventListener(type, fn, options);\r\n return () => target.removeEventListener(type, fn, options);\r\n}\r\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\r\n '\\r\\n' +\r\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\r\n '\\r\\n' +\r\n 'or you can use record.mirror to access the mirror instance during recording.';\r\nlet _mirror = {\r\n map: {},\r\n getId() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return -1;\r\n },\r\n getNode() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return null;\r\n },\r\n removeNodeFromMap() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n has() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return false;\r\n },\r\n reset() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n};\r\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\r\n _mirror = new Proxy(_mirror, {\r\n get(target, prop, receiver) {\r\n if (prop === 'map') {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n}\r\nfunction throttle(func, wait, options = {}) {\r\n let timeout = null;\r\n let previous = 0;\r\n return function (...args) {\r\n const now = Date.now();\r\n if (!previous && options.leading === false) {\r\n previous = now;\r\n }\r\n const remaining = wait - (now - previous);\r\n const context = this;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n func.apply(context, args);\r\n }\r\n else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(() => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n func.apply(context, args);\r\n }, remaining);\r\n }\r\n };\r\n}\r\nfunction hookSetter(target, key, d, isRevoked, win = window) {\r\n const original = win.Object.getOwnPropertyDescriptor(target, key);\r\n win.Object.defineProperty(target, key, isRevoked\r\n ? d\r\n : {\r\n set(value) {\r\n setTimeout(() => {\r\n d.set.call(this, value);\r\n }, 0);\r\n if (original && original.set) {\r\n original.set.call(this, value);\r\n }\r\n },\r\n });\r\n return () => hookSetter(target, key, original || {}, true);\r\n}\r\nfunction patch(source, name, replacement) {\r\n try {\r\n if (!(name in source)) {\r\n return () => {\r\n };\r\n }\r\n const original = source[name];\r\n const wrapped = replacement(original);\r\n if (typeof wrapped === 'function') {\r\n wrapped.prototype = wrapped.prototype || {};\r\n Object.defineProperties(wrapped, {\r\n __rrweb_original__: {\r\n enumerable: false,\r\n value: original,\r\n },\r\n });\r\n }\r\n source[name] = wrapped;\r\n return () => {\r\n source[name] = original;\r\n };\r\n }\r\n catch (_a) {\r\n return () => {\r\n };\r\n }\r\n}\r\nfunction getWindowHeight() {\r\n return (window.innerHeight ||\r\n (document.documentElement && document.documentElement.clientHeight) ||\r\n (document.body && document.body.clientHeight));\r\n}\r\nfunction getWindowWidth() {\r\n return (window.innerWidth ||\r\n (document.documentElement && document.documentElement.clientWidth) ||\r\n (document.body && document.body.clientWidth));\r\n}\r\nfunction isBlocked(node, blockClass, blockSelector, checkAncestors) {\r\n if (!node) {\r\n return false;\r\n }\r\n const el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (!el)\r\n return false;\r\n if (typeof blockClass === 'string') {\r\n if (el.classList.contains(blockClass))\r\n return true;\r\n if (checkAncestors && el.closest('.' + blockClass) !== null)\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, blockClass, checkAncestors))\r\n return true;\r\n }\r\n if (blockSelector) {\r\n if (node.matches(blockSelector))\r\n return true;\r\n if (checkAncestors && el.closest(blockSelector) !== null)\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction isSerialized(n, mirror) {\r\n return mirror.getId(n) !== -1;\r\n}\r\nfunction isIgnored(n, mirror) {\r\n return mirror.getId(n) === IGNORED_NODE;\r\n}\r\nfunction isAncestorRemoved(target, mirror) {\r\n if (isShadowRoot(target)) {\r\n return false;\r\n }\r\n const id = mirror.getId(target);\r\n if (!mirror.has(id)) {\r\n return true;\r\n }\r\n if (target.parentNode &&\r\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\r\n return false;\r\n }\r\n if (!target.parentNode) {\r\n return true;\r\n }\r\n return isAncestorRemoved(target.parentNode, mirror);\r\n}\r\nfunction isTouchEvent(event) {\r\n return Boolean(event.changedTouches);\r\n}\r\nfunction polyfill(win = window) {\r\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\r\n win.NodeList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\r\n win.DOMTokenList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if (!Node.prototype.contains) {\r\n Node.prototype.contains = (...args) => {\r\n let node = args[0];\r\n if (!(0 in args)) {\r\n throw new TypeError('1 argument is required');\r\n }\r\n do {\r\n if (this === node) {\r\n return true;\r\n }\r\n } while ((node = node && node.parentNode));\r\n return false;\r\n };\r\n }\r\n}\r\nfunction queueToResolveTrees(queue) {\r\n const queueNodeMap = {};\r\n const putIntoMap = (m, parent) => {\r\n const nodeInTree = {\r\n value: m,\r\n parent,\r\n children: [],\r\n };\r\n queueNodeMap[m.node.id] = nodeInTree;\r\n return nodeInTree;\r\n };\r\n const queueNodeTrees = [];\r\n for (const mutation of queue) {\r\n const { nextId, parentId } = mutation;\r\n if (nextId && nextId in queueNodeMap) {\r\n const nextInTree = queueNodeMap[nextId];\r\n if (nextInTree.parent) {\r\n const idx = nextInTree.parent.children.indexOf(nextInTree);\r\n nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\r\n }\r\n else {\r\n const idx = queueNodeTrees.indexOf(nextInTree);\r\n queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\r\n }\r\n continue;\r\n }\r\n if (parentId in queueNodeMap) {\r\n const parentInTree = queueNodeMap[parentId];\r\n parentInTree.children.push(putIntoMap(mutation, parentInTree));\r\n continue;\r\n }\r\n queueNodeTrees.push(putIntoMap(mutation, null));\r\n }\r\n return queueNodeTrees;\r\n}\r\nfunction iterateResolveTree(tree, cb) {\r\n cb(tree.value);\r\n for (let i = tree.children.length - 1; i >= 0; i--) {\r\n iterateResolveTree(tree.children[i], cb);\r\n }\r\n}\r\nfunction isSerializedIframe(n, mirror) {\r\n return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\r\n}\r\nfunction isSerializedStylesheet(n, mirror) {\r\n return Boolean(n.nodeName === 'LINK' &&\r\n n.nodeType === n.ELEMENT_NODE &&\r\n n.getAttribute &&\r\n n.getAttribute('rel') === 'stylesheet' &&\r\n mirror.getMeta(n));\r\n}\r\nfunction getBaseDimension(node, rootIframe) {\r\n var _a, _b;\r\n const frameElement = (_b = (_a = node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.frameElement;\r\n if (!frameElement || frameElement === rootIframe) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n relativeScale: 1,\r\n absoluteScale: 1,\r\n };\r\n }\r\n const frameDimension = frameElement.getBoundingClientRect();\r\n const frameBaseDimension = getBaseDimension(frameElement, rootIframe);\r\n const relativeScale = frameDimension.height / frameElement.clientHeight;\r\n return {\r\n x: frameDimension.x * frameBaseDimension.relativeScale +\r\n frameBaseDimension.x,\r\n y: frameDimension.y * frameBaseDimension.relativeScale +\r\n frameBaseDimension.y,\r\n relativeScale,\r\n absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\r\n };\r\n}\r\nfunction hasShadowRoot(n) {\r\n return Boolean(n === null || n === void 0 ? void 0 : n.shadowRoot);\r\n}\r\nfunction getNestedRule(rules, position) {\r\n const rule = rules[position[0]];\r\n if (position.length === 1) {\r\n return rule;\r\n }\r\n else {\r\n return getNestedRule(rule.cssRules[position[1]].cssRules, position.slice(2));\r\n }\r\n}\r\nfunction getPositionsAndIndex(nestedIndex) {\r\n const positions = [...nestedIndex];\r\n const index = positions.pop();\r\n return { positions, index };\r\n}\r\nfunction uniqueTextMutations(mutations) {\r\n const idSet = new Set();\r\n const uniqueMutations = [];\r\n for (let i = mutations.length; i--;) {\r\n const mutation = mutations[i];\r\n if (!idSet.has(mutation.id)) {\r\n uniqueMutations.push(mutation);\r\n idSet.add(mutation.id);\r\n }\r\n }\r\n return uniqueMutations;\r\n}\r\nclass StyleSheetMirror {\r\n constructor() {\r\n this.id = 1;\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n }\r\n getId(stylesheet) {\r\n var _a;\r\n return (_a = this.styleIDMap.get(stylesheet)) !== null && _a !== void 0 ? _a : -1;\r\n }\r\n has(stylesheet) {\r\n return this.styleIDMap.has(stylesheet);\r\n }\r\n add(stylesheet, id) {\r\n if (this.has(stylesheet))\r\n return this.getId(stylesheet);\r\n let newId;\r\n if (id === undefined) {\r\n newId = this.id++;\r\n }\r\n else\r\n newId = id;\r\n this.styleIDMap.set(stylesheet, newId);\r\n this.idStyleMap.set(newId, stylesheet);\r\n return newId;\r\n }\r\n getStyle(id) {\r\n return this.idStyleMap.get(id) || null;\r\n }\r\n reset() {\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n this.id = 1;\r\n }\r\n generateId() {\r\n return this.id++;\r\n }\r\n}\n\nexport { StyleSheetMirror, _mirror, getBaseDimension, getNestedRule, getPositionsAndIndex, getWindowHeight, getWindowWidth, hasShadowRoot, hookSetter, isAncestorRemoved, isBlocked, isIgnored, isSerialized, isSerializedIframe, isSerializedStylesheet, isTouchEvent, iterateResolveTree, on, patch, polyfill, queueToResolveTrees, throttle, uniqueTextMutations };\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\n\nexport { CanvasContext, EventType, IncrementalSource, MouseInteractions, ReplayerEvents };\n","import { isShadowRoot, isNativeShadowDom, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isSerialized, isAncestorRemoved, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\n\nfunction isNodeInLinkedList(n) {\r\n return '__ln' in n;\r\n}\r\nclass DoubleLinkedList {\r\n constructor() {\r\n this.length = 0;\r\n this.head = null;\r\n }\r\n get(position) {\r\n if (position >= this.length) {\r\n throw new Error('Position outside of list range');\r\n }\r\n let current = this.head;\r\n for (let index = 0; index < position; index++) {\r\n current = (current === null || current === void 0 ? void 0 : current.next) || null;\r\n }\r\n return current;\r\n }\r\n addNode(n) {\r\n const node = {\r\n value: n,\r\n previous: null,\r\n next: null,\r\n };\r\n n.__ln = node;\r\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\r\n const current = n.previousSibling.__ln.next;\r\n node.next = current;\r\n node.previous = n.previousSibling.__ln;\r\n n.previousSibling.__ln.next = node;\r\n if (current) {\r\n current.previous = node;\r\n }\r\n }\r\n else if (n.nextSibling &&\r\n isNodeInLinkedList(n.nextSibling) &&\r\n n.nextSibling.__ln.previous) {\r\n const current = n.nextSibling.__ln.previous;\r\n node.previous = current;\r\n node.next = n.nextSibling.__ln;\r\n n.nextSibling.__ln.previous = node;\r\n if (current) {\r\n current.next = node;\r\n }\r\n }\r\n else {\r\n if (this.head) {\r\n this.head.previous = node;\r\n }\r\n node.next = this.head;\r\n this.head = node;\r\n }\r\n this.length++;\r\n }\r\n removeNode(n) {\r\n const current = n.__ln;\r\n if (!this.head) {\r\n return;\r\n }\r\n if (!current.previous) {\r\n this.head = current.next;\r\n if (this.head) {\r\n this.head.previous = null;\r\n }\r\n }\r\n else {\r\n current.previous.next = current.next;\r\n if (current.next) {\r\n current.next.previous = current.previous;\r\n }\r\n }\r\n if (n.__ln) {\r\n delete n.__ln;\r\n }\r\n this.length--;\r\n }\r\n}\r\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\r\nclass MutationBuffer {\r\n constructor() {\r\n this.frozen = false;\r\n this.locked = false;\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.mapRemoves = [];\r\n this.movedMap = {};\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.processMutations = (mutations) => {\r\n mutations.forEach(this.processMutation);\r\n this.emit();\r\n };\r\n this.emit = () => {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const adds = [];\r\n const addList = new DoubleLinkedList();\r\n const getNextId = (n) => {\r\n let ns = n;\r\n let nextId = IGNORED_NODE;\r\n while (nextId === IGNORED_NODE) {\r\n ns = ns && ns.nextSibling;\r\n nextId = ns && this.mirror.getId(ns);\r\n }\r\n return nextId;\r\n };\r\n const pushAdd = (n) => {\r\n var _a, _b, _c, _d;\r\n let shadowHost = null;\r\n if (((_b = (_a = n.getRootNode) === null || _a === void 0 ? void 0 : _a.call(n)) === null || _b === void 0 ? void 0 : _b.nodeType) === Node.DOCUMENT_FRAGMENT_NODE &&\r\n n.getRootNode().host)\r\n shadowHost = n.getRootNode().host;\r\n let rootShadowHost = shadowHost;\r\n while (((_d = (_c = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _c === void 0 ? void 0 : _c.call(rootShadowHost)) === null || _d === void 0 ? void 0 : _d.nodeType) ===\r\n Node.DOCUMENT_FRAGMENT_NODE &&\r\n rootShadowHost.getRootNode().host)\r\n rootShadowHost = rootShadowHost.getRootNode().host;\r\n const notInDoc = !this.doc.contains(n) &&\r\n (!rootShadowHost || !this.doc.contains(rootShadowHost));\r\n if (!n.parentNode || notInDoc) {\r\n return;\r\n }\r\n const parentId = isShadowRoot(n.parentNode)\r\n ? this.mirror.getId(shadowHost)\r\n : this.mirror.getId(n.parentNode);\r\n const nextId = getNextId(n);\r\n if (parentId === -1 || nextId === -1) {\r\n return addList.addNode(n);\r\n }\r\n const sn = serializeNodeWithId(n, {\r\n doc: this.doc,\r\n mirror: this.mirror,\r\n blockClass: this.blockClass,\r\n blockSelector: this.blockSelector,\r\n maskTextClass: this.maskTextClass,\r\n maskTextSelector: this.maskTextSelector,\r\n skipChild: true,\r\n newlyAddedElement: true,\r\n inlineStylesheet: this.inlineStylesheet,\r\n maskInputOptions: this.maskInputOptions,\r\n maskTextFn: this.maskTextFn,\r\n maskInputFn: this.maskInputFn,\r\n slimDOMOptions: this.slimDOMOptions,\r\n dataURLOptions: this.dataURLOptions,\r\n recordCanvas: this.recordCanvas,\r\n inlineImages: this.inlineImages,\r\n onSerialize: (currentN) => {\r\n if (isSerializedIframe(currentN, this.mirror)) {\r\n this.iframeManager.addIframe(currentN);\r\n }\r\n if (isSerializedStylesheet(currentN, this.mirror)) {\r\n this.stylesheetManager.trackLinkElement(currentN);\r\n }\r\n if (hasShadowRoot(n)) {\r\n this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n this.iframeManager.attachIframe(iframe, childSn);\r\n this.shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (link, childSn) => {\r\n this.stylesheetManager.attachLinkElement(link, childSn);\r\n },\r\n });\r\n if (sn) {\r\n adds.push({\r\n parentId,\r\n nextId,\r\n node: sn,\r\n });\r\n }\r\n };\r\n while (this.mapRemoves.length) {\r\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\r\n }\r\n for (const n of Array.from(this.movedSet.values())) {\r\n if (isParentRemoved(this.removes, n, this.mirror) &&\r\n !this.movedSet.has(n.parentNode)) {\r\n continue;\r\n }\r\n pushAdd(n);\r\n }\r\n for (const n of Array.from(this.addedSet.values())) {\r\n if (!isAncestorInSet(this.droppedSet, n) &&\r\n !isParentRemoved(this.removes, n, this.mirror)) {\r\n pushAdd(n);\r\n }\r\n else if (isAncestorInSet(this.movedSet, n)) {\r\n pushAdd(n);\r\n }\r\n else {\r\n this.droppedSet.add(n);\r\n }\r\n }\r\n let candidate = null;\r\n while (addList.length) {\r\n let node = null;\r\n if (candidate) {\r\n const parentId = this.mirror.getId(candidate.value.parentNode);\r\n const nextId = getNextId(candidate.value);\r\n if (parentId !== -1 && nextId !== -1) {\r\n node = candidate;\r\n }\r\n }\r\n if (!node) {\r\n for (let index = addList.length - 1; index >= 0; index--) {\r\n const _node = addList.get(index);\r\n if (_node) {\r\n const parentId = this.mirror.getId(_node.value.parentNode);\r\n const nextId = getNextId(_node.value);\r\n if (nextId === -1)\r\n continue;\r\n else if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n else {\r\n const unhandledNode = _node.value;\r\n if (unhandledNode.parentNode &&\r\n unhandledNode.parentNode.nodeType ===\r\n Node.DOCUMENT_FRAGMENT_NODE) {\r\n const shadowHost = unhandledNode.parentNode\r\n .host;\r\n const parentId = this.mirror.getId(shadowHost);\r\n if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (!node) {\r\n while (addList.head) {\r\n addList.removeNode(addList.head.value);\r\n }\r\n break;\r\n }\r\n candidate = node.previous;\r\n addList.removeNode(node.value);\r\n pushAdd(node.value);\r\n }\r\n const payload = {\r\n texts: this.texts\r\n .map((text) => ({\r\n id: this.mirror.getId(text.node),\r\n value: text.value,\r\n }))\r\n .filter((text) => this.mirror.has(text.id)),\r\n attributes: this.attributes\r\n .map((attribute) => ({\r\n id: this.mirror.getId(attribute.node),\r\n attributes: attribute.attributes,\r\n }))\r\n .filter((attribute) => this.mirror.has(attribute.id)),\r\n removes: this.removes,\r\n adds,\r\n };\r\n if (!payload.texts.length &&\r\n !payload.attributes.length &&\r\n !payload.removes.length &&\r\n !payload.adds.length) {\r\n return;\r\n }\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.movedMap = {};\r\n this.mutationCb(payload);\r\n };\r\n this.processMutation = (m) => {\r\n if (isIgnored(m.target, this.mirror)) {\r\n return;\r\n }\r\n switch (m.type) {\r\n case 'characterData': {\r\n const value = m.target.textContent;\r\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, false) &&\r\n value !== m.oldValue) {\r\n this.texts.push({\r\n value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector) && value\r\n ? this.maskTextFn\r\n ? this.maskTextFn(value)\r\n : value.replace(/[\\S]/g, '*')\r\n : value,\r\n node: m.target,\r\n });\r\n }\r\n break;\r\n }\r\n case 'attributes': {\r\n const target = m.target;\r\n let value = m.target.getAttribute(m.attributeName);\r\n if (m.attributeName === 'value') {\r\n value = maskInputValue({\r\n maskInputOptions: this.maskInputOptions,\r\n tagName: m.target.tagName,\r\n type: m.target.getAttribute('type'),\r\n value,\r\n maskInputFn: this.maskInputFn,\r\n });\r\n }\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n value === m.oldValue) {\r\n return;\r\n }\r\n let item = this.attributes.find((a) => a.node === m.target);\r\n if (target.tagName === 'IFRAME' &&\r\n m.attributeName === 'src' &&\r\n !this.keepIframeSrcFn(value)) {\r\n if (!target.contentDocument) {\r\n m.attributeName = 'rr_src';\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n if (!item) {\r\n item = {\r\n node: m.target,\r\n attributes: {},\r\n };\r\n this.attributes.push(item);\r\n }\r\n if (m.attributeName === 'style') {\r\n const old = this.doc.createElement('span');\r\n if (m.oldValue) {\r\n old.setAttribute('style', m.oldValue);\r\n }\r\n if (item.attributes.style === undefined ||\r\n item.attributes.style === null) {\r\n item.attributes.style = {};\r\n }\r\n const styleObj = item.attributes.style;\r\n for (const pname of Array.from(target.style)) {\r\n const newValue = target.style.getPropertyValue(pname);\r\n const newPriority = target.style.getPropertyPriority(pname);\r\n if (newValue !== old.style.getPropertyValue(pname) ||\r\n newPriority !== old.style.getPropertyPriority(pname)) {\r\n if (newPriority === '') {\r\n styleObj[pname] = newValue;\r\n }\r\n else {\r\n styleObj[pname] = [newValue, newPriority];\r\n }\r\n }\r\n }\r\n for (const pname of Array.from(old.style)) {\r\n if (target.style.getPropertyValue(pname) === '') {\r\n styleObj[pname] = false;\r\n }\r\n }\r\n }\r\n else {\r\n item.attributes[m.attributeName] = transformAttribute(this.doc, target.tagName, m.attributeName, value);\r\n }\r\n break;\r\n }\r\n case 'childList': {\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, true))\r\n return;\r\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\r\n m.removedNodes.forEach((n) => {\r\n const nodeId = this.mirror.getId(n);\r\n const parentId = isShadowRoot(m.target)\r\n ? this.mirror.getId(m.target.host)\r\n : this.mirror.getId(m.target);\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n isIgnored(n, this.mirror) ||\r\n !isSerialized(n, this.mirror)) {\r\n return;\r\n }\r\n if (this.addedSet.has(n)) {\r\n deepDelete(this.addedSet, n);\r\n this.droppedSet.add(n);\r\n }\r\n else if (this.addedSet.has(m.target) && nodeId === -1) ;\r\n else if (isAncestorRemoved(m.target, this.mirror)) ;\r\n else if (this.movedSet.has(n) &&\r\n this.movedMap[moveKey(nodeId, parentId)]) {\r\n deepDelete(this.movedSet, n);\r\n }\r\n else {\r\n this.removes.push({\r\n parentId,\r\n id: nodeId,\r\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\r\n ? true\r\n : undefined,\r\n });\r\n }\r\n this.mapRemoves.push(n);\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n this.genAdds = (n, target) => {\r\n if (this.mirror.hasNode(n)) {\r\n if (isIgnored(n, this.mirror)) {\r\n return;\r\n }\r\n this.movedSet.add(n);\r\n let targetId = null;\r\n if (target && this.mirror.hasNode(target)) {\r\n targetId = this.mirror.getId(target);\r\n }\r\n if (targetId && targetId !== -1) {\r\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\r\n }\r\n }\r\n else {\r\n this.addedSet.add(n);\r\n this.droppedSet.delete(n);\r\n }\r\n if (!isBlocked(n, this.blockClass, this.blockSelector, false))\r\n n.childNodes.forEach((childN) => this.genAdds(childN));\r\n };\r\n }\r\n init(options) {\r\n [\r\n 'mutationCb',\r\n 'blockClass',\r\n 'blockSelector',\r\n 'maskTextClass',\r\n 'maskTextSelector',\r\n 'inlineStylesheet',\r\n 'maskInputOptions',\r\n 'maskTextFn',\r\n 'maskInputFn',\r\n 'keepIframeSrcFn',\r\n 'recordCanvas',\r\n 'inlineImages',\r\n 'slimDOMOptions',\r\n 'dataURLOptions',\r\n 'doc',\r\n 'mirror',\r\n 'iframeManager',\r\n 'stylesheetManager',\r\n 'shadowDomManager',\r\n 'canvasManager',\r\n ].forEach((key) => {\r\n this[key] = options[key];\r\n });\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n this.canvasManager.freeze();\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n this.canvasManager.unfreeze();\r\n this.emit();\r\n }\r\n isFrozen() {\r\n return this.frozen;\r\n }\r\n lock() {\r\n this.locked = true;\r\n this.canvasManager.lock();\r\n }\r\n unlock() {\r\n this.locked = false;\r\n this.canvasManager.unlock();\r\n this.emit();\r\n }\r\n reset() {\r\n this.shadowDomManager.reset();\r\n this.canvasManager.reset();\r\n }\r\n}\r\nfunction deepDelete(addsSet, n) {\r\n addsSet.delete(n);\r\n n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\r\n}\r\nfunction isParentRemoved(removes, n, mirror) {\r\n if (removes.length === 0)\r\n return false;\r\n return _isParentRemoved(removes, n, mirror);\r\n}\r\nfunction _isParentRemoved(removes, n, mirror) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n const parentId = mirror.getId(parentNode);\r\n if (removes.some((r) => r.id === parentId)) {\r\n return true;\r\n }\r\n return _isParentRemoved(removes, parentNode, mirror);\r\n}\r\nfunction isAncestorInSet(set, n) {\r\n if (set.size === 0)\r\n return false;\r\n return _isAncestorInSet(set, n);\r\n}\r\nfunction _isAncestorInSet(set, n) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n if (set.has(parentNode)) {\r\n return true;\r\n }\r\n return _isAncestorInSet(set, parentNode);\r\n}\n\nexport { MutationBuffer as default };\n","import { maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isBlocked, getWindowHeight, getWindowWidth, hookSetter, patch, isTouchEvent } from '../utils.js';\nimport { MouseInteractions, IncrementalSource } from '../../../types/dist/types.js';\nimport MutationBuffer from './mutation.js';\n\nconst mutationBuffers = [];\r\nconst isCSSGroupingRuleSupported = typeof CSSGroupingRule !== 'undefined';\r\nconst isCSSMediaRuleSupported = typeof CSSMediaRule !== 'undefined';\r\nconst isCSSSupportsRuleSupported = typeof CSSSupportsRule !== 'undefined';\r\nconst isCSSConditionRuleSupported = typeof CSSConditionRule !== 'undefined';\r\nfunction getEventTarget(event) {\r\n try {\r\n if ('composedPath' in event) {\r\n const path = event.composedPath();\r\n if (path.length) {\r\n return path[0];\r\n }\r\n }\r\n else if ('path' in event && event.path.length) {\r\n return event.path[0];\r\n }\r\n return event.target;\r\n }\r\n catch (_a) {\r\n return event.target;\r\n }\r\n}\r\nfunction initMutationObserver(options, rootEl) {\r\n var _a, _b;\r\n const mutationBuffer = new MutationBuffer();\r\n mutationBuffers.push(mutationBuffer);\r\n mutationBuffer.init(options);\r\n let mutationObserverCtor = window.MutationObserver ||\r\n window.__rrMutationObserver;\r\n const angularZoneSymbol = (_b = (_a = window === null || window === void 0 ? void 0 : window.Zone) === null || _a === void 0 ? void 0 : _a.__symbol__) === null || _b === void 0 ? void 0 : _b.call(_a, 'MutationObserver');\r\n if (angularZoneSymbol &&\r\n window[angularZoneSymbol]) {\r\n mutationObserverCtor = window[angularZoneSymbol];\r\n }\r\n const observer = new mutationObserverCtor(mutationBuffer.processMutations.bind(mutationBuffer));\r\n observer.observe(rootEl, {\r\n attributes: true,\r\n attributeOldValue: true,\r\n characterData: true,\r\n characterDataOldValue: true,\r\n childList: true,\r\n subtree: true,\r\n });\r\n return observer;\r\n}\r\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\r\n if (sampling.mousemove === false) {\r\n return () => {\r\n };\r\n }\r\n const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\r\n const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\r\n ? sampling.mousemoveCallback\r\n : 500;\r\n let positions = [];\r\n let timeBaseline;\r\n const wrappedCb = throttle((source) => {\r\n const totalOffset = Date.now() - timeBaseline;\r\n mousemoveCb(positions.map((p) => {\r\n p.timeOffset -= totalOffset;\r\n return p;\r\n }), source);\r\n positions = [];\r\n timeBaseline = null;\r\n }, callbackThreshold);\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n const { clientX, clientY } = isTouchEvent(evt)\r\n ? evt.changedTouches[0]\r\n : evt;\r\n if (!timeBaseline) {\r\n timeBaseline = Date.now();\r\n }\r\n positions.push({\r\n x: clientX,\r\n y: clientY,\r\n id: mirror.getId(target),\r\n timeOffset: Date.now() - timeBaseline,\r\n });\r\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\r\n ? IncrementalSource.Drag\r\n : evt instanceof MouseEvent\r\n ? IncrementalSource.MouseMove\r\n : IncrementalSource.TouchMove);\r\n }, threshold, {\r\n trailing: false,\r\n });\r\n const handlers = [\r\n on('mousemove', updatePosition, doc),\r\n on('touchmove', updatePosition, doc),\r\n on('drag', updatePosition, doc),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n if (sampling.mouseInteraction === false) {\r\n return () => {\r\n };\r\n }\r\n const disableMap = sampling.mouseInteraction === true ||\r\n sampling.mouseInteraction === undefined\r\n ? {}\r\n : sampling.mouseInteraction;\r\n const handlers = [];\r\n const getHandler = (eventKey) => {\r\n return (event) => {\r\n const target = getEventTarget(event);\r\n if (isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const e = isTouchEvent(event) ? event.changedTouches[0] : event;\r\n if (!e) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n const { clientX, clientY } = e;\r\n mouseInteractionCb({\r\n type: MouseInteractions[eventKey],\r\n id,\r\n x: clientX,\r\n y: clientY,\r\n });\r\n };\r\n };\r\n Object.keys(MouseInteractions)\r\n .filter((key) => Number.isNaN(Number(key)) &&\r\n !key.endsWith('_Departed') &&\r\n disableMap[key] !== false)\r\n .forEach((eventKey) => {\r\n const eventName = eventKey.toLowerCase();\r\n const handler = getHandler(eventKey);\r\n handlers.push(on(eventName, handler, doc));\r\n });\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n if (target === doc) {\r\n const scrollEl = (doc.scrollingElement || doc.documentElement);\r\n scrollCb({\r\n id,\r\n x: scrollEl.scrollLeft,\r\n y: scrollEl.scrollTop,\r\n });\r\n }\r\n else {\r\n scrollCb({\r\n id,\r\n x: target.scrollLeft,\r\n y: target.scrollTop,\r\n });\r\n }\r\n }, sampling.scroll || 100);\r\n return on('scroll', updatePosition, doc);\r\n}\r\nfunction initViewportResizeObserver({ viewportResizeCb, }) {\r\n let lastH = -1;\r\n let lastW = -1;\r\n const updateDimension = throttle(() => {\r\n const height = getWindowHeight();\r\n const width = getWindowWidth();\r\n if (lastH !== height || lastW !== width) {\r\n viewportResizeCb({\r\n width: Number(width),\r\n height: Number(height),\r\n });\r\n lastH = height;\r\n lastW = width;\r\n }\r\n }, 200);\r\n return on('resize', updateDimension, window);\r\n}\r\nfunction wrapEventWithUserTriggeredFlag(v, enable) {\r\n const value = Object.assign({}, v);\r\n if (!enable)\r\n delete value.userTriggered;\r\n return value;\r\n}\r\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\r\nconst lastInputValueMap = new WeakMap();\r\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, ignoreClass, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, }) {\r\n function eventHandler(event) {\r\n let target = getEventTarget(event);\r\n const userTriggered = event.isTrusted;\r\n if (target && target.tagName === 'OPTION')\r\n target = target.parentElement;\r\n if (!target ||\r\n !target.tagName ||\r\n INPUT_TAGS.indexOf(target.tagName) < 0 ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const type = target.type;\r\n if (target.classList.contains(ignoreClass)) {\r\n return;\r\n }\r\n let text = target.value;\r\n let isChecked = false;\r\n if (type === 'radio' || type === 'checkbox') {\r\n isChecked = target.checked;\r\n }\r\n else if (maskInputOptions[target.tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n text = maskInputValue({\r\n maskInputOptions,\r\n tagName: target.tagName,\r\n type,\r\n value: text,\r\n maskInputFn,\r\n });\r\n }\r\n cbWithDedup(target, wrapEventWithUserTriggeredFlag({ text, isChecked, userTriggered }, userTriggeredOnInput));\r\n const name = target.name;\r\n if (type === 'radio' && name && isChecked) {\r\n doc\r\n .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\r\n .forEach((el) => {\r\n if (el !== target) {\r\n cbWithDedup(el, wrapEventWithUserTriggeredFlag({\r\n text: el.value,\r\n isChecked: !isChecked,\r\n userTriggered: false,\r\n }, userTriggeredOnInput));\r\n }\r\n });\r\n }\r\n }\r\n function cbWithDedup(target, v) {\r\n const lastInputValue = lastInputValueMap.get(target);\r\n if (!lastInputValue ||\r\n lastInputValue.text !== v.text ||\r\n lastInputValue.isChecked !== v.isChecked) {\r\n lastInputValueMap.set(target, v);\r\n const id = mirror.getId(target);\r\n inputCb(Object.assign(Object.assign({}, v), { id }));\r\n }\r\n }\r\n const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\r\n const handlers = events.map((eventName) => on(eventName, eventHandler, doc));\r\n const currentWindow = doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n }\r\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\r\n const hookProperties = [\r\n [currentWindow.HTMLInputElement.prototype, 'value'],\r\n [currentWindow.HTMLInputElement.prototype, 'checked'],\r\n [currentWindow.HTMLSelectElement.prototype, 'value'],\r\n [currentWindow.HTMLTextAreaElement.prototype, 'value'],\r\n [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\r\n [currentWindow.HTMLOptionElement.prototype, 'selected'],\r\n ];\r\n if (propertyDescriptor && propertyDescriptor.set) {\r\n handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\r\n set() {\r\n eventHandler({ target: this });\r\n },\r\n }, false, currentWindow)));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction getNestedCSSRulePositions(rule) {\r\n const positions = [];\r\n function recurse(childRule, pos) {\r\n if ((isCSSGroupingRuleSupported &&\r\n childRule.parentRule instanceof CSSGroupingRule) ||\r\n (isCSSMediaRuleSupported &&\r\n childRule.parentRule instanceof CSSMediaRule) ||\r\n (isCSSSupportsRuleSupported &&\r\n childRule.parentRule instanceof CSSSupportsRule) ||\r\n (isCSSConditionRuleSupported &&\r\n childRule.parentRule instanceof CSSConditionRule)) {\r\n const rules = Array.from(childRule.parentRule.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n else if (childRule.parentStyleSheet) {\r\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n return pos;\r\n }\r\n return recurse(rule, positions);\r\n}\r\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\r\n let id, styleId;\r\n if (!sheet)\r\n return {};\r\n if (sheet.ownerNode)\r\n id = mirror.getId(sheet.ownerNode);\r\n else\r\n styleId = styleMirror.getId(sheet);\r\n return {\r\n styleId,\r\n id,\r\n };\r\n}\r\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\r\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\r\n win.CSSStyleSheet.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [{ rule, index }],\r\n });\r\n }\r\n return insertRule.apply(this, [rule, index]);\r\n };\r\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\r\n win.CSSStyleSheet.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [{ index }],\r\n });\r\n }\r\n return deleteRule.apply(this, [index]);\r\n };\r\n let replace;\r\n if (win.CSSStyleSheet.prototype.replace) {\r\n replace = win.CSSStyleSheet.prototype.replace;\r\n win.CSSStyleSheet.prototype.replace = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replace: text,\r\n });\r\n }\r\n return replace.apply(this, [text]);\r\n };\r\n }\r\n let replaceSync;\r\n if (win.CSSStyleSheet.prototype.replaceSync) {\r\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\r\n win.CSSStyleSheet.prototype.replaceSync = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replaceSync: text,\r\n });\r\n }\r\n return replaceSync.apply(this, [text]);\r\n };\r\n }\r\n const supportedNestedCSSRuleTypes = {};\r\n if (isCSSGroupingRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\r\n }\r\n else {\r\n if (isCSSMediaRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\r\n }\r\n if (isCSSConditionRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\r\n }\r\n if (isCSSSupportsRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\r\n }\r\n }\r\n const unmodifiedFunctions = {};\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n unmodifiedFunctions[typeKey] = {\r\n insertRule: type.prototype.insertRule,\r\n deleteRule: type.prototype.deleteRule,\r\n };\r\n type.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [\r\n {\r\n rule,\r\n index: [\r\n ...getNestedCSSRulePositions(this),\r\n index || 0,\r\n ],\r\n },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].insertRule.apply(this, [rule, index]);\r\n };\r\n type.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [\r\n { index: [...getNestedCSSRulePositions(this), index] },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].deleteRule.apply(this, [index]);\r\n };\r\n });\r\n return () => {\r\n win.CSSStyleSheet.prototype.insertRule = insertRule;\r\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\r\n replace && (win.CSSStyleSheet.prototype.replace = replace);\r\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\r\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\r\n });\r\n };\r\n}\r\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\r\n var _a, _b, _c;\r\n let hostId = null;\r\n if (host.nodeName === '#document')\r\n hostId = mirror.getId(host);\r\n else\r\n hostId = mirror.getId(host.host);\r\n const patchTarget = host.nodeName === '#document'\r\n ? (_a = host.defaultView) === null || _a === void 0 ? void 0 : _a.Document\r\n : (_c = (_b = host.ownerDocument) === null || _b === void 0 ? void 0 : _b.defaultView) === null || _c === void 0 ? void 0 : _c.ShadowRoot;\r\n const originalPropertyDescriptor = Object.getOwnPropertyDescriptor(patchTarget === null || patchTarget === void 0 ? void 0 : patchTarget.prototype, 'adoptedStyleSheets');\r\n if (hostId === null ||\r\n hostId === -1 ||\r\n !patchTarget ||\r\n !originalPropertyDescriptor)\r\n return () => {\r\n };\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get() {\r\n var _a;\r\n return (_a = originalPropertyDescriptor.get) === null || _a === void 0 ? void 0 : _a.call(this);\r\n },\r\n set(sheets) {\r\n var _a;\r\n const result = (_a = originalPropertyDescriptor.set) === null || _a === void 0 ? void 0 : _a.call(this, sheets);\r\n if (hostId !== null && hostId !== -1) {\r\n try {\r\n stylesheetManager.adoptStyleSheets(sheets, hostId);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return result;\r\n },\r\n });\r\n return () => {\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get: originalPropertyDescriptor.get,\r\n set: originalPropertyDescriptor.set,\r\n });\r\n };\r\n}\r\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\r\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\r\n win.CSSStyleDeclaration.prototype.setProperty = function (property, value, priority) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return setProperty.apply(this, [property, value, priority]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n set: {\r\n property,\r\n value,\r\n priority,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return setProperty.apply(this, [property, value, priority]);\r\n };\r\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = function (property) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return removeProperty.apply(this, [property]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n remove: {\r\n property,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return removeProperty.apply(this, [property]);\r\n };\r\n return () => {\r\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\r\n };\r\n}\r\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, mirror, sampling, }) {\r\n const handler = (type) => throttle((event) => {\r\n const target = getEventTarget(event);\r\n if (!target ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const { currentTime, volume, muted, playbackRate, } = target;\r\n mediaInteractionCb({\r\n type,\r\n id: mirror.getId(target),\r\n currentTime,\r\n volume,\r\n muted,\r\n playbackRate,\r\n });\r\n }, sampling.media || 500);\r\n const handlers = [\r\n on('play', handler(0)),\r\n on('pause', handler(1)),\r\n on('seeked', handler(2)),\r\n on('volumechange', handler(3)),\r\n on('ratechange', handler(4)),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initFontObserver({ fontCb, doc }) {\r\n const win = doc.defaultView;\r\n if (!win) {\r\n return () => {\r\n };\r\n }\r\n const handlers = [];\r\n const fontMap = new WeakMap();\r\n const originalFontFace = win.FontFace;\r\n win.FontFace = function FontFace(family, source, descriptors) {\r\n const fontFace = new originalFontFace(family, source, descriptors);\r\n fontMap.set(fontFace, {\r\n family,\r\n buffer: typeof source !== 'string',\r\n descriptors,\r\n fontSource: typeof source === 'string'\r\n ? source\r\n : JSON.stringify(Array.from(new Uint8Array(source))),\r\n });\r\n return fontFace;\r\n };\r\n const restoreHandler = patch(doc.fonts, 'add', function (original) {\r\n return function (fontFace) {\r\n setTimeout(() => {\r\n const p = fontMap.get(fontFace);\r\n if (p) {\r\n fontCb(p);\r\n fontMap.delete(fontFace);\r\n }\r\n }, 0);\r\n return original.apply(this, [fontFace]);\r\n };\r\n });\r\n handlers.push(() => {\r\n win.FontFace = originalFontFace;\r\n });\r\n handlers.push(restoreHandler);\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initSelectionObserver(param) {\r\n const { doc, mirror, blockClass, blockSelector, selectionCb } = param;\r\n let collapsed = true;\r\n const updateSelection = () => {\r\n const selection = doc.getSelection();\r\n if (!selection || (collapsed && (selection === null || selection === void 0 ? void 0 : selection.isCollapsed)))\r\n return;\r\n collapsed = selection.isCollapsed || false;\r\n const ranges = [];\r\n const count = selection.rangeCount || 0;\r\n for (let i = 0; i < count; i++) {\r\n const range = selection.getRangeAt(i);\r\n const { startContainer, startOffset, endContainer, endOffset } = range;\r\n const blocked = isBlocked(startContainer, blockClass, blockSelector, true) ||\r\n isBlocked(endContainer, blockClass, blockSelector, true);\r\n if (blocked)\r\n continue;\r\n ranges.push({\r\n start: mirror.getId(startContainer),\r\n startOffset,\r\n end: mirror.getId(endContainer),\r\n endOffset,\r\n });\r\n }\r\n selectionCb({ ranges });\r\n };\r\n updateSelection();\r\n return on('selectionchange', updateSelection);\r\n}\r\nfunction mergeHooks(o, hooks) {\r\n const { mutationCb, mousemoveCb, mouseInteractionCb, scrollCb, viewportResizeCb, inputCb, mediaInteractionCb, styleSheetRuleCb, styleDeclarationCb, canvasMutationCb, fontCb, selectionCb, } = o;\r\n o.mutationCb = (...p) => {\r\n if (hooks.mutation) {\r\n hooks.mutation(...p);\r\n }\r\n mutationCb(...p);\r\n };\r\n o.mousemoveCb = (...p) => {\r\n if (hooks.mousemove) {\r\n hooks.mousemove(...p);\r\n }\r\n mousemoveCb(...p);\r\n };\r\n o.mouseInteractionCb = (...p) => {\r\n if (hooks.mouseInteraction) {\r\n hooks.mouseInteraction(...p);\r\n }\r\n mouseInteractionCb(...p);\r\n };\r\n o.scrollCb = (...p) => {\r\n if (hooks.scroll) {\r\n hooks.scroll(...p);\r\n }\r\n scrollCb(...p);\r\n };\r\n o.viewportResizeCb = (...p) => {\r\n if (hooks.viewportResize) {\r\n hooks.viewportResize(...p);\r\n }\r\n viewportResizeCb(...p);\r\n };\r\n o.inputCb = (...p) => {\r\n if (hooks.input) {\r\n hooks.input(...p);\r\n }\r\n inputCb(...p);\r\n };\r\n o.mediaInteractionCb = (...p) => {\r\n if (hooks.mediaInteaction) {\r\n hooks.mediaInteaction(...p);\r\n }\r\n mediaInteractionCb(...p);\r\n };\r\n o.styleSheetRuleCb = (...p) => {\r\n if (hooks.styleSheetRule) {\r\n hooks.styleSheetRule(...p);\r\n }\r\n styleSheetRuleCb(...p);\r\n };\r\n o.styleDeclarationCb = (...p) => {\r\n if (hooks.styleDeclaration) {\r\n hooks.styleDeclaration(...p);\r\n }\r\n styleDeclarationCb(...p);\r\n };\r\n o.canvasMutationCb = (...p) => {\r\n if (hooks.canvasMutation) {\r\n hooks.canvasMutation(...p);\r\n }\r\n canvasMutationCb(...p);\r\n };\r\n o.fontCb = (...p) => {\r\n if (hooks.font) {\r\n hooks.font(...p);\r\n }\r\n fontCb(...p);\r\n };\r\n o.selectionCb = (...p) => {\r\n if (hooks.selection) {\r\n hooks.selection(...p);\r\n }\r\n selectionCb(...p);\r\n };\r\n}\r\nfunction initObservers(o, hooks = {}) {\r\n const currentWindow = o.doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n };\r\n }\r\n mergeHooks(o, hooks);\r\n const mutationObserver = initMutationObserver(o, o.doc);\r\n const mousemoveHandler = initMoveObserver(o);\r\n const mouseInteractionHandler = initMouseInteractionObserver(o);\r\n const scrollHandler = initScrollObserver(o);\r\n const viewportResizeHandler = initViewportResizeObserver(o);\r\n const inputHandler = initInputObserver(o);\r\n const mediaInteractionHandler = initMediaInteractionObserver(o);\r\n const styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\r\n const adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\r\n const styleDeclarationObserver = initStyleDeclarationObserver(o, {\r\n win: currentWindow,\r\n });\r\n const fontObserver = o.collectFonts\r\n ? initFontObserver(o)\r\n : () => {\r\n };\r\n const selectionObserver = initSelectionObserver(o);\r\n const pluginHandlers = [];\r\n for (const plugin of o.plugins) {\r\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\r\n }\r\n return () => {\r\n mutationBuffers.forEach((b) => b.reset());\r\n mutationObserver.disconnect();\r\n mousemoveHandler();\r\n mouseInteractionHandler();\r\n scrollHandler();\r\n viewportResizeHandler();\r\n inputHandler();\r\n mediaInteractionHandler();\r\n styleSheetObserver();\r\n adoptedStyleSheetObserver();\r\n styleDeclarationObserver();\r\n fontObserver();\r\n selectionObserver();\r\n pluginHandlers.forEach((h) => h());\r\n };\r\n}\n\nexport { INPUT_TAGS, initAdoptedStyleSheetObserver, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","class CrossOriginIframeMirror {\r\n constructor(generateIdFn) {\r\n this.generateIdFn = generateIdFn;\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n }\r\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\r\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\r\n let id = idToRemoteIdMap.get(remoteId);\r\n if (!id) {\r\n id = this.generateIdFn();\r\n idToRemoteIdMap.set(remoteId, id);\r\n remoteIdToIdMap.set(id, remoteId);\r\n }\r\n return id;\r\n }\r\n getIds(iframe, remoteId) {\r\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\r\n }\r\n getRemoteId(iframe, id, map) {\r\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\r\n if (typeof id !== 'number')\r\n return id;\r\n const remoteId = remoteIdToIdMap.get(id);\r\n if (!remoteId)\r\n return -1;\r\n return remoteId;\r\n }\r\n getRemoteIds(iframe, ids) {\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\r\n }\r\n reset(iframe) {\r\n if (!iframe) {\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n return;\r\n }\r\n this.iframeIdToRemoteIdMap.delete(iframe);\r\n this.iframeRemoteIdToIdMap.delete(iframe);\r\n }\r\n getIdToRemoteIdMap(iframe) {\r\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\r\n if (!idToRemoteIdMap) {\r\n idToRemoteIdMap = new Map();\r\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\r\n }\r\n return idToRemoteIdMap;\r\n }\r\n getRemoteIdToIdMap(iframe) {\r\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\r\n if (!remoteIdToIdMap) {\r\n remoteIdToIdMap = new Map();\r\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\r\n }\r\n return remoteIdToIdMap;\r\n }\r\n}\n\nexport { CrossOriginIframeMirror as default };\n","import { genId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport CrossOriginIframeMirror from './cross-origin-iframe-mirror.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\n\nclass IframeManager {\r\n constructor(options) {\r\n this.iframes = new WeakMap();\r\n this.crossOriginIframeMap = new WeakMap();\r\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n this.mutationCb = options.mutationCb;\r\n this.wrappedEmit = options.wrappedEmit;\r\n this.stylesheetManager = options.stylesheetManager;\r\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\r\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\r\n this.mirror = options.mirror;\r\n if (this.recordCrossOriginIframes) {\r\n window.addEventListener('message', this.handleMessage.bind(this));\r\n }\r\n }\r\n addIframe(iframeEl) {\r\n this.iframes.set(iframeEl, true);\r\n if (iframeEl.contentWindow)\r\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\r\n }\r\n addLoadListener(cb) {\r\n this.loadListener = cb;\r\n }\r\n attachIframe(iframeEl, childSn) {\r\n var _a;\r\n this.mutationCb({\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: childSn,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n });\r\n (_a = this.loadListener) === null || _a === void 0 ? void 0 : _a.call(this, iframeEl);\r\n if (iframeEl.contentDocument &&\r\n iframeEl.contentDocument.adoptedStyleSheets &&\r\n iframeEl.contentDocument.adoptedStyleSheets.length > 0)\r\n this.stylesheetManager.adoptStyleSheets(iframeEl.contentDocument.adoptedStyleSheets, this.mirror.getId(iframeEl.contentDocument));\r\n }\r\n handleMessage(message) {\r\n if (message.data.type === 'rrweb') {\r\n const iframeSourceWindow = message.source;\r\n if (!iframeSourceWindow)\r\n return;\r\n const iframeEl = this.crossOriginIframeMap.get(message.source);\r\n if (!iframeEl)\r\n return;\r\n const transformedEvent = this.transformCrossOriginEvent(iframeEl, message.data.event);\r\n if (transformedEvent)\r\n this.wrappedEmit(transformedEvent, message.data.isCheckout);\r\n }\r\n }\r\n transformCrossOriginEvent(iframeEl, e) {\r\n var _a;\r\n switch (e.type) {\r\n case EventType.FullSnapshot: {\r\n this.crossOriginIframeMirror.reset(iframeEl);\r\n this.crossOriginIframeStyleMirror.reset(iframeEl);\r\n this.replaceIdOnNode(e.data.node, iframeEl);\r\n return {\r\n timestamp: e.timestamp,\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Mutation,\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: e.data.node,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n },\r\n };\r\n }\r\n case EventType.Meta:\r\n case EventType.Load:\r\n case EventType.DomContentLoaded: {\r\n return false;\r\n }\r\n case EventType.Plugin: {\r\n return e;\r\n }\r\n case EventType.Custom: {\r\n this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\r\n return e;\r\n }\r\n case EventType.IncrementalSnapshot: {\r\n switch (e.data.source) {\r\n case IncrementalSource.Mutation: {\r\n e.data.adds.forEach((n) => {\r\n this.replaceIds(n, iframeEl, [\r\n 'parentId',\r\n 'nextId',\r\n 'previousId',\r\n ]);\r\n this.replaceIdOnNode(n.node, iframeEl);\r\n });\r\n e.data.removes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['parentId', 'id']);\r\n });\r\n e.data.attributes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n e.data.texts.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.Drag:\r\n case IncrementalSource.TouchMove:\r\n case IncrementalSource.MouseMove: {\r\n e.data.positions.forEach((p) => {\r\n this.replaceIds(p, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.ViewportResize: {\r\n return false;\r\n }\r\n case IncrementalSource.MediaInteraction:\r\n case IncrementalSource.MouseInteraction:\r\n case IncrementalSource.Scroll:\r\n case IncrementalSource.CanvasMutation:\r\n case IncrementalSource.Input: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n return e;\r\n }\r\n case IncrementalSource.StyleSheetRule:\r\n case IncrementalSource.StyleDeclaration: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleId']);\r\n return e;\r\n }\r\n case IncrementalSource.Font: {\r\n return e;\r\n }\r\n case IncrementalSource.Selection: {\r\n e.data.ranges.forEach((range) => {\r\n this.replaceIds(range, iframeEl, ['start', 'end']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.AdoptedStyleSheet: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\r\n (_a = e.data.styles) === null || _a === void 0 ? void 0 : _a.forEach((style) => {\r\n this.replaceStyleIds(style, iframeEl, ['styleId']);\r\n });\r\n return e;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n replace(iframeMirror, obj, iframeEl, keys) {\r\n for (const key of keys) {\r\n if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\r\n continue;\r\n if (Array.isArray(obj[key])) {\r\n obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\r\n }\r\n else {\r\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\r\n }\r\n }\r\n return obj;\r\n }\r\n replaceIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\r\n }\r\n replaceStyleIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\r\n }\r\n replaceIdOnNode(node, iframeEl) {\r\n this.replaceIds(node, iframeEl, ['id']);\r\n if ('childNodes' in node) {\r\n node.childNodes.forEach((child) => {\r\n this.replaceIdOnNode(child, iframeEl);\r\n });\r\n }\r\n }\r\n}\n\nexport { IframeManager };\n","import { initMutationObserver, initScrollObserver, initAdoptedStyleSheetObserver } from './observer.js';\nimport { patch } from '../utils.js';\nimport { isNativeShadowDom } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nclass ShadowDomManager {\r\n constructor(options) {\r\n this.shadowDoms = new WeakSet();\r\n this.restorePatches = [];\r\n this.mutationCb = options.mutationCb;\r\n this.scrollCb = options.scrollCb;\r\n this.bypassOptions = options.bypassOptions;\r\n this.mirror = options.mirror;\r\n const manager = this;\r\n this.restorePatches.push(patch(Element.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, this.ownerDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n addShadowRoot(shadowRoot, doc) {\r\n if (!isNativeShadowDom(shadowRoot))\r\n return;\r\n if (this.shadowDoms.has(shadowRoot))\r\n return;\r\n this.shadowDoms.add(shadowRoot);\r\n initMutationObserver(Object.assign(Object.assign({}, this.bypassOptions), { doc, mutationCb: this.mutationCb, mirror: this.mirror, shadowDomManager: this }), shadowRoot);\r\n initScrollObserver(Object.assign(Object.assign({}, this.bypassOptions), { scrollCb: this.scrollCb, doc: shadowRoot, mirror: this.mirror }));\r\n setTimeout(() => {\r\n if (shadowRoot.adoptedStyleSheets &&\r\n shadowRoot.adoptedStyleSheets.length > 0)\r\n this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\r\n initAdoptedStyleSheetObserver({\r\n mirror: this.mirror,\r\n stylesheetManager: this.bypassOptions.stylesheetManager,\r\n }, shadowRoot);\r\n }, 0);\r\n }\r\n observeAttachShadow(iframeElement) {\r\n if (iframeElement.contentWindow) {\r\n const manager = this;\r\n this.restorePatches.push(patch(iframeElement.contentWindow.HTMLElement.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, iframeElement.contentDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n }\r\n reset() {\r\n this.restorePatches.forEach((restorePatch) => restorePatch());\r\n this.shadowDoms = new WeakSet();\r\n }\r\n}\n\nexport { ShadowDomManager };\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\n\nexport { __awaiter, __rest };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nvar decode = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n\nexport { decode, encode };\n","import { encode } from './../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';\n\nconst canvasVarMap = new Map();\r\nfunction variableListFor(ctx, ctor) {\r\n let contextMap = canvasVarMap.get(ctx);\r\n if (!contextMap) {\r\n contextMap = new Map();\r\n canvasVarMap.set(ctx, contextMap);\r\n }\r\n if (!contextMap.has(ctor)) {\r\n contextMap.set(ctor, []);\r\n }\r\n return contextMap.get(ctor);\r\n}\r\nconst saveWebGLVar = (value, win, ctx) => {\r\n if (!value ||\r\n !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))\r\n return;\r\n const name = value.constructor.name;\r\n const list = variableListFor(ctx, name);\r\n let index = list.indexOf(value);\r\n if (index === -1) {\r\n index = list.length;\r\n list.push(value);\r\n }\r\n return index;\r\n};\r\nfunction serializeArg(value, win, ctx) {\r\n if (value instanceof Array) {\r\n return value.map((arg) => serializeArg(arg, win, ctx));\r\n }\r\n else if (value === null) {\r\n return value;\r\n }\r\n else if (value instanceof Float32Array ||\r\n value instanceof Float64Array ||\r\n value instanceof Int32Array ||\r\n value instanceof Uint32Array ||\r\n value instanceof Uint8Array ||\r\n value instanceof Uint16Array ||\r\n value instanceof Int16Array ||\r\n value instanceof Int8Array ||\r\n value instanceof Uint8ClampedArray) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [Object.values(value)],\r\n };\r\n }\r\n else if (value instanceof ArrayBuffer) {\r\n const name = value.constructor.name;\r\n const base64 = encode(value);\r\n return {\r\n rr_type: name,\r\n base64,\r\n };\r\n }\r\n else if (value instanceof DataView) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [\r\n serializeArg(value.buffer, win, ctx),\r\n value.byteOffset,\r\n value.byteLength,\r\n ],\r\n };\r\n }\r\n else if (value instanceof HTMLImageElement) {\r\n const name = value.constructor.name;\r\n const { src } = value;\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof HTMLCanvasElement) {\r\n const name = 'HTMLImageElement';\r\n const src = value.toDataURL();\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof ImageData) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [serializeArg(value.data, win, ctx), value.width, value.height],\r\n };\r\n }\r\n else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {\r\n const name = value.constructor.name;\r\n const index = saveWebGLVar(value, win, ctx);\r\n return {\r\n rr_type: name,\r\n index: index,\r\n };\r\n }\r\n return value;\r\n}\r\nconst serializeArgs = (args, win, ctx) => {\r\n return [...args].map((arg) => serializeArg(arg, win, ctx));\r\n};\r\nconst isInstanceOfWebGLObject = (value, win) => {\r\n const webGLConstructorNames = [\r\n 'WebGLActiveInfo',\r\n 'WebGLBuffer',\r\n 'WebGLFramebuffer',\r\n 'WebGLProgram',\r\n 'WebGLRenderbuffer',\r\n 'WebGLShader',\r\n 'WebGLShaderPrecisionFormat',\r\n 'WebGLTexture',\r\n 'WebGLUniformLocation',\r\n 'WebGLVertexArrayObject',\r\n 'WebGLVertexArrayObjectOES',\r\n ];\r\n const supportedWebGLConstructorNames = webGLConstructorNames.filter((name) => typeof win[name] === 'function');\r\n return Boolean(supportedWebGLConstructorNames.find((name) => value instanceof win[name]));\r\n};\n\nexport { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { serializeArgs } from './serialize-args.js';\n\nfunction initCanvas2DMutationObserver(cb, win, blockClass, blockSelector) {\r\n const handlers = [];\r\n const props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);\r\n for (const prop of props2D) {\r\n try {\r\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {\r\n return function (...args) {\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n setTimeout(() => {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: recordArgs,\r\n });\r\n }, 0);\r\n }\r\n return original.apply(this, args);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvas2DMutationObserver as default };\n","import { patch, isBlocked } from '../../../utils.js';\n\nfunction initCanvasContextObserver(win, blockClass, blockSelector) {\r\n const handlers = [];\r\n try {\r\n const restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {\r\n return function (contextType, ...args) {\r\n if (!isBlocked(this, blockClass, blockSelector, true)) {\r\n if (!('__context' in this))\r\n this.__context = contextType;\r\n }\r\n return original.apply(this, [contextType, ...args]);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n console.error('failed to patch HTMLCanvasElement.prototype.getContext');\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasContextObserver as default };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { saveWebGLVar, serializeArgs } from './serialize-args.js';\n\nfunction patchGLPrototype(prototype, type, cb, blockClass, blockSelector, mirror, win) {\r\n const handlers = [];\r\n const props = Object.getOwnPropertyNames(prototype);\r\n for (const prop of props) {\r\n if ([\r\n 'isContextLost',\r\n 'canvas',\r\n 'drawingBufferWidth',\r\n 'drawingBufferHeight',\r\n ].includes(prop)) {\r\n continue;\r\n }\r\n try {\r\n if (typeof prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(prototype, prop, function (original) {\r\n return function (...args) {\r\n const result = original.apply(this, args);\r\n saveWebGLVar(result, win, this);\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n const mutation = {\r\n type,\r\n property: prop,\r\n args: recordArgs,\r\n };\r\n cb(this.canvas, mutation);\r\n }\r\n return result;\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type,\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return handlers;\r\n}\r\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector, mirror) {\r\n const handlers = [];\r\n handlers.push(...patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, blockSelector, mirror, win));\r\n if (typeof win.WebGL2RenderingContext !== 'undefined') {\r\n handlers.push(...patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, blockSelector, mirror, win));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasWebGLMutationObserver as default };\n","var WorkerClass = null;\n\ntry {\n var WorkerThreads =\n typeof module !== 'undefined' && typeof module.require === 'function' && module.require('worker_threads') ||\n typeof __non_webpack_require__ === 'function' && __non_webpack_require__('worker_threads') ||\n typeof require === 'function' && require('worker_threads');\n WorkerClass = WorkerThreads.Worker;\n} catch(e) {} // eslint-disable-line\n\nexport { WorkerClass };\n","import { WorkerClass } from './_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js';\n\nfunction decodeBase64(base64, enableUnicode) {\n return Buffer.from(base64, 'base64').toString(enableUnicode ? 'utf16' : 'utf8');\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n return function WorkerFactory(options) {\n return new WorkerClass(body, Object.assign({}, options, { eval: true }));\n };\n}\n\nexport { createBase64WorkerFactory };\n","function decodeBase64(base64, enableUnicode) {\n var binaryString = atob(base64);\n if (enableUnicode) {\n var binaryView = new Uint8Array(binaryString.length);\n for (var i = 0, n = binaryString.length; i < n; ++i) {\n binaryView[i] = binaryString.charCodeAt(i);\n }\n return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));\n }\n return binaryString;\n}\n\nfunction createURL(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n var blob = new Blob([body], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var url;\n return function WorkerFactory(options) {\n url = url || createURL(base64, sourcemapArg, enableUnicodeArg);\n return new Worker(url, options);\n };\n}\n\nexport { createBase64WorkerFactory };\n","var kIsNodeJS = Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n\nfunction isNodeJS() {\n return kIsNodeJS;\n}\n\nexport { isNodeJS };\n","import { createBase64WorkerFactory as createBase64WorkerFactory$1 } from './_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js';\nimport { createBase64WorkerFactory as createBase64WorkerFactory$2 } from './_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js';\nimport { isNodeJS } from './_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js';\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n if (isNodeJS()) {\n return createBase64WorkerFactory$1(base64, sourcemapArg, enableUnicodeArg);\n }\n return createBase64WorkerFactory$2(base64, sourcemapArg, enableUnicodeArg);\n}\n\nexport { createBase64WorkerFactory };\n","import { createBase64WorkerFactory } from './_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js';\n\nvar WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucykgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgY29uc3QgaWQgPSBgJHt3aWR0aH0tJHtoZWlnaHR9YDsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwYXJlbnRCbG9iTWFwLmdldChpZCk7DQogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0geWllbGQgYmxvYi5hcnJheUJ1ZmZlcigpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQogICAgY29uc3Qgd29ya2VyID0gc2VsZjsNCiAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgY29uc3QgeyBpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOw0KICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zKTsNCiAgICAgICAgICAgICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBiaXRtYXAuY2xvc2UoKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gZW5jb2RlKGFycmF5QnVmZmVyKTsNCiAgICAgICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7DQogICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgaWQsDQogICAgICAgICAgICAgICAgICAgIHR5cGUsDQogICAgICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICAgICAgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgIGhlaWdodCwNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);\n/* eslint-enable */\n\nexport { WorkerFactory as default };\n","import { __rest, __awaiter } from './../../../../../../ext/tslib/tslib.es6.js';\nimport { isBlocked } from '../../../utils.js';\nimport { CanvasContext } from '../../../../../types/dist/types.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\nimport WorkerFactory from '../../../../../../_virtual/image-bitmap-data-url-worker.js';\n\nclass CanvasManager {\r\n constructor(options) {\r\n this.pendingCanvasMutations = new Map();\r\n this.rafStamps = { latestId: 0, invokeId: null };\r\n this.frozen = false;\r\n this.locked = false;\r\n this.processMutation = (target, mutation) => {\r\n const newFrame = this.rafStamps.invokeId &&\r\n this.rafStamps.latestId !== this.rafStamps.invokeId;\r\n if (newFrame || !this.rafStamps.invokeId)\r\n this.rafStamps.invokeId = this.rafStamps.latestId;\r\n if (!this.pendingCanvasMutations.has(target)) {\r\n this.pendingCanvasMutations.set(target, []);\r\n }\r\n this.pendingCanvasMutations.get(target).push(mutation);\r\n };\r\n const { sampling = 'all', win, blockClass, blockSelector, recordCanvas, dataURLOptions, } = options;\r\n this.mutationCb = options.mutationCb;\r\n this.mirror = options.mirror;\r\n if (recordCanvas && sampling === 'all')\r\n this.initCanvasMutationObserver(win, blockClass, blockSelector);\r\n if (recordCanvas && typeof sampling === 'number')\r\n this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, {\r\n dataURLOptions,\r\n });\r\n }\r\n reset() {\r\n this.pendingCanvasMutations.clear();\r\n this.resetObservers && this.resetObservers();\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n }\r\n lock() {\r\n this.locked = true;\r\n }\r\n unlock() {\r\n this.locked = false;\r\n }\r\n initCanvasFPSObserver(fps, win, blockClass, blockSelector, options) {\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const snapshotInProgressMap = new Map();\r\n const worker = new WorkerFactory();\r\n worker.onmessage = (e) => {\r\n const { id } = e.data;\r\n snapshotInProgressMap.set(id, false);\r\n if (!('base64' in e.data))\r\n return;\r\n const { base64, type, width, height } = e.data;\r\n this.mutationCb({\r\n id,\r\n type: CanvasContext['2D'],\r\n commands: [\r\n {\r\n property: 'clearRect',\r\n args: [0, 0, width, height],\r\n },\r\n {\r\n property: 'drawImage',\r\n args: [\r\n {\r\n rr_type: 'ImageBitmap',\r\n args: [\r\n {\r\n rr_type: 'Blob',\r\n data: [{ rr_type: 'ArrayBuffer', base64 }],\r\n type,\r\n },\r\n ],\r\n },\r\n 0,\r\n 0,\r\n ],\r\n },\r\n ],\r\n });\r\n };\r\n const timeBetweenSnapshots = 1000 / fps;\r\n let lastSnapshotTime = 0;\r\n let rafId;\r\n const getCanvas = () => {\r\n const matchedCanvas = [];\r\n win.document.querySelectorAll('canvas').forEach((canvas) => {\r\n if (!isBlocked(canvas, blockClass, blockSelector, true)) {\r\n matchedCanvas.push(canvas);\r\n }\r\n });\r\n return matchedCanvas;\r\n };\r\n const takeCanvasSnapshots = (timestamp) => {\r\n if (lastSnapshotTime &&\r\n timestamp - lastSnapshotTime < timeBetweenSnapshots) {\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n return;\r\n }\r\n lastSnapshotTime = timestamp;\r\n getCanvas()\r\n .forEach((canvas) => __awaiter(this, void 0, void 0, function* () {\r\n var _a;\r\n const id = this.mirror.getId(canvas);\r\n if (snapshotInProgressMap.get(id))\r\n return;\r\n snapshotInProgressMap.set(id, true);\r\n if (['webgl', 'webgl2'].includes(canvas.__context)) {\r\n const context = canvas.getContext(canvas.__context);\r\n if (((_a = context === null || context === void 0 ? void 0 : context.getContextAttributes()) === null || _a === void 0 ? void 0 : _a.preserveDrawingBuffer) === false) {\r\n context === null || context === void 0 ? void 0 : context.clear(context.COLOR_BUFFER_BIT);\r\n }\r\n }\r\n const bitmap = yield createImageBitmap(canvas);\r\n worker.postMessage({\r\n id,\r\n bitmap,\r\n width: canvas.width,\r\n height: canvas.height,\r\n dataURLOptions: options.dataURLOptions,\r\n }, [bitmap]);\r\n }));\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n };\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n cancelAnimationFrame(rafId);\r\n };\r\n }\r\n initCanvasMutationObserver(win, blockClass, blockSelector) {\r\n this.startRAFTimestamping();\r\n this.startPendingCanvasMutationFlusher();\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector);\r\n const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, this.mirror);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n canvas2DReset();\r\n canvasWebGL1and2Reset();\r\n };\r\n }\r\n startPendingCanvasMutationFlusher() {\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n startRAFTimestamping() {\r\n const setLatestRAFTimestamp = (timestamp) => {\r\n this.rafStamps.latestId = timestamp;\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n };\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n }\r\n flushPendingCanvasMutations() {\r\n this.pendingCanvasMutations.forEach((values, canvas) => {\r\n const id = this.mirror.getId(canvas);\r\n this.flushPendingCanvasMutationFor(canvas, id);\r\n });\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n flushPendingCanvasMutationFor(canvas, id) {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const valuesWithType = this.pendingCanvasMutations.get(canvas);\r\n if (!valuesWithType || id === -1)\r\n return;\r\n const values = valuesWithType.map((value) => {\r\n const rest = __rest(value, [\"type\"]);\r\n return rest;\r\n });\r\n const { type } = valuesWithType[0];\r\n this.mutationCb({ id, type, commands: values });\r\n this.pendingCanvasMutations.delete(canvas);\r\n }\r\n}\n\nexport { CanvasManager };\n","import { getCssRuleString } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { StyleSheetMirror } from '../utils.js';\n\nclass StylesheetManager {\r\n constructor(options) {\r\n this.trackedLinkElements = new WeakSet();\r\n this.styleMirror = new StyleSheetMirror();\r\n this.mutationCb = options.mutationCb;\r\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\r\n }\r\n attachLinkElement(linkEl, childSn) {\r\n if ('_cssText' in childSn.attributes)\r\n this.mutationCb({\r\n adds: [],\r\n removes: [],\r\n texts: [],\r\n attributes: [\r\n {\r\n id: childSn.id,\r\n attributes: childSn\r\n .attributes,\r\n },\r\n ],\r\n });\r\n this.trackLinkElement(linkEl);\r\n }\r\n trackLinkElement(linkEl) {\r\n if (this.trackedLinkElements.has(linkEl))\r\n return;\r\n this.trackedLinkElements.add(linkEl);\r\n this.trackStylesheetInLinkElement(linkEl);\r\n }\r\n adoptStyleSheets(sheets, hostId) {\r\n if (sheets.length === 0)\r\n return;\r\n const adoptedStyleSheetData = {\r\n id: hostId,\r\n styleIds: [],\r\n };\r\n const styles = [];\r\n for (const sheet of sheets) {\r\n let styleId;\r\n if (!this.styleMirror.has(sheet)) {\r\n styleId = this.styleMirror.add(sheet);\r\n const rules = Array.from(sheet.rules || CSSRule);\r\n styles.push({\r\n styleId,\r\n rules: rules.map((r, index) => {\r\n return {\r\n rule: getCssRuleString(r),\r\n index,\r\n };\r\n }),\r\n });\r\n }\r\n else\r\n styleId = this.styleMirror.getId(sheet);\r\n adoptedStyleSheetData.styleIds.push(styleId);\r\n }\r\n if (styles.length > 0)\r\n adoptedStyleSheetData.styles = styles;\r\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\r\n }\r\n reset() {\r\n this.styleMirror.reset();\r\n this.trackedLinkElements = new WeakSet();\r\n }\r\n trackStylesheetInLinkElement(linkEl) {\r\n }\r\n}\n\nexport { StylesheetManager };\n","import { createMirror, snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, getWindowWidth, getWindowHeight, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\nimport { IframeManager } from './iframe-manager.js';\nimport { ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManager } from './observers/canvas/canvas-manager.js';\nimport { StylesheetManager } from './stylesheet-manager.js';\n\nfunction wrapEvent(e) {\r\n return Object.assign(Object.assign({}, e), { timestamp: Date.now() });\r\n}\r\nlet wrappedEmit;\r\nlet takeFullSnapshot;\r\nlet canvasManager;\r\nlet recording = false;\r\nconst mirror = createMirror();\r\nfunction record(options = {}) {\r\n const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, ignoreClass = 'rr-ignore', maskTextClass = 'rr-mask', maskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskInputFn, maskTextFn, hooks, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordCanvas = false, recordCrossOriginIframes = false, userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), } = options;\r\n const inEmittingFrame = recordCrossOriginIframes\r\n ? window.parent === window\r\n : true;\r\n let passEmitsToParent = false;\r\n if (!inEmittingFrame) {\r\n try {\r\n window.parent.document;\r\n passEmitsToParent = false;\r\n }\r\n catch (e) {\r\n passEmitsToParent = true;\r\n }\r\n }\r\n if (inEmittingFrame && !emit) {\r\n throw new Error('emit function is required');\r\n }\r\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\r\n sampling.mousemove = mousemoveWait;\r\n }\r\n mirror.reset();\r\n const maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true,\r\n }\r\n : _maskInputOptions !== undefined\r\n ? _maskInputOptions\r\n : { password: true };\r\n const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\r\n ? {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaVerification: true,\r\n headMetaAuthorship: _slimDOMOptions === 'all',\r\n headMetaDescKeywords: _slimDOMOptions === 'all',\r\n }\r\n : _slimDOMOptions\r\n ? _slimDOMOptions\r\n : {};\r\n polyfill();\r\n let lastFullSnapshotEvent;\r\n let incrementalSnapshotCount = 0;\r\n const eventProcessor = (e) => {\r\n for (const plugin of plugins || []) {\r\n if (plugin.eventProcessor) {\r\n e = plugin.eventProcessor(e);\r\n }\r\n }\r\n if (packFn) {\r\n e = packFn(e);\r\n }\r\n return e;\r\n };\r\n wrappedEmit = (e, isCheckout) => {\r\n var _a;\r\n if (((_a = mutationBuffers[0]) === null || _a === void 0 ? void 0 : _a.isFrozen()) &&\r\n e.type !== EventType.FullSnapshot &&\r\n !(e.type === EventType.IncrementalSnapshot &&\r\n e.data.source === IncrementalSource.Mutation)) {\r\n mutationBuffers.forEach((buf) => buf.unfreeze());\r\n }\r\n if (inEmittingFrame) {\r\n emit === null || emit === void 0 ? void 0 : emit(eventProcessor(e), isCheckout);\r\n }\r\n else if (passEmitsToParent) {\r\n const message = {\r\n type: 'rrweb',\r\n event: eventProcessor(e),\r\n isCheckout,\r\n };\r\n window.parent.postMessage(message, '*');\r\n }\r\n if (e.type === EventType.FullSnapshot) {\r\n lastFullSnapshotEvent = e;\r\n incrementalSnapshotCount = 0;\r\n }\r\n else if (e.type === EventType.IncrementalSnapshot) {\r\n if (e.data.source === IncrementalSource.Mutation &&\r\n e.data.isAttachIframe) {\r\n return;\r\n }\r\n incrementalSnapshotCount++;\r\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\r\n const exceedTime = checkoutEveryNms &&\r\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\r\n if (exceedCount || exceedTime) {\r\n takeFullSnapshot(true);\r\n }\r\n }\r\n };\r\n const wrappedMutationEmit = (m) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Mutation }, m),\r\n }));\r\n };\r\n const wrappedScrollEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Scroll }, p),\r\n }));\r\n const wrappedCanvasMutationEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.CanvasMutation }, p),\r\n }));\r\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.AdoptedStyleSheet }, a),\r\n }));\r\n const stylesheetManager = new StylesheetManager({\r\n mutationCb: wrappedMutationEmit,\r\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\r\n });\r\n const iframeManager = new IframeManager({\r\n mirror,\r\n mutationCb: wrappedMutationEmit,\r\n stylesheetManager: stylesheetManager,\r\n recordCrossOriginIframes,\r\n wrappedEmit,\r\n });\r\n for (const plugin of plugins || []) {\r\n if (plugin.getMirror)\r\n plugin.getMirror({\r\n nodeMirror: mirror,\r\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\r\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\r\n });\r\n }\r\n canvasManager = new CanvasManager({\r\n recordCanvas,\r\n mutationCb: wrappedCanvasMutationEmit,\r\n win: window,\r\n blockClass,\r\n blockSelector,\r\n mirror,\r\n sampling: sampling.canvas,\r\n dataURLOptions,\r\n });\r\n const shadowDomManager = new ShadowDomManager({\r\n mutationCb: wrappedMutationEmit,\r\n scrollCb: wrappedScrollEmit,\r\n bypassOptions: {\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n dataURLOptions,\r\n maskTextFn,\r\n maskInputFn,\r\n recordCanvas,\r\n inlineImages,\r\n sampling,\r\n slimDOMOptions,\r\n iframeManager,\r\n stylesheetManager,\r\n canvasManager,\r\n keepIframeSrcFn,\r\n },\r\n mirror,\r\n });\r\n takeFullSnapshot = (isCheckout = false) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Meta,\r\n data: {\r\n href: window.location.href,\r\n width: getWindowWidth(),\r\n height: getWindowHeight(),\r\n },\r\n }), isCheckout);\r\n stylesheetManager.reset();\r\n mutationBuffers.forEach((buf) => buf.lock());\r\n const node = snapshot(document, {\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskAllInputs: maskInputOptions,\r\n maskTextFn,\r\n slimDOM: slimDOMOptions,\r\n dataURLOptions,\r\n recordCanvas,\r\n inlineImages,\r\n onSerialize: (n) => {\r\n if (isSerializedIframe(n, mirror)) {\r\n iframeManager.addIframe(n);\r\n }\r\n if (isSerializedStylesheet(n, mirror)) {\r\n stylesheetManager.trackLinkElement(n);\r\n }\r\n if (hasShadowRoot(n)) {\r\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n iframeManager.attachIframe(iframe, childSn);\r\n shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (linkEl, childSn) => {\r\n stylesheetManager.attachLinkElement(linkEl, childSn);\r\n },\r\n keepIframeSrcFn,\r\n });\r\n if (!node) {\r\n return console.warn('Failed to snapshot the document');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.FullSnapshot,\r\n data: {\r\n node,\r\n initialOffset: {\r\n left: window.pageXOffset !== undefined\r\n ? window.pageXOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollLeft) ||\r\n ((_b = (_a = document === null || document === void 0 ? void 0 : document.body) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.scrollLeft) ||\r\n ((_c = document === null || document === void 0 ? void 0 : document.body) === null || _c === void 0 ? void 0 : _c.scrollLeft) ||\r\n 0,\r\n top: window.pageYOffset !== undefined\r\n ? window.pageYOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollTop) ||\r\n ((_e = (_d = document === null || document === void 0 ? void 0 : document.body) === null || _d === void 0 ? void 0 : _d.parentElement) === null || _e === void 0 ? void 0 : _e.scrollTop) ||\r\n ((_f = document === null || document === void 0 ? void 0 : document.body) === null || _f === void 0 ? void 0 : _f.scrollTop) ||\r\n 0,\r\n },\r\n },\r\n }));\r\n mutationBuffers.forEach((buf) => buf.unlock());\r\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\r\n stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\r\n };\r\n try {\r\n const handlers = [];\r\n handlers.push(on('DOMContentLoaded', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.DomContentLoaded,\r\n data: {},\r\n }));\r\n }));\r\n const observe = (doc) => {\r\n var _a;\r\n return initObservers({\r\n mutationCb: wrappedMutationEmit,\r\n mousemoveCb: (positions, source) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source,\r\n positions,\r\n },\r\n })),\r\n mouseInteractionCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MouseInteraction }, d),\r\n })),\r\n scrollCb: wrappedScrollEmit,\r\n viewportResizeCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.ViewportResize }, d),\r\n })),\r\n inputCb: (v) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Input }, v),\r\n })),\r\n mediaInteractionCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MediaInteraction }, p),\r\n })),\r\n styleSheetRuleCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleSheetRule }, r),\r\n })),\r\n styleDeclarationCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleDeclaration }, r),\r\n })),\r\n canvasMutationCb: wrappedCanvasMutationEmit,\r\n fontCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Font }, p),\r\n })),\r\n selectionCb: (p) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Selection }, p),\r\n }));\r\n },\r\n blockClass,\r\n ignoreClass,\r\n maskTextClass,\r\n maskTextSelector,\r\n maskInputOptions,\r\n inlineStylesheet,\r\n sampling,\r\n recordCanvas,\r\n inlineImages,\r\n userTriggeredOnInput,\r\n collectFonts,\r\n doc,\r\n maskInputFn,\r\n maskTextFn,\r\n keepIframeSrcFn,\r\n blockSelector,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n mirror,\r\n iframeManager,\r\n stylesheetManager,\r\n shadowDomManager,\r\n canvasManager,\r\n ignoreCSSAttributes,\r\n plugins: ((_a = plugins === null || plugins === void 0 ? void 0 : plugins.filter((p) => p.observer)) === null || _a === void 0 ? void 0 : _a.map((p) => ({\r\n observer: p.observer,\r\n options: p.options,\r\n callback: (payload) => wrappedEmit(wrapEvent({\r\n type: EventType.Plugin,\r\n data: {\r\n plugin: p.name,\r\n payload,\r\n },\r\n })),\r\n }))) || [],\r\n }, hooks);\r\n };\r\n iframeManager.addLoadListener((iframeEl) => {\r\n handlers.push(observe(iframeEl.contentDocument));\r\n });\r\n const init = () => {\r\n takeFullSnapshot();\r\n handlers.push(observe(document));\r\n recording = true;\r\n };\r\n if (document.readyState === 'interactive' ||\r\n document.readyState === 'complete') {\r\n init();\r\n }\r\n else {\r\n handlers.push(on('load', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Load,\r\n data: {},\r\n }));\r\n init();\r\n }, window));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n recording = false;\r\n };\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n }\r\n}\r\nrecord.addCustomEvent = (tag, payload) => {\r\n if (!recording) {\r\n throw new Error('please add custom event after start recording');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Custom,\r\n data: {\r\n tag,\r\n payload,\r\n },\r\n }));\r\n};\r\nrecord.freezePage = () => {\r\n mutationBuffers.forEach((buf) => buf.freeze());\r\n};\r\nrecord.takeFullSnapshot = (isCheckout) => {\r\n if (!recording) {\r\n throw new Error('please take full snapshot after start recording');\r\n }\r\n takeFullSnapshot(isCheckout);\r\n};\r\nrecord.mirror = mirror;\n\nexport { record as default };\n","import { record } from \"rrweb\";\nimport type { TrackerEvent } from \"../types\";\n\nexport type SessionReplayControllerOptions = {\n emit: (e: TrackerEvent) => void;\n /** rrweb full snapshot interval (ms). Default 10 minutes. */\n checkoutEveryNms?: number;\n /** Inline stylesheets into snapshots. Disabled by default to keep first payload small. */\n inlineStylesheet?: boolean;\n maxEventsPerBatch: number;\n flushIntervalMs: number;\n maskAllInputs: boolean;\n maskTextClass?: string;\n blockClass?: string;\n};\n\n/**\n * Captures the DOM with rrweb and emits `session_replay` batches for the tracker queue.\n */\nexport class SessionReplayController {\n private seq = 0;\n private readonly buffer: unknown[] = [];\n private stopRecording: (() => void) | null = null;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(private readonly opts: SessionReplayControllerOptions) {}\n\n start(): void {\n if (typeof document === \"undefined\" || this.stopRecording) return;\n\n const options = {\n emit: (event: unknown) => {\n this.buffer.push(event);\n if (this.buffer.length >= this.opts.maxEventsPerBatch) {\n this.flush();\n }\n },\n checkoutEveryNms: this.opts.checkoutEveryNms ?? 600_000,\n inlineStylesheet: this.opts.inlineStylesheet ?? false,\n maskAllInputs: this.opts.maskAllInputs,\n maskTextClass: this.opts.maskTextClass,\n blockClass: this.opts.blockClass,\n };\n\n this.stopRecording =\n record(options as Parameters<typeof record>[0]) ?? null;\n\n this.flushTimer = setInterval(() => {\n if (this.buffer.length > 0) this.flush();\n }, this.opts.flushIntervalMs);\n }\n\n flush(): void {\n if (this.buffer.length === 0) return;\n const events = this.buffer.splice(0, this.buffer.length);\n this.opts.emit({\n type: \"session_replay\",\n data: {\n seq: this.seq++,\n events,\n },\n });\n }\n\n destroy(): void {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n this.flush();\n this.stopRecording?.();\n this.stopRecording = null;\n }\n}\n","import type { ClientContext } from \"../types\";\n\nexport const ALPHANA_SDK_VERSION = \"2.0.2\";\n\nfunction detectDeviceCategory(ua: string): \"desktop\" | \"mobile\" | \"tablet\" {\n const s = ua.toLowerCase();\n if (/ipad|tablet|(android(?!.*mobile))/i.test(s)) return \"tablet\";\n if (/mobile|android|iphone|ipod|windows phone/i.test(s)) return \"mobile\";\n if (typeof navigator !== \"undefined\" && navigator.maxTouchPoints > 0) {\n const coarse =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(pointer: coarse)\")?.matches;\n if (coarse && /macintosh|mac os x/i.test(s)) return \"tablet\";\n }\n return \"desktop\";\n}\n\nfunction detectOs(ua: string): string {\n if (/windows/i.test(ua)) return \"Windows\";\n if (/android/i.test(ua)) return \"Android\";\n if (/iphone|ipad|ipod/i.test(ua)) return \"iOS\";\n if (/mac os x|macintosh/i.test(ua)) return \"macOS\";\n if (/linux/i.test(ua)) return \"Linux\";\n return \"Other\";\n}\n\nfunction detectBrowser(ua: string): string {\n if (/edg\\//i.test(ua)) return \"Edge\";\n if (/opr\\/|opera/i.test(ua)) return \"Opera\";\n if (/chrome\\/[0-9]/i.test(ua) && !/chromium/i.test(ua)) return \"Chrome\";\n if (/firefox\\/[0-9]/i.test(ua)) return \"Firefox\";\n if (/safari\\/[0-9]/i.test(ua) && !/chrome/i.test(ua)) return \"Safari\";\n return \"Other\";\n}\n\nfunction readUaData(): { mobile?: boolean; platform?: string } {\n const nav = navigator as Navigator & {\n userAgentData?: {\n mobile?: boolean;\n platform?: string;\n };\n };\n const uaData = nav.userAgentData;\n if (!uaData) return {};\n return { mobile: uaData.mobile, platform: uaData.platform };\n}\n\nfunction uaDataDevice(\n ua: string,\n uaData: { mobile?: boolean; platform?: string },\n): \"desktop\" | \"mobile\" | \"tablet\" {\n const platform = (uaData.platform ?? \"\").toLowerCase();\n if (platform === \"ios\" || platform === \"ipados\") {\n return uaData.mobile ? \"mobile\" : \"tablet\";\n }\n if (platform === \"android\") {\n return uaData.mobile ? \"mobile\" : \"tablet\";\n }\n if (uaData.mobile === true) return \"mobile\";\n return detectDeviceCategory(ua);\n}\n\n/**\n * Snapshot of the browser environment for the session replay catalog and\n * analytics parity with server-side User-Agent parsing.\n */\nexport function collectClientContext(sessionId: string): ClientContext {\n if (typeof window === \"undefined\" || typeof navigator === \"undefined\") {\n return {\n sessionId,\n timestamp: Date.now(),\n device: \"desktop\",\n os: \"Other\",\n browser: \"Other\",\n language: \"\",\n languages: [],\n colorScheme: \"\",\n screenWidth: 0,\n screenHeight: 0,\n viewportWidth: 0,\n viewportHeight: 0,\n devicePixelRatio: 1,\n timeZone: \"\",\n sdkVersion: ALPHANA_SDK_VERSION,\n };\n }\n\n const ua = navigator.userAgent || \"\";\n const uaData = readUaData();\n const device =\n uaData.mobile !== undefined || uaData.platform\n ? uaDataDevice(ua, uaData)\n : detectDeviceCategory(ua);\n\n let colorScheme: \"\" | \"light\" | \"dark\" = \"\";\n if (window.matchMedia?.(\"(prefers-color-scheme: dark)\")?.matches) {\n colorScheme = \"dark\";\n } else if (window.matchMedia?.(\"(prefers-color-scheme: light)\")?.matches) {\n colorScheme = \"light\";\n }\n\n let timeZone = \"\";\n try {\n timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"\";\n } catch {\n timeZone = \"\";\n }\n\n const langs =\n typeof navigator.languages !== \"undefined\" && navigator.languages.length\n ? [...navigator.languages]\n : navigator.language\n ? [navigator.language]\n : [];\n\n return {\n sessionId,\n timestamp: Date.now(),\n device,\n os: detectOs(ua),\n browser: detectBrowser(ua),\n language: navigator.language || \"\",\n languages: langs,\n colorScheme,\n screenWidth: window.screen?.width ?? 0,\n screenHeight: window.screen?.height ?? 0,\n viewportWidth: window.innerWidth ?? 0,\n viewportHeight: window.innerHeight ?? 0,\n devicePixelRatio: window.devicePixelRatio ?? 1,\n timeZone,\n sdkVersion: ALPHANA_SDK_VERSION,\n };\n}\n","export type ElementBinding = {\n elementId: string;\n eventKind: \"goal\" | \"revenue\";\n key: string;\n name: string;\n value?: number;\n currency?: string;\n eventName?: string;\n};\n\nexport type ElementBindingHandlers = {\n onGoal: (binding: ElementBinding) => void;\n onRevenue: (\n binding: ElementBinding,\n amount: number,\n currency: string,\n eventName?: string,\n ) => void;\n};\n\nfunction readDataAmount(el: Element): number | undefined {\n const raw = el.getAttribute(\"data-alphana-amount\")?.trim();\n if (!raw) return undefined;\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction readDataCurrency(el: Element): string | undefined {\n const raw = el.getAttribute(\"data-alphana-currency\")?.trim();\n return raw || undefined;\n}\n\nfunction readDataEventName(el: Element): string | undefined {\n const raw = el.getAttribute(\"data-alphana-event-name\")?.trim();\n return raw || undefined;\n}\n\n/**\n * Walk from the click target up to find the first element whose id matches a\n * known binding.\n */\nexport function findBindingFromEvent(\n target: EventTarget | null,\n bindingsById: Map<string, ElementBinding>,\n): { binding: ElementBinding; matchedEl: Element } | null {\n if (\n !target ||\n typeof (target as Element).getAttribute !== \"function\" ||\n typeof (target as Element).id !== \"string\"\n ) {\n return null;\n }\n let node: Element | null = target as Element;\n while (node) {\n const id = node.id?.trim();\n if (id) {\n const binding = bindingsById.get(id);\n if (binding) return { binding, matchedEl: node };\n }\n node = node.parentElement;\n }\n return null;\n}\n\nexport function resolveRevenueAmount(\n matchedEl: Element,\n binding: ElementBinding,\n): { amount: number; currency: string; eventName?: string } | null {\n const amount = readDataAmount(matchedEl) ?? binding.value;\n const currency = readDataCurrency(matchedEl) ?? binding.currency;\n if (amount == null || !currency) return null;\n const eventName = readDataEventName(matchedEl) ?? binding.eventName;\n return { amount, currency, eventName };\n}\n\nexport class ElementBindingsController {\n private bindingsById = new Map<string, ElementBinding>();\n private attached = false;\n private readonly onClick = (event: MouseEvent): void => {\n const hit = findBindingFromEvent(event.target, this.bindingsById);\n if (!hit) return;\n const { binding, matchedEl } = hit;\n if (binding.eventKind === \"goal\") {\n this.handlers.onGoal(binding);\n return;\n }\n const resolved = resolveRevenueAmount(matchedEl, binding);\n if (!resolved) {\n if (typeof console !== \"undefined\") {\n console.debug(\n \"[alphana-sdk] revenue element click skipped: missing amount/currency\",\n binding.elementId,\n );\n }\n return;\n }\n this.handlers.onRevenue(\n binding,\n resolved.amount,\n resolved.currency,\n resolved.eventName,\n );\n };\n\n constructor(private readonly handlers: ElementBindingHandlers) {}\n\n setBindings(bindings: ElementBinding[]): void {\n this.bindingsById = new Map(\n bindings\n .filter((b) => typeof b.elementId === \"string\" && b.elementId.trim())\n .map((b) => [b.elementId.trim(), b]),\n );\n }\n\n start(): void {\n if (typeof document === \"undefined\" || this.attached) return;\n document.addEventListener(\"click\", this.onClick, true);\n this.attached = true;\n }\n\n destroy(): void {\n if (!this.attached || typeof document === \"undefined\") return;\n document.removeEventListener(\"click\", this.onClick, true);\n this.attached = false;\n }\n}\n","export type CookieConsentTheme = {\n background: string;\n text: string;\n primary: string;\n primaryText: string;\n borderRadius: string;\n};\n\nexport type CookieConsentBannerConfig = {\n title: string;\n message: string;\n acceptLabel: string;\n rejectLabel: string;\n position?: \"bottom\";\n theme: CookieConsentTheme;\n policyUrl?: string;\n version: number;\n enabled?: boolean;\n};\n\nexport type ConsentBannerHandlers = {\n onAccept: () => void;\n onReject: () => void;\n};\n\nconst HOST_ID = \"alphana-cookie-consent\";\nconst ALPHANA_HOME = \"https://alphana.ir\";\n/** Public favicon mark (dashboard path /logo/Fav-Alphana.png). */\nconst ALPHANA_MARK_SRC = \"https://alphana.ir/logo/Fav-Alphana.png\";\n\nexport function destroyConsentBanner(): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(HOST_ID)?.remove();\n}\n\nexport function renderConsentBanner(\n config: CookieConsentBannerConfig,\n handlers: ConsentBannerHandlers,\n): void {\n if (typeof document === \"undefined\") return;\n destroyConsentBanner();\n\n const host = document.createElement(\"div\");\n host.id = HOST_ID;\n host.setAttribute(\"data-alphana-widget\", \"cookie-consent\");\n Object.assign(host.style, {\n all: \"initial\",\n position: \"fixed\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n zIndex: \"2147483646\",\n pointerEvents: \"none\",\n } as CSSStyleDeclaration);\n\n const shadow = host.attachShadow({ mode: \"open\" });\n const dir =\n document.documentElement.getAttribute(\"dir\") === \"rtl\" ||\n /^(fa|ar|he|ur)/i.test(document.documentElement.lang)\n ? \"rtl\"\n : \"ltr\";\n\n const theme = config.theme;\n const policyLabel = dir === \"rtl\" ? \"سیاست حریم خصوصی\" : \"Privacy policy\";\n const poweredLabel =\n dir === \"rtl\" ? \"قدرت‌گرفته از Alphana\" : \"Powered by Alphana\";\n\n const style = document.createElement(\"style\");\n style.textContent = `\n :host { all: initial; }\n .sheet {\n pointer-events: auto;\n margin: 12px;\n padding: 16px 18px 12px;\n border-radius: ${theme.borderRadius};\n background: ${theme.background};\n color: ${theme.text};\n box-shadow: 0 12px 40px rgba(0,0,0,.28);\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n max-width: 720px;\n margin-inline: auto;\n }\n .title {\n font-size: 15px;\n font-weight: 650;\n margin: 0 0 8px;\n line-height: 1.35;\n color: ${theme.text};\n }\n .message {\n font-size: 13px;\n line-height: 1.55;\n margin: 0 0 10px;\n opacity: .92;\n color: ${theme.text};\n }\n a.policy {\n color: ${theme.primary};\n font-size: 12px;\n font-weight: 600;\n line-height: 1.3;\n text-decoration: underline;\n text-underline-offset: 2px;\n display: inline-block;\n margin: 0 0 14px;\n cursor: pointer;\n }\n a.policy:hover {\n opacity: .85;\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: flex-end;\n }\n button {\n appearance: none;\n border: 0;\n cursor: pointer;\n border-radius: 10px;\n padding: 9px 14px;\n font-size: 13px;\n font-weight: 600;\n line-height: 1.2;\n font-family: inherit;\n }\n .accept {\n background: ${theme.primary};\n color: ${theme.primaryText};\n }\n .reject {\n background: transparent;\n color: ${theme.text};\n border: 1px solid color-mix(in srgb, ${theme.text} 35%, transparent);\n }\n .footer {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid color-mix(in srgb, ${theme.text} 18%, transparent);\n text-align: center;\n }\n a.brand {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n color: ${theme.text};\n opacity: .72;\n font-size: 11px;\n font-weight: 500;\n line-height: 1.2;\n text-decoration: none;\n cursor: pointer;\n }\n a.brand:hover {\n opacity: 1;\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n a.brand img {\n display: block;\n width: 14px;\n height: 14px;\n object-fit: contain;\n flex-shrink: 0;\n }\n @media (max-width: 480px) {\n .sheet { margin: 8px; padding: 14px 14px 10px; }\n .actions { flex-direction: column-reverse; }\n button { width: 100%; }\n }\n `;\n\n const sheet = document.createElement(\"div\");\n sheet.className = \"sheet\";\n sheet.setAttribute(\"dir\", dir);\n sheet.setAttribute(\"role\", \"dialog\");\n sheet.setAttribute(\"aria-live\", \"polite\");\n sheet.setAttribute(\"aria-label\", config.title);\n\n const title = document.createElement(\"p\");\n title.className = \"title\";\n title.textContent = config.title;\n\n const message = document.createElement(\"p\");\n message.className = \"message\";\n message.textContent = config.message;\n\n sheet.append(title, message);\n\n const policyHref = config.policyUrl?.trim();\n if (policyHref) {\n const policy = document.createElement(\"a\");\n policy.className = \"policy\";\n policy.href = policyHref;\n policy.target = \"_blank\";\n policy.rel = \"noopener noreferrer\";\n policy.textContent = policyLabel;\n sheet.append(policy);\n } else {\n message.style.marginBottom = \"14px\";\n }\n\n const actions = document.createElement(\"div\");\n actions.className = \"actions\";\n\n const rejectBtn = document.createElement(\"button\");\n rejectBtn.type = \"button\";\n rejectBtn.className = \"reject\";\n rejectBtn.textContent = config.rejectLabel;\n rejectBtn.addEventListener(\"click\", () => {\n destroyConsentBanner();\n handlers.onReject();\n });\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.type = \"button\";\n acceptBtn.className = \"accept\";\n acceptBtn.textContent = config.acceptLabel;\n acceptBtn.addEventListener(\"click\", () => {\n destroyConsentBanner();\n handlers.onAccept();\n });\n\n actions.append(rejectBtn, acceptBtn);\n\n const footer = document.createElement(\"div\");\n footer.className = \"footer\";\n\n const brand = document.createElement(\"a\");\n brand.className = \"brand\";\n brand.href = ALPHANA_HOME;\n brand.target = \"_blank\";\n brand.rel = \"noopener noreferrer\";\n brand.setAttribute(\"aria-label\", poweredLabel);\n\n const brandImg = document.createElement(\"img\");\n brandImg.src = ALPHANA_MARK_SRC;\n brandImg.alt = \"\";\n brandImg.width = 14;\n brandImg.height = 14;\n brandImg.decoding = \"async\";\n\n const brandText = document.createElement(\"span\");\n brandText.textContent = poweredLabel;\n\n brand.append(brandImg, brandText);\n footer.append(brand);\n\n sheet.append(actions, footer);\n shadow.append(style, sheet);\n document.documentElement.appendChild(host);\n}\n","export type ConsentStatus = \"granted\" | \"rejected\";\n\nexport type StoredConsent = {\n status: ConsentStatus;\n decidedAt: number;\n version: number;\n};\n\nconst CONSENT_STORAGE_KEY = \"__alphana_consent__\";\n\nfunction safeGet(key: string): string | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSet(key: string, value: string): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(key, value);\n } catch {\n /* private mode / quota */\n }\n}\n\nexport function readConsent(): StoredConsent | null {\n const raw = safeGet(CONSENT_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredConsent;\n if (\n (parsed.status === \"granted\" || parsed.status === \"rejected\") &&\n typeof parsed.version === \"number\" &&\n typeof parsed.decidedAt === \"number\"\n ) {\n return parsed;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function writeConsent(status: ConsentStatus, version: number): void {\n const value: StoredConsent = {\n status,\n version,\n decidedAt: Date.now(),\n };\n safeSet(CONSENT_STORAGE_KEY, JSON.stringify(value));\n}\n","import type {\n TrackerConfig,\n TrackerEvent,\n SessionData,\n PageView,\n HeatmapPoint,\n AbVariantsMap,\n AttributionContext,\n GoalEventPayload,\n JourneyStepEventPayload,\n RevenueEventPayload,\n} from \"./types\";\nimport {\n apiBaseFromEventsEndpoint,\n collectUrlFromEventsEndpoint,\n} from \"./utils/api-base\";\nimport {\n buildCollectBatchBody,\n buildCollectHeartbeatBody,\n} from \"./utils/collect-payload\";\nimport {\n generateSessionId,\n peekVisitorId,\n persistVisitorId,\n} from \"./utils/session\";\nimport { NavigationPlugin } from \"./core/navigation\";\nimport { TimePlugin } from \"./core/time\";\nimport { HeatmapPlugin } from \"./core/heatmap\";\nimport { LogCapture } from \"./core/logger\";\nimport { SessionReplayController } from \"./core/session-replay\";\nimport { normalizeTrackerPath } from \"./utils/normalize-tracker-path\";\nimport { collectClientContext } from \"./core/client-context\";\nimport { postIngest, postIngestBeacon } from \"./utils/ingest-fetch\";\nimport {\n ElementBindingsController,\n type ElementBinding,\n} from \"./core/element-bindings\";\nimport {\n destroyConsentBanner,\n renderConsentBanner,\n type CookieConsentBannerConfig,\n} from \"./core/consent-banner\";\nimport { readConsent, writeConsent } from \"./core/consent-storage\";\n\nexport const DEFAULT_ENDPOINT = \"https://api.alphana.ir/api/events\";\n\nconst DEFAULTS = {\n endpoint: DEFAULT_ENDPOINT,\n trackNavigation: true,\n trackTime: true,\n trackHeatmap: true,\n trackLogs: true,\n mouseSampleRate: 0.1,\n maxHeatmapPoints: 2000,\n batchSize: 20,\n flushInterval: 5_000,\n compressPayloads: true,\n compressionThresholdBytes: 1024,\n sessionReplay: true,\n sessionReplayCheckoutEveryNms: 600_000,\n sessionReplayInlineStylesheet: false,\n sessionReplayMaxEventsPerBatch: 48,\n sessionReplayFlushIntervalMs: 4_000,\n sessionReplayMaskAllInputs: true,\n sessionReplayMaskTextClass: \"alphana-mask\",\n sessionReplayBlockClass: \"alphana-block\",\n} as const;\n\ntype SubscriberFn = (event: TrackerEvent) => void;\n\nconst FIRST_TOUCH_KEY = \"__alphana_first_touch__\";\nconst LAST_TOUCH_KEY = \"__alphana_last_touch__\";\nconst UTM_PARAM_MAP = {\n utm_source: \"source\",\n utm_medium: \"medium\",\n utm_campaign: \"campaign\",\n utm_term: \"term\",\n utm_content: \"content\",\n} as const;\nconst CLICK_ID_PARAMS = [\"gclid\", \"fbclid\", \"ttclid\", \"msclkid\"] as const;\n\nfunction safeLocalStorageGet(key: string): string | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeLocalStorageSet(key: string, value: string): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(key, value);\n } catch {\n /* private mode / quota */\n }\n}\n\nfunction readTouch(key: string): AttributionContext | undefined {\n const raw = safeLocalStorageGet(key);\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw) as AttributionContext;\n return typeof parsed.landingPage === \"string\" &&\n typeof parsed.capturedAt === \"number\"\n ? parsed\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeTouch(key: string, value: AttributionContext): void {\n safeLocalStorageSet(key, JSON.stringify(value));\n}\n\nfunction hostFromReferrer(referrer?: string): string | undefined {\n if (!referrer) return undefined;\n try {\n return new URL(referrer).hostname.replace(/^www\\./, \"\").toLowerCase();\n } catch {\n return undefined;\n }\n}\n\nfunction currentSearchParams(): URLSearchParams {\n if (typeof window === \"undefined\") return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction readUtmParams(\n searchParams: URLSearchParams,\n): AttributionContext[\"utm\"] {\n const utm: AttributionContext[\"utm\"] = {};\n for (const [param, key] of Object.entries(UTM_PARAM_MAP)) {\n const value = searchParams.get(param)?.trim();\n if (value) utm[key] = value;\n }\n return Object.keys(utm).length > 0 ? utm : undefined;\n}\n\nfunction readClickIds(\n searchParams: URLSearchParams,\n): Record<string, string> | undefined {\n const clickIds: Record<string, string> = {};\n for (const key of CLICK_ID_PARAMS) {\n const value = searchParams.get(key)?.trim();\n if (value) clickIds[key] = value;\n }\n return Object.keys(clickIds).length > 0 ? clickIds : undefined;\n}\n\nfunction withNormalizedPaths(event: TrackerEvent): TrackerEvent {\n switch (event.type) {\n case \"pageview\":\n return {\n type: \"pageview\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"timespent\":\n return {\n type: \"timespent\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"heatmap\":\n return {\n type: \"heatmap\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"rageclik\":\n return {\n type: \"rageclik\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"uturn\":\n return {\n type: \"uturn\",\n data: {\n ...event.data,\n fromPath: normalizeTrackerPath(event.data.fromPath),\n toPath: normalizeTrackerPath(event.data.toPath),\n },\n };\n case \"identify\":\n return event;\n case \"revenue\":\n return event;\n case \"goal\":\n return {\n type: \"goal\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"journey_step\":\n return {\n type: \"journey_step\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"client_context\":\n return event;\n case \"session_replay\":\n return event;\n default: {\n const _exhaustive: never = event;\n return _exhaustive;\n }\n }\n}\ntype FlagSubscriberFn = (flags: Record<string, boolean>) => void;\ntype AbTestSubscriberFn = (variants: AbVariantsMap) => void;\n\ntype SdkRuntimeConfigResponse = {\n elementBindings?: ElementBinding[];\n widgets?: {\n cookieConsent?: (CookieConsentBannerConfig & { enabled?: boolean }) | null;\n };\n};\n\n/**\n * Core tracker class. Framework-agnostic — works in any environment that has\n * a browser DOM (React, Next.js Pages Router, Vite, vanilla JS/TS, etc.).\n *\n * Usage:\n * ```ts\n * const tracker = new UserTracker({ endpoint: 'https://my-api.com/events' });\n * tracker.init(); // call once; safe to call in SSR (no-op server-side)\n * ```\n *\n * Destroy when done (e.g. component unmount):\n * ```ts\n * tracker.destroy();\n * ```\n */\ntype ResolvedConfig = Required<\n Pick<\n TrackerConfig,\n | \"endpoint\"\n | \"trackNavigation\"\n | \"trackTime\"\n | \"trackHeatmap\"\n | \"trackLogs\"\n | \"mouseSampleRate\"\n | \"maxHeatmapPoints\"\n | \"batchSize\"\n | \"flushInterval\"\n | \"compressPayloads\"\n | \"compressionThresholdBytes\"\n | \"sessionReplay\"\n | \"sessionReplayCheckoutEveryNms\"\n | \"sessionReplayInlineStylesheet\"\n | \"sessionReplayMaxEventsPerBatch\"\n | \"sessionReplayFlushIntervalMs\"\n | \"sessionReplayMaskAllInputs\"\n | \"sessionReplayMaskTextClass\"\n | \"sessionReplayBlockClass\"\n >\n> &\n TrackerConfig;\n\nexport class UserTracker {\n private readonly cfg: ResolvedConfig;\n private session: SessionData;\n private navigation?: NavigationPlugin;\n private time?: TimePlugin;\n private heatmap?: HeatmapPlugin;\n private sessionReplay?: SessionReplayController;\n /** Public so consumers can call logCapture.capture() for manual log entries. */\n logCapture?: LogCapture;\n private initialized = false;\n private trackingAllowed = false;\n private trackingBlocked = false;\n private visitorPersisted = false;\n private elementBindings?: ElementBindingsController;\n private readonly subscribers = new Set<SubscriberFn>();\n\n /** In-memory queue of events waiting to be flushed. */\n private queue: TrackerEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n\n // ─── Feature flags ────────────────────────────────────────────────────────\n private userProperties: Record<string, string> = {};\n private flags: Record<string, boolean> = {};\n private readonly flagSubscribers = new Set<FlagSubscriberFn>();\n\n // ─── A/B tests ────────────────────────────────────────────────────────────\n private abVariants: AbVariantsMap = {};\n private readonly abTestSubscribers = new Set<AbTestSubscriberFn>();\n\n constructor(config: TrackerConfig = {}) {\n this.cfg = { ...DEFAULTS, ...config } as ResolvedConfig;\n\n // Validate endpoint URL up front so the error is thrown at construction\n // time rather than silently failing during a network request.\n try {\n new URL(this.cfg.endpoint);\n } catch {\n throw new Error(\n `[alpha-tracker] Invalid endpoint URL: \"${this.cfg.endpoint}\"`,\n );\n }\n\n const existingVisitorId = peekVisitorId();\n this.visitorPersisted = Boolean(existingVisitorId);\n\n this.session = {\n id: config.sessionId ?? generateSessionId(),\n visitorId: existingVisitorId ?? generateSessionId(),\n startedAt: Date.now(),\n pageViews: [],\n timeSpent: {},\n heatmap: {},\n userProperties: {},\n attribution: {\n firstTouch: readTouch(FIRST_TOUCH_KEY),\n lastTouch: readTouch(LAST_TOUCH_KEY),\n },\n };\n }\n\n private updateAttributionForPageView(\n path: string,\n referrer?: string,\n ): {\n firstTouch?: AttributionContext;\n lastTouch?: AttributionContext;\n } {\n const searchParams = currentSearchParams();\n const utm = readUtmParams(searchParams);\n const clickIds = readClickIds(searchParams);\n const existingFirst = readTouch(FIRST_TOUCH_KEY);\n const hasCampaignSignal = Boolean(utm || clickIds || referrer);\n const touch: AttributionContext | undefined = hasCampaignSignal\n ? {\n landingPage: path,\n referrer,\n referrerHost: hostFromReferrer(referrer),\n utm,\n clickIds,\n capturedAt: Date.now(),\n }\n : undefined;\n\n if (!existingFirst && touch) {\n writeTouch(FIRST_TOUCH_KEY, touch);\n }\n if (touch) {\n writeTouch(LAST_TOUCH_KEY, touch);\n }\n\n const attribution = {\n firstTouch: readTouch(FIRST_TOUCH_KEY),\n lastTouch: readTouch(LAST_TOUCH_KEY),\n };\n this.session.attribution = attribution;\n return attribution;\n }\n\n private currentAttribution(): {\n firstTouch?: AttributionContext;\n lastTouch?: AttributionContext;\n } {\n const attribution = {\n firstTouch: readTouch(FIRST_TOUCH_KEY),\n lastTouch: readTouch(LAST_TOUCH_KEY),\n };\n this.session.attribution = attribution;\n return attribution;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────────────\n\n /**\n * Attach event listeners and start tracking.\n * Safe to call during SSR — returns `this` immediately if `window` is\n * undefined so it can be chained: `const tracker = new UserTracker(cfg).init()`.\n *\n * When the dashboard cookie-consent widget is enabled, tracking waits until\n * the visitor accepts (or resumes a prior decision for the same config version).\n */\n init(): this {\n if (typeof window === \"undefined\" || this.initialized) return this;\n this.initialized = true;\n void this.bootstrapRuntime();\n return this;\n }\n\n private async bootstrapRuntime(): Promise<void> {\n const runtime = await this.fetchRuntimeConfig();\n this.applyElementBindings(runtime?.elementBindings ?? []);\n\n if (this.cfg.consentMode === \"disabled\") {\n this.startTracking();\n return;\n }\n\n const consentWidget = runtime?.widgets?.cookieConsent;\n if (!consentWidget?.enabled) {\n this.startTracking();\n return;\n }\n\n const stored = readConsent();\n if (stored && stored.version === consentWidget.version) {\n if (stored.status === \"granted\") {\n this.startTracking();\n } else {\n this.blockTracking();\n }\n return;\n }\n\n renderConsentBanner(consentWidget, {\n onAccept: () => {\n writeConsent(\"granted\", consentWidget.version);\n this.startTracking();\n },\n onReject: () => {\n writeConsent(\"rejected\", consentWidget.version);\n this.blockTracking();\n },\n });\n }\n\n private applyElementBindings(bindings: ElementBinding[]): void {\n if (!this.elementBindings) {\n this.elementBindings = new ElementBindingsController({\n onGoal: (binding) => {\n this.trackGoal({\n key: binding.key,\n name: binding.name,\n value: binding.value,\n currency: binding.currency,\n metadata: { source: \"element_click\", elementId: binding.elementId },\n });\n },\n onRevenue: (binding, amount, currency, eventName) => {\n this.trackRevenue({\n eventName: eventName ?? \"purchase\",\n amount,\n currency,\n metadata: {\n source: \"element_click\",\n elementId: binding.elementId,\n triggerKey: binding.key,\n },\n });\n },\n });\n }\n this.elementBindings.setBindings(bindings);\n }\n\n private persistVisitorIfNeeded(): void {\n if (this.visitorPersisted) return;\n persistVisitorId(this.session.visitorId);\n this.visitorPersisted = true;\n }\n\n /** Start plugins, network flush, and element listeners after consent is OK. */\n private startTracking(): void {\n if (this.trackingAllowed || this.trackingBlocked) return;\n this.trackingAllowed = true;\n this.persistVisitorIfNeeded();\n\n const emit = this.emit.bind(this);\n const { id: sessionId } = this.session;\n\n emit({\n type: \"client_context\",\n data: collectClientContext(sessionId),\n });\n\n if (this.cfg.trackNavigation) {\n this.navigation = new NavigationPlugin({ emit, sessionId });\n this.navigation.init();\n }\n\n if (this.cfg.trackTime) {\n this.time = new TimePlugin({ emit, sessionId });\n this.time.init();\n }\n\n if (this.cfg.trackHeatmap) {\n this.heatmap = new HeatmapPlugin({\n emit,\n sessionId,\n sampleRate: this.cfg.mouseSampleRate,\n maxPoints: this.cfg.maxHeatmapPoints,\n });\n this.heatmap.init();\n }\n\n if (this.cfg.sessionReplay) {\n this.sessionReplay = new SessionReplayController({\n emit,\n checkoutEveryNms: this.cfg.sessionReplayCheckoutEveryNms,\n inlineStylesheet: this.cfg.sessionReplayInlineStylesheet,\n maxEventsPerBatch: this.cfg.sessionReplayMaxEventsPerBatch,\n flushIntervalMs: this.cfg.sessionReplayFlushIntervalMs,\n maskAllInputs: this.cfg.sessionReplayMaskAllInputs,\n maskTextClass: this.cfg.sessionReplayMaskTextClass,\n blockClass: this.cfg.sessionReplayBlockClass,\n });\n this.sessionReplay.start();\n }\n\n if (this.cfg.endpoint) {\n this.flushTimer = setInterval(() => {\n if (this.queue.length > 0) void this.flushQueue();\n }, this.cfg.flushInterval);\n\n window.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n window.addEventListener(\"pagehide\", this.handlePageHide);\n\n this.heartbeatTimer = setInterval(() => {\n if (document.visibilityState !== \"hidden\") void this.sendHeartbeat();\n }, 30_000);\n\n if (this.cfg.trackLogs) {\n this.logCapture = new LogCapture({\n endpoint: this.cfg.endpoint,\n collectEndpoint: this.collectUrl,\n sessionId: this.session.id,\n secretKey: this.cfg.secretKey,\n appId: this.cfg.appId,\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n });\n this.logCapture.init();\n }\n }\n\n this.elementBindings?.start();\n void this.fetchFlags();\n void this.fetchAbTests();\n }\n\n private blockTracking(): void {\n this.trackingBlocked = true;\n this.trackingAllowed = false;\n this.queue = [];\n destroyConsentBanner();\n this.elementBindings?.destroy();\n }\n\n /** Remove all event listeners, flush remaining queue, and reset state. */\n destroy(): void {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n window.removeEventListener(\"pagehide\", this.handlePageHide);\n }\n\n this.navigation?.destroy();\n this.time?.destroy();\n this.heatmap?.destroy();\n this.sessionReplay?.destroy();\n this.sessionReplay = undefined;\n this.logCapture?.destroy();\n this.elementBindings?.destroy();\n destroyConsentBanner();\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"tracker:navigate\", this.handleNavigate);\n }\n\n // Best-effort flush of any remaining queued events.\n if (this.queue.length > 0 && this.cfg.endpoint && this.trackingAllowed) {\n this.flushBeacon();\n }\n\n this.initialized = false;\n this.trackingAllowed = false;\n this.trackingBlocked = false;\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === \"hidden\") {\n this.sessionReplay?.flush();\n if (this.queue.length > 0) this.flushBeacon();\n this.sendDeactivate();\n }\n };\n\n private handlePageHide = (): void => {\n this.sessionReplay?.flush();\n if (this.queue.length > 0) this.flushBeacon();\n this.sendDeactivate();\n };\n\n private handleNavigate = (_e: Event): void => {\n // Navigation hook kept for potential future use.\n };\n\n /**\n * Send a keep-alive heartbeat so the backend knows this session is still\n * active. Called every 30 s while the tab is visible.\n */\n private async sendHeartbeat(): Promise<void> {\n if (!this.cfg.endpoint || !this.trackingAllowed) return;\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n const body = JSON.stringify(\n buildCollectHeartbeatBody({\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n path: this.currentPath(),\n active: true,\n appId: this.cfg.appId,\n }),\n );\n try {\n await postIngest(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n keepalive: true,\n });\n } catch {\n // Silent — heartbeat failure should never surface to the user.\n }\n }\n\n /**\n * Send a synchronous beacon to mark this session as inactive.\n * Called on page unload / tab hidden so the dashboard reflects real-time.\n */\n private sendDeactivate(): void {\n if (!this.cfg.endpoint || !this.trackingAllowed) return;\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n const body = JSON.stringify(\n buildCollectHeartbeatBody({\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n path: this.currentPath(),\n active: false,\n appId: this.cfg.appId,\n }),\n );\n postIngestBeacon(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n });\n }\n\n // ─── Event pipeline ─────────────────────────────────────────────────────────\n\n /** Emit a tracker event. Also used internally by the plugins. */\n emit(event: TrackerEvent): void {\n if (!this.trackingAllowed || this.trackingBlocked) return;\n event = withNormalizedPaths(event);\n if (event.type === \"pageview\") {\n const attribution = this.updateAttributionForPageView(\n event.data.path,\n event.data.referrer,\n );\n event = {\n type: \"pageview\",\n data: {\n ...event.data,\n utm: attribution.lastTouch?.utm,\n attribution,\n },\n };\n }\n // 1 – accumulate into session data\n switch (event.type) {\n case \"pageview\":\n this.session.pageViews.push(event.data);\n break;\n\n case \"timespent\": {\n const prev = this.session.timeSpent[event.data.path] ?? 0;\n this.session.timeSpent[event.data.path] = prev + event.data.duration;\n break;\n }\n\n case \"heatmap\": {\n const key = event.data.path;\n if (!this.session.heatmap[key]) this.session.heatmap[key] = [];\n const pts = this.session.heatmap[key];\n if (pts.length < this.cfg.maxHeatmapPoints) pts.push(event.data);\n break;\n }\n\n // rageclik and uturn are forwarded to the backend only; no local state needed.\n case \"rageclik\":\n case \"uturn\":\n case \"identify\":\n case \"revenue\":\n case \"goal\":\n case \"journey_step\":\n case \"client_context\":\n case \"session_replay\":\n break;\n }\n\n // 2 – notify subscribers (used internally by React hooks)\n this.subscribers.forEach((fn) => fn(event));\n\n // 3 – user callback\n this.cfg.onEvent?.(event);\n\n // 4 – enqueue for batched remote sending\n if (this.cfg.endpoint) {\n this.queue.push(event);\n // Auto-flush once the batch size threshold is reached.\n if (this.queue.length >= this.cfg.batchSize) {\n void this.flushQueue();\n }\n }\n }\n\n /**\n * Subscribe to every emitted event. Returns an unsubscribe function.\n *\n * ```ts\n * const unsub = tracker.subscribe(event => console.log(event));\n * // later…\n * unsub();\n * ```\n */\n subscribe(fn: SubscriberFn): () => void {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n // ─── Manual tracking helpers ────────────────────────────────────────────────\n\n /**\n * Manually record a page view and dispatch `tracker:navigate`.\n * Required for Next.js App Router — call it inside a `useEffect` that\n * depends on `usePathname()`:\n *\n * ```tsx\n * const pathname = usePathname();\n * useEffect(() => { tracker.trackPageView(pathname); }, [pathname]);\n * ```\n */\n trackPageView(path?: string): void {\n const resolvedPath = normalizeTrackerPath(\n path ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\"),\n );\n\n this.emit({\n type: \"pageview\",\n data: {\n path: resolvedPath,\n title: typeof document !== \"undefined\" ? document.title : \"\",\n timestamp: Date.now(),\n sessionId: this.session.id,\n referrer:\n typeof document !== \"undefined\"\n ? document.referrer || undefined\n : undefined,\n },\n });\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"tracker:navigate\", {\n detail: { path: resolvedPath, title: document.title },\n }),\n );\n }\n }\n\n /**\n * Track a monetary conversion such as a purchase, subscription, renewal,\n * upgrade, or refund. Revenue events include the current attribution context\n * so the backend can credit campaigns without recomputing browser state.\n */\n trackRevenue(payload: RevenueEventPayload): void {\n this.emit({\n type: \"revenue\",\n data: {\n ...payload,\n eventName: payload.eventName ?? \"purchase\",\n status: payload.status ?? \"paid\",\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n timestamp: Date.now(),\n attribution: this.currentAttribution(),\n },\n });\n }\n\n /** Track a business goal such as signup, trial_start, lead, or checkout_start. */\n trackGoal(payload: GoalEventPayload): void {\n const path = normalizeTrackerPath(\n typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\",\n );\n this.emit({\n type: \"goal\",\n data: {\n ...payload,\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n path,\n timestamp: Date.now(),\n },\n });\n }\n\n /** Track a named product journey milestone beyond automatic pageviews. */\n trackJourneyStep(payload: JourneyStepEventPayload): void {\n const path = normalizeTrackerPath(\n payload.path ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\"),\n );\n this.emit({\n type: \"journey_step\",\n data: {\n ...payload,\n path,\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n timestamp: Date.now(),\n },\n });\n }\n\n // ─── Identity & Feature Flags ───────────────────────────────────────────────\n\n /**\n * Identify the current user with a set of properties.\n * Properties are merged with any previously set ones and used for feature\n * flag targeting (e.g. `email`, `plan`, `country`).\n * Automatically triggers a flag re-evaluation.\n *\n * ```ts\n * tracker.identify({ email: 'user@example.com', plan: 'pro' });\n * ```\n */\n identify(properties: Record<string, string>): void {\n this.userProperties = { ...this.userProperties, ...properties };\n this.session.userProperties = { ...this.userProperties };\n this.emit({\n type: \"identify\",\n data: {\n properties: { ...this.userProperties },\n visitorId: this.session.visitorId,\n timestamp: Date.now(),\n },\n });\n void this.fetchFlags();\n }\n\n /**\n * Returns the latest evaluated feature flags as `{ [key]: boolean }`.\n * Flags are fetched on `init()` and after every `identify()` call.\n */\n getFlags(): Record<string, boolean> {\n return { ...this.flags };\n }\n\n /**\n * Returns `true` if the given flag is currently enabled for this user.\n * Returns `false` for unknown flags or before flags have loaded.\n */\n isFeatureEnabled(flagKey: string): boolean {\n return this.flags[flagKey] === true;\n }\n\n /**\n * Subscribe to flag changes. Called whenever flags are re-evaluated.\n * Returns an unsubscribe function.\n *\n * ```ts\n * const unsub = tracker.onFlagsChange(flags => console.log(flags));\n * ```\n */\n onFlagsChange(fn: FlagSubscriberFn): () => void {\n this.flagSubscribers.add(fn);\n return () => this.flagSubscribers.delete(fn);\n }\n\n /** Fetch (or re-fetch) flags from the backend evaluate endpoint. */\n async fetchFlags(): Promise<void> {\n if (!this.cfg.endpoint || !this.cfg.secretKey || !this.trackingAllowed)\n return;\n const url =\n apiBaseFromEventsEndpoint(this.cfg.endpoint) + \"/feature-flags/evaluate\";\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.cfg.secretKey}`,\n },\n body: JSON.stringify({ userProperties: this.userProperties }),\n });\n if (!res.ok) return;\n const data = (await res.json()) as Record<string, boolean>;\n this.flags = data;\n this.flagSubscribers.forEach((fn) => fn({ ...this.flags }));\n } catch {\n // Silent — flag fetch failure must never surface to the user.\n }\n }\n\n // ─── A/B tests ──────────────────────────────────────────────────────────────\n\n /**\n * Returns variant keys assigned to this visitor for each running experiment.\n * Fetched on `init()` and after `fetchAbTests()`.\n *\n * ```ts\n * const variants = tracker.getAbVariants();\n * // { 'checkout-cta-test': 'variant-b' }\n * ```\n */\n getAbVariants(): AbVariantsMap {\n return { ...this.abVariants };\n }\n\n /**\n * Returns the assigned variant key for one experiment, or `null` if the\n * experiment is not running or not found.\n */\n getAbVariant(experimentKey: string): string | null {\n const v = this.abVariants[experimentKey];\n return v ?? null;\n }\n\n /**\n * Returns `true` when the visitor is assigned to the given variant key.\n */\n isAbVariant(experimentKey: string, variantKey: string): boolean {\n return this.abVariants[experimentKey] === variantKey;\n }\n\n /**\n * Subscribe to A/B assignment updates. Returns an unsubscribe function.\n */\n onAbTestsChange(fn: AbTestSubscriberFn): () => void {\n this.abTestSubscribers.add(fn);\n return () => this.abTestSubscribers.delete(fn);\n }\n\n /**\n * Fetch (or re-fetch) variant assignments from `/ab-tests/evaluate`.\n * @param keys When set, only these experiment keys are evaluated and merged.\n */\n async fetchAbTests(keys?: string[]): Promise<void> {\n if (!this.cfg.endpoint || !this.cfg.secretKey || !this.trackingAllowed)\n return;\n const url =\n apiBaseFromEventsEndpoint(this.cfg.endpoint) + \"/ab-tests/evaluate\";\n try {\n const body: { visitorId: string; keys?: string[] } = {\n visitorId: this.session.visitorId,\n };\n if (keys?.length) body.keys = keys;\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.cfg.secretKey}`,\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) return;\n const data = (await res.json()) as AbVariantsMap;\n this.abVariants = keys?.length\n ? { ...this.abVariants, ...data }\n : { ...data };\n this.abTestSubscribers.forEach((fn) => fn({ ...this.abVariants }));\n } catch {\n // Silent — assignment failure must never surface to the user.\n }\n }\n\n // ─── Data accessors ─────────────────────────────────────────────────────────\n\n /** A read-only snapshot of the current session. */\n getSession(): Readonly<SessionData> {\n return this.session;\n }\n\n /** All page views recorded so far. */\n getPageViews(): PageView[] {\n return [...this.session.pageViews];\n }\n\n /** Cumulative milliseconds spent per path. */\n getTimeSpent(): Record<string, number> {\n return { ...this.session.timeSpent };\n }\n\n /** Heatmap points for a specific path. */\n getHeatmapData(path: string): HeatmapPoint[];\n /** Heatmap points for all tracked paths. */\n getHeatmapData(): Record<string, HeatmapPoint[]>;\n getHeatmapData(\n path?: string,\n ): HeatmapPoint[] | Record<string, HeatmapPoint[]> {\n if (path !== undefined) {\n return [...(this.session.heatmap[path] ?? [])];\n }\n return Object.entries(this.session.heatmap).reduce<\n Record<string, HeatmapPoint[]>\n >((acc, [k, v]) => {\n acc[k] = [...v];\n return acc;\n }, {});\n }\n\n // ─── Network ────────────────────────────────────────────────────────────────\n\n private get collectUrl(): string {\n return (\n this.cfg.collectEndpoint ??\n collectUrlFromEventsEndpoint(this.cfg.endpoint!)\n );\n }\n\n private async fetchRuntimeConfig(): Promise<SdkRuntimeConfigResponse | null> {\n if (!this.cfg.endpoint || !this.cfg.secretKey) return null;\n const url =\n apiBaseFromEventsEndpoint(this.cfg.endpoint) + \"/sdk/runtime-config\";\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.cfg.secretKey}`,\n },\n body: JSON.stringify({\n ...(this.cfg.appId ? { appId: this.cfg.appId } : {}),\n }),\n });\n if (!res.ok) return null;\n return (await res.json()) as SdkRuntimeConfigResponse;\n } catch {\n return null;\n }\n }\n\n private currentPath(): string {\n return normalizeTrackerPath(\n typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\",\n );\n }\n\n /**\n * Immediately drain the event queue and POST pending events to `/batch`.\n * Fire-and-forget; errors are intentionally swallowed like other analytics calls.\n */\n flush(): void {\n void this.flushQueue();\n }\n\n /** Drain the queue and POST all pending events to the batch endpoint. */\n private async flushQueue(): Promise<void> {\n if (this.queue.length === 0) return;\n // Splice atomically so new events emitted during the async request don't\n // get lost — they stay in the queue for the next flush.\n const batch = this.queue.splice(0);\n await this.sendBatch(batch);\n }\n\n /**\n * Synchronous best-effort flush via `navigator.sendBeacon`.\n * Used on `pagehide` / `visibilitychange:hidden` where async fetch may be\n * cancelled by the browser before it completes.\n */\n private flushBeacon(): void {\n if (this.queue.length === 0) return;\n const batch = this.queue.splice(0);\n const body = JSON.stringify(\n buildCollectBatchBody(batch, {\n appId: this.cfg.appId,\n visitorId: this.session.visitorId,\n sessionId: this.session.id,\n }),\n );\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n\n postIngestBeacon(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n });\n }\n\n private async sendBatch(events: TrackerEvent[]): Promise<void> {\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n const body = JSON.stringify(\n buildCollectBatchBody(events, {\n appId: this.cfg.appId,\n visitorId: this.session.visitorId,\n sessionId: this.session.id,\n }),\n );\n await postIngest(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n });\n }\n}\n","import { createContext, useContext } from \"react\";\nimport type { UserTracker } from \"../tracker\";\n\nexport const TrackerContext = createContext<UserTracker | null>(null);\n\n/**\n * Returns the nearest `UserTracker` instance from context.\n * Returns `null` when called outside of a `<UserTrackerProvider>`.\n */\nexport function useTrackerContext(): UserTracker | null {\n return useContext(TrackerContext);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n HeatmapPoint,\n GoalEventPayload,\n JourneyStepEventPayload,\n PageView,\n RevenueEventPayload,\n TrackerEvent,\n} from \"../types\";\nimport { useTrackerContext } from \"./context\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\n\n// ─── useTracker ───────────────────────────────────────────────────────────────\n\n/**\n * Returns the `UserTracker` instance from the nearest `<UserTrackerProvider>`.\n * Returns `null` when called outside of a provider.\n */\nexport function useTracker() {\n return useTrackerContext();\n}\n\n// ─── usePageView ──────────────────────────────────────────────────────────────\n\n/**\n * Manually records a page view whenever `path` changes.\n *\n * Pass the current pathname — particularly useful with Next.js App Router:\n * ```tsx\n * 'use client';\n * import { usePathname } from 'next/navigation';\n * import { usePageView } from 'user-tracker/react';\n *\n * export function NavigationTracker() {\n * usePageView(usePathname());\n * return null;\n * }\n * ```\n * When no `path` is provided the hook is a no-op (automatic tracking via the\n * NavigationPlugin handles it).\n */\nexport function usePageView(path?: string): void {\n const tracker = useTrackerContext();\n useEffect(() => {\n if (tracker && path !== undefined) {\n tracker.trackPageView(path);\n }\n // Re-fire when the path changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [path]);\n}\n\n// ─── useHeatmapData ───────────────────────────────────────────────────────────\n\n/**\n * Returns a live array of `HeatmapPoint` objects for the given path (defaults\n * to `window.location.pathname`).\n *\n * The state is updated in batches — at most once every `refreshMs` ms — to\n * avoid a re-render on every single mouse move.\n *\n * @param path The page path to query. Defaults to the current pathname.\n * @param refreshMs Minimum interval between state updates. Default: 500.\n */\nexport function useHeatmapData(path?: string, refreshMs = 500): HeatmapPoint[] {\n const tracker = useTrackerContext();\n const [data, setData] = useState<HeatmapPoint[]>([]);\n const pendingRef = useRef(false);\n\n useEffect(() => {\n if (!tracker) return;\n\n const targetPath = normalizeTrackerPath(\n path ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\"),\n );\n\n const refresh = (): void => {\n setData(tracker.getHeatmapData(targetPath) as HeatmapPoint[]);\n pendingRef.current = false;\n };\n\n // Initial read.\n refresh();\n\n // Re-read after each new heatmap point, debounced by refreshMs.\n const unsub = tracker.subscribe((event: TrackerEvent) => {\n if (\n event.type === \"heatmap\" &&\n normalizeTrackerPath(event.data.path) === targetPath\n ) {\n if (!pendingRef.current) {\n pendingRef.current = true;\n setTimeout(refresh, refreshMs);\n }\n }\n });\n\n return unsub;\n // refreshMs is intentionally excluded — changing it after mount has no effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tracker, path]);\n\n return data;\n}\n\n// ─── usePageViews ─────────────────────────────────────────────────────────────\n\n/**\n * Returns a live array of all page views recorded in the current session.\n */\nexport function usePageViews(): PageView[] {\n const tracker = useTrackerContext();\n const [views, setViews] = useState<PageView[]>([]);\n\n useEffect(() => {\n if (!tracker) return;\n\n setViews(tracker.getPageViews());\n\n const unsub = tracker.subscribe((event: TrackerEvent) => {\n if (event.type === \"pageview\") {\n setViews(tracker.getPageViews());\n }\n });\n\n return unsub;\n }, [tracker]);\n\n return views;\n}\n\nexport function useTrackRevenue(): (payload: RevenueEventPayload) => void {\n const tracker = useTrackerContext();\n return (payload: RevenueEventPayload) => {\n tracker?.trackRevenue(payload);\n };\n}\n\nexport function useTrackGoal(): (payload: GoalEventPayload) => void {\n const tracker = useTrackerContext();\n return (payload: GoalEventPayload) => {\n tracker?.trackGoal(payload);\n };\n}\n\nexport function useTrackJourneyStep(): (payload: JourneyStepEventPayload) => void {\n const tracker = useTrackerContext();\n return (payload: JourneyStepEventPayload) => {\n tracker?.trackJourneyStep(payload);\n };\n}\n\n// ─── useTimeSpent ─────────────────────────────────────────────────────────────\n\n/**\n * Returns a live record of cumulative milliseconds spent per path.\n */\nexport function useTimeSpent(): Record<string, number> {\n const tracker = useTrackerContext();\n const [time, setTime] = useState<Record<string, number>>({});\n\n useEffect(() => {\n if (!tracker) return;\n\n setTime(tracker.getTimeSpent());\n\n const unsub = tracker.subscribe((event: TrackerEvent) => {\n if (event.type === \"timespent\") {\n setTime(tracker.getTimeSpent());\n }\n });\n\n return unsub;\n }, [tracker]);\n\n return time;\n}\n\n// ─── useFeatureFlags ──────────────────────────────────────────────────────────\n\n/**\n * Returns all evaluated feature flags as `{ [flagKey]: boolean }`.\n * Re-renders whenever flags are refreshed (e.g. after `identify()`).\n */\nexport function useFeatureFlags(): Record<string, boolean> {\n const tracker = useTrackerContext();\n const [flags, setFlags] = useState<Record<string, boolean>>(\n () => tracker?.getFlags() ?? {},\n );\n\n useEffect(() => {\n if (!tracker) return;\n // Sync immediately in case flags already loaded before this component mounted.\n setFlags(tracker.getFlags());\n const unsub = tracker.onFlagsChange(setFlags);\n // Re-fetch in case init()'s fetch completed before this subscriber was added.\n void tracker.fetchFlags();\n return unsub;\n }, [tracker]);\n\n return flags;\n}\n\n// ─── useFeatureFlagEnabled ────────────────────────────────────────────────────\n\n/**\n * Returns `true` if the given feature flag is enabled for the current user.\n * Returns `false` while flags are loading or if the flag is unknown.\n *\n * ```tsx\n * const showNewCheckout = useFeatureFlagEnabled('new-checkout');\n * ```\n */\nexport function useFeatureFlagEnabled(flagKey: string): boolean {\n const flags = useFeatureFlags();\n return flags[flagKey] === true;\n}\n\n// ─── useAbTests ───────────────────────────────────────────────────────────────\n\n/**\n * Returns all assigned A/B variants as `{ [experimentKey]: variantKey | null }`.\n * Re-renders when assignments are fetched (on `init()` or `fetchAbTests()`).\n */\nexport function useAbTests(): Record<string, string | null> {\n const tracker = useTrackerContext();\n const [variants, setVariants] = useState<Record<string, string | null>>(\n () => tracker?.getAbVariants() ?? {},\n );\n\n useEffect(() => {\n if (!tracker) return;\n setVariants(tracker.getAbVariants());\n const unsub = tracker.onAbTestsChange(setVariants);\n void tracker.fetchAbTests();\n return unsub;\n }, [tracker]);\n\n return variants;\n}\n\n// ─── useAbVariant ─────────────────────────────────────────────────────────────\n\n/**\n * Returns the assigned variant key for one running experiment, or `null`\n * while loading / when the experiment is inactive.\n *\n * ```tsx\n * const variant = useAbVariant('checkout-cta-test');\n * if (variant === 'variant-b') return <BlueCta />;\n * return <GreenCta />;\n * ```\n */\nexport function useAbVariant(experimentKey: string): string | null {\n const variants = useAbTests();\n const v = variants[experimentKey];\n return v ?? null;\n}\n\n// ─── useIsAbVariant ───────────────────────────────────────────────────────────\n\n/**\n * Returns `true` when the visitor is assigned to the given variant key.\n *\n * ```tsx\n * const isVariantB = useIsAbVariant('checkout-cta-test', 'variant-b');\n * ```\n */\nexport function useIsAbVariant(\n experimentKey: string,\n variantKey: string,\n): boolean {\n const variants = useAbTests();\n return variants[experimentKey] === variantKey;\n}\n"],"mappings":"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","names":["react_exports","__export","UserTrackerProvider","useAbTests","useAbVariant","useFeatureFlagEnabled","useFeatureFlags","useHeatmapData","useIsAbVariant","usePageView","usePageViews","useTimeSpent","useTrackGoal","useTrackJourneyStep","useTrackRevenue","useTracker","__toCommonJS","import_react","apiBaseFromEventsEndpoint","endpoint","collectUrlFromEventsEndpoint","buildCollectBatchBody","events","ctx","e","buildCollectHeartbeatBody","params","buildCollectLogBody","entry","VISITOR_STORAGE_KEY","generateSessionId","c","r","peekVisitorId","VISITOR_STORAGE_KEY","e","persistVisitorId","id","normalizeTrackerPath","path","q","pathname","search","out","i","dec","e","s","SS_LAST_PV_PATH","SS_LAST_PV_ENTRY_MS","safeSessionStorageGet","key","safeSessionStorageSet","value","e","persistLastPageView","path","pageEntryMs","getNavigationEntryType","nav","legacy","_NavigationPlugin","emit","sessionId","newPath","normalizeTrackerPath","origPush","state","title","url","origReplace","lastPath","lastMsRaw","lastEntryMs","timeOnPage","fromPath","toPath","timeOnPageMs","p","NavigationPlugin","TimePlugin","emit","sessionId","normalizeTrackerPath","duration","throttle","fn","delay","lastCall","args","now","ANCHOR_SELECTOR","SELECTOR_ID_RE","buildSelector","el","elId","parts","node","depth","nid","tag","nth","sib","getClickAnchor","target","clientX","clientY","anchor","selector","rect","relX","relY","_HeatmapPlugin","emit","sessionId","sampleRate","maxPoints","allowedPaths","pageWidth","pageHeight","absY","touch","_a","vw","vh","scrollX","scrollY","reachedY","reachedPct","prevMax","isNewMax","absX","normalizeTrackerPath","p","throttle","point","_b","_c","_d","x","y","path","now","c","nearby","HeatmapPlugin","ALPHANA_GZIP_MEDIA_TYPE","isCompressionSupported","compressUtf8","json","encoded","stream","DEFAULT_THRESHOLD_BYTES","prepareIngestBody","jsonBody","options","forceJson","_a","threshold","compressed","compressUtf8","ALPHANA_GZIP_MEDIA_TYPE","sendPreparedIngest","url","prepared","_b","headers","postIngest","response","fallback","e","postIngestBeacon","blob","LogCapture","options","_a","_b","_c","collectUrlFromEventsEndpoint","args","first","stack","msg","src","line","col","err","reason","message","level","extra","a","e","entry","body","buildCollectLogBody","postIngest","NodeType","isElement","n","isShadowRoot","host","isNativeShadowDom","shadowRoot","fixBrowserCompatibilityIssuesInCSS","cssText","getCssRulesString","s","rules","getCssRuleString","error","rule","cssStringified","isCSSImportRule","_a","Mirror","id","_this","childNode","node","meta","oldNode","createMirror","maskInputValue","maskInputOptions","tagName","type","value","maskInputFn","text","ORIGINAL_ATTRIBUTE_NAME","is2DCanvasBlank","canvas","ctx","chunkSize","x","y","getImageData","originalGetImageData","pixelBuffer","pixel","_id","tagNameRegex","IGNORED_NODE","genId","getValidTagName","element","processedTagName","stringifyStyleSheet","sheet","extractOrigin","url","origin","canvasService","canvasCtx","URL_IN_CSS_REF","RELATIVE_PATH","DATA_URI","absoluteToStylesheet","href","quote1","path1","quote2","path2","path3","filePath","maybeQuote","stack","parts","_i","parts_1","part","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","getAbsoluteSrcsetString","doc","attributeValue","pos","collectCharacters","regEx","chars","match","output","absoluteToDoc","descriptorsStr","inParens","a","isSVGElement","el","getHref","transformAttribute","name","_isBlockedElement","blockClass","blockSelector","eIndex","className","classMatchesRegex","regex","checkAncestors","needMaskingText","maskTextClass","maskTextSelector","onceIframeLoaded","iframeEl","listener","iframeLoadTimeout","win","fired","readyState","timer_1","blankUrl","onceStylesheetLoaded","link","styleSheetLoadTimeout","styleSheetLoaded","timer","serializeNode","options","mirror","inlineStylesheet","maskTextFn","_b","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","_c","newlyAddedElement","rootId","getRootId","serializeElementNode","serializeTextNode","docId","parentTagName","textContent","isStyle","isScript","err","needBlock","attributes","len","i","attr","stylesheet","checked","canvasDataURL","blankCanvas","blankCanvasDataURL","image_1","oldValue_1","recordInlineImage","_d","width","height","lowerIfExists","maybeAttr","slimDOMExcluded","sn","slimDOMOptions","serializeNodeWithId","skipChild","_e","_f","onSerialize","onIframeLoad","_g","onStylesheetLoad","_h","stylesheetLoadTimeout","_j","_k","_l","preserveWhiteSpace","_serializedNode","serializedNode","recordChild","bypassOptions","_m","childN","serializedChildNode","_o","_p","iframeDoc","serializedIframeNode","serializedLinkNode","snapshot","maskAllInputs","slimDOM","HOVER_SELECTOR","HOVER_SELECTOR_GLOBAL","on","type","fn","target","options","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","prop","receiver","throttle","func","wait","timeout","previous","args","now","remaining","context","hookSetter","key","d","isRevoked","win","original","value","patch","source","name","replacement","wrapped","_a","getWindowHeight","getWindowWidth","isBlocked","node","blockClass","blockSelector","checkAncestors","el","classMatchesRegex","isSerialized","n","mirror","isIgnored","IGNORED_NODE","isAncestorRemoved","isShadowRoot","id","isTouchEvent","event","polyfill","isSerializedIframe","n","mirror","isSerializedStylesheet","hasShadowRoot","n","StyleSheetMirror","stylesheet","_a","id","newId","EventType","EventType2","IncrementalSource","IncrementalSource2","MouseInteractions","MouseInteractions2","CanvasContext","CanvasContext2","isNodeInLinkedList","n","DoubleLinkedList","position","current","index","node","moveKey","id","parentId","MutationBuffer","mutations","adds","addList","getNextId","ns","nextId","IGNORED_NODE","pushAdd","_a","_b","_c","_d","shadowHost","rootShadowHost","notInDoc","isShadowRoot","sn","serializeNodeWithId","currentN","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","iframe","childSn","link","isParentRemoved","isAncestorInSet","candidate","_node","unhandledNode","payload","text","attribute","m","isIgnored","value","isBlocked","needMaskingText","target","maskInputValue","item","a","old","styleObj","pname","newValue","newPriority","transformAttribute","nodeId","isSerialized","deepDelete","isAncestorRemoved","isNativeShadowDom","targetId","childN","options","key","addsSet","removes","mirror","_isParentRemoved","parentNode","r","set","_isAncestorInSet","mutationBuffers","isCSSGroupingRuleSupported","isCSSMediaRuleSupported","isCSSSupportsRuleSupported","isCSSConditionRuleSupported","getEventTarget","event","path","_a","initMutationObserver","options","rootEl","_b","mutationBuffer","MutationBuffer","mutationObserverCtor","angularZoneSymbol","observer","initMoveObserver","mousemoveCb","sampling","doc","mirror","threshold","callbackThreshold","positions","timeBaseline","wrappedCb","throttle","source","totalOffset","p","updatePosition","evt","target","clientX","clientY","isTouchEvent","IncrementalSource","handlers","on","h","initMouseInteractionObserver","mouseInteractionCb","blockClass","blockSelector","disableMap","getHandler","eventKey","isBlocked","e","id","MouseInteractions","key","eventName","handler","initScrollObserver","scrollCb","scrollEl","initViewportResizeObserver","viewportResizeCb","lastH","lastW","updateDimension","height","getWindowHeight","width","getWindowWidth","wrapEventWithUserTriggeredFlag","v","enable","value","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","maskInputOptions","maskInputFn","userTriggeredOnInput","eventHandler","userTriggered","type","text","isChecked","maskInputValue","cbWithDedup","name","el","lastInputValue","currentWindow","propertyDescriptor","hookProperties","hookSetter","getNestedCSSRulePositions","rule","recurse","childRule","pos","index","getIdAndStyleId","sheet","styleMirror","styleId","initStyleSheetObserver","styleSheetRuleCb","stylesheetManager","win","insertRule","deleteRule","replace","replaceSync","supportedNestedCSSRuleTypes","unmodifiedFunctions","typeKey","initAdoptedStyleSheetObserver","host","_c","hostId","patchTarget","originalPropertyDescriptor","sheets","result","initStyleDeclarationObserver","styleDeclarationCb","ignoreCSSAttributes","setProperty","property","priority","removeProperty","initMediaInteractionObserver","mediaInteractionCb","currentTime","volume","muted","playbackRate","initFontObserver","fontCb","fontMap","originalFontFace","family","descriptors","fontFace","restoreHandler","patch","original","initSelectionObserver","param","selectionCb","collapsed","updateSelection","selection","ranges","count","i","range","startContainer","startOffset","endContainer","endOffset","mergeHooks","o","hooks","mutationCb","canvasMutationCb","initObservers","mutationObserver","mousemoveHandler","mouseInteractionHandler","scrollHandler","viewportResizeHandler","inputHandler","mediaInteractionHandler","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","selectionObserver","pluginHandlers","plugin","b","CrossOriginIframeMirror","generateIdFn","iframe","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","remoteIdToIdMap","id","map","ids","IframeManager","options","CrossOriginIframeMirror","genId","iframeEl","cb","childSn","_a","message","transformedEvent","e","EventType","IncrementalSource","n","p","range","style","iframeMirror","obj","keys","key","node","child","ShadowDomManager","options","manager","patch","original","option","shadowRoot","doc","isNativeShadowDom","initMutationObserver","initScrollObserver","initAdoptedStyleSheetObserver","iframeElement","restorePatch","__rest","s","t","p","__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","reject","fulfilled","step","e","rejected","result","chars","lookup","i","encode","arraybuffer","bytes","len","base64","canvasVarMap","variableListFor","ctx","ctor","contextMap","saveWebGLVar","value","win","isInstanceOfWebGLObject","name","list","index","serializeArg","arg","base64","encode","src","serializeArgs","args","initCanvas2DMutationObserver","cb","win","blockClass","blockSelector","handlers","props2D","prop","restoreHandler","patch","original","args","isBlocked","recordArgs","serializeArgs","CanvasContext","_a","hookHandler","hookSetter","v","h","initCanvasContextObserver","win","blockClass","blockSelector","handlers","restoreHandler","patch","original","contextType","args","isBlocked","_a","h","patchGLPrototype","prototype","type","cb","blockClass","blockSelector","mirror","win","handlers","props","prop","restoreHandler","patch","original","args","result","saveWebGLVar","isBlocked","recordArgs","serializeArgs","mutation","_a","hookHandler","hookSetter","v","initCanvasWebGLMutationObserver","CanvasContext","h","WorkerClass","WorkerThreads","e","decodeBase64","base64","enableUnicode","createBase64WorkerFactory","sourcemapArg","enableUnicodeArg","sourcemap","source","start","body","options","WorkerClass","decodeBase64","base64","enableUnicode","binaryString","binaryView","n","createURL","sourcemapArg","enableUnicodeArg","sourcemap","source","start","body","blob","createBase64WorkerFactory","url","options","kIsNodeJS","isNodeJS","createBase64WorkerFactory","base64","sourcemapArg","enableUnicodeArg","isNodeJS","WorkerFactory","createBase64WorkerFactory","CanvasManager","options","target","mutation","sampling","win","blockClass","blockSelector","recordCanvas","dataURLOptions","fps","canvasContextReset","initCanvasContextObserver","snapshotInProgressMap","worker","WorkerFactory","e","id","base64","type","width","height","CanvasContext","timeBetweenSnapshots","lastSnapshotTime","rafId","getCanvas","matchedCanvas","canvas","isBlocked","takeCanvasSnapshots","timestamp","__awaiter","_a","context","bitmap","canvas2DReset","initCanvas2DMutationObserver","canvasWebGL1and2Reset","initCanvasWebGLMutationObserver","setLatestRAFTimestamp","values","valuesWithType","value","__rest","StylesheetManager","options","StyleSheetMirror","linkEl","childSn","sheets","hostId","adoptedStyleSheetData","styles","sheet","styleId","rules","r","index","getCssRuleString","wrapEvent","e","wrappedEmit","takeFullSnapshot","canvasManager","recording","mirror","createMirror","record","options","emit","checkoutEveryNms","checkoutEveryNth","blockClass","blockSelector","ignoreClass","maskTextClass","maskTextSelector","inlineStylesheet","maskAllInputs","_maskInputOptions","_slimDOMOptions","maskInputFn","maskTextFn","hooks","packFn","sampling","dataURLOptions","mousemoveWait","recordCanvas","recordCrossOriginIframes","userTriggeredOnInput","collectFonts","inlineImages","plugins","keepIframeSrcFn","ignoreCSSAttributes","inEmittingFrame","passEmitsToParent","maskInputOptions","slimDOMOptions","polyfill","lastFullSnapshotEvent","incrementalSnapshotCount","eventProcessor","plugin","isCheckout","_a","mutationBuffers","EventType","IncrementalSource","buf","message","exceedCount","exceedTime","wrappedMutationEmit","m","wrappedScrollEmit","p","wrappedCanvasMutationEmit","wrappedAdoptedStyleSheetEmit","a","stylesheetManager","StylesheetManager","iframeManager","IframeManager","CanvasManager","shadowDomManager","ShadowDomManager","_b","_c","_d","_e","_f","getWindowWidth","getWindowHeight","node","snapshot","n","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","iframe","childSn","linkEl","handlers","on","observe","doc","initObservers","positions","source","d","v","r","payload","iframeEl","init","h","error","tag","SessionReplayController","opts","_a","_b","_c","options","event","record","events","ALPHANA_SDK_VERSION","detectDeviceCategory","ua","_a","_b","s","detectOs","detectBrowser","readUaData","uaData","uaDataDevice","platform","collectClientContext","sessionId","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","device","colorScheme","timeZone","e","langs","readDataAmount","el","_a","raw","n","readDataCurrency","readDataEventName","findBindingFromEvent","target","bindingsById","node","id","binding","resolveRevenueAmount","matchedEl","_b","_c","amount","currency","eventName","ElementBindingsController","handlers","event","hit","resolved","bindings","b","HOST_ID","ALPHANA_HOME","ALPHANA_MARK_SRC","destroyConsentBanner","_a","renderConsentBanner","config","handlers","host","shadow","dir","theme","policyLabel","poweredLabel","style","sheet","title","message","policyHref","policy","actions","rejectBtn","acceptBtn","footer","brand","brandImg","brandText","CONSENT_STORAGE_KEY","safeGet","key","safeSet","value","e","readConsent","raw","parsed","writeConsent","status","version","DEFAULT_ENDPOINT","DEFAULTS","FIRST_TOUCH_KEY","LAST_TOUCH_KEY","UTM_PARAM_MAP","CLICK_ID_PARAMS","safeLocalStorageGet","key","safeLocalStorageSet","value","e","readTouch","raw","parsed","writeTouch","hostFromReferrer","referrer","currentSearchParams","readUtmParams","searchParams","_a","utm","param","readClickIds","clickIds","withNormalizedPaths","event","normalizeTrackerPath","UserTracker","config","_e","existingVisitorId","peekVisitorId","generateSessionId","path","existingFirst","touch","attribution","_b","runtime","consentWidget","stored","readConsent","renderConsentBanner","writeConsent","bindings","ElementBindingsController","binding","amount","currency","eventName","persistVisitorId","emit","sessionId","collectClientContext","NavigationPlugin","TimePlugin","HeatmapPlugin","SessionReplayController","LogCapture","destroyConsentBanner","_c","_d","_f","authHeaders","body","buildCollectHeartbeatBody","postIngest","postIngestBeacon","prev","pts","fn","resolvedPath","payload","properties","flagKey","url","apiBaseFromEventsEndpoint","res","data","experimentKey","v","variantKey","keys","acc","k","collectUrlFromEventsEndpoint","batch","buildCollectBatchBody","events","import_react","TrackerContext","useTrackerContext","import_jsx_runtime","UserTrackerProvider","config","children","trackerRef","UserTracker","tracker","TrackerContext","import_react","useTracker","useTrackerContext","usePageView","path","tracker","useHeatmapData","refreshMs","data","setData","pendingRef","targetPath","normalizeTrackerPath","refresh","event","usePageViews","views","setViews","useTrackRevenue","payload","useTrackGoal","useTrackJourneyStep","useTimeSpent","time","setTime","useFeatureFlags","flags","setFlags","_a","unsub","useFeatureFlagEnabled","flagKey","useAbTests","variants","setVariants","useAbVariant","experimentKey","v","useIsAbVariant","variantKey"]}
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/react/provider.tsx","../../src/utils/api-base.ts","../../src/utils/collect-payload.ts","../../src/utils/session.ts","../../src/utils/normalize-tracker-path.ts","../../src/core/navigation.ts","../../src/core/time.ts","../../src/utils/throttle.ts","../../src/core/heatmap.ts","../../src/utils/compress.ts","../../src/utils/ingest-fetch.ts","../../src/core/logger.ts","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/utils.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/types/dist/types.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/mutation.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observer.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/cross-origin-iframe-mirror.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/iframe-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/tslib/tslib.es6.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/_virtual/image-bitmap-data-url-worker.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js","../../../../node_modules/.pnpm/rrweb@2.0.0-alpha.4/node_modules/rrweb/es/rrweb/packages/rrweb/src/record/index.js","../../src/core/session-replay.ts","../../src/core/client-context.ts","../../src/core/element-bindings.ts","../../src/core/consent-banner.ts","../../src/core/consent-storage.ts","../../src/tracker.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"sourcesContent":["export { UserTrackerProvider } from \"./provider\";\nexport type { UserTrackerProviderProps } from \"./provider\";\nexport {\n useTracker,\n usePageView,\n useHeatmapData,\n usePageViews,\n useTrackRevenue,\n useTrackGoal,\n useTrackJourneyStep,\n useTimeSpent,\n useFeatureFlags,\n useFeatureFlagEnabled,\n useAbTests,\n useAbVariant,\n useIsAbVariant,\n} from \"./hooks\";\n","import { useEffect, useRef, type ReactNode } from \"react\";\nimport { UserTracker } from \"../tracker\";\nimport type { TrackerConfig } from \"../types\";\nimport { TrackerContext } from \"./context\";\n\nexport interface UserTrackerProviderProps {\n /** Tracker configuration. Captured on first render — changes are ignored. */\n config?: TrackerConfig;\n children: ReactNode;\n}\n\n/**\n * Wraps your application (or a subtree) and provides a `UserTracker` instance\n * via React context.\n *\n * The tracker is created once, initialized on mount, and destroyed on unmount.\n *\n * **Next.js App Router** — mark your layout wrapper as a Client Component:\n * ```tsx\n * 'use client';\n * import { UserTrackerProvider } from 'user-tracker/react';\n * export default function RootLayout({ children }) {\n * return <UserTrackerProvider config={{ endpoint: '/api/events' }}>{children}</UserTrackerProvider>;\n * }\n * ```\n */\nexport function UserTrackerProvider({\n config = {},\n children,\n}: UserTrackerProviderProps) {\n // Create the tracker instance exactly once (lazy ref initialisation).\n const trackerRef = useRef<UserTracker | null>(null);\n if (trackerRef.current === null) {\n trackerRef.current = new UserTracker(config);\n }\n\n useEffect(() => {\n const tracker = trackerRef.current!;\n tracker.init();\n return () => tracker.destroy();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <TrackerContext.Provider value={trackerRef.current}>\n {children}\n </TrackerContext.Provider>\n );\n}\n","/** Derive API root from events endpoint, e.g. `…/api/events` → `…/api`. */\nexport function apiBaseFromEventsEndpoint(endpoint: string): string {\n return endpoint.replace(/\\/events\\/?$/, \"\");\n}\n\n/** Unified ingest URL derived from the events endpoint. */\nexport function collectUrlFromEventsEndpoint(endpoint: string): string {\n return `${apiBaseFromEventsEndpoint(endpoint)}/collect`;\n}\n","import type { LogEntry } from \"../core/logger\";\nimport type { TrackerEvent } from \"../types\";\n\nexport type CollectEnvelope = Record<string, unknown>;\n\nexport function buildCollectBatchBody(\n events: TrackerEvent[],\n ctx: { appId?: string; visitorId?: string; sessionId: string },\n): CollectEnvelope {\n return {\n ...(ctx.appId ? { appId: ctx.appId } : {}),\n visitorId: ctx.visitorId,\n events: events.map((e) => ({\n sessionId: ctx.sessionId,\n type: e.type,\n data: e.data,\n })),\n };\n}\n\nexport function buildCollectHeartbeatBody(params: {\n sessionId: string;\n visitorId?: string;\n path: string;\n active: boolean;\n appId?: string;\n}): CollectEnvelope {\n return {\n ...(params.appId ? { appId: params.appId } : {}),\n visitorId: params.visitorId,\n heartbeat: {\n sessionId: params.sessionId,\n visitorId: params.visitorId,\n path: params.path,\n active: params.active,\n ...(params.appId ? { appId: params.appId } : {}),\n },\n };\n}\n\nexport function buildCollectLogBody(entry: LogEntry): CollectEnvelope {\n return {\n ...(entry.appId ? { appId: entry.appId } : {}),\n log: entry,\n };\n}\n","const SESSION_STORAGE_KEY = \"__ut_sid__\";\nconst VISITOR_STORAGE_KEY = \"__ut_vid__\";\n\n/** Generate a RFC-4122 v4 UUID using the native crypto API with a fallback. */\nexport function generateSessionId(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n // Math.random fallback (not cryptographically secure, but sufficient for analytics)\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Retrieve the session ID from sessionStorage, or create and persist a new one.\n * Falls back to an in-memory ID when sessionStorage is unavailable (e.g. SSR).\n */\nexport function getOrCreateSessionId(): string {\n if (typeof sessionStorage === \"undefined\") return generateSessionId();\n try {\n const existing = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n const id = generateSessionId();\n sessionStorage.setItem(SESSION_STORAGE_KEY, id);\n return id;\n } catch {\n return generateSessionId();\n }\n}\n\n/**\n * Retrieve the visitor ID from localStorage (persists across sessions/tabs),\n * or create and store a new one. Returns a temporary in-memory ID when\n * localStorage is unavailable.\n */\nexport function getOrCreateVisitorId(): string {\n if (typeof localStorage === \"undefined\") return generateSessionId();\n try {\n const existing = localStorage.getItem(VISITOR_STORAGE_KEY);\n if (existing) return existing;\n const id = generateSessionId();\n localStorage.setItem(VISITOR_STORAGE_KEY, id);\n return id;\n } catch {\n return generateSessionId();\n }\n}\n\n/** Read a previously persisted visitor ID without creating one. */\nexport function peekVisitorId(): string | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n return localStorage.getItem(VISITOR_STORAGE_KEY);\n } catch {\n return null;\n }\n}\n\n/** Persist a visitor ID (used after cookie consent is granted). */\nexport function persistVisitorId(id: string): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(VISITOR_STORAGE_KEY, id);\n } catch {\n /* private mode / quota */\n }\n}\n","/**\n * Canonical URL path (+ optional query) for analytics / heatmap matching.\n *\n * Next.js `usePathname()` often returns percent-encoded segments while\n * `window.location.pathname` is decoded — without normalization the backend\n * cannot match registered heatmap pages or aggregate the same route.\n */\nexport function normalizeTrackerPath(path: string): string {\n if (!path) return path;\n const q = path.indexOf(\"?\");\n const pathname = q >= 0 ? path.slice(0, q) : path;\n const search = q >= 0 ? path.slice(q) : \"\";\n\n let out = pathname;\n for (let i = 0; i < 5; i++) {\n try {\n const dec = decodeURIComponent(out);\n if (dec === out) break;\n out = dec;\n } catch {\n break;\n }\n }\n\n let s = search;\n for (let i = 0; i < 5; i++) {\n try {\n const dec = decodeURIComponent(s);\n if (dec === s) break;\n s = dec;\n } catch {\n break;\n }\n }\n\n return out + s;\n}\n","import type { TrackerEvent } from \"../types\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\n\ntype EmitFn = (event: TrackerEvent) => void;\n\ninterface NavigationPluginOptions {\n emit: EmitFn;\n sessionId: string;\n}\n\n/** Persisted across full page loads (same tab, same origin) for MPA U-turn detection. */\nconst SS_LAST_PV_PATH = \"__ut_last_pv_path__\";\nconst SS_LAST_PV_ENTRY_MS = \"__ut_last_pv_entry_ms__\";\n\nfunction safeSessionStorageGet(key: string): string | null {\n if (typeof sessionStorage === \"undefined\") return null;\n try {\n return sessionStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSessionStorageSet(key: string, value: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n try {\n sessionStorage.setItem(key, value);\n } catch {\n /* quota / private mode */\n }\n}\n\nfunction persistLastPageView(path: string, pageEntryMs: number): void {\n safeSessionStorageSet(SS_LAST_PV_PATH, path);\n safeSessionStorageSet(SS_LAST_PV_ENTRY_MS, String(pageEntryMs));\n}\n\n/**\n * `navigate` | `reload` | `back_forward` | `prerender`, or legacy back/forward.\n */\nfunction getNavigationEntryType(): string | undefined {\n if (typeof performance === \"undefined\") return undefined;\n const list = performance.getEntriesByType(\n \"navigation\",\n ) as PerformanceNavigationTiming[];\n const nav = list[0];\n if (nav?.type) return nav.type;\n const legacy = (\n performance as unknown as { navigation?: { type?: number } }\n ).navigation;\n if (legacy?.type === 2) return \"back_forward\";\n return undefined;\n}\n\n/**\n * Tracks SPA route changes by monkey-patching history.pushState /\n * history.replaceState and listening to the popstate event.\n *\n * For every navigation it:\n * 1. Emits a `pageview` event.\n * 2. Dispatches the custom DOM event `tracker:navigate` so that other\n * plugins (TimePlugin, HeatmapPlugin) can react without having to\n * duplicate the pushState patching.\n * 3. Detects U-turns: if the user leaves a page in ≤5 s, a `uturn` event\n * is emitted with the time-on-page and destination path.\n *\n * **Multi-page sites (WordPress, etc.):** full reloads do not call\n * `pushState`. On browser Back/Forward, a new document loads; we detect\n * `PerformanceNavigationTiming.type === \"back_forward\"` and compare the\n * previous URL + entry time stored in `sessionStorage` to emit the same\n * `uturn` event as SPAs.\n *\n * Next.js App Router note:\n * The App Router manages navigation internally; use `usePageView(pathname)`\n * from `user-tracker/react` together with `usePathname()` instead.\n */\nexport class NavigationPlugin {\n private readonly emit: EmitFn;\n private readonly sessionId: string;\n private previousPath = \"\";\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private pageEntryTime = 0;\n private static readonly UTURN_THRESHOLD_MS = 5_000;\n\n constructor({ emit, sessionId }: NavigationPluginOptions) {\n this.emit = emit;\n this.sessionId = sessionId;\n }\n\n init(): void {\n const newPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n\n // MPA: user returned via history after a full page load (e.g. WordPress).\n if (getNavigationEntryType() === \"back_forward\") {\n this.tryEmitMpaHistoryTraversalUturn(newPath);\n }\n\n this.recordPageView(newPath);\n\n window.addEventListener(\"popstate\", this.handlePopState);\n\n // Patch pushState\n this.originalPushState = history.pushState.bind(history);\n const origPush = this.originalPushState;\n history.pushState = (state, title, url): void => {\n origPush(state, title, url);\n this.handleNavigation();\n };\n\n // Patch replaceState\n this.originalReplaceState = history.replaceState.bind(history);\n const origReplace = this.originalReplaceState;\n history.replaceState = (state, title, url): void => {\n origReplace(state, title, url);\n this.handleNavigation();\n };\n }\n\n destroy(): void {\n window.removeEventListener(\"popstate\", this.handlePopState);\n if (this.originalPushState) history.pushState = this.originalPushState;\n if (this.originalReplaceState)\n history.replaceState = this.originalReplaceState;\n }\n\n // Arrow property → always bound to `this`, safe to use as event listener.\n private handlePopState = (): void => {\n this.handleNavigation();\n };\n\n /**\n * After a full navigation away from `lastPath`, sessionStorage still holds\n * that page's path and entry time. If this load is a history traversal to a\n * *different* URL and dwell time on the previous page was ≤ threshold, emit\n * `uturn` (same semantics as SPA `handleNavigation`).\n */\n private tryEmitMpaHistoryTraversalUturn(newPath: string): void {\n const lastPath = safeSessionStorageGet(SS_LAST_PV_PATH);\n const lastMsRaw = safeSessionStorageGet(SS_LAST_PV_ENTRY_MS);\n const lastEntryMs = lastMsRaw ? Number(lastMsRaw) : 0;\n if (!lastPath || !Number.isFinite(lastEntryMs) || lastEntryMs <= 0) return;\n if (normalizeTrackerPath(lastPath) === newPath) return;\n\n const timeOnPage = Date.now() - lastEntryMs;\n if (timeOnPage < 0 || timeOnPage > NavigationPlugin.UTURN_THRESHOLD_MS)\n return;\n\n this.emitUturn(normalizeTrackerPath(lastPath), newPath, timeOnPage);\n }\n\n private handleNavigation(): void {\n const newPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n if (newPath === this.previousPath) return; // hash-only or duplicate call\n\n // U-turn detection: user left the previous page very quickly.\n if (this.previousPath && this.pageEntryTime > 0) {\n const timeOnPage = Date.now() - this.pageEntryTime;\n if (timeOnPage <= NavigationPlugin.UTURN_THRESHOLD_MS) {\n this.emitUturn(this.previousPath, newPath, timeOnPage);\n }\n }\n\n this.recordPageView(newPath);\n }\n\n private emitUturn(\n fromPath: string,\n toPath: string,\n timeOnPageMs: number,\n ): void {\n this.emit({\n type: \"uturn\",\n data: {\n fromPath,\n toPath,\n timeOnPageMs,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n },\n });\n }\n\n private recordPageView(path: string): void {\n const p = normalizeTrackerPath(path);\n this.previousPath = p;\n this.pageEntryTime = Date.now();\n\n persistLastPageView(p, this.pageEntryTime);\n\n this.emit({\n type: \"pageview\",\n data: {\n path: p,\n title: document.title,\n timestamp: Date.now(),\n sessionId: this.sessionId,\n referrer: document.referrer || undefined,\n },\n });\n\n // Notify other plugins via a custom DOM event (synchronous dispatch).\n window.dispatchEvent(\n new CustomEvent(\"tracker:navigate\", {\n detail: { path: p, title: document.title },\n }),\n );\n }\n}\n","import type { TrackerEvent } from \"../types\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\n\ntype EmitFn = (event: TrackerEvent) => void;\n\ninterface TimePluginOptions {\n emit: EmitFn;\n sessionId: string;\n}\n\n/**\n * Tracks the time a user spends on each page.\n *\n * - Starts a timer when the page becomes active (init / tab focus).\n * - Stops and emits a `timespent` event when:\n * • The user navigates away (tracker:navigate)\n * • The tab is hidden (visibilitychange)\n * • The page is unloading (beforeunload / pagehide)\n * - Resumes timing when the tab becomes visible again.\n */\nexport class TimePlugin {\n private readonly emit: EmitFn;\n private readonly sessionId: string;\n private currentPath = \"\";\n private startTime = 0;\n private tracking = false;\n\n constructor({ emit, sessionId }: TimePluginOptions) {\n this.emit = emit;\n this.sessionId = sessionId;\n }\n\n init(): void {\n this.currentPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n this.startTracking();\n\n window.addEventListener(\"tracker:navigate\", this.handleNavigate);\n document.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n window.addEventListener(\"beforeunload\", this.handleUnload);\n window.addEventListener(\"pagehide\", this.handleUnload);\n }\n\n destroy(): void {\n this.stopTracking();\n window.removeEventListener(\"tracker:navigate\", this.handleNavigate);\n document.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n window.removeEventListener(\"beforeunload\", this.handleUnload);\n window.removeEventListener(\"pagehide\", this.handleUnload);\n }\n\n private startTracking(): void {\n this.startTime = Date.now();\n this.tracking = true;\n }\n\n private stopTracking(): void {\n if (!this.tracking || !this.currentPath) return;\n const duration = Date.now() - this.startTime;\n if (duration < 100) {\n this.tracking = false;\n return; // Ignore sub-100 ms blips (e.g. rapid navigations).\n }\n this.emit({\n type: \"timespent\",\n data: {\n path: this.currentPath,\n duration,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n },\n });\n this.tracking = false;\n }\n\n private handleNavigate = (e: CustomEvent<{ path: string }>): void => {\n this.stopTracking();\n this.currentPath = normalizeTrackerPath(e.detail.path);\n this.startTracking();\n };\n\n private handleVisibilityChange = (): void => {\n if (document.hidden) {\n this.stopTracking();\n } else {\n this.startTracking();\n }\n };\n\n private handleUnload = (): void => {\n this.stopTracking();\n };\n}\n","/**\n * Returns a function that invokes `fn` at most once every `delay` ms.\n * The first call in a new window is executed immediately.\n */\nexport function throttle<Args extends unknown[]>(\n fn: (...args: Args) => void,\n delay: number,\n): (...args: Args) => void {\n let lastCall = 0;\n return (...args: Args): void => {\n const now = Date.now();\n if (now - lastCall >= delay) {\n lastCall = now;\n fn(...args);\n }\n };\n}\n","import type { TrackerEvent, HeatmapPoint } from \"../types\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\nimport { throttle } from \"../utils/throttle\";\n\ntype EmitFn = (event: TrackerEvent) => void;\n\n/**\n * Elements we anchor clicks to. MUST stay in sync with the backend screenshot\n * rect-map collector so a click's selector resolves to a captured rect.\n */\nconst ANCHOR_SELECTOR =\n \"a,button,input,select,textarea,label,summary,img,\" +\n \"[role],[onclick],[data-track-label],[data-test-target],[id],\" +\n \"h1,h2,h3,h4,h5,h6\";\n\nconst SELECTOR_ID_RE = /^[A-Za-z][\\w-]*$/;\n\n/**\n * Build a stable CSS selector for `el`. MUST produce the same string as the\n * backend's `collectElementRects` so element-relative clicks line up.\n */\nfunction buildSelector(el: Element | null): string {\n if (!el || el.nodeType !== 1) return \"\";\n const elId = (el as HTMLElement).id;\n if (elId && SELECTOR_ID_RE.test(elId)) return \"#\" + elId;\n const parts: string[] = [];\n let node: Element | null = el;\n let depth = 0;\n while (node && node.nodeType === 1 && node !== document.body && depth < 5) {\n const nid = (node as HTMLElement).id;\n if (nid && SELECTOR_ID_RE.test(nid)) {\n parts.unshift(\"#\" + nid);\n break;\n }\n const tag = node.tagName.toLowerCase();\n let nth = 1;\n let sib = node.previousElementSibling;\n while (sib) {\n if (sib.tagName === node.tagName) nth++;\n sib = sib.previousElementSibling;\n }\n parts.unshift(tag + \":nth-of-type(\" + nth + \")\");\n node = node.parentElement;\n depth++;\n }\n return parts.join(\">\");\n}\n\ninterface AnchorInfo {\n selector?: string;\n relX?: number;\n relY?: number;\n}\n\n/**\n * Resolve the nearest anchorable element for a click and the click position as\n * a fraction (0–1) inside that element's box. Returns empty when no suitable\n * element is found (renderer then falls back to page percentages).\n */\nfunction getClickAnchor(\n target: EventTarget | null,\n clientX: number,\n clientY: number,\n): AnchorInfo {\n const el = target instanceof Element ? target : null;\n if (!el) return {};\n const anchor = el.closest(ANCHOR_SELECTOR);\n if (!anchor) return {};\n const selector = buildSelector(anchor);\n if (!selector) return {};\n const rect = anchor.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return { selector };\n const relX = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width));\n const relY = Math.min(1, Math.max(0, (clientY - rect.top) / rect.height));\n return {\n selector,\n relX: Math.round(relX * 1000) / 1000,\n relY: Math.round(relY * 1000) / 1000,\n };\n}\n\ninterface HeatmapPluginOptions {\n emit: EmitFn;\n sessionId: string;\n /** Fraction of mousemove / scroll events to sample (0–1). Default: 0.3 */\n sampleRate?: number;\n /** Maximum points stored per page before recording stops. Default: 2000 */\n maxPoints?: number;\n /**\n * If provided, heatmap data will only be collected for paths in this list.\n * Normally omit this — register pages in the dashboard instead; the backend\n * drops points for unregistered paths.\n */\n allowedPaths?: string[];\n}\n\n/**\n * Collects mouse-move, click, and scroll positions for heatmap analysis.\n *\n * Also detects rage clicks (≥3 clicks within 1 s in a 50 px radius) and emits\n * a `rageclik` event so the backend can surface problematic UI hotspots.\n *\n * Click events include an optional `target` field containing a human-readable\n * label for the clicked element (aria-label › id › button/link text).\n */\nexport class HeatmapPlugin {\n private readonly emit: EmitFn;\n private readonly sessionId: string;\n private readonly sampleRate: number;\n private readonly maxPoints: number;\n private readonly allowedPaths: Set<string> | null;\n private currentPath = \"\";\n private pointCounts: Record<string, number> = {};\n /** Deepest scroll reach (% of page height) recorded per path this session. */\n private maxScrollDepth: Record<string, number> = {};\n\n // Rage-click detection state\n private recentClicks: { x: number; y: number; t: number }[] = [];\n private static readonly RAGE_THRESHOLD = 3;\n private static readonly RAGE_WINDOW_MS = 1_000;\n private static readonly RAGE_RADIUS_PX = 50;\n\n private readonly throttledMouseMove: (e: MouseEvent) => void;\n private readonly throttledScroll: () => void;\n\n constructor({\n emit,\n sessionId,\n sampleRate = 0.3,\n maxPoints = 2000,\n allowedPaths,\n }: HeatmapPluginOptions) {\n this.emit = emit;\n this.sessionId = sessionId;\n this.sampleRate = sampleRate;\n this.maxPoints = maxPoints;\n this.allowedPaths =\n allowedPaths && allowedPaths.length > 0\n ? new Set(allowedPaths.map((p) => normalizeTrackerPath(p)))\n : null;\n\n this.throttledMouseMove = throttle(this.handleMouseMove, 50);\n this.throttledScroll = throttle(this.handleScroll, 100);\n }\n\n init(): void {\n this.currentPath = normalizeTrackerPath(\n window.location.pathname + window.location.search,\n );\n\n document.addEventListener(\"mousemove\", this.throttledMouseMove);\n document.addEventListener(\"click\", this.handleClick);\n document.addEventListener(\"touchend\", this.handleTouchEnd, {\n passive: true,\n });\n window.addEventListener(\"scroll\", this.throttledScroll, { passive: true });\n window.addEventListener(\"tracker:navigate\", this.handleNavigate);\n }\n\n destroy(): void {\n document.removeEventListener(\"mousemove\", this.throttledMouseMove);\n document.removeEventListener(\"click\", this.handleClick);\n document.removeEventListener(\"touchend\", this.handleTouchEnd);\n window.removeEventListener(\"scroll\", this.throttledScroll);\n window.removeEventListener(\"tracker:navigate\", this.handleNavigate);\n }\n\n private canRecord(): boolean {\n if (\n this.allowedPaths !== null &&\n !this.allowedPaths.has(this.currentPath)\n ) {\n return false;\n }\n return (this.pointCounts[this.currentPath] ?? 0) < this.maxPoints;\n }\n\n private recordPoint(\n point: Omit<HeatmapPoint, \"path\" | \"timestamp\" | \"sessionId\">,\n ): void {\n if (!this.canRecord()) return;\n this.pointCounts[this.currentPath] =\n (this.pointCounts[this.currentPath] ?? 0) + 1;\n this.emit({\n type: \"heatmap\",\n data: {\n ...point,\n path: this.currentPath,\n timestamp: Date.now(),\n },\n });\n }\n\n /** Extract a human-readable label for the clicked element. */\n private getClickTarget(e: MouseEvent): string | undefined {\n const el = e.target as HTMLElement | null;\n if (!el) return undefined;\n const label =\n el.getAttribute(\"aria-label\") ||\n el.closest(\"[aria-label]\")?.getAttribute(\"aria-label\") ||\n el.getAttribute(\"data-track-label\") ||\n el.getAttribute(\"id\") ||\n (el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement\n ? el.innerText?.trim().slice(0, 60)\n : el.closest(\"button, a\")?.textContent?.trim().slice(0, 60));\n return label || undefined;\n }\n\n /** Detect rage-click bursts and emit a `rageclik` event when found. */\n private checkRageClick(x: number, y: number, path: string): void {\n const now = Date.now();\n this.recentClicks = this.recentClicks.filter(\n (c) => now - c.t < HeatmapPlugin.RAGE_WINDOW_MS,\n );\n this.recentClicks.push({ x, y, t: now });\n\n const nearby = this.recentClicks.filter(\n (c) => Math.hypot(c.x - x, c.y - y) <= HeatmapPlugin.RAGE_RADIUS_PX,\n );\n\n if (nearby.length >= HeatmapPlugin.RAGE_THRESHOLD) {\n this.emit({\n type: \"rageclik\",\n data: {\n path,\n x,\n y,\n count: nearby.length,\n timestamp: now,\n sessionId: this.sessionId,\n },\n });\n // Reset to avoid continuously re-triggering in the same burst.\n this.recentClicks = [];\n }\n }\n\n private handleMouseMove = (e: MouseEvent): void => {\n if (Math.random() > this.sampleRate) return;\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const absY = e.clientY + window.scrollY;\n this.recordPoint({\n x: e.clientX,\n y: absY,\n xPct: pageWidth > 0 ? (e.clientX / pageWidth) * 100 : 0,\n yPct: pageHeight > 0 ? (absY / pageHeight) * 100 : 0,\n pw: pageWidth,\n ph: pageHeight,\n vw: window.innerWidth,\n type: \"move\",\n });\n };\n\n private handleClick = (e: MouseEvent): void => {\n // Skip if a touchend already recorded this tap (within 500 ms)\n if (Date.now() - this.lastTouchTime < 500) return;\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const absY = e.clientY + window.scrollY;\n const target = this.getClickTarget(e);\n const anchor = getClickAnchor(e.target, e.clientX, e.clientY);\n this.recordPoint({\n x: e.clientX,\n y: absY,\n xPct: pageWidth > 0 ? (e.clientX / pageWidth) * 100 : 0,\n yPct: pageHeight > 0 ? (absY / pageHeight) * 100 : 0,\n pw: pageWidth,\n ph: pageHeight,\n vw: window.innerWidth,\n type: \"click\",\n ...(target ? { target } : {}),\n ...anchor,\n });\n this.checkRageClick(e.clientX, absY, this.currentPath);\n };\n\n /**\n * Records taps on touch devices.\n * Mobile browsers do fire a synthetic `click` after `touchend`, but some\n * frameworks call `preventDefault()` on touch events which suppresses it.\n * Listening to `touchend` directly ensures taps are always captured.\n * We mark the point with a short-lived flag so the subsequent synthetic\n * `click` event (if it fires) is deduplicated.\n */\n private lastTouchTime = 0;\n\n private handleTouchEnd = (e: TouchEvent): void => {\n const touch = e.changedTouches[0];\n if (!touch) return;\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const absY = touch.clientY + window.scrollY;\n this.lastTouchTime = Date.now();\n const anchor = getClickAnchor(e.target, touch.clientX, touch.clientY);\n this.recordPoint({\n x: touch.clientX,\n y: absY,\n xPct: pageWidth > 0 ? (touch.clientX / pageWidth) * 100 : 0,\n yPct: pageHeight > 0 ? (absY / pageHeight) * 100 : 0,\n pw: pageWidth,\n ph: pageHeight,\n vw: window.innerWidth,\n type: \"click\",\n ...anchor,\n });\n this.checkRageClick(touch.clientX, absY, this.currentPath);\n };\n\n private handleScroll = (): void => {\n const pageWidth = document.documentElement.scrollWidth;\n const pageHeight = document.documentElement.scrollHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n // Reach = how far the BOTTOM of the viewport got, as % of page height. The\n // per-session max of this drives the scroll-depth (\"reach\") heatmap.\n const reachedY = Math.min(pageHeight, scrollY + vh);\n const reachedPct = pageHeight > 0 ? (reachedY / pageHeight) * 100 : 0;\n const prevMax = this.maxScrollDepth[this.currentPath] ?? 0;\n const isNewMax = reachedPct > prevMax + 1;\n if (isNewMax) this.maxScrollDepth[this.currentPath] = reachedPct;\n // Sample to limit volume, but ALWAYS record a freshly reached max depth so\n // the reach curve captures the true deepest point each visitor saw.\n if (!isNewMax && Math.random() > this.sampleRate) return;\n const absX = scrollX + vw / 2;\n this.recordPoint({\n x: vw / 2,\n y: reachedY,\n xPct: pageWidth > 0 ? (absX / pageWidth) * 100 : 50,\n yPct: reachedPct,\n pw: pageWidth,\n ph: pageHeight,\n vw,\n type: \"scroll\",\n });\n };\n\n private handleNavigate = (e: CustomEvent<{ path: string }>): void => {\n this.currentPath = normalizeTrackerPath(e.detail.path);\n };\n}\n","export const ALPHANA_GZIP_MEDIA_TYPE = \"application/x-alphana-gzip\";\n\nexport function isCompressionSupported(): boolean {\n return typeof CompressionStream !== \"undefined\";\n}\n\n/** Gzip-compress a UTF-8 JSON string. Returns null when unsupported or on failure. */\nexport async function compressUtf8(json: string): Promise<Uint8Array | null> {\n if (!isCompressionSupported()) return null;\n\n try {\n const encoded = new TextEncoder().encode(json);\n const stream = new Blob([encoded])\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n } catch {\n return null;\n }\n}\n","import { ALPHANA_GZIP_MEDIA_TYPE, compressUtf8 } from \"./compress\";\n\nconst DEFAULT_THRESHOLD_BYTES = 1024;\n\nexport type IngestFetchOptions = {\n compressPayloads?: boolean;\n compressionThresholdBytes?: number;\n keepalive?: boolean;\n authHeaders?: Record<string, string>;\n};\n\ntype PreparedIngestBody =\n | { codec: \"json\"; body: string; contentType: \"application/json\" }\n | {\n codec: \"gzip\";\n body: Uint8Array;\n contentType: typeof ALPHANA_GZIP_MEDIA_TYPE;\n };\n\nasync function prepareIngestBody(\n jsonBody: string,\n options: IngestFetchOptions,\n forceJson = false,\n): Promise<PreparedIngestBody> {\n const threshold =\n options.compressionThresholdBytes ?? DEFAULT_THRESHOLD_BYTES;\n const shouldCompress =\n !forceJson &&\n options.compressPayloads !== false &&\n jsonBody.length >= threshold;\n\n if (shouldCompress) {\n const compressed = await compressUtf8(jsonBody);\n if (compressed) {\n return {\n codec: \"gzip\",\n body: compressed,\n contentType: ALPHANA_GZIP_MEDIA_TYPE,\n };\n }\n }\n\n return {\n codec: \"json\",\n body: jsonBody,\n contentType: \"application/json\",\n };\n}\n\nasync function sendPreparedIngest(\n url: string,\n prepared: PreparedIngestBody,\n options: IngestFetchOptions,\n): Promise<Response> {\n const headers: Record<string, string> = {\n \"Content-Type\": prepared.contentType,\n ...(prepared.codec === \"gzip\"\n ? { Accept: ALPHANA_GZIP_MEDIA_TYPE }\n : {}),\n ...(options.authHeaders ?? {}),\n };\n\n return fetch(url, {\n method: \"POST\",\n headers,\n body: prepared.body as BodyInit,\n keepalive: options.keepalive ?? false,\n });\n}\n\n/**\n * POST an ingest payload, optionally gzip-compressed.\n * Retries once as JSON when the server rejects gzip (415/400).\n * Errors are swallowed — analytics must never surface to end users.\n */\nexport async function postIngest(\n url: string,\n jsonBody: string,\n options: IngestFetchOptions = {},\n): Promise<void> {\n try {\n const prepared = await prepareIngestBody(jsonBody, options);\n let response = await sendPreparedIngest(url, prepared, options);\n\n if (\n prepared.codec === \"gzip\" &&\n (response.status === 415 || response.status === 400)\n ) {\n const fallback = await prepareIngestBody(jsonBody, options, true);\n response = await sendPreparedIngest(url, fallback, options);\n }\n } catch {\n // Intentionally silent.\n }\n}\n\n/**\n * Best-effort unload flush. Large/compressible payloads use keepalive fetch;\n * small unauthenticated payloads may still use sendBeacon with JSON.\n */\nexport function postIngestBeacon(\n url: string,\n jsonBody: string,\n options: IngestFetchOptions = {},\n): void {\n const threshold =\n options.compressionThresholdBytes ?? DEFAULT_THRESHOLD_BYTES;\n const wantsCompression =\n options.compressPayloads !== false && jsonBody.length >= threshold;\n\n if (wantsCompression || Object.keys(options.authHeaders ?? {}).length > 0) {\n void postIngest(url, jsonBody, { ...options, keepalive: true });\n return;\n }\n\n if (typeof navigator !== \"undefined\" && navigator.sendBeacon) {\n const blob = new Blob([jsonBody], { type: \"application/json\" });\n const accepted = navigator.sendBeacon(url, blob);\n if (accepted) return;\n }\n\n void postIngest(url, jsonBody, { ...options, keepalive: true });\n}\n","import { collectUrlFromEventsEndpoint } from \"../utils/api-base\";\nimport { buildCollectLogBody } from \"../utils/collect-payload\";\nimport { postIngest } from \"../utils/ingest-fetch\";\n\nexport type LogLevel = \"info\" | \"warn\" | \"error\";\n\nexport interface LogEntry {\n sessionId?: string;\n appId?: string;\n level: LogLevel;\n message: string;\n url?: string;\n stack?: string;\n meta?: Record<string, unknown>;\n timestamp: number;\n}\n\ntype ConsoleFn = (...args: unknown[]) => void;\n\n/**\n * Automatically captures console.info/warn/error output and unhandled errors,\n * then ships them to the unified `/api/collect` ingest endpoint.\n *\n * All console methods are restored exactly in `destroy()`.\n */\nexport class LogCapture {\n private readonly collectUrl: string;\n private readonly sessionId: string;\n private readonly appId?: string;\n private readonly authHeaders: Record<string, string>;\n private readonly compressPayloads: boolean;\n private readonly compressionThresholdBytes: number;\n\n // Original console methods preserved so we can restore them.\n private origInfo!: ConsoleFn;\n private origWarn!: ConsoleFn;\n private origError!: ConsoleFn;\n\n private prevOnError: OnErrorEventHandler = null;\n private prevOnUnhandledRejection:\n | ((e: PromiseRejectionEvent) => void)\n | null = null;\n\n private initialized = false;\n\n constructor(options: {\n endpoint: string;\n collectEndpoint?: string;\n sessionId: string;\n secretKey?: string;\n appId?: string;\n compressPayloads?: boolean;\n compressionThresholdBytes?: number;\n }) {\n this.collectUrl =\n options.collectEndpoint ??\n collectUrlFromEventsEndpoint(options.endpoint);\n this.sessionId = options.sessionId;\n this.appId = options.appId;\n this.authHeaders = options.secretKey\n ? { Authorization: `Bearer ${options.secretKey}` }\n : {};\n this.compressPayloads = options.compressPayloads ?? true;\n this.compressionThresholdBytes = options.compressionThresholdBytes ?? 1024;\n }\n\n init(): void {\n if (typeof window === \"undefined\" || this.initialized) return;\n\n this.origInfo = console.info.bind(console);\n this.origWarn = console.warn.bind(console);\n this.origError = console.error.bind(console);\n\n console.info = (...args: unknown[]) => {\n this.origInfo(...args);\n this.send(\"info\", this.format(args));\n };\n\n console.warn = (...args: unknown[]) => {\n this.origWarn(...args);\n this.send(\"warn\", this.format(args));\n };\n\n console.error = (...args: unknown[]) => {\n this.origError(...args);\n const [first] = args;\n const stack = first instanceof Error ? first.stack : undefined;\n this.send(\"error\", this.format(args), { stack });\n };\n\n this.prevOnError = window.onerror;\n window.onerror = (msg, src, line, col, err) => {\n this.send(\"error\", String(msg), {\n stack: err?.stack,\n meta: { src, line, col },\n });\n if (typeof this.prevOnError === \"function\") {\n return this.prevOnError(msg, src, line, col, err);\n }\n return false;\n };\n\n this.prevOnUnhandledRejection = (e: PromiseRejectionEvent) => {\n const reason = e.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : String(reason ?? \"Unhandled promise rejection\");\n this.send(\"error\", message, {\n stack: reason instanceof Error ? reason.stack : undefined,\n });\n };\n window.addEventListener(\n \"unhandledrejection\",\n this.prevOnUnhandledRejection,\n );\n\n this.initialized = true;\n }\n\n destroy(): void {\n if (!this.initialized) return;\n console.info = this.origInfo;\n console.warn = this.origWarn;\n console.error = this.origError;\n\n window.onerror = this.prevOnError;\n if (this.prevOnUnhandledRejection) {\n window.removeEventListener(\n \"unhandledrejection\",\n this.prevOnUnhandledRejection,\n );\n }\n this.initialized = false;\n }\n\n /** Manually capture a log entry (e.g. from try/catch). */\n capture(\n level: LogLevel,\n message: string,\n extra?: { stack?: string; meta?: Record<string, unknown> },\n ): void {\n this.send(level, message, extra);\n }\n\n private format(args: unknown[]): string {\n return args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === \"object\") {\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n }\n return String(a);\n })\n .join(\" \");\n }\n\n private send(\n level: LogLevel,\n message: string,\n extra?: { stack?: string; meta?: Record<string, unknown> },\n ): void {\n const entry: LogEntry = {\n sessionId: this.sessionId,\n ...(this.appId ? { appId: this.appId } : {}),\n level,\n message,\n url: typeof window !== \"undefined\" ? window.location.href : undefined,\n stack: extra?.stack,\n meta: extra?.meta,\n timestamp: Date.now(),\n };\n const body = JSON.stringify(buildCollectLogBody(entry));\n\n void postIngest(this.collectUrl, body, {\n compressPayloads: this.compressPayloads,\n compressionThresholdBytes: this.compressionThresholdBytes,\n authHeaders: this.authHeaders,\n keepalive: true,\n }).catch((err: unknown) => {\n if (this.origError) {\n this.origError(\"[user-tracker] Failed to send log:\", err);\n }\n });\n }\n}\n","var NodeType;\r\n(function (NodeType) {\r\n NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n var host = n === null || n === void 0 ? void 0 : n.host;\r\n return Boolean((host === null || host === void 0 ? void 0 : host.shadowRoot) === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n if (cssText.includes(' background-clip: text;') &&\r\n !cssText.includes(' -webkit-background-clip: text;')) {\r\n cssText = cssText.replace(' background-clip: text;', ' -webkit-background-clip: text; background-clip: text;');\r\n }\r\n return cssText;\r\n}\r\nfunction getCssRulesString(s) {\r\n try {\r\n var rules = s.rules || s.cssRules;\r\n return rules\r\n ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules).map(getCssRuleString).join(''))\r\n : null;\r\n }\r\n catch (error) {\r\n return null;\r\n }\r\n}\r\nfunction getCssRuleString(rule) {\r\n var cssStringified = rule.cssText;\r\n if (isCSSImportRule(rule)) {\r\n try {\r\n cssStringified = getCssRulesString(rule.styleSheet) || cssStringified;\r\n }\r\n catch (_a) {\r\n }\r\n }\r\n return cssStringified;\r\n}\r\nfunction isCSSImportRule(rule) {\r\n return 'styleSheet' in rule;\r\n}\r\nvar Mirror = (function () {\r\n function Mirror() {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n }\r\n Mirror.prototype.getId = function (n) {\r\n var _a;\r\n if (!n)\r\n return -1;\r\n var id = (_a = this.getMeta(n)) === null || _a === void 0 ? void 0 : _a.id;\r\n return id !== null && id !== void 0 ? id : -1;\r\n };\r\n Mirror.prototype.getNode = function (id) {\r\n return this.idNodeMap.get(id) || null;\r\n };\r\n Mirror.prototype.getIds = function () {\r\n return Array.from(this.idNodeMap.keys());\r\n };\r\n Mirror.prototype.getMeta = function (n) {\r\n return this.nodeMetaMap.get(n) || null;\r\n };\r\n Mirror.prototype.removeNodeFromMap = function (n) {\r\n var _this = this;\r\n var id = this.getId(n);\r\n this.idNodeMap[\"delete\"](id);\r\n if (n.childNodes) {\r\n n.childNodes.forEach(function (childNode) {\r\n return _this.removeNodeFromMap(childNode);\r\n });\r\n }\r\n };\r\n Mirror.prototype.has = function (id) {\r\n return this.idNodeMap.has(id);\r\n };\r\n Mirror.prototype.hasNode = function (node) {\r\n return this.nodeMetaMap.has(node);\r\n };\r\n Mirror.prototype.add = function (n, meta) {\r\n var id = meta.id;\r\n this.idNodeMap.set(id, n);\r\n this.nodeMetaMap.set(n, meta);\r\n };\r\n Mirror.prototype.replace = function (id, n) {\r\n var oldNode = this.getNode(id);\r\n if (oldNode) {\r\n var meta = this.nodeMetaMap.get(oldNode);\r\n if (meta)\r\n this.nodeMetaMap.set(n, meta);\r\n }\r\n this.idNodeMap.set(id, n);\r\n };\r\n Mirror.prototype.reset = function () {\r\n this.idNodeMap = new Map();\r\n this.nodeMetaMap = new WeakMap();\r\n };\r\n return Mirror;\r\n}());\r\nfunction createMirror() {\r\n return new Mirror();\r\n}\r\nfunction maskInputValue(_a) {\r\n var maskInputOptions = _a.maskInputOptions, tagName = _a.tagName, type = _a.type, value = _a.value, maskInputFn = _a.maskInputFn;\r\n var text = value || '';\r\n if (maskInputOptions[tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n if (maskInputFn) {\r\n text = maskInputFn(text);\r\n }\r\n else {\r\n text = '*'.repeat(text.length);\r\n }\r\n }\r\n return text;\r\n}\r\nvar ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n var ctx = canvas.getContext('2d');\r\n if (!ctx)\r\n return true;\r\n var chunkSize = 50;\r\n for (var x = 0; x < canvas.width; x += chunkSize) {\r\n for (var y = 0; y < canvas.height; y += chunkSize) {\r\n var getImageData = ctx.getImageData;\r\n var originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n : getImageData;\r\n var pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n if (pixelBuffer.some(function (pixel) { return pixel !== 0; }))\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\n\nvar _id = 1;\r\nvar tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nvar IGNORED_NODE = -2;\r\nfunction genId() {\r\n return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n if (element instanceof HTMLFormElement) {\r\n return 'form';\r\n }\r\n var processedTagName = element.tagName.toLowerCase().trim();\r\n if (tagNameRegex.test(processedTagName)) {\r\n return 'div';\r\n }\r\n return processedTagName;\r\n}\r\nfunction stringifyStyleSheet(sheet) {\r\n return sheet.cssRules\r\n ? Array.from(sheet.cssRules)\r\n .map(function (rule) { return rule.cssText || ''; })\r\n .join('')\r\n : '';\r\n}\r\nfunction extractOrigin(url) {\r\n var origin = '';\r\n if (url.indexOf('//') > -1) {\r\n origin = url.split('/').slice(0, 3).join('/');\r\n }\r\n else {\r\n origin = url.split('/')[0];\r\n }\r\n origin = origin.split('?')[0];\r\n return origin;\r\n}\r\nvar canvasService;\r\nvar canvasCtx;\r\nvar URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nvar RELATIVE_PATH = /^(?!www\\.|(?:http|ftp)s?:\\/\\/|[A-Za-z]:\\\\|\\/\\/|#).*/;\r\nvar DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n return (cssText || '').replace(URL_IN_CSS_REF, function (origin, quote1, path1, quote2, path2, path3) {\r\n var filePath = path1 || path2 || path3;\r\n var maybeQuote = quote1 || quote2 || '';\r\n if (!filePath) {\r\n return origin;\r\n }\r\n if (!RELATIVE_PATH.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (DATA_URI.test(filePath)) {\r\n return \"url(\".concat(maybeQuote).concat(filePath).concat(maybeQuote, \")\");\r\n }\r\n if (filePath[0] === '/') {\r\n return \"url(\".concat(maybeQuote).concat(extractOrigin(href) + filePath).concat(maybeQuote, \")\");\r\n }\r\n var stack = href.split('/');\r\n var parts = filePath.split('/');\r\n stack.pop();\r\n for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {\r\n var part = parts_1[_i];\r\n if (part === '.') {\r\n continue;\r\n }\r\n else if (part === '..') {\r\n stack.pop();\r\n }\r\n else {\r\n stack.push(part);\r\n }\r\n }\r\n return \"url(\".concat(maybeQuote).concat(stack.join('/')).concat(maybeQuote, \")\");\r\n });\r\n}\r\nvar SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nvar SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n if (attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var pos = 0;\r\n function collectCharacters(regEx) {\r\n var chars;\r\n var match = regEx.exec(attributeValue.substring(pos));\r\n if (match) {\r\n chars = match[0];\r\n pos += chars.length;\r\n return chars;\r\n }\r\n return '';\r\n }\r\n var output = [];\r\n while (true) {\r\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n if (pos >= attributeValue.length) {\r\n break;\r\n }\r\n var url = collectCharacters(SRCSET_NOT_SPACES);\r\n if (url.slice(-1) === ',') {\r\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n output.push(url);\r\n }\r\n else {\r\n var descriptorsStr = '';\r\n url = absoluteToDoc(doc, url);\r\n var inParens = false;\r\n while (true) {\r\n var c = attributeValue.charAt(pos);\r\n if (c === '') {\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (!inParens) {\r\n if (c === ',') {\r\n pos += 1;\r\n output.push((url + descriptorsStr).trim());\r\n break;\r\n }\r\n else if (c === '(') {\r\n inParens = true;\r\n }\r\n }\r\n else {\r\n if (c === ')') {\r\n inParens = false;\r\n }\r\n }\r\n descriptorsStr += c;\r\n pos += 1;\r\n }\r\n }\r\n }\r\n return output.join(', ');\r\n}\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n if (!attributeValue || attributeValue.trim() === '') {\r\n return attributeValue;\r\n }\r\n var a = doc.createElement('a');\r\n a.href = attributeValue;\r\n return a.href;\r\n}\r\nfunction isSVGElement(el) {\r\n return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref() {\r\n var a = document.createElement('a');\r\n a.href = '';\r\n return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value) {\r\n if (name === 'src' ||\r\n (name === 'href' && value && !(tagName === 'use' && value[0] === '#'))) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'xlink:href' && value && value[0] !== '#') {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'background' &&\r\n value &&\r\n (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else if (name === 'srcset' && value) {\r\n return getAbsoluteSrcsetString(doc, value);\r\n }\r\n else if (name === 'style' && value) {\r\n return absoluteToStylesheet(value, getHref());\r\n }\r\n else if (tagName === 'object' && name === 'data' && value) {\r\n return absoluteToDoc(doc, value);\r\n }\r\n else {\r\n return value;\r\n }\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector) {\r\n if (typeof blockClass === 'string') {\r\n if (element.classList.contains(blockClass)) {\r\n return true;\r\n }\r\n }\r\n else {\r\n for (var eIndex = element.classList.length; eIndex--;) {\r\n var className = element.classList[eIndex];\r\n if (blockClass.test(className)) {\r\n return true;\r\n }\r\n }\r\n }\r\n if (blockSelector) {\r\n return element.matches(blockSelector);\r\n }\r\n return false;\r\n}\r\nfunction classMatchesRegex(node, regex, checkAncestors) {\r\n if (!node)\r\n return false;\r\n if (node.nodeType !== node.ELEMENT_NODE) {\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n }\r\n for (var eIndex = node.classList.length; eIndex--;) {\r\n var className = node.classList[eIndex];\r\n if (regex.test(className)) {\r\n return true;\r\n }\r\n }\r\n if (!checkAncestors)\r\n return false;\r\n return classMatchesRegex(node.parentNode, regex, checkAncestors);\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector) {\r\n var el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (el === null)\r\n return false;\r\n if (typeof maskTextClass === 'string') {\r\n if (el.classList.contains(maskTextClass))\r\n return true;\r\n if (el.closest(\".\".concat(maskTextClass)))\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, maskTextClass, true))\r\n return true;\r\n }\r\n if (maskTextSelector) {\r\n if (el.matches(maskTextSelector))\r\n return true;\r\n if (el.closest(maskTextSelector))\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n var win = iframeEl.contentWindow;\r\n if (!win) {\r\n return;\r\n }\r\n var fired = false;\r\n var readyState;\r\n try {\r\n readyState = win.document.readyState;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (readyState !== 'complete') {\r\n var timer_1 = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, iframeLoadTimeout);\r\n iframeEl.addEventListener('load', function () {\r\n clearTimeout(timer_1);\r\n fired = true;\r\n listener();\r\n });\r\n return;\r\n }\r\n var blankUrl = 'about:blank';\r\n if (win.location.href !== blankUrl ||\r\n iframeEl.src === blankUrl ||\r\n iframeEl.src === '') {\r\n setTimeout(listener, 0);\r\n return iframeEl.addEventListener('load', listener);\r\n }\r\n iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n var fired = false;\r\n var styleSheetLoaded;\r\n try {\r\n styleSheetLoaded = link.sheet;\r\n }\r\n catch (error) {\r\n return;\r\n }\r\n if (styleSheetLoaded)\r\n return;\r\n var timer = setTimeout(function () {\r\n if (!fired) {\r\n listener();\r\n fired = true;\r\n }\r\n }, styleSheetLoadTimeout);\r\n link.addEventListener('load', function () {\r\n clearTimeout(timer);\r\n fired = true;\r\n listener();\r\n });\r\n}\r\nfunction serializeNode(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c;\r\n var rootId = getRootId(doc, mirror);\r\n switch (n.nodeType) {\r\n case n.DOCUMENT_NODE:\r\n if (n.compatMode !== 'CSS1Compat') {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: [],\r\n compatMode: n.compatMode\r\n };\r\n }\r\n else {\r\n return {\r\n type: NodeType.Document,\r\n childNodes: []\r\n };\r\n }\r\n case n.DOCUMENT_TYPE_NODE:\r\n return {\r\n type: NodeType.DocumentType,\r\n name: n.name,\r\n publicId: n.publicId,\r\n systemId: n.systemId,\r\n rootId: rootId\r\n };\r\n case n.ELEMENT_NODE:\r\n return serializeElementNode(n, {\r\n doc: doc,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement,\r\n rootId: rootId\r\n });\r\n case n.TEXT_NODE:\r\n return serializeTextNode(n, {\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n maskTextFn: maskTextFn,\r\n rootId: rootId\r\n });\r\n case n.CDATA_SECTION_NODE:\r\n return {\r\n type: NodeType.CDATA,\r\n textContent: '',\r\n rootId: rootId\r\n };\r\n case n.COMMENT_NODE:\r\n return {\r\n type: NodeType.Comment,\r\n textContent: n.textContent || '',\r\n rootId: rootId\r\n };\r\n default:\r\n return false;\r\n }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n if (!mirror.hasNode(doc))\r\n return undefined;\r\n var docId = mirror.getId(doc);\r\n return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n var _a;\r\n var maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, maskTextFn = options.maskTextFn, rootId = options.rootId;\r\n var parentTagName = n.parentNode && n.parentNode.tagName;\r\n var textContent = n.textContent;\r\n var isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n var isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n if (isStyle && textContent) {\r\n try {\r\n if (n.nextSibling || n.previousSibling) {\r\n }\r\n else if ((_a = n.parentNode.sheet) === null || _a === void 0 ? void 0 : _a.cssRules) {\r\n textContent = stringifyStyleSheet(n.parentNode.sheet);\r\n }\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot get CSS styles from text's parentNode. Error: \".concat(err), n);\r\n }\r\n textContent = absoluteToStylesheet(textContent, getHref());\r\n }\r\n if (isScript) {\r\n textContent = 'SCRIPT_PLACEHOLDER';\r\n }\r\n if (!isStyle &&\r\n !isScript &&\r\n textContent &&\r\n needMaskingText(n, maskTextClass, maskTextSelector)) {\r\n textContent = maskTextFn\r\n ? maskTextFn(textContent)\r\n : textContent.replace(/[\\S]/g, '*');\r\n }\r\n return {\r\n type: NodeType.Text,\r\n textContent: textContent || '',\r\n isStyle: isStyle,\r\n rootId: rootId\r\n };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n var doc = options.doc, blockClass = options.blockClass, blockSelector = options.blockSelector, inlineStylesheet = options.inlineStylesheet, _a = options.maskInputOptions, maskInputOptions = _a === void 0 ? {} : _a, maskInputFn = options.maskInputFn, _b = options.dataURLOptions, dataURLOptions = _b === void 0 ? {} : _b, inlineImages = options.inlineImages, recordCanvas = options.recordCanvas, keepIframeSrcFn = options.keepIframeSrcFn, _c = options.newlyAddedElement, newlyAddedElement = _c === void 0 ? false : _c, rootId = options.rootId;\r\n var needBlock = _isBlockedElement(n, blockClass, blockSelector);\r\n var tagName = getValidTagName(n);\r\n var attributes = {};\r\n var len = n.attributes.length;\r\n for (var i = 0; i < len; i++) {\r\n var attr = n.attributes[i];\r\n attributes[attr.name] = transformAttribute(doc, tagName, attr.name, attr.value);\r\n }\r\n if (tagName === 'link' && inlineStylesheet) {\r\n var stylesheet = Array.from(doc.styleSheets).find(function (s) {\r\n return s.href === n.href;\r\n });\r\n var cssText = null;\r\n if (stylesheet) {\r\n cssText = getCssRulesString(stylesheet);\r\n }\r\n if (cssText) {\r\n delete attributes.rel;\r\n delete attributes.href;\r\n attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n }\r\n }\r\n if (tagName === 'style' &&\r\n n.sheet &&\r\n !(n.innerText || n.textContent || '').trim().length) {\r\n var cssText = getCssRulesString(n.sheet);\r\n if (cssText) {\r\n attributes._cssText = absoluteToStylesheet(cssText, getHref());\r\n }\r\n }\r\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\r\n var value = n.value;\r\n var checked = n.checked;\r\n if (attributes.type !== 'radio' &&\r\n attributes.type !== 'checkbox' &&\r\n attributes.type !== 'submit' &&\r\n attributes.type !== 'button' &&\r\n value) {\r\n attributes.value = maskInputValue({\r\n type: attributes.type,\r\n tagName: tagName,\r\n value: value,\r\n maskInputOptions: maskInputOptions,\r\n maskInputFn: maskInputFn\r\n });\r\n }\r\n else if (checked) {\r\n attributes.checked = checked;\r\n }\r\n }\r\n if (tagName === 'option') {\r\n if (n.selected && !maskInputOptions['select']) {\r\n attributes.selected = true;\r\n }\r\n else {\r\n delete attributes.selected;\r\n }\r\n }\r\n if (tagName === 'canvas' && recordCanvas) {\r\n if (n.__context === '2d') {\r\n if (!is2DCanvasBlank(n)) {\r\n attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n }\r\n else if (!('__context' in n)) {\r\n var canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n var blankCanvas = document.createElement('canvas');\r\n blankCanvas.width = n.width;\r\n blankCanvas.height = n.height;\r\n var blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n if (canvasDataURL !== blankCanvasDataURL) {\r\n attributes.rr_dataURL = canvasDataURL;\r\n }\r\n }\r\n }\r\n if (tagName === 'img' && inlineImages) {\r\n if (!canvasService) {\r\n canvasService = doc.createElement('canvas');\r\n canvasCtx = canvasService.getContext('2d');\r\n }\r\n var image_1 = n;\r\n var oldValue_1 = image_1.crossOrigin;\r\n image_1.crossOrigin = 'anonymous';\r\n var recordInlineImage = function () {\r\n try {\r\n canvasService.width = image_1.naturalWidth;\r\n canvasService.height = image_1.naturalHeight;\r\n canvasCtx.drawImage(image_1, 0, 0);\r\n attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n }\r\n catch (err) {\r\n console.warn(\"Cannot inline img src=\".concat(image_1.currentSrc, \"! Error: \").concat(err));\r\n }\r\n oldValue_1\r\n ? (attributes.crossOrigin = oldValue_1)\r\n : image_1.removeAttribute('crossorigin');\r\n };\r\n if (image_1.complete && image_1.naturalWidth !== 0)\r\n recordInlineImage();\r\n else\r\n image_1.onload = recordInlineImage;\r\n }\r\n if (tagName === 'audio' || tagName === 'video') {\r\n attributes.rr_mediaState = n.paused\r\n ? 'paused'\r\n : 'played';\r\n attributes.rr_mediaCurrentTime = n.currentTime;\r\n }\r\n if (!newlyAddedElement) {\r\n if (n.scrollLeft) {\r\n attributes.rr_scrollLeft = n.scrollLeft;\r\n }\r\n if (n.scrollTop) {\r\n attributes.rr_scrollTop = n.scrollTop;\r\n }\r\n }\r\n if (needBlock) {\r\n var _d = n.getBoundingClientRect(), width = _d.width, height = _d.height;\r\n attributes = {\r\n \"class\": attributes[\"class\"],\r\n rr_width: \"\".concat(width, \"px\"),\r\n rr_height: \"\".concat(height, \"px\")\r\n };\r\n }\r\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n if (!n.contentDocument) {\r\n attributes.rr_src = attributes.src;\r\n }\r\n delete attributes.src;\r\n }\r\n return {\r\n type: NodeType.Element,\r\n tagName: tagName,\r\n attributes: attributes,\r\n childNodes: [],\r\n isSVG: isSVGElement(n) || undefined,\r\n needBlock: needBlock,\r\n rootId: rootId\r\n };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n if (maybeAttr === undefined) {\r\n return '';\r\n }\r\n else {\r\n return maybeAttr.toLowerCase();\r\n }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n return true;\r\n }\r\n else if (sn.type === NodeType.Element) {\r\n if (slimDOMOptions.script &&\r\n (sn.tagName === 'script' ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'preload' &&\r\n sn.attributes.as === 'script') ||\r\n (sn.tagName === 'link' &&\r\n sn.attributes.rel === 'prefetch' &&\r\n typeof sn.attributes.href === 'string' &&\r\n sn.attributes.href.endsWith('.js')))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headFavicon &&\r\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n (sn.tagName === 'meta' &&\r\n (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n return true;\r\n }\r\n else if (sn.tagName === 'meta') {\r\n if (slimDOMOptions.headMetaDescKeywords &&\r\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaSocial &&\r\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaRobots &&\r\n (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaHttpEquiv &&\r\n sn.attributes['http-equiv'] !== undefined) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaAuthorship &&\r\n (lowerIfExists(sn.attributes.name) === 'author' ||\r\n lowerIfExists(sn.attributes.name) === 'generator' ||\r\n lowerIfExists(sn.attributes.name) === 'framework' ||\r\n lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n lowerIfExists(sn.attributes.name) === 'progid' ||\r\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n return true;\r\n }\r\n else if (slimDOMOptions.headMetaVerification &&\r\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n lowerIfExists(sn.attributes.name) === 'verification' ||\r\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n var doc = options.doc, mirror = options.mirror, blockClass = options.blockClass, blockSelector = options.blockSelector, maskTextClass = options.maskTextClass, maskTextSelector = options.maskTextSelector, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.inlineStylesheet, inlineStylesheet = _b === void 0 ? true : _b, _c = options.maskInputOptions, maskInputOptions = _c === void 0 ? {} : _c, maskTextFn = options.maskTextFn, maskInputFn = options.maskInputFn, slimDOMOptions = options.slimDOMOptions, _d = options.dataURLOptions, dataURLOptions = _d === void 0 ? {} : _d, _e = options.inlineImages, inlineImages = _e === void 0 ? false : _e, _f = options.recordCanvas, recordCanvas = _f === void 0 ? false : _f, onSerialize = options.onSerialize, onIframeLoad = options.onIframeLoad, _g = options.iframeLoadTimeout, iframeLoadTimeout = _g === void 0 ? 5000 : _g, onStylesheetLoad = options.onStylesheetLoad, _h = options.stylesheetLoadTimeout, stylesheetLoadTimeout = _h === void 0 ? 5000 : _h, _j = options.keepIframeSrcFn, keepIframeSrcFn = _j === void 0 ? function () { return false; } : _j, _k = options.newlyAddedElement, newlyAddedElement = _k === void 0 ? false : _k;\r\n var _l = options.preserveWhiteSpace, preserveWhiteSpace = _l === void 0 ? true : _l;\r\n var _serializedNode = serializeNode(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: newlyAddedElement\r\n });\r\n if (!_serializedNode) {\r\n console.warn(n, 'not serialized');\r\n return null;\r\n }\r\n var id;\r\n if (mirror.hasNode(n)) {\r\n id = mirror.getId(n);\r\n }\r\n else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n (!preserveWhiteSpace &&\r\n _serializedNode.type === NodeType.Text &&\r\n !_serializedNode.isStyle &&\r\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n id = IGNORED_NODE;\r\n }\r\n else {\r\n id = genId();\r\n }\r\n var serializedNode = Object.assign(_serializedNode, { id: id });\r\n mirror.add(n, serializedNode);\r\n if (id === IGNORED_NODE) {\r\n return null;\r\n }\r\n if (onSerialize) {\r\n onSerialize(n);\r\n }\r\n var recordChild = !skipChild;\r\n if (serializedNode.type === NodeType.Element) {\r\n recordChild = recordChild && !serializedNode.needBlock;\r\n delete serializedNode.needBlock;\r\n var shadowRoot = n.shadowRoot;\r\n if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n serializedNode.isShadowHost = true;\r\n }\r\n if ((serializedNode.type === NodeType.Document ||\r\n serializedNode.type === NodeType.Element) &&\r\n recordChild) {\r\n if (slimDOMOptions.headWhitespace &&\r\n serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'head') {\r\n preserveWhiteSpace = false;\r\n }\r\n var bypassOptions = {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: skipChild,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n };\r\n for (var _i = 0, _m = Array.from(n.childNodes); _i < _m.length; _i++) {\r\n var childN = _m[_i];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n if (isElement(n) && n.shadowRoot) {\r\n for (var _o = 0, _p = Array.from(n.shadowRoot.childNodes); _o < _p.length; _o++) {\r\n var childN = _p[_o];\r\n var serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n if (serializedChildNode) {\r\n isNativeShadowDom(n.shadowRoot) &&\r\n (serializedChildNode.isShadow = true);\r\n serializedNode.childNodes.push(serializedChildNode);\r\n }\r\n }\r\n }\r\n }\r\n if (n.parentNode &&\r\n isShadowRoot(n.parentNode) &&\r\n isNativeShadowDom(n.parentNode)) {\r\n serializedNode.isShadow = true;\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'iframe') {\r\n onceIframeLoaded(n, function () {\r\n var iframeDoc = n.contentDocument;\r\n if (iframeDoc && onIframeLoad) {\r\n var serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n doc: iframeDoc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedIframeNode) {\r\n onIframeLoad(n, serializedIframeNode);\r\n }\r\n }\r\n }, iframeLoadTimeout);\r\n }\r\n if (serializedNode.type === NodeType.Element &&\r\n serializedNode.tagName === 'link' &&\r\n serializedNode.attributes.rel === 'stylesheet') {\r\n onceStylesheetLoaded(n, function () {\r\n if (onStylesheetLoad) {\r\n var serializedLinkNode = serializeNodeWithId(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn\r\n });\r\n if (serializedLinkNode) {\r\n onStylesheetLoad(n, serializedLinkNode);\r\n }\r\n }\r\n }, stylesheetLoadTimeout);\r\n }\r\n return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n var _a = options || {}, _b = _a.mirror, mirror = _b === void 0 ? new Mirror() : _b, _c = _a.blockClass, blockClass = _c === void 0 ? 'rr-block' : _c, _d = _a.blockSelector, blockSelector = _d === void 0 ? null : _d, _e = _a.maskTextClass, maskTextClass = _e === void 0 ? 'rr-mask' : _e, _f = _a.maskTextSelector, maskTextSelector = _f === void 0 ? null : _f, _g = _a.inlineStylesheet, inlineStylesheet = _g === void 0 ? true : _g, _h = _a.inlineImages, inlineImages = _h === void 0 ? false : _h, _j = _a.recordCanvas, recordCanvas = _j === void 0 ? false : _j, _k = _a.maskAllInputs, maskAllInputs = _k === void 0 ? false : _k, maskTextFn = _a.maskTextFn, maskInputFn = _a.maskInputFn, _l = _a.slimDOM, slimDOM = _l === void 0 ? false : _l, dataURLOptions = _a.dataURLOptions, preserveWhiteSpace = _a.preserveWhiteSpace, onSerialize = _a.onSerialize, onIframeLoad = _a.onIframeLoad, iframeLoadTimeout = _a.iframeLoadTimeout, onStylesheetLoad = _a.onStylesheetLoad, stylesheetLoadTimeout = _a.stylesheetLoadTimeout, _m = _a.keepIframeSrcFn, keepIframeSrcFn = _m === void 0 ? function () { return false; } : _m;\r\n var maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true\r\n }\r\n : maskAllInputs === false\r\n ? {\r\n password: true\r\n }\r\n : maskAllInputs;\r\n var slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n ?\r\n {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaDescKeywords: slimDOM === 'all',\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaAuthorship: true,\r\n headMetaVerification: true\r\n }\r\n : slimDOM === false\r\n ? {}\r\n : slimDOM;\r\n return serializeNodeWithId(n, {\r\n doc: n,\r\n mirror: mirror,\r\n blockClass: blockClass,\r\n blockSelector: blockSelector,\r\n maskTextClass: maskTextClass,\r\n maskTextSelector: maskTextSelector,\r\n skipChild: false,\r\n inlineStylesheet: inlineStylesheet,\r\n maskInputOptions: maskInputOptions,\r\n maskTextFn: maskTextFn,\r\n maskInputFn: maskInputFn,\r\n slimDOMOptions: slimDOMOptions,\r\n dataURLOptions: dataURLOptions,\r\n inlineImages: inlineImages,\r\n recordCanvas: recordCanvas,\r\n preserveWhiteSpace: preserveWhiteSpace,\r\n onSerialize: onSerialize,\r\n onIframeLoad: onIframeLoad,\r\n iframeLoadTimeout: iframeLoadTimeout,\r\n onStylesheetLoad: onStylesheetLoad,\r\n stylesheetLoadTimeout: stylesheetLoadTimeout,\r\n keepIframeSrcFn: keepIframeSrcFn,\r\n newlyAddedElement: false\r\n });\r\n}\r\n\nvar commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options) {\r\n if (options === void 0) { options = {}; }\r\n var lineno = 1;\r\n var column = 1;\r\n function updatePosition(str) {\r\n var lines = str.match(/\\n/g);\r\n if (lines) {\r\n lineno += lines.length;\r\n }\r\n var i = str.lastIndexOf('\\n');\r\n column = i === -1 ? column + str.length : str.length - i;\r\n }\r\n function position() {\r\n var start = { line: lineno, column: column };\r\n return function (node) {\r\n node.position = new Position(start);\r\n whitespace();\r\n return node;\r\n };\r\n }\r\n var Position = (function () {\r\n function Position(start) {\r\n this.start = start;\r\n this.end = { line: lineno, column: column };\r\n this.source = options.source;\r\n }\r\n return Position;\r\n }());\r\n Position.prototype.content = css;\r\n var errorsList = [];\r\n function error(msg) {\r\n var err = new Error(\"\".concat(options.source || '', \":\").concat(lineno, \":\").concat(column, \": \").concat(msg));\r\n err.reason = msg;\r\n err.filename = options.source;\r\n err.line = lineno;\r\n err.column = column;\r\n err.source = css;\r\n if (options.silent) {\r\n errorsList.push(err);\r\n }\r\n else {\r\n throw err;\r\n }\r\n }\r\n function stylesheet() {\r\n var rulesList = rules();\r\n return {\r\n type: 'stylesheet',\r\n stylesheet: {\r\n source: options.source,\r\n rules: rulesList,\r\n parsingErrors: errorsList\r\n }\r\n };\r\n }\r\n function open() {\r\n return match(/^{\\s*/);\r\n }\r\n function close() {\r\n return match(/^}/);\r\n }\r\n function rules() {\r\n var node;\r\n var rules = [];\r\n whitespace();\r\n comments(rules);\r\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n if (node !== false) {\r\n rules.push(node);\r\n comments(rules);\r\n }\r\n }\r\n return rules;\r\n }\r\n function match(re) {\r\n var m = re.exec(css);\r\n if (!m) {\r\n return;\r\n }\r\n var str = m[0];\r\n updatePosition(str);\r\n css = css.slice(str.length);\r\n return m;\r\n }\r\n function whitespace() {\r\n match(/^\\s*/);\r\n }\r\n function comments(rules) {\r\n if (rules === void 0) { rules = []; }\r\n var c;\r\n while ((c = comment())) {\r\n if (c !== false) {\r\n rules.push(c);\r\n }\r\n c = comment();\r\n }\r\n return rules;\r\n }\r\n function comment() {\r\n var pos = position();\r\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n return;\r\n }\r\n var i = 2;\r\n while ('' !== css.charAt(i) &&\r\n ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n ++i;\r\n }\r\n i += 2;\r\n if ('' === css.charAt(i - 1)) {\r\n return error('End of comment missing');\r\n }\r\n var str = css.slice(2, i - 2);\r\n column += 2;\r\n updatePosition(str);\r\n css = css.slice(i);\r\n column += 2;\r\n return pos({\r\n type: 'comment',\r\n comment: str\r\n });\r\n }\r\n function selector() {\r\n var m = match(/^([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n return trim(m[0])\r\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\r\n return m.replace(/,/g, '\\u200C');\r\n })\r\n .split(/\\s*(?![^(]*\\)),\\s*/)\r\n .map(function (s) {\r\n return s.replace(/\\u200C/g, ',');\r\n });\r\n }\r\n function declaration() {\r\n var pos = position();\r\n var propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n if (!propMatch) {\r\n return;\r\n }\r\n var prop = trim(propMatch[0]);\r\n if (!match(/^:\\s*/)) {\r\n return error(\"property missing ':'\");\r\n }\r\n var val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n var ret = pos({\r\n type: 'declaration',\r\n property: prop.replace(commentre, ''),\r\n value: val ? trim(val[0]).replace(commentre, '') : ''\r\n });\r\n match(/^[;\\s]*/);\r\n return ret;\r\n }\r\n function declarations() {\r\n var decls = [];\r\n if (!open()) {\r\n return error(\"missing '{'\");\r\n }\r\n comments(decls);\r\n var decl;\r\n while ((decl = declaration())) {\r\n if (decl !== false) {\r\n decls.push(decl);\r\n comments(decls);\r\n }\r\n decl = declaration();\r\n }\r\n if (!close()) {\r\n return error(\"missing '}'\");\r\n }\r\n return decls;\r\n }\r\n function keyframe() {\r\n var m;\r\n var vals = [];\r\n var pos = position();\r\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n vals.push(m[1]);\r\n match(/^,\\s*/);\r\n }\r\n if (!vals.length) {\r\n return;\r\n }\r\n return pos({\r\n type: 'keyframe',\r\n values: vals,\r\n declarations: declarations()\r\n });\r\n }\r\n function atkeyframes() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = m[1];\r\n m = match(/^([-\\w]+)\\s*/);\r\n if (!m) {\r\n return error('@keyframes missing name');\r\n }\r\n var name = m[1];\r\n if (!open()) {\r\n return error(\"@keyframes missing '{'\");\r\n }\r\n var frame;\r\n var frames = comments();\r\n while ((frame = keyframe())) {\r\n frames.push(frame);\r\n frames = frames.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@keyframes missing '}'\");\r\n }\r\n return pos({\r\n type: 'keyframes',\r\n name: name,\r\n vendor: vendor,\r\n keyframes: frames\r\n });\r\n }\r\n function atsupports() {\r\n var pos = position();\r\n var m = match(/^@supports *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var supports = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@supports missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@supports missing '}'\");\r\n }\r\n return pos({\r\n type: 'supports',\r\n supports: supports,\r\n rules: style\r\n });\r\n }\r\n function athost() {\r\n var pos = position();\r\n var m = match(/^@host\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@host missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@host missing '}'\");\r\n }\r\n return pos({\r\n type: 'host',\r\n rules: style\r\n });\r\n }\r\n function atmedia() {\r\n var pos = position();\r\n var m = match(/^@media *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var media = trim(m[1]);\r\n if (!open()) {\r\n return error(\"@media missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@media missing '}'\");\r\n }\r\n return pos({\r\n type: 'media',\r\n media: media,\r\n rules: style\r\n });\r\n }\r\n function atcustommedia() {\r\n var pos = position();\r\n var m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n if (!m) {\r\n return;\r\n }\r\n return pos({\r\n type: 'custom-media',\r\n name: trim(m[1]),\r\n media: trim(m[2])\r\n });\r\n }\r\n function atpage() {\r\n var pos = position();\r\n var m = match(/^@page */);\r\n if (!m) {\r\n return;\r\n }\r\n var sel = selector() || [];\r\n if (!open()) {\r\n return error(\"@page missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@page missing '}'\");\r\n }\r\n return pos({\r\n type: 'page',\r\n selectors: sel,\r\n declarations: decls\r\n });\r\n }\r\n function atdocument() {\r\n var pos = position();\r\n var m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n if (!m) {\r\n return;\r\n }\r\n var vendor = trim(m[1]);\r\n var doc = trim(m[2]);\r\n if (!open()) {\r\n return error(\"@document missing '{'\");\r\n }\r\n var style = comments().concat(rules());\r\n if (!close()) {\r\n return error(\"@document missing '}'\");\r\n }\r\n return pos({\r\n type: 'document',\r\n document: doc,\r\n vendor: vendor,\r\n rules: style\r\n });\r\n }\r\n function atfontface() {\r\n var pos = position();\r\n var m = match(/^@font-face\\s*/);\r\n if (!m) {\r\n return;\r\n }\r\n if (!open()) {\r\n return error(\"@font-face missing '{'\");\r\n }\r\n var decls = comments();\r\n var decl;\r\n while ((decl = declaration())) {\r\n decls.push(decl);\r\n decls = decls.concat(comments());\r\n }\r\n if (!close()) {\r\n return error(\"@font-face missing '}'\");\r\n }\r\n return pos({\r\n type: 'font-face',\r\n declarations: decls\r\n });\r\n }\r\n var atimport = _compileAtrule('import');\r\n var atcharset = _compileAtrule('charset');\r\n var atnamespace = _compileAtrule('namespace');\r\n function _compileAtrule(name) {\r\n var re = new RegExp('^@' + name + '\\\\s*([^;]+);');\r\n return function () {\r\n var pos = position();\r\n var m = match(re);\r\n if (!m) {\r\n return;\r\n }\r\n var ret = { type: name };\r\n ret[name] = m[1].trim();\r\n return pos(ret);\r\n };\r\n }\r\n function atrule() {\r\n if (css[0] !== '@') {\r\n return;\r\n }\r\n return (atkeyframes() ||\r\n atmedia() ||\r\n atcustommedia() ||\r\n atsupports() ||\r\n atimport() ||\r\n atcharset() ||\r\n atnamespace() ||\r\n atdocument() ||\r\n atpage() ||\r\n athost() ||\r\n atfontface());\r\n }\r\n function rule() {\r\n var pos = position();\r\n var sel = selector();\r\n if (!sel) {\r\n return error('selector missing');\r\n }\r\n comments();\r\n return pos({\r\n type: 'rule',\r\n selectors: sel,\r\n declarations: declarations()\r\n });\r\n }\r\n return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n var isNode = obj && typeof obj.type === 'string';\r\n var childParent = isNode ? obj : parent;\r\n for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {\r\n var k = _a[_i];\r\n var value = obj[k];\r\n if (Array.isArray(value)) {\r\n value.forEach(function (v) {\r\n addParent(v, childParent);\r\n });\r\n }\r\n else if (value && typeof value === 'object') {\r\n addParent(value, childParent);\r\n }\r\n }\r\n if (isNode) {\r\n Object.defineProperty(obj, 'parent', {\r\n configurable: true,\r\n writable: true,\r\n enumerable: false,\r\n value: parent || null\r\n });\r\n }\r\n return obj;\r\n}\n\nvar tagMap = {\r\n script: 'noscript',\r\n altglyph: 'altGlyph',\r\n altglyphdef: 'altGlyphDef',\r\n altglyphitem: 'altGlyphItem',\r\n animatecolor: 'animateColor',\r\n animatemotion: 'animateMotion',\r\n animatetransform: 'animateTransform',\r\n clippath: 'clipPath',\r\n feblend: 'feBlend',\r\n fecolormatrix: 'feColorMatrix',\r\n fecomponenttransfer: 'feComponentTransfer',\r\n fecomposite: 'feComposite',\r\n feconvolvematrix: 'feConvolveMatrix',\r\n fediffuselighting: 'feDiffuseLighting',\r\n fedisplacementmap: 'feDisplacementMap',\r\n fedistantlight: 'feDistantLight',\r\n fedropshadow: 'feDropShadow',\r\n feflood: 'feFlood',\r\n fefunca: 'feFuncA',\r\n fefuncb: 'feFuncB',\r\n fefuncg: 'feFuncG',\r\n fefuncr: 'feFuncR',\r\n fegaussianblur: 'feGaussianBlur',\r\n feimage: 'feImage',\r\n femerge: 'feMerge',\r\n femergenode: 'feMergeNode',\r\n femorphology: 'feMorphology',\r\n feoffset: 'feOffset',\r\n fepointlight: 'fePointLight',\r\n fespecularlighting: 'feSpecularLighting',\r\n fespotlight: 'feSpotLight',\r\n fetile: 'feTile',\r\n feturbulence: 'feTurbulence',\r\n foreignobject: 'foreignObject',\r\n glyphref: 'glyphRef',\r\n lineargradient: 'linearGradient',\r\n radialgradient: 'radialGradient'\r\n};\r\nfunction getTagName(n) {\r\n var tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n if (tagName === 'link' && n.attributes._cssText) {\r\n tagName = 'style';\r\n }\r\n return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nvar HOVER_SELECTOR = /([^\\\\]):hover/;\r\nvar HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n var cachedStyle = cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.get(cssText);\r\n if (cachedStyle)\r\n return cachedStyle;\r\n var ast = parse(cssText, {\r\n silent: true\r\n });\r\n if (!ast.stylesheet) {\r\n return cssText;\r\n }\r\n var selectors = [];\r\n ast.stylesheet.rules.forEach(function (rule) {\r\n if ('selectors' in rule) {\r\n (rule.selectors || []).forEach(function (selector) {\r\n if (HOVER_SELECTOR.test(selector)) {\r\n selectors.push(selector);\r\n }\r\n });\r\n }\r\n });\r\n if (selectors.length === 0) {\r\n return cssText;\r\n }\r\n var selectorMatcher = new RegExp(selectors\r\n .filter(function (selector, index) { return selectors.indexOf(selector) === index; })\r\n .sort(function (a, b) { return b.length - a.length; })\r\n .map(function (selector) {\r\n return escapeRegExp(selector);\r\n })\r\n .join('|'), 'g');\r\n var result = cssText.replace(selectorMatcher, function (selector) {\r\n var newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n return \"\".concat(selector, \", \").concat(newSelector);\r\n });\r\n cache === null || cache === void 0 ? void 0 : cache.stylesWithHoverClass.set(cssText, result);\r\n return result;\r\n}\r\nfunction createCache() {\r\n var stylesWithHoverClass = new Map();\r\n return {\r\n stylesWithHoverClass: stylesWithHoverClass\r\n };\r\n}\r\nfunction buildNode(n, options) {\r\n var doc = options.doc, hackCss = options.hackCss, cache = options.cache;\r\n switch (n.type) {\r\n case NodeType.Document:\r\n return doc.implementation.createDocument(null, '', null);\r\n case NodeType.DocumentType:\r\n return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n case NodeType.Element: {\r\n var tagName = getTagName(n);\r\n var node_1;\r\n if (n.isSVG) {\r\n node_1 = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n }\r\n else {\r\n node_1 = doc.createElement(tagName);\r\n }\r\n var specialAttributes = {};\r\n for (var name_1 in n.attributes) {\r\n if (!Object.prototype.hasOwnProperty.call(n.attributes, name_1)) {\r\n continue;\r\n }\r\n var value = n.attributes[name_1];\r\n if (tagName === 'option' &&\r\n name_1 === 'selected' &&\r\n value === false) {\r\n continue;\r\n }\r\n if (value === true)\r\n value = '';\r\n if (name_1.startsWith('rr_')) {\r\n specialAttributes[name_1] = value;\r\n continue;\r\n }\r\n var isTextarea = tagName === 'textarea' && name_1 === 'value';\r\n var isRemoteOrDynamicCss = tagName === 'style' && name_1 === '_cssText';\r\n if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n value = addHoverClass(value, cache);\r\n }\r\n if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n var child = doc.createTextNode(value);\r\n for (var _i = 0, _a = Array.from(node_1.childNodes); _i < _a.length; _i++) {\r\n var c = _a[_i];\r\n if (c.nodeType === node_1.TEXT_NODE) {\r\n node_1.removeChild(c);\r\n }\r\n }\r\n node_1.appendChild(child);\r\n continue;\r\n }\r\n try {\r\n if (n.isSVG && name_1 === 'xlink:href') {\r\n node_1.setAttributeNS('http://www.w3.org/1999/xlink', name_1, value.toString());\r\n }\r\n else if (name_1 === 'onload' ||\r\n name_1 === 'onclick' ||\r\n name_1.substring(0, 7) === 'onmouse') {\r\n node_1.setAttribute('_' + name_1, value.toString());\r\n }\r\n else if (tagName === 'meta' &&\r\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n name_1 === 'content') {\r\n node_1.setAttribute('csp-content', value.toString());\r\n continue;\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'preload' &&\r\n n.attributes.as === 'script') {\r\n }\r\n else if (tagName === 'link' &&\r\n n.attributes.rel === 'prefetch' &&\r\n typeof n.attributes.href === 'string' &&\r\n n.attributes.href.endsWith('.js')) {\r\n }\r\n else if (tagName === 'img' &&\r\n n.attributes.srcset &&\r\n n.attributes.rr_dataURL) {\r\n node_1.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n }\r\n else {\r\n node_1.setAttribute(name_1, value.toString());\r\n }\r\n }\r\n catch (error) {\r\n }\r\n }\r\n var _loop_1 = function (name_2) {\r\n var value = specialAttributes[name_2];\r\n if (tagName === 'canvas' && name_2 === 'rr_dataURL') {\r\n var image_1 = document.createElement('img');\r\n image_1.onload = function () {\r\n var ctx = node_1.getContext('2d');\r\n if (ctx) {\r\n ctx.drawImage(image_1, 0, 0, image_1.width, image_1.height);\r\n }\r\n };\r\n image_1.src = value.toString();\r\n if (node_1.RRNodeType)\r\n node_1.rr_dataURL = value.toString();\r\n }\r\n else if (tagName === 'img' && name_2 === 'rr_dataURL') {\r\n var image = node_1;\r\n if (!image.currentSrc.startsWith('data:')) {\r\n image.setAttribute('rrweb-original-src', n.attributes.src);\r\n image.src = value.toString();\r\n }\r\n }\r\n if (name_2 === 'rr_width') {\r\n node_1.style.width = value.toString();\r\n }\r\n else if (name_2 === 'rr_height') {\r\n node_1.style.height = value.toString();\r\n }\r\n else if (name_2 === 'rr_mediaCurrentTime' &&\r\n typeof value === 'number') {\r\n node_1.currentTime = value;\r\n }\r\n else if (name_2 === 'rr_mediaState') {\r\n switch (value) {\r\n case 'played':\r\n node_1\r\n .play()[\"catch\"](function (e) { return console.warn('media playback error', e); });\r\n break;\r\n case 'paused':\r\n node_1.pause();\r\n break;\r\n }\r\n }\r\n };\r\n for (var name_2 in specialAttributes) {\r\n _loop_1(name_2);\r\n }\r\n if (n.isShadowHost) {\r\n if (!node_1.shadowRoot) {\r\n node_1.attachShadow({ mode: 'open' });\r\n }\r\n else {\r\n while (node_1.shadowRoot.firstChild) {\r\n node_1.shadowRoot.removeChild(node_1.shadowRoot.firstChild);\r\n }\r\n }\r\n }\r\n return node_1;\r\n }\r\n case NodeType.Text:\r\n return doc.createTextNode(n.isStyle && hackCss\r\n ? addHoverClass(n.textContent, cache)\r\n : n.textContent);\r\n case NodeType.CDATA:\r\n return doc.createCDATASection(n.textContent);\r\n case NodeType.Comment:\r\n return doc.createComment(n.textContent);\r\n default:\r\n return null;\r\n }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n var doc = options.doc, mirror = options.mirror, _a = options.skipChild, skipChild = _a === void 0 ? false : _a, _b = options.hackCss, hackCss = _b === void 0 ? true : _b, afterAppend = options.afterAppend, cache = options.cache;\r\n var node = buildNode(n, { doc: doc, hackCss: hackCss, cache: cache });\r\n if (!node) {\r\n return null;\r\n }\r\n if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n mirror.replace(n.rootId, doc);\r\n }\r\n if (n.type === NodeType.Document) {\r\n doc.close();\r\n doc.open();\r\n if (n.compatMode === 'BackCompat' &&\r\n n.childNodes &&\r\n n.childNodes[0].type !== NodeType.DocumentType) {\r\n if (n.childNodes[0].type === NodeType.Element &&\r\n 'xmlns' in n.childNodes[0].attributes &&\r\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n }\r\n else {\r\n doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n }\r\n }\r\n node = doc;\r\n }\r\n mirror.add(node, n);\r\n if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n !skipChild) {\r\n for (var _i = 0, _c = n.childNodes; _i < _c.length; _i++) {\r\n var childN = _c[_i];\r\n var childNode = buildNodeWithSN(childN, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n if (!childNode) {\r\n console.warn('Failed to rebuild', childN);\r\n continue;\r\n }\r\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n node.shadowRoot.appendChild(childNode);\r\n }\r\n else {\r\n node.appendChild(childNode);\r\n }\r\n if (afterAppend) {\r\n afterAppend(childNode, childN.id);\r\n }\r\n }\r\n }\r\n return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n function walk(node) {\r\n onVisit(node);\r\n }\r\n for (var _i = 0, _a = mirror.getIds(); _i < _a.length; _i++) {\r\n var id = _a[_i];\r\n if (mirror.has(id)) {\r\n walk(mirror.getNode(id));\r\n }\r\n }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n var n = mirror.getMeta(node);\r\n if ((n === null || n === void 0 ? void 0 : n.type) !== NodeType.Element) {\r\n return;\r\n }\r\n var el = node;\r\n for (var name_3 in n.attributes) {\r\n if (!(Object.prototype.hasOwnProperty.call(n.attributes, name_3) &&\r\n name_3.startsWith('rr_'))) {\r\n continue;\r\n }\r\n var value = n.attributes[name_3];\r\n if (name_3 === 'rr_scrollLeft') {\r\n el.scrollLeft = value;\r\n }\r\n if (name_3 === 'rr_scrollTop') {\r\n el.scrollTop = value;\r\n }\r\n }\r\n}\r\nfunction rebuild(n, options) {\r\n var doc = options.doc, onVisit = options.onVisit, _a = options.hackCss, hackCss = _a === void 0 ? true : _a, afterAppend = options.afterAppend, cache = options.cache, _b = options.mirror, mirror = _b === void 0 ? new Mirror() : _b;\r\n var node = buildNodeWithSN(n, {\r\n doc: doc,\r\n mirror: mirror,\r\n skipChild: false,\r\n hackCss: hackCss,\r\n afterAppend: afterAppend,\r\n cache: cache\r\n });\r\n visit(mirror, function (visitedNode) {\r\n if (onVisit) {\r\n onVisit(visitedNode);\r\n }\r\n handleScroll(visitedNode, mirror);\r\n });\r\n return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, classMatchesRegex, createCache, createMirror, genId, getCssRuleString, getCssRulesString, is2DCanvasBlank, isCSSImportRule, isElement, isNativeShadowDom, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, snapshot, transformAttribute };\n","import { classMatchesRegex, IGNORED_NODE, isShadowRoot } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target = document) {\r\n const options = { capture: true, passive: true };\r\n target.addEventListener(type, fn, options);\r\n return () => target.removeEventListener(type, fn, options);\r\n}\r\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\r\n '\\r\\n' +\r\n 'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\r\n '\\r\\n' +\r\n 'or you can use record.mirror to access the mirror instance during recording.';\r\nlet _mirror = {\r\n map: {},\r\n getId() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return -1;\r\n },\r\n getNode() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return null;\r\n },\r\n removeNodeFromMap() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n has() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n return false;\r\n },\r\n reset() {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n },\r\n};\r\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\r\n _mirror = new Proxy(_mirror, {\r\n get(target, prop, receiver) {\r\n if (prop === 'map') {\r\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n}\r\nfunction throttle(func, wait, options = {}) {\r\n let timeout = null;\r\n let previous = 0;\r\n return function (...args) {\r\n const now = Date.now();\r\n if (!previous && options.leading === false) {\r\n previous = now;\r\n }\r\n const remaining = wait - (now - previous);\r\n const context = this;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n func.apply(context, args);\r\n }\r\n else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(() => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n func.apply(context, args);\r\n }, remaining);\r\n }\r\n };\r\n}\r\nfunction hookSetter(target, key, d, isRevoked, win = window) {\r\n const original = win.Object.getOwnPropertyDescriptor(target, key);\r\n win.Object.defineProperty(target, key, isRevoked\r\n ? d\r\n : {\r\n set(value) {\r\n setTimeout(() => {\r\n d.set.call(this, value);\r\n }, 0);\r\n if (original && original.set) {\r\n original.set.call(this, value);\r\n }\r\n },\r\n });\r\n return () => hookSetter(target, key, original || {}, true);\r\n}\r\nfunction patch(source, name, replacement) {\r\n try {\r\n if (!(name in source)) {\r\n return () => {\r\n };\r\n }\r\n const original = source[name];\r\n const wrapped = replacement(original);\r\n if (typeof wrapped === 'function') {\r\n wrapped.prototype = wrapped.prototype || {};\r\n Object.defineProperties(wrapped, {\r\n __rrweb_original__: {\r\n enumerable: false,\r\n value: original,\r\n },\r\n });\r\n }\r\n source[name] = wrapped;\r\n return () => {\r\n source[name] = original;\r\n };\r\n }\r\n catch (_a) {\r\n return () => {\r\n };\r\n }\r\n}\r\nfunction getWindowHeight() {\r\n return (window.innerHeight ||\r\n (document.documentElement && document.documentElement.clientHeight) ||\r\n (document.body && document.body.clientHeight));\r\n}\r\nfunction getWindowWidth() {\r\n return (window.innerWidth ||\r\n (document.documentElement && document.documentElement.clientWidth) ||\r\n (document.body && document.body.clientWidth));\r\n}\r\nfunction isBlocked(node, blockClass, blockSelector, checkAncestors) {\r\n if (!node) {\r\n return false;\r\n }\r\n const el = node.nodeType === node.ELEMENT_NODE\r\n ? node\r\n : node.parentElement;\r\n if (!el)\r\n return false;\r\n if (typeof blockClass === 'string') {\r\n if (el.classList.contains(blockClass))\r\n return true;\r\n if (checkAncestors && el.closest('.' + blockClass) !== null)\r\n return true;\r\n }\r\n else {\r\n if (classMatchesRegex(el, blockClass, checkAncestors))\r\n return true;\r\n }\r\n if (blockSelector) {\r\n if (node.matches(blockSelector))\r\n return true;\r\n if (checkAncestors && el.closest(blockSelector) !== null)\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction isSerialized(n, mirror) {\r\n return mirror.getId(n) !== -1;\r\n}\r\nfunction isIgnored(n, mirror) {\r\n return mirror.getId(n) === IGNORED_NODE;\r\n}\r\nfunction isAncestorRemoved(target, mirror) {\r\n if (isShadowRoot(target)) {\r\n return false;\r\n }\r\n const id = mirror.getId(target);\r\n if (!mirror.has(id)) {\r\n return true;\r\n }\r\n if (target.parentNode &&\r\n target.parentNode.nodeType === target.DOCUMENT_NODE) {\r\n return false;\r\n }\r\n if (!target.parentNode) {\r\n return true;\r\n }\r\n return isAncestorRemoved(target.parentNode, mirror);\r\n}\r\nfunction isTouchEvent(event) {\r\n return Boolean(event.changedTouches);\r\n}\r\nfunction polyfill(win = window) {\r\n if ('NodeList' in win && !win.NodeList.prototype.forEach) {\r\n win.NodeList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\r\n win.DOMTokenList.prototype.forEach = Array.prototype\r\n .forEach;\r\n }\r\n if (!Node.prototype.contains) {\r\n Node.prototype.contains = (...args) => {\r\n let node = args[0];\r\n if (!(0 in args)) {\r\n throw new TypeError('1 argument is required');\r\n }\r\n do {\r\n if (this === node) {\r\n return true;\r\n }\r\n } while ((node = node && node.parentNode));\r\n return false;\r\n };\r\n }\r\n}\r\nfunction queueToResolveTrees(queue) {\r\n const queueNodeMap = {};\r\n const putIntoMap = (m, parent) => {\r\n const nodeInTree = {\r\n value: m,\r\n parent,\r\n children: [],\r\n };\r\n queueNodeMap[m.node.id] = nodeInTree;\r\n return nodeInTree;\r\n };\r\n const queueNodeTrees = [];\r\n for (const mutation of queue) {\r\n const { nextId, parentId } = mutation;\r\n if (nextId && nextId in queueNodeMap) {\r\n const nextInTree = queueNodeMap[nextId];\r\n if (nextInTree.parent) {\r\n const idx = nextInTree.parent.children.indexOf(nextInTree);\r\n nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\r\n }\r\n else {\r\n const idx = queueNodeTrees.indexOf(nextInTree);\r\n queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\r\n }\r\n continue;\r\n }\r\n if (parentId in queueNodeMap) {\r\n const parentInTree = queueNodeMap[parentId];\r\n parentInTree.children.push(putIntoMap(mutation, parentInTree));\r\n continue;\r\n }\r\n queueNodeTrees.push(putIntoMap(mutation, null));\r\n }\r\n return queueNodeTrees;\r\n}\r\nfunction iterateResolveTree(tree, cb) {\r\n cb(tree.value);\r\n for (let i = tree.children.length - 1; i >= 0; i--) {\r\n iterateResolveTree(tree.children[i], cb);\r\n }\r\n}\r\nfunction isSerializedIframe(n, mirror) {\r\n return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\r\n}\r\nfunction isSerializedStylesheet(n, mirror) {\r\n return Boolean(n.nodeName === 'LINK' &&\r\n n.nodeType === n.ELEMENT_NODE &&\r\n n.getAttribute &&\r\n n.getAttribute('rel') === 'stylesheet' &&\r\n mirror.getMeta(n));\r\n}\r\nfunction getBaseDimension(node, rootIframe) {\r\n var _a, _b;\r\n const frameElement = (_b = (_a = node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === null || _b === void 0 ? void 0 : _b.frameElement;\r\n if (!frameElement || frameElement === rootIframe) {\r\n return {\r\n x: 0,\r\n y: 0,\r\n relativeScale: 1,\r\n absoluteScale: 1,\r\n };\r\n }\r\n const frameDimension = frameElement.getBoundingClientRect();\r\n const frameBaseDimension = getBaseDimension(frameElement, rootIframe);\r\n const relativeScale = frameDimension.height / frameElement.clientHeight;\r\n return {\r\n x: frameDimension.x * frameBaseDimension.relativeScale +\r\n frameBaseDimension.x,\r\n y: frameDimension.y * frameBaseDimension.relativeScale +\r\n frameBaseDimension.y,\r\n relativeScale,\r\n absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\r\n };\r\n}\r\nfunction hasShadowRoot(n) {\r\n return Boolean(n === null || n === void 0 ? void 0 : n.shadowRoot);\r\n}\r\nfunction getNestedRule(rules, position) {\r\n const rule = rules[position[0]];\r\n if (position.length === 1) {\r\n return rule;\r\n }\r\n else {\r\n return getNestedRule(rule.cssRules[position[1]].cssRules, position.slice(2));\r\n }\r\n}\r\nfunction getPositionsAndIndex(nestedIndex) {\r\n const positions = [...nestedIndex];\r\n const index = positions.pop();\r\n return { positions, index };\r\n}\r\nfunction uniqueTextMutations(mutations) {\r\n const idSet = new Set();\r\n const uniqueMutations = [];\r\n for (let i = mutations.length; i--;) {\r\n const mutation = mutations[i];\r\n if (!idSet.has(mutation.id)) {\r\n uniqueMutations.push(mutation);\r\n idSet.add(mutation.id);\r\n }\r\n }\r\n return uniqueMutations;\r\n}\r\nclass StyleSheetMirror {\r\n constructor() {\r\n this.id = 1;\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n }\r\n getId(stylesheet) {\r\n var _a;\r\n return (_a = this.styleIDMap.get(stylesheet)) !== null && _a !== void 0 ? _a : -1;\r\n }\r\n has(stylesheet) {\r\n return this.styleIDMap.has(stylesheet);\r\n }\r\n add(stylesheet, id) {\r\n if (this.has(stylesheet))\r\n return this.getId(stylesheet);\r\n let newId;\r\n if (id === undefined) {\r\n newId = this.id++;\r\n }\r\n else\r\n newId = id;\r\n this.styleIDMap.set(stylesheet, newId);\r\n this.idStyleMap.set(newId, stylesheet);\r\n return newId;\r\n }\r\n getStyle(id) {\r\n return this.idStyleMap.get(id) || null;\r\n }\r\n reset() {\r\n this.styleIDMap = new WeakMap();\r\n this.idStyleMap = new Map();\r\n this.id = 1;\r\n }\r\n generateId() {\r\n return this.id++;\r\n }\r\n}\n\nexport { StyleSheetMirror, _mirror, getBaseDimension, getNestedRule, getPositionsAndIndex, getWindowHeight, getWindowWidth, hasShadowRoot, hookSetter, isAncestorRemoved, isBlocked, isIgnored, isSerialized, isSerializedIframe, isSerializedStylesheet, isTouchEvent, iterateResolveTree, on, patch, polyfill, queueToResolveTrees, throttle, uniqueTextMutations };\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\n\nexport { CanvasContext, EventType, IncrementalSource, MouseInteractions, ReplayerEvents };\n","import { isShadowRoot, isNativeShadowDom, maskInputValue, transformAttribute, needMaskingText, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isSerialized, isAncestorRemoved, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\n\nfunction isNodeInLinkedList(n) {\r\n return '__ln' in n;\r\n}\r\nclass DoubleLinkedList {\r\n constructor() {\r\n this.length = 0;\r\n this.head = null;\r\n }\r\n get(position) {\r\n if (position >= this.length) {\r\n throw new Error('Position outside of list range');\r\n }\r\n let current = this.head;\r\n for (let index = 0; index < position; index++) {\r\n current = (current === null || current === void 0 ? void 0 : current.next) || null;\r\n }\r\n return current;\r\n }\r\n addNode(n) {\r\n const node = {\r\n value: n,\r\n previous: null,\r\n next: null,\r\n };\r\n n.__ln = node;\r\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\r\n const current = n.previousSibling.__ln.next;\r\n node.next = current;\r\n node.previous = n.previousSibling.__ln;\r\n n.previousSibling.__ln.next = node;\r\n if (current) {\r\n current.previous = node;\r\n }\r\n }\r\n else if (n.nextSibling &&\r\n isNodeInLinkedList(n.nextSibling) &&\r\n n.nextSibling.__ln.previous) {\r\n const current = n.nextSibling.__ln.previous;\r\n node.previous = current;\r\n node.next = n.nextSibling.__ln;\r\n n.nextSibling.__ln.previous = node;\r\n if (current) {\r\n current.next = node;\r\n }\r\n }\r\n else {\r\n if (this.head) {\r\n this.head.previous = node;\r\n }\r\n node.next = this.head;\r\n this.head = node;\r\n }\r\n this.length++;\r\n }\r\n removeNode(n) {\r\n const current = n.__ln;\r\n if (!this.head) {\r\n return;\r\n }\r\n if (!current.previous) {\r\n this.head = current.next;\r\n if (this.head) {\r\n this.head.previous = null;\r\n }\r\n }\r\n else {\r\n current.previous.next = current.next;\r\n if (current.next) {\r\n current.next.previous = current.previous;\r\n }\r\n }\r\n if (n.__ln) {\r\n delete n.__ln;\r\n }\r\n this.length--;\r\n }\r\n}\r\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\r\nclass MutationBuffer {\r\n constructor() {\r\n this.frozen = false;\r\n this.locked = false;\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.mapRemoves = [];\r\n this.movedMap = {};\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.processMutations = (mutations) => {\r\n mutations.forEach(this.processMutation);\r\n this.emit();\r\n };\r\n this.emit = () => {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const adds = [];\r\n const addList = new DoubleLinkedList();\r\n const getNextId = (n) => {\r\n let ns = n;\r\n let nextId = IGNORED_NODE;\r\n while (nextId === IGNORED_NODE) {\r\n ns = ns && ns.nextSibling;\r\n nextId = ns && this.mirror.getId(ns);\r\n }\r\n return nextId;\r\n };\r\n const pushAdd = (n) => {\r\n var _a, _b, _c, _d;\r\n let shadowHost = null;\r\n if (((_b = (_a = n.getRootNode) === null || _a === void 0 ? void 0 : _a.call(n)) === null || _b === void 0 ? void 0 : _b.nodeType) === Node.DOCUMENT_FRAGMENT_NODE &&\r\n n.getRootNode().host)\r\n shadowHost = n.getRootNode().host;\r\n let rootShadowHost = shadowHost;\r\n while (((_d = (_c = rootShadowHost === null || rootShadowHost === void 0 ? void 0 : rootShadowHost.getRootNode) === null || _c === void 0 ? void 0 : _c.call(rootShadowHost)) === null || _d === void 0 ? void 0 : _d.nodeType) ===\r\n Node.DOCUMENT_FRAGMENT_NODE &&\r\n rootShadowHost.getRootNode().host)\r\n rootShadowHost = rootShadowHost.getRootNode().host;\r\n const notInDoc = !this.doc.contains(n) &&\r\n (!rootShadowHost || !this.doc.contains(rootShadowHost));\r\n if (!n.parentNode || notInDoc) {\r\n return;\r\n }\r\n const parentId = isShadowRoot(n.parentNode)\r\n ? this.mirror.getId(shadowHost)\r\n : this.mirror.getId(n.parentNode);\r\n const nextId = getNextId(n);\r\n if (parentId === -1 || nextId === -1) {\r\n return addList.addNode(n);\r\n }\r\n const sn = serializeNodeWithId(n, {\r\n doc: this.doc,\r\n mirror: this.mirror,\r\n blockClass: this.blockClass,\r\n blockSelector: this.blockSelector,\r\n maskTextClass: this.maskTextClass,\r\n maskTextSelector: this.maskTextSelector,\r\n skipChild: true,\r\n newlyAddedElement: true,\r\n inlineStylesheet: this.inlineStylesheet,\r\n maskInputOptions: this.maskInputOptions,\r\n maskTextFn: this.maskTextFn,\r\n maskInputFn: this.maskInputFn,\r\n slimDOMOptions: this.slimDOMOptions,\r\n dataURLOptions: this.dataURLOptions,\r\n recordCanvas: this.recordCanvas,\r\n inlineImages: this.inlineImages,\r\n onSerialize: (currentN) => {\r\n if (isSerializedIframe(currentN, this.mirror)) {\r\n this.iframeManager.addIframe(currentN);\r\n }\r\n if (isSerializedStylesheet(currentN, this.mirror)) {\r\n this.stylesheetManager.trackLinkElement(currentN);\r\n }\r\n if (hasShadowRoot(n)) {\r\n this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n this.iframeManager.attachIframe(iframe, childSn);\r\n this.shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (link, childSn) => {\r\n this.stylesheetManager.attachLinkElement(link, childSn);\r\n },\r\n });\r\n if (sn) {\r\n adds.push({\r\n parentId,\r\n nextId,\r\n node: sn,\r\n });\r\n }\r\n };\r\n while (this.mapRemoves.length) {\r\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\r\n }\r\n for (const n of Array.from(this.movedSet.values())) {\r\n if (isParentRemoved(this.removes, n, this.mirror) &&\r\n !this.movedSet.has(n.parentNode)) {\r\n continue;\r\n }\r\n pushAdd(n);\r\n }\r\n for (const n of Array.from(this.addedSet.values())) {\r\n if (!isAncestorInSet(this.droppedSet, n) &&\r\n !isParentRemoved(this.removes, n, this.mirror)) {\r\n pushAdd(n);\r\n }\r\n else if (isAncestorInSet(this.movedSet, n)) {\r\n pushAdd(n);\r\n }\r\n else {\r\n this.droppedSet.add(n);\r\n }\r\n }\r\n let candidate = null;\r\n while (addList.length) {\r\n let node = null;\r\n if (candidate) {\r\n const parentId = this.mirror.getId(candidate.value.parentNode);\r\n const nextId = getNextId(candidate.value);\r\n if (parentId !== -1 && nextId !== -1) {\r\n node = candidate;\r\n }\r\n }\r\n if (!node) {\r\n for (let index = addList.length - 1; index >= 0; index--) {\r\n const _node = addList.get(index);\r\n if (_node) {\r\n const parentId = this.mirror.getId(_node.value.parentNode);\r\n const nextId = getNextId(_node.value);\r\n if (nextId === -1)\r\n continue;\r\n else if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n else {\r\n const unhandledNode = _node.value;\r\n if (unhandledNode.parentNode &&\r\n unhandledNode.parentNode.nodeType ===\r\n Node.DOCUMENT_FRAGMENT_NODE) {\r\n const shadowHost = unhandledNode.parentNode\r\n .host;\r\n const parentId = this.mirror.getId(shadowHost);\r\n if (parentId !== -1) {\r\n node = _node;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (!node) {\r\n while (addList.head) {\r\n addList.removeNode(addList.head.value);\r\n }\r\n break;\r\n }\r\n candidate = node.previous;\r\n addList.removeNode(node.value);\r\n pushAdd(node.value);\r\n }\r\n const payload = {\r\n texts: this.texts\r\n .map((text) => ({\r\n id: this.mirror.getId(text.node),\r\n value: text.value,\r\n }))\r\n .filter((text) => this.mirror.has(text.id)),\r\n attributes: this.attributes\r\n .map((attribute) => ({\r\n id: this.mirror.getId(attribute.node),\r\n attributes: attribute.attributes,\r\n }))\r\n .filter((attribute) => this.mirror.has(attribute.id)),\r\n removes: this.removes,\r\n adds,\r\n };\r\n if (!payload.texts.length &&\r\n !payload.attributes.length &&\r\n !payload.removes.length &&\r\n !payload.adds.length) {\r\n return;\r\n }\r\n this.texts = [];\r\n this.attributes = [];\r\n this.removes = [];\r\n this.addedSet = new Set();\r\n this.movedSet = new Set();\r\n this.droppedSet = new Set();\r\n this.movedMap = {};\r\n this.mutationCb(payload);\r\n };\r\n this.processMutation = (m) => {\r\n if (isIgnored(m.target, this.mirror)) {\r\n return;\r\n }\r\n switch (m.type) {\r\n case 'characterData': {\r\n const value = m.target.textContent;\r\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, false) &&\r\n value !== m.oldValue) {\r\n this.texts.push({\r\n value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector) && value\r\n ? this.maskTextFn\r\n ? this.maskTextFn(value)\r\n : value.replace(/[\\S]/g, '*')\r\n : value,\r\n node: m.target,\r\n });\r\n }\r\n break;\r\n }\r\n case 'attributes': {\r\n const target = m.target;\r\n let value = m.target.getAttribute(m.attributeName);\r\n if (m.attributeName === 'value') {\r\n value = maskInputValue({\r\n maskInputOptions: this.maskInputOptions,\r\n tagName: m.target.tagName,\r\n type: m.target.getAttribute('type'),\r\n value,\r\n maskInputFn: this.maskInputFn,\r\n });\r\n }\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n value === m.oldValue) {\r\n return;\r\n }\r\n let item = this.attributes.find((a) => a.node === m.target);\r\n if (target.tagName === 'IFRAME' &&\r\n m.attributeName === 'src' &&\r\n !this.keepIframeSrcFn(value)) {\r\n if (!target.contentDocument) {\r\n m.attributeName = 'rr_src';\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n if (!item) {\r\n item = {\r\n node: m.target,\r\n attributes: {},\r\n };\r\n this.attributes.push(item);\r\n }\r\n if (m.attributeName === 'style') {\r\n const old = this.doc.createElement('span');\r\n if (m.oldValue) {\r\n old.setAttribute('style', m.oldValue);\r\n }\r\n if (item.attributes.style === undefined ||\r\n item.attributes.style === null) {\r\n item.attributes.style = {};\r\n }\r\n const styleObj = item.attributes.style;\r\n for (const pname of Array.from(target.style)) {\r\n const newValue = target.style.getPropertyValue(pname);\r\n const newPriority = target.style.getPropertyPriority(pname);\r\n if (newValue !== old.style.getPropertyValue(pname) ||\r\n newPriority !== old.style.getPropertyPriority(pname)) {\r\n if (newPriority === '') {\r\n styleObj[pname] = newValue;\r\n }\r\n else {\r\n styleObj[pname] = [newValue, newPriority];\r\n }\r\n }\r\n }\r\n for (const pname of Array.from(old.style)) {\r\n if (target.style.getPropertyValue(pname) === '') {\r\n styleObj[pname] = false;\r\n }\r\n }\r\n }\r\n else {\r\n item.attributes[m.attributeName] = transformAttribute(this.doc, target.tagName, m.attributeName, value);\r\n }\r\n break;\r\n }\r\n case 'childList': {\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, true))\r\n return;\r\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\r\n m.removedNodes.forEach((n) => {\r\n const nodeId = this.mirror.getId(n);\r\n const parentId = isShadowRoot(m.target)\r\n ? this.mirror.getId(m.target.host)\r\n : this.mirror.getId(m.target);\r\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) ||\r\n isIgnored(n, this.mirror) ||\r\n !isSerialized(n, this.mirror)) {\r\n return;\r\n }\r\n if (this.addedSet.has(n)) {\r\n deepDelete(this.addedSet, n);\r\n this.droppedSet.add(n);\r\n }\r\n else if (this.addedSet.has(m.target) && nodeId === -1) ;\r\n else if (isAncestorRemoved(m.target, this.mirror)) ;\r\n else if (this.movedSet.has(n) &&\r\n this.movedMap[moveKey(nodeId, parentId)]) {\r\n deepDelete(this.movedSet, n);\r\n }\r\n else {\r\n this.removes.push({\r\n parentId,\r\n id: nodeId,\r\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\r\n ? true\r\n : undefined,\r\n });\r\n }\r\n this.mapRemoves.push(n);\r\n });\r\n break;\r\n }\r\n }\r\n };\r\n this.genAdds = (n, target) => {\r\n if (this.mirror.hasNode(n)) {\r\n if (isIgnored(n, this.mirror)) {\r\n return;\r\n }\r\n this.movedSet.add(n);\r\n let targetId = null;\r\n if (target && this.mirror.hasNode(target)) {\r\n targetId = this.mirror.getId(target);\r\n }\r\n if (targetId && targetId !== -1) {\r\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\r\n }\r\n }\r\n else {\r\n this.addedSet.add(n);\r\n this.droppedSet.delete(n);\r\n }\r\n if (!isBlocked(n, this.blockClass, this.blockSelector, false))\r\n n.childNodes.forEach((childN) => this.genAdds(childN));\r\n };\r\n }\r\n init(options) {\r\n [\r\n 'mutationCb',\r\n 'blockClass',\r\n 'blockSelector',\r\n 'maskTextClass',\r\n 'maskTextSelector',\r\n 'inlineStylesheet',\r\n 'maskInputOptions',\r\n 'maskTextFn',\r\n 'maskInputFn',\r\n 'keepIframeSrcFn',\r\n 'recordCanvas',\r\n 'inlineImages',\r\n 'slimDOMOptions',\r\n 'dataURLOptions',\r\n 'doc',\r\n 'mirror',\r\n 'iframeManager',\r\n 'stylesheetManager',\r\n 'shadowDomManager',\r\n 'canvasManager',\r\n ].forEach((key) => {\r\n this[key] = options[key];\r\n });\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n this.canvasManager.freeze();\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n this.canvasManager.unfreeze();\r\n this.emit();\r\n }\r\n isFrozen() {\r\n return this.frozen;\r\n }\r\n lock() {\r\n this.locked = true;\r\n this.canvasManager.lock();\r\n }\r\n unlock() {\r\n this.locked = false;\r\n this.canvasManager.unlock();\r\n this.emit();\r\n }\r\n reset() {\r\n this.shadowDomManager.reset();\r\n this.canvasManager.reset();\r\n }\r\n}\r\nfunction deepDelete(addsSet, n) {\r\n addsSet.delete(n);\r\n n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\r\n}\r\nfunction isParentRemoved(removes, n, mirror) {\r\n if (removes.length === 0)\r\n return false;\r\n return _isParentRemoved(removes, n, mirror);\r\n}\r\nfunction _isParentRemoved(removes, n, mirror) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n const parentId = mirror.getId(parentNode);\r\n if (removes.some((r) => r.id === parentId)) {\r\n return true;\r\n }\r\n return _isParentRemoved(removes, parentNode, mirror);\r\n}\r\nfunction isAncestorInSet(set, n) {\r\n if (set.size === 0)\r\n return false;\r\n return _isAncestorInSet(set, n);\r\n}\r\nfunction _isAncestorInSet(set, n) {\r\n const { parentNode } = n;\r\n if (!parentNode) {\r\n return false;\r\n }\r\n if (set.has(parentNode)) {\r\n return true;\r\n }\r\n return _isAncestorInSet(set, parentNode);\r\n}\n\nexport { MutationBuffer as default };\n","import { maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isBlocked, getWindowHeight, getWindowWidth, hookSetter, patch, isTouchEvent } from '../utils.js';\nimport { MouseInteractions, IncrementalSource } from '../../../types/dist/types.js';\nimport MutationBuffer from './mutation.js';\n\nconst mutationBuffers = [];\r\nconst isCSSGroupingRuleSupported = typeof CSSGroupingRule !== 'undefined';\r\nconst isCSSMediaRuleSupported = typeof CSSMediaRule !== 'undefined';\r\nconst isCSSSupportsRuleSupported = typeof CSSSupportsRule !== 'undefined';\r\nconst isCSSConditionRuleSupported = typeof CSSConditionRule !== 'undefined';\r\nfunction getEventTarget(event) {\r\n try {\r\n if ('composedPath' in event) {\r\n const path = event.composedPath();\r\n if (path.length) {\r\n return path[0];\r\n }\r\n }\r\n else if ('path' in event && event.path.length) {\r\n return event.path[0];\r\n }\r\n return event.target;\r\n }\r\n catch (_a) {\r\n return event.target;\r\n }\r\n}\r\nfunction initMutationObserver(options, rootEl) {\r\n var _a, _b;\r\n const mutationBuffer = new MutationBuffer();\r\n mutationBuffers.push(mutationBuffer);\r\n mutationBuffer.init(options);\r\n let mutationObserverCtor = window.MutationObserver ||\r\n window.__rrMutationObserver;\r\n const angularZoneSymbol = (_b = (_a = window === null || window === void 0 ? void 0 : window.Zone) === null || _a === void 0 ? void 0 : _a.__symbol__) === null || _b === void 0 ? void 0 : _b.call(_a, 'MutationObserver');\r\n if (angularZoneSymbol &&\r\n window[angularZoneSymbol]) {\r\n mutationObserverCtor = window[angularZoneSymbol];\r\n }\r\n const observer = new mutationObserverCtor(mutationBuffer.processMutations.bind(mutationBuffer));\r\n observer.observe(rootEl, {\r\n attributes: true,\r\n attributeOldValue: true,\r\n characterData: true,\r\n characterDataOldValue: true,\r\n childList: true,\r\n subtree: true,\r\n });\r\n return observer;\r\n}\r\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\r\n if (sampling.mousemove === false) {\r\n return () => {\r\n };\r\n }\r\n const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\r\n const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\r\n ? sampling.mousemoveCallback\r\n : 500;\r\n let positions = [];\r\n let timeBaseline;\r\n const wrappedCb = throttle((source) => {\r\n const totalOffset = Date.now() - timeBaseline;\r\n mousemoveCb(positions.map((p) => {\r\n p.timeOffset -= totalOffset;\r\n return p;\r\n }), source);\r\n positions = [];\r\n timeBaseline = null;\r\n }, callbackThreshold);\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n const { clientX, clientY } = isTouchEvent(evt)\r\n ? evt.changedTouches[0]\r\n : evt;\r\n if (!timeBaseline) {\r\n timeBaseline = Date.now();\r\n }\r\n positions.push({\r\n x: clientX,\r\n y: clientY,\r\n id: mirror.getId(target),\r\n timeOffset: Date.now() - timeBaseline,\r\n });\r\n wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\r\n ? IncrementalSource.Drag\r\n : evt instanceof MouseEvent\r\n ? IncrementalSource.MouseMove\r\n : IncrementalSource.TouchMove);\r\n }, threshold, {\r\n trailing: false,\r\n });\r\n const handlers = [\r\n on('mousemove', updatePosition, doc),\r\n on('touchmove', updatePosition, doc),\r\n on('drag', updatePosition, doc),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n if (sampling.mouseInteraction === false) {\r\n return () => {\r\n };\r\n }\r\n const disableMap = sampling.mouseInteraction === true ||\r\n sampling.mouseInteraction === undefined\r\n ? {}\r\n : sampling.mouseInteraction;\r\n const handlers = [];\r\n const getHandler = (eventKey) => {\r\n return (event) => {\r\n const target = getEventTarget(event);\r\n if (isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const e = isTouchEvent(event) ? event.changedTouches[0] : event;\r\n if (!e) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n const { clientX, clientY } = e;\r\n mouseInteractionCb({\r\n type: MouseInteractions[eventKey],\r\n id,\r\n x: clientX,\r\n y: clientY,\r\n });\r\n };\r\n };\r\n Object.keys(MouseInteractions)\r\n .filter((key) => Number.isNaN(Number(key)) &&\r\n !key.endsWith('_Departed') &&\r\n disableMap[key] !== false)\r\n .forEach((eventKey) => {\r\n const eventName = eventKey.toLowerCase();\r\n const handler = getHandler(eventKey);\r\n handlers.push(on(eventName, handler, doc));\r\n });\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, sampling, }) {\r\n const updatePosition = throttle((evt) => {\r\n const target = getEventTarget(evt);\r\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const id = mirror.getId(target);\r\n if (target === doc) {\r\n const scrollEl = (doc.scrollingElement || doc.documentElement);\r\n scrollCb({\r\n id,\r\n x: scrollEl.scrollLeft,\r\n y: scrollEl.scrollTop,\r\n });\r\n }\r\n else {\r\n scrollCb({\r\n id,\r\n x: target.scrollLeft,\r\n y: target.scrollTop,\r\n });\r\n }\r\n }, sampling.scroll || 100);\r\n return on('scroll', updatePosition, doc);\r\n}\r\nfunction initViewportResizeObserver({ viewportResizeCb, }) {\r\n let lastH = -1;\r\n let lastW = -1;\r\n const updateDimension = throttle(() => {\r\n const height = getWindowHeight();\r\n const width = getWindowWidth();\r\n if (lastH !== height || lastW !== width) {\r\n viewportResizeCb({\r\n width: Number(width),\r\n height: Number(height),\r\n });\r\n lastH = height;\r\n lastW = width;\r\n }\r\n }, 200);\r\n return on('resize', updateDimension, window);\r\n}\r\nfunction wrapEventWithUserTriggeredFlag(v, enable) {\r\n const value = Object.assign({}, v);\r\n if (!enable)\r\n delete value.userTriggered;\r\n return value;\r\n}\r\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\r\nconst lastInputValueMap = new WeakMap();\r\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, ignoreClass, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, }) {\r\n function eventHandler(event) {\r\n let target = getEventTarget(event);\r\n const userTriggered = event.isTrusted;\r\n if (target && target.tagName === 'OPTION')\r\n target = target.parentElement;\r\n if (!target ||\r\n !target.tagName ||\r\n INPUT_TAGS.indexOf(target.tagName) < 0 ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const type = target.type;\r\n if (target.classList.contains(ignoreClass)) {\r\n return;\r\n }\r\n let text = target.value;\r\n let isChecked = false;\r\n if (type === 'radio' || type === 'checkbox') {\r\n isChecked = target.checked;\r\n }\r\n else if (maskInputOptions[target.tagName.toLowerCase()] ||\r\n maskInputOptions[type]) {\r\n text = maskInputValue({\r\n maskInputOptions,\r\n tagName: target.tagName,\r\n type,\r\n value: text,\r\n maskInputFn,\r\n });\r\n }\r\n cbWithDedup(target, wrapEventWithUserTriggeredFlag({ text, isChecked, userTriggered }, userTriggeredOnInput));\r\n const name = target.name;\r\n if (type === 'radio' && name && isChecked) {\r\n doc\r\n .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\r\n .forEach((el) => {\r\n if (el !== target) {\r\n cbWithDedup(el, wrapEventWithUserTriggeredFlag({\r\n text: el.value,\r\n isChecked: !isChecked,\r\n userTriggered: false,\r\n }, userTriggeredOnInput));\r\n }\r\n });\r\n }\r\n }\r\n function cbWithDedup(target, v) {\r\n const lastInputValue = lastInputValueMap.get(target);\r\n if (!lastInputValue ||\r\n lastInputValue.text !== v.text ||\r\n lastInputValue.isChecked !== v.isChecked) {\r\n lastInputValueMap.set(target, v);\r\n const id = mirror.getId(target);\r\n inputCb(Object.assign(Object.assign({}, v), { id }));\r\n }\r\n }\r\n const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\r\n const handlers = events.map((eventName) => on(eventName, eventHandler, doc));\r\n const currentWindow = doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n }\r\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\r\n const hookProperties = [\r\n [currentWindow.HTMLInputElement.prototype, 'value'],\r\n [currentWindow.HTMLInputElement.prototype, 'checked'],\r\n [currentWindow.HTMLSelectElement.prototype, 'value'],\r\n [currentWindow.HTMLTextAreaElement.prototype, 'value'],\r\n [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\r\n [currentWindow.HTMLOptionElement.prototype, 'selected'],\r\n ];\r\n if (propertyDescriptor && propertyDescriptor.set) {\r\n handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\r\n set() {\r\n eventHandler({ target: this });\r\n },\r\n }, false, currentWindow)));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction getNestedCSSRulePositions(rule) {\r\n const positions = [];\r\n function recurse(childRule, pos) {\r\n if ((isCSSGroupingRuleSupported &&\r\n childRule.parentRule instanceof CSSGroupingRule) ||\r\n (isCSSMediaRuleSupported &&\r\n childRule.parentRule instanceof CSSMediaRule) ||\r\n (isCSSSupportsRuleSupported &&\r\n childRule.parentRule instanceof CSSSupportsRule) ||\r\n (isCSSConditionRuleSupported &&\r\n childRule.parentRule instanceof CSSConditionRule)) {\r\n const rules = Array.from(childRule.parentRule.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n else if (childRule.parentStyleSheet) {\r\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\r\n const index = rules.indexOf(childRule);\r\n pos.unshift(index);\r\n }\r\n return pos;\r\n }\r\n return recurse(rule, positions);\r\n}\r\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\r\n let id, styleId;\r\n if (!sheet)\r\n return {};\r\n if (sheet.ownerNode)\r\n id = mirror.getId(sheet.ownerNode);\r\n else\r\n styleId = styleMirror.getId(sheet);\r\n return {\r\n styleId,\r\n id,\r\n };\r\n}\r\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\r\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\r\n win.CSSStyleSheet.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [{ rule, index }],\r\n });\r\n }\r\n return insertRule.apply(this, [rule, index]);\r\n };\r\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\r\n win.CSSStyleSheet.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [{ index }],\r\n });\r\n }\r\n return deleteRule.apply(this, [index]);\r\n };\r\n let replace;\r\n if (win.CSSStyleSheet.prototype.replace) {\r\n replace = win.CSSStyleSheet.prototype.replace;\r\n win.CSSStyleSheet.prototype.replace = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replace: text,\r\n });\r\n }\r\n return replace.apply(this, [text]);\r\n };\r\n }\r\n let replaceSync;\r\n if (win.CSSStyleSheet.prototype.replaceSync) {\r\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\r\n win.CSSStyleSheet.prototype.replaceSync = function (text) {\r\n const { id, styleId } = getIdAndStyleId(this, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n replaceSync: text,\r\n });\r\n }\r\n return replaceSync.apply(this, [text]);\r\n };\r\n }\r\n const supportedNestedCSSRuleTypes = {};\r\n if (isCSSGroupingRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\r\n }\r\n else {\r\n if (isCSSMediaRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\r\n }\r\n if (isCSSConditionRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\r\n }\r\n if (isCSSSupportsRuleSupported) {\r\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\r\n }\r\n }\r\n const unmodifiedFunctions = {};\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n unmodifiedFunctions[typeKey] = {\r\n insertRule: type.prototype.insertRule,\r\n deleteRule: type.prototype.deleteRule,\r\n };\r\n type.prototype.insertRule = function (rule, index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n adds: [\r\n {\r\n rule,\r\n index: [\r\n ...getNestedCSSRulePositions(this),\r\n index || 0,\r\n ],\r\n },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].insertRule.apply(this, [rule, index]);\r\n };\r\n type.prototype.deleteRule = function (index) {\r\n const { id, styleId } = getIdAndStyleId(this.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleSheetRuleCb({\r\n id,\r\n styleId,\r\n removes: [\r\n { index: [...getNestedCSSRulePositions(this), index] },\r\n ],\r\n });\r\n }\r\n return unmodifiedFunctions[typeKey].deleteRule.apply(this, [index]);\r\n };\r\n });\r\n return () => {\r\n win.CSSStyleSheet.prototype.insertRule = insertRule;\r\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\r\n replace && (win.CSSStyleSheet.prototype.replace = replace);\r\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\r\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\r\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\r\n });\r\n };\r\n}\r\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\r\n var _a, _b, _c;\r\n let hostId = null;\r\n if (host.nodeName === '#document')\r\n hostId = mirror.getId(host);\r\n else\r\n hostId = mirror.getId(host.host);\r\n const patchTarget = host.nodeName === '#document'\r\n ? (_a = host.defaultView) === null || _a === void 0 ? void 0 : _a.Document\r\n : (_c = (_b = host.ownerDocument) === null || _b === void 0 ? void 0 : _b.defaultView) === null || _c === void 0 ? void 0 : _c.ShadowRoot;\r\n const originalPropertyDescriptor = Object.getOwnPropertyDescriptor(patchTarget === null || patchTarget === void 0 ? void 0 : patchTarget.prototype, 'adoptedStyleSheets');\r\n if (hostId === null ||\r\n hostId === -1 ||\r\n !patchTarget ||\r\n !originalPropertyDescriptor)\r\n return () => {\r\n };\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get() {\r\n var _a;\r\n return (_a = originalPropertyDescriptor.get) === null || _a === void 0 ? void 0 : _a.call(this);\r\n },\r\n set(sheets) {\r\n var _a;\r\n const result = (_a = originalPropertyDescriptor.set) === null || _a === void 0 ? void 0 : _a.call(this, sheets);\r\n if (hostId !== null && hostId !== -1) {\r\n try {\r\n stylesheetManager.adoptStyleSheets(sheets, hostId);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n return result;\r\n },\r\n });\r\n return () => {\r\n Object.defineProperty(host, 'adoptedStyleSheets', {\r\n configurable: originalPropertyDescriptor.configurable,\r\n enumerable: originalPropertyDescriptor.enumerable,\r\n get: originalPropertyDescriptor.get,\r\n set: originalPropertyDescriptor.set,\r\n });\r\n };\r\n}\r\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\r\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\r\n win.CSSStyleDeclaration.prototype.setProperty = function (property, value, priority) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return setProperty.apply(this, [property, value, priority]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n set: {\r\n property,\r\n value,\r\n priority,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return setProperty.apply(this, [property, value, priority]);\r\n };\r\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = function (property) {\r\n var _a;\r\n if (ignoreCSSAttributes.has(property)) {\r\n return removeProperty.apply(this, [property]);\r\n }\r\n const { id, styleId } = getIdAndStyleId((_a = this.parentRule) === null || _a === void 0 ? void 0 : _a.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n styleDeclarationCb({\r\n id,\r\n styleId,\r\n remove: {\r\n property,\r\n },\r\n index: getNestedCSSRulePositions(this.parentRule),\r\n });\r\n }\r\n return removeProperty.apply(this, [property]);\r\n };\r\n return () => {\r\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\r\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\r\n };\r\n}\r\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, mirror, sampling, }) {\r\n const handler = (type) => throttle((event) => {\r\n const target = getEventTarget(event);\r\n if (!target ||\r\n isBlocked(target, blockClass, blockSelector, true)) {\r\n return;\r\n }\r\n const { currentTime, volume, muted, playbackRate, } = target;\r\n mediaInteractionCb({\r\n type,\r\n id: mirror.getId(target),\r\n currentTime,\r\n volume,\r\n muted,\r\n playbackRate,\r\n });\r\n }, sampling.media || 500);\r\n const handlers = [\r\n on('play', handler(0)),\r\n on('pause', handler(1)),\r\n on('seeked', handler(2)),\r\n on('volumechange', handler(3)),\r\n on('ratechange', handler(4)),\r\n ];\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initFontObserver({ fontCb, doc }) {\r\n const win = doc.defaultView;\r\n if (!win) {\r\n return () => {\r\n };\r\n }\r\n const handlers = [];\r\n const fontMap = new WeakMap();\r\n const originalFontFace = win.FontFace;\r\n win.FontFace = function FontFace(family, source, descriptors) {\r\n const fontFace = new originalFontFace(family, source, descriptors);\r\n fontMap.set(fontFace, {\r\n family,\r\n buffer: typeof source !== 'string',\r\n descriptors,\r\n fontSource: typeof source === 'string'\r\n ? source\r\n : JSON.stringify(Array.from(new Uint8Array(source))),\r\n });\r\n return fontFace;\r\n };\r\n const restoreHandler = patch(doc.fonts, 'add', function (original) {\r\n return function (fontFace) {\r\n setTimeout(() => {\r\n const p = fontMap.get(fontFace);\r\n if (p) {\r\n fontCb(p);\r\n fontMap.delete(fontFace);\r\n }\r\n }, 0);\r\n return original.apply(this, [fontFace]);\r\n };\r\n });\r\n handlers.push(() => {\r\n win.FontFace = originalFontFace;\r\n });\r\n handlers.push(restoreHandler);\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\r\nfunction initSelectionObserver(param) {\r\n const { doc, mirror, blockClass, blockSelector, selectionCb } = param;\r\n let collapsed = true;\r\n const updateSelection = () => {\r\n const selection = doc.getSelection();\r\n if (!selection || (collapsed && (selection === null || selection === void 0 ? void 0 : selection.isCollapsed)))\r\n return;\r\n collapsed = selection.isCollapsed || false;\r\n const ranges = [];\r\n const count = selection.rangeCount || 0;\r\n for (let i = 0; i < count; i++) {\r\n const range = selection.getRangeAt(i);\r\n const { startContainer, startOffset, endContainer, endOffset } = range;\r\n const blocked = isBlocked(startContainer, blockClass, blockSelector, true) ||\r\n isBlocked(endContainer, blockClass, blockSelector, true);\r\n if (blocked)\r\n continue;\r\n ranges.push({\r\n start: mirror.getId(startContainer),\r\n startOffset,\r\n end: mirror.getId(endContainer),\r\n endOffset,\r\n });\r\n }\r\n selectionCb({ ranges });\r\n };\r\n updateSelection();\r\n return on('selectionchange', updateSelection);\r\n}\r\nfunction mergeHooks(o, hooks) {\r\n const { mutationCb, mousemoveCb, mouseInteractionCb, scrollCb, viewportResizeCb, inputCb, mediaInteractionCb, styleSheetRuleCb, styleDeclarationCb, canvasMutationCb, fontCb, selectionCb, } = o;\r\n o.mutationCb = (...p) => {\r\n if (hooks.mutation) {\r\n hooks.mutation(...p);\r\n }\r\n mutationCb(...p);\r\n };\r\n o.mousemoveCb = (...p) => {\r\n if (hooks.mousemove) {\r\n hooks.mousemove(...p);\r\n }\r\n mousemoveCb(...p);\r\n };\r\n o.mouseInteractionCb = (...p) => {\r\n if (hooks.mouseInteraction) {\r\n hooks.mouseInteraction(...p);\r\n }\r\n mouseInteractionCb(...p);\r\n };\r\n o.scrollCb = (...p) => {\r\n if (hooks.scroll) {\r\n hooks.scroll(...p);\r\n }\r\n scrollCb(...p);\r\n };\r\n o.viewportResizeCb = (...p) => {\r\n if (hooks.viewportResize) {\r\n hooks.viewportResize(...p);\r\n }\r\n viewportResizeCb(...p);\r\n };\r\n o.inputCb = (...p) => {\r\n if (hooks.input) {\r\n hooks.input(...p);\r\n }\r\n inputCb(...p);\r\n };\r\n o.mediaInteractionCb = (...p) => {\r\n if (hooks.mediaInteaction) {\r\n hooks.mediaInteaction(...p);\r\n }\r\n mediaInteractionCb(...p);\r\n };\r\n o.styleSheetRuleCb = (...p) => {\r\n if (hooks.styleSheetRule) {\r\n hooks.styleSheetRule(...p);\r\n }\r\n styleSheetRuleCb(...p);\r\n };\r\n o.styleDeclarationCb = (...p) => {\r\n if (hooks.styleDeclaration) {\r\n hooks.styleDeclaration(...p);\r\n }\r\n styleDeclarationCb(...p);\r\n };\r\n o.canvasMutationCb = (...p) => {\r\n if (hooks.canvasMutation) {\r\n hooks.canvasMutation(...p);\r\n }\r\n canvasMutationCb(...p);\r\n };\r\n o.fontCb = (...p) => {\r\n if (hooks.font) {\r\n hooks.font(...p);\r\n }\r\n fontCb(...p);\r\n };\r\n o.selectionCb = (...p) => {\r\n if (hooks.selection) {\r\n hooks.selection(...p);\r\n }\r\n selectionCb(...p);\r\n };\r\n}\r\nfunction initObservers(o, hooks = {}) {\r\n const currentWindow = o.doc.defaultView;\r\n if (!currentWindow) {\r\n return () => {\r\n };\r\n }\r\n mergeHooks(o, hooks);\r\n const mutationObserver = initMutationObserver(o, o.doc);\r\n const mousemoveHandler = initMoveObserver(o);\r\n const mouseInteractionHandler = initMouseInteractionObserver(o);\r\n const scrollHandler = initScrollObserver(o);\r\n const viewportResizeHandler = initViewportResizeObserver(o);\r\n const inputHandler = initInputObserver(o);\r\n const mediaInteractionHandler = initMediaInteractionObserver(o);\r\n const styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\r\n const adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\r\n const styleDeclarationObserver = initStyleDeclarationObserver(o, {\r\n win: currentWindow,\r\n });\r\n const fontObserver = o.collectFonts\r\n ? initFontObserver(o)\r\n : () => {\r\n };\r\n const selectionObserver = initSelectionObserver(o);\r\n const pluginHandlers = [];\r\n for (const plugin of o.plugins) {\r\n pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\r\n }\r\n return () => {\r\n mutationBuffers.forEach((b) => b.reset());\r\n mutationObserver.disconnect();\r\n mousemoveHandler();\r\n mouseInteractionHandler();\r\n scrollHandler();\r\n viewportResizeHandler();\r\n inputHandler();\r\n mediaInteractionHandler();\r\n styleSheetObserver();\r\n adoptedStyleSheetObserver();\r\n styleDeclarationObserver();\r\n fontObserver();\r\n selectionObserver();\r\n pluginHandlers.forEach((h) => h());\r\n };\r\n}\n\nexport { INPUT_TAGS, initAdoptedStyleSheetObserver, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","class CrossOriginIframeMirror {\r\n constructor(generateIdFn) {\r\n this.generateIdFn = generateIdFn;\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n }\r\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\r\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\r\n let id = idToRemoteIdMap.get(remoteId);\r\n if (!id) {\r\n id = this.generateIdFn();\r\n idToRemoteIdMap.set(remoteId, id);\r\n remoteIdToIdMap.set(id, remoteId);\r\n }\r\n return id;\r\n }\r\n getIds(iframe, remoteId) {\r\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\r\n }\r\n getRemoteId(iframe, id, map) {\r\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\r\n if (typeof id !== 'number')\r\n return id;\r\n const remoteId = remoteIdToIdMap.get(id);\r\n if (!remoteId)\r\n return -1;\r\n return remoteId;\r\n }\r\n getRemoteIds(iframe, ids) {\r\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\r\n }\r\n reset(iframe) {\r\n if (!iframe) {\r\n this.iframeIdToRemoteIdMap = new WeakMap();\r\n this.iframeRemoteIdToIdMap = new WeakMap();\r\n return;\r\n }\r\n this.iframeIdToRemoteIdMap.delete(iframe);\r\n this.iframeRemoteIdToIdMap.delete(iframe);\r\n }\r\n getIdToRemoteIdMap(iframe) {\r\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\r\n if (!idToRemoteIdMap) {\r\n idToRemoteIdMap = new Map();\r\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\r\n }\r\n return idToRemoteIdMap;\r\n }\r\n getRemoteIdToIdMap(iframe) {\r\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\r\n if (!remoteIdToIdMap) {\r\n remoteIdToIdMap = new Map();\r\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\r\n }\r\n return remoteIdToIdMap;\r\n }\r\n}\n\nexport { CrossOriginIframeMirror as default };\n","import { genId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport CrossOriginIframeMirror from './cross-origin-iframe-mirror.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\n\nclass IframeManager {\r\n constructor(options) {\r\n this.iframes = new WeakMap();\r\n this.crossOriginIframeMap = new WeakMap();\r\n this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n this.mutationCb = options.mutationCb;\r\n this.wrappedEmit = options.wrappedEmit;\r\n this.stylesheetManager = options.stylesheetManager;\r\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\r\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\r\n this.mirror = options.mirror;\r\n if (this.recordCrossOriginIframes) {\r\n window.addEventListener('message', this.handleMessage.bind(this));\r\n }\r\n }\r\n addIframe(iframeEl) {\r\n this.iframes.set(iframeEl, true);\r\n if (iframeEl.contentWindow)\r\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\r\n }\r\n addLoadListener(cb) {\r\n this.loadListener = cb;\r\n }\r\n attachIframe(iframeEl, childSn) {\r\n var _a;\r\n this.mutationCb({\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: childSn,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n });\r\n (_a = this.loadListener) === null || _a === void 0 ? void 0 : _a.call(this, iframeEl);\r\n if (iframeEl.contentDocument &&\r\n iframeEl.contentDocument.adoptedStyleSheets &&\r\n iframeEl.contentDocument.adoptedStyleSheets.length > 0)\r\n this.stylesheetManager.adoptStyleSheets(iframeEl.contentDocument.adoptedStyleSheets, this.mirror.getId(iframeEl.contentDocument));\r\n }\r\n handleMessage(message) {\r\n if (message.data.type === 'rrweb') {\r\n const iframeSourceWindow = message.source;\r\n if (!iframeSourceWindow)\r\n return;\r\n const iframeEl = this.crossOriginIframeMap.get(message.source);\r\n if (!iframeEl)\r\n return;\r\n const transformedEvent = this.transformCrossOriginEvent(iframeEl, message.data.event);\r\n if (transformedEvent)\r\n this.wrappedEmit(transformedEvent, message.data.isCheckout);\r\n }\r\n }\r\n transformCrossOriginEvent(iframeEl, e) {\r\n var _a;\r\n switch (e.type) {\r\n case EventType.FullSnapshot: {\r\n this.crossOriginIframeMirror.reset(iframeEl);\r\n this.crossOriginIframeStyleMirror.reset(iframeEl);\r\n this.replaceIdOnNode(e.data.node, iframeEl);\r\n return {\r\n timestamp: e.timestamp,\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source: IncrementalSource.Mutation,\r\n adds: [\r\n {\r\n parentId: this.mirror.getId(iframeEl),\r\n nextId: null,\r\n node: e.data.node,\r\n },\r\n ],\r\n removes: [],\r\n texts: [],\r\n attributes: [],\r\n isAttachIframe: true,\r\n },\r\n };\r\n }\r\n case EventType.Meta:\r\n case EventType.Load:\r\n case EventType.DomContentLoaded: {\r\n return false;\r\n }\r\n case EventType.Plugin: {\r\n return e;\r\n }\r\n case EventType.Custom: {\r\n this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\r\n return e;\r\n }\r\n case EventType.IncrementalSnapshot: {\r\n switch (e.data.source) {\r\n case IncrementalSource.Mutation: {\r\n e.data.adds.forEach((n) => {\r\n this.replaceIds(n, iframeEl, [\r\n 'parentId',\r\n 'nextId',\r\n 'previousId',\r\n ]);\r\n this.replaceIdOnNode(n.node, iframeEl);\r\n });\r\n e.data.removes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['parentId', 'id']);\r\n });\r\n e.data.attributes.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n e.data.texts.forEach((n) => {\r\n this.replaceIds(n, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.Drag:\r\n case IncrementalSource.TouchMove:\r\n case IncrementalSource.MouseMove: {\r\n e.data.positions.forEach((p) => {\r\n this.replaceIds(p, iframeEl, ['id']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.ViewportResize: {\r\n return false;\r\n }\r\n case IncrementalSource.MediaInteraction:\r\n case IncrementalSource.MouseInteraction:\r\n case IncrementalSource.Scroll:\r\n case IncrementalSource.CanvasMutation:\r\n case IncrementalSource.Input: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n return e;\r\n }\r\n case IncrementalSource.StyleSheetRule:\r\n case IncrementalSource.StyleDeclaration: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleId']);\r\n return e;\r\n }\r\n case IncrementalSource.Font: {\r\n return e;\r\n }\r\n case IncrementalSource.Selection: {\r\n e.data.ranges.forEach((range) => {\r\n this.replaceIds(range, iframeEl, ['start', 'end']);\r\n });\r\n return e;\r\n }\r\n case IncrementalSource.AdoptedStyleSheet: {\r\n this.replaceIds(e.data, iframeEl, ['id']);\r\n this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\r\n (_a = e.data.styles) === null || _a === void 0 ? void 0 : _a.forEach((style) => {\r\n this.replaceStyleIds(style, iframeEl, ['styleId']);\r\n });\r\n return e;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n replace(iframeMirror, obj, iframeEl, keys) {\r\n for (const key of keys) {\r\n if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\r\n continue;\r\n if (Array.isArray(obj[key])) {\r\n obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\r\n }\r\n else {\r\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\r\n }\r\n }\r\n return obj;\r\n }\r\n replaceIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\r\n }\r\n replaceStyleIds(obj, iframeEl, keys) {\r\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\r\n }\r\n replaceIdOnNode(node, iframeEl) {\r\n this.replaceIds(node, iframeEl, ['id']);\r\n if ('childNodes' in node) {\r\n node.childNodes.forEach((child) => {\r\n this.replaceIdOnNode(child, iframeEl);\r\n });\r\n }\r\n }\r\n}\n\nexport { IframeManager };\n","import { initMutationObserver, initScrollObserver, initAdoptedStyleSheetObserver } from './observer.js';\nimport { patch } from '../utils.js';\nimport { isNativeShadowDom } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nclass ShadowDomManager {\r\n constructor(options) {\r\n this.shadowDoms = new WeakSet();\r\n this.restorePatches = [];\r\n this.mutationCb = options.mutationCb;\r\n this.scrollCb = options.scrollCb;\r\n this.bypassOptions = options.bypassOptions;\r\n this.mirror = options.mirror;\r\n const manager = this;\r\n this.restorePatches.push(patch(Element.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, this.ownerDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n addShadowRoot(shadowRoot, doc) {\r\n if (!isNativeShadowDom(shadowRoot))\r\n return;\r\n if (this.shadowDoms.has(shadowRoot))\r\n return;\r\n this.shadowDoms.add(shadowRoot);\r\n initMutationObserver(Object.assign(Object.assign({}, this.bypassOptions), { doc, mutationCb: this.mutationCb, mirror: this.mirror, shadowDomManager: this }), shadowRoot);\r\n initScrollObserver(Object.assign(Object.assign({}, this.bypassOptions), { scrollCb: this.scrollCb, doc: shadowRoot, mirror: this.mirror }));\r\n setTimeout(() => {\r\n if (shadowRoot.adoptedStyleSheets &&\r\n shadowRoot.adoptedStyleSheets.length > 0)\r\n this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\r\n initAdoptedStyleSheetObserver({\r\n mirror: this.mirror,\r\n stylesheetManager: this.bypassOptions.stylesheetManager,\r\n }, shadowRoot);\r\n }, 0);\r\n }\r\n observeAttachShadow(iframeElement) {\r\n if (iframeElement.contentWindow) {\r\n const manager = this;\r\n this.restorePatches.push(patch(iframeElement.contentWindow.HTMLElement.prototype, 'attachShadow', function (original) {\r\n return function (option) {\r\n const shadowRoot = original.call(this, option);\r\n if (this.shadowRoot)\r\n manager.addShadowRoot(this.shadowRoot, iframeElement.contentDocument);\r\n return shadowRoot;\r\n };\r\n }));\r\n }\r\n }\r\n reset() {\r\n this.restorePatches.forEach((restorePatch) => restorePatch());\r\n this.shadowDoms = new WeakSet();\r\n }\r\n}\n\nexport { ShadowDomManager };\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\n\nexport { __awaiter, __rest };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nvar decode = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n\nexport { decode, encode };\n","import { encode } from './../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';\n\nconst canvasVarMap = new Map();\r\nfunction variableListFor(ctx, ctor) {\r\n let contextMap = canvasVarMap.get(ctx);\r\n if (!contextMap) {\r\n contextMap = new Map();\r\n canvasVarMap.set(ctx, contextMap);\r\n }\r\n if (!contextMap.has(ctor)) {\r\n contextMap.set(ctor, []);\r\n }\r\n return contextMap.get(ctor);\r\n}\r\nconst saveWebGLVar = (value, win, ctx) => {\r\n if (!value ||\r\n !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))\r\n return;\r\n const name = value.constructor.name;\r\n const list = variableListFor(ctx, name);\r\n let index = list.indexOf(value);\r\n if (index === -1) {\r\n index = list.length;\r\n list.push(value);\r\n }\r\n return index;\r\n};\r\nfunction serializeArg(value, win, ctx) {\r\n if (value instanceof Array) {\r\n return value.map((arg) => serializeArg(arg, win, ctx));\r\n }\r\n else if (value === null) {\r\n return value;\r\n }\r\n else if (value instanceof Float32Array ||\r\n value instanceof Float64Array ||\r\n value instanceof Int32Array ||\r\n value instanceof Uint32Array ||\r\n value instanceof Uint8Array ||\r\n value instanceof Uint16Array ||\r\n value instanceof Int16Array ||\r\n value instanceof Int8Array ||\r\n value instanceof Uint8ClampedArray) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [Object.values(value)],\r\n };\r\n }\r\n else if (value instanceof ArrayBuffer) {\r\n const name = value.constructor.name;\r\n const base64 = encode(value);\r\n return {\r\n rr_type: name,\r\n base64,\r\n };\r\n }\r\n else if (value instanceof DataView) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [\r\n serializeArg(value.buffer, win, ctx),\r\n value.byteOffset,\r\n value.byteLength,\r\n ],\r\n };\r\n }\r\n else if (value instanceof HTMLImageElement) {\r\n const name = value.constructor.name;\r\n const { src } = value;\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof HTMLCanvasElement) {\r\n const name = 'HTMLImageElement';\r\n const src = value.toDataURL();\r\n return {\r\n rr_type: name,\r\n src,\r\n };\r\n }\r\n else if (value instanceof ImageData) {\r\n const name = value.constructor.name;\r\n return {\r\n rr_type: name,\r\n args: [serializeArg(value.data, win, ctx), value.width, value.height],\r\n };\r\n }\r\n else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {\r\n const name = value.constructor.name;\r\n const index = saveWebGLVar(value, win, ctx);\r\n return {\r\n rr_type: name,\r\n index: index,\r\n };\r\n }\r\n return value;\r\n}\r\nconst serializeArgs = (args, win, ctx) => {\r\n return [...args].map((arg) => serializeArg(arg, win, ctx));\r\n};\r\nconst isInstanceOfWebGLObject = (value, win) => {\r\n const webGLConstructorNames = [\r\n 'WebGLActiveInfo',\r\n 'WebGLBuffer',\r\n 'WebGLFramebuffer',\r\n 'WebGLProgram',\r\n 'WebGLRenderbuffer',\r\n 'WebGLShader',\r\n 'WebGLShaderPrecisionFormat',\r\n 'WebGLTexture',\r\n 'WebGLUniformLocation',\r\n 'WebGLVertexArrayObject',\r\n 'WebGLVertexArrayObjectOES',\r\n ];\r\n const supportedWebGLConstructorNames = webGLConstructorNames.filter((name) => typeof win[name] === 'function');\r\n return Boolean(supportedWebGLConstructorNames.find((name) => value instanceof win[name]));\r\n};\n\nexport { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { serializeArgs } from './serialize-args.js';\n\nfunction initCanvas2DMutationObserver(cb, win, blockClass, blockSelector) {\r\n const handlers = [];\r\n const props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);\r\n for (const prop of props2D) {\r\n try {\r\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {\r\n return function (...args) {\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n setTimeout(() => {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: recordArgs,\r\n });\r\n }, 0);\r\n }\r\n return original.apply(this, args);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type: CanvasContext['2D'],\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvas2DMutationObserver as default };\n","import { patch, isBlocked } from '../../../utils.js';\n\nfunction initCanvasContextObserver(win, blockClass, blockSelector) {\r\n const handlers = [];\r\n try {\r\n const restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {\r\n return function (contextType, ...args) {\r\n if (!isBlocked(this, blockClass, blockSelector, true)) {\r\n if (!('__context' in this))\r\n this.__context = contextType;\r\n }\r\n return original.apply(this, [contextType, ...args]);\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n console.error('failed to patch HTMLCanvasElement.prototype.getContext');\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasContextObserver as default };\n","import { CanvasContext } from '../../../../../types/dist/types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { saveWebGLVar, serializeArgs } from './serialize-args.js';\n\nfunction patchGLPrototype(prototype, type, cb, blockClass, blockSelector, mirror, win) {\r\n const handlers = [];\r\n const props = Object.getOwnPropertyNames(prototype);\r\n for (const prop of props) {\r\n if ([\r\n 'isContextLost',\r\n 'canvas',\r\n 'drawingBufferWidth',\r\n 'drawingBufferHeight',\r\n ].includes(prop)) {\r\n continue;\r\n }\r\n try {\r\n if (typeof prototype[prop] !== 'function') {\r\n continue;\r\n }\r\n const restoreHandler = patch(prototype, prop, function (original) {\r\n return function (...args) {\r\n const result = original.apply(this, args);\r\n saveWebGLVar(result, win, this);\r\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\r\n const recordArgs = serializeArgs([...args], win, this);\r\n const mutation = {\r\n type,\r\n property: prop,\r\n args: recordArgs,\r\n };\r\n cb(this.canvas, mutation);\r\n }\r\n return result;\r\n };\r\n });\r\n handlers.push(restoreHandler);\r\n }\r\n catch (_a) {\r\n const hookHandler = hookSetter(prototype, prop, {\r\n set(v) {\r\n cb(this.canvas, {\r\n type,\r\n property: prop,\r\n args: [v],\r\n setter: true,\r\n });\r\n },\r\n });\r\n handlers.push(hookHandler);\r\n }\r\n }\r\n return handlers;\r\n}\r\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector, mirror) {\r\n const handlers = [];\r\n handlers.push(...patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, blockSelector, mirror, win));\r\n if (typeof win.WebGL2RenderingContext !== 'undefined') {\r\n handlers.push(...patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, blockSelector, mirror, win));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n };\r\n}\n\nexport { initCanvasWebGLMutationObserver as default };\n","var WorkerClass = null;\n\ntry {\n var WorkerThreads =\n typeof module !== 'undefined' && typeof module.require === 'function' && module.require('worker_threads') ||\n typeof __non_webpack_require__ === 'function' && __non_webpack_require__('worker_threads') ||\n typeof require === 'function' && require('worker_threads');\n WorkerClass = WorkerThreads.Worker;\n} catch(e) {} // eslint-disable-line\n\nexport { WorkerClass };\n","import { WorkerClass } from './_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js';\n\nfunction decodeBase64(base64, enableUnicode) {\n return Buffer.from(base64, 'base64').toString(enableUnicode ? 'utf16' : 'utf8');\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n return function WorkerFactory(options) {\n return new WorkerClass(body, Object.assign({}, options, { eval: true }));\n };\n}\n\nexport { createBase64WorkerFactory };\n","function decodeBase64(base64, enableUnicode) {\n var binaryString = atob(base64);\n if (enableUnicode) {\n var binaryView = new Uint8Array(binaryString.length);\n for (var i = 0, n = binaryString.length; i < n; ++i) {\n binaryView[i] = binaryString.charCodeAt(i);\n }\n return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));\n }\n return binaryString;\n}\n\nfunction createURL(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n var blob = new Blob([body], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var url;\n return function WorkerFactory(options) {\n url = url || createURL(base64, sourcemapArg, enableUnicodeArg);\n return new Worker(url, options);\n };\n}\n\nexport { createBase64WorkerFactory };\n","var kIsNodeJS = Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n\nfunction isNodeJS() {\n return kIsNodeJS;\n}\n\nexport { isNodeJS };\n","import { createBase64WorkerFactory as createBase64WorkerFactory$1 } from './_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js';\nimport { createBase64WorkerFactory as createBase64WorkerFactory$2 } from './_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js';\nimport { isNodeJS } from './_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js';\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n if (isNodeJS()) {\n return createBase64WorkerFactory$1(base64, sourcemapArg, enableUnicodeArg);\n }\n return createBase64WorkerFactory$2(base64, sourcemapArg, enableUnicodeArg);\n}\n\nexport { createBase64WorkerFactory };\n","import { createBase64WorkerFactory } from './_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js';\n\nvar WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9CgogICAgLyoKICAgICAqIGJhc2U2NC1hcnJheWJ1ZmZlciAxLjAuMSA8aHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcj4KICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBOaWtsYXMgdm9uIEhlcnR6ZW4gPGh0dHBzOi8vaGVydHplbi5jb20+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgTGljZW5zZQogICAgICovCiAgICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguCiAgICB2YXIgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgewogICAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7CiAgICB9CiAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7CiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykgewogICAgICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTsKICAgICAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07CiAgICAgICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107CiAgICAgICAgfQogICAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2U2NDsKICAgIH07CgogICAgY29uc3QgbGFzdEJsb2JNYXAgPSBuZXcgTWFwKCk7DQogICAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gbmV3IE1hcCgpOw0KICAgIGZ1bmN0aW9uIGdldFRyYW5zcGFyZW50QmxvYkZvcih3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucykgew0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgew0KICAgICAgICAgICAgY29uc3QgaWQgPSBgJHt3aWR0aH0tJHtoZWlnaHR9YDsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW50QmxvYk1hcC5oYXMoaWQpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwYXJlbnRCbG9iTWFwLmdldChpZCk7DQogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsNCiAgICAgICAgICAgICAgICBvZmZzY3JlZW4uZ2V0Q29udGV4dCgnMmQnKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0geWllbGQgYmxvYi5hcnJheUJ1ZmZlcigpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGVuY29kZShhcnJheUJ1ZmZlcik7DQogICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQogICAgY29uc3Qgd29ya2VyID0gc2VsZjsNCiAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsNCiAgICAgICAgICAgIGlmICgnT2Zmc2NyZWVuQ2FudmFzJyBpbiBnbG9iYWxUaGlzKSB7DQogICAgICAgICAgICAgICAgY29uc3QgeyBpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOw0KICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zcGFyZW50QmFzZTY0ID0gZ2V0VHJhbnNwYXJlbnRCbG9iRm9yKHdpZHRoLCBoZWlnaHQsIGRhdGFVUkxPcHRpb25zKTsNCiAgICAgICAgICAgICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBiaXRtYXAuY2xvc2UoKTsNCiAgICAgICAgICAgICAgICBjb25zdCBibG9iID0geWllbGQgb2Zmc2NyZWVuLmNvbnZlcnRUb0Jsb2IoZGF0YVVSTE9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7DQogICAgICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSB5aWVsZCBibG9iLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0ID0gZW5jb2RlKGFycmF5QnVmZmVyKTsNCiAgICAgICAgICAgICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgKHlpZWxkIHRyYW5zcGFyZW50QmFzZTY0KSA9PT0gYmFzZTY0KSB7DQogICAgICAgICAgICAgICAgICAgIGxhc3RCbG9iTWFwLnNldChpZCwgYmFzZTY0KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5wb3N0TWVzc2FnZSh7IGlkIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAobGFzdEJsb2JNYXAuZ2V0KGlkKSA9PT0gYmFzZTY0KQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQgfSk7DQogICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgaWQsDQogICAgICAgICAgICAgICAgICAgIHR5cGUsDQogICAgICAgICAgICAgICAgICAgIGJhc2U2NCwNCiAgICAgICAgICAgICAgICAgICAgd2lkdGgsDQogICAgICAgICAgICAgICAgICAgIGhlaWdodCwNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBsYXN0QmxvYk1hcC5zZXQoaWQsIGJhc2U2NCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfTsKCn0pKCk7Cgo=', null, false);\n/* eslint-enable */\n\nexport { WorkerFactory as default };\n","import { __rest, __awaiter } from './../../../../../../ext/tslib/tslib.es6.js';\nimport { isBlocked } from '../../../utils.js';\nimport { CanvasContext } from '../../../../../types/dist/types.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\nimport WorkerFactory from '../../../../../../_virtual/image-bitmap-data-url-worker.js';\n\nclass CanvasManager {\r\n constructor(options) {\r\n this.pendingCanvasMutations = new Map();\r\n this.rafStamps = { latestId: 0, invokeId: null };\r\n this.frozen = false;\r\n this.locked = false;\r\n this.processMutation = (target, mutation) => {\r\n const newFrame = this.rafStamps.invokeId &&\r\n this.rafStamps.latestId !== this.rafStamps.invokeId;\r\n if (newFrame || !this.rafStamps.invokeId)\r\n this.rafStamps.invokeId = this.rafStamps.latestId;\r\n if (!this.pendingCanvasMutations.has(target)) {\r\n this.pendingCanvasMutations.set(target, []);\r\n }\r\n this.pendingCanvasMutations.get(target).push(mutation);\r\n };\r\n const { sampling = 'all', win, blockClass, blockSelector, recordCanvas, dataURLOptions, } = options;\r\n this.mutationCb = options.mutationCb;\r\n this.mirror = options.mirror;\r\n if (recordCanvas && sampling === 'all')\r\n this.initCanvasMutationObserver(win, blockClass, blockSelector);\r\n if (recordCanvas && typeof sampling === 'number')\r\n this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, {\r\n dataURLOptions,\r\n });\r\n }\r\n reset() {\r\n this.pendingCanvasMutations.clear();\r\n this.resetObservers && this.resetObservers();\r\n }\r\n freeze() {\r\n this.frozen = true;\r\n }\r\n unfreeze() {\r\n this.frozen = false;\r\n }\r\n lock() {\r\n this.locked = true;\r\n }\r\n unlock() {\r\n this.locked = false;\r\n }\r\n initCanvasFPSObserver(fps, win, blockClass, blockSelector, options) {\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const snapshotInProgressMap = new Map();\r\n const worker = new WorkerFactory();\r\n worker.onmessage = (e) => {\r\n const { id } = e.data;\r\n snapshotInProgressMap.set(id, false);\r\n if (!('base64' in e.data))\r\n return;\r\n const { base64, type, width, height } = e.data;\r\n this.mutationCb({\r\n id,\r\n type: CanvasContext['2D'],\r\n commands: [\r\n {\r\n property: 'clearRect',\r\n args: [0, 0, width, height],\r\n },\r\n {\r\n property: 'drawImage',\r\n args: [\r\n {\r\n rr_type: 'ImageBitmap',\r\n args: [\r\n {\r\n rr_type: 'Blob',\r\n data: [{ rr_type: 'ArrayBuffer', base64 }],\r\n type,\r\n },\r\n ],\r\n },\r\n 0,\r\n 0,\r\n ],\r\n },\r\n ],\r\n });\r\n };\r\n const timeBetweenSnapshots = 1000 / fps;\r\n let lastSnapshotTime = 0;\r\n let rafId;\r\n const getCanvas = () => {\r\n const matchedCanvas = [];\r\n win.document.querySelectorAll('canvas').forEach((canvas) => {\r\n if (!isBlocked(canvas, blockClass, blockSelector, true)) {\r\n matchedCanvas.push(canvas);\r\n }\r\n });\r\n return matchedCanvas;\r\n };\r\n const takeCanvasSnapshots = (timestamp) => {\r\n if (lastSnapshotTime &&\r\n timestamp - lastSnapshotTime < timeBetweenSnapshots) {\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n return;\r\n }\r\n lastSnapshotTime = timestamp;\r\n getCanvas()\r\n .forEach((canvas) => __awaiter(this, void 0, void 0, function* () {\r\n var _a;\r\n const id = this.mirror.getId(canvas);\r\n if (snapshotInProgressMap.get(id))\r\n return;\r\n snapshotInProgressMap.set(id, true);\r\n if (['webgl', 'webgl2'].includes(canvas.__context)) {\r\n const context = canvas.getContext(canvas.__context);\r\n if (((_a = context === null || context === void 0 ? void 0 : context.getContextAttributes()) === null || _a === void 0 ? void 0 : _a.preserveDrawingBuffer) === false) {\r\n context === null || context === void 0 ? void 0 : context.clear(context.COLOR_BUFFER_BIT);\r\n }\r\n }\r\n const bitmap = yield createImageBitmap(canvas);\r\n worker.postMessage({\r\n id,\r\n bitmap,\r\n width: canvas.width,\r\n height: canvas.height,\r\n dataURLOptions: options.dataURLOptions,\r\n }, [bitmap]);\r\n }));\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n };\r\n rafId = requestAnimationFrame(takeCanvasSnapshots);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n cancelAnimationFrame(rafId);\r\n };\r\n }\r\n initCanvasMutationObserver(win, blockClass, blockSelector) {\r\n this.startRAFTimestamping();\r\n this.startPendingCanvasMutationFlusher();\r\n const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector);\r\n const canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector);\r\n const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, this.mirror);\r\n this.resetObservers = () => {\r\n canvasContextReset();\r\n canvas2DReset();\r\n canvasWebGL1and2Reset();\r\n };\r\n }\r\n startPendingCanvasMutationFlusher() {\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n startRAFTimestamping() {\r\n const setLatestRAFTimestamp = (timestamp) => {\r\n this.rafStamps.latestId = timestamp;\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n };\r\n requestAnimationFrame(setLatestRAFTimestamp);\r\n }\r\n flushPendingCanvasMutations() {\r\n this.pendingCanvasMutations.forEach((values, canvas) => {\r\n const id = this.mirror.getId(canvas);\r\n this.flushPendingCanvasMutationFor(canvas, id);\r\n });\r\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n }\r\n flushPendingCanvasMutationFor(canvas, id) {\r\n if (this.frozen || this.locked) {\r\n return;\r\n }\r\n const valuesWithType = this.pendingCanvasMutations.get(canvas);\r\n if (!valuesWithType || id === -1)\r\n return;\r\n const values = valuesWithType.map((value) => {\r\n const rest = __rest(value, [\"type\"]);\r\n return rest;\r\n });\r\n const { type } = valuesWithType[0];\r\n this.mutationCb({ id, type, commands: values });\r\n this.pendingCanvasMutations.delete(canvas);\r\n }\r\n}\n\nexport { CanvasManager };\n","import { getCssRuleString } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { StyleSheetMirror } from '../utils.js';\n\nclass StylesheetManager {\r\n constructor(options) {\r\n this.trackedLinkElements = new WeakSet();\r\n this.styleMirror = new StyleSheetMirror();\r\n this.mutationCb = options.mutationCb;\r\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\r\n }\r\n attachLinkElement(linkEl, childSn) {\r\n if ('_cssText' in childSn.attributes)\r\n this.mutationCb({\r\n adds: [],\r\n removes: [],\r\n texts: [],\r\n attributes: [\r\n {\r\n id: childSn.id,\r\n attributes: childSn\r\n .attributes,\r\n },\r\n ],\r\n });\r\n this.trackLinkElement(linkEl);\r\n }\r\n trackLinkElement(linkEl) {\r\n if (this.trackedLinkElements.has(linkEl))\r\n return;\r\n this.trackedLinkElements.add(linkEl);\r\n this.trackStylesheetInLinkElement(linkEl);\r\n }\r\n adoptStyleSheets(sheets, hostId) {\r\n if (sheets.length === 0)\r\n return;\r\n const adoptedStyleSheetData = {\r\n id: hostId,\r\n styleIds: [],\r\n };\r\n const styles = [];\r\n for (const sheet of sheets) {\r\n let styleId;\r\n if (!this.styleMirror.has(sheet)) {\r\n styleId = this.styleMirror.add(sheet);\r\n const rules = Array.from(sheet.rules || CSSRule);\r\n styles.push({\r\n styleId,\r\n rules: rules.map((r, index) => {\r\n return {\r\n rule: getCssRuleString(r),\r\n index,\r\n };\r\n }),\r\n });\r\n }\r\n else\r\n styleId = this.styleMirror.getId(sheet);\r\n adoptedStyleSheetData.styleIds.push(styleId);\r\n }\r\n if (styles.length > 0)\r\n adoptedStyleSheetData.styles = styles;\r\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\r\n }\r\n reset() {\r\n this.styleMirror.reset();\r\n this.trackedLinkElements = new WeakSet();\r\n }\r\n trackStylesheetInLinkElement(linkEl) {\r\n }\r\n}\n\nexport { StylesheetManager };\n","import { createMirror, snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, getWindowWidth, getWindowHeight, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/types.js';\nimport { IframeManager } from './iframe-manager.js';\nimport { ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManager } from './observers/canvas/canvas-manager.js';\nimport { StylesheetManager } from './stylesheet-manager.js';\n\nfunction wrapEvent(e) {\r\n return Object.assign(Object.assign({}, e), { timestamp: Date.now() });\r\n}\r\nlet wrappedEmit;\r\nlet takeFullSnapshot;\r\nlet canvasManager;\r\nlet recording = false;\r\nconst mirror = createMirror();\r\nfunction record(options = {}) {\r\n const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, ignoreClass = 'rr-ignore', maskTextClass = 'rr-mask', maskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskInputFn, maskTextFn, hooks, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordCanvas = false, recordCrossOriginIframes = false, userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), } = options;\r\n const inEmittingFrame = recordCrossOriginIframes\r\n ? window.parent === window\r\n : true;\r\n let passEmitsToParent = false;\r\n if (!inEmittingFrame) {\r\n try {\r\n window.parent.document;\r\n passEmitsToParent = false;\r\n }\r\n catch (e) {\r\n passEmitsToParent = true;\r\n }\r\n }\r\n if (inEmittingFrame && !emit) {\r\n throw new Error('emit function is required');\r\n }\r\n if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\r\n sampling.mousemove = mousemoveWait;\r\n }\r\n mirror.reset();\r\n const maskInputOptions = maskAllInputs === true\r\n ? {\r\n color: true,\r\n date: true,\r\n 'datetime-local': true,\r\n email: true,\r\n month: true,\r\n number: true,\r\n range: true,\r\n search: true,\r\n tel: true,\r\n text: true,\r\n time: true,\r\n url: true,\r\n week: true,\r\n textarea: true,\r\n select: true,\r\n password: true,\r\n }\r\n : _maskInputOptions !== undefined\r\n ? _maskInputOptions\r\n : { password: true };\r\n const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\r\n ? {\r\n script: true,\r\n comment: true,\r\n headFavicon: true,\r\n headWhitespace: true,\r\n headMetaSocial: true,\r\n headMetaRobots: true,\r\n headMetaHttpEquiv: true,\r\n headMetaVerification: true,\r\n headMetaAuthorship: _slimDOMOptions === 'all',\r\n headMetaDescKeywords: _slimDOMOptions === 'all',\r\n }\r\n : _slimDOMOptions\r\n ? _slimDOMOptions\r\n : {};\r\n polyfill();\r\n let lastFullSnapshotEvent;\r\n let incrementalSnapshotCount = 0;\r\n const eventProcessor = (e) => {\r\n for (const plugin of plugins || []) {\r\n if (plugin.eventProcessor) {\r\n e = plugin.eventProcessor(e);\r\n }\r\n }\r\n if (packFn) {\r\n e = packFn(e);\r\n }\r\n return e;\r\n };\r\n wrappedEmit = (e, isCheckout) => {\r\n var _a;\r\n if (((_a = mutationBuffers[0]) === null || _a === void 0 ? void 0 : _a.isFrozen()) &&\r\n e.type !== EventType.FullSnapshot &&\r\n !(e.type === EventType.IncrementalSnapshot &&\r\n e.data.source === IncrementalSource.Mutation)) {\r\n mutationBuffers.forEach((buf) => buf.unfreeze());\r\n }\r\n if (inEmittingFrame) {\r\n emit === null || emit === void 0 ? void 0 : emit(eventProcessor(e), isCheckout);\r\n }\r\n else if (passEmitsToParent) {\r\n const message = {\r\n type: 'rrweb',\r\n event: eventProcessor(e),\r\n isCheckout,\r\n };\r\n window.parent.postMessage(message, '*');\r\n }\r\n if (e.type === EventType.FullSnapshot) {\r\n lastFullSnapshotEvent = e;\r\n incrementalSnapshotCount = 0;\r\n }\r\n else if (e.type === EventType.IncrementalSnapshot) {\r\n if (e.data.source === IncrementalSource.Mutation &&\r\n e.data.isAttachIframe) {\r\n return;\r\n }\r\n incrementalSnapshotCount++;\r\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\r\n const exceedTime = checkoutEveryNms &&\r\n e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\r\n if (exceedCount || exceedTime) {\r\n takeFullSnapshot(true);\r\n }\r\n }\r\n };\r\n const wrappedMutationEmit = (m) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Mutation }, m),\r\n }));\r\n };\r\n const wrappedScrollEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Scroll }, p),\r\n }));\r\n const wrappedCanvasMutationEmit = (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.CanvasMutation }, p),\r\n }));\r\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.AdoptedStyleSheet }, a),\r\n }));\r\n const stylesheetManager = new StylesheetManager({\r\n mutationCb: wrappedMutationEmit,\r\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\r\n });\r\n const iframeManager = new IframeManager({\r\n mirror,\r\n mutationCb: wrappedMutationEmit,\r\n stylesheetManager: stylesheetManager,\r\n recordCrossOriginIframes,\r\n wrappedEmit,\r\n });\r\n for (const plugin of plugins || []) {\r\n if (plugin.getMirror)\r\n plugin.getMirror({\r\n nodeMirror: mirror,\r\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\r\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\r\n });\r\n }\r\n canvasManager = new CanvasManager({\r\n recordCanvas,\r\n mutationCb: wrappedCanvasMutationEmit,\r\n win: window,\r\n blockClass,\r\n blockSelector,\r\n mirror,\r\n sampling: sampling.canvas,\r\n dataURLOptions,\r\n });\r\n const shadowDomManager = new ShadowDomManager({\r\n mutationCb: wrappedMutationEmit,\r\n scrollCb: wrappedScrollEmit,\r\n bypassOptions: {\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskInputOptions,\r\n dataURLOptions,\r\n maskTextFn,\r\n maskInputFn,\r\n recordCanvas,\r\n inlineImages,\r\n sampling,\r\n slimDOMOptions,\r\n iframeManager,\r\n stylesheetManager,\r\n canvasManager,\r\n keepIframeSrcFn,\r\n },\r\n mirror,\r\n });\r\n takeFullSnapshot = (isCheckout = false) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Meta,\r\n data: {\r\n href: window.location.href,\r\n width: getWindowWidth(),\r\n height: getWindowHeight(),\r\n },\r\n }), isCheckout);\r\n stylesheetManager.reset();\r\n mutationBuffers.forEach((buf) => buf.lock());\r\n const node = snapshot(document, {\r\n mirror,\r\n blockClass,\r\n blockSelector,\r\n maskTextClass,\r\n maskTextSelector,\r\n inlineStylesheet,\r\n maskAllInputs: maskInputOptions,\r\n maskTextFn,\r\n slimDOM: slimDOMOptions,\r\n dataURLOptions,\r\n recordCanvas,\r\n inlineImages,\r\n onSerialize: (n) => {\r\n if (isSerializedIframe(n, mirror)) {\r\n iframeManager.addIframe(n);\r\n }\r\n if (isSerializedStylesheet(n, mirror)) {\r\n stylesheetManager.trackLinkElement(n);\r\n }\r\n if (hasShadowRoot(n)) {\r\n shadowDomManager.addShadowRoot(n.shadowRoot, document);\r\n }\r\n },\r\n onIframeLoad: (iframe, childSn) => {\r\n iframeManager.attachIframe(iframe, childSn);\r\n shadowDomManager.observeAttachShadow(iframe);\r\n },\r\n onStylesheetLoad: (linkEl, childSn) => {\r\n stylesheetManager.attachLinkElement(linkEl, childSn);\r\n },\r\n keepIframeSrcFn,\r\n });\r\n if (!node) {\r\n return console.warn('Failed to snapshot the document');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.FullSnapshot,\r\n data: {\r\n node,\r\n initialOffset: {\r\n left: window.pageXOffset !== undefined\r\n ? window.pageXOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollLeft) ||\r\n ((_b = (_a = document === null || document === void 0 ? void 0 : document.body) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.scrollLeft) ||\r\n ((_c = document === null || document === void 0 ? void 0 : document.body) === null || _c === void 0 ? void 0 : _c.scrollLeft) ||\r\n 0,\r\n top: window.pageYOffset !== undefined\r\n ? window.pageYOffset\r\n : (document === null || document === void 0 ? void 0 : document.documentElement.scrollTop) ||\r\n ((_e = (_d = document === null || document === void 0 ? void 0 : document.body) === null || _d === void 0 ? void 0 : _d.parentElement) === null || _e === void 0 ? void 0 : _e.scrollTop) ||\r\n ((_f = document === null || document === void 0 ? void 0 : document.body) === null || _f === void 0 ? void 0 : _f.scrollTop) ||\r\n 0,\r\n },\r\n },\r\n }));\r\n mutationBuffers.forEach((buf) => buf.unlock());\r\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\r\n stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\r\n };\r\n try {\r\n const handlers = [];\r\n handlers.push(on('DOMContentLoaded', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.DomContentLoaded,\r\n data: {},\r\n }));\r\n }));\r\n const observe = (doc) => {\r\n var _a;\r\n return initObservers({\r\n mutationCb: wrappedMutationEmit,\r\n mousemoveCb: (positions, source) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: {\r\n source,\r\n positions,\r\n },\r\n })),\r\n mouseInteractionCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MouseInteraction }, d),\r\n })),\r\n scrollCb: wrappedScrollEmit,\r\n viewportResizeCb: (d) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.ViewportResize }, d),\r\n })),\r\n inputCb: (v) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Input }, v),\r\n })),\r\n mediaInteractionCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.MediaInteraction }, p),\r\n })),\r\n styleSheetRuleCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleSheetRule }, r),\r\n })),\r\n styleDeclarationCb: (r) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.StyleDeclaration }, r),\r\n })),\r\n canvasMutationCb: wrappedCanvasMutationEmit,\r\n fontCb: (p) => wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Font }, p),\r\n })),\r\n selectionCb: (p) => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.IncrementalSnapshot,\r\n data: Object.assign({ source: IncrementalSource.Selection }, p),\r\n }));\r\n },\r\n blockClass,\r\n ignoreClass,\r\n maskTextClass,\r\n maskTextSelector,\r\n maskInputOptions,\r\n inlineStylesheet,\r\n sampling,\r\n recordCanvas,\r\n inlineImages,\r\n userTriggeredOnInput,\r\n collectFonts,\r\n doc,\r\n maskInputFn,\r\n maskTextFn,\r\n keepIframeSrcFn,\r\n blockSelector,\r\n slimDOMOptions,\r\n dataURLOptions,\r\n mirror,\r\n iframeManager,\r\n stylesheetManager,\r\n shadowDomManager,\r\n canvasManager,\r\n ignoreCSSAttributes,\r\n plugins: ((_a = plugins === null || plugins === void 0 ? void 0 : plugins.filter((p) => p.observer)) === null || _a === void 0 ? void 0 : _a.map((p) => ({\r\n observer: p.observer,\r\n options: p.options,\r\n callback: (payload) => wrappedEmit(wrapEvent({\r\n type: EventType.Plugin,\r\n data: {\r\n plugin: p.name,\r\n payload,\r\n },\r\n })),\r\n }))) || [],\r\n }, hooks);\r\n };\r\n iframeManager.addLoadListener((iframeEl) => {\r\n handlers.push(observe(iframeEl.contentDocument));\r\n });\r\n const init = () => {\r\n takeFullSnapshot();\r\n handlers.push(observe(document));\r\n recording = true;\r\n };\r\n if (document.readyState === 'interactive' ||\r\n document.readyState === 'complete') {\r\n init();\r\n }\r\n else {\r\n handlers.push(on('load', () => {\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Load,\r\n data: {},\r\n }));\r\n init();\r\n }, window));\r\n }\r\n return () => {\r\n handlers.forEach((h) => h());\r\n recording = false;\r\n };\r\n }\r\n catch (error) {\r\n console.warn(error);\r\n }\r\n}\r\nrecord.addCustomEvent = (tag, payload) => {\r\n if (!recording) {\r\n throw new Error('please add custom event after start recording');\r\n }\r\n wrappedEmit(wrapEvent({\r\n type: EventType.Custom,\r\n data: {\r\n tag,\r\n payload,\r\n },\r\n }));\r\n};\r\nrecord.freezePage = () => {\r\n mutationBuffers.forEach((buf) => buf.freeze());\r\n};\r\nrecord.takeFullSnapshot = (isCheckout) => {\r\n if (!recording) {\r\n throw new Error('please take full snapshot after start recording');\r\n }\r\n takeFullSnapshot(isCheckout);\r\n};\r\nrecord.mirror = mirror;\n\nexport { record as default };\n","import { record } from \"rrweb\";\nimport type { TrackerEvent } from \"../types\";\n\nexport type SessionReplayControllerOptions = {\n emit: (e: TrackerEvent) => void;\n /** rrweb full snapshot interval (ms). Default 10 minutes. */\n checkoutEveryNms?: number;\n /** Inline stylesheets into snapshots. Disabled by default to keep first payload small. */\n inlineStylesheet?: boolean;\n maxEventsPerBatch: number;\n flushIntervalMs: number;\n maskAllInputs: boolean;\n maskTextClass?: string;\n blockClass?: string;\n};\n\n/**\n * Captures the DOM with rrweb and emits `session_replay` batches for the tracker queue.\n */\nexport class SessionReplayController {\n private seq = 0;\n private readonly buffer: unknown[] = [];\n private stopRecording: (() => void) | null = null;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(private readonly opts: SessionReplayControllerOptions) {}\n\n start(): void {\n if (typeof document === \"undefined\" || this.stopRecording) return;\n\n const options = {\n emit: (event: unknown) => {\n this.buffer.push(event);\n if (this.buffer.length >= this.opts.maxEventsPerBatch) {\n this.flush();\n }\n },\n checkoutEveryNms: this.opts.checkoutEveryNms ?? 600_000,\n inlineStylesheet: this.opts.inlineStylesheet ?? false,\n maskAllInputs: this.opts.maskAllInputs,\n maskTextClass: this.opts.maskTextClass,\n blockClass: this.opts.blockClass,\n };\n\n this.stopRecording =\n record(options as Parameters<typeof record>[0]) ?? null;\n\n this.flushTimer = setInterval(() => {\n if (this.buffer.length > 0) this.flush();\n }, this.opts.flushIntervalMs);\n }\n\n flush(): void {\n if (this.buffer.length === 0) return;\n const events = this.buffer.splice(0, this.buffer.length);\n this.opts.emit({\n type: \"session_replay\",\n data: {\n seq: this.seq++,\n events,\n },\n });\n }\n\n destroy(): void {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n this.flush();\n this.stopRecording?.();\n this.stopRecording = null;\n }\n}\n","import type { ClientContext } from \"../types\";\n\nexport const ALPHANA_SDK_VERSION = \"2.0.2\";\n\nfunction detectDeviceCategory(ua: string): \"desktop\" | \"mobile\" | \"tablet\" {\n const s = ua.toLowerCase();\n if (/ipad|tablet|(android(?!.*mobile))/i.test(s)) return \"tablet\";\n if (/mobile|android|iphone|ipod|windows phone/i.test(s)) return \"mobile\";\n if (typeof navigator !== \"undefined\" && navigator.maxTouchPoints > 0) {\n const coarse =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(pointer: coarse)\")?.matches;\n if (coarse && /macintosh|mac os x/i.test(s)) return \"tablet\";\n }\n return \"desktop\";\n}\n\nfunction detectOs(ua: string): string {\n if (/windows/i.test(ua)) return \"Windows\";\n if (/android/i.test(ua)) return \"Android\";\n if (/iphone|ipad|ipod/i.test(ua)) return \"iOS\";\n if (/mac os x|macintosh/i.test(ua)) return \"macOS\";\n if (/linux/i.test(ua)) return \"Linux\";\n return \"Other\";\n}\n\nfunction detectBrowser(ua: string): string {\n if (/edg\\//i.test(ua)) return \"Edge\";\n if (/opr\\/|opera/i.test(ua)) return \"Opera\";\n if (/chrome\\/[0-9]/i.test(ua) && !/chromium/i.test(ua)) return \"Chrome\";\n if (/firefox\\/[0-9]/i.test(ua)) return \"Firefox\";\n if (/safari\\/[0-9]/i.test(ua) && !/chrome/i.test(ua)) return \"Safari\";\n return \"Other\";\n}\n\nfunction readUaData(): { mobile?: boolean; platform?: string } {\n const nav = navigator as Navigator & {\n userAgentData?: {\n mobile?: boolean;\n platform?: string;\n };\n };\n const uaData = nav.userAgentData;\n if (!uaData) return {};\n return { mobile: uaData.mobile, platform: uaData.platform };\n}\n\nfunction uaDataDevice(\n ua: string,\n uaData: { mobile?: boolean; platform?: string },\n): \"desktop\" | \"mobile\" | \"tablet\" {\n const platform = (uaData.platform ?? \"\").toLowerCase();\n if (platform === \"ios\" || platform === \"ipados\") {\n return uaData.mobile ? \"mobile\" : \"tablet\";\n }\n if (platform === \"android\") {\n return uaData.mobile ? \"mobile\" : \"tablet\";\n }\n if (uaData.mobile === true) return \"mobile\";\n return detectDeviceCategory(ua);\n}\n\n/**\n * Snapshot of the browser environment for the session replay catalog and\n * analytics parity with server-side User-Agent parsing.\n */\nexport function collectClientContext(sessionId: string): ClientContext {\n if (typeof window === \"undefined\" || typeof navigator === \"undefined\") {\n return {\n sessionId,\n timestamp: Date.now(),\n device: \"desktop\",\n os: \"Other\",\n browser: \"Other\",\n language: \"\",\n languages: [],\n colorScheme: \"\",\n screenWidth: 0,\n screenHeight: 0,\n viewportWidth: 0,\n viewportHeight: 0,\n devicePixelRatio: 1,\n timeZone: \"\",\n sdkVersion: ALPHANA_SDK_VERSION,\n };\n }\n\n const ua = navigator.userAgent || \"\";\n const uaData = readUaData();\n const device =\n uaData.mobile !== undefined || uaData.platform\n ? uaDataDevice(ua, uaData)\n : detectDeviceCategory(ua);\n\n let colorScheme: \"\" | \"light\" | \"dark\" = \"\";\n if (window.matchMedia?.(\"(prefers-color-scheme: dark)\")?.matches) {\n colorScheme = \"dark\";\n } else if (window.matchMedia?.(\"(prefers-color-scheme: light)\")?.matches) {\n colorScheme = \"light\";\n }\n\n let timeZone = \"\";\n try {\n timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone ?? \"\";\n } catch {\n timeZone = \"\";\n }\n\n const langs =\n typeof navigator.languages !== \"undefined\" && navigator.languages.length\n ? [...navigator.languages]\n : navigator.language\n ? [navigator.language]\n : [];\n\n return {\n sessionId,\n timestamp: Date.now(),\n device,\n os: detectOs(ua),\n browser: detectBrowser(ua),\n language: navigator.language || \"\",\n languages: langs,\n colorScheme,\n screenWidth: window.screen?.width ?? 0,\n screenHeight: window.screen?.height ?? 0,\n viewportWidth: window.innerWidth ?? 0,\n viewportHeight: window.innerHeight ?? 0,\n devicePixelRatio: window.devicePixelRatio ?? 1,\n timeZone,\n sdkVersion: ALPHANA_SDK_VERSION,\n };\n}\n","export type ElementBinding = {\n elementId: string;\n eventKind: \"goal\" | \"revenue\";\n key: string;\n name: string;\n value?: number;\n currency?: string;\n eventName?: string;\n};\n\nexport type ElementBindingHandlers = {\n onGoal: (binding: ElementBinding) => void;\n onRevenue: (\n binding: ElementBinding,\n amount: number,\n currency: string,\n eventName?: string,\n ) => void;\n};\n\nfunction readDataAmount(el: Element): number | undefined {\n const raw = el.getAttribute(\"data-alphana-amount\")?.trim();\n if (!raw) return undefined;\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction readDataCurrency(el: Element): string | undefined {\n const raw = el.getAttribute(\"data-alphana-currency\")?.trim();\n return raw || undefined;\n}\n\nfunction readDataEventName(el: Element): string | undefined {\n const raw = el.getAttribute(\"data-alphana-event-name\")?.trim();\n return raw || undefined;\n}\n\n/**\n * Walk from the click target up to find the first element whose id matches a\n * known binding.\n */\nexport function findBindingFromEvent(\n target: EventTarget | null,\n bindingsById: Map<string, ElementBinding>,\n): { binding: ElementBinding; matchedEl: Element } | null {\n if (\n !target ||\n typeof (target as Element).getAttribute !== \"function\" ||\n typeof (target as Element).id !== \"string\"\n ) {\n return null;\n }\n let node: Element | null = target as Element;\n while (node) {\n const id = node.id?.trim();\n if (id) {\n const binding = bindingsById.get(id);\n if (binding) return { binding, matchedEl: node };\n }\n node = node.parentElement;\n }\n return null;\n}\n\nexport function resolveRevenueAmount(\n matchedEl: Element,\n binding: ElementBinding,\n): { amount: number; currency: string; eventName?: string } | null {\n const amount = readDataAmount(matchedEl) ?? binding.value;\n const currency = readDataCurrency(matchedEl) ?? binding.currency;\n if (amount == null || !currency) return null;\n const eventName = readDataEventName(matchedEl) ?? binding.eventName;\n return { amount, currency, eventName };\n}\n\nexport class ElementBindingsController {\n private bindingsById = new Map<string, ElementBinding>();\n private attached = false;\n private readonly onClick = (event: MouseEvent): void => {\n const hit = findBindingFromEvent(event.target, this.bindingsById);\n if (!hit) return;\n const { binding, matchedEl } = hit;\n if (binding.eventKind === \"goal\") {\n this.handlers.onGoal(binding);\n return;\n }\n const resolved = resolveRevenueAmount(matchedEl, binding);\n if (!resolved) {\n if (typeof console !== \"undefined\") {\n console.debug(\n \"[alphana-sdk] revenue element click skipped: missing amount/currency\",\n binding.elementId,\n );\n }\n return;\n }\n this.handlers.onRevenue(\n binding,\n resolved.amount,\n resolved.currency,\n resolved.eventName,\n );\n };\n\n constructor(private readonly handlers: ElementBindingHandlers) {}\n\n setBindings(bindings: ElementBinding[]): void {\n this.bindingsById = new Map(\n bindings\n .filter((b) => typeof b.elementId === \"string\" && b.elementId.trim())\n .map((b) => [b.elementId.trim(), b]),\n );\n }\n\n start(): void {\n if (typeof document === \"undefined\" || this.attached) return;\n document.addEventListener(\"click\", this.onClick, true);\n this.attached = true;\n }\n\n destroy(): void {\n if (!this.attached || typeof document === \"undefined\") return;\n document.removeEventListener(\"click\", this.onClick, true);\n this.attached = false;\n }\n}\n","export type CookieConsentTheme = {\n background: string;\n text: string;\n primary: string;\n primaryText: string;\n borderRadius: string;\n};\n\nexport type CookieConsentBannerConfig = {\n title: string;\n message: string;\n acceptLabel: string;\n rejectLabel: string;\n position?: \"bottom\";\n theme: CookieConsentTheme;\n policyUrl?: string;\n version: number;\n enabled?: boolean;\n};\n\nexport type ConsentBannerHandlers = {\n onAccept: () => void;\n onReject: () => void;\n};\n\nconst HOST_ID = \"alphana-cookie-consent\";\nconst ALPHANA_HOME = \"https://alphana.ir\";\nconst ALPHANA_MARK_SRC = \"https://storage.alphana.ir/cdn/logos/Fav-Alphana.png\";\n\nexport function destroyConsentBanner(): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(HOST_ID)?.remove();\n}\n\nexport function renderConsentBanner(\n config: CookieConsentBannerConfig,\n handlers: ConsentBannerHandlers,\n): void {\n if (typeof document === \"undefined\") return;\n destroyConsentBanner();\n\n const host = document.createElement(\"div\");\n host.id = HOST_ID;\n host.setAttribute(\"data-alphana-widget\", \"cookie-consent\");\n Object.assign(host.style, {\n all: \"initial\",\n position: \"fixed\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n zIndex: \"2147483646\",\n pointerEvents: \"none\",\n } as CSSStyleDeclaration);\n\n const shadow = host.attachShadow({ mode: \"open\" });\n const dir =\n document.documentElement.getAttribute(\"dir\") === \"rtl\" ||\n /^(fa|ar|he|ur)/i.test(document.documentElement.lang)\n ? \"rtl\"\n : \"ltr\";\n\n const theme = config.theme;\n const policyLabel = dir === \"rtl\" ? \"سیاست حریم خصوصی\" : \"Privacy policy\";\n const poweredLabel =\n dir === \"rtl\" ? \"قدرت‌گرفته از Alphana\" : \"Powered by Alphana\";\n\n const style = document.createElement(\"style\");\n style.textContent = `\n :host { all: initial; }\n .sheet {\n pointer-events: auto;\n margin: 12px;\n padding: 16px 18px 12px;\n border-radius: ${theme.borderRadius};\n background: ${theme.background};\n color: ${theme.text};\n box-shadow: 0 12px 40px rgba(0,0,0,.28);\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n max-width: 720px;\n margin-inline: auto;\n }\n .title {\n font-size: 15px;\n font-weight: 650;\n margin: 0 0 8px;\n line-height: 1.35;\n color: ${theme.text};\n }\n .message {\n font-size: 13px;\n line-height: 1.55;\n margin: 0 0 10px;\n opacity: .92;\n color: ${theme.text};\n }\n a.policy {\n color: ${theme.primary};\n font-size: 12px;\n font-weight: 600;\n line-height: 1.3;\n text-decoration: underline;\n text-underline-offset: 2px;\n display: inline-block;\n margin: 0 0 14px;\n cursor: pointer;\n }\n a.policy:hover {\n opacity: .85;\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: flex-end;\n }\n button {\n appearance: none;\n border: 0;\n cursor: pointer;\n border-radius: 10px;\n padding: 9px 14px;\n font-size: 13px;\n font-weight: 600;\n line-height: 1.2;\n font-family: inherit;\n }\n .accept {\n background: ${theme.primary};\n color: ${theme.primaryText};\n }\n .reject {\n background: transparent;\n color: ${theme.text};\n border: 1px solid color-mix(in srgb, ${theme.text} 35%, transparent);\n }\n .footer {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid color-mix(in srgb, ${theme.text} 18%, transparent);\n text-align: center;\n }\n a.brand {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n color: ${theme.text};\n opacity: .72;\n font-size: 11px;\n font-weight: 500;\n line-height: 1.2;\n text-decoration: none;\n cursor: pointer;\n }\n a.brand:hover {\n opacity: 1;\n text-decoration: underline;\n text-underline-offset: 2px;\n }\n a.brand img {\n display: block;\n width: 14px;\n height: 14px;\n object-fit: contain;\n flex-shrink: 0;\n }\n @media (max-width: 480px) {\n .sheet { margin: 8px; padding: 14px 14px 10px; }\n .actions { flex-direction: column-reverse; }\n button { width: 100%; }\n }\n `;\n\n const sheet = document.createElement(\"div\");\n sheet.className = \"sheet\";\n sheet.setAttribute(\"dir\", dir);\n sheet.setAttribute(\"role\", \"dialog\");\n sheet.setAttribute(\"aria-live\", \"polite\");\n sheet.setAttribute(\"aria-label\", config.title);\n\n const title = document.createElement(\"p\");\n title.className = \"title\";\n title.textContent = config.title;\n\n const message = document.createElement(\"p\");\n message.className = \"message\";\n message.textContent = config.message;\n\n sheet.append(title, message);\n\n const policyHref = config.policyUrl?.trim();\n if (policyHref) {\n const policy = document.createElement(\"a\");\n policy.className = \"policy\";\n policy.href = policyHref;\n policy.target = \"_blank\";\n policy.rel = \"noopener noreferrer\";\n policy.textContent = policyLabel;\n sheet.append(policy);\n } else {\n message.style.marginBottom = \"14px\";\n }\n\n const actions = document.createElement(\"div\");\n actions.className = \"actions\";\n\n const rejectBtn = document.createElement(\"button\");\n rejectBtn.type = \"button\";\n rejectBtn.className = \"reject\";\n rejectBtn.textContent = config.rejectLabel;\n rejectBtn.addEventListener(\"click\", () => {\n destroyConsentBanner();\n handlers.onReject();\n });\n\n const acceptBtn = document.createElement(\"button\");\n acceptBtn.type = \"button\";\n acceptBtn.className = \"accept\";\n acceptBtn.textContent = config.acceptLabel;\n acceptBtn.addEventListener(\"click\", () => {\n destroyConsentBanner();\n handlers.onAccept();\n });\n\n actions.append(rejectBtn, acceptBtn);\n\n const footer = document.createElement(\"div\");\n footer.className = \"footer\";\n\n const brand = document.createElement(\"a\");\n brand.className = \"brand\";\n brand.href = ALPHANA_HOME;\n brand.target = \"_blank\";\n brand.rel = \"noopener noreferrer\";\n brand.setAttribute(\"aria-label\", poweredLabel);\n\n const brandImg = document.createElement(\"img\");\n brandImg.src = ALPHANA_MARK_SRC;\n brandImg.alt = \"\";\n brandImg.width = 14;\n brandImg.height = 14;\n brandImg.decoding = \"async\";\n\n const brandText = document.createElement(\"span\");\n brandText.textContent = poweredLabel;\n\n brand.append(brandImg, brandText);\n footer.append(brand);\n\n sheet.append(actions, footer);\n shadow.append(style, sheet);\n document.documentElement.appendChild(host);\n}\n","export type ConsentStatus = \"granted\" | \"rejected\";\n\nexport type StoredConsent = {\n status: ConsentStatus;\n decidedAt: number;\n version: number;\n};\n\nconst CONSENT_STORAGE_KEY = \"__alphana_consent__\";\n\nfunction safeGet(key: string): string | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSet(key: string, value: string): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(key, value);\n } catch {\n /* private mode / quota */\n }\n}\n\nexport function readConsent(): StoredConsent | null {\n const raw = safeGet(CONSENT_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredConsent;\n if (\n (parsed.status === \"granted\" || parsed.status === \"rejected\") &&\n typeof parsed.version === \"number\" &&\n typeof parsed.decidedAt === \"number\"\n ) {\n return parsed;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function writeConsent(status: ConsentStatus, version: number): void {\n const value: StoredConsent = {\n status,\n version,\n decidedAt: Date.now(),\n };\n safeSet(CONSENT_STORAGE_KEY, JSON.stringify(value));\n}\n","import type {\n TrackerConfig,\n TrackerEvent,\n SessionData,\n PageView,\n HeatmapPoint,\n AbVariantsMap,\n AttributionContext,\n GoalEventPayload,\n JourneyStepEventPayload,\n RevenueEventPayload,\n} from \"./types\";\nimport {\n apiBaseFromEventsEndpoint,\n collectUrlFromEventsEndpoint,\n} from \"./utils/api-base\";\nimport {\n buildCollectBatchBody,\n buildCollectHeartbeatBody,\n} from \"./utils/collect-payload\";\nimport {\n generateSessionId,\n peekVisitorId,\n persistVisitorId,\n} from \"./utils/session\";\nimport { NavigationPlugin } from \"./core/navigation\";\nimport { TimePlugin } from \"./core/time\";\nimport { HeatmapPlugin } from \"./core/heatmap\";\nimport { LogCapture } from \"./core/logger\";\nimport { SessionReplayController } from \"./core/session-replay\";\nimport { normalizeTrackerPath } from \"./utils/normalize-tracker-path\";\nimport { collectClientContext } from \"./core/client-context\";\nimport { postIngest, postIngestBeacon } from \"./utils/ingest-fetch\";\nimport {\n ElementBindingsController,\n type ElementBinding,\n} from \"./core/element-bindings\";\nimport {\n destroyConsentBanner,\n renderConsentBanner,\n type CookieConsentBannerConfig,\n} from \"./core/consent-banner\";\nimport { readConsent, writeConsent } from \"./core/consent-storage\";\n\nexport const DEFAULT_ENDPOINT = \"https://api.alphana.ir/api/events\";\n\nconst DEFAULTS = {\n endpoint: DEFAULT_ENDPOINT,\n trackNavigation: true,\n trackTime: true,\n trackHeatmap: true,\n trackLogs: true,\n mouseSampleRate: 0.1,\n maxHeatmapPoints: 2000,\n batchSize: 20,\n flushInterval: 5_000,\n compressPayloads: true,\n compressionThresholdBytes: 1024,\n sessionReplay: true,\n sessionReplayCheckoutEveryNms: 600_000,\n sessionReplayInlineStylesheet: false,\n sessionReplayMaxEventsPerBatch: 48,\n sessionReplayFlushIntervalMs: 4_000,\n sessionReplayMaskAllInputs: true,\n sessionReplayMaskTextClass: \"alphana-mask\",\n sessionReplayBlockClass: \"alphana-block\",\n} as const;\n\ntype SubscriberFn = (event: TrackerEvent) => void;\n\nconst FIRST_TOUCH_KEY = \"__alphana_first_touch__\";\nconst LAST_TOUCH_KEY = \"__alphana_last_touch__\";\nconst UTM_PARAM_MAP = {\n utm_source: \"source\",\n utm_medium: \"medium\",\n utm_campaign: \"campaign\",\n utm_term: \"term\",\n utm_content: \"content\",\n} as const;\nconst CLICK_ID_PARAMS = [\"gclid\", \"fbclid\", \"ttclid\", \"msclkid\"] as const;\n\nfunction safeLocalStorageGet(key: string): string | null {\n if (typeof localStorage === \"undefined\") return null;\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeLocalStorageSet(key: string, value: string): void {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(key, value);\n } catch {\n /* private mode / quota */\n }\n}\n\nfunction readTouch(key: string): AttributionContext | undefined {\n const raw = safeLocalStorageGet(key);\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw) as AttributionContext;\n return typeof parsed.landingPage === \"string\" &&\n typeof parsed.capturedAt === \"number\"\n ? parsed\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeTouch(key: string, value: AttributionContext): void {\n safeLocalStorageSet(key, JSON.stringify(value));\n}\n\nfunction hostFromReferrer(referrer?: string): string | undefined {\n if (!referrer) return undefined;\n try {\n return new URL(referrer).hostname.replace(/^www\\./, \"\").toLowerCase();\n } catch {\n return undefined;\n }\n}\n\nfunction currentSearchParams(): URLSearchParams {\n if (typeof window === \"undefined\") return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction readUtmParams(\n searchParams: URLSearchParams,\n): AttributionContext[\"utm\"] {\n const utm: AttributionContext[\"utm\"] = {};\n for (const [param, key] of Object.entries(UTM_PARAM_MAP)) {\n const value = searchParams.get(param)?.trim();\n if (value) utm[key] = value;\n }\n return Object.keys(utm).length > 0 ? utm : undefined;\n}\n\nfunction readClickIds(\n searchParams: URLSearchParams,\n): Record<string, string> | undefined {\n const clickIds: Record<string, string> = {};\n for (const key of CLICK_ID_PARAMS) {\n const value = searchParams.get(key)?.trim();\n if (value) clickIds[key] = value;\n }\n return Object.keys(clickIds).length > 0 ? clickIds : undefined;\n}\n\nfunction withNormalizedPaths(event: TrackerEvent): TrackerEvent {\n switch (event.type) {\n case \"pageview\":\n return {\n type: \"pageview\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"timespent\":\n return {\n type: \"timespent\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"heatmap\":\n return {\n type: \"heatmap\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"rageclik\":\n return {\n type: \"rageclik\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"uturn\":\n return {\n type: \"uturn\",\n data: {\n ...event.data,\n fromPath: normalizeTrackerPath(event.data.fromPath),\n toPath: normalizeTrackerPath(event.data.toPath),\n },\n };\n case \"identify\":\n return event;\n case \"revenue\":\n return event;\n case \"goal\":\n return {\n type: \"goal\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"journey_step\":\n return {\n type: \"journey_step\",\n data: {\n ...event.data,\n path: normalizeTrackerPath(event.data.path),\n },\n };\n case \"client_context\":\n return event;\n case \"session_replay\":\n return event;\n default: {\n const _exhaustive: never = event;\n return _exhaustive;\n }\n }\n}\ntype FlagSubscriberFn = (flags: Record<string, boolean>) => void;\ntype AbTestSubscriberFn = (variants: AbVariantsMap) => void;\n\ntype SdkRuntimeConfigResponse = {\n elementBindings?: ElementBinding[];\n widgets?: {\n cookieConsent?: (CookieConsentBannerConfig & { enabled?: boolean }) | null;\n };\n};\n\n/**\n * Core tracker class. Framework-agnostic — works in any environment that has\n * a browser DOM (React, Next.js Pages Router, Vite, vanilla JS/TS, etc.).\n *\n * Usage:\n * ```ts\n * const tracker = new UserTracker({ endpoint: 'https://my-api.com/events' });\n * tracker.init(); // call once; safe to call in SSR (no-op server-side)\n * ```\n *\n * Destroy when done (e.g. component unmount):\n * ```ts\n * tracker.destroy();\n * ```\n */\ntype ResolvedConfig = Required<\n Pick<\n TrackerConfig,\n | \"endpoint\"\n | \"trackNavigation\"\n | \"trackTime\"\n | \"trackHeatmap\"\n | \"trackLogs\"\n | \"mouseSampleRate\"\n | \"maxHeatmapPoints\"\n | \"batchSize\"\n | \"flushInterval\"\n | \"compressPayloads\"\n | \"compressionThresholdBytes\"\n | \"sessionReplay\"\n | \"sessionReplayCheckoutEveryNms\"\n | \"sessionReplayInlineStylesheet\"\n | \"sessionReplayMaxEventsPerBatch\"\n | \"sessionReplayFlushIntervalMs\"\n | \"sessionReplayMaskAllInputs\"\n | \"sessionReplayMaskTextClass\"\n | \"sessionReplayBlockClass\"\n >\n> &\n TrackerConfig;\n\nexport class UserTracker {\n private readonly cfg: ResolvedConfig;\n private session: SessionData;\n private navigation?: NavigationPlugin;\n private time?: TimePlugin;\n private heatmap?: HeatmapPlugin;\n private sessionReplay?: SessionReplayController;\n /** Public so consumers can call logCapture.capture() for manual log entries. */\n logCapture?: LogCapture;\n private initialized = false;\n private trackingAllowed = false;\n private trackingBlocked = false;\n private visitorPersisted = false;\n private elementBindings?: ElementBindingsController;\n private readonly subscribers = new Set<SubscriberFn>();\n\n /** In-memory queue of events waiting to be flushed. */\n private queue: TrackerEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n\n // ─── Feature flags ────────────────────────────────────────────────────────\n private userProperties: Record<string, string> = {};\n private flags: Record<string, boolean> = {};\n private readonly flagSubscribers = new Set<FlagSubscriberFn>();\n\n // ─── A/B tests ────────────────────────────────────────────────────────────\n private abVariants: AbVariantsMap = {};\n private readonly abTestSubscribers = new Set<AbTestSubscriberFn>();\n\n constructor(config: TrackerConfig = {}) {\n this.cfg = { ...DEFAULTS, ...config } as ResolvedConfig;\n\n // Validate endpoint URL up front so the error is thrown at construction\n // time rather than silently failing during a network request.\n try {\n new URL(this.cfg.endpoint);\n } catch {\n throw new Error(\n `[alpha-tracker] Invalid endpoint URL: \"${this.cfg.endpoint}\"`,\n );\n }\n\n const existingVisitorId = peekVisitorId();\n this.visitorPersisted = Boolean(existingVisitorId);\n\n this.session = {\n id: config.sessionId ?? generateSessionId(),\n visitorId: existingVisitorId ?? generateSessionId(),\n startedAt: Date.now(),\n pageViews: [],\n timeSpent: {},\n heatmap: {},\n userProperties: {},\n attribution: {\n firstTouch: readTouch(FIRST_TOUCH_KEY),\n lastTouch: readTouch(LAST_TOUCH_KEY),\n },\n };\n }\n\n private updateAttributionForPageView(\n path: string,\n referrer?: string,\n ): {\n firstTouch?: AttributionContext;\n lastTouch?: AttributionContext;\n } {\n const searchParams = currentSearchParams();\n const utm = readUtmParams(searchParams);\n const clickIds = readClickIds(searchParams);\n const existingFirst = readTouch(FIRST_TOUCH_KEY);\n const hasCampaignSignal = Boolean(utm || clickIds || referrer);\n const touch: AttributionContext | undefined = hasCampaignSignal\n ? {\n landingPage: path,\n referrer,\n referrerHost: hostFromReferrer(referrer),\n utm,\n clickIds,\n capturedAt: Date.now(),\n }\n : undefined;\n\n if (!existingFirst && touch) {\n writeTouch(FIRST_TOUCH_KEY, touch);\n }\n if (touch) {\n writeTouch(LAST_TOUCH_KEY, touch);\n }\n\n const attribution = {\n firstTouch: readTouch(FIRST_TOUCH_KEY),\n lastTouch: readTouch(LAST_TOUCH_KEY),\n };\n this.session.attribution = attribution;\n return attribution;\n }\n\n private currentAttribution(): {\n firstTouch?: AttributionContext;\n lastTouch?: AttributionContext;\n } {\n const attribution = {\n firstTouch: readTouch(FIRST_TOUCH_KEY),\n lastTouch: readTouch(LAST_TOUCH_KEY),\n };\n this.session.attribution = attribution;\n return attribution;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────────────\n\n /**\n * Attach event listeners and start tracking.\n * Safe to call during SSR — returns `this` immediately if `window` is\n * undefined so it can be chained: `const tracker = new UserTracker(cfg).init()`.\n *\n * When the dashboard cookie-consent widget is enabled, tracking waits until\n * the visitor accepts (or resumes a prior decision for the same config version).\n */\n init(): this {\n if (typeof window === \"undefined\" || this.initialized) return this;\n this.initialized = true;\n void this.bootstrapRuntime();\n return this;\n }\n\n private async bootstrapRuntime(): Promise<void> {\n const runtime = await this.fetchRuntimeConfig();\n this.applyElementBindings(runtime?.elementBindings ?? []);\n\n if (this.cfg.consentMode === \"disabled\") {\n this.startTracking();\n return;\n }\n\n const consentWidget = runtime?.widgets?.cookieConsent;\n if (!consentWidget?.enabled) {\n this.startTracking();\n return;\n }\n\n const stored = readConsent();\n if (stored && stored.version === consentWidget.version) {\n if (stored.status === \"granted\") {\n this.startTracking();\n } else {\n this.blockTracking();\n }\n return;\n }\n\n renderConsentBanner(consentWidget, {\n onAccept: () => {\n writeConsent(\"granted\", consentWidget.version);\n this.startTracking();\n },\n onReject: () => {\n writeConsent(\"rejected\", consentWidget.version);\n this.blockTracking();\n },\n });\n }\n\n private applyElementBindings(bindings: ElementBinding[]): void {\n if (!this.elementBindings) {\n this.elementBindings = new ElementBindingsController({\n onGoal: (binding) => {\n this.trackGoal({\n key: binding.key,\n name: binding.name,\n value: binding.value,\n currency: binding.currency,\n metadata: { source: \"element_click\", elementId: binding.elementId },\n });\n },\n onRevenue: (binding, amount, currency, eventName) => {\n this.trackRevenue({\n eventName: eventName ?? \"purchase\",\n amount,\n currency,\n metadata: {\n source: \"element_click\",\n elementId: binding.elementId,\n triggerKey: binding.key,\n },\n });\n },\n });\n }\n this.elementBindings.setBindings(bindings);\n }\n\n private persistVisitorIfNeeded(): void {\n if (this.visitorPersisted) return;\n persistVisitorId(this.session.visitorId);\n this.visitorPersisted = true;\n }\n\n /** Start plugins, network flush, and element listeners after consent is OK. */\n private startTracking(): void {\n if (this.trackingAllowed || this.trackingBlocked) return;\n this.trackingAllowed = true;\n this.persistVisitorIfNeeded();\n\n const emit = this.emit.bind(this);\n const { id: sessionId } = this.session;\n\n emit({\n type: \"client_context\",\n data: collectClientContext(sessionId),\n });\n\n if (this.cfg.trackNavigation) {\n this.navigation = new NavigationPlugin({ emit, sessionId });\n this.navigation.init();\n }\n\n if (this.cfg.trackTime) {\n this.time = new TimePlugin({ emit, sessionId });\n this.time.init();\n }\n\n if (this.cfg.trackHeatmap) {\n this.heatmap = new HeatmapPlugin({\n emit,\n sessionId,\n sampleRate: this.cfg.mouseSampleRate,\n maxPoints: this.cfg.maxHeatmapPoints,\n });\n this.heatmap.init();\n }\n\n if (this.cfg.sessionReplay) {\n this.sessionReplay = new SessionReplayController({\n emit,\n checkoutEveryNms: this.cfg.sessionReplayCheckoutEveryNms,\n inlineStylesheet: this.cfg.sessionReplayInlineStylesheet,\n maxEventsPerBatch: this.cfg.sessionReplayMaxEventsPerBatch,\n flushIntervalMs: this.cfg.sessionReplayFlushIntervalMs,\n maskAllInputs: this.cfg.sessionReplayMaskAllInputs,\n maskTextClass: this.cfg.sessionReplayMaskTextClass,\n blockClass: this.cfg.sessionReplayBlockClass,\n });\n this.sessionReplay.start();\n }\n\n if (this.cfg.endpoint) {\n this.flushTimer = setInterval(() => {\n if (this.queue.length > 0) void this.flushQueue();\n }, this.cfg.flushInterval);\n\n window.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n window.addEventListener(\"pagehide\", this.handlePageHide);\n\n this.heartbeatTimer = setInterval(() => {\n if (document.visibilityState !== \"hidden\") void this.sendHeartbeat();\n }, 30_000);\n\n if (this.cfg.trackLogs) {\n this.logCapture = new LogCapture({\n endpoint: this.cfg.endpoint,\n collectEndpoint: this.collectUrl,\n sessionId: this.session.id,\n secretKey: this.cfg.secretKey,\n appId: this.cfg.appId,\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n });\n this.logCapture.init();\n }\n }\n\n this.elementBindings?.start();\n void this.fetchFlags();\n void this.fetchAbTests();\n }\n\n private blockTracking(): void {\n this.trackingBlocked = true;\n this.trackingAllowed = false;\n this.queue = [];\n destroyConsentBanner();\n this.elementBindings?.destroy();\n }\n\n /** Remove all event listeners, flush remaining queue, and reset state. */\n destroy(): void {\n if (this.flushTimer !== null) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n window.removeEventListener(\"pagehide\", this.handlePageHide);\n }\n\n this.navigation?.destroy();\n this.time?.destroy();\n this.heatmap?.destroy();\n this.sessionReplay?.destroy();\n this.sessionReplay = undefined;\n this.logCapture?.destroy();\n this.elementBindings?.destroy();\n destroyConsentBanner();\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"tracker:navigate\", this.handleNavigate);\n }\n\n // Best-effort flush of any remaining queued events.\n if (this.queue.length > 0 && this.cfg.endpoint && this.trackingAllowed) {\n this.flushBeacon();\n }\n\n this.initialized = false;\n this.trackingAllowed = false;\n this.trackingBlocked = false;\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === \"hidden\") {\n this.sessionReplay?.flush();\n if (this.queue.length > 0) this.flushBeacon();\n this.sendDeactivate();\n }\n };\n\n private handlePageHide = (): void => {\n this.sessionReplay?.flush();\n if (this.queue.length > 0) this.flushBeacon();\n this.sendDeactivate();\n };\n\n private handleNavigate = (_e: Event): void => {\n // Navigation hook kept for potential future use.\n };\n\n /**\n * Send a keep-alive heartbeat so the backend knows this session is still\n * active. Called every 30 s while the tab is visible.\n */\n private async sendHeartbeat(): Promise<void> {\n if (!this.cfg.endpoint || !this.trackingAllowed) return;\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n const body = JSON.stringify(\n buildCollectHeartbeatBody({\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n path: this.currentPath(),\n active: true,\n appId: this.cfg.appId,\n }),\n );\n try {\n await postIngest(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n keepalive: true,\n });\n } catch {\n // Silent — heartbeat failure should never surface to the user.\n }\n }\n\n /**\n * Send a synchronous beacon to mark this session as inactive.\n * Called on page unload / tab hidden so the dashboard reflects real-time.\n */\n private sendDeactivate(): void {\n if (!this.cfg.endpoint || !this.trackingAllowed) return;\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n const body = JSON.stringify(\n buildCollectHeartbeatBody({\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n path: this.currentPath(),\n active: false,\n appId: this.cfg.appId,\n }),\n );\n postIngestBeacon(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n });\n }\n\n // ─── Event pipeline ─────────────────────────────────────────────────────────\n\n /** Emit a tracker event. Also used internally by the plugins. */\n emit(event: TrackerEvent): void {\n if (!this.trackingAllowed || this.trackingBlocked) return;\n event = withNormalizedPaths(event);\n if (event.type === \"pageview\") {\n const attribution = this.updateAttributionForPageView(\n event.data.path,\n event.data.referrer,\n );\n event = {\n type: \"pageview\",\n data: {\n ...event.data,\n utm: attribution.lastTouch?.utm,\n attribution,\n },\n };\n }\n // 1 – accumulate into session data\n switch (event.type) {\n case \"pageview\":\n this.session.pageViews.push(event.data);\n break;\n\n case \"timespent\": {\n const prev = this.session.timeSpent[event.data.path] ?? 0;\n this.session.timeSpent[event.data.path] = prev + event.data.duration;\n break;\n }\n\n case \"heatmap\": {\n const key = event.data.path;\n if (!this.session.heatmap[key]) this.session.heatmap[key] = [];\n const pts = this.session.heatmap[key];\n if (pts.length < this.cfg.maxHeatmapPoints) pts.push(event.data);\n break;\n }\n\n // rageclik and uturn are forwarded to the backend only; no local state needed.\n case \"rageclik\":\n case \"uturn\":\n case \"identify\":\n case \"revenue\":\n case \"goal\":\n case \"journey_step\":\n case \"client_context\":\n case \"session_replay\":\n break;\n }\n\n // 2 – notify subscribers (used internally by React hooks)\n this.subscribers.forEach((fn) => fn(event));\n\n // 3 – user callback\n this.cfg.onEvent?.(event);\n\n // 4 – enqueue for batched remote sending\n if (this.cfg.endpoint) {\n this.queue.push(event);\n // Auto-flush once the batch size threshold is reached.\n if (this.queue.length >= this.cfg.batchSize) {\n void this.flushQueue();\n }\n }\n }\n\n /**\n * Subscribe to every emitted event. Returns an unsubscribe function.\n *\n * ```ts\n * const unsub = tracker.subscribe(event => console.log(event));\n * // later…\n * unsub();\n * ```\n */\n subscribe(fn: SubscriberFn): () => void {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n // ─── Manual tracking helpers ────────────────────────────────────────────────\n\n /**\n * Manually record a page view and dispatch `tracker:navigate`.\n * Required for Next.js App Router — call it inside a `useEffect` that\n * depends on `usePathname()`:\n *\n * ```tsx\n * const pathname = usePathname();\n * useEffect(() => { tracker.trackPageView(pathname); }, [pathname]);\n * ```\n */\n trackPageView(path?: string): void {\n const resolvedPath = normalizeTrackerPath(\n path ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\"),\n );\n\n this.emit({\n type: \"pageview\",\n data: {\n path: resolvedPath,\n title: typeof document !== \"undefined\" ? document.title : \"\",\n timestamp: Date.now(),\n sessionId: this.session.id,\n referrer:\n typeof document !== \"undefined\"\n ? document.referrer || undefined\n : undefined,\n },\n });\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"tracker:navigate\", {\n detail: { path: resolvedPath, title: document.title },\n }),\n );\n }\n }\n\n /**\n * Track a monetary conversion such as a purchase, subscription, renewal,\n * upgrade, or refund. Revenue events include the current attribution context\n * so the backend can credit campaigns without recomputing browser state.\n */\n trackRevenue(payload: RevenueEventPayload): void {\n this.emit({\n type: \"revenue\",\n data: {\n ...payload,\n eventName: payload.eventName ?? \"purchase\",\n status: payload.status ?? \"paid\",\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n timestamp: Date.now(),\n attribution: this.currentAttribution(),\n },\n });\n }\n\n /** Track a business goal such as signup, trial_start, lead, or checkout_start. */\n trackGoal(payload: GoalEventPayload): void {\n const path = normalizeTrackerPath(\n typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\",\n );\n this.emit({\n type: \"goal\",\n data: {\n ...payload,\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n path,\n timestamp: Date.now(),\n },\n });\n }\n\n /** Track a named product journey milestone beyond automatic pageviews. */\n trackJourneyStep(payload: JourneyStepEventPayload): void {\n const path = normalizeTrackerPath(\n payload.path ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\"),\n );\n this.emit({\n type: \"journey_step\",\n data: {\n ...payload,\n path,\n sessionId: this.session.id,\n visitorId: this.session.visitorId,\n timestamp: Date.now(),\n },\n });\n }\n\n // ─── Identity & Feature Flags ───────────────────────────────────────────────\n\n /**\n * Identify the current user with a set of properties.\n * Properties are merged with any previously set ones and used for feature\n * flag targeting (e.g. `email`, `plan`, `country`).\n * Automatically triggers a flag re-evaluation.\n *\n * ```ts\n * tracker.identify({ email: 'user@example.com', plan: 'pro' });\n * ```\n */\n identify(properties: Record<string, string>): void {\n this.userProperties = { ...this.userProperties, ...properties };\n this.session.userProperties = { ...this.userProperties };\n this.emit({\n type: \"identify\",\n data: {\n properties: { ...this.userProperties },\n visitorId: this.session.visitorId,\n timestamp: Date.now(),\n },\n });\n void this.fetchFlags();\n }\n\n /**\n * Returns the latest evaluated feature flags as `{ [key]: boolean }`.\n * Flags are fetched on `init()` and after every `identify()` call.\n */\n getFlags(): Record<string, boolean> {\n return { ...this.flags };\n }\n\n /**\n * Returns `true` if the given flag is currently enabled for this user.\n * Returns `false` for unknown flags or before flags have loaded.\n */\n isFeatureEnabled(flagKey: string): boolean {\n return this.flags[flagKey] === true;\n }\n\n /**\n * Subscribe to flag changes. Called whenever flags are re-evaluated.\n * Returns an unsubscribe function.\n *\n * ```ts\n * const unsub = tracker.onFlagsChange(flags => console.log(flags));\n * ```\n */\n onFlagsChange(fn: FlagSubscriberFn): () => void {\n this.flagSubscribers.add(fn);\n return () => this.flagSubscribers.delete(fn);\n }\n\n /** Fetch (or re-fetch) flags from the backend evaluate endpoint. */\n async fetchFlags(): Promise<void> {\n if (!this.cfg.endpoint || !this.cfg.secretKey || !this.trackingAllowed)\n return;\n const url =\n apiBaseFromEventsEndpoint(this.cfg.endpoint) + \"/feature-flags/evaluate\";\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.cfg.secretKey}`,\n },\n body: JSON.stringify({ userProperties: this.userProperties }),\n });\n if (!res.ok) return;\n const data = (await res.json()) as Record<string, boolean>;\n this.flags = data;\n this.flagSubscribers.forEach((fn) => fn({ ...this.flags }));\n } catch {\n // Silent — flag fetch failure must never surface to the user.\n }\n }\n\n // ─── A/B tests ──────────────────────────────────────────────────────────────\n\n /**\n * Returns variant keys assigned to this visitor for each running experiment.\n * Fetched on `init()` and after `fetchAbTests()`.\n *\n * ```ts\n * const variants = tracker.getAbVariants();\n * // { 'checkout-cta-test': 'variant-b' }\n * ```\n */\n getAbVariants(): AbVariantsMap {\n return { ...this.abVariants };\n }\n\n /**\n * Returns the assigned variant key for one experiment, or `null` if the\n * experiment is not running or not found.\n */\n getAbVariant(experimentKey: string): string | null {\n const v = this.abVariants[experimentKey];\n return v ?? null;\n }\n\n /**\n * Returns `true` when the visitor is assigned to the given variant key.\n */\n isAbVariant(experimentKey: string, variantKey: string): boolean {\n return this.abVariants[experimentKey] === variantKey;\n }\n\n /**\n * Subscribe to A/B assignment updates. Returns an unsubscribe function.\n */\n onAbTestsChange(fn: AbTestSubscriberFn): () => void {\n this.abTestSubscribers.add(fn);\n return () => this.abTestSubscribers.delete(fn);\n }\n\n /**\n * Fetch (or re-fetch) variant assignments from `/ab-tests/evaluate`.\n * @param keys When set, only these experiment keys are evaluated and merged.\n */\n async fetchAbTests(keys?: string[]): Promise<void> {\n if (!this.cfg.endpoint || !this.cfg.secretKey || !this.trackingAllowed)\n return;\n const url =\n apiBaseFromEventsEndpoint(this.cfg.endpoint) + \"/ab-tests/evaluate\";\n try {\n const body: { visitorId: string; keys?: string[] } = {\n visitorId: this.session.visitorId,\n };\n if (keys?.length) body.keys = keys;\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.cfg.secretKey}`,\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) return;\n const data = (await res.json()) as AbVariantsMap;\n this.abVariants = keys?.length\n ? { ...this.abVariants, ...data }\n : { ...data };\n this.abTestSubscribers.forEach((fn) => fn({ ...this.abVariants }));\n } catch {\n // Silent — assignment failure must never surface to the user.\n }\n }\n\n // ─── Data accessors ─────────────────────────────────────────────────────────\n\n /** A read-only snapshot of the current session. */\n getSession(): Readonly<SessionData> {\n return this.session;\n }\n\n /** All page views recorded so far. */\n getPageViews(): PageView[] {\n return [...this.session.pageViews];\n }\n\n /** Cumulative milliseconds spent per path. */\n getTimeSpent(): Record<string, number> {\n return { ...this.session.timeSpent };\n }\n\n /** Heatmap points for a specific path. */\n getHeatmapData(path: string): HeatmapPoint[];\n /** Heatmap points for all tracked paths. */\n getHeatmapData(): Record<string, HeatmapPoint[]>;\n getHeatmapData(\n path?: string,\n ): HeatmapPoint[] | Record<string, HeatmapPoint[]> {\n if (path !== undefined) {\n return [...(this.session.heatmap[path] ?? [])];\n }\n return Object.entries(this.session.heatmap).reduce<\n Record<string, HeatmapPoint[]>\n >((acc, [k, v]) => {\n acc[k] = [...v];\n return acc;\n }, {});\n }\n\n // ─── Network ────────────────────────────────────────────────────────────────\n\n private get collectUrl(): string {\n return (\n this.cfg.collectEndpoint ??\n collectUrlFromEventsEndpoint(this.cfg.endpoint!)\n );\n }\n\n private async fetchRuntimeConfig(): Promise<SdkRuntimeConfigResponse | null> {\n if (!this.cfg.endpoint || !this.cfg.secretKey) return null;\n const url =\n apiBaseFromEventsEndpoint(this.cfg.endpoint) + \"/sdk/runtime-config\";\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.cfg.secretKey}`,\n },\n body: JSON.stringify({\n ...(this.cfg.appId ? { appId: this.cfg.appId } : {}),\n }),\n });\n if (!res.ok) return null;\n return (await res.json()) as SdkRuntimeConfigResponse;\n } catch {\n return null;\n }\n }\n\n private currentPath(): string {\n return normalizeTrackerPath(\n typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\",\n );\n }\n\n /**\n * Immediately drain the event queue and POST pending events to `/batch`.\n * Fire-and-forget; errors are intentionally swallowed like other analytics calls.\n */\n flush(): void {\n void this.flushQueue();\n }\n\n /** Drain the queue and POST all pending events to the batch endpoint. */\n private async flushQueue(): Promise<void> {\n if (this.queue.length === 0) return;\n // Splice atomically so new events emitted during the async request don't\n // get lost — they stay in the queue for the next flush.\n const batch = this.queue.splice(0);\n await this.sendBatch(batch);\n }\n\n /**\n * Synchronous best-effort flush via `navigator.sendBeacon`.\n * Used on `pagehide` / `visibilitychange:hidden` where async fetch may be\n * cancelled by the browser before it completes.\n */\n private flushBeacon(): void {\n if (this.queue.length === 0) return;\n const batch = this.queue.splice(0);\n const body = JSON.stringify(\n buildCollectBatchBody(batch, {\n appId: this.cfg.appId,\n visitorId: this.session.visitorId,\n sessionId: this.session.id,\n }),\n );\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n\n postIngestBeacon(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n });\n }\n\n private async sendBatch(events: TrackerEvent[]): Promise<void> {\n const authHeaders: Record<string, string> = this.cfg.secretKey\n ? { Authorization: `Bearer ${this.cfg.secretKey}` }\n : {};\n const body = JSON.stringify(\n buildCollectBatchBody(events, {\n appId: this.cfg.appId,\n visitorId: this.session.visitorId,\n sessionId: this.session.id,\n }),\n );\n await postIngest(this.collectUrl, body, {\n compressPayloads: this.cfg.compressPayloads,\n compressionThresholdBytes: this.cfg.compressionThresholdBytes,\n authHeaders,\n });\n }\n}\n","import { createContext, useContext } from \"react\";\nimport type { UserTracker } from \"../tracker\";\n\nexport const TrackerContext = createContext<UserTracker | null>(null);\n\n/**\n * Returns the nearest `UserTracker` instance from context.\n * Returns `null` when called outside of a `<UserTrackerProvider>`.\n */\nexport function useTrackerContext(): UserTracker | null {\n return useContext(TrackerContext);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n HeatmapPoint,\n GoalEventPayload,\n JourneyStepEventPayload,\n PageView,\n RevenueEventPayload,\n TrackerEvent,\n} from \"../types\";\nimport { useTrackerContext } from \"./context\";\nimport { normalizeTrackerPath } from \"../utils/normalize-tracker-path\";\n\n// ─── useTracker ───────────────────────────────────────────────────────────────\n\n/**\n * Returns the `UserTracker` instance from the nearest `<UserTrackerProvider>`.\n * Returns `null` when called outside of a provider.\n */\nexport function useTracker() {\n return useTrackerContext();\n}\n\n// ─── usePageView ──────────────────────────────────────────────────────────────\n\n/**\n * Manually records a page view whenever `path` changes.\n *\n * Pass the current pathname — particularly useful with Next.js App Router:\n * ```tsx\n * 'use client';\n * import { usePathname } from 'next/navigation';\n * import { usePageView } from 'user-tracker/react';\n *\n * export function NavigationTracker() {\n * usePageView(usePathname());\n * return null;\n * }\n * ```\n * When no `path` is provided the hook is a no-op (automatic tracking via the\n * NavigationPlugin handles it).\n */\nexport function usePageView(path?: string): void {\n const tracker = useTrackerContext();\n useEffect(() => {\n if (tracker && path !== undefined) {\n tracker.trackPageView(path);\n }\n // Re-fire when the path changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [path]);\n}\n\n// ─── useHeatmapData ───────────────────────────────────────────────────────────\n\n/**\n * Returns a live array of `HeatmapPoint` objects for the given path (defaults\n * to `window.location.pathname`).\n *\n * The state is updated in batches — at most once every `refreshMs` ms — to\n * avoid a re-render on every single mouse move.\n *\n * @param path The page path to query. Defaults to the current pathname.\n * @param refreshMs Minimum interval between state updates. Default: 500.\n */\nexport function useHeatmapData(path?: string, refreshMs = 500): HeatmapPoint[] {\n const tracker = useTrackerContext();\n const [data, setData] = useState<HeatmapPoint[]>([]);\n const pendingRef = useRef(false);\n\n useEffect(() => {\n if (!tracker) return;\n\n const targetPath = normalizeTrackerPath(\n path ??\n (typeof window !== \"undefined\"\n ? window.location.pathname + window.location.search\n : \"/\"),\n );\n\n const refresh = (): void => {\n setData(tracker.getHeatmapData(targetPath) as HeatmapPoint[]);\n pendingRef.current = false;\n };\n\n // Initial read.\n refresh();\n\n // Re-read after each new heatmap point, debounced by refreshMs.\n const unsub = tracker.subscribe((event: TrackerEvent) => {\n if (\n event.type === \"heatmap\" &&\n normalizeTrackerPath(event.data.path) === targetPath\n ) {\n if (!pendingRef.current) {\n pendingRef.current = true;\n setTimeout(refresh, refreshMs);\n }\n }\n });\n\n return unsub;\n // refreshMs is intentionally excluded — changing it after mount has no effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tracker, path]);\n\n return data;\n}\n\n// ─── usePageViews ─────────────────────────────────────────────────────────────\n\n/**\n * Returns a live array of all page views recorded in the current session.\n */\nexport function usePageViews(): PageView[] {\n const tracker = useTrackerContext();\n const [views, setViews] = useState<PageView[]>([]);\n\n useEffect(() => {\n if (!tracker) return;\n\n setViews(tracker.getPageViews());\n\n const unsub = tracker.subscribe((event: TrackerEvent) => {\n if (event.type === \"pageview\") {\n setViews(tracker.getPageViews());\n }\n });\n\n return unsub;\n }, [tracker]);\n\n return views;\n}\n\nexport function useTrackRevenue(): (payload: RevenueEventPayload) => void {\n const tracker = useTrackerContext();\n return (payload: RevenueEventPayload) => {\n tracker?.trackRevenue(payload);\n };\n}\n\nexport function useTrackGoal(): (payload: GoalEventPayload) => void {\n const tracker = useTrackerContext();\n return (payload: GoalEventPayload) => {\n tracker?.trackGoal(payload);\n };\n}\n\nexport function useTrackJourneyStep(): (payload: JourneyStepEventPayload) => void {\n const tracker = useTrackerContext();\n return (payload: JourneyStepEventPayload) => {\n tracker?.trackJourneyStep(payload);\n };\n}\n\n// ─── useTimeSpent ─────────────────────────────────────────────────────────────\n\n/**\n * Returns a live record of cumulative milliseconds spent per path.\n */\nexport function useTimeSpent(): Record<string, number> {\n const tracker = useTrackerContext();\n const [time, setTime] = useState<Record<string, number>>({});\n\n useEffect(() => {\n if (!tracker) return;\n\n setTime(tracker.getTimeSpent());\n\n const unsub = tracker.subscribe((event: TrackerEvent) => {\n if (event.type === \"timespent\") {\n setTime(tracker.getTimeSpent());\n }\n });\n\n return unsub;\n }, [tracker]);\n\n return time;\n}\n\n// ─── useFeatureFlags ──────────────────────────────────────────────────────────\n\n/**\n * Returns all evaluated feature flags as `{ [flagKey]: boolean }`.\n * Re-renders whenever flags are refreshed (e.g. after `identify()`).\n */\nexport function useFeatureFlags(): Record<string, boolean> {\n const tracker = useTrackerContext();\n const [flags, setFlags] = useState<Record<string, boolean>>(\n () => tracker?.getFlags() ?? {},\n );\n\n useEffect(() => {\n if (!tracker) return;\n // Sync immediately in case flags already loaded before this component mounted.\n setFlags(tracker.getFlags());\n const unsub = tracker.onFlagsChange(setFlags);\n // Re-fetch in case init()'s fetch completed before this subscriber was added.\n void tracker.fetchFlags();\n return unsub;\n }, [tracker]);\n\n return flags;\n}\n\n// ─── useFeatureFlagEnabled ────────────────────────────────────────────────────\n\n/**\n * Returns `true` if the given feature flag is enabled for the current user.\n * Returns `false` while flags are loading or if the flag is unknown.\n *\n * ```tsx\n * const showNewCheckout = useFeatureFlagEnabled('new-checkout');\n * ```\n */\nexport function useFeatureFlagEnabled(flagKey: string): boolean {\n const flags = useFeatureFlags();\n return flags[flagKey] === true;\n}\n\n// ─── useAbTests ───────────────────────────────────────────────────────────────\n\n/**\n * Returns all assigned A/B variants as `{ [experimentKey]: variantKey | null }`.\n * Re-renders when assignments are fetched (on `init()` or `fetchAbTests()`).\n */\nexport function useAbTests(): Record<string, string | null> {\n const tracker = useTrackerContext();\n const [variants, setVariants] = useState<Record<string, string | null>>(\n () => tracker?.getAbVariants() ?? {},\n );\n\n useEffect(() => {\n if (!tracker) return;\n setVariants(tracker.getAbVariants());\n const unsub = tracker.onAbTestsChange(setVariants);\n void tracker.fetchAbTests();\n return unsub;\n }, [tracker]);\n\n return variants;\n}\n\n// ─── useAbVariant ─────────────────────────────────────────────────────────────\n\n/**\n * Returns the assigned variant key for one running experiment, or `null`\n * while loading / when the experiment is inactive.\n *\n * ```tsx\n * const variant = useAbVariant('checkout-cta-test');\n * if (variant === 'variant-b') return <BlueCta />;\n * return <GreenCta />;\n * ```\n */\nexport function useAbVariant(experimentKey: string): string | null {\n const variants = useAbTests();\n const v = variants[experimentKey];\n return v ?? null;\n}\n\n// ─── useIsAbVariant ───────────────────────────────────────────────────────────\n\n/**\n * Returns `true` when the visitor is assigned to the given variant key.\n *\n * ```tsx\n * const isVariantB = useIsAbVariant('checkout-cta-test', 'variant-b');\n * ```\n */\nexport function useIsAbVariant(\n experimentKey: string,\n variantKey: string,\n): boolean {\n const variants = useAbTests();\n return variants[experimentKey] === variantKey;\n}\n"],"mappings":"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","names":["react_exports","__export","UserTrackerProvider","useAbTests","useAbVariant","useFeatureFlagEnabled","useFeatureFlags","useHeatmapData","useIsAbVariant","usePageView","usePageViews","useTimeSpent","useTrackGoal","useTrackJourneyStep","useTrackRevenue","useTracker","__toCommonJS","import_react","apiBaseFromEventsEndpoint","endpoint","collectUrlFromEventsEndpoint","buildCollectBatchBody","events","ctx","e","buildCollectHeartbeatBody","params","buildCollectLogBody","entry","VISITOR_STORAGE_KEY","generateSessionId","c","r","peekVisitorId","VISITOR_STORAGE_KEY","e","persistVisitorId","id","normalizeTrackerPath","path","q","pathname","search","out","i","dec","e","s","SS_LAST_PV_PATH","SS_LAST_PV_ENTRY_MS","safeSessionStorageGet","key","safeSessionStorageSet","value","e","persistLastPageView","path","pageEntryMs","getNavigationEntryType","nav","legacy","_NavigationPlugin","emit","sessionId","newPath","normalizeTrackerPath","origPush","state","title","url","origReplace","lastPath","lastMsRaw","lastEntryMs","timeOnPage","fromPath","toPath","timeOnPageMs","p","NavigationPlugin","TimePlugin","emit","sessionId","normalizeTrackerPath","duration","throttle","fn","delay","lastCall","args","now","ANCHOR_SELECTOR","SELECTOR_ID_RE","buildSelector","el","elId","parts","node","depth","nid","tag","nth","sib","getClickAnchor","target","clientX","clientY","anchor","selector","rect","relX","relY","_HeatmapPlugin","emit","sessionId","sampleRate","maxPoints","allowedPaths","pageWidth","pageHeight","absY","touch","_a","vw","vh","scrollX","scrollY","reachedY","reachedPct","prevMax","isNewMax","absX","normalizeTrackerPath","p","throttle","point","_b","_c","_d","x","y","path","now","c","nearby","HeatmapPlugin","ALPHANA_GZIP_MEDIA_TYPE","isCompressionSupported","compressUtf8","json","encoded","stream","DEFAULT_THRESHOLD_BYTES","prepareIngestBody","jsonBody","options","forceJson","_a","threshold","compressed","compressUtf8","ALPHANA_GZIP_MEDIA_TYPE","sendPreparedIngest","url","prepared","_b","headers","postIngest","response","fallback","e","postIngestBeacon","blob","LogCapture","options","_a","_b","_c","collectUrlFromEventsEndpoint","args","first","stack","msg","src","line","col","err","reason","message","level","extra","a","e","entry","body","buildCollectLogBody","postIngest","NodeType","isElement","n","isShadowRoot","host","isNativeShadowDom","shadowRoot","fixBrowserCompatibilityIssuesInCSS","cssText","getCssRulesString","s","rules","getCssRuleString","error","rule","cssStringified","isCSSImportRule","_a","Mirror","id","_this","childNode","node","meta","oldNode","createMirror","maskInputValue","maskInputOptions","tagName","type","value","maskInputFn","text","ORIGINAL_ATTRIBUTE_NAME","is2DCanvasBlank","canvas","ctx","chunkSize","x","y","getImageData","originalGetImageData","pixelBuffer","pixel","_id","tagNameRegex","IGNORED_NODE","genId","getValidTagName","element","processedTagName","stringifyStyleSheet","sheet","extractOrigin","url","origin","canvasService","canvasCtx","URL_IN_CSS_REF","RELATIVE_PATH","DATA_URI","absoluteToStylesheet","href","quote1","path1","quote2","path2","path3","filePath","maybeQuote","stack","parts","_i","parts_1","part","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","getAbsoluteSrcsetString","doc","attributeValue","pos","collectCharacters","regEx","chars","match","output","absoluteToDoc","descriptorsStr","inParens","a","isSVGElement","el","getHref","transformAttribute","name","_isBlockedElement","blockClass","blockSelector","eIndex","className","classMatchesRegex","regex","checkAncestors","needMaskingText","maskTextClass","maskTextSelector","onceIframeLoaded","iframeEl","listener","iframeLoadTimeout","win","fired","readyState","timer_1","blankUrl","onceStylesheetLoaded","link","styleSheetLoadTimeout","styleSheetLoaded","timer","serializeNode","options","mirror","inlineStylesheet","maskTextFn","_b","dataURLOptions","inlineImages","recordCanvas","keepIframeSrcFn","_c","newlyAddedElement","rootId","getRootId","serializeElementNode","serializeTextNode","docId","parentTagName","textContent","isStyle","isScript","err","needBlock","attributes","len","i","attr","stylesheet","checked","canvasDataURL","blankCanvas","blankCanvasDataURL","image_1","oldValue_1","recordInlineImage","_d","width","height","lowerIfExists","maybeAttr","slimDOMExcluded","sn","slimDOMOptions","serializeNodeWithId","skipChild","_e","_f","onSerialize","onIframeLoad","_g","onStylesheetLoad","_h","stylesheetLoadTimeout","_j","_k","_l","preserveWhiteSpace","_serializedNode","serializedNode","recordChild","bypassOptions","_m","childN","serializedChildNode","_o","_p","iframeDoc","serializedIframeNode","serializedLinkNode","snapshot","maskAllInputs","slimDOM","HOVER_SELECTOR","HOVER_SELECTOR_GLOBAL","on","type","fn","target","options","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","prop","receiver","throttle","func","wait","timeout","previous","args","now","remaining","context","hookSetter","key","d","isRevoked","win","original","value","patch","source","name","replacement","wrapped","_a","getWindowHeight","getWindowWidth","isBlocked","node","blockClass","blockSelector","checkAncestors","el","classMatchesRegex","isSerialized","n","mirror","isIgnored","IGNORED_NODE","isAncestorRemoved","isShadowRoot","id","isTouchEvent","event","polyfill","isSerializedIframe","n","mirror","isSerializedStylesheet","hasShadowRoot","n","StyleSheetMirror","stylesheet","_a","id","newId","EventType","EventType2","IncrementalSource","IncrementalSource2","MouseInteractions","MouseInteractions2","CanvasContext","CanvasContext2","isNodeInLinkedList","n","DoubleLinkedList","position","current","index","node","moveKey","id","parentId","MutationBuffer","mutations","adds","addList","getNextId","ns","nextId","IGNORED_NODE","pushAdd","_a","_b","_c","_d","shadowHost","rootShadowHost","notInDoc","isShadowRoot","sn","serializeNodeWithId","currentN","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","iframe","childSn","link","isParentRemoved","isAncestorInSet","candidate","_node","unhandledNode","payload","text","attribute","m","isIgnored","value","isBlocked","needMaskingText","target","maskInputValue","item","a","old","styleObj","pname","newValue","newPriority","transformAttribute","nodeId","isSerialized","deepDelete","isAncestorRemoved","isNativeShadowDom","targetId","childN","options","key","addsSet","removes","mirror","_isParentRemoved","parentNode","r","set","_isAncestorInSet","mutationBuffers","isCSSGroupingRuleSupported","isCSSMediaRuleSupported","isCSSSupportsRuleSupported","isCSSConditionRuleSupported","getEventTarget","event","path","_a","initMutationObserver","options","rootEl","_b","mutationBuffer","MutationBuffer","mutationObserverCtor","angularZoneSymbol","observer","initMoveObserver","mousemoveCb","sampling","doc","mirror","threshold","callbackThreshold","positions","timeBaseline","wrappedCb","throttle","source","totalOffset","p","updatePosition","evt","target","clientX","clientY","isTouchEvent","IncrementalSource","handlers","on","h","initMouseInteractionObserver","mouseInteractionCb","blockClass","blockSelector","disableMap","getHandler","eventKey","isBlocked","e","id","MouseInteractions","key","eventName","handler","initScrollObserver","scrollCb","scrollEl","initViewportResizeObserver","viewportResizeCb","lastH","lastW","updateDimension","height","getWindowHeight","width","getWindowWidth","wrapEventWithUserTriggeredFlag","v","enable","value","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","maskInputOptions","maskInputFn","userTriggeredOnInput","eventHandler","userTriggered","type","text","isChecked","maskInputValue","cbWithDedup","name","el","lastInputValue","currentWindow","propertyDescriptor","hookProperties","hookSetter","getNestedCSSRulePositions","rule","recurse","childRule","pos","index","getIdAndStyleId","sheet","styleMirror","styleId","initStyleSheetObserver","styleSheetRuleCb","stylesheetManager","win","insertRule","deleteRule","replace","replaceSync","supportedNestedCSSRuleTypes","unmodifiedFunctions","typeKey","initAdoptedStyleSheetObserver","host","_c","hostId","patchTarget","originalPropertyDescriptor","sheets","result","initStyleDeclarationObserver","styleDeclarationCb","ignoreCSSAttributes","setProperty","property","priority","removeProperty","initMediaInteractionObserver","mediaInteractionCb","currentTime","volume","muted","playbackRate","initFontObserver","fontCb","fontMap","originalFontFace","family","descriptors","fontFace","restoreHandler","patch","original","initSelectionObserver","param","selectionCb","collapsed","updateSelection","selection","ranges","count","i","range","startContainer","startOffset","endContainer","endOffset","mergeHooks","o","hooks","mutationCb","canvasMutationCb","initObservers","mutationObserver","mousemoveHandler","mouseInteractionHandler","scrollHandler","viewportResizeHandler","inputHandler","mediaInteractionHandler","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","selectionObserver","pluginHandlers","plugin","b","CrossOriginIframeMirror","generateIdFn","iframe","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","remoteIdToIdMap","id","map","ids","IframeManager","options","CrossOriginIframeMirror","genId","iframeEl","cb","childSn","_a","message","transformedEvent","e","EventType","IncrementalSource","n","p","range","style","iframeMirror","obj","keys","key","node","child","ShadowDomManager","options","manager","patch","original","option","shadowRoot","doc","isNativeShadowDom","initMutationObserver","initScrollObserver","initAdoptedStyleSheetObserver","iframeElement","restorePatch","__rest","s","t","p","__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","reject","fulfilled","step","e","rejected","result","chars","lookup","i","encode","arraybuffer","bytes","len","base64","canvasVarMap","variableListFor","ctx","ctor","contextMap","saveWebGLVar","value","win","isInstanceOfWebGLObject","name","list","index","serializeArg","arg","base64","encode","src","serializeArgs","args","initCanvas2DMutationObserver","cb","win","blockClass","blockSelector","handlers","props2D","prop","restoreHandler","patch","original","args","isBlocked","recordArgs","serializeArgs","CanvasContext","_a","hookHandler","hookSetter","v","h","initCanvasContextObserver","win","blockClass","blockSelector","handlers","restoreHandler","patch","original","contextType","args","isBlocked","_a","h","patchGLPrototype","prototype","type","cb","blockClass","blockSelector","mirror","win","handlers","props","prop","restoreHandler","patch","original","args","result","saveWebGLVar","isBlocked","recordArgs","serializeArgs","mutation","_a","hookHandler","hookSetter","v","initCanvasWebGLMutationObserver","CanvasContext","h","WorkerClass","WorkerThreads","e","decodeBase64","base64","enableUnicode","createBase64WorkerFactory","sourcemapArg","enableUnicodeArg","sourcemap","source","start","body","options","WorkerClass","decodeBase64","base64","enableUnicode","binaryString","binaryView","n","createURL","sourcemapArg","enableUnicodeArg","sourcemap","source","start","body","blob","createBase64WorkerFactory","url","options","kIsNodeJS","isNodeJS","createBase64WorkerFactory","base64","sourcemapArg","enableUnicodeArg","isNodeJS","WorkerFactory","createBase64WorkerFactory","CanvasManager","options","target","mutation","sampling","win","blockClass","blockSelector","recordCanvas","dataURLOptions","fps","canvasContextReset","initCanvasContextObserver","snapshotInProgressMap","worker","WorkerFactory","e","id","base64","type","width","height","CanvasContext","timeBetweenSnapshots","lastSnapshotTime","rafId","getCanvas","matchedCanvas","canvas","isBlocked","takeCanvasSnapshots","timestamp","__awaiter","_a","context","bitmap","canvas2DReset","initCanvas2DMutationObserver","canvasWebGL1and2Reset","initCanvasWebGLMutationObserver","setLatestRAFTimestamp","values","valuesWithType","value","__rest","StylesheetManager","options","StyleSheetMirror","linkEl","childSn","sheets","hostId","adoptedStyleSheetData","styles","sheet","styleId","rules","r","index","getCssRuleString","wrapEvent","e","wrappedEmit","takeFullSnapshot","canvasManager","recording","mirror","createMirror","record","options","emit","checkoutEveryNms","checkoutEveryNth","blockClass","blockSelector","ignoreClass","maskTextClass","maskTextSelector","inlineStylesheet","maskAllInputs","_maskInputOptions","_slimDOMOptions","maskInputFn","maskTextFn","hooks","packFn","sampling","dataURLOptions","mousemoveWait","recordCanvas","recordCrossOriginIframes","userTriggeredOnInput","collectFonts","inlineImages","plugins","keepIframeSrcFn","ignoreCSSAttributes","inEmittingFrame","passEmitsToParent","maskInputOptions","slimDOMOptions","polyfill","lastFullSnapshotEvent","incrementalSnapshotCount","eventProcessor","plugin","isCheckout","_a","mutationBuffers","EventType","IncrementalSource","buf","message","exceedCount","exceedTime","wrappedMutationEmit","m","wrappedScrollEmit","p","wrappedCanvasMutationEmit","wrappedAdoptedStyleSheetEmit","a","stylesheetManager","StylesheetManager","iframeManager","IframeManager","CanvasManager","shadowDomManager","ShadowDomManager","_b","_c","_d","_e","_f","getWindowWidth","getWindowHeight","node","snapshot","n","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","iframe","childSn","linkEl","handlers","on","observe","doc","initObservers","positions","source","d","v","r","payload","iframeEl","init","h","error","tag","SessionReplayController","opts","_a","_b","_c","options","event","record","events","ALPHANA_SDK_VERSION","detectDeviceCategory","ua","_a","_b","s","detectOs","detectBrowser","readUaData","uaData","uaDataDevice","platform","collectClientContext","sessionId","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","device","colorScheme","timeZone","e","langs","readDataAmount","el","_a","raw","n","readDataCurrency","readDataEventName","findBindingFromEvent","target","bindingsById","node","id","binding","resolveRevenueAmount","matchedEl","_b","_c","amount","currency","eventName","ElementBindingsController","handlers","event","hit","resolved","bindings","b","HOST_ID","ALPHANA_HOME","ALPHANA_MARK_SRC","destroyConsentBanner","_a","renderConsentBanner","config","handlers","host","shadow","dir","theme","policyLabel","poweredLabel","style","sheet","title","message","policyHref","policy","actions","rejectBtn","acceptBtn","footer","brand","brandImg","brandText","CONSENT_STORAGE_KEY","safeGet","key","safeSet","value","e","readConsent","raw","parsed","writeConsent","status","version","DEFAULT_ENDPOINT","DEFAULTS","FIRST_TOUCH_KEY","LAST_TOUCH_KEY","UTM_PARAM_MAP","CLICK_ID_PARAMS","safeLocalStorageGet","key","safeLocalStorageSet","value","e","readTouch","raw","parsed","writeTouch","hostFromReferrer","referrer","currentSearchParams","readUtmParams","searchParams","_a","utm","param","readClickIds","clickIds","withNormalizedPaths","event","normalizeTrackerPath","UserTracker","config","_e","existingVisitorId","peekVisitorId","generateSessionId","path","existingFirst","touch","attribution","_b","runtime","consentWidget","stored","readConsent","renderConsentBanner","writeConsent","bindings","ElementBindingsController","binding","amount","currency","eventName","persistVisitorId","emit","sessionId","collectClientContext","NavigationPlugin","TimePlugin","HeatmapPlugin","SessionReplayController","LogCapture","destroyConsentBanner","_c","_d","_f","authHeaders","body","buildCollectHeartbeatBody","postIngest","postIngestBeacon","prev","pts","fn","resolvedPath","payload","properties","flagKey","url","apiBaseFromEventsEndpoint","res","data","experimentKey","v","variantKey","keys","acc","k","collectUrlFromEventsEndpoint","batch","buildCollectBatchBody","events","import_react","TrackerContext","useTrackerContext","import_jsx_runtime","UserTrackerProvider","config","children","trackerRef","UserTracker","tracker","TrackerContext","import_react","useTracker","useTrackerContext","usePageView","path","tracker","useHeatmapData","refreshMs","data","setData","pendingRef","targetPath","normalizeTrackerPath","refresh","event","usePageViews","views","setViews","useTrackRevenue","payload","useTrackGoal","useTrackJourneyStep","useTimeSpent","time","setTime","useFeatureFlags","flags","setFlags","_a","unsub","useFeatureFlagEnabled","flagKey","useAbTests","variants","setVariants","useAbVariant","experimentKey","v","useIsAbVariant","variantKey"]}