@obsrviq/tracker 0.3.0 → 0.4.1

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/util.ts","../src/recorder.ts","../src/mask.ts","../src/serialize.ts","../src/console.ts","../src/network.ts","../src/errors.ts","../src/vitals.ts","../src/interactions.ts","../src/forms.ts","../src/scroll.ts","../src/pageviews.ts","../src/ui.ts","../src/storage.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { gzipSync } from 'fflate';\nimport type { IngestBatch, IngestSessionMeta, ObsrviqEvent } from '@obsrviq/types';\n\nexport interface TransportOptions {\n endpoint: string;\n siteKey: string;\n sessionId: string;\n getMeta: () => IngestSessionMeta | undefined;\n beforeSend?: (batch: IngestBatch) => IngestBatch | null;\n flushIntervalMs: number;\n /** Resume seq from here (continued session); defaults to 0. Keeps the chunk\n * (session_id, seq) key monotonic across page loads. */\n startSeq?: number;\n /** Called at DISPATCH (before the network await) with the NEXT seq to use — lets\n * the host persist progress synchronously so a later page load resumes without a\n * seq collision even if an unload interrupts the in-flight request. */\n onSeqDispatch?: (nextSeq: number) => void;\n /** test/observability hook */\n onFlush?: (info: { bytes: number; events: number; ok: boolean }) => void;\n}\n\nconst MAX_BUFFER_EVENTS = 5000; // backpressure cap (R-5)\n\nexport class Transport {\n private buffer: ObsrviqEvent[] = [];\n private seq: number;\n private timer: ReturnType<typeof setInterval> | undefined;\n private sending = false;\n private retryDelay = 1000;\n private stopped = false;\n\n constructor(private opts: TransportOptions) {\n this.seq = opts.startSeq ?? 0;\n }\n\n start() {\n this.timer = setInterval(() => void this.flush('timer'), this.opts.flushIntervalMs);\n document.addEventListener('visibilitychange', this.onVisibility, { capture: true });\n window.addEventListener('pagehide', this.onPageHide, { capture: true });\n }\n\n enqueue(event: ObsrviqEvent) {\n if (this.stopped) return;\n this.buffer.push(event);\n // Backpressure: if we've buffered a lot, flush early; if still over after a\n // failed flush, drop the oldest DOM events (keep structured signal).\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n void this.flush('backpressure');\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n this.buffer = this.buffer.filter((e, i) => e.type !== 'dom' || i % 2 === 0);\n }\n }\n }\n\n /** Build, compress, and send the current buffer. Returns true on success. */\n async flush(reason: 'timer' | 'hidden' | 'pagehide' | 'manual' | 'backpressure'): Promise<boolean> {\n if (this.sending || this.buffer.length === 0) return true;\n this.sending = true;\n const events = this.buffer;\n this.buffer = [];\n\n let batch: IngestBatch | null = {\n siteKey: this.opts.siteKey,\n sessionId: this.opts.sessionId,\n seq: this.seq,\n meta: this.opts.getMeta(),\n events,\n };\n if (this.opts.beforeSend) {\n try {\n batch = this.opts.beforeSend(batch);\n } catch {\n batch = null;\n }\n }\n if (!batch) {\n this.sending = false;\n return true; // dropped intentionally\n }\n\n // Reserve the next seq + stamp activity SYNCHRONOUSLY at dispatch — before any\n // network await. This is what session continuation persists, so an unload that\n // interrupts the in-flight request can never let the next page re-use this seq\n // (which would overwrite a chunk). It also means lastActivity reflects real\n // dispatch attempts even when the network is down and sends keep failing — so an\n // active-but-offline session isn't wrongly treated as idle and split.\n this.opts.onSeqDispatch?.(this.seq + 1);\n\n const json = JSON.stringify(batch);\n const gz = gzipSync(new TextEncoder().encode(json));\n const ok = await this.send(gz, reason === 'pagehide' || reason === 'hidden');\n this.opts.onFlush?.({ bytes: gz.byteLength, events: events.length, ok });\n\n if (ok) {\n this.seq++;\n this.retryDelay = 1000;\n this.sending = false;\n return true;\n }\n\n // Failed: re-buffer (capped) and retry with jitter.\n this.buffer = events.slice(-MAX_BUFFER_EVENTS).concat(this.buffer);\n this.sending = false;\n if (!this.stopped) {\n const jitter = this.retryDelay * (0.5 + Math.random());\n this.retryDelay = Math.min(this.retryDelay * 2, 30_000);\n setTimeout(() => void this.flush('timer'), jitter);\n }\n return false;\n }\n\n private async send(bytes: Uint8Array, unloading: boolean): Promise<boolean> {\n const url = `${this.opts.endpoint.replace(/\\/$/, '')}/v1/batch`;\n const headers = {\n 'content-type': 'application/octet-stream',\n 'x-obsrviq-key': this.opts.siteKey,\n };\n const body = bytes as unknown as BodyInit;\n\n // Unload path: a normal fetch would be cancelled as the page goes away, so\n // use sendBeacon (survives navigation) or a keepalive fetch. BOTH cap the\n // body at ~64KB, so large (snapshot) batches are best-effort here — but the\n // periodic flushes below send them reliably during normal operation.\n if (unloading) {\n const blob = new Blob([bytes as unknown as BlobPart], { type: 'application/octet-stream' });\n if (typeof navigator.sendBeacon === 'function') {\n try {\n if (navigator.sendBeacon(url, blob)) return true;\n } catch {\n /* fall through */\n }\n }\n try {\n void fetch(url, { method: 'POST', body, headers, keepalive: true, credentials: 'omit', mode: 'cors' }).catch(\n () => {},\n );\n return true;\n } catch {\n return false;\n }\n }\n\n // Normal flush: a plain fetch — NO `keepalive`, so there's no 64KB body cap\n // and large FullSnapshot batches actually send. Await the real result so a\n // failure (rejected / 4xx / 5xx / network) re-buffers and retries instead of\n // being silently dropped. A timeout aborts a hung request so it can't stall\n // all future flushes (`sending` stays true until this resolves).\n const ctrl = new AbortController();\n const timeout = setTimeout(() => ctrl.abort(), 15_000);\n try {\n const res = await fetch(url, {\n method: 'POST',\n body,\n headers,\n credentials: 'omit',\n mode: 'cors',\n signal: ctrl.signal,\n });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private onVisibility = () => {\n if (document.visibilityState === 'hidden') void this.flush('hidden');\n };\n private onPageHide = () => {\n void this.flush('pagehide');\n };\n\n stop() {\n this.stopped = true;\n if (this.timer) clearInterval(this.timer);\n document.removeEventListener('visibilitychange', this.onVisibility, { capture: true });\n window.removeEventListener('pagehide', this.onPageHide, { capture: true });\n void this.flush('manual');\n }\n}\n","// Small browser utilities shared across the SDK.\n\nexport function uuid(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n // RFC4122-ish fallback.\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/** A monotonic-ish session clock: ms since the session started. */\nexport class Clock {\n readonly startedAt: number;\n private perfStart: number;\n /** Wall ms elapsed between the ORIGINAL session start and this page's start —\n * added to every `t` so a resumed (continued) session's timeline keeps climbing\n * across the inactivity gap instead of restarting at 0. 0 for a fresh session. */\n private baseT: number;\n /** @param resumeStartedAt epoch ms of the original session start when RESUMING a\n * continued session; omit for a fresh session.\n * @param floorT highest `t` the prior page reached — guarantees this page's\n * timeline starts after it, so a backward wall-clock jump between loads can't\n * produce overlapping timestamps (which would corrupt replay ordering). */\n constructor(resumeStartedAt?: number, floorT?: number) {\n const wallNow = Date.now();\n this.startedAt = resumeStartedAt ?? wallNow;\n this.perfStart = typeof performance !== 'undefined' ? performance.now() : 0;\n this.baseT = Math.max(0, wallNow - this.startedAt, floorT ?? 0);\n }\n /** ms since the (original) session start — the master clock `t`. */\n now(): number {\n const p = typeof performance !== 'undefined' ? performance.now() : Date.now() - this.startedAt;\n return Math.max(0, this.baseT + Math.round(p - this.perfStart));\n }\n /** wall-clock epoch ms for display (`ts`). */\n wall(): number {\n return Date.now();\n }\n /** Convert a performance-timeline timestamp (since timeOrigin) to session t. */\n fromPerf(perfTs: number): number {\n return Math.max(0, this.baseT + Math.round(perfTs - this.perfStart));\n }\n}\n\nexport async function sha256Hex(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input));\n return Array.from(new Uint8Array(buf))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Non-crypto fallback (still one-way enough for an opaque id).\n let h = 0;\n for (let i = 0; i < input.length; i++) h = (Math.imul(31, h) + input.charCodeAt(i)) | 0;\n return (h >>> 0).toString(16);\n}\n\nexport function detectDevice(): {\n type: 'desktop' | 'mobile' | 'tablet';\n os?: string;\n browser?: string;\n viewport: { w: number; h: number };\n} {\n const ua = navigator.userAgent;\n const viewport = { w: window.innerWidth, h: window.innerHeight };\n let type: 'desktop' | 'mobile' | 'tablet' = 'desktop';\n if (/iPad|Tablet/i.test(ua)) type = 'tablet';\n else if (/Mobi|Android|iPhone/i.test(ua)) type = 'mobile';\n\n let os: string | undefined;\n if (/Windows/i.test(ua)) os = 'Windows';\n else if (/Mac OS X|Macintosh/i.test(ua)) os = 'macOS';\n else if (/Android/i.test(ua)) os = 'Android';\n else if (/iPhone|iPad|iOS/i.test(ua)) os = 'iOS';\n else if (/Linux/i.test(ua)) os = 'Linux';\n\n let browser: string | undefined;\n if (/Edg\\//.test(ua)) browser = 'Edge';\n else if (/Chrome\\//.test(ua)) browser = 'Chrome';\n else if (/Firefox\\//.test(ua)) browser = 'Firefox';\n else if (/Safari\\//.test(ua)) browser = 'Safari';\n\n return { type, os, browser, viewport };\n}\n\n/** Global Privacy Control / Do Not Track. */\nexport function privacySignalsOptOut(): boolean {\n const nav = navigator as Navigator & { globalPrivacyControl?: boolean; doNotTrack?: string };\n if (nav.globalPrivacyControl === true) return true;\n if (nav.doNotTrack === '1' || (window as { doNotTrack?: string }).doNotTrack === '1') return true;\n return false;\n}\n","import { record } from 'rrweb';\nimport type { eventWithTime } from '@rrweb/types';\nimport type { DomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n// rrweb EventType.IncrementalSnapshot === 3 (a real DOM mutation/interaction).\nconst INCREMENTAL = 3;\n\nexport function instrumentDom(ctx: InstrumentCtx): Teardown {\n const stop = record({\n emit(event: eventWithTime) {\n const dom: DomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'dom',\n t: ctx.clock.fromPerf(performanceNow()),\n ts: ctx.clock.wall(),\n data: event,\n };\n ctx.emit(dom);\n if (event.type === INCREMENTAL) ctx.markActivity();\n },\n maskAllInputs: ctx.config.maskAllInputs,\n // Password inputs stay masked even in no-privacy mode (maskAllInputs:false) —\n // a hard floor so recordings never store plaintext passwords.\n maskInputOptions: { password: true },\n maskTextSelector: ctx.config.maskTextSelector,\n blockSelector: ctx.config.blockSelector,\n recordCanvas: ctx.config.recordCanvas,\n // Periodic full snapshots → the player can start replay from the nearest\n // checkpoint, enabling progressive buffering + reliable seeking (§8.6).\n checkoutEveryNms: 30_000,\n sampling: {\n // Don't record every mousemove point; sample for a smaller payload.\n mousemove: 50,\n scroll: 150,\n input: 'last',\n },\n });\n\n return () => {\n try {\n stop?.();\n } catch {\n /* already stopped */\n }\n };\n}\n\nfunction performanceNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n","// Masking pipeline (PRIV). Applied to console args and network bodies before\n// anything leaves the page. Heuristics catch the obvious PII; tenants tighten\n// with maskTextSelector / beforeSend.\n\nconst EMAIL = /[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}/gi;\nconst CC = /\\b(?:\\d[ -]*?){13,19}\\b/g; // candidate card numbers\nconst SSN = /\\b\\d{3}-\\d{2}-\\d{4}\\b/g;\nconst LONG_DIGITS = /\\b\\d{9,}\\b/g; // phone-ish / account-ish\n\n// Keys whose values we always redact regardless of content.\nconst SENSITIVE_KEYS =\n /(pass(word)?|secret|token|api[-_]?key|authorization|cookie|ssn|card|cvv|pin|otp)/i;\n\nexport function maskString(input: string): string {\n return input\n .replace(EMAIL, '«email»')\n .replace(CC, (m) => (luhnish(m) ? '«card»' : m))\n .replace(SSN, '«ssn»')\n .replace(LONG_DIGITS, '«number»');\n}\n\nfunction luhnish(s: string): boolean {\n const digits = s.replace(/\\D/g, '');\n return digits.length >= 13 && digits.length <= 19;\n}\n\nexport function isSensitiveKey(key: string): boolean {\n return SENSITIVE_KEYS.test(key);\n}\n\n/** Recursively mask an object's string values and sensitive keys. */\nexport function maskValue(value: unknown, depth = 0): unknown {\n if (depth > 6) return '«depth»';\n if (typeof value === 'string') return maskString(value);\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map((v) => maskValue(v, depth + 1));\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = isSensitiveKey(k) ? '«redacted»' : maskValue(v, depth + 1);\n }\n return out;\n}\n","import type { SerializedArg } from '@obsrviq/types';\nimport { maskString, maskValue } from './mask.js';\n\nconst DEFAULT_MAX_BYTES = 8 * 1024; // 8 KB string cap (§6.1)\n\nfunction byteLen(s: string): number {\n return new Blob([s]).size;\n}\n\nfunction truncate(s: string, maxBytes: number): { value: string; truncated: boolean } {\n if (byteLen(s) <= maxBytes) return { value: s, truncated: false };\n // Cheap char-based cut; good enough for previews.\n const approx = Math.max(16, Math.floor(maxBytes * 0.95));\n return { value: s.slice(0, approx), truncated: true };\n}\n\n/** Serialize a single console/track argument into a SerializedArg (§4, §6.1). */\nexport function serializeArg(arg: unknown, maxBytes = DEFAULT_MAX_BYTES): SerializedArg {\n if (arg === null) return { kind: 'primitive', value: null };\n const type = typeof arg;\n\n if (type === 'number' || type === 'boolean') {\n return { kind: 'primitive', value: arg as number | boolean };\n }\n\n if (type === 'string') {\n const masked = maskString(arg as string);\n const { value, truncated } = truncate(masked, maxBytes);\n return { kind: 'string', value, truncated };\n }\n\n if (arg instanceof Error) {\n return {\n kind: 'error',\n name: arg.name,\n message: maskString(arg.message),\n stack: arg.stack ? maskString(arg.stack) : undefined,\n };\n }\n\n if (arg instanceof Element) {\n return { kind: 'dom', selector: cssPath(arg) };\n }\n\n if (type === 'object' || type === 'function' || type === 'symbol' || type === 'bigint') {\n const masked = maskValue(arg);\n let json: string | undefined;\n let truncated = false;\n try {\n const full = JSON.stringify(masked, safeReplacer());\n const cut = truncate(full ?? 'undefined', maxBytes);\n json = cut.value;\n truncated = cut.truncated;\n } catch {\n json = undefined;\n }\n return { kind: 'object', preview: previewOf(masked), json, truncated };\n }\n\n // undefined / fallback\n return { kind: 'primitive', value: String(arg) };\n}\n\nfunction safeReplacer() {\n const seen = new WeakSet();\n return (_key: string, value: unknown) => {\n if (typeof value === 'bigint') return `${value.toString()}n`;\n if (typeof value === 'function') return `ƒ ${(value as { name?: string }).name || 'anonymous'}`;\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) return '«circular»';\n seen.add(value);\n }\n return value;\n };\n}\n\nfunction previewOf(value: unknown): string {\n if (Array.isArray(value)) return `Array(${value.length})`;\n if (value && typeof value === 'object') {\n const keys = Object.keys(value as object);\n const head = keys.slice(0, 4).join(', ');\n return `{ ${head}${keys.length > 4 ? ', …' : ''} }`;\n }\n return String(value);\n}\n\n/** A short, stable CSS-ish selector for a DOM node (no PII). */\nexport function cssPath(el: Element): string {\n const parts: string[] = [];\n let node: Element | null = el;\n let depth = 0;\n while (node && node.nodeType === 1 && depth < 5) {\n let part = node.tagName.toLowerCase();\n if (node.id) {\n part += `#${node.id}`;\n parts.unshift(part);\n break;\n }\n const cls = (node.getAttribute('class') || '').trim().split(/\\s+/).filter(Boolean)[0];\n if (cls) part += `.${cls}`;\n parts.unshift(part);\n node = node.parentElement;\n depth++;\n }\n return parts.join(' > ');\n}\n\n/** Parse the top frame of a stack into a source location. */\nexport function parseSource(stack?: string): { url?: string; line?: number; col?: number } | undefined {\n if (!stack) return undefined;\n const lines = stack.split('\\n').map((l) => l.trim());\n for (const line of lines) {\n const m =\n line.match(/\\((https?:\\/\\/[^)]+):(\\d+):(\\d+)\\)/) ||\n line.match(/at (https?:\\/\\/\\S+):(\\d+):(\\d+)/) ||\n line.match(/(https?:\\/\\/\\S+):(\\d+):(\\d+)/);\n if (m) return { url: m[1], line: Number(m[2]), col: Number(m[3]) };\n }\n return undefined;\n}\n","import type { ConsoleEvent, ConsoleLevel, ErrorEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { serializeArg, parseSource } from './serialize.js';\nimport { uuid } from './util.js';\n\nconst LEVELS: ConsoleLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\nconst MAX_PER_SEC = 100; // flood cap (§6.1)\n\nexport function instrumentConsole(ctx: InstrumentCtx): Teardown {\n const original: Partial<Record<ConsoleLevel, (...a: unknown[]) => void>> = {};\n let windowStart = ctx.clock.now();\n let inWindow = 0;\n let suppressed = 0;\n\n function rateLimited(): boolean {\n const now = ctx.clock.now();\n if (now - windowStart >= 1000) {\n if (suppressed > 0) {\n // surface a single synthetic note that we dropped a flood\n emitConsole('warn', [\n { kind: 'string', value: `Obsrviq: suppressed ${suppressed} console messages (flood cap)` },\n ]);\n suppressed = 0;\n }\n windowStart = now;\n inWindow = 0;\n }\n if (inWindow >= MAX_PER_SEC) {\n suppressed++;\n return true;\n }\n inWindow++;\n return false;\n }\n\n function emitConsole(level: ConsoleLevel, args: ConsoleEvent['args'], stack?: string) {\n const source = parseSource(stack);\n const e: ConsoleEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'console',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n level,\n args,\n stack: level === 'error' ? stack : undefined,\n source,\n };\n ctx.emit(e);\n }\n\n for (const level of LEVELS) {\n const orig = console[level] as (...a: unknown[]) => void;\n original[level] = orig;\n console[level] = (...args: unknown[]) => {\n try {\n orig.apply(console, args);\n } catch {\n /* never let our wrapper break the original */\n }\n try {\n if (rateLimited()) return;\n const serialized = args.map((a) => serializeArg(a, ctx.config.maxArgBytes));\n let stack: string | undefined;\n if (level === 'error') {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n stack = errArg?.stack ?? new Error().stack;\n }\n emitConsole(level, serialized, stack);\n } catch {\n /* swallow */\n }\n };\n }\n\n return () => {\n for (const level of LEVELS) {\n if (original[level]) console[level] = original[level]!;\n }\n };\n}\n\n/** Shared helper used by errors.ts to also surface uncaught errors in console. */\nexport function errorToConsoleEvent(ctx: InstrumentCtx, err: ErrorEvent): ConsoleEvent {\n return {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'console',\n t: err.t,\n ts: err.ts,\n level: 'error',\n args: [{ kind: 'error', name: err.name, message: err.message, stack: err.stack }],\n stack: err.stack,\n source: err.source,\n };\n}\n","import type { NetworkEvent, NetworkResourceType, NetworkTiming } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { maskString } from './mask.js';\nimport { uuid } from './util.js';\n\nconst BODY_CAP = 4 * 1024; // 4 KB body preview cap\n// Response/request header allowlist — everything else is dropped.\nconst HEADER_ALLOW = new Set([\n 'content-type',\n 'content-length',\n 'accept',\n 'accept-encoding',\n 'cache-control',\n 'etag',\n 'last-modified',\n 'content-encoding',\n 'x-request-id',\n 'x-correlation-id',\n 'server',\n 'vary',\n]);\n\nfunction redactUrl(raw: string): string {\n try {\n const u = new URL(raw, location.href);\n if (u.search) u.search = '?…';\n return u.toString();\n } catch {\n return raw.split('?')[0] ?? raw;\n }\n}\n\nfunction classifyHttp(status: number): string | undefined {\n if (status === 0) return 'network';\n if (status >= 500) return 'http_5xx';\n if (status >= 400) return 'http_4xx';\n return undefined;\n}\n\nfunction pickHeaders(\n redact: string[],\n entries: Iterable<[string, string]>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n const redactSet = new Set(redact.map((h) => h.toLowerCase()));\n for (const [k, v] of entries) {\n const key = k.toLowerCase();\n if (redactSet.has(key)) out[key] = 'redacted';\n else if (HEADER_ALLOW.has(key)) out[key] = v;\n }\n return out;\n}\n\nfunction bodyPreview(\n text: string | undefined,\n contentType: string | undefined,\n): NetworkEvent['requestBody'] {\n if (text == null) return undefined;\n const masked = maskString(text);\n const truncated = masked.length > BODY_CAP;\n return {\n contentType,\n preview: truncated ? masked.slice(0, BODY_CAP) : masked,\n truncated,\n redacted: masked !== text,\n };\n}\n\nfunction enrichTiming(ctx: InstrumentCtx, url: string, base: NetworkTiming): NetworkTiming {\n try {\n const entries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n // newest matching entry by URL\n const match = entries.filter((e) => e.name === url).pop();\n if (!match) return base;\n const t: NetworkTiming = { ...base };\n if (match.domainLookupEnd && match.domainLookupStart)\n t.dns = Math.max(0, match.domainLookupEnd - match.domainLookupStart);\n if (match.connectEnd && match.connectStart)\n t.tcp = Math.max(0, match.connectEnd - match.connectStart);\n if (match.secureConnectionStart)\n t.tls = Math.max(0, match.connectEnd - match.secureConnectionStart);\n if (match.responseStart && match.requestStart)\n t.ttfb = Math.max(0, match.responseStart - match.requestStart);\n if (match.responseEnd && match.responseStart)\n t.download = Math.max(0, match.responseEnd - match.responseStart);\n return t;\n } catch {\n return base;\n }\n}\n\nexport function instrumentNetwork(ctx: InstrumentCtx): Teardown {\n const teardowns: Teardown[] = [];\n teardowns.push(wrapFetch(ctx));\n teardowns.push(wrapXhr(ctx));\n teardowns.push(wrapBeacon(ctx));\n teardowns.push(observeResources(ctx));\n return () => teardowns.forEach((t) => t());\n}\n\n// ───────────────────────────── fetch ────────────────────────────────\nfunction wrapFetch(ctx: InstrumentCtx): Teardown {\n const orig = window.fetch;\n if (!orig) return () => {};\n window.fetch = async function (input: RequestInfo | URL, init?: RequestInit) {\n const rawUrl = input instanceof Request ? input.url : String(input);\n // Never record our own telemetry round-trips to the ingest endpoint.\n if (rawUrl.includes('/v1/batch')) return orig.call(window, input as RequestInfo, init);\n const startT = ctx.clock.now();\n const method = (init?.method || (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url = redactUrl(rawUrl);\n const reqHeaders = pickHeaders(\n ctx.config.redactHeaders,\n headerEntries(init?.headers ?? (input instanceof Request ? input.headers : undefined)),\n );\n\n const emit = (partial: Partial<NetworkEvent>) => {\n const endT = ctx.clock.now();\n const timing = enrichTiming(ctx, rawUrl, { startT, endT, duration: endT - startT });\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: startT,\n ts: ctx.clock.wall(),\n initiator: 'fetch',\n method,\n url,\n status: 0,\n ok: false,\n resourceType: 'fetch',\n requestHeaders: reqHeaders,\n timing,\n ...partial,\n };\n ctx.emit(ev);\n ctx.markActivity();\n };\n\n try {\n const res = await orig.call(window, input as RequestInfo, init);\n const status = res.status;\n const respHeaders = pickHeaders(ctx.config.redactHeaders, res.headers.entries());\n const len = res.headers.get('content-length');\n let responseBody: NetworkEvent['responseBody'];\n if (ctx.config.captureNetworkBodies && isTexty(res.headers.get('content-type'))) {\n try {\n const text = await res.clone().text();\n responseBody = bodyPreview(text, res.headers.get('content-type') || undefined);\n } catch {\n /* ignore */\n }\n }\n emit({\n status,\n ok: res.ok,\n responseSize: len ? Number(len) : undefined,\n responseHeaders: respHeaders,\n requestBody: ctx.config.captureNetworkBodies\n ? bodyPreview(stringifyBody(init?.body), undefined)\n : undefined,\n responseBody,\n error: classifyHttp(status),\n });\n return res;\n } catch (err) {\n emit({ status: 0, ok: false, error: classifyFetchError(err) });\n throw err;\n }\n } as typeof window.fetch;\n return () => {\n window.fetch = orig;\n };\n}\n\nfunction classifyFetchError(err: unknown): string {\n const name = (err as { name?: string })?.name;\n if (name === 'AbortError') return 'aborted';\n const msg = String((err as { message?: string })?.message || '').toLowerCase();\n if (msg.includes('cors')) return 'cors';\n if (msg.includes('timeout')) return 'timeout';\n return 'network';\n}\n\n// ────────────────────────────── XHR ─────────────────────────────────\ninterface XhrMeta {\n method: string;\n url: string;\n rawUrl: string;\n startT: number;\n reqHeaders: Record<string, string>;\n body?: string;\n}\n\nfunction wrapXhr(ctx: InstrumentCtx): Teardown {\n const XHR = XMLHttpRequest.prototype;\n const origOpen = XHR.open;\n const origSend = XHR.send;\n const origSetHeader = XHR.setRequestHeader;\n const META = new WeakMap<XMLHttpRequest, XhrMeta>();\n\n XHR.open = function (this: XMLHttpRequest, method: string, url: string | URL, ...rest: unknown[]) {\n const rawUrl = String(url);\n META.set(this, {\n method: String(method).toUpperCase(),\n rawUrl,\n url: redactUrl(rawUrl),\n startT: 0,\n reqHeaders: {},\n });\n return origOpen.apply(this, [method, url, ...rest] as never);\n } as typeof XHR.open;\n\n XHR.setRequestHeader = function (this: XMLHttpRequest, name: string, value: string) {\n const meta = META.get(this);\n if (meta) {\n const key = name.toLowerCase();\n if (ctx.config.redactHeaders.map((h) => h.toLowerCase()).includes(key))\n meta.reqHeaders[key] = 'redacted';\n else if (HEADER_ALLOW.has(key)) meta.reqHeaders[key] = value;\n }\n return origSetHeader.apply(this, [name, value] as never);\n } as typeof XHR.setRequestHeader;\n\n XHR.send = function (this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null) {\n const meta = META.get(this);\n if (meta) {\n meta.startT = ctx.clock.now();\n if (ctx.config.captureNetworkBodies) meta.body = stringifyBody(body);\n const finish = (error?: string) => {\n const endT = ctx.clock.now();\n const timing = enrichTiming(ctx, meta.rawUrl, {\n startT: meta.startT,\n endT,\n duration: endT - meta.startT,\n });\n const status = this.status;\n const respHeaders = parseRawHeaders(ctx, this.getAllResponseHeaders());\n // Response body (texty + readable responseType only), parallel to fetch.\n let responseBody: NetworkEvent['responseBody'];\n if (ctx.config.captureNetworkBodies && isTexty(this.getResponseHeader('content-type'))) {\n try {\n if (this.responseType === '' || this.responseType === 'text') {\n responseBody = bodyPreview(this.responseText, this.getResponseHeader('content-type') || undefined);\n }\n } catch {\n /* opaque/cross-origin response — skip the body */\n }\n }\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: meta.startT,\n ts: ctx.clock.wall(),\n initiator: 'xhr',\n method: meta.method,\n url: meta.url,\n status,\n ok: status >= 200 && status < 400,\n resourceType: 'xhr',\n requestHeaders: meta.reqHeaders,\n responseHeaders: respHeaders,\n responseSize: safeLen(this),\n requestBody: ctx.config.captureNetworkBodies ? bodyPreview(meta.body, undefined) : undefined,\n responseBody,\n timing,\n error: error || classifyHttp(status),\n };\n ctx.emit(ev);\n ctx.markActivity();\n };\n this.addEventListener('loadend', () => finish());\n this.addEventListener('error', () => finish('network'));\n this.addEventListener('timeout', () => finish('timeout'));\n this.addEventListener('abort', () => finish('aborted'));\n }\n return origSend.apply(this, [body] as never);\n } as typeof XHR.send;\n\n return () => {\n XHR.open = origOpen;\n XHR.send = origSend;\n XHR.setRequestHeader = origSetHeader;\n };\n}\n\nfunction safeLen(xhr: XMLHttpRequest): number | undefined {\n try {\n if (xhr.responseType === '' || xhr.responseType === 'text')\n return new Blob([xhr.responseText]).size;\n } catch {\n /* opaque */\n }\n const len = xhr.getResponseHeader('content-length');\n return len ? Number(len) : undefined;\n}\n\nfunction parseRawHeaders(ctx: InstrumentCtx, raw: string): Record<string, string> {\n const entries: [string, string][] = [];\n for (const line of raw.trim().split(/[\\r\\n]+/)) {\n const idx = line.indexOf(':');\n if (idx > 0) entries.push([line.slice(0, idx).trim(), line.slice(idx + 1).trim()]);\n }\n return pickHeaders(ctx.config.redactHeaders, entries);\n}\n\n// ──────────────────────────── sendBeacon ────────────────────────────\nfunction wrapBeacon(ctx: InstrumentCtx): Teardown {\n const orig = navigator.sendBeacon;\n if (!orig) return () => {};\n navigator.sendBeacon = function (url: string | URL, data?: BodyInit | null): boolean {\n const startT = ctx.clock.now();\n let ok = false;\n try {\n ok = orig.call(navigator, url, data);\n } finally {\n // Don't record beacons to our own ingest endpoint.\n const u = String(url);\n if (!u.includes('/v1/batch')) {\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: startT,\n ts: ctx.clock.wall(),\n initiator: 'beacon',\n method: 'POST',\n url: redactUrl(u),\n status: ok ? 202 : 0,\n ok,\n resourceType: 'other',\n timing: { startT, endT: ctx.clock.now(), duration: 0 },\n error: ok ? undefined : 'network',\n };\n ctx.emit(ev);\n }\n }\n return ok;\n };\n return () => {\n navigator.sendBeacon = orig;\n };\n}\n\n// ─────────────────── PerformanceObserver (resources) ────────────────\nconst RESOURCE_TYPE_MAP: Record<string, NetworkResourceType> = {\n script: 'script',\n link: 'stylesheet',\n css: 'stylesheet',\n img: 'image',\n image: 'image',\n font: 'font',\n audio: 'media',\n video: 'media',\n track: 'media',\n};\n\nfunction observeResources(ctx: InstrumentCtx): Teardown {\n if (typeof PerformanceObserver === 'undefined') return () => {};\n let obs: PerformanceObserver | undefined;\n try {\n obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as PerformanceResourceTiming[]) {\n const it = entry.initiatorType;\n // fetch/XHR are captured by our wrappers — skip to avoid duplicates.\n if (it === 'fetch' || it === 'xmlhttprequest' || it === 'beacon') continue;\n const resourceType = RESOURCE_TYPE_MAP[it] || 'other';\n const startT = ctx.clock.fromPerf(entry.startTime);\n const endT = ctx.clock.fromPerf(entry.responseEnd || entry.startTime);\n const timing: NetworkTiming = {\n startT,\n endT,\n duration: Math.max(0, endT - startT),\n dns: nz(entry.domainLookupEnd - entry.domainLookupStart),\n tcp: nz(entry.connectEnd - entry.connectStart),\n tls: entry.secureConnectionStart ? nz(entry.connectEnd - entry.secureConnectionStart) : undefined,\n ttfb: nz(entry.responseStart - entry.requestStart),\n download: nz(entry.responseEnd - entry.responseStart),\n };\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: startT,\n ts: ctx.clock.wall(),\n initiator: 'resource',\n method: 'GET',\n url: redactUrl(entry.name),\n status: entry.responseStatus || 200,\n ok: !entry.responseStatus || entry.responseStatus < 400,\n resourceType,\n responseSize: entry.transferSize || entry.encodedBodySize || undefined,\n timing,\n };\n ctx.emit(ev);\n }\n });\n obs.observe({ type: 'resource', buffered: true });\n } catch {\n return () => {};\n }\n return () => obs?.disconnect();\n}\n\n// ────────────────────────────── helpers ─────────────────────────────\nfunction nz(n: number): number | undefined {\n return Number.isFinite(n) && n > 0 ? Math.round(n) : undefined;\n}\n\nfunction isTexty(contentType: string | null): boolean {\n if (!contentType) return false;\n return /json|text|xml|x-www-form-urlencoded/i.test(contentType);\n}\n\nfunction stringifyBody(body: unknown): string | undefined {\n if (body == null) return undefined;\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n const obj: Record<string, string> = {};\n body.forEach((v, k) => (obj[k] = typeof v === 'string' ? v : '«file»'));\n return JSON.stringify(obj);\n }\n try {\n return JSON.stringify(body);\n } catch {\n return undefined;\n }\n}\n\nfunction headerEntries(\n headers: HeadersInit | Headers | undefined,\n): Iterable<[string, string]> {\n if (!headers) return [];\n if (headers instanceof Headers) return headers.entries();\n if (Array.isArray(headers)) return headers as [string, string][];\n return Object.entries(headers);\n}\n","import type { ErrorEvent as ObsrviqErrorEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { errorToConsoleEvent } from './console.js';\nimport { maskString } from './mask.js';\nimport { parseSource } from './serialize.js';\nimport { uuid } from './util.js';\n\nexport function instrumentErrors(ctx: InstrumentCtx): Teardown {\n function emitError(args: {\n name: string;\n message: string;\n stack?: string;\n source?: { url?: string; line?: number; col?: number };\n handled: boolean;\n }) {\n const e: ObsrviqErrorEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'error',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n name: args.name,\n message: maskString(args.message),\n stack: args.stack ? maskString(args.stack) : undefined,\n source: args.source,\n handled: args.handled,\n };\n ctx.emit(e);\n // Surface uncaught errors in the Console panel too (§9 C-6).\n ctx.emit(errorToConsoleEvent(ctx, e));\n }\n\n const onError = (ev: ErrorEvent) => {\n const err = ev.error as Error | undefined;\n emitError({\n name: err?.name || 'Error',\n message: err?.message || ev.message || 'Unknown error',\n stack: err?.stack,\n source: { url: ev.filename, line: ev.lineno, col: ev.colno },\n handled: false,\n });\n };\n\n const onRejection = (ev: PromiseRejectionEvent) => {\n const reason = ev.reason;\n if (reason instanceof Error) {\n emitError({\n name: reason.name,\n message: reason.message,\n stack: reason.stack,\n source: parseSource(reason.stack),\n handled: false,\n });\n } else {\n emitError({\n name: 'UnhandledRejection',\n message: typeof reason === 'string' ? reason : safeStringify(reason),\n handled: false,\n });\n }\n };\n\n window.addEventListener('error', onError, true);\n window.addEventListener('unhandledrejection', onRejection, true);\n\n return () => {\n window.removeEventListener('error', onError, true);\n window.removeEventListener('unhandledrejection', onRejection, true);\n };\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v) ?? String(v);\n } catch {\n return String(v);\n }\n}\n","import type { PerfEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n// Lightweight web-vitals capture via PerformanceObserver — no extra dependency.\n// Emits LCP, CLS, INP (approx), FCP, TTFB, and a navigation summary (§5/§11).\n\nfunction rate(metric: PerfEvent['metric'], value: number): PerfEvent['rating'] {\n const t: Partial<Record<PerfEvent['metric'], [number, number]>> = {\n LCP: [2500, 4000],\n INP: [200, 500],\n CLS: [0.1, 0.25],\n FCP: [1800, 3000],\n TTFB: [800, 1800],\n };\n const pair = t[metric];\n if (!pair) return undefined;\n if (value <= pair[0]) return 'good';\n if (value <= pair[1]) return 'needs-improvement';\n return 'poor';\n}\n\nexport function instrumentVitals(ctx: InstrumentCtx): Teardown {\n if (typeof PerformanceObserver === 'undefined') return () => {};\n const observers: PerformanceObserver[] = [];\n\n const emit = (metric: PerfEvent['metric'], value: number, detail?: Record<string, number>) => {\n const e: PerfEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'perf',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n metric,\n value: Math.round(value * 1000) / 1000,\n rating: rate(metric, value),\n detail,\n };\n ctx.emit(e);\n };\n\n const obs = (type: string, cb: (entries: PerformanceEntryList) => void, extra?: object) => {\n try {\n const o = new PerformanceObserver((list) => cb(list.getEntries()));\n o.observe({ type, buffered: true, ...extra });\n observers.push(o);\n } catch {\n /* unsupported */\n }\n };\n\n // FCP\n obs('paint', (entries) => {\n for (const e of entries) if (e.name === 'first-contentful-paint') emit('FCP', e.startTime);\n });\n\n // LCP — keep the largest seen.\n let lcp = 0;\n obs('largest-contentful-paint', (entries) => {\n const last = entries[entries.length - 1];\n if (last) lcp = last.startTime;\n });\n\n // CLS — accumulate session layout shift.\n let cls = 0;\n obs('layout-shift', (entries) => {\n for (const e of entries as (PerformanceEntry & { value: number; hadRecentInput: boolean })[]) {\n if (!e.hadRecentInput) cls += e.value;\n }\n });\n\n // INP (approx via event timing — track max interaction delay).\n let inp = 0;\n obs(\n 'event',\n (entries) => {\n for (const e of entries as (PerformanceEntry & { duration: number })[]) {\n if (e.duration > inp) inp = e.duration;\n }\n },\n { durationThreshold: 40 },\n );\n\n // Navigation timing → TTFB + a navigation summary.\n obs('navigation', (entries) => {\n const nav = entries[0] as PerformanceNavigationTiming | undefined;\n if (!nav) return;\n emit('TTFB', nav.responseStart);\n emit('navigation', nav.duration, {\n domInteractive: Math.round(nav.domInteractive),\n domComplete: Math.round(nav.domComplete),\n loadEvent: Math.round(nav.loadEventEnd),\n });\n });\n\n // Flush LCP/CLS/INP on the way out (their final values).\n const flushFinal = () => {\n if (lcp) emit('LCP', lcp);\n emit('CLS', cls);\n if (inp) emit('INP', inp);\n };\n const onHide = () => {\n if (document.visibilityState === 'hidden') flushFinal();\n };\n document.addEventListener('visibilitychange', onHide, true);\n\n return () => {\n observers.forEach((o) => o.disconnect());\n document.removeEventListener('visibilitychange', onHide, true);\n };\n}\n","import type { CustomEvent as ObsrviqCustomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { cssPath } from './serialize.js';\nimport { uuid } from './util.js';\n\nconst RAGE_WINDOW_MS = 1000;\nconst RAGE_THRESHOLD = 3;\nconst DEAD_WAIT_MS = 3000;\n\nfunction isInteractive(el: Element | null): boolean {\n if (!el) return false;\n let node: Element | null = el;\n for (let i = 0; i < 4 && node; i++) {\n const tag = node.tagName.toLowerCase();\n if (['a', 'button', 'input', 'select', 'textarea', 'label', 'summary'].includes(tag))\n return true;\n if (node.getAttribute('role') === 'button' || node.hasAttribute('onclick')) return true;\n if (node.getAttribute('contenteditable') === 'true') return true;\n node = node.parentElement;\n }\n return false;\n}\n\nexport function instrumentInteractions(ctx: InstrumentCtx): Teardown {\n let recent: { el: Element; t: number }[] = [];\n let lastRageAt = -Infinity;\n\n const emitCustom = (name: string, props: Record<string, unknown>, t: number) => {\n const e: ObsrviqCustomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'custom',\n t,\n ts: ctx.clock.wall(),\n name,\n props,\n };\n ctx.emit(e);\n };\n\n const onClick = (ev: MouseEvent) => {\n const target = ev.target as Element | null;\n if (!target || !(target instanceof Element)) return;\n const t = ctx.clock.now();\n const selector = cssPath(target);\n\n // ── Rage click detection ──\n recent = recent.filter((r) => t - r.t <= RAGE_WINDOW_MS);\n recent.push({ el: target, t });\n const sameTarget = recent.filter((r) => r.el === target);\n if (sameTarget.length >= RAGE_THRESHOLD && t - lastRageAt > RAGE_WINDOW_MS) {\n lastRageAt = t;\n emitCustom('rage_click', { selector, count: sameTarget.length }, t);\n }\n\n // ── Dead click detection ──\n if (!isInteractive(target)) {\n const before = ctx.lastActivityT();\n window.setTimeout(() => {\n // No app activity (mutation/nav/network) after the click → dead.\n if (ctx.lastActivityT() <= Math.max(before, t)) {\n emitCustom('dead_click', { selector }, t);\n }\n }, DEAD_WAIT_MS);\n }\n };\n\n window.addEventListener('click', onClick, true);\n return () => window.removeEventListener('click', onClick, true);\n}\n","import type { CustomEvent as ObsrviqCustomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { cssPath } from './serialize.js';\nimport { uuid } from './util.js';\n\n/**\n * Form-field analytics. Watches every form control (input / textarea / select)\n * and, on each blur, emits a lightweight `form_field` custom event describing\n * the *interaction* — never the value:\n *\n * { form, field, type, ms, changed, filled }\n *\n * One event per focus→blur, carrying that focus's duration (`ms`). The server\n * sums `ms` across events for total time-on-field, counts events per session\n * for re-entries, and reads `filled` to find fields people leave blank. A\n * `form_submit` event is emitted when a form is submitted; the last field\n * touched in a session whose form never submitted is the drop-off point.\n *\n * Privacy: values are never read. `filled` is a boolean derived from value\n * length (or `checked`); the field key comes from structural attributes\n * (name / id / label), exactly as form-analytics tools do. Controls inside a\n * blocked region (the configured block selector) are skipped entirely.\n */\n\nconst TRACKED = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n// Non-data inputs: buttons and hidden/file fields carry no fill behaviour worth\n// measuring (and file is privacy-adjacent), so they're left out.\nconst SKIP_INPUT_TYPES = new Set(['hidden', 'submit', 'button', 'reset', 'image', 'file']);\nconst MAX_KEY = 80;\nconst MAX_FOCUS_MS = 300_000; // cap idle-inflated focus time (walked-away tab)\nconst MIN_FOCUS_MS = 100; // ignore sub-100ms programmatic focus blips\n\ntype FormControl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nfunction isTracked(el: EventTarget | null): el is FormControl {\n if (!(el instanceof HTMLElement) || !TRACKED.has(el.tagName)) return false;\n if (el instanceof HTMLInputElement && SKIP_INPUT_TYPES.has(el.type)) return false;\n return true;\n}\n\nfunction controlType(el: FormControl): string {\n if (el instanceof HTMLTextAreaElement) return 'textarea';\n if (el instanceof HTMLSelectElement) return 'select';\n return el.type || 'text';\n}\n\n/** Non-empty / checked — a boolean only, the value itself is never read. */\nfunction isFilled(el: FormControl): boolean {\n if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox' || el.type === 'radio') return el.checked;\n return el.value.trim().length > 0;\n }\n if (el instanceof HTMLSelectElement) return el.value !== '';\n return el.value.trim().length > 0;\n}\n\nfunction clip(s: string): string {\n const t = s.trim().replace(/\\s+/g, ' ');\n return t.length > MAX_KEY ? t.slice(0, MAX_KEY) : t;\n}\n\n/** A stable, human-readable field identity from structural attributes only. */\nfunction fieldKey(el: FormControl): string {\n const name = el.getAttribute('name');\n if (name) return clip(name);\n if (el.id) return clip(el.id);\n const aria = el.getAttribute('aria-label');\n if (aria) return clip(aria);\n const labelledby = el.getAttribute('aria-labelledby');\n if (labelledby) {\n const lbl = labelledby.split(/\\s+/).map((id) => el.ownerDocument.getElementById(id)?.textContent || '').join(' ').trim();\n if (lbl) return clip(lbl);\n }\n if (el.labels && el.labels.length) {\n const lbl = el.labels[0]!.textContent?.trim();\n if (lbl) return clip(lbl);\n }\n const ph = el.getAttribute('placeholder');\n if (ph) return clip(ph);\n return clip(cssPath(el));\n}\n\n/** A stable identity for the owning form (or a per-page bucket for loose fields). */\nfunction formKey(el: FormControl): string {\n const form = el.form;\n if (form) {\n if (form.getAttribute('name')) return clip(form.getAttribute('name')!);\n if (form.id) return clip(form.id);\n const aria = form.getAttribute('aria-label');\n if (aria) return clip(aria);\n const action = form.getAttribute('action');\n if (action) {\n try {\n return clip(new URL(action, location.href).pathname);\n } catch {\n return clip(action);\n }\n }\n return clip(cssPath(form));\n }\n // Form-less controls (common in SPAs) bucket by page path.\n return clip(`page:${location.pathname}`);\n}\n\nexport function instrumentForms(ctx: InstrumentCtx): Teardown {\n const block = ctx.config.blockSelector;\n // Per-focus state for the currently-focused control.\n let focused: { el: FormControl; start: number; changed: boolean } | null = null;\n\n const emit = (name: string, props: Record<string, unknown>) => {\n const e: ObsrviqCustomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'custom',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n name,\n props,\n };\n ctx.emit(e);\n };\n\n const blocked = (el: Element): boolean => {\n try {\n return !!block && !!el.closest(block);\n } catch {\n return false;\n }\n };\n\n const flush = () => {\n if (!focused) return;\n const { el, start, changed } = focused;\n focused = null;\n const ms = Math.min(MAX_FOCUS_MS, Math.max(0, ctx.clock.now() - start));\n // Drop pass-through blips that weren't real interactions.\n if (ms < MIN_FOCUS_MS && !changed) return;\n emit('form_field', {\n form: formKey(el),\n field: fieldKey(el),\n type: controlType(el),\n ms,\n changed,\n filled: isFilled(el),\n });\n };\n\n const onFocusIn = (ev: FocusEvent) => {\n const el = ev.target;\n if (!isTracked(el) || blocked(el)) return;\n if (focused && focused.el !== el) flush(); // safety: blur may have been missed\n focused = { el, start: ctx.clock.now(), changed: false };\n };\n\n const onInput = (ev: Event) => {\n if (focused && ev.target === focused.el) focused.changed = true;\n };\n\n const onFocusOut = (ev: FocusEvent) => {\n if (focused && ev.target === focused.el) flush();\n };\n\n const onSubmit = (ev: Event) => {\n const form = ev.target;\n if (!(form instanceof HTMLFormElement) || blocked(form)) return;\n // Flush the in-progress field so its time lands before the submit marker.\n flush();\n // Reuse a tracked control to derive the key consistently; else fall back to the form itself.\n const probe = form.querySelector<FormControl>('input,textarea,select');\n const key = probe && !blocked(probe) ? formKey(probe) : clip(form.getAttribute('name') || form.id || cssPath(form));\n emit('form_submit', { form: key });\n };\n\n document.addEventListener('focusin', onFocusIn, true);\n document.addEventListener('focusout', onFocusOut, true);\n document.addEventListener('input', onInput, true);\n document.addEventListener('submit', onSubmit, true);\n // A navigation/unload can steal focus without a focusout — flush what we have.\n window.addEventListener('pagehide', flush, true);\n\n return () => {\n flush();\n document.removeEventListener('focusin', onFocusIn, true);\n document.removeEventListener('focusout', onFocusOut, true);\n document.removeEventListener('input', onInput, true);\n document.removeEventListener('submit', onSubmit, true);\n window.removeEventListener('pagehide', flush, true);\n };\n}\n","import type { CustomEvent as ObsrviqCustomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n/**\n * Scroll-depth capture, per page path. Emits a `_scroll` event whenever the\n * visitor reaches a new, deeper 10% band of the page, so the server can take\n * each session's max depth per page. Cheap (a handful of events per page at\n * most) and value-free. The page identity is the pathname; depth resets on SPA\n * route changes.\n */\nexport function instrumentScrollDepth(ctx: InstrumentCtx): Teardown {\n let path = location.pathname;\n let maxBand = 0; // deepest 10% band reached on the current path\n let scheduled = false;\n\n const emit = (depth: number) => {\n const e: ObsrviqCustomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'custom',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n name: '_scroll',\n props: { path, depth },\n };\n ctx.emit(e);\n };\n\n const docHeight = (): number => {\n const d = document.documentElement;\n const b = document.body;\n return Math.max(d.scrollHeight, b ? b.scrollHeight : 0, d.clientHeight) || 1;\n };\n\n const measure = () => {\n scheduled = false;\n // Reset depth tracking when the SPA route changes.\n if (location.pathname !== path) {\n path = location.pathname;\n maxBand = 0;\n }\n const vh = window.innerHeight || document.documentElement.clientHeight || 1;\n const reached = Math.min(1, (window.scrollY + vh) / docHeight());\n const band = Math.min(100, Math.round(reached * 10) * 10);\n if (band > maxBand) {\n maxBand = band;\n emit(band);\n }\n };\n\n const onScroll = () => {\n if (scheduled) return;\n scheduled = true;\n requestAnimationFrame(measure);\n };\n\n window.addEventListener('scroll', onScroll, { passive: true, capture: true });\n // Capture the entry fold immediately (a session that never scrolls still has a depth).\n measure();\n\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n };\n}\n","import type { PageviewEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n/**\n * Auto-captures a `pageview` event on the initial load and on every SPA route\n * change — history.pushState / replaceState (patched, since neither fires a\n * native event), popstate (back/forward), and hashchange.\n *\n * The \"page\" identity is the pathname, plus a hash-router segment when the hash\n * looks like a route (`#/checkout`) but NOT a plain anchor (`#section`) — so\n * anchor jumps don't masquerade as page views. Same-path repeats are de-duped.\n * Each view records the previous in-app path as its `referrer`: the \"from\" edge\n * that Path / Journey analysis chains.\n */\nexport function instrumentPageviews(ctx: InstrumentCtx): Teardown {\n let lastPath: string | null = null;\n\n const currentPath = (): string => {\n const hash = location.hash;\n return location.pathname + (hash.startsWith('#/') ? hash : '');\n };\n\n const fire = () => {\n const path = currentPath();\n if (path === lastPath) return; // de-dupe no-op navigations / anchor jumps\n const referrer = lastPath ?? '';\n lastPath = path;\n const e: PageviewEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'pageview',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n url: location.href,\n path,\n title: document.title || undefined,\n referrer: referrer || undefined,\n };\n ctx.emit(e);\n ctx.markActivity();\n };\n\n // Patch history so SPA navigations (which fire no native event) are observed.\n const origPush = history.pushState;\n const origReplace = history.replaceState;\n const wrap = (orig: History['pushState']): History['pushState'] =>\n function patched(this: History, data, unused, url) {\n const ret = orig.call(this, data, unused, url);\n // Defer one microtask so location.* already reflects the new URL.\n queueMicrotask(fire);\n return ret;\n };\n history.pushState = wrap(origPush);\n history.replaceState = wrap(origReplace);\n window.addEventListener('popstate', fire);\n window.addEventListener('hashchange', fire);\n\n fire(); // the entry view\n\n return () => {\n history.pushState = origPush;\n history.replaceState = origReplace;\n window.removeEventListener('popstate', fire);\n window.removeEventListener('hashchange', fire);\n };\n}\n","/**\n * Self-contained UI the tracker injects into the host page:\n * - showConsent() — a corner consent card (askPermission)\n * - showRecordingDot() — a minimal pulsing \"recording\" dot (showRecording)\n *\n * Isolation rules (the SDK is otherwise headless):\n * - attachShadow({mode:'open'}) + adoptedStyleSheets → no host CSS bleed and\n * CSP-safe (no inline <style>, so `style-src 'self'` pages don't block it).\n * - the host element wears the recorder's block class (default `.obsrviq-block`)\n * so the SDK's own rrweb recorder never captures its own UI. The host box is\n * zero-size (its children are position:fixed), so no placeholder shows in the\n * replay.\n */\n\nexport interface ConsentText {\n title?: string;\n body?: string;\n allow?: string;\n deny?: string;\n}\n\n/** Derive a class the host can wear so the recorder's blockSelector excludes it.\n * blockSelector is usually a class selector (default '.obsrviq-block'). We always\n * keep `obsrviq-block` too, so a custom blockSelector can't accidentally un-hide. */\nfunction blockClassFrom(blockSelector: string): string {\n const m = /\\.([A-Za-z0-9_-]+)/.exec(blockSelector || '');\n const derived = m && m[1] ? m[1] : '';\n return ['obsrviq-block', derived].filter(Boolean).join(' ');\n}\n\nfunction makeHost(blockSelector: string): { host: HTMLElement; root: ShadowRoot } {\n const host = document.createElement('div');\n host.className = blockClassFrom(blockSelector);\n host.setAttribute('data-obsrviq-ui', '');\n host.style.cssText = 'all:initial';\n const root = host.attachShadow({ mode: 'open' });\n return { host, root };\n}\n\nfunction adopt(root: ShadowRoot, css: string): void {\n try {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n root.adoptedStyleSheets = [sheet];\n } catch {\n // Engines without constructable stylesheets — inline <style> inside the shadow\n // (still isolated; only a concern on host pages with a strict style-src CSP).\n const style = document.createElement('style');\n style.textContent = css;\n root.appendChild(style);\n }\n}\n\nfunction mount(host: HTMLElement): void {\n (document.body || document.documentElement).appendChild(host);\n}\n\nconst ACCENT = '#6e76f1';\n\nconst CONSENT_CSS = `\n:host { all: initial; }\n.card {\n position: fixed; bottom: 20px; right: 20px; z-index: 2147483647;\n max-width: 340px; box-sizing: border-box;\n display: grid; grid-template-columns: auto 1fr;\n grid-template-areas: 'dot txt' 'actions actions'; gap: 9px 12px; padding: 16px 18px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n color: #f4f5fb; background: #14151b; border: 1px solid rgba(255,255,255,.08);\n border-radius: 14px; box-shadow: 0 16px 48px rgba(0,0,0,.5);\n opacity: 0; transform: translateY(10px); transition: opacity .22s ease, transform .22s ease;\n}\n.card.in { opacity: 1; transform: none; }\n.dot { grid-area: dot; width: 9px; height: 9px; margin-top: 5px; border-radius: 50%;\n background: ${ACCENT}; box-shadow: 0 0 0 4px rgba(110,118,241,.18); }\n.txt { grid-area: txt; min-width: 0; }\n.title { font-size: 13.5px; font-weight: 600; line-height: 1.35; }\n.body { margin-top: 3px; font-size: 12px; line-height: 1.45; color: #a9adbe; }\n.actions { grid-area: actions; display: flex; gap: 8px; justify-content: flex-end; margin-top: 2px; }\nbutton { font: inherit; font-size: 12.5px; font-weight: 600; padding: 7px 15px; border-radius: 9px;\n cursor: pointer; border: 1px solid transparent; transition: background .15s ease, color .15s ease; }\n.deny { background: transparent; color: #a9adbe; border-color: rgba(255,255,255,.14); }\n.deny:hover { color: #f4f5fb; background: rgba(255,255,255,.05); }\n.allow { background: ${ACCENT}; color: #fff; }\n.allow:hover { background: #5a62e0; }\nbutton:focus-visible { outline: 2px solid ${ACCENT}; outline-offset: 2px; }\n@media (prefers-reduced-motion: reduce) { .card { transition: none; } }\n@media (max-width: 480px) { .card { left: 16px; right: 16px; bottom: 16px; max-width: none; } }\n`;\n\nconst DOT_CSS = `\n:host { all: initial; }\n.recdot {\n position: fixed; bottom: 16px; right: 16px; z-index: 2147483647;\n width: 12px; height: 12px; border-radius: 50%;\n background: #ef4444; box-shadow: 0 0 0 0 rgba(239,68,68,.5);\n animation: lum-pulse 2s ease-out infinite;\n}\n@keyframes lum-pulse {\n 0% { box-shadow: 0 0 0 0 rgba(239,68,68,.5); }\n 70% { box-shadow: 0 0 0 9px rgba(239,68,68,0); }\n 100% { box-shadow: 0 0 0 0 rgba(239,68,68,0); }\n}\n@media (prefers-reduced-motion: reduce) { .recdot { animation: none; } }\n`;\n\n/** Corner consent card. Resolves via onAllow/onDeny exactly once, then unmounts.\n * Returns an unmount fn (e.g. to tear down if consent is set programmatically). */\nexport function showConsent(\n blockSelector: string,\n text: ConsentText | undefined,\n onAllow: () => void,\n onDeny: () => void,\n): () => void {\n const { host, root } = makeHost(blockSelector);\n adopt(root, CONSENT_CSS);\n const t = text ?? {};\n\n const card = document.createElement('div');\n card.className = 'card';\n card.setAttribute('role', 'dialog');\n card.setAttribute('aria-label', t.title || 'Session recording consent');\n\n const dot = document.createElement('div');\n dot.className = 'dot';\n dot.setAttribute('aria-hidden', 'true');\n\n const txt = document.createElement('div');\n txt.className = 'txt';\n const title = document.createElement('div');\n title.className = 'title';\n title.textContent = t.title || 'We record this session to improve the experience.';\n const body = document.createElement('div');\n body.className = 'body';\n body.textContent = t.body || 'No passwords or typed input are captured.';\n txt.append(title, body);\n\n const actions = document.createElement('div');\n actions.className = 'actions';\n const deny = document.createElement('button');\n deny.type = 'button';\n deny.className = 'deny';\n deny.textContent = t.deny || 'Decline';\n const allow = document.createElement('button');\n allow.type = 'button';\n allow.className = 'allow';\n allow.textContent = t.allow || 'Allow';\n actions.append(deny, allow);\n\n card.append(dot, txt, actions);\n root.appendChild(card);\n mount(host);\n requestAnimationFrame(() => card.classList.add('in'));\n\n let done = false;\n const unmount = () => {\n if (host.parentNode) host.parentNode.removeChild(host);\n };\n const choose = (fn: () => void) => () => {\n if (done) return;\n done = true;\n unmount();\n fn();\n };\n allow.addEventListener('click', choose(onAllow));\n deny.addEventListener('click', choose(onDeny));\n return unmount;\n}\n\n/** Minimal pulsing \"recording\" dot (bottom-right). Returns an unmount fn. */\nexport function showRecordingDot(blockSelector: string): () => void {\n const { host, root } = makeHost(blockSelector);\n adopt(root, DOT_CSS);\n const dot = document.createElement('div');\n dot.className = 'recdot';\n dot.setAttribute('role', 'status');\n dot.setAttribute('aria-label', 'Session recording in progress');\n root.appendChild(dot);\n mount(host);\n return () => {\n if (host.parentNode) host.parentNode.removeChild(host);\n };\n}\n","/**\n * Returning-visitor tracking.\n *\n * A single persistent, ANONYMOUS visitor record in localStorage (no PII — just a\n * random id + counters) lets the backend tell first-time from returning visitors\n * and stitch a person's repeat visits together. Written only after consent (the\n * caller gates this), and fully guarded for SSR / private-mode / disabled storage\n * — visitor tracking silently no-ops rather than ever throwing.\n */\nimport { uuid } from './util.js';\n\nconst VISITOR_KEY = 'obsrviq.visitor';\nconst SESSION_KEY = 'obsrviq.session';\n\n/** Persisted across page loads so a returning visit within the inactivity window\n * can RESUME the same session (opt-in `continueSession`). Same-origin localStorage\n * only — graceful no-op when unavailable (→ per-page sessions, today's default). */\nexport interface SessionRecord {\n /** The session id to continue. */\n id: string;\n /** Epoch ms the (original) session started — the stable clock anchor. */\n startedAt: number;\n /** Epoch ms of the last activity (flush) — the inactivity-gap reference. */\n lastActivity: number;\n /** Next batch seq to send (kept monotonic across page loads → no chunk-key\n * collision on the (session_id, seq) primary key). */\n seq: number;\n /** Highest event `t` (ms since session start) reached so far — used as a floor\n * for the resumed clock so the next page's timestamps never overlap the prior\n * page's, even if the wall clock moves backward between loads. */\n lastT?: number;\n /** The userId this session is attributed to, if any — so a DIFFERENT user on a\n * shared device starts a fresh session instead of merging. */\n userId?: string;\n}\n\nexport function readSession(): SessionRecord | null {\n const raw = readLS(SESSION_KEY);\n if (!raw) return null;\n try {\n const p = JSON.parse(raw) as Partial<SessionRecord>;\n if (p && typeof p.id === 'string' && p.id && typeof p.startedAt === 'number') {\n return {\n id: p.id,\n startedAt: p.startedAt,\n lastActivity: typeof p.lastActivity === 'number' ? p.lastActivity : p.startedAt,\n seq: typeof p.seq === 'number' && p.seq >= 0 ? p.seq : 0,\n lastT: typeof p.lastT === 'number' && p.lastT >= 0 ? p.lastT : undefined,\n userId: typeof p.userId === 'string' ? p.userId : undefined,\n };\n }\n } catch {\n /* corrupted — treat as none */\n }\n return null;\n}\n\nexport function writeSession(rec: SessionRecord): void {\n writeLS(SESSION_KEY, JSON.stringify(rec));\n}\n\nexport function clearSession(): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(SESSION_KEY);\n } catch {\n /* ignore */\n }\n}\n\nexport interface VisitorRecord {\n /** Stable anonymous id for this browser. */\n id: string;\n /** Epoch ms first ever seen. */\n firstSeenAt: number;\n /** Epoch ms of the most recent visit (this one, after registerVisit). */\n lastSeenAt: number;\n /** Lifetime visit count, including the current visit. */\n visits: number;\n}\n\nfunction readLS(key: string): string | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null; // private mode / disabled / sandboxed\n }\n}\n\nfunction writeLS(key: string, value: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n /* quota / disabled — visitor tracking degrades to per-session */\n }\n}\n\n/**\n * Read-or-create the visitor record and register the current visit (increments\n * the count, stamps lastSeenAt). Returns the snapshot for THIS session: a fresh\n * record has visits === 1 (first-time visitor); an existing one has visits > 1\n * (returning). Never throws.\n */\nexport function registerVisit(now: number): VisitorRecord {\n let rec: VisitorRecord | null = null;\n const raw = readLS(VISITOR_KEY);\n if (raw) {\n try {\n const p = JSON.parse(raw) as Partial<VisitorRecord>;\n if (p && typeof p.id === 'string' && p.id) {\n rec = {\n id: p.id,\n firstSeenAt: typeof p.firstSeenAt === 'number' ? p.firstSeenAt : now,\n lastSeenAt: typeof p.lastSeenAt === 'number' ? p.lastSeenAt : now,\n visits: typeof p.visits === 'number' && p.visits > 0 ? p.visits : 1,\n };\n }\n } catch {\n /* corrupted JSON — fall through and regenerate */\n }\n }\n\n const next: VisitorRecord = rec\n ? { ...rec, visits: rec.visits + 1, lastSeenAt: now }\n : { id: uuid(), firstSeenAt: now, lastSeenAt: now, visits: 1 };\n\n writeLS(VISITOR_KEY, JSON.stringify(next));\n return next;\n}\n","import type { IngestSessionMeta, ObsrviqEvent, ObsrviqInitConfig } from '@obsrviq/types';\nimport type { InstrumentCtx, ResolvedConfig, Teardown } from './context.js';\nimport { Transport } from './transport.js';\nimport { instrumentDom } from './recorder.js';\nimport { instrumentConsole } from './console.js';\nimport { instrumentNetwork } from './network.js';\nimport { instrumentErrors } from './errors.js';\nimport { instrumentVitals } from './vitals.js';\nimport { instrumentInteractions } from './interactions.js';\nimport { instrumentForms } from './forms.js';\nimport { instrumentScrollDepth } from './scroll.js';\nimport { instrumentPageviews } from './pageviews.js';\nimport { showConsent, showRecordingDot } from './ui.js';\nimport { clearSession, readSession, registerVisit, writeSession } from './storage.js';\nimport { Clock, detectDevice, privacySignalsOptOut, sha256Hex, uuid } from './util.js';\n\nconst DEFAULTS = {\n maskAllInputs: true,\n blockSelector: '.obsrviq-block',\n noPrivacy: false,\n captureNetworkBodies: false,\n redactHeaders: ['authorization', 'cookie', 'set-cookie'],\n sampleRate: 1.0,\n recordCanvas: false,\n endpoint: 'https://in.lumera.app',\n flushIntervalMs: 5000,\n continueSession: false,\n sessionTimeoutMs: 30 * 60 * 1000,\n requireConsent: false,\n askPermission: false,\n showRecording: false,\n maxArgBytes: 8 * 1024,\n};\n\nexport interface Diagnostics {\n recording: boolean;\n sessionId: string | null;\n flushes: number;\n bytesSent: number;\n eventsSent: number;\n eventsQueued: number;\n}\n\nclass ObsrviqClient {\n private config: ResolvedConfig | null = null;\n private clock: Clock | null = null;\n private transport: Transport | null = null;\n private teardowns: Teardown[] = [];\n private meta: IngestSessionMeta | null = null;\n private recording = false;\n private consent: boolean | null = null;\n private sampledIn = true;\n private lastActivity = 0;\n /** The userId this session is attributed to (for the shared-device split). */\n private currentUserId: string | undefined;\n /** Next batch seq — mirrored from the transport so we can persist continuation. */\n private nextSeq = 0;\n /** Open task spans keyed by task name → the span id + start time, so endTask()\n * can pair with its startTask(). Re-starting the same name supersedes the\n * earlier open span (the player pairs by spanId, so this only affects which\n * start an unqualified end() resolves to). */\n private openTasks = new Map<string, { spanId: string; startT: number }>();\n private consentUnmount: (() => void) | null = null;\n private recDotUnmount: (() => void) | null = null;\n private diag: Diagnostics = {\n recording: false,\n sessionId: null,\n flushes: 0,\n bytesSent: 0,\n eventsSent: 0,\n eventsQueued: 0,\n };\n\n /** The current session id (null until init). */\n get sessionId(): string | null {\n return this.diag.sessionId;\n }\n\n init(config: ObsrviqInitConfig): void {\n if (this.config) return; // idempotent\n if (!config.siteKey) {\n console.warn('[obsrviq] init() called without siteKey — recording disabled.');\n return;\n }\n this.config = { ...DEFAULTS, ...stripUndefined(config) } as ResolvedConfig;\n // No-privacy: record input values verbatim by unmasking inputs — but only if\n // the host didn't set maskAllInputs explicitly (their choice always wins).\n // Page text is already verbatim unless maskTextSelector is set. Passwords stay\n // masked via the recorder's maskInputOptions floor.\n if (this.config.noPrivacy && config.maskAllInputs === undefined) {\n this.config.maskAllInputs = false;\n }\n // askPermission = \"show a built-in consent prompt\"; it implies a consent gate.\n if (this.config.askPermission) this.config.requireConsent = true;\n\n this.startSession();\n\n // Init-time identity (rarely known this early — usually set later via identify()).\n if (config.userId != null) this.applyUserId(config.userId);\n if (config.metadata && this.meta) this.meta.metadata = { ...config.metadata };\n\n // GPC / DNT always wins → no recording, no UI (R-1).\n if (privacySignalsOptOut()) {\n this.consent = false;\n return;\n }\n\n if (this.config.requireConsent) {\n // Built-in prompt, if asked; otherwise the host calls setConsent(true) itself.\n if (this.config.askPermission) {\n this.consentUnmount = showConsent(\n this.config.blockSelector,\n this.config.consentText,\n () => this.setConsent(true),\n () => this.setConsent(false),\n );\n }\n } else {\n this.maybeStart();\n }\n }\n\n /** (Re)create the session id, clock, meta, and transport. Used by init() and\n * reset(). Does not start recording — callers decide via maybeStart().\n * @param seedInitUser seed identity from the init-time `cfg.userId`. True for\n * the initial init() session; FALSE for reset() (logout) — otherwise the fresh\n * post-logout session would be re-attributed to the user who just logged out. */\n private startSession(seedInitUser = true): void {\n const cfg = this.config!;\n // Session continuation (opt-in): resume the same session for a same-device\n // return within the inactivity window — but NOT when a different known user is\n // at the device (the shared-device split). A resumed session keeps recording\n // regardless of sampling (it was already sampled in).\n const now = Date.now();\n let resume: ReturnType<typeof readSession> = null;\n if (cfg.continueSession) {\n const rec = readSession();\n if (\n rec &&\n now - rec.lastActivity < cfg.sessionTimeoutMs &&\n !(cfg.userId != null && rec.userId != null && rec.userId !== String(cfg.userId))\n ) {\n resume = rec;\n }\n }\n const sessionId = resume ? resume.id : uuid();\n this.clock = resume ? new Clock(resume.startedAt, resume.lastT) : new Clock();\n this.currentUserId =\n resume?.userId ?? (seedInitUser && cfg.userId != null ? String(cfg.userId) : undefined);\n this.nextSeq = resume ? resume.seq : 0;\n this.diag.sessionId = sessionId;\n this.meta = {\n startedAt: this.clock.startedAt,\n entryUrl: location.href,\n device: detectDevice(),\n };\n // Sampling decision for the whole session — a resumed one stays in.\n this.sampledIn = resume ? true : Math.random() < (cfg.sampleRate ?? 1);\n this.transport = new Transport({\n endpoint: cfg.endpoint,\n siteKey: cfg.siteKey,\n sessionId,\n getMeta: () => this.meta ?? undefined,\n beforeSend: cfg.beforeSend,\n flushIntervalMs: cfg.flushIntervalMs,\n startSeq: this.nextSeq,\n onSeqDispatch: (next) => {\n this.nextSeq = next;\n this.persistSession();\n },\n onFlush: ({ bytes, events, ok }) => {\n if (ok) {\n this.diag.flushes++;\n this.diag.bytesSent += bytes;\n this.diag.eventsSent += events;\n }\n },\n });\n this.recording = false;\n this.diag.recording = false;\n }\n\n /** Persist the session-continuation record (no-op unless continueSession). Only\n * ever writes for a RECORDING session — a sampled-out or pre-consent session must\n * not leave a record that a later page would resume (and force back into\n * recording), and identify() can fire before recording starts. */\n private persistSession(): void {\n if (!this.config?.continueSession || !this.recording || !this.clock || !this.diag.sessionId) return;\n writeSession({\n id: this.diag.sessionId,\n startedAt: this.clock.startedAt,\n lastActivity: Date.now(),\n seq: this.nextSeq,\n lastT: this.clock.now(),\n userId: this.currentUserId,\n });\n }\n\n private maybeStart(): void {\n if (this.recording || !this.config || !this.clock || !this.transport) return;\n if (this.config.requireConsent && this.consent !== true) return;\n if (this.consent === false) return;\n if (!this.sampledIn) return;\n\n // Returning-visitor identity: now that consent is granted and we're about to\n // record, read-or-create the persistent (anonymous) visitor record and stamp\n // it onto the session meta. Guarded internally — never blocks recording.\n if (this.meta && this.meta.visitorId == null) {\n const visit = registerVisit(Date.now());\n this.meta.visitorId = visit.id;\n this.meta.visitCount = visit.visits;\n this.meta.firstSeenAt = visit.firstSeenAt;\n }\n\n const ctx: InstrumentCtx = {\n clock: this.clock,\n sessionId: this.diag.sessionId!,\n config: this.config,\n emit: (e: ObsrviqEvent) => {\n this.transport!.enqueue(e);\n this.diag.eventsQueued++;\n },\n markActivity: () => {\n this.lastActivity = this.clock!.now();\n },\n lastActivityT: () => this.lastActivity,\n };\n\n this.transport.start();\n // Order matters slightly: network/console wrappers should be installed\n // before app code runs more requests; DOM last so its snapshot is current.\n this.teardowns.push(instrumentConsole(ctx));\n this.teardowns.push(instrumentNetwork(ctx));\n this.teardowns.push(instrumentErrors(ctx));\n this.teardowns.push(instrumentVitals(ctx));\n this.teardowns.push(instrumentInteractions(ctx));\n this.teardowns.push(instrumentForms(ctx));\n this.teardowns.push(instrumentScrollDepth(ctx));\n this.teardowns.push(instrumentPageviews(ctx));\n this.teardowns.push(instrumentDom(ctx));\n\n this.recording = true;\n this.diag.recording = true;\n\n // Now that we're actually recording, anchor the continuation record so a next\n // page can resume this (and ONLY a recording) session, even before any flush.\n this.persistSession();\n\n // Transparency: optional visible \"recording\" indicator.\n if (this.config.showRecording && !this.recDotUnmount) {\n this.recDotUnmount = showRecordingDot(this.config.blockSelector);\n }\n }\n\n /** Associate the session with an application user. Stores the RAW userId (for\n * search + display) AND a SHA-256 identityHash, merges any traits into metadata,\n * and force-flushes so the live session is retro-stamped promptly. Safe to call\n * before recording starts (values ride the first batch) and after login. */\n identify(userId: string, traits?: Record<string, unknown>): void {\n if (!this.meta) return;\n const uid = String(userId);\n // Shared-device split: if this session is already attributed to a DIFFERENT\n // user (continueSession only), rotate to a fresh session so two people never\n // merge into one. reset() clears the continuation record so it can't resume\n // the prior user. (Same user, or first identify on the session → no split.)\n if (this.config?.continueSession && this.currentUserId != null && this.currentUserId !== uid) {\n this.reset();\n }\n this.currentUserId = uid;\n this.applyUserId(uid);\n if (traits) this.mergeMetadata(traits);\n // track() emits an event only while recording — which also guarantees the\n // next flush is non-empty so the updated meta actually ships (empty buffers\n // are skipped by transport.flush()).\n this.track('identify', { hasTraits: !!traits });\n void this.flush();\n // Stamp the userId onto the continuation record so the next page knows it.\n this.persistSession();\n }\n\n /** Merge custom properties onto the session at any time (searchable server-side). */\n setMetadata(props: Record<string, unknown>): void {\n if (!this.meta) return;\n this.mergeMetadata(props);\n this.track('metadata', { keys: Object.keys(props) });\n void this.flush();\n }\n\n /** Forget the current identity (e.g. on logout) and rotate to a fresh anonymous\n * session, so post-logout activity isn't attributed to the prior user. (Identity\n * can't be cleared on the existing row — the server merge only fills nulls — so\n * we start a new session instead.) */\n reset(): void {\n if (!this.config) return;\n const wasRecording = this.recording;\n if (this.recording) this.teardown(); // flushes the old session's final batch\n // An explicit reset (logout / user switch) must NEVER resume the prior\n // session — drop the continuation record so startSession() begins fresh.\n clearSession();\n this.currentUserId = undefined;\n // Fresh session must stay anonymous — do NOT re-seed the init-time userId, or a\n // post-logout session would be re-attributed to the user who just logged out.\n this.startSession(false);\n if (wasRecording && this.consent !== false && !privacySignalsOptOut()) this.maybeStart();\n }\n\n /** Set the raw userId on meta and compute its hash (async). */\n private applyUserId(userId: string): void {\n const raw = String(userId);\n if (this.meta) this.meta.userId = raw;\n void sha256Hex(raw).then((hash) => {\n if (this.meta && this.meta.userId === raw) this.meta.identityHash = hash;\n });\n }\n\n private mergeMetadata(props: Record<string, unknown>): void {\n if (!this.meta) return;\n this.meta.metadata = { ...(this.meta.metadata ?? {}), ...props };\n }\n\n /** Emit a custom event (e.g. conversions). */\n track(name: string, props?: Record<string, unknown>): void {\n if (!this.recording || !this.clock || !this.transport) return;\n this.transport.enqueue({\n id: uuid(),\n sessionId: this.diag.sessionId!,\n type: 'custom',\n t: this.clock.now(),\n ts: this.clock.wall(),\n name,\n props,\n });\n this.diag.eventsQueued++;\n }\n\n /** Mark a conversion. Conversion is client-defined, so the NAME matters —\n * \"checkout\", \"signup\", \"trial_started\" — and each is denormalised onto the\n * session for per-client filtering. Sets props.conversion so the legacy\n * 'conversion' flag still lights up. Sugar over track(name, {conversion:true}). */\n conversion(name: string, props?: Record<string, unknown>): void {\n const clean = String(name).trim();\n if (!clean) return;\n this.track(clean, { ...props, conversion: true });\n }\n\n /** Attach one or more free-form, searchable labels to the current session.\n * Tags are session-level (deduped server-side) — use them to slice sessions\n * however a client likes (\"vip\", \"ab_variant_b\", \"mobile_app\"). */\n tag(...names: string[]): void {\n const clean = names.map((n) => String(n).trim()).filter(Boolean);\n if (!clean.length) return;\n this.track('_tag', { tags: clean });\n void this.flush();\n }\n\n /** Begin a named sub-event span. Pairs with end() / endTask(name) to produce a\n * searchable, duration-bearing span on the session timeline. Returns a handle\n * so callers can `const t = Obsrviq.startTask('checkout'); …; t.end()`. */\n startTask(name: string, props?: Record<string, unknown>): { end: (endProps?: Record<string, unknown>) => void } {\n const clean = String(name).trim();\n const spanId = uuid();\n const startT = this.clock ? this.clock.now() : 0;\n if (clean) {\n this.openTasks.set(clean, { spanId, startT });\n this.track(`${clean}:started`, { ...props, spanId, task: clean });\n }\n return { end: (endProps?: Record<string, unknown>) => this.endTask(clean, endProps) };\n }\n\n /** Close a named sub-event span opened by startTask(name). Safe to call even\n * if the start was never seen (renders as an orphan end on the timeline). */\n endTask(name: string, props?: Record<string, unknown>): void {\n const clean = String(name).trim();\n if (!clean) return;\n const open = this.openTasks.get(clean);\n this.openTasks.delete(clean);\n const spanId = open?.spanId ?? uuid();\n this.track(`${clean}:ended`, {\n ...props,\n spanId,\n task: clean,\n ...(open ? { startT: open.startT } : {}),\n });\n }\n\n /** Gate recording (PRIV-2). true starts; false stops + flushes. Dismisses the\n * built-in consent prompt if one is showing. */\n setConsent(granted: boolean): void {\n this.consent = granted;\n this.consentUnmount?.();\n this.consentUnmount = null;\n if (granted) this.maybeStart();\n else if (this.recording) this.teardown();\n }\n\n /** Hard stop + flush. */\n stop(): void {\n this.teardown();\n }\n\n /** Force a flush now (returns when send is attempted). */\n flush(): Promise<boolean> {\n return this.transport ? this.transport.flush('manual') : Promise.resolve(true);\n }\n\n getDiagnostics(): Diagnostics {\n return { ...this.diag };\n }\n\n private teardown(): void {\n for (const t of this.teardowns.splice(0)) {\n try {\n t();\n } catch {\n /* ignore */\n }\n }\n this.recDotUnmount?.();\n this.recDotUnmount = null;\n this.transport?.stop();\n this.recording = false;\n this.diag.recording = false;\n }\n}\n\nfunction stripUndefined<T extends object>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) (out as Record<string, unknown>)[k] = v;\n }\n return out;\n}\n\nexport const Obsrviq = new ObsrviqClient();\nexport type { ObsrviqInitConfig } from '@obsrviq/types';\nexport default Obsrviq;\n"]}
1
+ {"version":3,"sources":["../src/transport.ts","../src/util.ts","../src/recorder.ts","../src/mask.ts","../src/serialize.ts","../src/console.ts","../src/network.ts","../src/errors.ts","../src/vitals.ts","../src/interactions.ts","../src/forms.ts","../src/scroll.ts","../src/pageviews.ts","../src/ui.ts","../src/storage.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { gzipSync } from 'fflate';\nimport type { IngestBatch, IngestSessionMeta, ObsrviqEvent } from '@obsrviq/types';\n\nexport interface TransportOptions {\n endpoint: string;\n siteKey: string;\n sessionId: string;\n getMeta: () => IngestSessionMeta | undefined;\n beforeSend?: (batch: IngestBatch) => IngestBatch | null;\n flushIntervalMs: number;\n /** Resume seq from here (continued session); defaults to 0. Keeps the chunk\n * (session_id, seq) key monotonic across page loads. */\n startSeq?: number;\n /** Called at DISPATCH (before the network await) with the NEXT seq to use — lets\n * the host persist progress synchronously so a later page load resumes without a\n * seq collision even if an unload interrupts the in-flight request. */\n onSeqDispatch?: (nextSeq: number) => void;\n /** test/observability hook */\n onFlush?: (info: { bytes: number; events: number; ok: boolean }) => void;\n}\n\nconst MAX_BUFFER_EVENTS = 5000; // backpressure cap (R-5)\n\nexport class Transport {\n private buffer: ObsrviqEvent[] = [];\n private seq: number;\n private timer: ReturnType<typeof setInterval> | undefined;\n private sending = false;\n private retryDelay = 1000;\n private stopped = false;\n\n constructor(private opts: TransportOptions) {\n this.seq = opts.startSeq ?? 0;\n }\n\n start() {\n this.timer = setInterval(() => void this.flush('timer'), this.opts.flushIntervalMs);\n document.addEventListener('visibilitychange', this.onVisibility, { capture: true });\n window.addEventListener('pagehide', this.onPageHide, { capture: true });\n }\n\n enqueue(event: ObsrviqEvent) {\n if (this.stopped) return;\n this.buffer.push(event);\n // Backpressure: if we've buffered a lot, flush early; if still over after a\n // failed flush, drop the oldest DOM events (keep structured signal).\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n void this.flush('backpressure');\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n this.buffer = this.buffer.filter((e, i) => e.type !== 'dom' || i % 2 === 0);\n }\n }\n }\n\n /** Build, compress, and send the current buffer. Returns true on success. */\n async flush(reason: 'timer' | 'hidden' | 'pagehide' | 'manual' | 'backpressure'): Promise<boolean> {\n if (this.sending || this.buffer.length === 0) return true;\n this.sending = true;\n const events = this.buffer;\n this.buffer = [];\n\n let batch: IngestBatch | null = {\n siteKey: this.opts.siteKey,\n sessionId: this.opts.sessionId,\n seq: this.seq,\n meta: this.opts.getMeta(),\n events,\n };\n if (this.opts.beforeSend) {\n try {\n batch = this.opts.beforeSend(batch);\n } catch {\n batch = null;\n }\n }\n if (!batch) {\n this.sending = false;\n return true; // dropped intentionally\n }\n\n // Reserve the next seq + stamp activity SYNCHRONOUSLY at dispatch — before any\n // network await. This is what session continuation persists, so an unload that\n // interrupts the in-flight request can never let the next page re-use this seq\n // (which would overwrite a chunk). It also means lastActivity reflects real\n // dispatch attempts even when the network is down and sends keep failing — so an\n // active-but-offline session isn't wrongly treated as idle and split.\n this.opts.onSeqDispatch?.(this.seq + 1);\n\n const json = JSON.stringify(batch);\n const gz = gzipSync(new TextEncoder().encode(json));\n const ok = await this.send(gz, reason === 'pagehide' || reason === 'hidden');\n this.opts.onFlush?.({ bytes: gz.byteLength, events: events.length, ok });\n\n if (ok) {\n this.seq++;\n this.retryDelay = 1000;\n this.sending = false;\n return true;\n }\n\n // Failed: re-buffer (capped) and retry with jitter.\n this.buffer = events.slice(-MAX_BUFFER_EVENTS).concat(this.buffer);\n this.sending = false;\n if (!this.stopped) {\n const jitter = this.retryDelay * (0.5 + Math.random());\n this.retryDelay = Math.min(this.retryDelay * 2, 30_000);\n setTimeout(() => void this.flush('timer'), jitter);\n }\n return false;\n }\n\n private async send(bytes: Uint8Array, unloading: boolean): Promise<boolean> {\n const url = `${this.opts.endpoint.replace(/\\/$/, '')}/v1/batch`;\n const headers = {\n 'content-type': 'application/octet-stream',\n 'x-obsrviq-key': this.opts.siteKey,\n };\n const body = bytes as unknown as BodyInit;\n\n // Unload path: a normal fetch would be cancelled as the page goes away, so\n // use sendBeacon (survives navigation) or a keepalive fetch. BOTH cap the\n // body at ~64KB, so large (snapshot) batches are best-effort here — but the\n // periodic flushes below send them reliably during normal operation.\n if (unloading) {\n const blob = new Blob([bytes as unknown as BlobPart], { type: 'application/octet-stream' });\n if (typeof navigator.sendBeacon === 'function') {\n try {\n if (navigator.sendBeacon(url, blob)) return true;\n } catch {\n /* fall through */\n }\n }\n try {\n void fetch(url, { method: 'POST', body, headers, keepalive: true, credentials: 'omit', mode: 'cors' }).catch(\n () => {},\n );\n return true;\n } catch {\n return false;\n }\n }\n\n // Normal flush: a plain fetch — NO `keepalive`, so there's no 64KB body cap\n // and large FullSnapshot batches actually send. Await the real result so a\n // failure (rejected / 4xx / 5xx / network) re-buffers and retries instead of\n // being silently dropped. A timeout aborts a hung request so it can't stall\n // all future flushes (`sending` stays true until this resolves).\n const ctrl = new AbortController();\n const timeout = setTimeout(() => ctrl.abort(), 15_000);\n try {\n const res = await fetch(url, {\n method: 'POST',\n body,\n headers,\n credentials: 'omit',\n mode: 'cors',\n signal: ctrl.signal,\n });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private onVisibility = () => {\n if (document.visibilityState === 'hidden') void this.flush('hidden');\n };\n private onPageHide = () => {\n void this.flush('pagehide');\n };\n\n stop() {\n this.stopped = true;\n if (this.timer) clearInterval(this.timer);\n document.removeEventListener('visibilitychange', this.onVisibility, { capture: true });\n window.removeEventListener('pagehide', this.onPageHide, { capture: true });\n void this.flush('manual');\n }\n}\n","// Small browser utilities shared across the SDK.\n\nexport function uuid(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID();\n }\n // RFC4122-ish fallback.\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/** A monotonic-ish session clock: ms since the session started. */\nexport class Clock {\n readonly startedAt: number;\n private perfStart: number;\n /** Wall ms elapsed between the ORIGINAL session start and this page's start —\n * added to every `t` so a resumed (continued) session's timeline keeps climbing\n * across the inactivity gap instead of restarting at 0. 0 for a fresh session. */\n private baseT: number;\n /** @param resumeStartedAt epoch ms of the original session start when RESUMING a\n * continued session; omit for a fresh session.\n * @param floorT highest `t` the prior page reached — guarantees this page's\n * timeline starts after it, so a backward wall-clock jump between loads can't\n * produce overlapping timestamps (which would corrupt replay ordering). */\n constructor(resumeStartedAt?: number, floorT?: number) {\n const wallNow = Date.now();\n this.startedAt = resumeStartedAt ?? wallNow;\n this.perfStart = typeof performance !== 'undefined' ? performance.now() : 0;\n this.baseT = Math.max(0, wallNow - this.startedAt, floorT ?? 0);\n }\n /** ms since the (original) session start — the master clock `t`. */\n now(): number {\n const p = typeof performance !== 'undefined' ? performance.now() : Date.now() - this.startedAt;\n return Math.max(0, this.baseT + Math.round(p - this.perfStart));\n }\n /** wall-clock epoch ms for display (`ts`). */\n wall(): number {\n return Date.now();\n }\n /** Convert a performance-timeline timestamp (since timeOrigin) to session t. */\n fromPerf(perfTs: number): number {\n return Math.max(0, this.baseT + Math.round(perfTs - this.perfStart));\n }\n}\n\nexport async function sha256Hex(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input));\n return Array.from(new Uint8Array(buf))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Non-crypto fallback (still one-way enough for an opaque id).\n let h = 0;\n for (let i = 0; i < input.length; i++) h = (Math.imul(31, h) + input.charCodeAt(i)) | 0;\n return (h >>> 0).toString(16);\n}\n\nexport function detectDevice(): {\n type: 'desktop' | 'mobile' | 'tablet';\n os?: string;\n browser?: string;\n viewport: { w: number; h: number };\n} {\n const ua = navigator.userAgent;\n const viewport = { w: window.innerWidth, h: window.innerHeight };\n let type: 'desktop' | 'mobile' | 'tablet' = 'desktop';\n if (/iPad|Tablet/i.test(ua)) type = 'tablet';\n else if (/Mobi|Android|iPhone/i.test(ua)) type = 'mobile';\n\n let os: string | undefined;\n if (/Windows/i.test(ua)) os = 'Windows';\n else if (/Mac OS X|Macintosh/i.test(ua)) os = 'macOS';\n else if (/Android/i.test(ua)) os = 'Android';\n else if (/iPhone|iPad|iOS/i.test(ua)) os = 'iOS';\n else if (/Linux/i.test(ua)) os = 'Linux';\n\n let browser: string | undefined;\n if (/Edg\\//.test(ua)) browser = 'Edge';\n else if (/Chrome\\//.test(ua)) browser = 'Chrome';\n else if (/Firefox\\//.test(ua)) browser = 'Firefox';\n else if (/Safari\\//.test(ua)) browser = 'Safari';\n\n return { type, os, browser, viewport };\n}\n\n/** Global Privacy Control / Do Not Track. */\nexport function privacySignalsOptOut(): boolean {\n const nav = navigator as Navigator & { globalPrivacyControl?: boolean; doNotTrack?: string };\n if (nav.globalPrivacyControl === true) return true;\n if (nav.doNotTrack === '1' || (window as { doNotTrack?: string }).doNotTrack === '1') return true;\n return false;\n}\n","import { record } from 'rrweb';\nimport type { eventWithTime } from '@rrweb/types';\nimport type { DomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n// rrweb EventType.IncrementalSnapshot === 3 (a real DOM mutation/interaction).\nconst INCREMENTAL = 3;\n\nexport function instrumentDom(ctx: InstrumentCtx): Teardown {\n const stop = record({\n emit(event: eventWithTime) {\n const dom: DomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'dom',\n t: ctx.clock.fromPerf(performanceNow()),\n ts: ctx.clock.wall(),\n data: event,\n };\n ctx.emit(dom);\n if (event.type === INCREMENTAL) ctx.markActivity();\n },\n maskAllInputs: ctx.config.maskAllInputs,\n // Password inputs stay masked even in no-privacy mode (maskAllInputs:false) —\n // a hard floor so recordings never store plaintext passwords.\n maskInputOptions: { password: true },\n maskTextSelector: ctx.config.maskTextSelector,\n blockSelector: ctx.config.blockSelector,\n recordCanvas: ctx.config.recordCanvas,\n // Periodic full snapshots → the player can start replay from the nearest\n // checkpoint, enabling progressive buffering + reliable seeking (§8.6).\n checkoutEveryNms: 30_000,\n sampling: {\n // Don't record every mousemove point; sample for a smaller payload.\n mousemove: 50,\n scroll: 150,\n input: 'last',\n },\n });\n\n return () => {\n try {\n stop?.();\n } catch {\n /* already stopped */\n }\n };\n}\n\nfunction performanceNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n","// Masking pipeline (PRIV). Applied to console args and network bodies before\n// anything leaves the page. Heuristics catch the obvious PII; tenants tighten\n// with maskTextSelector / beforeSend.\n\nconst EMAIL = /[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}/gi;\nconst CC = /\\b(?:\\d[ -]*?){13,19}\\b/g; // candidate card numbers\nconst SSN = /\\b\\d{3}-\\d{2}-\\d{4}\\b/g;\nconst LONG_DIGITS = /\\b\\d{9,}\\b/g; // phone-ish / account-ish\n\n// Keys whose values we always redact regardless of content.\nconst SENSITIVE_KEYS =\n /(pass(word)?|secret|token|api[-_]?key|authorization|cookie|ssn|card|cvv|pin|otp)/i;\n\nexport function maskString(input: string): string {\n return input\n .replace(EMAIL, '«email»')\n .replace(CC, (m) => (luhnish(m) ? '«card»' : m))\n .replace(SSN, '«ssn»')\n .replace(LONG_DIGITS, '«number»');\n}\n\nfunction luhnish(s: string): boolean {\n const digits = s.replace(/\\D/g, '');\n return digits.length >= 13 && digits.length <= 19;\n}\n\nexport function isSensitiveKey(key: string): boolean {\n return SENSITIVE_KEYS.test(key);\n}\n\n/** Recursively mask an object's string values and sensitive keys. */\nexport function maskValue(value: unknown, depth = 0): unknown {\n if (depth > 6) return '«depth»';\n if (typeof value === 'string') return maskString(value);\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map((v) => maskValue(v, depth + 1));\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = isSensitiveKey(k) ? '«redacted»' : maskValue(v, depth + 1);\n }\n return out;\n}\n","import type { SerializedArg } from '@obsrviq/types';\nimport { maskString, maskValue } from './mask.js';\n\nconst DEFAULT_MAX_BYTES = 8 * 1024; // 8 KB string cap (§6.1)\n\nfunction byteLen(s: string): number {\n return new Blob([s]).size;\n}\n\nfunction truncate(s: string, maxBytes: number): { value: string; truncated: boolean } {\n if (byteLen(s) <= maxBytes) return { value: s, truncated: false };\n // Cheap char-based cut; good enough for previews.\n const approx = Math.max(16, Math.floor(maxBytes * 0.95));\n return { value: s.slice(0, approx), truncated: true };\n}\n\n/** Serialize a single console/track argument into a SerializedArg (§4, §6.1). */\nexport function serializeArg(arg: unknown, maxBytes = DEFAULT_MAX_BYTES): SerializedArg {\n if (arg === null) return { kind: 'primitive', value: null };\n const type = typeof arg;\n\n if (type === 'number' || type === 'boolean') {\n return { kind: 'primitive', value: arg as number | boolean };\n }\n\n if (type === 'string') {\n const masked = maskString(arg as string);\n const { value, truncated } = truncate(masked, maxBytes);\n return { kind: 'string', value, truncated };\n }\n\n if (arg instanceof Error) {\n return {\n kind: 'error',\n name: arg.name,\n message: maskString(arg.message),\n stack: arg.stack ? maskString(arg.stack) : undefined,\n };\n }\n\n if (arg instanceof Element) {\n return { kind: 'dom', selector: cssPath(arg) };\n }\n\n if (type === 'object' || type === 'function' || type === 'symbol' || type === 'bigint') {\n const masked = maskValue(arg);\n let json: string | undefined;\n let truncated = false;\n try {\n const full = JSON.stringify(masked, safeReplacer());\n const cut = truncate(full ?? 'undefined', maxBytes);\n json = cut.value;\n truncated = cut.truncated;\n } catch {\n json = undefined;\n }\n return { kind: 'object', preview: previewOf(masked), json, truncated };\n }\n\n // undefined / fallback\n return { kind: 'primitive', value: String(arg) };\n}\n\nfunction safeReplacer() {\n const seen = new WeakSet();\n return (_key: string, value: unknown) => {\n if (typeof value === 'bigint') return `${value.toString()}n`;\n if (typeof value === 'function') return `ƒ ${(value as { name?: string }).name || 'anonymous'}`;\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) return '«circular»';\n seen.add(value);\n }\n return value;\n };\n}\n\nfunction previewOf(value: unknown): string {\n if (Array.isArray(value)) return `Array(${value.length})`;\n if (value && typeof value === 'object') {\n const keys = Object.keys(value as object);\n const head = keys.slice(0, 4).join(', ');\n return `{ ${head}${keys.length > 4 ? ', …' : ''} }`;\n }\n return String(value);\n}\n\n/** A short, stable CSS-ish selector for a DOM node (no PII). */\nexport function cssPath(el: Element): string {\n const parts: string[] = [];\n let node: Element | null = el;\n let depth = 0;\n while (node && node.nodeType === 1 && depth < 5) {\n let part = node.tagName.toLowerCase();\n if (node.id) {\n part += `#${node.id}`;\n parts.unshift(part);\n break;\n }\n const cls = (node.getAttribute('class') || '').trim().split(/\\s+/).filter(Boolean)[0];\n if (cls) part += `.${cls}`;\n parts.unshift(part);\n node = node.parentElement;\n depth++;\n }\n return parts.join(' > ');\n}\n\n/** Parse the top frame of a stack into a source location. */\nexport function parseSource(stack?: string): { url?: string; line?: number; col?: number } | undefined {\n if (!stack) return undefined;\n const lines = stack.split('\\n').map((l) => l.trim());\n for (const line of lines) {\n const m =\n line.match(/\\((https?:\\/\\/[^)]+):(\\d+):(\\d+)\\)/) ||\n line.match(/at (https?:\\/\\/\\S+):(\\d+):(\\d+)/) ||\n line.match(/(https?:\\/\\/\\S+):(\\d+):(\\d+)/);\n if (m) return { url: m[1], line: Number(m[2]), col: Number(m[3]) };\n }\n return undefined;\n}\n","import type { ConsoleEvent, ConsoleLevel, ErrorEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { serializeArg, parseSource } from './serialize.js';\nimport { uuid } from './util.js';\n\nconst LEVELS: ConsoleLevel[] = ['log', 'info', 'warn', 'error', 'debug'];\nconst MAX_PER_SEC = 100; // flood cap (§6.1)\n\nexport function instrumentConsole(ctx: InstrumentCtx): Teardown {\n const original: Partial<Record<ConsoleLevel, (...a: unknown[]) => void>> = {};\n let windowStart = ctx.clock.now();\n let inWindow = 0;\n let suppressed = 0;\n\n function rateLimited(): boolean {\n const now = ctx.clock.now();\n if (now - windowStart >= 1000) {\n if (suppressed > 0) {\n // surface a single synthetic note that we dropped a flood\n emitConsole('warn', [\n { kind: 'string', value: `Obsrviq: suppressed ${suppressed} console messages (flood cap)` },\n ]);\n suppressed = 0;\n }\n windowStart = now;\n inWindow = 0;\n }\n if (inWindow >= MAX_PER_SEC) {\n suppressed++;\n return true;\n }\n inWindow++;\n return false;\n }\n\n function emitConsole(level: ConsoleLevel, args: ConsoleEvent['args'], stack?: string) {\n const source = parseSource(stack);\n const e: ConsoleEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'console',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n level,\n args,\n stack: level === 'error' ? stack : undefined,\n source,\n };\n ctx.emit(e);\n }\n\n for (const level of LEVELS) {\n const orig = console[level] as (...a: unknown[]) => void;\n original[level] = orig;\n console[level] = (...args: unknown[]) => {\n try {\n orig.apply(console, args);\n } catch {\n /* never let our wrapper break the original */\n }\n try {\n if (rateLimited()) return;\n const serialized = args.map((a) => serializeArg(a, ctx.config.maxArgBytes));\n let stack: string | undefined;\n if (level === 'error') {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n stack = errArg?.stack ?? new Error().stack;\n }\n emitConsole(level, serialized, stack);\n } catch {\n /* swallow */\n }\n };\n }\n\n return () => {\n for (const level of LEVELS) {\n if (original[level]) console[level] = original[level]!;\n }\n };\n}\n\n/** Shared helper used by errors.ts to also surface uncaught errors in console. */\nexport function errorToConsoleEvent(ctx: InstrumentCtx, err: ErrorEvent): ConsoleEvent {\n return {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'console',\n t: err.t,\n ts: err.ts,\n level: 'error',\n args: [{ kind: 'error', name: err.name, message: err.message, stack: err.stack }],\n stack: err.stack,\n source: err.source,\n };\n}\n","import type { NetworkEvent, NetworkResourceType, NetworkTiming } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { maskString } from './mask.js';\nimport { uuid } from './util.js';\n\nconst BODY_CAP = 4 * 1024; // 4 KB body preview cap\n// Response/request header allowlist — everything else is dropped.\nconst HEADER_ALLOW = new Set([\n 'content-type',\n 'content-length',\n 'accept',\n 'accept-encoding',\n 'cache-control',\n 'etag',\n 'last-modified',\n 'content-encoding',\n 'x-request-id',\n 'x-correlation-id',\n 'server',\n 'vary',\n]);\n\nfunction redactUrl(raw: string): string {\n try {\n const u = new URL(raw, location.href);\n if (u.search) u.search = '?…';\n return u.toString();\n } catch {\n return raw.split('?')[0] ?? raw;\n }\n}\n\nfunction classifyHttp(status: number): string | undefined {\n if (status === 0) return 'network';\n if (status >= 500) return 'http_5xx';\n if (status >= 400) return 'http_4xx';\n return undefined;\n}\n\nfunction pickHeaders(\n redact: string[],\n entries: Iterable<[string, string]>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n const redactSet = new Set(redact.map((h) => h.toLowerCase()));\n for (const [k, v] of entries) {\n const key = k.toLowerCase();\n if (redactSet.has(key)) out[key] = 'redacted';\n else if (HEADER_ALLOW.has(key)) out[key] = v;\n }\n return out;\n}\n\nfunction bodyPreview(\n text: string | undefined,\n contentType: string | undefined,\n): NetworkEvent['requestBody'] {\n if (text == null) return undefined;\n const masked = maskString(text);\n const truncated = masked.length > BODY_CAP;\n return {\n contentType,\n preview: truncated ? masked.slice(0, BODY_CAP) : masked,\n truncated,\n redacted: masked !== text,\n };\n}\n\nfunction enrichTiming(ctx: InstrumentCtx, url: string, base: NetworkTiming): NetworkTiming {\n try {\n const entries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n // newest matching entry by URL\n const match = entries.filter((e) => e.name === url).pop();\n if (!match) return base;\n const t: NetworkTiming = { ...base };\n if (match.domainLookupEnd && match.domainLookupStart)\n t.dns = Math.max(0, match.domainLookupEnd - match.domainLookupStart);\n if (match.connectEnd && match.connectStart)\n t.tcp = Math.max(0, match.connectEnd - match.connectStart);\n if (match.secureConnectionStart)\n t.tls = Math.max(0, match.connectEnd - match.secureConnectionStart);\n if (match.responseStart && match.requestStart)\n t.ttfb = Math.max(0, match.responseStart - match.requestStart);\n if (match.responseEnd && match.responseStart)\n t.download = Math.max(0, match.responseEnd - match.responseStart);\n return t;\n } catch {\n return base;\n }\n}\n\nexport function instrumentNetwork(ctx: InstrumentCtx): Teardown {\n const teardowns: Teardown[] = [];\n teardowns.push(wrapFetch(ctx));\n teardowns.push(wrapXhr(ctx));\n teardowns.push(wrapBeacon(ctx));\n teardowns.push(observeResources(ctx));\n return () => teardowns.forEach((t) => t());\n}\n\n// ───────────────────────────── fetch ────────────────────────────────\nfunction wrapFetch(ctx: InstrumentCtx): Teardown {\n const orig = window.fetch;\n if (!orig) return () => {};\n window.fetch = async function (input: RequestInfo | URL, init?: RequestInit) {\n const rawUrl = input instanceof Request ? input.url : String(input);\n // Never record our own telemetry round-trips to the ingest endpoint.\n if (rawUrl.includes('/v1/batch')) return orig.call(window, input as RequestInfo, init);\n const startT = ctx.clock.now();\n const method = (init?.method || (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url = redactUrl(rawUrl);\n const reqHeaders = pickHeaders(\n ctx.config.redactHeaders,\n headerEntries(init?.headers ?? (input instanceof Request ? input.headers : undefined)),\n );\n\n const emit = (partial: Partial<NetworkEvent>) => {\n const endT = ctx.clock.now();\n const timing = enrichTiming(ctx, rawUrl, { startT, endT, duration: endT - startT });\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: startT,\n ts: ctx.clock.wall(),\n initiator: 'fetch',\n method,\n url,\n status: 0,\n ok: false,\n resourceType: 'fetch',\n requestHeaders: reqHeaders,\n timing,\n ...partial,\n };\n ctx.emit(ev);\n ctx.markActivity();\n };\n\n try {\n const res = await orig.call(window, input as RequestInfo, init);\n const status = res.status;\n const respHeaders = pickHeaders(ctx.config.redactHeaders, res.headers.entries());\n const len = res.headers.get('content-length');\n let responseBody: NetworkEvent['responseBody'];\n if (ctx.config.captureNetworkBodies && isTexty(res.headers.get('content-type'))) {\n try {\n const text = await res.clone().text();\n responseBody = bodyPreview(text, res.headers.get('content-type') || undefined);\n } catch {\n /* ignore */\n }\n }\n emit({\n status,\n ok: res.ok,\n responseSize: len ? Number(len) : undefined,\n responseHeaders: respHeaders,\n requestBody: ctx.config.captureNetworkBodies\n ? bodyPreview(stringifyBody(init?.body), undefined)\n : undefined,\n responseBody,\n error: classifyHttp(status),\n });\n return res;\n } catch (err) {\n emit({ status: 0, ok: false, error: classifyFetchError(err) });\n throw err;\n }\n } as typeof window.fetch;\n return () => {\n window.fetch = orig;\n };\n}\n\nfunction classifyFetchError(err: unknown): string {\n const name = (err as { name?: string })?.name;\n if (name === 'AbortError') return 'aborted';\n const msg = String((err as { message?: string })?.message || '').toLowerCase();\n if (msg.includes('cors')) return 'cors';\n if (msg.includes('timeout')) return 'timeout';\n return 'network';\n}\n\n// ────────────────────────────── XHR ─────────────────────────────────\ninterface XhrMeta {\n method: string;\n url: string;\n rawUrl: string;\n startT: number;\n reqHeaders: Record<string, string>;\n body?: string;\n}\n\nfunction wrapXhr(ctx: InstrumentCtx): Teardown {\n const XHR = XMLHttpRequest.prototype;\n const origOpen = XHR.open;\n const origSend = XHR.send;\n const origSetHeader = XHR.setRequestHeader;\n const META = new WeakMap<XMLHttpRequest, XhrMeta>();\n\n XHR.open = function (this: XMLHttpRequest, method: string, url: string | URL, ...rest: unknown[]) {\n const rawUrl = String(url);\n META.set(this, {\n method: String(method).toUpperCase(),\n rawUrl,\n url: redactUrl(rawUrl),\n startT: 0,\n reqHeaders: {},\n });\n return origOpen.apply(this, [method, url, ...rest] as never);\n } as typeof XHR.open;\n\n XHR.setRequestHeader = function (this: XMLHttpRequest, name: string, value: string) {\n const meta = META.get(this);\n if (meta) {\n const key = name.toLowerCase();\n if (ctx.config.redactHeaders.map((h) => h.toLowerCase()).includes(key))\n meta.reqHeaders[key] = 'redacted';\n else if (HEADER_ALLOW.has(key)) meta.reqHeaders[key] = value;\n }\n return origSetHeader.apply(this, [name, value] as never);\n } as typeof XHR.setRequestHeader;\n\n XHR.send = function (this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null) {\n const meta = META.get(this);\n if (meta) {\n meta.startT = ctx.clock.now();\n if (ctx.config.captureNetworkBodies) meta.body = stringifyBody(body);\n const finish = (error?: string) => {\n const endT = ctx.clock.now();\n const timing = enrichTiming(ctx, meta.rawUrl, {\n startT: meta.startT,\n endT,\n duration: endT - meta.startT,\n });\n const status = this.status;\n const respHeaders = parseRawHeaders(ctx, this.getAllResponseHeaders());\n // Response body (texty + readable responseType only), parallel to fetch.\n let responseBody: NetworkEvent['responseBody'];\n if (ctx.config.captureNetworkBodies && isTexty(this.getResponseHeader('content-type'))) {\n try {\n if (this.responseType === '' || this.responseType === 'text') {\n responseBody = bodyPreview(this.responseText, this.getResponseHeader('content-type') || undefined);\n }\n } catch {\n /* opaque/cross-origin response — skip the body */\n }\n }\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: meta.startT,\n ts: ctx.clock.wall(),\n initiator: 'xhr',\n method: meta.method,\n url: meta.url,\n status,\n ok: status >= 200 && status < 400,\n resourceType: 'xhr',\n requestHeaders: meta.reqHeaders,\n responseHeaders: respHeaders,\n responseSize: safeLen(this),\n requestBody: ctx.config.captureNetworkBodies ? bodyPreview(meta.body, undefined) : undefined,\n responseBody,\n timing,\n error: error || classifyHttp(status),\n };\n ctx.emit(ev);\n ctx.markActivity();\n };\n this.addEventListener('loadend', () => finish());\n this.addEventListener('error', () => finish('network'));\n this.addEventListener('timeout', () => finish('timeout'));\n this.addEventListener('abort', () => finish('aborted'));\n }\n return origSend.apply(this, [body] as never);\n } as typeof XHR.send;\n\n return () => {\n XHR.open = origOpen;\n XHR.send = origSend;\n XHR.setRequestHeader = origSetHeader;\n };\n}\n\nfunction safeLen(xhr: XMLHttpRequest): number | undefined {\n try {\n if (xhr.responseType === '' || xhr.responseType === 'text')\n return new Blob([xhr.responseText]).size;\n } catch {\n /* opaque */\n }\n const len = xhr.getResponseHeader('content-length');\n return len ? Number(len) : undefined;\n}\n\nfunction parseRawHeaders(ctx: InstrumentCtx, raw: string): Record<string, string> {\n const entries: [string, string][] = [];\n for (const line of raw.trim().split(/[\\r\\n]+/)) {\n const idx = line.indexOf(':');\n if (idx > 0) entries.push([line.slice(0, idx).trim(), line.slice(idx + 1).trim()]);\n }\n return pickHeaders(ctx.config.redactHeaders, entries);\n}\n\n// ──────────────────────────── sendBeacon ────────────────────────────\nfunction wrapBeacon(ctx: InstrumentCtx): Teardown {\n const orig = navigator.sendBeacon;\n if (!orig) return () => {};\n navigator.sendBeacon = function (url: string | URL, data?: BodyInit | null): boolean {\n const startT = ctx.clock.now();\n let ok = false;\n try {\n ok = orig.call(navigator, url, data);\n } finally {\n // Don't record beacons to our own ingest endpoint.\n const u = String(url);\n if (!u.includes('/v1/batch')) {\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: startT,\n ts: ctx.clock.wall(),\n initiator: 'beacon',\n method: 'POST',\n url: redactUrl(u),\n status: ok ? 202 : 0,\n ok,\n resourceType: 'other',\n timing: { startT, endT: ctx.clock.now(), duration: 0 },\n error: ok ? undefined : 'network',\n };\n ctx.emit(ev);\n }\n }\n return ok;\n };\n return () => {\n navigator.sendBeacon = orig;\n };\n}\n\n// ─────────────────── PerformanceObserver (resources) ────────────────\nconst RESOURCE_TYPE_MAP: Record<string, NetworkResourceType> = {\n script: 'script',\n link: 'stylesheet',\n css: 'stylesheet',\n img: 'image',\n image: 'image',\n font: 'font',\n audio: 'media',\n video: 'media',\n track: 'media',\n};\n\nfunction observeResources(ctx: InstrumentCtx): Teardown {\n if (typeof PerformanceObserver === 'undefined') return () => {};\n let obs: PerformanceObserver | undefined;\n try {\n obs = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as PerformanceResourceTiming[]) {\n const it = entry.initiatorType;\n // fetch/XHR are captured by our wrappers — skip to avoid duplicates.\n if (it === 'fetch' || it === 'xmlhttprequest' || it === 'beacon') continue;\n const resourceType = RESOURCE_TYPE_MAP[it] || 'other';\n const startT = ctx.clock.fromPerf(entry.startTime);\n const endT = ctx.clock.fromPerf(entry.responseEnd || entry.startTime);\n const timing: NetworkTiming = {\n startT,\n endT,\n duration: Math.max(0, endT - startT),\n dns: nz(entry.domainLookupEnd - entry.domainLookupStart),\n tcp: nz(entry.connectEnd - entry.connectStart),\n tls: entry.secureConnectionStart ? nz(entry.connectEnd - entry.secureConnectionStart) : undefined,\n ttfb: nz(entry.responseStart - entry.requestStart),\n download: nz(entry.responseEnd - entry.responseStart),\n };\n const ev: NetworkEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'network',\n t: startT,\n ts: ctx.clock.wall(),\n initiator: 'resource',\n method: 'GET',\n url: redactUrl(entry.name),\n status: entry.responseStatus || 200,\n ok: !entry.responseStatus || entry.responseStatus < 400,\n resourceType,\n responseSize: entry.transferSize || entry.encodedBodySize || undefined,\n timing,\n };\n ctx.emit(ev);\n }\n });\n obs.observe({ type: 'resource', buffered: true });\n } catch {\n return () => {};\n }\n return () => obs?.disconnect();\n}\n\n// ────────────────────────────── helpers ─────────────────────────────\nfunction nz(n: number): number | undefined {\n return Number.isFinite(n) && n > 0 ? Math.round(n) : undefined;\n}\n\nfunction isTexty(contentType: string | null): boolean {\n if (!contentType) return false;\n return /json|text|xml|x-www-form-urlencoded/i.test(contentType);\n}\n\nfunction stringifyBody(body: unknown): string | undefined {\n if (body == null) return undefined;\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n const obj: Record<string, string> = {};\n body.forEach((v, k) => (obj[k] = typeof v === 'string' ? v : '«file»'));\n return JSON.stringify(obj);\n }\n try {\n return JSON.stringify(body);\n } catch {\n return undefined;\n }\n}\n\nfunction headerEntries(\n headers: HeadersInit | Headers | undefined,\n): Iterable<[string, string]> {\n if (!headers) return [];\n if (headers instanceof Headers) return headers.entries();\n if (Array.isArray(headers)) return headers as [string, string][];\n return Object.entries(headers);\n}\n","import type { ErrorEvent as ObsrviqErrorEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { errorToConsoleEvent } from './console.js';\nimport { maskString } from './mask.js';\nimport { parseSource } from './serialize.js';\nimport { uuid } from './util.js';\n\nexport function instrumentErrors(ctx: InstrumentCtx): Teardown {\n function emitError(args: {\n name: string;\n message: string;\n stack?: string;\n source?: { url?: string; line?: number; col?: number };\n handled: boolean;\n }) {\n const e: ObsrviqErrorEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'error',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n name: args.name,\n message: maskString(args.message),\n stack: args.stack ? maskString(args.stack) : undefined,\n source: args.source,\n handled: args.handled,\n };\n ctx.emit(e);\n // Surface uncaught errors in the Console panel too (§9 C-6).\n ctx.emit(errorToConsoleEvent(ctx, e));\n }\n\n const onError = (ev: ErrorEvent) => {\n const err = ev.error as Error | undefined;\n emitError({\n name: err?.name || 'Error',\n message: err?.message || ev.message || 'Unknown error',\n stack: err?.stack,\n source: { url: ev.filename, line: ev.lineno, col: ev.colno },\n handled: false,\n });\n };\n\n const onRejection = (ev: PromiseRejectionEvent) => {\n const reason = ev.reason;\n if (reason instanceof Error) {\n emitError({\n name: reason.name,\n message: reason.message,\n stack: reason.stack,\n source: parseSource(reason.stack),\n handled: false,\n });\n } else {\n emitError({\n name: 'UnhandledRejection',\n message: typeof reason === 'string' ? reason : safeStringify(reason),\n handled: false,\n });\n }\n };\n\n window.addEventListener('error', onError, true);\n window.addEventListener('unhandledrejection', onRejection, true);\n\n return () => {\n window.removeEventListener('error', onError, true);\n window.removeEventListener('unhandledrejection', onRejection, true);\n };\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v) ?? String(v);\n } catch {\n return String(v);\n }\n}\n","import type { PerfEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n// Lightweight web-vitals capture via PerformanceObserver — no extra dependency.\n// Emits LCP, CLS, INP (approx), FCP, TTFB, and a navigation summary (§5/§11).\n\nfunction rate(metric: PerfEvent['metric'], value: number): PerfEvent['rating'] {\n const t: Partial<Record<PerfEvent['metric'], [number, number]>> = {\n LCP: [2500, 4000],\n INP: [200, 500],\n CLS: [0.1, 0.25],\n FCP: [1800, 3000],\n TTFB: [800, 1800],\n };\n const pair = t[metric];\n if (!pair) return undefined;\n if (value <= pair[0]) return 'good';\n if (value <= pair[1]) return 'needs-improvement';\n return 'poor';\n}\n\nexport function instrumentVitals(ctx: InstrumentCtx): Teardown {\n if (typeof PerformanceObserver === 'undefined') return () => {};\n const observers: PerformanceObserver[] = [];\n\n const emit = (metric: PerfEvent['metric'], value: number, detail?: Record<string, number>) => {\n const e: PerfEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'perf',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n metric,\n value: Math.round(value * 1000) / 1000,\n rating: rate(metric, value),\n detail,\n };\n ctx.emit(e);\n };\n\n const obs = (type: string, cb: (entries: PerformanceEntryList) => void, extra?: object) => {\n try {\n const o = new PerformanceObserver((list) => cb(list.getEntries()));\n o.observe({ type, buffered: true, ...extra });\n observers.push(o);\n } catch {\n /* unsupported */\n }\n };\n\n // FCP\n obs('paint', (entries) => {\n for (const e of entries) if (e.name === 'first-contentful-paint') emit('FCP', e.startTime);\n });\n\n // LCP — keep the largest seen.\n let lcp = 0;\n obs('largest-contentful-paint', (entries) => {\n const last = entries[entries.length - 1];\n if (last) lcp = last.startTime;\n });\n\n // CLS — accumulate session layout shift.\n let cls = 0;\n obs('layout-shift', (entries) => {\n for (const e of entries as (PerformanceEntry & { value: number; hadRecentInput: boolean })[]) {\n if (!e.hadRecentInput) cls += e.value;\n }\n });\n\n // INP (approx via event timing — track max interaction delay).\n let inp = 0;\n obs(\n 'event',\n (entries) => {\n for (const e of entries as (PerformanceEntry & { duration: number })[]) {\n if (e.duration > inp) inp = e.duration;\n }\n },\n { durationThreshold: 40 },\n );\n\n // Navigation timing → TTFB + a navigation summary.\n obs('navigation', (entries) => {\n const nav = entries[0] as PerformanceNavigationTiming | undefined;\n if (!nav) return;\n emit('TTFB', nav.responseStart);\n emit('navigation', nav.duration, {\n domInteractive: Math.round(nav.domInteractive),\n domComplete: Math.round(nav.domComplete),\n loadEvent: Math.round(nav.loadEventEnd),\n });\n });\n\n // Flush LCP/CLS/INP on the way out (their final values).\n const flushFinal = () => {\n if (lcp) emit('LCP', lcp);\n emit('CLS', cls);\n if (inp) emit('INP', inp);\n };\n const onHide = () => {\n if (document.visibilityState === 'hidden') flushFinal();\n };\n document.addEventListener('visibilitychange', onHide, true);\n\n return () => {\n observers.forEach((o) => o.disconnect());\n document.removeEventListener('visibilitychange', onHide, true);\n };\n}\n","import type { CustomEvent as ObsrviqCustomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { cssPath } from './serialize.js';\nimport { uuid } from './util.js';\n\nconst RAGE_WINDOW_MS = 1000;\nconst RAGE_THRESHOLD = 3;\nconst DEAD_WAIT_MS = 3000;\n\nfunction isInteractive(el: Element | null): boolean {\n if (!el) return false;\n let node: Element | null = el;\n for (let i = 0; i < 4 && node; i++) {\n const tag = node.tagName.toLowerCase();\n if (['a', 'button', 'input', 'select', 'textarea', 'label', 'summary'].includes(tag))\n return true;\n if (node.getAttribute('role') === 'button' || node.hasAttribute('onclick')) return true;\n if (node.getAttribute('contenteditable') === 'true') return true;\n node = node.parentElement;\n }\n return false;\n}\n\nexport function instrumentInteractions(ctx: InstrumentCtx): Teardown {\n let recent: { el: Element; t: number }[] = [];\n let lastRageAt = -Infinity;\n\n const emitCustom = (name: string, props: Record<string, unknown>, t: number) => {\n const e: ObsrviqCustomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'custom',\n t,\n ts: ctx.clock.wall(),\n name,\n props,\n };\n ctx.emit(e);\n };\n\n const onClick = (ev: MouseEvent) => {\n const target = ev.target as Element | null;\n if (!target || !(target instanceof Element)) return;\n const t = ctx.clock.now();\n const selector = cssPath(target);\n\n // ── Click heatmap: one event per click, anchored to the exact element ──\n // Stored against (path, selector, device) and rolled up server-side. rx/ry are\n // the click position WITHIN the element (0..1) so heat re-projects at any size.\n {\n const rect = target.getBoundingClientRect();\n const rx = rect.width > 0 ? Math.min(1, Math.max(0, (ev.clientX - rect.left) / rect.width)) : 0.5;\n const ry = rect.height > 0 ? Math.min(1, Math.max(0, (ev.clientY - rect.top) / rect.height)) : 0.5;\n const label = (target.textContent || '').replace(/\\s+/g, ' ').trim().slice(0, 40);\n emitCustom(\n '_click',\n {\n selector,\n path: location.pathname,\n vw: window.innerWidth,\n vh: window.innerHeight,\n rx: Math.round(rx * 1000) / 1000,\n ry: Math.round(ry * 1000) / 1000,\n tag: target.tagName.toLowerCase(),\n label,\n },\n t,\n );\n }\n\n // ── Rage click detection ──\n recent = recent.filter((r) => t - r.t <= RAGE_WINDOW_MS);\n recent.push({ el: target, t });\n const sameTarget = recent.filter((r) => r.el === target);\n if (sameTarget.length >= RAGE_THRESHOLD && t - lastRageAt > RAGE_WINDOW_MS) {\n lastRageAt = t;\n emitCustom('rage_click', { selector, count: sameTarget.length }, t);\n }\n\n // ── Dead click detection ──\n if (!isInteractive(target)) {\n const before = ctx.lastActivityT();\n window.setTimeout(() => {\n // No app activity (mutation/nav/network) after the click → dead.\n if (ctx.lastActivityT() <= Math.max(before, t)) {\n emitCustom('dead_click', { selector }, t);\n }\n }, DEAD_WAIT_MS);\n }\n };\n\n window.addEventListener('click', onClick, true);\n return () => window.removeEventListener('click', onClick, true);\n}\n","import type { CustomEvent as ObsrviqCustomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { cssPath } from './serialize.js';\nimport { uuid } from './util.js';\n\n/**\n * Form-field analytics. Watches every form control (input / textarea / select)\n * and, on each blur, emits a lightweight `form_field` custom event describing\n * the *interaction* — never the value:\n *\n * { form, field, type, ms, changed, filled }\n *\n * One event per focus→blur, carrying that focus's duration (`ms`). The server\n * sums `ms` across events for total time-on-field, counts events per session\n * for re-entries, and reads `filled` to find fields people leave blank. A\n * `form_submit` event is emitted when a form is submitted; the last field\n * touched in a session whose form never submitted is the drop-off point.\n *\n * Each event also carries optional naming hints — `autocomplete`, `near` (the\n * field's visible label text), and `formTitle` (the form's heading) — so the\n * server can turn opaque keys (a React `useId()`, a CSS-selector path) into\n * human names like \"Work email\". Hints are static UI chrome, never values.\n *\n * Privacy: values are never read. `filled` is a boolean derived from value\n * length (or `checked`); the field key comes from structural attributes\n * (name / id / label), exactly as form-analytics tools do. Controls inside a\n * blocked region (the configured block selector) are skipped entirely.\n */\n\nconst TRACKED = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n// Non-data inputs: buttons and hidden/file fields carry no fill behaviour worth\n// measuring (and file is privacy-adjacent), so they're left out.\nconst SKIP_INPUT_TYPES = new Set(['hidden', 'submit', 'button', 'reset', 'image', 'file']);\nconst MAX_KEY = 80;\nconst MAX_HINT = 60; // naming hints are short labels, not keys\nconst MAX_FOCUS_MS = 300_000; // cap idle-inflated focus time (walked-away tab)\nconst MIN_FOCUS_MS = 100; // ignore sub-100ms programmatic focus blips\n\ntype FormControl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nfunction isTracked(el: EventTarget | null): el is FormControl {\n if (!(el instanceof HTMLElement) || !TRACKED.has(el.tagName)) return false;\n if (el instanceof HTMLInputElement && SKIP_INPUT_TYPES.has(el.type)) return false;\n return true;\n}\n\nfunction controlType(el: FormControl): string {\n if (el instanceof HTMLTextAreaElement) return 'textarea';\n if (el instanceof HTMLSelectElement) return 'select';\n return el.type || 'text';\n}\n\n/** Non-empty / checked — a boolean only, the value itself is never read. */\nfunction isFilled(el: FormControl): boolean {\n if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox' || el.type === 'radio') return el.checked;\n return el.value.trim().length > 0;\n }\n if (el instanceof HTMLSelectElement) return el.value !== '';\n return el.value.trim().length > 0;\n}\n\nfunction clip(s: string): string {\n const t = s.trim().replace(/\\s+/g, ' ');\n return t.length > MAX_KEY ? t.slice(0, MAX_KEY) : t;\n}\n\n/** A stable, human-readable field identity from structural attributes only. */\nfunction fieldKey(el: FormControl): string {\n const name = el.getAttribute('name');\n if (name) return clip(name);\n if (el.id) return clip(el.id);\n const aria = el.getAttribute('aria-label');\n if (aria) return clip(aria);\n const labelledby = el.getAttribute('aria-labelledby');\n if (labelledby) {\n const lbl = labelledby.split(/\\s+/).map((id) => el.ownerDocument.getElementById(id)?.textContent || '').join(' ').trim();\n if (lbl) return clip(lbl);\n }\n if (el.labels && el.labels.length) {\n const lbl = el.labels[0]!.textContent?.trim();\n if (lbl) return clip(lbl);\n }\n const ph = el.getAttribute('placeholder');\n if (ph) return clip(ph);\n return clip(cssPath(el));\n}\n\nfunction clipHint(s: string | null | undefined): string | undefined {\n if (!s) return undefined;\n const t = s.trim().replace(/\\s+/g, ' ');\n if (!t) return undefined;\n return t.length > MAX_HINT ? t.slice(0, MAX_HINT) : t;\n}\n\n/**\n * Visible text a human reads as this field's label — used ONLY as a naming hint\n * for the server's AI pass, never as the stable key. It reads static UI chrome\n * (a <label>, a wrapper's own text, a preceding label element) so opaque keys\n * like a React `useId()` or a CSS-selector path can still be named \"Work email\".\n * The control's value is never read; tracked controls and buttons are skipped so\n * a sibling input's contents can't leak in.\n */\nfunction nearbyText(el: FormControl): string | undefined {\n if (el.labels && el.labels.length) {\n const t = clipHint(el.labels[0]!.textContent);\n if (t) return t;\n }\n const aria = clipHint(el.getAttribute('aria-label'));\n if (aria) return aria;\n // A label rendered as a plain element just before the control.\n let sib: Element | null = el.previousElementSibling;\n for (let hops = 0; sib && hops < 3; hops++, sib = sib.previousElementSibling) {\n if (TRACKED.has(sib.tagName) || /^(BUTTON|SCRIPT|STYLE|SVG)$/.test(sib.tagName)) continue;\n const t = clipHint(sib.textContent);\n if (t) return t;\n }\n // <div class=\"field\">Label <input/></div> — the wrapper's own direct text.\n const parent = el.parentElement;\n if (parent) {\n const direct = clipHint(\n Array.from(parent.childNodes).filter((n) => n.nodeType === 3).map((n) => n.textContent || '').join(' '),\n );\n if (direct) return direct;\n const lbl = clipHint(parent.querySelector('label,legend')?.textContent);\n if (lbl) return lbl;\n }\n return clipHint(el.getAttribute('placeholder'));\n}\n\n/** The nearest heading/legend a user sees over the owning form — a naming hint. */\nfunction formTitleHint(el: FormControl): string | undefined {\n const scope = el.closest('form,fieldset,section,[role=\"form\"],[role=\"group\"]');\n if (scope) {\n const heading = clipHint(scope.querySelector('legend,h1,h2,h3,h4,[role=\"heading\"]')?.textContent);\n if (heading) return heading;\n const al = clipHint(scope.getAttribute('aria-label'));\n if (al) return al;\n }\n return clipHint(typeof document !== 'undefined' ? document.title : undefined);\n}\n\n/** Privacy-safe descriptive hints (label text, autocomplete intent, form heading)\n * attached to each interaction so the server can name opaque fields/forms. Only\n * present keys are emitted, keeping the wire small. */\nfunction namingHints(el: FormControl): Record<string, string> {\n const out: Record<string, string> = {};\n const ac = (el.getAttribute('autocomplete') || '').trim().toLowerCase();\n if (ac && ac !== 'off' && ac !== 'on') out.autocomplete = ac.slice(0, MAX_HINT);\n const near = nearbyText(el);\n if (near) out.near = near;\n const ft = formTitleHint(el);\n if (ft) out.formTitle = ft;\n return out;\n}\n\n/** A stable identity for the owning form (or a per-page bucket for loose fields). */\nfunction formKey(el: FormControl): string {\n const form = el.form;\n if (form) {\n if (form.getAttribute('name')) return clip(form.getAttribute('name')!);\n if (form.id) return clip(form.id);\n const aria = form.getAttribute('aria-label');\n if (aria) return clip(aria);\n const action = form.getAttribute('action');\n if (action) {\n try {\n return clip(new URL(action, location.href).pathname);\n } catch {\n return clip(action);\n }\n }\n return clip(cssPath(form));\n }\n // Form-less controls (common in SPAs) bucket by page path.\n return clip(`page:${location.pathname}`);\n}\n\nexport function instrumentForms(ctx: InstrumentCtx): Teardown {\n const block = ctx.config.blockSelector;\n // Per-focus state for the currently-focused control.\n let focused: { el: FormControl; start: number; changed: boolean } | null = null;\n\n const emit = (name: string, props: Record<string, unknown>) => {\n const e: ObsrviqCustomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'custom',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n name,\n props,\n };\n ctx.emit(e);\n };\n\n const blocked = (el: Element): boolean => {\n try {\n return !!block && !!el.closest(block);\n } catch {\n return false;\n }\n };\n\n const flush = () => {\n if (!focused) return;\n const { el, start, changed } = focused;\n focused = null;\n const ms = Math.min(MAX_FOCUS_MS, Math.max(0, ctx.clock.now() - start));\n // Drop pass-through blips that weren't real interactions.\n if (ms < MIN_FOCUS_MS && !changed) return;\n emit('form_field', {\n form: formKey(el),\n field: fieldKey(el),\n type: controlType(el),\n ms,\n changed,\n filled: isFilled(el),\n ...namingHints(el),\n });\n };\n\n const onFocusIn = (ev: FocusEvent) => {\n const el = ev.target;\n if (!isTracked(el) || blocked(el)) return;\n if (focused && focused.el !== el) flush(); // safety: blur may have been missed\n focused = { el, start: ctx.clock.now(), changed: false };\n };\n\n const onInput = (ev: Event) => {\n if (focused && ev.target === focused.el) focused.changed = true;\n };\n\n const onFocusOut = (ev: FocusEvent) => {\n if (focused && ev.target === focused.el) flush();\n };\n\n const onSubmit = (ev: Event) => {\n const form = ev.target;\n if (!(form instanceof HTMLFormElement) || blocked(form)) return;\n // Flush the in-progress field so its time lands before the submit marker.\n flush();\n // Reuse a tracked control to derive the key consistently; else fall back to the form itself.\n const probe = form.querySelector<FormControl>('input,textarea,select');\n const key = probe && !blocked(probe) ? formKey(probe) : clip(form.getAttribute('name') || form.id || cssPath(form));\n emit('form_submit', { form: key });\n };\n\n document.addEventListener('focusin', onFocusIn, true);\n document.addEventListener('focusout', onFocusOut, true);\n document.addEventListener('input', onInput, true);\n document.addEventListener('submit', onSubmit, true);\n // A navigation/unload can steal focus without a focusout — flush what we have.\n window.addEventListener('pagehide', flush, true);\n\n return () => {\n flush();\n document.removeEventListener('focusin', onFocusIn, true);\n document.removeEventListener('focusout', onFocusOut, true);\n document.removeEventListener('input', onInput, true);\n document.removeEventListener('submit', onSubmit, true);\n window.removeEventListener('pagehide', flush, true);\n };\n}\n","import type { CustomEvent as ObsrviqCustomEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n/**\n * Scroll-depth capture, per page path. Emits a `_scroll` event whenever the\n * visitor reaches a new, deeper 10% band of the page, so the server can take\n * each session's max depth per page. Cheap (a handful of events per page at\n * most) and value-free. The page identity is the pathname; depth resets on SPA\n * route changes.\n *\n * Each event also carries the page height `h` (full document height, px) and\n * viewport `vh` at that moment — so the server can tell apart \"100% of a short\n * stub\" from \"100% of a long article\", report absolute pixels reached, and flag\n * when a templated group blends pages of very different lengths.\n */\nexport function instrumentScrollDepth(ctx: InstrumentCtx): Teardown {\n let path = location.pathname;\n let maxBand = 0; // deepest 10% band reached on the current path\n let scheduled = false;\n\n const emit = (depth: number, h: number, vh: number) => {\n const e: ObsrviqCustomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'custom',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n name: '_scroll',\n props: { path, depth, h, vh },\n };\n ctx.emit(e);\n };\n\n const docHeight = (): number => {\n const d = document.documentElement;\n const b = document.body;\n return Math.max(d.scrollHeight, b ? b.scrollHeight : 0, d.clientHeight) || 1;\n };\n\n const measure = () => {\n scheduled = false;\n // Reset depth tracking when the SPA route changes.\n if (location.pathname !== path) {\n path = location.pathname;\n maxBand = 0;\n }\n const vh = window.innerHeight || document.documentElement.clientHeight || 1;\n const h = docHeight();\n const reached = Math.min(1, (window.scrollY + vh) / h);\n const band = Math.min(100, Math.round(reached * 10) * 10);\n if (band > maxBand) {\n maxBand = band;\n emit(band, h, vh);\n }\n };\n\n const onScroll = () => {\n if (scheduled) return;\n scheduled = true;\n requestAnimationFrame(measure);\n };\n\n window.addEventListener('scroll', onScroll, { passive: true, capture: true });\n // Capture the entry fold immediately (a session that never scrolls still has a depth).\n measure();\n\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n };\n}\n","import type { PageviewEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { uuid } from './util.js';\n\n/**\n * Auto-captures a `pageview` event on the initial load and on every SPA route\n * change — history.pushState / replaceState (patched, since neither fires a\n * native event), popstate (back/forward), and hashchange.\n *\n * The \"page\" identity is the pathname, plus a hash-router segment when the hash\n * looks like a route (`#/checkout`) but NOT a plain anchor (`#section`) — so\n * anchor jumps don't masquerade as page views. Same-path repeats are de-duped.\n * Each view records the previous in-app path as its `referrer`: the \"from\" edge\n * that Path / Journey analysis chains.\n */\nexport function instrumentPageviews(ctx: InstrumentCtx): Teardown {\n let lastPath: string | null = null;\n\n const currentPath = (): string => {\n const hash = location.hash;\n return location.pathname + (hash.startsWith('#/') ? hash : '');\n };\n\n const fire = () => {\n const path = currentPath();\n if (path === lastPath) return; // de-dupe no-op navigations / anchor jumps\n const referrer = lastPath ?? '';\n lastPath = path;\n const e: PageviewEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'pageview',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n url: location.href,\n path,\n title: document.title || undefined,\n referrer: referrer || undefined,\n };\n ctx.emit(e);\n ctx.markActivity();\n };\n\n // Patch history so SPA navigations (which fire no native event) are observed.\n const origPush = history.pushState;\n const origReplace = history.replaceState;\n const wrap = (orig: History['pushState']): History['pushState'] =>\n function patched(this: History, data, unused, url) {\n const ret = orig.call(this, data, unused, url);\n // Defer one microtask so location.* already reflects the new URL.\n queueMicrotask(fire);\n return ret;\n };\n history.pushState = wrap(origPush);\n history.replaceState = wrap(origReplace);\n window.addEventListener('popstate', fire);\n window.addEventListener('hashchange', fire);\n\n fire(); // the entry view\n\n return () => {\n history.pushState = origPush;\n history.replaceState = origReplace;\n window.removeEventListener('popstate', fire);\n window.removeEventListener('hashchange', fire);\n };\n}\n","/**\n * Self-contained UI the tracker injects into the host page:\n * - showConsent() — a corner consent card (askPermission)\n * - showRecordingDot() — a minimal pulsing \"recording\" dot (showRecording)\n *\n * Isolation rules (the SDK is otherwise headless):\n * - attachShadow({mode:'open'}) + adoptedStyleSheets → no host CSS bleed and\n * CSP-safe (no inline <style>, so `style-src 'self'` pages don't block it).\n * - the host element wears the recorder's block class (default `.obsrviq-block`)\n * so the SDK's own rrweb recorder never captures its own UI. The host box is\n * zero-size (its children are position:fixed), so no placeholder shows in the\n * replay.\n */\n\nexport interface ConsentText {\n title?: string;\n body?: string;\n allow?: string;\n deny?: string;\n}\n\n/** Derive a class the host can wear so the recorder's blockSelector excludes it.\n * blockSelector is usually a class selector (default '.obsrviq-block'). We always\n * keep `obsrviq-block` too, so a custom blockSelector can't accidentally un-hide. */\nfunction blockClassFrom(blockSelector: string): string {\n const m = /\\.([A-Za-z0-9_-]+)/.exec(blockSelector || '');\n const derived = m && m[1] ? m[1] : '';\n return ['obsrviq-block', derived].filter(Boolean).join(' ');\n}\n\nfunction makeHost(blockSelector: string): { host: HTMLElement; root: ShadowRoot } {\n const host = document.createElement('div');\n host.className = blockClassFrom(blockSelector);\n host.setAttribute('data-obsrviq-ui', '');\n host.style.cssText = 'all:initial';\n const root = host.attachShadow({ mode: 'open' });\n return { host, root };\n}\n\nfunction adopt(root: ShadowRoot, css: string): void {\n try {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n root.adoptedStyleSheets = [sheet];\n } catch {\n // Engines without constructable stylesheets — inline <style> inside the shadow\n // (still isolated; only a concern on host pages with a strict style-src CSP).\n const style = document.createElement('style');\n style.textContent = css;\n root.appendChild(style);\n }\n}\n\nfunction mount(host: HTMLElement): void {\n (document.body || document.documentElement).appendChild(host);\n}\n\nconst ACCENT = '#6e76f1';\n\nconst CONSENT_CSS = `\n:host { all: initial; }\n.card {\n position: fixed; bottom: 20px; right: 20px; z-index: 2147483647;\n max-width: 340px; box-sizing: border-box;\n display: grid; grid-template-columns: auto 1fr;\n grid-template-areas: 'dot txt' 'actions actions'; gap: 9px 12px; padding: 16px 18px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;\n color: #f4f5fb; background: #14151b; border: 1px solid rgba(255,255,255,.08);\n border-radius: 14px; box-shadow: 0 16px 48px rgba(0,0,0,.5);\n opacity: 0; transform: translateY(10px); transition: opacity .22s ease, transform .22s ease;\n}\n.card.in { opacity: 1; transform: none; }\n.dot { grid-area: dot; width: 9px; height: 9px; margin-top: 5px; border-radius: 50%;\n background: ${ACCENT}; box-shadow: 0 0 0 4px rgba(110,118,241,.18); }\n.txt { grid-area: txt; min-width: 0; }\n.title { font-size: 13.5px; font-weight: 600; line-height: 1.35; }\n.body { margin-top: 3px; font-size: 12px; line-height: 1.45; color: #a9adbe; }\n.actions { grid-area: actions; display: flex; gap: 8px; justify-content: flex-end; margin-top: 2px; }\nbutton { font: inherit; font-size: 12.5px; font-weight: 600; padding: 7px 15px; border-radius: 9px;\n cursor: pointer; border: 1px solid transparent; transition: background .15s ease, color .15s ease; }\n.deny { background: transparent; color: #a9adbe; border-color: rgba(255,255,255,.14); }\n.deny:hover { color: #f4f5fb; background: rgba(255,255,255,.05); }\n.allow { background: ${ACCENT}; color: #fff; }\n.allow:hover { background: #5a62e0; }\nbutton:focus-visible { outline: 2px solid ${ACCENT}; outline-offset: 2px; }\n@media (prefers-reduced-motion: reduce) { .card { transition: none; } }\n@media (max-width: 480px) { .card { left: 16px; right: 16px; bottom: 16px; max-width: none; } }\n`;\n\nconst DOT_CSS = `\n:host { all: initial; }\n.recdot {\n position: fixed; bottom: 16px; right: 16px; z-index: 2147483647;\n width: 12px; height: 12px; border-radius: 50%;\n background: #ef4444; box-shadow: 0 0 0 0 rgba(239,68,68,.5);\n animation: lum-pulse 2s ease-out infinite;\n}\n@keyframes lum-pulse {\n 0% { box-shadow: 0 0 0 0 rgba(239,68,68,.5); }\n 70% { box-shadow: 0 0 0 9px rgba(239,68,68,0); }\n 100% { box-shadow: 0 0 0 0 rgba(239,68,68,0); }\n}\n@media (prefers-reduced-motion: reduce) { .recdot { animation: none; } }\n`;\n\n/** Corner consent card. Resolves via onAllow/onDeny exactly once, then unmounts.\n * Returns an unmount fn (e.g. to tear down if consent is set programmatically). */\nexport function showConsent(\n blockSelector: string,\n text: ConsentText | undefined,\n onAllow: () => void,\n onDeny: () => void,\n): () => void {\n const { host, root } = makeHost(blockSelector);\n adopt(root, CONSENT_CSS);\n const t = text ?? {};\n\n const card = document.createElement('div');\n card.className = 'card';\n card.setAttribute('role', 'dialog');\n card.setAttribute('aria-label', t.title || 'Session recording consent');\n\n const dot = document.createElement('div');\n dot.className = 'dot';\n dot.setAttribute('aria-hidden', 'true');\n\n const txt = document.createElement('div');\n txt.className = 'txt';\n const title = document.createElement('div');\n title.className = 'title';\n title.textContent = t.title || 'We record this session to improve the experience.';\n const body = document.createElement('div');\n body.className = 'body';\n body.textContent = t.body || 'No passwords or typed input are captured.';\n txt.append(title, body);\n\n const actions = document.createElement('div');\n actions.className = 'actions';\n const deny = document.createElement('button');\n deny.type = 'button';\n deny.className = 'deny';\n deny.textContent = t.deny || 'Decline';\n const allow = document.createElement('button');\n allow.type = 'button';\n allow.className = 'allow';\n allow.textContent = t.allow || 'Allow';\n actions.append(deny, allow);\n\n card.append(dot, txt, actions);\n root.appendChild(card);\n mount(host);\n requestAnimationFrame(() => card.classList.add('in'));\n\n let done = false;\n const unmount = () => {\n if (host.parentNode) host.parentNode.removeChild(host);\n };\n const choose = (fn: () => void) => () => {\n if (done) return;\n done = true;\n unmount();\n fn();\n };\n allow.addEventListener('click', choose(onAllow));\n deny.addEventListener('click', choose(onDeny));\n return unmount;\n}\n\n/** Minimal pulsing \"recording\" dot (bottom-right). Returns an unmount fn. */\nexport function showRecordingDot(blockSelector: string): () => void {\n const { host, root } = makeHost(blockSelector);\n adopt(root, DOT_CSS);\n const dot = document.createElement('div');\n dot.className = 'recdot';\n dot.setAttribute('role', 'status');\n dot.setAttribute('aria-label', 'Session recording in progress');\n root.appendChild(dot);\n mount(host);\n return () => {\n if (host.parentNode) host.parentNode.removeChild(host);\n };\n}\n","/**\n * Returning-visitor tracking.\n *\n * A single persistent, ANONYMOUS visitor record in localStorage (no PII — just a\n * random id + counters) lets the backend tell first-time from returning visitors\n * and stitch a person's repeat visits together. Written only after consent (the\n * caller gates this), and fully guarded for SSR / private-mode / disabled storage\n * — visitor tracking silently no-ops rather than ever throwing.\n */\nimport { uuid } from './util.js';\n\nconst VISITOR_KEY = 'obsrviq.visitor';\nconst SESSION_KEY = 'obsrviq.session';\n\n/** Persisted across page loads so a returning visit within the inactivity window\n * can RESUME the same session (opt-in `continueSession`). Same-origin localStorage\n * only — graceful no-op when unavailable (→ per-page sessions, today's default). */\nexport interface SessionRecord {\n /** The session id to continue. */\n id: string;\n /** Epoch ms the (original) session started — the stable clock anchor. */\n startedAt: number;\n /** Epoch ms of the last activity (flush) — the inactivity-gap reference. */\n lastActivity: number;\n /** Next batch seq to send (kept monotonic across page loads → no chunk-key\n * collision on the (session_id, seq) primary key). */\n seq: number;\n /** Highest event `t` (ms since session start) reached so far — used as a floor\n * for the resumed clock so the next page's timestamps never overlap the prior\n * page's, even if the wall clock moves backward between loads. */\n lastT?: number;\n /** The userId this session is attributed to, if any — so a DIFFERENT user on a\n * shared device starts a fresh session instead of merging. */\n userId?: string;\n}\n\nexport function readSession(): SessionRecord | null {\n const raw = readLS(SESSION_KEY);\n if (!raw) return null;\n try {\n const p = JSON.parse(raw) as Partial<SessionRecord>;\n if (p && typeof p.id === 'string' && p.id && typeof p.startedAt === 'number') {\n return {\n id: p.id,\n startedAt: p.startedAt,\n lastActivity: typeof p.lastActivity === 'number' ? p.lastActivity : p.startedAt,\n seq: typeof p.seq === 'number' && p.seq >= 0 ? p.seq : 0,\n lastT: typeof p.lastT === 'number' && p.lastT >= 0 ? p.lastT : undefined,\n userId: typeof p.userId === 'string' ? p.userId : undefined,\n };\n }\n } catch {\n /* corrupted — treat as none */\n }\n return null;\n}\n\nexport function writeSession(rec: SessionRecord): void {\n writeLS(SESSION_KEY, JSON.stringify(rec));\n}\n\nexport function clearSession(): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(SESSION_KEY);\n } catch {\n /* ignore */\n }\n}\n\nexport interface VisitorRecord {\n /** Stable anonymous id for this browser. */\n id: string;\n /** Epoch ms first ever seen. */\n firstSeenAt: number;\n /** Epoch ms of the most recent visit (this one, after registerVisit). */\n lastSeenAt: number;\n /** Lifetime visit count, including the current visit. */\n visits: number;\n}\n\nfunction readLS(key: string): string | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null; // private mode / disabled / sandboxed\n }\n}\n\nfunction writeLS(key: string, value: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n /* quota / disabled — visitor tracking degrades to per-session */\n }\n}\n\n/**\n * Read-or-create the visitor record and register the current visit (increments\n * the count, stamps lastSeenAt). Returns the snapshot for THIS session: a fresh\n * record has visits === 1 (first-time visitor); an existing one has visits > 1\n * (returning). Never throws.\n */\nexport function registerVisit(now: number): VisitorRecord {\n let rec: VisitorRecord | null = null;\n const raw = readLS(VISITOR_KEY);\n if (raw) {\n try {\n const p = JSON.parse(raw) as Partial<VisitorRecord>;\n if (p && typeof p.id === 'string' && p.id) {\n rec = {\n id: p.id,\n firstSeenAt: typeof p.firstSeenAt === 'number' ? p.firstSeenAt : now,\n lastSeenAt: typeof p.lastSeenAt === 'number' ? p.lastSeenAt : now,\n visits: typeof p.visits === 'number' && p.visits > 0 ? p.visits : 1,\n };\n }\n } catch {\n /* corrupted JSON — fall through and regenerate */\n }\n }\n\n const next: VisitorRecord = rec\n ? { ...rec, visits: rec.visits + 1, lastSeenAt: now }\n : { id: uuid(), firstSeenAt: now, lastSeenAt: now, visits: 1 };\n\n writeLS(VISITOR_KEY, JSON.stringify(next));\n return next;\n}\n","import type { IngestSessionMeta, ObsrviqEvent, ObsrviqInitConfig } from '@obsrviq/types';\nimport type { InstrumentCtx, ResolvedConfig, Teardown } from './context.js';\nimport { Transport } from './transport.js';\nimport { instrumentDom } from './recorder.js';\nimport { instrumentConsole } from './console.js';\nimport { instrumentNetwork } from './network.js';\nimport { instrumentErrors } from './errors.js';\nimport { instrumentVitals } from './vitals.js';\nimport { instrumentInteractions } from './interactions.js';\nimport { instrumentForms } from './forms.js';\nimport { instrumentScrollDepth } from './scroll.js';\nimport { instrumentPageviews } from './pageviews.js';\nimport { showConsent, showRecordingDot } from './ui.js';\nimport { clearSession, readSession, registerVisit, writeSession } from './storage.js';\nimport { Clock, detectDevice, privacySignalsOptOut, sha256Hex, uuid } from './util.js';\n\nconst DEFAULTS = {\n maskAllInputs: true,\n blockSelector: '.obsrviq-block',\n noPrivacy: false,\n captureNetworkBodies: false,\n redactHeaders: ['authorization', 'cookie', 'set-cookie'],\n sampleRate: 1.0,\n recordCanvas: false,\n endpoint: 'https://in.lumera.app',\n flushIntervalMs: 5000,\n continueSession: false,\n sessionTimeoutMs: 30 * 60 * 1000,\n requireConsent: false,\n askPermission: false,\n showRecording: false,\n autoStart: true,\n maxArgBytes: 8 * 1024,\n};\n\nexport interface Diagnostics {\n recording: boolean;\n sessionId: string | null;\n flushes: number;\n bytesSent: number;\n eventsSent: number;\n eventsQueued: number;\n}\n\nclass ObsrviqClient {\n private config: ResolvedConfig | null = null;\n private clock: Clock | null = null;\n private transport: Transport | null = null;\n private teardowns: Teardown[] = [];\n private meta: IngestSessionMeta | null = null;\n private recording = false;\n private consent: boolean | null = null;\n private sampledIn = true;\n /** Manual-control intent. In autoStart:false mode, recording only begins once\n * the host calls startRecording() (which sets this); stopRecording() clears it. */\n private manualStartRequested = false;\n private lastActivity = 0;\n /** The userId this session is attributed to (for the shared-device split). */\n private currentUserId: string | undefined;\n /** Next batch seq — mirrored from the transport so we can persist continuation. */\n private nextSeq = 0;\n /** Open task spans keyed by task name → the span id + start time, so endTask()\n * can pair with its startTask(). Re-starting the same name supersedes the\n * earlier open span (the player pairs by spanId, so this only affects which\n * start an unqualified end() resolves to). */\n private openTasks = new Map<string, { spanId: string; startT: number }>();\n private consentUnmount: (() => void) | null = null;\n private recDotUnmount: (() => void) | null = null;\n private diag: Diagnostics = {\n recording: false,\n sessionId: null,\n flushes: 0,\n bytesSent: 0,\n eventsSent: 0,\n eventsQueued: 0,\n };\n\n /** The current session id (null until init). */\n get sessionId(): string | null {\n return this.diag.sessionId;\n }\n\n init(config: ObsrviqInitConfig): void {\n if (this.config) return; // idempotent\n if (!config.siteKey) {\n console.warn('[obsrviq] init() called without siteKey — recording disabled.');\n return;\n }\n this.config = { ...DEFAULTS, ...stripUndefined(config) } as ResolvedConfig;\n // No-privacy: record input values verbatim by unmasking inputs — but only if\n // the host didn't set maskAllInputs explicitly (their choice always wins).\n // Page text is already verbatim unless maskTextSelector is set. Passwords stay\n // masked via the recorder's maskInputOptions floor.\n if (this.config.noPrivacy && config.maskAllInputs === undefined) {\n this.config.maskAllInputs = false;\n }\n // askPermission = \"show a built-in consent prompt\"; it implies a consent gate.\n if (this.config.askPermission) this.config.requireConsent = true;\n\n this.startSession();\n\n // Init-time identity (rarely known this early — usually set later via identify()).\n if (config.userId != null) this.applyUserId(config.userId);\n if (config.metadata && this.meta) this.meta.metadata = { ...config.metadata };\n\n // GPC / DNT always wins → no recording, no UI (R-1).\n if (privacySignalsOptOut()) {\n this.consent = false;\n return;\n }\n\n if (this.config.requireConsent) {\n // Built-in prompt, if asked; otherwise the host calls setConsent(true) itself.\n if (this.config.askPermission) {\n this.consentUnmount = showConsent(\n this.config.blockSelector,\n this.config.consentText,\n () => this.setConsent(true),\n () => this.setConsent(false),\n );\n }\n } else {\n this.maybeStart();\n }\n }\n\n /** (Re)create the session id, clock, meta, and transport. Used by init() and\n * reset(). Does not start recording — callers decide via maybeStart().\n * @param seedInitUser seed identity from the init-time `cfg.userId`. True for\n * the initial init() session; FALSE for reset() (logout) — otherwise the fresh\n * post-logout session would be re-attributed to the user who just logged out. */\n private startSession(seedInitUser = true): void {\n const cfg = this.config!;\n // Session continuation (opt-in): resume the same session for a same-device\n // return within the inactivity window — but NOT when a different known user is\n // at the device (the shared-device split). A resumed session keeps recording\n // regardless of sampling (it was already sampled in).\n const now = Date.now();\n let resume: ReturnType<typeof readSession> = null;\n if (cfg.continueSession) {\n const rec = readSession();\n if (\n rec &&\n now - rec.lastActivity < cfg.sessionTimeoutMs &&\n !(cfg.userId != null && rec.userId != null && rec.userId !== String(cfg.userId))\n ) {\n resume = rec;\n }\n }\n const sessionId = resume ? resume.id : uuid();\n this.clock = resume ? new Clock(resume.startedAt, resume.lastT) : new Clock();\n this.currentUserId =\n resume?.userId ?? (seedInitUser && cfg.userId != null ? String(cfg.userId) : undefined);\n this.nextSeq = resume ? resume.seq : 0;\n this.diag.sessionId = sessionId;\n this.meta = {\n startedAt: this.clock.startedAt,\n entryUrl: location.href,\n device: detectDevice(),\n };\n // Sampling decision for the whole session — a resumed one stays in.\n this.sampledIn = resume ? true : Math.random() < (cfg.sampleRate ?? 1);\n this.transport = new Transport({\n endpoint: cfg.endpoint,\n siteKey: cfg.siteKey,\n sessionId,\n getMeta: () => this.meta ?? undefined,\n beforeSend: cfg.beforeSend,\n flushIntervalMs: cfg.flushIntervalMs,\n startSeq: this.nextSeq,\n onSeqDispatch: (next) => {\n this.nextSeq = next;\n this.persistSession();\n },\n onFlush: ({ bytes, events, ok }) => {\n if (ok) {\n this.diag.flushes++;\n this.diag.bytesSent += bytes;\n this.diag.eventsSent += events;\n }\n },\n });\n this.recording = false;\n this.diag.recording = false;\n }\n\n /** Persist the session-continuation record (no-op unless continueSession). Only\n * ever writes for a RECORDING session — a sampled-out or pre-consent session must\n * not leave a record that a later page would resume (and force back into\n * recording), and identify() can fire before recording starts. */\n private persistSession(): void {\n if (!this.config?.continueSession || !this.recording || !this.clock || !this.diag.sessionId) return;\n writeSession({\n id: this.diag.sessionId,\n startedAt: this.clock.startedAt,\n lastActivity: Date.now(),\n seq: this.nextSeq,\n lastT: this.clock.now(),\n userId: this.currentUserId,\n });\n }\n\n private maybeStart(): void {\n if (this.recording || !this.config || !this.clock || !this.transport) return;\n // Manual mode: hold off until the host explicitly calls startRecording().\n if (this.config.autoStart === false && !this.manualStartRequested) return;\n if (this.config.requireConsent && this.consent !== true) return;\n if (this.consent === false) return;\n if (!this.sampledIn) return;\n\n // Returning-visitor identity: now that consent is granted and we're about to\n // record, read-or-create the persistent (anonymous) visitor record and stamp\n // it onto the session meta. Guarded internally — never blocks recording.\n if (this.meta && this.meta.visitorId == null) {\n const visit = registerVisit(Date.now());\n this.meta.visitorId = visit.id;\n this.meta.visitCount = visit.visits;\n this.meta.firstSeenAt = visit.firstSeenAt;\n }\n\n const ctx: InstrumentCtx = {\n clock: this.clock,\n sessionId: this.diag.sessionId!,\n config: this.config,\n emit: (e: ObsrviqEvent) => {\n this.transport!.enqueue(e);\n this.diag.eventsQueued++;\n },\n markActivity: () => {\n this.lastActivity = this.clock!.now();\n },\n lastActivityT: () => this.lastActivity,\n };\n\n this.transport.start();\n // Order matters slightly: network/console wrappers should be installed\n // before app code runs more requests; DOM last so its snapshot is current.\n this.teardowns.push(instrumentConsole(ctx));\n this.teardowns.push(instrumentNetwork(ctx));\n this.teardowns.push(instrumentErrors(ctx));\n this.teardowns.push(instrumentVitals(ctx));\n this.teardowns.push(instrumentInteractions(ctx));\n this.teardowns.push(instrumentForms(ctx));\n this.teardowns.push(instrumentScrollDepth(ctx));\n this.teardowns.push(instrumentPageviews(ctx));\n this.teardowns.push(instrumentDom(ctx));\n\n this.recording = true;\n this.diag.recording = true;\n\n // Now that we're actually recording, anchor the continuation record so a next\n // page can resume this (and ONLY a recording) session, even before any flush.\n this.persistSession();\n\n // Transparency: optional visible \"recording\" indicator.\n if (this.config.showRecording && !this.recDotUnmount) {\n this.recDotUnmount = showRecordingDot(this.config.blockSelector);\n }\n }\n\n /** Associate the session with an application user. Stores the RAW userId (for\n * search + display) AND a SHA-256 identityHash, merges any traits into metadata,\n * and force-flushes so the live session is retro-stamped promptly. Safe to call\n * before recording starts (values ride the first batch) and after login. */\n identify(userId: string, traits?: Record<string, unknown>): void {\n if (!this.meta) return;\n const uid = String(userId);\n // Shared-device split: if this session is already attributed to a DIFFERENT\n // user (continueSession only), rotate to a fresh session so two people never\n // merge into one. reset() clears the continuation record so it can't resume\n // the prior user. (Same user, or first identify on the session → no split.)\n if (this.config?.continueSession && this.currentUserId != null && this.currentUserId !== uid) {\n this.reset();\n }\n this.currentUserId = uid;\n this.applyUserId(uid);\n if (traits) this.mergeMetadata(traits);\n // track() emits an event only while recording — which also guarantees the\n // next flush is non-empty so the updated meta actually ships (empty buffers\n // are skipped by transport.flush()).\n this.track('identify', { hasTraits: !!traits });\n void this.flush();\n // Stamp the userId onto the continuation record so the next page knows it.\n this.persistSession();\n }\n\n /** Merge custom properties onto the session at any time (searchable server-side). */\n setMetadata(props: Record<string, unknown>): void {\n if (!this.meta) return;\n this.mergeMetadata(props);\n this.track('metadata', { keys: Object.keys(props) });\n void this.flush();\n }\n\n /** Forget the current identity (e.g. on logout) and rotate to a fresh anonymous\n * session, so post-logout activity isn't attributed to the prior user. (Identity\n * can't be cleared on the existing row — the server merge only fills nulls — so\n * we start a new session instead.) */\n reset(): void {\n if (!this.config) return;\n const wasRecording = this.recording;\n if (this.recording) this.teardown(); // flushes the old session's final batch\n // An explicit reset (logout / user switch) must NEVER resume the prior\n // session — drop the continuation record so startSession() begins fresh.\n clearSession();\n this.currentUserId = undefined;\n // Fresh session must stay anonymous — do NOT re-seed the init-time userId, or a\n // post-logout session would be re-attributed to the user who just logged out.\n this.startSession(false);\n if (wasRecording && this.consent !== false && !privacySignalsOptOut()) this.maybeStart();\n }\n\n /** Set the raw userId on meta and compute its hash (async). */\n private applyUserId(userId: string): void {\n const raw = String(userId);\n if (this.meta) this.meta.userId = raw;\n void sha256Hex(raw).then((hash) => {\n if (this.meta && this.meta.userId === raw) this.meta.identityHash = hash;\n });\n }\n\n private mergeMetadata(props: Record<string, unknown>): void {\n if (!this.meta) return;\n this.meta.metadata = { ...(this.meta.metadata ?? {}), ...props };\n }\n\n /** Emit a custom event (e.g. conversions). */\n track(name: string, props?: Record<string, unknown>): void {\n if (!this.recording || !this.clock || !this.transport) return;\n this.transport.enqueue({\n id: uuid(),\n sessionId: this.diag.sessionId!,\n type: 'custom',\n t: this.clock.now(),\n ts: this.clock.wall(),\n name,\n props,\n });\n this.diag.eventsQueued++;\n }\n\n /** Mark a conversion. Conversion is client-defined, so the NAME matters —\n * \"checkout\", \"signup\", \"trial_started\" — and each is denormalised onto the\n * session for per-client filtering. Sets props.conversion so the legacy\n * 'conversion' flag still lights up. Sugar over track(name, {conversion:true}). */\n conversion(name: string, props?: Record<string, unknown>): void {\n const clean = String(name).trim();\n if (!clean) return;\n this.track(clean, { ...props, conversion: true });\n }\n\n /** Attach one or more free-form, searchable labels to the current session.\n * Tags are session-level (deduped server-side) — use them to slice sessions\n * however a client likes (\"vip\", \"ab_variant_b\", \"mobile_app\"). */\n tag(...names: string[]): void {\n const clean = names.map((n) => String(n).trim()).filter(Boolean);\n if (!clean.length) return;\n this.track('_tag', { tags: clean });\n void this.flush();\n }\n\n /** Begin a named sub-event span. Pairs with end() / endTask(name) to produce a\n * searchable, duration-bearing span on the session timeline. Returns a handle\n * so callers can `const t = Obsrviq.startTask('checkout'); …; t.end()`. */\n startTask(name: string, props?: Record<string, unknown>): { end: (endProps?: Record<string, unknown>) => void } {\n const clean = String(name).trim();\n const spanId = uuid();\n const startT = this.clock ? this.clock.now() : 0;\n if (clean) {\n this.openTasks.set(clean, { spanId, startT });\n this.track(`${clean}:started`, { ...props, spanId, task: clean });\n }\n return { end: (endProps?: Record<string, unknown>) => this.endTask(clean, endProps) };\n }\n\n /** Close a named sub-event span opened by startTask(name). Safe to call even\n * if the start was never seen (renders as an orphan end on the timeline). */\n endTask(name: string, props?: Record<string, unknown>): void {\n const clean = String(name).trim();\n if (!clean) return;\n const open = this.openTasks.get(clean);\n this.openTasks.delete(clean);\n const spanId = open?.spanId ?? uuid();\n this.track(`${clean}:ended`, {\n ...props,\n spanId,\n task: clean,\n ...(open ? { startT: open.startT } : {}),\n });\n }\n\n /** Gate recording (PRIV-2). true starts; false stops + flushes. Dismisses the\n * built-in consent prompt if one is showing. */\n setConsent(granted: boolean): void {\n this.consent = granted;\n this.consentUnmount?.();\n this.consentUnmount = null;\n if (granted) this.maybeStart();\n else if (this.recording) this.teardown();\n }\n\n /** Begin recording now. The trigger for `autoStart: false` (manual) mode —\n * nothing records until this is called. Idempotent: a no-op while already\n * recording. Consent, GPC/DNT and sampling still apply (so a consent-gated or\n * sampled-out session won't start just because this was called). After a\n * stopRecording(), this resumes the SAME session with the idle gap shown. */\n startRecording(): void {\n this.manualStartRequested = true;\n this.maybeStart();\n }\n\n /** Stop recording and flush the final batch. Recording stays off until\n * startRecording() is called again. (Friendlier name for stop(), and it also\n * clears the manual-start intent so recording won't silently resume.) */\n stopRecording(): void {\n this.manualStartRequested = false;\n if (this.recording) this.teardown();\n }\n\n /** Hard stop + flush. */\n stop(): void {\n this.teardown();\n }\n\n /** Force a flush now (returns when send is attempted). */\n flush(): Promise<boolean> {\n return this.transport ? this.transport.flush('manual') : Promise.resolve(true);\n }\n\n getDiagnostics(): Diagnostics {\n return { ...this.diag };\n }\n\n private teardown(): void {\n for (const t of this.teardowns.splice(0)) {\n try {\n t();\n } catch {\n /* ignore */\n }\n }\n this.recDotUnmount?.();\n this.recDotUnmount = null;\n this.transport?.stop();\n this.recording = false;\n this.diag.recording = false;\n }\n}\n\nfunction stripUndefined<T extends object>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) (out as Record<string, unknown>)[k] = v;\n }\n return out;\n}\n\nexport const Obsrviq = new ObsrviqClient();\nexport type { ObsrviqInitConfig } from '@obsrviq/types';\nexport default Obsrviq;\n"]}