@obsrviq/tracker 0.6.0 → 0.7.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 +105 -0
- package/dist/index.js.map +1 -1
- package/dist/obsrviq.global.js +39 -39
- package/dist/obsrviq.global.js.map +1 -1
- package/package.json +2 -2
- package/src/context.ts +4 -0
- package/src/index.ts +2 -0
- package/src/network.ts +38 -0
- package/src/trace.ts +130 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mask.ts","../src/transport.ts","../src/util.ts","../src/recorder.ts","../src/serialize.ts","../src/console.ts","../src/ratelimit.ts","../src/network.ts","../src/websocket.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":["out","rate","redactUrl","byteLen"],"mappings":"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","file":"index.js","sourcesContent":["// 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\nimport type { ObsrviqEvent } from '@obsrviq/types';\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. Two tiers so we\n// catch real secrets without over-redacting innocent fields:\n// STRONG — long/unambiguous tokens, safe to match as a substring of the key\n// name (e.g. \"accessToken\", \"x-api-key\", \"clientSecret\").\n// WEAK — short/ambiguous tokens that we only honour when they stand alone as\n// a key SEGMENT, so \"shipping\"(pin) / \"discard\"(card) / \"author\"(auth)\n// aren't caught but \"pin\" / \"cardNumber\" / \"authToken\" are.\nconst SENSITIVE_STRONG =\n /(password|passwd|passphrase|secret|token|authoriz|apikey|api[_-]key|creditcard|cardnumber|cardholder|cookie|cvv|cvc)/i;\nconst SENSITIVE_WEAK = new Set(['pass', 'pwd', 'auth', 'card', 'pin', 'otp', 'ssn', 'cvv', 'cvc']);\n\n/** Split a key name into lowercase word segments on delimiters AND camelCase\n * boundaries: \"accessToken\" → [access, token], \"api_key\" → [api, key]. */\nfunction keySegments(key: string): string[] {\n return key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((s) => s.toLowerCase());\n}\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\n// Customer-defined keys to mask (case-insensitive exact match), delivered via the\n// per-site config (GET /v1/config) and/or the init `maskKeys` option. Additive to\n// the built-in list above — you can only add protections, never remove them.\nlet customKeys = new Set<string>();\nexport function setCustomMaskKeys(keys: string[]): void {\n customKeys = new Set(keys.map((k) => String(k).trim().toLowerCase()).filter(Boolean));\n}\n\n// Whether the per-site mask config (GET /v1/config) has settled. Until it does,\n// remote-only custom keys aren't known yet, so the transport holds non-unload\n// sends (below) to avoid leaking a custom-keyed value in the brief init window.\nlet maskConfigSettled = false;\nexport function markMaskConfigReady(): void {\n maskConfigSettled = true;\n}\nexport function isMaskConfigPending(): boolean {\n return !maskConfigSettled;\n}\nexport function hasCustomMaskKeys(): boolean {\n return customKeys.size > 0;\n}\nfunction isCustomKey(key: string): boolean {\n return customKeys.has(key.toLowerCase());\n}\n\n/** Key-based sensitivity test: built-in STRONG/WEAK tiers PLUS any customer-\n * configured keys (exact, case-insensitive). Boundary-aware so innocent fields\n * like \"shipping\" / \"discard\" / \"author\" aren't redacted. */\nexport function isSensitiveKeyName(key: string): boolean {\n if (isCustomKey(key)) return true;\n if (SENSITIVE_STRONG.test(key)) return true;\n return keySegments(key).some((seg) => SENSITIVE_WEAK.has(seg));\n}\n\n/** Redact sensitive-key values in a parsed object (built-in list + custom keys).\n * The send-time safety net that guarantees a `{\"password\": \"…\"}` style body can\n * never leave the page unmasked, even for non-DOM network/WS payloads (whose\n * capture-time masking is PII-pattern only, not key-aware). */\nfunction redactSensitiveInValue(value: unknown, depth = 0): unknown {\n if (depth > 24 || value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map((v) => redactSensitiveInValue(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] = isSensitiveKeyName(k) ? '«redacted»' : redactSensitiveInValue(v, depth + 1);\n }\n return out;\n}\n\n/** String-level key redaction for payloads that don't parse as JSON — non-JSON\n * bodies (form-urlencoded / query strings) AND truncated JSON, where the\n * structured path bails. Captures each `\"key\": value` (JSON-ish, tolerant of a\n * cut-off tail) and `key=value` (form / query) key name and redacts the value\n * when the key is sensitive. */\nfunction redactSensitiveInRawText(text: string): string {\n let out = text.replace(\n /\"([A-Za-z0-9_.\\-]+)\"\\s*:\\s*(\"(?:[^\"\\\\]|\\\\.)*\"|[^,}\\]\\s]+)/g,\n (m, key: string) => (isSensitiveKeyName(key) ? '\"' + key + '\": \"«redacted»\"' : m),\n );\n out = out.replace(\n /(^|[?&])([A-Za-z0-9_.\\-[\\]]+)=([^&\\s]*)/g,\n (m, pre: string, key: string) => (isSensitiveKeyName(key) ? pre + key + '=«redacted»' : m),\n );\n return out;\n}\n\n/** Redact sensitive-key values in a stored body/arg string. Tries structured\n * JSON first; falls back to a string scan for non-JSON or truncated payloads so a\n * sensitive key can't slip through in `email=a&password=b` or a cut-off body. */\nfunction redactSensitiveInText(text: string | undefined): string | undefined {\n if (!text) return text;\n const trimmed = text.trim();\n if (trimmed[0] === '{' || trimmed[0] === '[') {\n try {\n return JSON.stringify(redactSensitiveInValue(JSON.parse(trimmed)));\n } catch {\n /* truncated / invalid JSON — fall through to the string scan */\n }\n }\n return redactSensitiveInRawText(text);\n}\n\n/** Send-time pass: mask sensitive keys (built-in list + custom keys) across a\n * batch's bodies / frames / console args / custom props (mutates in place).\n * Always runs — the built-in list applies with no per-site config needed. */\nexport function redactBatchSensitiveKeys(events: ObsrviqEvent[]): void {\n for (const e of events) {\n if (e.type === 'network' || e.type === 'ws') {\n const anyE = e as unknown as {\n requestBody?: { preview?: string };\n responseBody?: { preview?: string };\n body?: { preview?: string };\n };\n if (anyE.requestBody?.preview) anyE.requestBody.preview = redactSensitiveInText(anyE.requestBody.preview);\n if (anyE.responseBody?.preview) anyE.responseBody.preview = redactSensitiveInText(anyE.responseBody.preview);\n if (anyE.body?.preview) anyE.body.preview = redactSensitiveInText(anyE.body.preview);\n } else if (e.type === 'custom') {\n const c = e as unknown as { props?: Record<string, unknown> };\n if (c.props) c.props = redactSensitiveInValue(c.props) as Record<string, unknown>;\n } else if (e.type === 'console') {\n const args = (e as unknown as { args?: Array<{ kind: string; json?: string }> }).args;\n if (args) for (const a of args) if (a.kind === 'object' && a.json) a.json = redactSensitiveInText(a.json);\n }\n }\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] = isSensitiveKeyName(k) ? '«redacted»' : maskValue(v, depth + 1);\n }\n return out;\n}\n","import { gzipSync } from 'fflate';\nimport type { IngestBatch, IngestSessionMeta, ObsrviqEvent } from '@obsrviq/types';\nimport { redactBatchSensitiveKeys, isMaskConfigPending } from './mask.js';\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 /** Called after backpressure had to drop buffered DOM deltas — the host should\n * force a fresh rrweb FullSnapshot so the replay stream re-anchors instead of\n * playing corrupt deltas until the next scheduled checkpoint. */\n onDomDrop?: () => 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/** Split batches whose JSON exceeds this before sending — well under the ingest\n * body cap (16MB gzip) even at gzip-hostile content, and keeps main-thread\n * stringify/compress work per flush bounded. */\nconst MAX_BATCH_JSON_BYTES = 4 * 1024 * 1024;\n/** Target gzip size per unload piece — sendBeacon/keepalive cap in-flight bodies\n * at ~64KB, so pieces are kept comfortably under it. */\nconst BEACON_PIECE_BYTES = 56 * 1024;\n/** localStorage spill of batches an unload couldn't beacon out (queue full /\n * oversized). Resent by the next page load. Bounded so we respect the ~5MB\n * origin quota shared with the app. */\nconst SPILL_KEY = 'obsrviq.spill';\nconst SPILL_MAX_BYTES = 1_500_000;\nconst SPILL_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\n// rrweb event types we need to recognise for snapshot-aware dropping.\nconst RR_FULL_SNAPSHOT = 2;\nconst RR_META = 4;\n\n/** Outcome of one network attempt — drives retry/split/drop decisions. */\ntype SendResult = 'ok' | 'too_large' | 'fatal' | 'retry';\n\ninterface SpillEntry {\n /** siteKey — so multi-site pages only resend their own batches. */\n k: string;\n /** base64 of the gzipped, fully-stamped IngestBatch (self-contained). */\n b: string;\n ts: number;\n}\n\nexport class Transport {\n private buffer: ObsrviqEvent[] = [];\n private seq: number;\n /** Floor set by an unload flush that consumed seqs out-of-band (beacon pieces),\n * so the normal path can never re-use one of them. */\n private seqFloor = 0;\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 // Recover anything a previous page's unload had to spill to localStorage.\n this.resendSpill();\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, shed DOM backlog without corrupting the delta stream.\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n void this.flush('backpressure');\n if (this.buffer.length >= MAX_BUFFER_EVENTS) this.shedDomBacklog();\n }\n }\n\n /** Drop buffered DOM events WITHOUT breaking rrweb's delta chain. Deltas only\n * apply on top of everything before them, so arbitrary dropping corrupts the\n * replay until the next 30s checkpoint. Instead: if the buffer holds a\n * FullSnapshot, drop only the DOM events BEFORE it (the snapshot re-anchors\n * everything after). Otherwise drop ALL buffered DOM and ask the recorder for\n * a fresh FullSnapshot so the stream re-anchors immediately. Non-DOM events\n * (console/network/errors/…) are independent and kept. */\n private shedDomBacklog() {\n let snapIdx = -1;\n for (let i = this.buffer.length - 1; i >= 0; i--) {\n const e = this.buffer[i];\n if (e?.type === 'dom' && (e.data as { type?: number } | undefined)?.type === RR_FULL_SNAPSHOT) {\n snapIdx = i;\n break;\n }\n }\n if (snapIdx > 0) {\n // Keep from the snapshot's preceding Meta (rrweb emits Meta → FullSnapshot).\n let keepFrom = snapIdx;\n const prev = this.buffer[snapIdx - 1];\n if (prev?.type === 'dom' && (prev.data as { type?: number } | undefined)?.type === RR_META) {\n keepFrom = snapIdx - 1;\n }\n const kept = this.buffer.filter((e, i) => e.type !== 'dom' || i >= keepFrom);\n if (kept.length < this.buffer.length) {\n this.buffer = kept;\n if (this.buffer.length < MAX_BUFFER_EVENTS) return;\n }\n }\n // No snapshot to anchor on (or one window alone overflows): drop all DOM and\n // re-anchor with a fresh snapshot.\n this.buffer = this.buffer.filter((e) => e.type !== 'dom');\n // Pathological non-DOM flood: shed oldest half so the buffer stays bounded.\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n this.buffer = this.buffer.slice(-Math.floor(MAX_BUFFER_EVENTS / 2));\n }\n this.opts.onDomDrop?.();\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 // Unload path is separate: it must run even mid-send (the in-flight fetch is\n // about to be killed by navigation) and can't await anything.\n if (reason === 'pagehide' || reason === 'hidden') return this.flushUnload();\n\n if (this.sending || this.buffer.length === 0) return true;\n\n // Hold non-unload sends until the per-site mask config has loaded, so a\n // remote-only custom key can't leak in the brief init fetch window. The fetch\n // is bounded (index.ts marks config ready within ~2s even on failure/timeout),\n // so this delays at most the first batch — it never blocks data indefinitely.\n // A stopped transport can't wait (there'll be no retry) — its final flush\n // proceeds best-effort with whatever keys have loaded, like the unload path.\n if (isMaskConfigPending() && !this.stopped) {\n setTimeout(() => void this.flush('timer'), 200);\n return true;\n }\n\n this.sending = true;\n const events = this.buffer;\n this.buffer = [];\n\n // Send-time safety net: mask sensitive keys across the batch — the built-in\n // list (password/token/secret/…) PLUS any customer-defined keys — so a\n // `{\"password\":\"…\"}` style body can't leave the page unmasked. Network/WS\n // bodies get PII-pattern masking at capture but not key-based masking, so this\n // is where key redaction lands for them; it also covers custom keys captured\n // before the per-site config arrived.\n redactBatchSensitiveKeys(events);\n\n let ok: boolean;\n try {\n ok = await this.sendEvents(events);\n } finally {\n this.sending = false;\n }\n // stop() during this send no-oped (sending guard) — drain what it left\n // behind, since no timer remains to pick it up. Only on success: a failure\n // just re-buffered, and retrying here would spin against a dead network.\n if (ok && this.stopped && this.buffer.length > 0) void this.flush('manual');\n return ok;\n }\n\n /** Send events as one or more seq-stamped batches: oversized batches split in\n * half (byte cap here, or a server 413), poison batches (other 4xx) are dropped\n * instead of retried forever, and transient failures re-buffer + back off. */\n private async sendEvents(events: ObsrviqEvent[]): Promise<boolean> {\n const queue: ObsrviqEvent[][] = [events];\n while (queue.length > 0) {\n const slice = queue[0]!;\n const result = await this.dispatch(slice);\n if (result === 'ok') {\n queue.shift();\n continue;\n }\n if (result === 'too_large' && slice.length > 1) {\n const mid = Math.ceil(slice.length / 2);\n queue.splice(0, 1, slice.slice(0, mid), slice.slice(mid));\n continue;\n }\n if (result === 'fatal' || result === 'too_large') {\n // Rejected outright (bad key / revoked site / single event over the cap):\n // retrying can never succeed — drop this slice, keep sending the rest.\n queue.shift();\n continue;\n }\n // Transient (network / 5xx / 429): re-buffer everything left, in original\n // order ahead of anything captured meanwhile, and retry with jitter.\n this.buffer = ([] as ObsrviqEvent[]).concat(...queue, this.buffer);\n if (this.buffer.length >= MAX_BUFFER_EVENTS) this.shedDomBacklog();\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 this.retryDelay = 1000;\n return true;\n }\n\n /** One batch → one network attempt. Owns seq assignment/advance. */\n private async dispatch(events: ObsrviqEvent[]): Promise<SendResult> {\n // Never re-use a seq an unload flush consumed out-of-band.\n if (this.seqFloor > this.seq) this.seq = this.seqFloor;\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) return 'ok'; // dropped intentionally\n\n const json = JSON.stringify(batch);\n // Byte cap: split BEFORE compressing/sending rather than bounce off the\n // server's body limit (a lost batch) — sendEvents halves it and retries.\n if (json.length > MAX_BATCH_JSON_BYTES && events.length > 1) return 'too_large';\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 gz = await gzipBytes(new TextEncoder().encode(json));\n const result = await this.send(gz);\n this.opts.onFlush?.({ bytes: gz.byteLength, events: events.length, ok: result === 'ok' });\n if (result === 'ok') this.seq = Math.max(this.seq + 1, this.seqFloor);\n return result;\n }\n\n private async send(bytes: Uint8Array): Promise<SendResult> {\n const url = `${this.opts.endpoint.replace(/\\/$/, '')}/v1/batch`;\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 re-buffers and retries instead of being silently dropped. A timeout\n // aborts a hung request so it can't stall all future flushes (`sending` stays\n // 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: bytes as unknown as BodyInit,\n headers: {\n 'content-type': 'application/octet-stream',\n 'x-obsrviq-key': this.opts.siteKey,\n },\n credentials: 'omit',\n mode: 'cors',\n signal: ctrl.signal,\n });\n if (res.ok) return 'ok';\n if (res.status === 413) return 'too_large';\n // 408 (timeout) and 429 (rate limit) are transient; other 4xx means the\n // server will never accept this batch — retrying just re-loses it later.\n if (res.status >= 400 && res.status < 500 && res.status !== 408 && res.status !== 429) return 'fatal';\n return 'retry';\n } catch {\n return 'retry';\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /** Unload flush (pagehide / tab hidden). Fully synchronous — the page may be\n * gone before any await resolves. Ignores the `sending` guard (that in-flight\n * fetch is about to be cancelled; its seq is skipped via seqFloor), chunks the\n * tail into beacon-sized pieces (sendBeacon caps bodies at ~64KB — one big\n * batch would be rejected whole), and spills anything the beacon queue refuses\n * to localStorage for the next page load to resend. */\n private flushUnload(): boolean {\n if (this.buffer.length === 0) return true;\n const events = this.buffer;\n this.buffer = [];\n // Best-effort masking: built-in + whatever custom keys have loaded by now\n // (an unload can't wait for the config fetch).\n redactBatchSensitiveKeys(events);\n\n // The in-flight batch (if any) holds this.seq — start past it; a prior\n // unload flush (hidden → pagehide) may have raised the floor further.\n let seq = Math.max(this.sending ? this.seq + 1 : this.seq, this.seqFloor);\n\n const pieces: Array<{ gz: Uint8Array; count: number }> = [];\n const stack: ObsrviqEvent[][] = [events];\n while (stack.length > 0) {\n const slice = stack.shift()!;\n let batch: IngestBatch | null = {\n siteKey: this.opts.siteKey,\n sessionId: this.opts.sessionId,\n seq,\n meta: this.opts.getMeta(),\n events: slice,\n };\n if (this.opts.beforeSend) {\n try {\n batch = this.opts.beforeSend(batch);\n } catch {\n batch = null;\n }\n }\n if (!batch) continue; // dropped intentionally\n const gz = gzipSync(new TextEncoder().encode(JSON.stringify(batch)));\n if (gz.byteLength > BEACON_PIECE_BYTES && slice.length > 1) {\n // Too big for a beacon — halve and re-stamp (the seq wasn't consumed).\n const mid = Math.ceil(slice.length / 2);\n stack.unshift(slice.slice(0, mid), slice.slice(mid));\n continue;\n }\n pieces.push({ gz, count: slice.length });\n seq++;\n }\n\n // Persist seq progress BEFORE handing bytes to the beacon queue, so a resumed\n // session can't collide with a piece that's still in flight after unload.\n this.seqFloor = seq;\n this.opts.onSeqDispatch?.(seq);\n\n for (const { gz, count } of pieces) {\n const sent = gz.byteLength <= BEACON_PIECE_BYTES && this.sendUnload(gz);\n if (!sent) this.spill(gz); // beacon queue full / single oversized event\n this.opts.onFlush?.({ bytes: gz.byteLength, events: count, ok: sent });\n }\n return true;\n }\n\n /** Fire-and-forget delivery that survives navigation. True = queued. */\n private sendUnload(bytes: Uint8Array): boolean {\n const url = `${this.opts.endpoint.replace(/\\/$/, '')}/v1/batch`;\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, {\n method: 'POST',\n body: bytes as unknown as BodyInit,\n headers: {\n 'content-type': 'application/octet-stream',\n 'x-obsrviq-key': this.opts.siteKey,\n },\n keepalive: true,\n credentials: 'omit',\n mode: 'cors',\n }).catch(() => {});\n return true;\n } catch {\n return false;\n }\n }\n\n /** Append one gzipped batch to the localStorage spill (bounded, oldest-first\n * eviction). Quota/private-mode failures mean the tail is lost — same as\n * before spilling existed. */\n private spill(gz: Uint8Array) {\n try {\n const raw = window.localStorage.getItem(SPILL_KEY);\n const entries: SpillEntry[] = raw ? (JSON.parse(raw) as SpillEntry[]) : [];\n entries.push({ k: this.opts.siteKey, b: b64encode(gz), ts: Date.now() });\n let total = entries.reduce((n, e) => n + e.b.length, 0);\n while (entries.length > 0 && total > SPILL_MAX_BYTES) {\n total -= entries[0]!.b.length;\n entries.shift();\n }\n window.localStorage.setItem(SPILL_KEY, JSON.stringify(entries));\n } catch {\n /* unavailable / quota — drop */\n }\n }\n\n /** Resend batches a previous page's unload spilled. Entries are claimed\n * (removed) up front so two tabs can't double-send; still-transient failures\n * are re-spilled for the next load. Fire-and-forget. */\n private resendSpill() {\n let mine: SpillEntry[] = [];\n try {\n const raw = window.localStorage.getItem(SPILL_KEY);\n if (!raw) return;\n const entries = JSON.parse(raw) as SpillEntry[];\n const now = Date.now();\n const fresh = entries.filter((e) => e && typeof e.b === 'string' && now - e.ts < SPILL_MAX_AGE_MS);\n mine = fresh.filter((e) => e.k === this.opts.siteKey);\n const others = fresh.filter((e) => e.k !== this.opts.siteKey);\n if (others.length > 0) window.localStorage.setItem(SPILL_KEY, JSON.stringify(others));\n else window.localStorage.removeItem(SPILL_KEY);\n } catch {\n return;\n }\n if (mine.length === 0) return;\n void (async () => {\n for (const entry of mine) {\n try {\n const result = await this.send(b64decode(entry.b));\n if (result === 'retry') this.spill(b64decode(entry.b)); // network still down\n // ok / fatal / too_large → done with it either way\n } catch {\n /* drop */\n }\n }\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\n/** gzip — browser-native async CompressionStream when available (keeps multi-MB\n * snapshot compression off the main thread), fflate's gzipSync otherwise. The\n * unload path always uses gzipSync directly (it can't await). */\nasync function gzipBytes(bytes: Uint8Array): Promise<Uint8Array> {\n if (typeof CompressionStream !== 'undefined') {\n try {\n const stream = new Blob([bytes as unknown as BlobPart])\n .stream()\n .pipeThrough(new CompressionStream('gzip'));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n } catch {\n /* fall back to sync */\n }\n }\n return gzipSync(bytes);\n}\n\nfunction b64encode(bytes: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(bin);\n}\n\nfunction b64decode(s: string): Uint8Array {\n const bin = atob(s);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\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 tz?: string;\n tzOffset?: number;\n} {\n const ua = navigator.userAgent;\n const viewport = { w: window.innerWidth, h: window.innerHeight };\n\n // The visitor's own timezone — so the player can show wall-clock times in their\n // local time, not just the viewer's. IANA name (DST-correct) plus a numeric\n // offset EAST of UTC as a fallback label. Both best-effort.\n let tz: string | undefined;\n let tzOffset: number | undefined;\n try {\n tz = Intl.DateTimeFormat().resolvedOptions().timeZone || undefined;\n tzOffset = -new Date().getTimezoneOffset();\n } catch {\n /* Intl unavailable — omit timezone */\n }\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, tz, tzOffset };\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 t = ctx.clock.fromPerf(performanceNow());\n // ONE CLOCK: rrweb stamps events with Date.now(), while everything else in\n // the session runs on the monotonic perf clock (`t`). Rewrite the rrweb\n // timestamp onto that same clock (startedAt + t) so an NTP step / manual\n // clock change mid-session can't desync replay from the console/network\n // lanes — the player only ever uses timestamp DELTAS, so this is safe.\n event.timestamp = ctx.clock.startedAt + t;\n const dom: DomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'dom',\n t,\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\n/** Force a fresh FullSnapshot checkpoint NOW. Used after transport backpressure\n * had to drop buffered DOM deltas — the new snapshot re-anchors the stream so\n * replay stays coherent instead of playing broken deltas until the next 30s\n * checkout. Safe no-op when recording isn't active. */\nexport function takeFullSnapshot(): void {\n try {\n record.takeFullSnapshot(true);\n } catch {\n /* not recording */\n }\n}\n\nfunction performanceNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n","import type { SerializedArg } from '@obsrviq/types';\nimport { maskString, isSensitiveKeyName } from './mask.js';\n\nconst DEFAULT_MAX_BYTES = 8 * 1024; // 8 KB string cap (§6.1)\nconst MAX_WALK_NODES = 2000; // deep-walk node-visit 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 // Pre-cut giant strings (2× slack) so masking never regex-scans a multi-MB arg.\n const s = arg as string;\n const cut = s.length > maxBytes * 2 ? s.slice(0, maxBytes * 2) : s;\n const masked = maskString(cut);\n const { value, truncated } = truncate(masked, maxBytes);\n return { kind: 'string', value, truncated: truncated || cut !== s };\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 // Budgets are enforced DURING the walk (node-visit count + ~2× the byte cap)\n // so a huge object never burns CPU/memory before the final truncate applies.\n const budget: WalkBudget = { nodes: MAX_WALK_NODES, bytes: maxBytes * 2, exhausted: false };\n const masked = maskValueBudgeted(arg, budget);\n let json: string | undefined;\n let truncated = budget.exhausted;\n try {\n const full = JSON.stringify(masked, safeReplacer());\n const cut = truncate(full ?? 'undefined', maxBytes);\n json = cut.value;\n truncated = truncated || cut.truncated;\n } catch {\n json = undefined;\n }\n return { kind: 'object', preview: previewOf(arg), json, truncated };\n }\n\n // undefined / fallback\n return { kind: 'primitive', value: String(arg) };\n}\n\ninterface WalkBudget {\n nodes: number; // node visits left\n bytes: number; // approximate serialized bytes left\n exhausted: boolean;\n}\n\n/** `maskValue` with hard budgets enforced DURING the walk — a node-visit cap and a\n * running approximate byte budget — so a huge arg (e.g. a multi-MB store) is never\n * fully cloned/stringified just to be truncated afterwards. When a budget runs out\n * we stop descending and substitute a '«truncated»' placeholder. Byte-identical to\n * the unbudgeted walk for args that fit the budget. */\nfunction maskValueBudgeted(value: unknown, budget: WalkBudget, depth = 0): unknown {\n if (budget.exhausted) return '«truncated»';\n if (depth > 6) return '«depth»';\n if (--budget.nodes <= 0) budget.exhausted = true;\n if (typeof value === 'string') {\n // Pre-cut giant strings so masking never regex-scans more than the budget.\n const cut = value.length > budget.bytes ? value.slice(0, Math.max(0, budget.bytes)) : value;\n if (cut !== value) budget.exhausted = true;\n const masked = maskString(cut);\n if ((budget.bytes -= masked.length + 2) <= 0) budget.exhausted = true;\n return masked;\n }\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n for (const v of value) {\n if (budget.exhausted) {\n out.push('«truncated»');\n break;\n }\n out.push(maskValueBudgeted(v, budget, depth + 1));\n }\n return out;\n }\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value)) {\n if (budget.exhausted) {\n out['…'] = '«truncated»';\n break;\n }\n if ((budget.bytes -= k.length + 4) <= 0) budget.exhausted = true;\n out[k] = isSensitiveKeyName(k)\n ? '«redacted»'\n : maskValueBudgeted((value as Record<string, unknown>)[k], budget, depth + 1);\n }\n return out;\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","// Shared token-bucket rate limiter for capture paths (network / WebSocket\n// event floods). Kept tiny on purpose — callers count their own drops.\n\nexport interface TokenBucket {\n /** Spend one token if available; false = the caller should drop the event. */\n take(): boolean;\n}\n\n/** A token bucket: refills at `rate` tokens/sec (sustained), holds at most\n * `burst` tokens (burst capacity). */\nexport function tokenBucket(rate: number, burst: number): TokenBucket {\n let tokens = burst;\n let last = Date.now();\n return {\n take() {\n const now = Date.now();\n tokens = Math.min(burst, tokens + ((now - last) / 1000) * rate);\n last = now;\n if (tokens < 1) return false;\n tokens -= 1;\n return true;\n },\n };\n}\n","import type { NetworkEvent, NetworkResourceType, NetworkTiming } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { maskString } from './mask.js';\nimport { tokenBucket } from './ratelimit.js';\nimport { uuid } from './util.js';\n\nconst BODY_CAP = 4 * 1024; // 4 KB body preview cap\nconst NET_RATE = 50; // sustained network events/sec per page\nconst NET_BURST = 100; // burst capacity\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 // Pre-cut giant bodies (2× slack) so masking never regex-scans a multi-MB string.\n const cut = text.length > BODY_CAP * 2 ? text.slice(0, BODY_CAP * 2) : text;\n const masked = maskString(cut);\n const truncated = cut !== text || masked.length > BODY_CAP;\n return {\n contentType,\n preview: truncated ? masked.slice(0, BODY_CAP) : masked,\n truncated,\n redacted: masked !== cut,\n };\n}\n\n/** Read at most `cap`+1 bytes of a Response body via its stream reader (then\n * cancel), so a multi-MB response is never fully buffered just to keep a 4 KB\n * preview. `overflow` = the body had more bytes than `cap`. Falls back to\n * text() where a stream reader isn't available (older fetch polyfills). */\nasync function readTextCapped(res: Response, cap: number): Promise<{ text: string; overflow: boolean }> {\n const body = res.body;\n if (!body || typeof body.getReader !== 'function') {\n return { text: await res.text(), overflow: false };\n }\n const reader = body.getReader();\n const decoder = new TextDecoder(); // Response.text() decodes UTF-8 — match it\n let text = '';\n let bytes = 0;\n let overflow = false;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done || !value) {\n text += decoder.decode(); // flush any trailing multi-byte sequence\n break;\n }\n const remaining = cap + 1 - bytes;\n if (value.byteLength >= remaining) {\n // Keep only up to cap+1 bytes total — the +1 detects truncation.\n text += decoder.decode(value.subarray(0, remaining), { stream: true });\n overflow = true;\n break;\n }\n text += decoder.decode(value, { stream: true });\n bytes += value.byteLength;\n }\n } finally {\n // Release the tee'd clone branch so it doesn't buffer the rest of the response.\n void reader.cancel().catch(() => {});\n }\n return { text, overflow };\n}\n\nfunction perfNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : 0;\n}\n\n/** Resource Timing `entry.name` is always absolute; requests may be issued with a\n * relative URL. Absolutize (query preserved) so the two can be matched. */\nfunction absUrl(raw: string): string {\n try {\n return new URL(raw, typeof location !== 'undefined' ? location.href : undefined).href;\n } catch {\n return raw;\n }\n}\n\n/** Extract the DNS/TCP/TLS/TTFB/Download breakdown from a matched Resource Timing\n * entry, layered onto the SDK-measured `base` (startT/endT/duration). Phases that\n * are zero — a reused keep-alive connection, or a cross-origin resource without a\n * `Timing-Allow-Origin` header (browser zeroes them for privacy) — are left\n * undefined so the player shows \"—\" rather than a misleading 0. */\nfunction phasesFrom(m: PerformanceResourceTiming, base: NetworkTiming): NetworkTiming {\n const t: NetworkTiming = { ...base };\n const r = (n: number) => Math.round(n);\n // Every phase is guarded on its START marker being > 0. A cross-origin resource\n // without `Timing-Allow-Origin` has its start markers (domainLookupStart,\n // connectStart, secureConnectionStart, requestStart, responseStart) zeroed by the\n // browser while responseEnd stays real — so a bare `end > start` check would\n // compute a garbage phase (e.g. download = responseEnd − 0). Requiring start > 0\n // omits those phases instead.\n if (m.domainLookupStart > 0 && m.domainLookupEnd > m.domainLookupStart)\n t.dns = r(m.domainLookupEnd - m.domainLookupStart);\n if (m.connectStart > 0 && m.connectEnd > m.connectStart) t.tcp = r(m.connectEnd - m.connectStart);\n if (m.secureConnectionStart > 0 && m.connectEnd > m.secureConnectionStart)\n t.tls = r(m.connectEnd - m.secureConnectionStart);\n if (m.requestStart > 0 && m.responseStart > m.requestStart)\n t.ttfb = r(m.responseStart - m.requestStart);\n if (m.responseStart > 0 && m.responseEnd > m.responseStart)\n t.download = r(m.responseEnd - m.responseStart);\n return t;\n}\n\n/** Pick the Resource Timing entry that best corresponds to a request that started\n * at `perfStart` (performance-timeline ms): same URL, started at ~the same time.\n * Guards against mis-attributing timing when the same URL is hit repeatedly. */\nfunction matchEntry(\n name: string,\n perfStart: number,\n entries: PerformanceResourceTiming[],\n): PerformanceResourceTiming | undefined {\n let best: PerformanceResourceTiming | undefined;\n let bestDelta = Infinity;\n for (const e of entries) {\n if (e.name !== name) continue;\n if (e.startTime < perfStart - 4) continue; // started before our request → not ours\n const d = e.startTime - perfStart;\n if (d < bestDelta) {\n bestDelta = d;\n best = e;\n }\n }\n return best;\n}\n\ninterface PendingTiming {\n name: string; // absolute URL, to match against PerformanceResourceTiming.name\n perfStart: number;\n base: NetworkTiming;\n resolve: (t: NetworkTiming) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/** How long to wait for a Resource Timing entry to be published before giving up\n * and emitting with duration-only timing. The browser adds the entry to the\n * performance buffer *slightly after* fetch/XHR completion, so a synchronous\n * lookup at completion almost always misses it — hence this short async wait. */\nconst TIMING_WAIT_MS = 300;\n\ninterface TimingResolver {\n resolve(rawUrl: string, perfStart: number, base: NetworkTiming): Promise<NetworkTiming>;\n flushPending(): void;\n teardown(): void;\n}\n\n/** Resolves the phase breakdown for a fetch/XHR asynchronously. A single shared\n * PerformanceObserver watches for resource entries as they land and settles the\n * matching pending request; unmatched requests settle on a short timeout. */\nfunction createTimingResolver(): TimingResolver {\n const pending: PendingTiming[] = [];\n let obs: PerformanceObserver | undefined;\n\n const stopObs = () => {\n if (obs) {\n try {\n obs.disconnect();\n } catch {\n /* ignore */\n }\n obs = undefined;\n }\n };\n\n const settle = (p: PendingTiming, t: NetworkTiming) => {\n const i = pending.indexOf(p);\n if (i === -1) return; // already settled\n pending.splice(i, 1);\n clearTimeout(p.timer);\n p.resolve(t);\n if (pending.length === 0) stopObs();\n };\n\n const consume = (entries: PerformanceEntryList) => {\n for (const e of entries as PerformanceResourceTiming[]) {\n let best: PendingTiming | undefined;\n let bestDelta = Infinity;\n for (const p of pending) {\n if (e.name !== p.name || e.startTime < p.perfStart - 4) continue;\n const d = e.startTime - p.perfStart;\n if (d < bestDelta) {\n bestDelta = d;\n best = p;\n }\n }\n if (best) settle(best, phasesFrom(e, best.base));\n }\n };\n\n const ensureObserver = () => {\n if (obs || typeof PerformanceObserver === 'undefined') return;\n try {\n obs = new PerformanceObserver((list) => consume(list.getEntries()));\n obs.observe({ type: 'resource', buffered: false });\n } catch {\n obs = undefined;\n }\n };\n\n return {\n resolve(rawUrl, perfStart, base) {\n if (typeof performance === 'undefined') return Promise.resolve(base);\n const name = absUrl(rawUrl);\n // Fast path: the entry may already be buffered (cached / same-tick resources).\n try {\n const now = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n const immediate = matchEntry(name, perfStart, now);\n if (immediate) return Promise.resolve(phasesFrom(immediate, base));\n } catch {\n /* ignore */\n }\n if (typeof PerformanceObserver === 'undefined') return Promise.resolve(base);\n // Slow path: wait for the entry to be published (or time out).\n return new Promise<NetworkTiming>((resolve) => {\n const p: PendingTiming = {\n name,\n perfStart,\n base,\n resolve,\n timer: setTimeout(() => settle(p, base), TIMING_WAIT_MS),\n };\n pending.push(p);\n ensureObserver();\n });\n },\n // Force-settle everything still in flight (with duration-only timing) so their\n // events are emitted into the transport buffer before an unload beacon fires.\n flushPending() {\n for (const p of [...pending]) settle(p, p.base);\n },\n teardown() {\n this.flushPending();\n stopObs();\n },\n };\n}\n\n/** A rate-gated NetworkEvent emitter shared by all capture paths on the page. */\ntype EmitNet = (ev: NetworkEvent) => void;\n\nexport function instrumentNetwork(ctx: InstrumentCtx): Teardown {\n const timing = createTimingResolver();\n // Per-page event throttle — a polling loop / request storm must not flood the\n // buffer. Dropped events are counted and reported on the next captured one.\n const bucket = tokenBucket(NET_RATE, NET_BURST);\n let dropped = 0;\n const emitNet: EmitNet = (ev) => {\n if (!bucket.take()) {\n dropped++;\n return;\n }\n if (dropped > 0) {\n ev.droppedEvents = dropped;\n dropped = 0;\n }\n ctx.emit(ev);\n };\n // On page hide, settle any request whose Resource Timing hasn't arrived yet so\n // its event lands in the transport buffer before the unload flush.\n const onPageHide = () => timing.flushPending();\n const onVisibility = () => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') timing.flushPending();\n };\n if (typeof window !== 'undefined') window.addEventListener('pagehide', onPageHide);\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibility);\n\n const teardowns: Teardown[] = [];\n teardowns.push(wrapFetch(ctx, timing, emitNet));\n teardowns.push(wrapXhr(ctx, timing, emitNet));\n teardowns.push(wrapBeacon(ctx, emitNet));\n teardowns.push(observeResources(ctx, emitNet));\n teardowns.push(() => {\n if (typeof window !== 'undefined') window.removeEventListener('pagehide', onPageHide);\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibility);\n timing.teardown();\n });\n return () => teardowns.forEach((t) => t());\n}\n\n// ───────────────────────────── fetch ────────────────────────────────\nfunction wrapFetch(ctx: InstrumentCtx, tr: TimingResolver, emitNet: EmitNet): 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') || rawUrl.includes('/v1/config'))\n return orig.call(window, input as RequestInfo, init);\n const startT = ctx.clock.now();\n const perfStart = perfNow();\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 base: NetworkTiming = { startT, endT, duration: endT - startT };\n ctx.markActivity();\n // Resolve the phase breakdown asynchronously — the Resource Timing entry is\n // published just after completion, so a synchronous read would miss it.\n void tr.resolve(rawUrl, perfStart, base).then((timing) => {\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 emitNet(ev);\n });\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 // Stream-read the clone up to the preview cap — never buffer a huge body.\n const { text, overflow } = await readTextCapped(res.clone(), BODY_CAP);\n responseBody = bodyPreview(text, res.headers.get('content-type') || undefined);\n if (responseBody && overflow) responseBody.truncated = true;\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 perfStart: number;\n reqHeaders: Record<string, string>;\n body?: string;\n}\n\nfunction wrapXhr(ctx: InstrumentCtx, tr: TimingResolver, emitNet: EmitNet): 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 perfStart: 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 meta.perfStart = perfNow();\n if (ctx.config.captureNetworkBodies) meta.body = stringifyBody(body);\n const finish = (error?: string) => {\n const endT = ctx.clock.now();\n const base: NetworkTiming = {\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 responseSize = safeLen(this);\n ctx.markActivity();\n // Resolve the phase breakdown asynchronously (see wrapFetch).\n void tr.resolve(meta.rawUrl, meta.perfStart, base).then((timing) => {\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,\n requestBody: ctx.config.captureNetworkBodies ? bodyPreview(meta.body, undefined) : undefined,\n responseBody,\n timing,\n error: error || classifyHttp(status),\n };\n emitNet(ev);\n });\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, emitNet: EmitNet): 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 emitNet(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, emitNet: EmitNet): 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 emitNet(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 { WsEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { maskString } from './mask.js';\nimport { tokenBucket } from './ratelimit.js';\nimport { uuid } from './util.js';\n\nconst FRAME_CAP = 4 * 1024; // 4 KB text-frame preview cap (mirrors network bodies)\nconst MSG_RATE = 20; // sustained message-frame events/sec per socket\nconst MSG_BURST = 40; // burst capacity\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 byteLen(s: string): number {\n try {\n return new TextEncoder().encode(s).length;\n } catch {\n return s.length;\n }\n}\n\ntype FrameInfo = Pick<WsEvent, 'encoding' | 'size' | 'body'>;\n\n/** Derive encoding + byte size (+ opt-in masked preview) from a frame payload.\n * Never reads binary payload bytes — only their length. */\nfunction frameInfo(data: unknown, capture: boolean): FrameInfo {\n if (typeof data === 'string') {\n const info: FrameInfo = { encoding: 'text', size: byteLen(data) };\n if (capture) {\n // Pre-cut giant frames (2× slack) so masking never regex-scans a multi-MB payload.\n const cut = data.length > FRAME_CAP * 2 ? data.slice(0, FRAME_CAP * 2) : data;\n const masked = maskString(cut);\n const truncated = cut !== data || masked.length > FRAME_CAP;\n info.body = {\n preview: truncated ? masked.slice(0, FRAME_CAP) : masked,\n truncated,\n redacted: masked !== cut,\n };\n }\n return info;\n }\n let size = 0;\n if (typeof Blob !== 'undefined' && data instanceof Blob) size = data.size;\n else if (data instanceof ArrayBuffer) size = data.byteLength;\n else if (ArrayBuffer.isView(data)) size = (data as ArrayBufferView).byteLength;\n return { encoding: 'binary', size };\n}\n\n/** Wrap the WebSocket constructor to capture connection lifecycle + frames.\n * Best-effort: never throws into the app; a capture failure never breaks send/recv. */\nexport function instrumentWebSocket(ctx: InstrumentCtx): Teardown {\n const Orig = typeof window !== 'undefined' ? window.WebSocket : undefined;\n if (!Orig) return () => {};\n\n const emit = (partial: Omit<WsEvent, 'id' | 'sessionId' | 'type' | 't' | 'ts'>) => {\n try {\n const ev: WsEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'ws',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n ...partial,\n };\n ctx.emit(ev);\n } catch {\n /* swallow — capture must never affect the socket */\n }\n };\n\n class WrappedWebSocket extends Orig {\n constructor(url: string | URL, protocols?: string | string[]) {\n super(url as string, protocols as string | string[] | undefined);\n // The real socket is already live; capture setup must never throw into the app.\n try {\n const connId = uuid();\n const redUrl = redactUrl(String(url));\n const protos = protocols ? (Array.isArray(protocols) ? protocols : [protocols]) : undefined;\n const capture = ctx.config.captureNetworkBodies;\n\n // Per-socket frame throttle — a chatty socket (100s of msg/s) must not\n // flood the buffer. Dropped frames are counted and reported on the next\n // captured frame (or the close event). Lifecycle events (open/close/error)\n // are never throttled.\n const bucket = tokenBucket(MSG_RATE, MSG_BURST);\n let droppedFrames = 0;\n const emitFrame = (dir: 'send' | 'recv', data: unknown) => {\n ctx.markActivity(); // dropped frames still count as app activity\n if (!bucket.take()) {\n droppedFrames++;\n return;\n }\n const info = frameInfo(data, capture);\n const dropped = droppedFrames;\n droppedFrames = 0;\n emit({ connId, url: redUrl, kind: 'message', dir, ...info, droppedFrames: dropped || undefined });\n };\n\n this.addEventListener('open', () => emit({ connId, url: redUrl, kind: 'open', protocols: protos }));\n this.addEventListener('close', (e) =>\n emit({\n connId,\n url: redUrl,\n kind: 'close',\n code: e.code,\n reason: e.reason || undefined,\n wasClean: e.wasClean,\n droppedFrames: droppedFrames || undefined,\n }),\n );\n this.addEventListener('error', () => emit({ connId, url: redUrl, kind: 'error' }));\n this.addEventListener('message', (e: MessageEvent) => emitFrame('recv', e.data));\n\n // Capture outgoing frames by shadowing send() on this instance. Call the\n // real send FIRST — if it throws (e.g. send() while CONNECTING) the error\n // propagates to the app and no phantom \"send\" frame is recorded.\n const origSend = super.send.bind(this);\n this.send = (data: string | ArrayBufferLike | Blob | ArrayBufferView) => {\n origSend(data);\n try {\n emitFrame('send', data);\n } catch {\n /* ignore capture errors */\n }\n };\n } catch {\n /* capture setup failed — the real socket still works normally. */\n }\n }\n }\n\n window.WebSocket = WrappedWebSocket as unknown as typeof WebSocket;\n return () => {\n window.WebSocket = Orig;\n };\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, takeFullSnapshot } from './recorder.js';\nimport { instrumentConsole } from './console.js';\nimport { instrumentNetwork } from './network.js';\nimport { instrumentWebSocket } from './websocket.js';\nimport { setCustomMaskKeys, markMaskConfigReady } from './mask.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 // Custom masking keys: apply any static ones NOW, then fetch the per-site list\n // (GET /v1/config) and merge. Fired before the network instrumenter is installed\n // so this request is never self-recorded; the transport also re-masks custom\n // keys at send time so nothing captured before the fetch resolves can leak.\n const staticMaskKeys = Array.isArray(config.maskKeys) ? config.maskKeys : [];\n setCustomMaskKeys(staticMaskKeys);\n void this.loadRemoteMaskKeys(staticMaskKeys);\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 /** Fetch the per-site masking config (GET /v1/config) and merge its keys with any\n * static ones. Best-effort: on failure the built-in masking still applies. */\n private async loadRemoteMaskKeys(staticKeys: string[]): Promise<void> {\n const cfg = this.config;\n if (!cfg || typeof fetch === 'undefined') {\n markMaskConfigReady();\n return;\n }\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), 2000);\n try {\n const url = `${cfg.endpoint.replace(/\\/$/, '')}/v1/config?key=${encodeURIComponent(cfg.siteKey)}`;\n const res = await fetch(url, { credentials: 'omit', mode: 'cors', signal: ctrl.signal });\n if (res.ok) {\n const data = (await res.json()) as { maskKeys?: unknown };\n const remote = Array.isArray(data.maskKeys)\n ? data.maskKeys.filter((k): k is string => typeof k === 'string')\n : [];\n setCustomMaskKeys([...staticKeys, ...remote]);\n }\n } finally {\n clearTimeout(timer);\n }\n } catch {\n /* offline / blocked / timeout / bad JSON — built-in masking still protects. */\n } finally {\n // Always release the transport's hold — a failed/slow fetch must never block\n // sending forever (built-in + static-key masking still applies).\n markMaskConfigReady();\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 // Backpressure dropped DOM deltas → re-anchor the rrweb stream immediately\n // so replay stays coherent (a delta stream with a hole is corrupt until\n // the next 30s checkout).\n onDomDrop: () => takeFullSnapshot(),\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(instrumentWebSocket(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"]}
|
|
1
|
+
{"version":3,"sources":["../src/mask.ts","../src/transport.ts","../src/util.ts","../src/recorder.ts","../src/serialize.ts","../src/console.ts","../src/ratelimit.ts","../src/trace.ts","../src/network.ts","../src/websocket.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":["out","rate","h","tr","redactUrl","byteLen"],"mappings":"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","file":"index.js","sourcesContent":["// 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\nimport type { ObsrviqEvent } from '@obsrviq/types';\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. Two tiers so we\n// catch real secrets without over-redacting innocent fields:\n// STRONG — long/unambiguous tokens, safe to match as a substring of the key\n// name (e.g. \"accessToken\", \"x-api-key\", \"clientSecret\").\n// WEAK — short/ambiguous tokens that we only honour when they stand alone as\n// a key SEGMENT, so \"shipping\"(pin) / \"discard\"(card) / \"author\"(auth)\n// aren't caught but \"pin\" / \"cardNumber\" / \"authToken\" are.\nconst SENSITIVE_STRONG =\n /(password|passwd|passphrase|secret|token|authoriz|apikey|api[_-]key|creditcard|cardnumber|cardholder|cookie|cvv|cvc)/i;\nconst SENSITIVE_WEAK = new Set(['pass', 'pwd', 'auth', 'card', 'pin', 'otp', 'ssn', 'cvv', 'cvc']);\n\n/** Split a key name into lowercase word segments on delimiters AND camelCase\n * boundaries: \"accessToken\" → [access, token], \"api_key\" → [api, key]. */\nfunction keySegments(key: string): string[] {\n return key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((s) => s.toLowerCase());\n}\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\n// Customer-defined keys to mask (case-insensitive exact match), delivered via the\n// per-site config (GET /v1/config) and/or the init `maskKeys` option. Additive to\n// the built-in list above — you can only add protections, never remove them.\nlet customKeys = new Set<string>();\nexport function setCustomMaskKeys(keys: string[]): void {\n customKeys = new Set(keys.map((k) => String(k).trim().toLowerCase()).filter(Boolean));\n}\n\n// Whether the per-site mask config (GET /v1/config) has settled. Until it does,\n// remote-only custom keys aren't known yet, so the transport holds non-unload\n// sends (below) to avoid leaking a custom-keyed value in the brief init window.\nlet maskConfigSettled = false;\nexport function markMaskConfigReady(): void {\n maskConfigSettled = true;\n}\nexport function isMaskConfigPending(): boolean {\n return !maskConfigSettled;\n}\nexport function hasCustomMaskKeys(): boolean {\n return customKeys.size > 0;\n}\nfunction isCustomKey(key: string): boolean {\n return customKeys.has(key.toLowerCase());\n}\n\n/** Key-based sensitivity test: built-in STRONG/WEAK tiers PLUS any customer-\n * configured keys (exact, case-insensitive). Boundary-aware so innocent fields\n * like \"shipping\" / \"discard\" / \"author\" aren't redacted. */\nexport function isSensitiveKeyName(key: string): boolean {\n if (isCustomKey(key)) return true;\n if (SENSITIVE_STRONG.test(key)) return true;\n return keySegments(key).some((seg) => SENSITIVE_WEAK.has(seg));\n}\n\n/** Redact sensitive-key values in a parsed object (built-in list + custom keys).\n * The send-time safety net that guarantees a `{\"password\": \"…\"}` style body can\n * never leave the page unmasked, even for non-DOM network/WS payloads (whose\n * capture-time masking is PII-pattern only, not key-aware). */\nfunction redactSensitiveInValue(value: unknown, depth = 0): unknown {\n if (depth > 24 || value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map((v) => redactSensitiveInValue(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] = isSensitiveKeyName(k) ? '«redacted»' : redactSensitiveInValue(v, depth + 1);\n }\n return out;\n}\n\n/** String-level key redaction for payloads that don't parse as JSON — non-JSON\n * bodies (form-urlencoded / query strings) AND truncated JSON, where the\n * structured path bails. Captures each `\"key\": value` (JSON-ish, tolerant of a\n * cut-off tail) and `key=value` (form / query) key name and redacts the value\n * when the key is sensitive. */\nfunction redactSensitiveInRawText(text: string): string {\n let out = text.replace(\n /\"([A-Za-z0-9_.\\-]+)\"\\s*:\\s*(\"(?:[^\"\\\\]|\\\\.)*\"|[^,}\\]\\s]+)/g,\n (m, key: string) => (isSensitiveKeyName(key) ? '\"' + key + '\": \"«redacted»\"' : m),\n );\n out = out.replace(\n /(^|[?&])([A-Za-z0-9_.\\-[\\]]+)=([^&\\s]*)/g,\n (m, pre: string, key: string) => (isSensitiveKeyName(key) ? pre + key + '=«redacted»' : m),\n );\n return out;\n}\n\n/** Redact sensitive-key values in a stored body/arg string. Tries structured\n * JSON first; falls back to a string scan for non-JSON or truncated payloads so a\n * sensitive key can't slip through in `email=a&password=b` or a cut-off body. */\nfunction redactSensitiveInText(text: string | undefined): string | undefined {\n if (!text) return text;\n const trimmed = text.trim();\n if (trimmed[0] === '{' || trimmed[0] === '[') {\n try {\n return JSON.stringify(redactSensitiveInValue(JSON.parse(trimmed)));\n } catch {\n /* truncated / invalid JSON — fall through to the string scan */\n }\n }\n return redactSensitiveInRawText(text);\n}\n\n/** Send-time pass: mask sensitive keys (built-in list + custom keys) across a\n * batch's bodies / frames / console args / custom props (mutates in place).\n * Always runs — the built-in list applies with no per-site config needed. */\nexport function redactBatchSensitiveKeys(events: ObsrviqEvent[]): void {\n for (const e of events) {\n if (e.type === 'network' || e.type === 'ws') {\n const anyE = e as unknown as {\n requestBody?: { preview?: string };\n responseBody?: { preview?: string };\n body?: { preview?: string };\n };\n if (anyE.requestBody?.preview) anyE.requestBody.preview = redactSensitiveInText(anyE.requestBody.preview);\n if (anyE.responseBody?.preview) anyE.responseBody.preview = redactSensitiveInText(anyE.responseBody.preview);\n if (anyE.body?.preview) anyE.body.preview = redactSensitiveInText(anyE.body.preview);\n } else if (e.type === 'custom') {\n const c = e as unknown as { props?: Record<string, unknown> };\n if (c.props) c.props = redactSensitiveInValue(c.props) as Record<string, unknown>;\n } else if (e.type === 'console') {\n const args = (e as unknown as { args?: Array<{ kind: string; json?: string }> }).args;\n if (args) for (const a of args) if (a.kind === 'object' && a.json) a.json = redactSensitiveInText(a.json);\n }\n }\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] = isSensitiveKeyName(k) ? '«redacted»' : maskValue(v, depth + 1);\n }\n return out;\n}\n","import { gzipSync } from 'fflate';\nimport type { IngestBatch, IngestSessionMeta, ObsrviqEvent } from '@obsrviq/types';\nimport { redactBatchSensitiveKeys, isMaskConfigPending } from './mask.js';\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 /** Called after backpressure had to drop buffered DOM deltas — the host should\n * force a fresh rrweb FullSnapshot so the replay stream re-anchors instead of\n * playing corrupt deltas until the next scheduled checkpoint. */\n onDomDrop?: () => 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/** Split batches whose JSON exceeds this before sending — well under the ingest\n * body cap (16MB gzip) even at gzip-hostile content, and keeps main-thread\n * stringify/compress work per flush bounded. */\nconst MAX_BATCH_JSON_BYTES = 4 * 1024 * 1024;\n/** Target gzip size per unload piece — sendBeacon/keepalive cap in-flight bodies\n * at ~64KB, so pieces are kept comfortably under it. */\nconst BEACON_PIECE_BYTES = 56 * 1024;\n/** localStorage spill of batches an unload couldn't beacon out (queue full /\n * oversized). Resent by the next page load. Bounded so we respect the ~5MB\n * origin quota shared with the app. */\nconst SPILL_KEY = 'obsrviq.spill';\nconst SPILL_MAX_BYTES = 1_500_000;\nconst SPILL_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\n// rrweb event types we need to recognise for snapshot-aware dropping.\nconst RR_FULL_SNAPSHOT = 2;\nconst RR_META = 4;\n\n/** Outcome of one network attempt — drives retry/split/drop decisions. */\ntype SendResult = 'ok' | 'too_large' | 'fatal' | 'retry';\n\ninterface SpillEntry {\n /** siteKey — so multi-site pages only resend their own batches. */\n k: string;\n /** base64 of the gzipped, fully-stamped IngestBatch (self-contained). */\n b: string;\n ts: number;\n}\n\nexport class Transport {\n private buffer: ObsrviqEvent[] = [];\n private seq: number;\n /** Floor set by an unload flush that consumed seqs out-of-band (beacon pieces),\n * so the normal path can never re-use one of them. */\n private seqFloor = 0;\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 // Recover anything a previous page's unload had to spill to localStorage.\n this.resendSpill();\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, shed DOM backlog without corrupting the delta stream.\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n void this.flush('backpressure');\n if (this.buffer.length >= MAX_BUFFER_EVENTS) this.shedDomBacklog();\n }\n }\n\n /** Drop buffered DOM events WITHOUT breaking rrweb's delta chain. Deltas only\n * apply on top of everything before them, so arbitrary dropping corrupts the\n * replay until the next 30s checkpoint. Instead: if the buffer holds a\n * FullSnapshot, drop only the DOM events BEFORE it (the snapshot re-anchors\n * everything after). Otherwise drop ALL buffered DOM and ask the recorder for\n * a fresh FullSnapshot so the stream re-anchors immediately. Non-DOM events\n * (console/network/errors/…) are independent and kept. */\n private shedDomBacklog() {\n let snapIdx = -1;\n for (let i = this.buffer.length - 1; i >= 0; i--) {\n const e = this.buffer[i];\n if (e?.type === 'dom' && (e.data as { type?: number } | undefined)?.type === RR_FULL_SNAPSHOT) {\n snapIdx = i;\n break;\n }\n }\n if (snapIdx > 0) {\n // Keep from the snapshot's preceding Meta (rrweb emits Meta → FullSnapshot).\n let keepFrom = snapIdx;\n const prev = this.buffer[snapIdx - 1];\n if (prev?.type === 'dom' && (prev.data as { type?: number } | undefined)?.type === RR_META) {\n keepFrom = snapIdx - 1;\n }\n const kept = this.buffer.filter((e, i) => e.type !== 'dom' || i >= keepFrom);\n if (kept.length < this.buffer.length) {\n this.buffer = kept;\n if (this.buffer.length < MAX_BUFFER_EVENTS) return;\n }\n }\n // No snapshot to anchor on (or one window alone overflows): drop all DOM and\n // re-anchor with a fresh snapshot.\n this.buffer = this.buffer.filter((e) => e.type !== 'dom');\n // Pathological non-DOM flood: shed oldest half so the buffer stays bounded.\n if (this.buffer.length >= MAX_BUFFER_EVENTS) {\n this.buffer = this.buffer.slice(-Math.floor(MAX_BUFFER_EVENTS / 2));\n }\n this.opts.onDomDrop?.();\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 // Unload path is separate: it must run even mid-send (the in-flight fetch is\n // about to be killed by navigation) and can't await anything.\n if (reason === 'pagehide' || reason === 'hidden') return this.flushUnload();\n\n if (this.sending || this.buffer.length === 0) return true;\n\n // Hold non-unload sends until the per-site mask config has loaded, so a\n // remote-only custom key can't leak in the brief init fetch window. The fetch\n // is bounded (index.ts marks config ready within ~2s even on failure/timeout),\n // so this delays at most the first batch — it never blocks data indefinitely.\n // A stopped transport can't wait (there'll be no retry) — its final flush\n // proceeds best-effort with whatever keys have loaded, like the unload path.\n if (isMaskConfigPending() && !this.stopped) {\n setTimeout(() => void this.flush('timer'), 200);\n return true;\n }\n\n this.sending = true;\n const events = this.buffer;\n this.buffer = [];\n\n // Send-time safety net: mask sensitive keys across the batch — the built-in\n // list (password/token/secret/…) PLUS any customer-defined keys — so a\n // `{\"password\":\"…\"}` style body can't leave the page unmasked. Network/WS\n // bodies get PII-pattern masking at capture but not key-based masking, so this\n // is where key redaction lands for them; it also covers custom keys captured\n // before the per-site config arrived.\n redactBatchSensitiveKeys(events);\n\n let ok: boolean;\n try {\n ok = await this.sendEvents(events);\n } finally {\n this.sending = false;\n }\n // stop() during this send no-oped (sending guard) — drain what it left\n // behind, since no timer remains to pick it up. Only on success: a failure\n // just re-buffered, and retrying here would spin against a dead network.\n if (ok && this.stopped && this.buffer.length > 0) void this.flush('manual');\n return ok;\n }\n\n /** Send events as one or more seq-stamped batches: oversized batches split in\n * half (byte cap here, or a server 413), poison batches (other 4xx) are dropped\n * instead of retried forever, and transient failures re-buffer + back off. */\n private async sendEvents(events: ObsrviqEvent[]): Promise<boolean> {\n const queue: ObsrviqEvent[][] = [events];\n while (queue.length > 0) {\n const slice = queue[0]!;\n const result = await this.dispatch(slice);\n if (result === 'ok') {\n queue.shift();\n continue;\n }\n if (result === 'too_large' && slice.length > 1) {\n const mid = Math.ceil(slice.length / 2);\n queue.splice(0, 1, slice.slice(0, mid), slice.slice(mid));\n continue;\n }\n if (result === 'fatal' || result === 'too_large') {\n // Rejected outright (bad key / revoked site / single event over the cap):\n // retrying can never succeed — drop this slice, keep sending the rest.\n queue.shift();\n continue;\n }\n // Transient (network / 5xx / 429): re-buffer everything left, in original\n // order ahead of anything captured meanwhile, and retry with jitter.\n this.buffer = ([] as ObsrviqEvent[]).concat(...queue, this.buffer);\n if (this.buffer.length >= MAX_BUFFER_EVENTS) this.shedDomBacklog();\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 this.retryDelay = 1000;\n return true;\n }\n\n /** One batch → one network attempt. Owns seq assignment/advance. */\n private async dispatch(events: ObsrviqEvent[]): Promise<SendResult> {\n // Never re-use a seq an unload flush consumed out-of-band.\n if (this.seqFloor > this.seq) this.seq = this.seqFloor;\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) return 'ok'; // dropped intentionally\n\n const json = JSON.stringify(batch);\n // Byte cap: split BEFORE compressing/sending rather than bounce off the\n // server's body limit (a lost batch) — sendEvents halves it and retries.\n if (json.length > MAX_BATCH_JSON_BYTES && events.length > 1) return 'too_large';\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 gz = await gzipBytes(new TextEncoder().encode(json));\n const result = await this.send(gz);\n this.opts.onFlush?.({ bytes: gz.byteLength, events: events.length, ok: result === 'ok' });\n if (result === 'ok') this.seq = Math.max(this.seq + 1, this.seqFloor);\n return result;\n }\n\n private async send(bytes: Uint8Array): Promise<SendResult> {\n const url = `${this.opts.endpoint.replace(/\\/$/, '')}/v1/batch`;\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 re-buffers and retries instead of being silently dropped. A timeout\n // aborts a hung request so it can't stall all future flushes (`sending` stays\n // 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: bytes as unknown as BodyInit,\n headers: {\n 'content-type': 'application/octet-stream',\n 'x-obsrviq-key': this.opts.siteKey,\n },\n credentials: 'omit',\n mode: 'cors',\n signal: ctrl.signal,\n });\n if (res.ok) return 'ok';\n if (res.status === 413) return 'too_large';\n // 408 (timeout) and 429 (rate limit) are transient; other 4xx means the\n // server will never accept this batch — retrying just re-loses it later.\n if (res.status >= 400 && res.status < 500 && res.status !== 408 && res.status !== 429) return 'fatal';\n return 'retry';\n } catch {\n return 'retry';\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /** Unload flush (pagehide / tab hidden). Fully synchronous — the page may be\n * gone before any await resolves. Ignores the `sending` guard (that in-flight\n * fetch is about to be cancelled; its seq is skipped via seqFloor), chunks the\n * tail into beacon-sized pieces (sendBeacon caps bodies at ~64KB — one big\n * batch would be rejected whole), and spills anything the beacon queue refuses\n * to localStorage for the next page load to resend. */\n private flushUnload(): boolean {\n if (this.buffer.length === 0) return true;\n const events = this.buffer;\n this.buffer = [];\n // Best-effort masking: built-in + whatever custom keys have loaded by now\n // (an unload can't wait for the config fetch).\n redactBatchSensitiveKeys(events);\n\n // The in-flight batch (if any) holds this.seq — start past it; a prior\n // unload flush (hidden → pagehide) may have raised the floor further.\n let seq = Math.max(this.sending ? this.seq + 1 : this.seq, this.seqFloor);\n\n const pieces: Array<{ gz: Uint8Array; count: number }> = [];\n const stack: ObsrviqEvent[][] = [events];\n while (stack.length > 0) {\n const slice = stack.shift()!;\n let batch: IngestBatch | null = {\n siteKey: this.opts.siteKey,\n sessionId: this.opts.sessionId,\n seq,\n meta: this.opts.getMeta(),\n events: slice,\n };\n if (this.opts.beforeSend) {\n try {\n batch = this.opts.beforeSend(batch);\n } catch {\n batch = null;\n }\n }\n if (!batch) continue; // dropped intentionally\n const gz = gzipSync(new TextEncoder().encode(JSON.stringify(batch)));\n if (gz.byteLength > BEACON_PIECE_BYTES && slice.length > 1) {\n // Too big for a beacon — halve and re-stamp (the seq wasn't consumed).\n const mid = Math.ceil(slice.length / 2);\n stack.unshift(slice.slice(0, mid), slice.slice(mid));\n continue;\n }\n pieces.push({ gz, count: slice.length });\n seq++;\n }\n\n // Persist seq progress BEFORE handing bytes to the beacon queue, so a resumed\n // session can't collide with a piece that's still in flight after unload.\n this.seqFloor = seq;\n this.opts.onSeqDispatch?.(seq);\n\n for (const { gz, count } of pieces) {\n const sent = gz.byteLength <= BEACON_PIECE_BYTES && this.sendUnload(gz);\n if (!sent) this.spill(gz); // beacon queue full / single oversized event\n this.opts.onFlush?.({ bytes: gz.byteLength, events: count, ok: sent });\n }\n return true;\n }\n\n /** Fire-and-forget delivery that survives navigation. True = queued. */\n private sendUnload(bytes: Uint8Array): boolean {\n const url = `${this.opts.endpoint.replace(/\\/$/, '')}/v1/batch`;\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, {\n method: 'POST',\n body: bytes as unknown as BodyInit,\n headers: {\n 'content-type': 'application/octet-stream',\n 'x-obsrviq-key': this.opts.siteKey,\n },\n keepalive: true,\n credentials: 'omit',\n mode: 'cors',\n }).catch(() => {});\n return true;\n } catch {\n return false;\n }\n }\n\n /** Append one gzipped batch to the localStorage spill (bounded, oldest-first\n * eviction). Quota/private-mode failures mean the tail is lost — same as\n * before spilling existed. */\n private spill(gz: Uint8Array) {\n try {\n const raw = window.localStorage.getItem(SPILL_KEY);\n const entries: SpillEntry[] = raw ? (JSON.parse(raw) as SpillEntry[]) : [];\n entries.push({ k: this.opts.siteKey, b: b64encode(gz), ts: Date.now() });\n let total = entries.reduce((n, e) => n + e.b.length, 0);\n while (entries.length > 0 && total > SPILL_MAX_BYTES) {\n total -= entries[0]!.b.length;\n entries.shift();\n }\n window.localStorage.setItem(SPILL_KEY, JSON.stringify(entries));\n } catch {\n /* unavailable / quota — drop */\n }\n }\n\n /** Resend batches a previous page's unload spilled. Entries are claimed\n * (removed) up front so two tabs can't double-send; still-transient failures\n * are re-spilled for the next load. Fire-and-forget. */\n private resendSpill() {\n let mine: SpillEntry[] = [];\n try {\n const raw = window.localStorage.getItem(SPILL_KEY);\n if (!raw) return;\n const entries = JSON.parse(raw) as SpillEntry[];\n const now = Date.now();\n const fresh = entries.filter((e) => e && typeof e.b === 'string' && now - e.ts < SPILL_MAX_AGE_MS);\n mine = fresh.filter((e) => e.k === this.opts.siteKey);\n const others = fresh.filter((e) => e.k !== this.opts.siteKey);\n if (others.length > 0) window.localStorage.setItem(SPILL_KEY, JSON.stringify(others));\n else window.localStorage.removeItem(SPILL_KEY);\n } catch {\n return;\n }\n if (mine.length === 0) return;\n void (async () => {\n for (const entry of mine) {\n try {\n const result = await this.send(b64decode(entry.b));\n if (result === 'retry') this.spill(b64decode(entry.b)); // network still down\n // ok / fatal / too_large → done with it either way\n } catch {\n /* drop */\n }\n }\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\n/** gzip — browser-native async CompressionStream when available (keeps multi-MB\n * snapshot compression off the main thread), fflate's gzipSync otherwise. The\n * unload path always uses gzipSync directly (it can't await). */\nasync function gzipBytes(bytes: Uint8Array): Promise<Uint8Array> {\n if (typeof CompressionStream !== 'undefined') {\n try {\n const stream = new Blob([bytes as unknown as BlobPart])\n .stream()\n .pipeThrough(new CompressionStream('gzip'));\n return new Uint8Array(await new Response(stream).arrayBuffer());\n } catch {\n /* fall back to sync */\n }\n }\n return gzipSync(bytes);\n}\n\nfunction b64encode(bytes: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(bin);\n}\n\nfunction b64decode(s: string): Uint8Array {\n const bin = atob(s);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\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 tz?: string;\n tzOffset?: number;\n} {\n const ua = navigator.userAgent;\n const viewport = { w: window.innerWidth, h: window.innerHeight };\n\n // The visitor's own timezone — so the player can show wall-clock times in their\n // local time, not just the viewer's. IANA name (DST-correct) plus a numeric\n // offset EAST of UTC as a fallback label. Both best-effort.\n let tz: string | undefined;\n let tzOffset: number | undefined;\n try {\n tz = Intl.DateTimeFormat().resolvedOptions().timeZone || undefined;\n tzOffset = -new Date().getTimezoneOffset();\n } catch {\n /* Intl unavailable — omit timezone */\n }\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, tz, tzOffset };\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 t = ctx.clock.fromPerf(performanceNow());\n // ONE CLOCK: rrweb stamps events with Date.now(), while everything else in\n // the session runs on the monotonic perf clock (`t`). Rewrite the rrweb\n // timestamp onto that same clock (startedAt + t) so an NTP step / manual\n // clock change mid-session can't desync replay from the console/network\n // lanes — the player only ever uses timestamp DELTAS, so this is safe.\n event.timestamp = ctx.clock.startedAt + t;\n const dom: DomEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'dom',\n t,\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\n/** Force a fresh FullSnapshot checkpoint NOW. Used after transport backpressure\n * had to drop buffered DOM deltas — the new snapshot re-anchors the stream so\n * replay stays coherent instead of playing broken deltas until the next 30s\n * checkout. Safe no-op when recording isn't active. */\nexport function takeFullSnapshot(): void {\n try {\n record.takeFullSnapshot(true);\n } catch {\n /* not recording */\n }\n}\n\nfunction performanceNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n","import type { SerializedArg } from '@obsrviq/types';\nimport { maskString, isSensitiveKeyName } from './mask.js';\n\nconst DEFAULT_MAX_BYTES = 8 * 1024; // 8 KB string cap (§6.1)\nconst MAX_WALK_NODES = 2000; // deep-walk node-visit 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 // Pre-cut giant strings (2× slack) so masking never regex-scans a multi-MB arg.\n const s = arg as string;\n const cut = s.length > maxBytes * 2 ? s.slice(0, maxBytes * 2) : s;\n const masked = maskString(cut);\n const { value, truncated } = truncate(masked, maxBytes);\n return { kind: 'string', value, truncated: truncated || cut !== s };\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 // Budgets are enforced DURING the walk (node-visit count + ~2× the byte cap)\n // so a huge object never burns CPU/memory before the final truncate applies.\n const budget: WalkBudget = { nodes: MAX_WALK_NODES, bytes: maxBytes * 2, exhausted: false };\n const masked = maskValueBudgeted(arg, budget);\n let json: string | undefined;\n let truncated = budget.exhausted;\n try {\n const full = JSON.stringify(masked, safeReplacer());\n const cut = truncate(full ?? 'undefined', maxBytes);\n json = cut.value;\n truncated = truncated || cut.truncated;\n } catch {\n json = undefined;\n }\n return { kind: 'object', preview: previewOf(arg), json, truncated };\n }\n\n // undefined / fallback\n return { kind: 'primitive', value: String(arg) };\n}\n\ninterface WalkBudget {\n nodes: number; // node visits left\n bytes: number; // approximate serialized bytes left\n exhausted: boolean;\n}\n\n/** `maskValue` with hard budgets enforced DURING the walk — a node-visit cap and a\n * running approximate byte budget — so a huge arg (e.g. a multi-MB store) is never\n * fully cloned/stringified just to be truncated afterwards. When a budget runs out\n * we stop descending and substitute a '«truncated»' placeholder. Byte-identical to\n * the unbudgeted walk for args that fit the budget. */\nfunction maskValueBudgeted(value: unknown, budget: WalkBudget, depth = 0): unknown {\n if (budget.exhausted) return '«truncated»';\n if (depth > 6) return '«depth»';\n if (--budget.nodes <= 0) budget.exhausted = true;\n if (typeof value === 'string') {\n // Pre-cut giant strings so masking never regex-scans more than the budget.\n const cut = value.length > budget.bytes ? value.slice(0, Math.max(0, budget.bytes)) : value;\n if (cut !== value) budget.exhausted = true;\n const masked = maskString(cut);\n if ((budget.bytes -= masked.length + 2) <= 0) budget.exhausted = true;\n return masked;\n }\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n for (const v of value) {\n if (budget.exhausted) {\n out.push('«truncated»');\n break;\n }\n out.push(maskValueBudgeted(v, budget, depth + 1));\n }\n return out;\n }\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value)) {\n if (budget.exhausted) {\n out['…'] = '«truncated»';\n break;\n }\n if ((budget.bytes -= k.length + 4) <= 0) budget.exhausted = true;\n out[k] = isSensitiveKeyName(k)\n ? '«redacted»'\n : maskValueBudgeted((value as Record<string, unknown>)[k], budget, depth + 1);\n }\n return out;\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","// Shared token-bucket rate limiter for capture paths (network / WebSocket\n// event floods). Kept tiny on purpose — callers count their own drops.\n\nexport interface TokenBucket {\n /** Spend one token if available; false = the caller should drop the event. */\n take(): boolean;\n}\n\n/** A token bucket: refills at `rate` tokens/sec (sustained), holds at most\n * `burst` tokens (burst capacity). */\nexport function tokenBucket(rate: number, burst: number): TokenBucket {\n let tokens = burst;\n let last = Date.now();\n return {\n take() {\n const now = Date.now();\n tokens = Math.min(burst, tokens + ((now - last) / 1000) * rate);\n last = now;\n if (tokens < 1) return false;\n tokens -= 1;\n return true;\n },\n };\n}\n","// W3C Trace Context propagation — stamp a `traceparent` header on FIRST-PARTY\n// outbound fetch/XHR so the backend's OpenTelemetry agent continues the same\n// trace, letting a session replay link to its server-side spans (App Monitor).\n//\n// CORS is the sharp edge: a custom request header on a CROSS-origin call promotes\n// it to a preflighted request, and the browser BLOCKS it unless the server echoes\n// the header in `Access-Control-Allow-Headers`. So we only ever propagate to:\n// • the page's own origin (same-origin → no CORS at all), and\n// • hosts the site explicitly allowlists via `traceHosts` (they've confirmed the\n// server allows `traceparent`).\n// Anything else is left untouched — propagation is strictly best-effort and must\n// never break or block a request.\n\nexport interface TraceIds {\n /** 32-hex W3C trace id (== the backend span's trace_id). */\n traceId: string;\n /** 16-hex parent/span id for this outbound request. */\n spanId: string;\n /** the ready-to-send `traceparent` header value. */\n header: string;\n}\n\nfunction randomHex(bytes: number): string {\n const arr = new Uint8Array(bytes);\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < bytes; i++) arr[i] = (Math.random() * 256) | 0;\n }\n let s = '';\n for (let i = 0; i < bytes; i++) s += arr[i]!.toString(16).padStart(2, '0');\n return s;\n}\n\n/** Mint a fresh W3C trace context for one outbound request (sampled flag = 01). */\nexport function newTrace(): TraceIds {\n const traceId = randomHex(16); // 128-bit\n const spanId = randomHex(8); // 64-bit\n return { traceId, spanId, header: `00-${traceId}-${spanId}-01` };\n}\n\ninterface TraceCfg {\n tracePropagation: boolean;\n traceHosts: string[];\n}\n\n/** Should we propagate to this URL? Same-origin always (safe); cross-origin only\n * if the host is allowlisted. Non-http(s) and unparseable URLs never match. */\nexport function traceTarget(rawUrl: string, cfg: TraceCfg): boolean {\n if (!cfg.tracePropagation) return false;\n let u: URL;\n try {\n u = new URL(rawUrl, typeof location !== 'undefined' ? location.href : undefined);\n } catch {\n return false;\n }\n if (u.protocol !== 'http:' && u.protocol !== 'https:') return false;\n if (typeof location !== 'undefined' && u.origin === location.origin) return true;\n return hostAllowed(u.hostname, cfg.traceHosts);\n}\n\nfunction hostAllowed(hostname: string, hosts: string[]): boolean {\n const h = hostname.toLowerCase();\n for (const raw of hosts) {\n let entry = String(raw).trim().toLowerCase();\n if (!entry) continue;\n if (entry.includes('://')) {\n try {\n entry = new URL(entry).hostname;\n } catch {\n /* keep the raw string */\n }\n }\n entry = entry.replace(/^\\*?\\./, ''); // \"*.example.com\" / \".example.com\" → \"example.com\"\n if (h === entry || h.endsWith('.' + entry)) return true;\n }\n return false;\n}\n\n/** The 32-hex trace id inside a `traceparent` value, or null if malformed. */\nexport function traceIdOf(header: string | null | undefined): string | null {\n if (!header) return null;\n const parts = header.split('-');\n return parts.length >= 2 && /^[0-9a-f]{32}$/.test(parts[1]!) ? parts[1]! : null;\n}\n\n/** The traceparent already on this fetch call, honoring fetch's header semantics:\n * init.headers (when present) REPLACE a Request's headers, so they win. */\nfunction existingFetchTraceparent(input: RequestInfo | URL, init: RequestInit | undefined): string | null {\n const hasInitHeaders = !!init && 'headers' in init && init.headers != null;\n const src = hasInitHeaders\n ? (init!.headers as HeadersInit)\n : input instanceof Request\n ? input.headers\n : undefined;\n if (!src) return null;\n try {\n return new Headers(src).get('traceparent');\n } catch {\n return null;\n }\n}\n\n/** Ensure a fetch call carries a `traceparent`, and report the trace id that will\n * actually be ON THE WIRE. If the app already set one, we DON'T overwrite it (and\n * return ITS id, so the recorded event matches what the backend sees); otherwise\n * we mint + inject ours. Total + side-effect-free so a caller can fall back to the\n * originals if it throws. */\nexport function applyFetchTrace(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n): { input: RequestInfo | URL; init: RequestInit | undefined; traceId: string } {\n const existing = existingFetchTraceparent(input, init);\n if (existing) {\n // Respect the app's own trace context — record its id, change nothing.\n return { input, init, traceId: traceIdOf(existing) ?? '' };\n }\n const tr = newTrace();\n const hasInitHeaders = !!init && 'headers' in init && init.headers != null;\n // fetch(Request) with no override headers → rebuild the Request so we don't drop\n // its own headers. When init.headers IS given, fetch uses THOSE, so inject there.\n if (input instanceof Request && !hasInitHeaders) {\n const h = new Headers(input.headers);\n h.set('traceparent', tr.header);\n return { input: new Request(input, { headers: h }), init, traceId: tr.traceId };\n }\n const h = new Headers((init?.headers as HeadersInit | undefined) ?? undefined);\n h.set('traceparent', tr.header);\n return { input, init: { ...(init || {}), headers: h }, traceId: tr.traceId };\n}\n","import type { NetworkEvent, NetworkResourceType, NetworkTiming } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { maskString } from './mask.js';\nimport { tokenBucket } from './ratelimit.js';\nimport { applyFetchTrace, newTrace, traceIdOf, traceTarget } from './trace.js';\nimport { uuid } from './util.js';\n\nconst BODY_CAP = 4 * 1024; // 4 KB body preview cap\nconst NET_RATE = 50; // sustained network events/sec per page\nconst NET_BURST = 100; // burst capacity\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 'traceparent',\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 // Pre-cut giant bodies (2× slack) so masking never regex-scans a multi-MB string.\n const cut = text.length > BODY_CAP * 2 ? text.slice(0, BODY_CAP * 2) : text;\n const masked = maskString(cut);\n const truncated = cut !== text || masked.length > BODY_CAP;\n return {\n contentType,\n preview: truncated ? masked.slice(0, BODY_CAP) : masked,\n truncated,\n redacted: masked !== cut,\n };\n}\n\n/** Read at most `cap`+1 bytes of a Response body via its stream reader (then\n * cancel), so a multi-MB response is never fully buffered just to keep a 4 KB\n * preview. `overflow` = the body had more bytes than `cap`. Falls back to\n * text() where a stream reader isn't available (older fetch polyfills). */\nasync function readTextCapped(res: Response, cap: number): Promise<{ text: string; overflow: boolean }> {\n const body = res.body;\n if (!body || typeof body.getReader !== 'function') {\n return { text: await res.text(), overflow: false };\n }\n const reader = body.getReader();\n const decoder = new TextDecoder(); // Response.text() decodes UTF-8 — match it\n let text = '';\n let bytes = 0;\n let overflow = false;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done || !value) {\n text += decoder.decode(); // flush any trailing multi-byte sequence\n break;\n }\n const remaining = cap + 1 - bytes;\n if (value.byteLength >= remaining) {\n // Keep only up to cap+1 bytes total — the +1 detects truncation.\n text += decoder.decode(value.subarray(0, remaining), { stream: true });\n overflow = true;\n break;\n }\n text += decoder.decode(value, { stream: true });\n bytes += value.byteLength;\n }\n } finally {\n // Release the tee'd clone branch so it doesn't buffer the rest of the response.\n void reader.cancel().catch(() => {});\n }\n return { text, overflow };\n}\n\nfunction perfNow(): number {\n return typeof performance !== 'undefined' ? performance.now() : 0;\n}\n\n/** Resource Timing `entry.name` is always absolute; requests may be issued with a\n * relative URL. Absolutize (query preserved) so the two can be matched. */\nfunction absUrl(raw: string): string {\n try {\n return new URL(raw, typeof location !== 'undefined' ? location.href : undefined).href;\n } catch {\n return raw;\n }\n}\n\n/** Extract the DNS/TCP/TLS/TTFB/Download breakdown from a matched Resource Timing\n * entry, layered onto the SDK-measured `base` (startT/endT/duration). Phases that\n * are zero — a reused keep-alive connection, or a cross-origin resource without a\n * `Timing-Allow-Origin` header (browser zeroes them for privacy) — are left\n * undefined so the player shows \"—\" rather than a misleading 0. */\nfunction phasesFrom(m: PerformanceResourceTiming, base: NetworkTiming): NetworkTiming {\n const t: NetworkTiming = { ...base };\n const r = (n: number) => Math.round(n);\n // Every phase is guarded on its START marker being > 0. A cross-origin resource\n // without `Timing-Allow-Origin` has its start markers (domainLookupStart,\n // connectStart, secureConnectionStart, requestStart, responseStart) zeroed by the\n // browser while responseEnd stays real — so a bare `end > start` check would\n // compute a garbage phase (e.g. download = responseEnd − 0). Requiring start > 0\n // omits those phases instead.\n if (m.domainLookupStart > 0 && m.domainLookupEnd > m.domainLookupStart)\n t.dns = r(m.domainLookupEnd - m.domainLookupStart);\n if (m.connectStart > 0 && m.connectEnd > m.connectStart) t.tcp = r(m.connectEnd - m.connectStart);\n if (m.secureConnectionStart > 0 && m.connectEnd > m.secureConnectionStart)\n t.tls = r(m.connectEnd - m.secureConnectionStart);\n if (m.requestStart > 0 && m.responseStart > m.requestStart)\n t.ttfb = r(m.responseStart - m.requestStart);\n if (m.responseStart > 0 && m.responseEnd > m.responseStart)\n t.download = r(m.responseEnd - m.responseStart);\n return t;\n}\n\n/** Pick the Resource Timing entry that best corresponds to a request that started\n * at `perfStart` (performance-timeline ms): same URL, started at ~the same time.\n * Guards against mis-attributing timing when the same URL is hit repeatedly. */\nfunction matchEntry(\n name: string,\n perfStart: number,\n entries: PerformanceResourceTiming[],\n): PerformanceResourceTiming | undefined {\n let best: PerformanceResourceTiming | undefined;\n let bestDelta = Infinity;\n for (const e of entries) {\n if (e.name !== name) continue;\n if (e.startTime < perfStart - 4) continue; // started before our request → not ours\n const d = e.startTime - perfStart;\n if (d < bestDelta) {\n bestDelta = d;\n best = e;\n }\n }\n return best;\n}\n\ninterface PendingTiming {\n name: string; // absolute URL, to match against PerformanceResourceTiming.name\n perfStart: number;\n base: NetworkTiming;\n resolve: (t: NetworkTiming) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\n/** How long to wait for a Resource Timing entry to be published before giving up\n * and emitting with duration-only timing. The browser adds the entry to the\n * performance buffer *slightly after* fetch/XHR completion, so a synchronous\n * lookup at completion almost always misses it — hence this short async wait. */\nconst TIMING_WAIT_MS = 300;\n\ninterface TimingResolver {\n resolve(rawUrl: string, perfStart: number, base: NetworkTiming): Promise<NetworkTiming>;\n flushPending(): void;\n teardown(): void;\n}\n\n/** Resolves the phase breakdown for a fetch/XHR asynchronously. A single shared\n * PerformanceObserver watches for resource entries as they land and settles the\n * matching pending request; unmatched requests settle on a short timeout. */\nfunction createTimingResolver(): TimingResolver {\n const pending: PendingTiming[] = [];\n let obs: PerformanceObserver | undefined;\n\n const stopObs = () => {\n if (obs) {\n try {\n obs.disconnect();\n } catch {\n /* ignore */\n }\n obs = undefined;\n }\n };\n\n const settle = (p: PendingTiming, t: NetworkTiming) => {\n const i = pending.indexOf(p);\n if (i === -1) return; // already settled\n pending.splice(i, 1);\n clearTimeout(p.timer);\n p.resolve(t);\n if (pending.length === 0) stopObs();\n };\n\n const consume = (entries: PerformanceEntryList) => {\n for (const e of entries as PerformanceResourceTiming[]) {\n let best: PendingTiming | undefined;\n let bestDelta = Infinity;\n for (const p of pending) {\n if (e.name !== p.name || e.startTime < p.perfStart - 4) continue;\n const d = e.startTime - p.perfStart;\n if (d < bestDelta) {\n bestDelta = d;\n best = p;\n }\n }\n if (best) settle(best, phasesFrom(e, best.base));\n }\n };\n\n const ensureObserver = () => {\n if (obs || typeof PerformanceObserver === 'undefined') return;\n try {\n obs = new PerformanceObserver((list) => consume(list.getEntries()));\n obs.observe({ type: 'resource', buffered: false });\n } catch {\n obs = undefined;\n }\n };\n\n return {\n resolve(rawUrl, perfStart, base) {\n if (typeof performance === 'undefined') return Promise.resolve(base);\n const name = absUrl(rawUrl);\n // Fast path: the entry may already be buffered (cached / same-tick resources).\n try {\n const now = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n const immediate = matchEntry(name, perfStart, now);\n if (immediate) return Promise.resolve(phasesFrom(immediate, base));\n } catch {\n /* ignore */\n }\n if (typeof PerformanceObserver === 'undefined') return Promise.resolve(base);\n // Slow path: wait for the entry to be published (or time out).\n return new Promise<NetworkTiming>((resolve) => {\n const p: PendingTiming = {\n name,\n perfStart,\n base,\n resolve,\n timer: setTimeout(() => settle(p, base), TIMING_WAIT_MS),\n };\n pending.push(p);\n ensureObserver();\n });\n },\n // Force-settle everything still in flight (with duration-only timing) so their\n // events are emitted into the transport buffer before an unload beacon fires.\n flushPending() {\n for (const p of [...pending]) settle(p, p.base);\n },\n teardown() {\n this.flushPending();\n stopObs();\n },\n };\n}\n\n/** A rate-gated NetworkEvent emitter shared by all capture paths on the page. */\ntype EmitNet = (ev: NetworkEvent) => void;\n\nexport function instrumentNetwork(ctx: InstrumentCtx): Teardown {\n const timing = createTimingResolver();\n // Per-page event throttle — a polling loop / request storm must not flood the\n // buffer. Dropped events are counted and reported on the next captured one.\n const bucket = tokenBucket(NET_RATE, NET_BURST);\n let dropped = 0;\n const emitNet: EmitNet = (ev) => {\n if (!bucket.take()) {\n dropped++;\n return;\n }\n if (dropped > 0) {\n ev.droppedEvents = dropped;\n dropped = 0;\n }\n ctx.emit(ev);\n };\n // On page hide, settle any request whose Resource Timing hasn't arrived yet so\n // its event lands in the transport buffer before the unload flush.\n const onPageHide = () => timing.flushPending();\n const onVisibility = () => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') timing.flushPending();\n };\n if (typeof window !== 'undefined') window.addEventListener('pagehide', onPageHide);\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibility);\n\n const teardowns: Teardown[] = [];\n teardowns.push(wrapFetch(ctx, timing, emitNet));\n teardowns.push(wrapXhr(ctx, timing, emitNet));\n teardowns.push(wrapBeacon(ctx, emitNet));\n teardowns.push(observeResources(ctx, emitNet));\n teardowns.push(() => {\n if (typeof window !== 'undefined') window.removeEventListener('pagehide', onPageHide);\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibility);\n timing.teardown();\n });\n return () => teardowns.forEach((t) => t());\n}\n\n// ───────────────────────────── fetch ────────────────────────────────\nfunction wrapFetch(ctx: InstrumentCtx, tr: TimingResolver, emitNet: EmitNet): 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') || rawUrl.includes('/v1/config'))\n return orig.call(window, input as RequestInfo, init);\n const startT = ctx.clock.now();\n const perfStart = perfNow();\n const method = (init?.method || (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url = redactUrl(rawUrl);\n // Trace-context propagation (best-effort, scoped to first-party hosts). Inject\n // BEFORE reading reqHeaders so the traceparent shows in the captured headers,\n // and stamp the trace id onto the event so replay ↔ backend trace can join.\n let traceId: string | undefined;\n if (traceTarget(rawUrl, ctx.config)) {\n try {\n const inj = applyFetchTrace(input, init);\n input = inj.input;\n init = inj.init;\n traceId = inj.traceId || undefined;\n } catch {\n /* never let propagation break the request */\n }\n }\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 base: NetworkTiming = { startT, endT, duration: endT - startT };\n ctx.markActivity();\n // Resolve the phase breakdown asynchronously — the Resource Timing entry is\n // published just after completion, so a synchronous read would miss it.\n void tr.resolve(rawUrl, perfStart, base).then((timing) => {\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 traceId,\n timing,\n ...partial,\n };\n emitNet(ev);\n });\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 // Stream-read the clone up to the preview cap — never buffer a huge body.\n const { text, overflow } = await readTextCapped(res.clone(), BODY_CAP);\n responseBody = bodyPreview(text, res.headers.get('content-type') || undefined);\n if (responseBody && overflow) responseBody.truncated = true;\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 perfStart: number;\n reqHeaders: Record<string, string>;\n body?: string;\n traceId?: string;\n}\n\nfunction wrapXhr(ctx: InstrumentCtx, tr: TimingResolver, emitNet: EmitNet): 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 perfStart: 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 meta.perfStart = perfNow();\n if (ctx.config.captureNetworkBodies) meta.body = stringifyBody(body);\n // Trace-context propagation (first-party only). setRequestHeader is valid\n // here — after open(), before the real send() below. Our own setRequestHeader\n // patch records it into meta.reqHeaders (traceparent is allowlisted), so a\n // traceparent the APP already set is visible here: respect it (record its id,\n // don't re-set — XHR COMBINES duplicate headers into an invalid \"v1, v2\").\n if (traceTarget(meta.rawUrl, ctx.config)) {\n try {\n const appSet = meta.reqHeaders['traceparent'];\n if (appSet) {\n meta.traceId = traceIdOf(appSet) ?? undefined;\n } else {\n const tr = newTrace();\n this.setRequestHeader('traceparent', tr.header);\n meta.traceId = tr.traceId;\n }\n } catch {\n /* header rejected (e.g. send already dispatched) — skip, never throw */\n }\n }\n const finish = (error?: string) => {\n const endT = ctx.clock.now();\n const base: NetworkTiming = {\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 responseSize = safeLen(this);\n ctx.markActivity();\n // Resolve the phase breakdown asynchronously (see wrapFetch).\n void tr.resolve(meta.rawUrl, meta.perfStart, base).then((timing) => {\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 traceId: meta.traceId,\n responseHeaders: respHeaders,\n responseSize,\n requestBody: ctx.config.captureNetworkBodies ? bodyPreview(meta.body, undefined) : undefined,\n responseBody,\n timing,\n error: error || classifyHttp(status),\n };\n emitNet(ev);\n });\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, emitNet: EmitNet): 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 emitNet(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, emitNet: EmitNet): 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 emitNet(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 { WsEvent } from '@obsrviq/types';\nimport type { InstrumentCtx, Teardown } from './context.js';\nimport { maskString } from './mask.js';\nimport { tokenBucket } from './ratelimit.js';\nimport { uuid } from './util.js';\n\nconst FRAME_CAP = 4 * 1024; // 4 KB text-frame preview cap (mirrors network bodies)\nconst MSG_RATE = 20; // sustained message-frame events/sec per socket\nconst MSG_BURST = 40; // burst capacity\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 byteLen(s: string): number {\n try {\n return new TextEncoder().encode(s).length;\n } catch {\n return s.length;\n }\n}\n\ntype FrameInfo = Pick<WsEvent, 'encoding' | 'size' | 'body'>;\n\n/** Derive encoding + byte size (+ opt-in masked preview) from a frame payload.\n * Never reads binary payload bytes — only their length. */\nfunction frameInfo(data: unknown, capture: boolean): FrameInfo {\n if (typeof data === 'string') {\n const info: FrameInfo = { encoding: 'text', size: byteLen(data) };\n if (capture) {\n // Pre-cut giant frames (2× slack) so masking never regex-scans a multi-MB payload.\n const cut = data.length > FRAME_CAP * 2 ? data.slice(0, FRAME_CAP * 2) : data;\n const masked = maskString(cut);\n const truncated = cut !== data || masked.length > FRAME_CAP;\n info.body = {\n preview: truncated ? masked.slice(0, FRAME_CAP) : masked,\n truncated,\n redacted: masked !== cut,\n };\n }\n return info;\n }\n let size = 0;\n if (typeof Blob !== 'undefined' && data instanceof Blob) size = data.size;\n else if (data instanceof ArrayBuffer) size = data.byteLength;\n else if (ArrayBuffer.isView(data)) size = (data as ArrayBufferView).byteLength;\n return { encoding: 'binary', size };\n}\n\n/** Wrap the WebSocket constructor to capture connection lifecycle + frames.\n * Best-effort: never throws into the app; a capture failure never breaks send/recv. */\nexport function instrumentWebSocket(ctx: InstrumentCtx): Teardown {\n const Orig = typeof window !== 'undefined' ? window.WebSocket : undefined;\n if (!Orig) return () => {};\n\n const emit = (partial: Omit<WsEvent, 'id' | 'sessionId' | 'type' | 't' | 'ts'>) => {\n try {\n const ev: WsEvent = {\n id: uuid(),\n sessionId: ctx.sessionId,\n type: 'ws',\n t: ctx.clock.now(),\n ts: ctx.clock.wall(),\n ...partial,\n };\n ctx.emit(ev);\n } catch {\n /* swallow — capture must never affect the socket */\n }\n };\n\n class WrappedWebSocket extends Orig {\n constructor(url: string | URL, protocols?: string | string[]) {\n super(url as string, protocols as string | string[] | undefined);\n // The real socket is already live; capture setup must never throw into the app.\n try {\n const connId = uuid();\n const redUrl = redactUrl(String(url));\n const protos = protocols ? (Array.isArray(protocols) ? protocols : [protocols]) : undefined;\n const capture = ctx.config.captureNetworkBodies;\n\n // Per-socket frame throttle — a chatty socket (100s of msg/s) must not\n // flood the buffer. Dropped frames are counted and reported on the next\n // captured frame (or the close event). Lifecycle events (open/close/error)\n // are never throttled.\n const bucket = tokenBucket(MSG_RATE, MSG_BURST);\n let droppedFrames = 0;\n const emitFrame = (dir: 'send' | 'recv', data: unknown) => {\n ctx.markActivity(); // dropped frames still count as app activity\n if (!bucket.take()) {\n droppedFrames++;\n return;\n }\n const info = frameInfo(data, capture);\n const dropped = droppedFrames;\n droppedFrames = 0;\n emit({ connId, url: redUrl, kind: 'message', dir, ...info, droppedFrames: dropped || undefined });\n };\n\n this.addEventListener('open', () => emit({ connId, url: redUrl, kind: 'open', protocols: protos }));\n this.addEventListener('close', (e) =>\n emit({\n connId,\n url: redUrl,\n kind: 'close',\n code: e.code,\n reason: e.reason || undefined,\n wasClean: e.wasClean,\n droppedFrames: droppedFrames || undefined,\n }),\n );\n this.addEventListener('error', () => emit({ connId, url: redUrl, kind: 'error' }));\n this.addEventListener('message', (e: MessageEvent) => emitFrame('recv', e.data));\n\n // Capture outgoing frames by shadowing send() on this instance. Call the\n // real send FIRST — if it throws (e.g. send() while CONNECTING) the error\n // propagates to the app and no phantom \"send\" frame is recorded.\n const origSend = super.send.bind(this);\n this.send = (data: string | ArrayBufferLike | Blob | ArrayBufferView) => {\n origSend(data);\n try {\n emitFrame('send', data);\n } catch {\n /* ignore capture errors */\n }\n };\n } catch {\n /* capture setup failed — the real socket still works normally. */\n }\n }\n }\n\n window.WebSocket = WrappedWebSocket as unknown as typeof WebSocket;\n return () => {\n window.WebSocket = Orig;\n };\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, takeFullSnapshot } from './recorder.js';\nimport { instrumentConsole } from './console.js';\nimport { instrumentNetwork } from './network.js';\nimport { instrumentWebSocket } from './websocket.js';\nimport { setCustomMaskKeys, markMaskConfigReady } from './mask.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 tracePropagation: false,\n traceHosts: [] as string[],\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 // Custom masking keys: apply any static ones NOW, then fetch the per-site list\n // (GET /v1/config) and merge. Fired before the network instrumenter is installed\n // so this request is never self-recorded; the transport also re-masks custom\n // keys at send time so nothing captured before the fetch resolves can leak.\n const staticMaskKeys = Array.isArray(config.maskKeys) ? config.maskKeys : [];\n setCustomMaskKeys(staticMaskKeys);\n void this.loadRemoteMaskKeys(staticMaskKeys);\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 /** Fetch the per-site masking config (GET /v1/config) and merge its keys with any\n * static ones. Best-effort: on failure the built-in masking still applies. */\n private async loadRemoteMaskKeys(staticKeys: string[]): Promise<void> {\n const cfg = this.config;\n if (!cfg || typeof fetch === 'undefined') {\n markMaskConfigReady();\n return;\n }\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), 2000);\n try {\n const url = `${cfg.endpoint.replace(/\\/$/, '')}/v1/config?key=${encodeURIComponent(cfg.siteKey)}`;\n const res = await fetch(url, { credentials: 'omit', mode: 'cors', signal: ctrl.signal });\n if (res.ok) {\n const data = (await res.json()) as { maskKeys?: unknown };\n const remote = Array.isArray(data.maskKeys)\n ? data.maskKeys.filter((k): k is string => typeof k === 'string')\n : [];\n setCustomMaskKeys([...staticKeys, ...remote]);\n }\n } finally {\n clearTimeout(timer);\n }\n } catch {\n /* offline / blocked / timeout / bad JSON — built-in masking still protects. */\n } finally {\n // Always release the transport's hold — a failed/slow fetch must never block\n // sending forever (built-in + static-key masking still applies).\n markMaskConfigReady();\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 // Backpressure dropped DOM deltas → re-anchor the rrweb stream immediately\n // so replay stays coherent (a delta stream with a hole is corrupt until\n // the next 30s checkout).\n onDomDrop: () => takeFullSnapshot(),\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(instrumentWebSocket(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"]}
|