cosmic-eye 0.5.1 → 0.5.2

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 CosmicEye
3
+ Copyright (c) 2026 Vladislav Babak
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -6,15 +6,6 @@ A set of RUM metrics for SPAs. Two independent modules + extensions:
6
6
  - **RT** (Route Transition Metrics) — measures route transition timing (render + TTI).
7
7
  - **Extensions** — `observeHistory`, `RouteRenderObserver`, `mobxSpy`.
8
8
 
9
- **Key properties:**
10
-
11
- - Zero runtime dependencies for the core (React and MobX are optional peers)
12
- - Config-driven sampling, send functions, enrichers, tags
13
- - All public methods return result objects with `initialized` status
14
- - `observeHistory` — neutral pre-render navigation observer (history v4/v5)
15
- - `RouteRenderObserver` — post-render React provider
16
- - `mobxSpy` — MobX spy integration (no-op if MobX absent)
17
-
18
9
  ## Installation
19
10
 
20
11
  ```bash
@@ -72,9 +63,20 @@ import { RouteRenderObserver } from 'cosmic-eye/react';
72
63
  - On `pagehide` (page close)
73
64
  - On `destroy()` or `flush()`
74
65
 
66
+ ## How route transition tracking works
67
+
68
+ 1. On navigation, call `startTransition(pathname, search?)` — RT creates a transition ID, stores the start time, and normalizes `routeName`.
69
+ 2. After route commit, call `markRendered(pathname)` — RT records render completion time.
70
+ 3. If there is critical async work, use `trackCritical()` — RT waits until all critical tasks are finished.
71
+ 4. RT marks the transition as interactive after `rafCount` frames + idle wait (`idleTimeoutMs`), then sends a `transition` event.
72
+ 5. The event includes `routeRenderMs` and `routeTtiMs` (and optional `pathname` / `search` if enabled in config).
73
+ 6. If interactive state is not reached before `criticalTimeoutMs` (default 20 s), RT still sends the event with `timedOut: true`.
74
+ 7. `abortPending(reason?)` sends an `abort` event; `destroy()` stops tracking and clears timers.
75
+
76
+
75
77
  ## Sampling
76
78
 
77
- Sampling is **config-driven** via `samplingRate` (0..1). Default is `1` (always enabled). The decision is deterministic when a stable client ID is available (`clientId` from config or persisted `localStorage`). If storage is unavailable and no explicit `clientId` is provided, fallback ID generation may produce non-deterministic results between calls.
79
+ Sampling is **config-driven** via `samplingRate` (0..1). Default is `0.05` (5%). The decision is deterministic when a stable client ID is available (`clientId` from config or persisted `localStorage`). If storage is unavailable and no explicit `clientId` is provided, fallback ID generation may produce non-deterministic results between calls.
78
80
 
79
81
  ## API
80
82
 
@@ -118,8 +120,6 @@ Sampling is **config-driven** via `samplingRate` (0..1). Default is `1` (always
118
120
  | `children` | `ReactNode` | Child elements |
119
121
  | `onRouteChange` | `Array<(pathname, search) => void>` | Callbacks on route change |
120
122
 
121
- See [src/rdr/README.md](src/rdr/README.md) and [src/rt/README.md](src/rt/README.md) for log schemas and configuration reference.
122
-
123
123
  ## Project structure
124
124
 
125
125
  ```
package/dist/index.cjs CHANGED
@@ -351,7 +351,7 @@ var dispatchExtensionEvent = (eventName, type, data) => {
351
351
  var VERSION = "0.1";
352
352
  var CHROME_EXT_EVENT_NAME = "rdr";
353
353
  var DEFAULTS = {
354
- SAMPLING_RATE: 1,
354
+ SAMPLING_RATE: 0.05,
355
355
  SAMPLING_STORAGE_KEY: "rum_user_id",
356
356
  DUPLICATE_THRESHOLD_MS: 1e3,
357
357
  CLEANUP_INTERVAL_MS: 1e4,
@@ -792,7 +792,7 @@ var CHROME_EXT_EVENT_NAME2 = "rt";
792
792
  var EVENT_NAME = "cosmic_eye_route_transition";
793
793
  var NORMALIZE_ID_REGEX = /\/\d+/g;
794
794
  var DEFAULTS2 = {
795
- SAMPLING_RATE: 1,
795
+ SAMPLING_RATE: 0.05,
796
796
  SAMPLING_STORAGE_KEY: "rum_rt_id",
797
797
  CRITICAL_TIMEOUT_MS: 2e4,
798
798
  IDLE_TIMEOUT_MS: 1500,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/hash.ts","../src/shared/time.ts","../src/shared/env.ts","../src/shared/sampling.ts","../src/shared/enrichers.ts","../src/shared/chrome-ext.ts","../src/rdr/config.ts","../src/rdr/actions.ts","../src/rdr/index.ts","../src/rt/config.ts","../src/shared/generate-id.ts","../src/rt/utils.ts","../src/rt/index.ts","../src/extensions/history-route-observer/index.ts","../src/extensions/mobx-spy/index.ts"],"names":["VERSION","CHROME_EXT_EVENT_NAME","DEFAULTS","_bufferMaxSize"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { HashLimitsConfig, RequestKeyResult, StructuredHashResult } from './types';\n\nexport const DEFAULT_HASH_LIMITS: HashLimitsConfig = {\n MAX_DEPTH: 20,\n MAX_NODES: 5_000,\n MAX_OBJECT_KEYS: 300,\n MAX_ARRAY_ITEMS: 1_000,\n MAX_STRING_CHARS: 2_048,\n} as const;\n\nconst HASH_SEED = 0x811c9dc5;\nconst HASH_PRIME = 0x01000193;\n\ninterface Hasher {\n write: (text: string) => void;\n hex: () => string;\n}\n\nconst _makeHasher = (): Hasher => {\n let state = HASH_SEED;\n\n const write = (text: string): void => {\n const value = String(text);\n for (let i = 0; i < value.length; i++) {\n state ^= value.charCodeAt(i);\n state = Math.imul(state, HASH_PRIME) >>> 0;\n }\n };\n\n const hex = (): string => (state >>> 0).toString(16).padStart(8, '0');\n\n return { write, hex };\n};\n\nexport const hashText = (text: string): string => {\n const hasher = _makeHasher();\n hasher.write(text);\n return hasher.hex();\n};\n\nexport const hashStructuredData = (\n input: unknown,\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): StructuredHashResult => {\n const pathObjects = new WeakSet();\n const hasher = _makeHasher();\n let nodesVisited = 0;\n let wasTruncated = false;\n\n const writeToken = (token: string): void => {\n hasher.write(token);\n };\n\n const writeString = (str: string): void => {\n writeToken('str:');\n if (str.length > limits.MAX_STRING_CHARS) {\n wasTruncated = true;\n writeToken(str.slice(0, limits.MAX_STRING_CHARS));\n writeToken(`#len=${str.length}`);\n return;\n }\n writeToken(str);\n };\n\n const writeNumber = (num: number): void => {\n if (Number.isNaN(num)) {\n writeToken('num:NaN');\n return;\n }\n if (num === Infinity) {\n writeToken('num:Infinity');\n return;\n }\n if (num === -Infinity) {\n writeToken('num:-Infinity');\n return;\n }\n if (Object.is(num, -0)) {\n writeToken('num:-0');\n return;\n }\n\n writeToken(`num:${num}`);\n };\n\n const walk = (value: unknown, depth: number): void => {\n if (nodesVisited++ >= limits.MAX_NODES) {\n wasTruncated = true;\n writeToken('[maxNodes]');\n return;\n }\n\n if (depth > limits.MAX_DEPTH) {\n wasTruncated = true;\n writeToken('[maxDepth]');\n return;\n }\n\n if (value === null) {\n writeToken('null');\n return;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n return writeString(value as string);\n }\n if (type === 'number') {\n return writeNumber(value as number);\n }\n if (type === 'boolean') {\n writeToken(value ? 'bool:true' : 'bool:false');\n return;\n }\n if (type === 'bigint') {\n writeToken(`bigint:${(value as bigint).toString()}`);\n return;\n }\n if (type === 'undefined') {\n writeToken('undef');\n return;\n }\n if (type === 'symbol') {\n writeToken(`symbol:${String(value)}`);\n return;\n }\n if (type === 'function') {\n writeToken('function');\n return;\n }\n\n if (value instanceof Date) {\n const ts = value.getTime();\n\n if (Number.isNaN(ts)) {\n wasTruncated = true;\n writeToken('date:Invalid');\n return;\n }\n\n writeToken('date:');\n writeToken(value.toISOString());\n return;\n }\n\n const obj = value as object;\n\n if (pathObjects.has(obj)) {\n wasTruncated = true;\n writeToken('[circular]');\n return;\n }\n\n pathObjects.add(obj);\n\n try {\n if (Array.isArray(obj)) {\n writeToken('[');\n const itemsToHash = Math.min(obj.length, limits.MAX_ARRAY_ITEMS);\n\n if (obj.length > itemsToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < itemsToHash; i++) {\n writeToken(`i:${i}|`);\n walk(obj[i], depth + 1);\n writeToken(';');\n }\n\n if (obj.length > itemsToHash) {\n writeToken(`#len=${obj.length}`);\n }\n writeToken(']');\n return;\n }\n\n writeToken('{');\n\n const sortedKeys = Object.keys(obj).sort();\n const keysToHash = Math.min(sortedKeys.length, limits.MAX_OBJECT_KEYS);\n\n if (sortedKeys.length > keysToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < keysToHash; i++) {\n const key = sortedKeys[i];\n const propValue = (obj as Record<string, unknown>)[key];\n\n if (propValue === undefined) {\n continue;\n }\n\n writeToken('k:');\n writeString(key);\n writeToken('|v:');\n walk(propValue, depth + 1);\n writeToken(';');\n }\n\n if (sortedKeys.length > keysToHash) {\n writeToken(`#keys=${sortedKeys.length}`);\n }\n writeToken('}');\n } catch (_) {\n wasTruncated = true;\n writeToken('[unhashableObject]');\n } finally {\n pathObjects.delete(obj);\n }\n };\n\n walk(input, 0);\n\n return {\n hashHex: hasher.hex(),\n wasTruncated,\n nodesVisited,\n };\n};\n\n/** Generate a request fingerprint for RPC-style requests (service + method + params + body). */\nexport const makeRpcRequestKey = (\n apiMessage: { s?: string; m?: string; p?: unknown; b?: unknown },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const serviceName = String(apiMessage?.s ?? '');\n const methodName = String(apiMessage?.m ?? '');\n const endpoint = `${serviceName}.${methodName}`;\n const endpointHash = hashText(endpoint);\n const paramsHash = hashStructuredData(apiMessage?.p ?? {}, limits);\n const bodyHash = hashStructuredData(apiMessage?.b ?? {}, limits);\n\n const truncationMask = (paramsHash.wasTruncated ? 1 : 0) | (bodyHash.wasTruncated ? 2 : 0);\n\n return {\n endpoint,\n reqHash: `req_${endpointHash}_${paramsHash.hashHex}_${bodyHash.hashHex}_${truncationMask}`,\n };\n};\n\n/**\n * Generate a request fingerprint for HTTP-style requests (method + endpoint URL + body text).\n * httpMethod is included in the hash to avoid false collisions (e.g. GET vs POST to same URL).\n */\nexport const makeHttpRequestKey = (\n request: { httpMethod: string; endpoint: string; bodyText?: string },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const method = String(request.httpMethod ?? '').toUpperCase();\n const endpoint = String(request.endpoint ?? '');\n const bodyText = String(request.bodyText ?? '');\n\n const endpointWithMethod = `${method}:${endpoint}`;\n const endpointHash = hashText(endpointWithMethod);\n\n const truncatedBody = bodyText.length > limits.MAX_STRING_CHARS\n ? bodyText.slice(0, limits.MAX_STRING_CHARS)\n : bodyText;\n const bodyHash = hashText(truncatedBody);\n const wasTruncated = bodyText.length > limits.MAX_STRING_CHARS;\n\n const truncationMask = wasTruncated ? 2 : 0;\n\n return {\n endpoint: endpointWithMethod,\n reqHash: `req_${endpointHash}_${bodyHash}_${truncationMask}`,\n };\n};\n","/** Shared time utilities used by rdr, rt, and extensions. All values in milliseconds. */\n\n/**\n * Current high-resolution timestamp in milliseconds.\n * Uses performance.now() when available, falls back to Date.now().\n * Result is always rounded to the nearest integer.\n */\nexport const nowMs = (): number => {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return Math.round(performance.now());\n }\n\n return Date.now();\n};\n\n/**\n * Elapsed time in milliseconds since a given timestamp.\n * Both `since` and the result are rounded integers.\n */\nexport const elapsedMs = (since: number): number => {\n const current = nowMs();\n const sinceRounded = typeof since === 'number' ? Math.round(since) : 0;\n\n return current - sinceRounded;\n};\n","import type { EnvSnapshot, NavigatorWithConnection } from './types';\n\nexport const env = {\n snapshot(): EnvSnapshot {\n const result: EnvSnapshot = {\n visibility: 'unknown',\n net: null,\n };\n\n try {\n if (typeof document !== 'undefined' && document.visibilityState) {\n result.visibility = document.visibilityState;\n }\n } catch (_) {\n // nothing\n }\n\n try {\n const nav = navigator as NavigatorWithConnection;\n const conn = nav?.connection || nav?.mozConnection || nav?.webkitConnection;\n\n if (conn) {\n result.net = {\n effectiveType: conn.effectiveType || null,\n };\n }\n } catch (_) {\n // nothing\n }\n\n return result;\n },\n};\n","import { hashText } from './hash';\nimport type { SamplingConfig } from './types';\n\n/**\n * Determine whether a client should be sampled, based on config.\n * Fully config-driven — no implicit dev exceptions.\n *\n * @param config.rate — sampling rate (0..1). 1 = always enabled, 0 = always disabled.\n * @param config.storageKey — localStorage key for persisting client ID.\n * @param config.clientId — optional explicit client ID (overrides localStorage).\n * @returns true if this client is sampled.\n */\nexport const shouldEnableSample = (config: SamplingConfig): boolean => {\n try {\n if (config.rate >= 1) {\n return true;\n }\n\n if (config.rate <= 0) {\n return false;\n }\n\n const id = getClientId(config);\n const h = hashText(id);\n const bucket = (parseInt(h, 16) % 10_000) / 10_000;\n\n return bucket < config.rate;\n } catch (_) {\n return false;\n }\n};\n\n/**\n * Resolve client ID: explicit config > localStorage > generate new.\n */\nexport const getClientId = (config: SamplingConfig): string => {\n if (config.clientId) {\n return config.clientId;\n }\n\n try {\n const stored = localStorage.getItem(config.storageKey);\n\n if (stored) {\n return stored;\n }\n\n const generated = crypto?.randomUUID?.() || String(Math.random()) + String(Date.now());\n localStorage.setItem(config.storageKey, generated);\n\n return generated;\n } catch (_) {\n return String(Math.random()) + String(Date.now());\n }\n};\n","import { nowMs } from './time';\nimport type { Enricher, EnricherLimitsConfig } from './types';\n\nexport const DEFAULT_ENRICHER_LIMITS: EnricherLimitsConfig = {\n maxDepth: 5,\n maxStringChars: 1_024,\n} as const;\n\n/**\n * Run all enrichers and collect results into a record.\n * Each getter is called synchronously with try/catch.\n * If a getter throws, the entry is set to `{ error: 'enricher_failed' }`.\n * Output values are truncated according to limits.\n */\nexport const collectEnrichers = (\n enrichers: Enricher[] | undefined,\n limits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS,\n): Record<string, unknown> | undefined => {\n if (!enrichers || enrichers.length === 0) {\n return undefined;\n }\n\n const result: Record<string, unknown> = {};\n const currentTime = nowMs();\n\n for (const enricher of enrichers) {\n try {\n const value = enricher.get(currentTime);\n result[enricher.name] = truncateValue(value, limits.maxDepth, limits.maxStringChars, 0);\n } catch (_) {\n result[enricher.name] = { error: 'enricher_failed' };\n }\n }\n\n return result;\n};\n\n/** Recursively truncate a value to enforce depth and string limits. */\nconst truncateValue = (\n value: unknown,\n maxDepth: number,\n maxStringChars: number,\n depth: number,\n): unknown => {\n if (depth > maxDepth) {\n return '[maxDepth]';\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n const str = value as string;\n return str.length > maxStringChars ? str.slice(0, maxStringChars) + '...' : str;\n }\n\n if (type === 'number' || type === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => truncateValue(item, maxDepth, maxStringChars, depth + 1));\n }\n\n if (type === 'object') {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = truncateValue(\n (value as Record<string, unknown>)[key],\n maxDepth,\n maxStringChars,\n depth + 1,\n );\n }\n\n return result;\n }\n\n return String(value);\n};\n","/**\n * Dispatch a CustomEvent to window for chrome extension integration.\n * @param eventName — 'rdr' or 'rt'\n * @param type — event type, e.g. 'flush', 'event', 'reset'\n * @param data — payload data\n */\nexport const dispatchExtensionEvent = (\n eventName: string,\n type: string,\n data: unknown,\n): void => {\n try {\n window.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { type, data },\n }),\n );\n } catch (_) {\n // nothing\n }\n};\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RDR. */\nexport const CHROME_EXT_EVENT_NAME = 'rdr';\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 1,\n SAMPLING_STORAGE_KEY: 'rum_user_id',\n DUPLICATE_THRESHOLD_MS: 1_000,\n CLEANUP_INTERVAL_MS: 10_000,\n FLUSH_INTERVAL_MS: 15_000,\n FLUSH_MAX_EVENTS: 50,\n ACTIONS_BUFFER_MAX_SIZE: 3,\n ACTIONS_TRACKED_EVENTS: ['click', 'keydown', 'touchstart'] as readonly string[],\n} as const;\n","import { nowMs } from '../shared/time';\nimport { DEFAULTS } from './config';\nimport type { ActionData, ActionSnapshot } from './types';\n\ninterface BufferEntry {\n ts: number;\n type: string;\n rum_id: string | null;\n}\n\nconst _buffer: BufferEntry[] = [];\nlet _listenersAttached = false;\nlet _bufferMaxSize: number = DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\nlet _trackedEvents: readonly string[] = DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\nconst _getRumId = (target: EventTarget | null): string | null => {\n try {\n if (!target || typeof (target as HTMLElement).closest !== 'function') {\n return null;\n }\n\n const el = (target as HTMLElement).closest('[rum-id]');\n\n return el ? el.getAttribute('rum-id') : null;\n } catch (_) {\n return null;\n }\n};\n\nconst _reset = (): void => {\n _buffer.length = 0;\n};\n\nconst _onEvent = (e: Event): void => {\n try {\n if (_buffer.length >= _bufferMaxSize) {\n _reset();\n }\n\n _buffer.push({\n ts: nowMs(),\n type: e.type,\n rum_id: _getRumId(e.target),\n });\n } catch (_) {\n // nothing\n }\n};\n\nexport const actions = {\n init(bufferMaxSize?: number, trackedEvents?: string[]): void {\n if (_listenersAttached) {\n return;\n }\n\n _bufferMaxSize = bufferMaxSize ?? DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\n _trackedEvents = trackedEvents ?? DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\n try {\n for (const eventType of _trackedEvents) {\n window.addEventListener(eventType, _onEvent, { capture: true, passive: true });\n }\n _listenersAttached = true;\n } catch (_) {\n // nothing\n }\n },\n\n reset(): void {\n _reset();\n },\n\n snapshot(currentTime: number): ActionSnapshot {\n const last = _buffer[_buffer.length - 1] || null;\n\n if (!last) {\n return {\n lastAction: null,\n timeSinceLastActionMs: null,\n };\n }\n\n const actionData: ActionData = { type: last.type };\n\n if (last.rum_id) {\n actionData.rum_id = last.rum_id;\n }\n\n return {\n lastAction: actionData,\n timeSinceLastActionMs: currentTime - last.ts,\n };\n },\n\n destroy(): void {\n if (!_listenersAttached) {\n return;\n }\n\n try {\n for (const eventType of _trackedEvents) {\n window.removeEventListener(eventType, _onEvent, { capture: true });\n }\n _listenersAttached = false;\n _reset();\n } catch (_) {\n // nothing\n }\n },\n};\n","import { makeRpcRequestKey, makeHttpRequestKey, DEFAULT_HASH_LIMITS } from '../shared/hash';\nimport { nowMs, elapsedMs } from '../shared/time';\nimport { env } from '../shared/env';\nimport { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, CHROME_EXT_EVENT_NAME } from './config';\nimport { actions } from './actions';\nimport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrConfig,\n RdrSendFn,\n RdrKeyFactory,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n} from './types';\nimport type { HashLimitsConfig, RequestKeyResult, EnricherLimitsConfig } from '../shared/types';\n\nclass RDR {\n private _requestsMap = new Map<string, number>();\n private _logQueue: RdrLogEntry[] = [];\n private _cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _initialized = false;\n private _pageLoadTime: number | null = null;\n private _boundOnVisibilityChange: (() => void) | null = null;\n private _boundOnPageHide: (() => void) | null = null;\n\n // Config-derived fields (set during init)\n private _duplicateThresholdMs: number = DEFAULTS.DUPLICATE_THRESHOLD_MS;\n private _cleanupIntervalMs: number = DEFAULTS.CLEANUP_INTERVAL_MS;\n private _flushIntervalMs: number = DEFAULTS.FLUSH_INTERVAL_MS;\n private _flushMaxEvents: number = DEFAULTS.FLUSH_MAX_EVENTS;\n private _hashLimits: HashLimitsConfig = DEFAULT_HASH_LIMITS;\n private _sendFn: RdrSendFn | null = null;\n private _rpcKeyFactory: RdrKeyFactory | null = null;\n private _httpKeyFactory: RdrKeyFactory | null = null;\n private _enrichers: RdrConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RdrConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply and validate config BEFORE setting _initialized\n this._applyConfig(config);\n\n // Sampling check\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n this._pageLoadTime = nowMs();\n actions.init(config?.actionsBufferMaxSize, config?.actionsTrackedEvents);\n this._startCleanupInterval();\n this._startFlushInterval();\n this._attachLifecycleListeners();\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n reqHandlerRpc(payload: RpcRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.s || !payload?.m) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._rpcKeyFactory) {\n try {\n reqData = this._rpcKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genRpcHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n reqHandlerHttp(payload: HttpRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.httpMethod || !payload?.endpoint) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._httpKeyFactory) {\n try {\n reqData = this._httpKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genHttpHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n flush(trigger = 'manual', meta?: unknown): RdrFlushResult {\n if (!this._initialized) {\n return { initialized: false, flushed: false, entriesCount: 0 };\n }\n\n return this._flush(trigger, meta);\n }\n\n resetTiming(): RdrResetTimingResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n this._pageLoadTime = nowMs();\n\n return { initialized: true, reset: true };\n }\n\n resetActions(): RdrResetActionsResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n actions.reset();\n\n return { initialized: true, reset: true };\n }\n\n destroy(): RdrDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._cleanupTimer) {\n clearInterval(this._cleanupTimer);\n this._cleanupTimer = null;\n }\n\n if (this._flushTimer) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n\n this._detachLifecycleListeners();\n this._flush('destroy');\n actions.destroy();\n this._requestsMap.clear();\n this._logQueue = [];\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RdrConfig): void {\n if (!config) {\n return;\n }\n\n if (config.duplicateThresholdMs !== undefined) {\n this._duplicateThresholdMs = config.duplicateThresholdMs;\n }\n if (config.cleanupIntervalMs !== undefined) {\n this._cleanupIntervalMs = config.cleanupIntervalMs;\n }\n if (config.flushIntervalMs !== undefined) {\n this._flushIntervalMs = config.flushIntervalMs;\n }\n if (config.flushMaxEvents !== undefined) {\n this._flushMaxEvents = config.flushMaxEvents;\n }\n if (config.hashLimits) {\n this._hashLimits = { ...DEFAULT_HASH_LIMITS, ...config.hashLimits };\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.rpcKeyFactory) {\n this._rpcKeyFactory = config.rpcKeyFactory;\n }\n if (config.httpKeyFactory) {\n this._httpKeyFactory = config.httpKeyFactory;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _processRequest(reqData: RequestKeyResult): RdrReqHandlerResult {\n const currentTime = nowMs();\n const lastRequestTime = this._requestsMap.get(reqData.reqHash);\n let isDuplicate = false;\n\n if (lastRequestTime !== undefined) {\n const timeDiff = elapsedMs(lastRequestTime);\n\n if (timeDiff < this._duplicateThresholdMs) {\n this._addToLogQueue(reqData, currentTime, timeDiff);\n isDuplicate = true;\n }\n }\n\n this._requestsMap.set(reqData.reqHash, currentTime);\n\n return { initialized: true, processed: true, duplicate: isDuplicate };\n }\n\n private _genRpcHash(payload: RpcRequestPayload): RequestKeyResult | null {\n try {\n return makeRpcRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _genHttpHash(payload: HttpRequestPayload): RequestKeyResult | null {\n try {\n return makeHttpRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _addToLogQueue(reqData: RequestKeyResult, currentTime: number, timeDiff: number): void {\n try {\n const actionsSnapshot = actions.snapshot(currentTime);\n const envSnapshot = env.snapshot();\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const logEntry: RdrLogEntry = {\n ver: VERSION,\n endpoint: reqData.endpoint,\n reqHash: reqData.reqHash,\n deltaMs: timeDiff,\n timings: {\n timeSincePageLoadMs: elapsedMs(this._pageLoadTime!),\n timeSinceLastActionMs: actionsSnapshot.timeSinceLastActionMs,\n },\n lastAction: actionsSnapshot.lastAction,\n env: envSnapshot,\n };\n\n if (this._tag) {\n logEntry.tag = this._tag;\n }\n\n if (enrichments) {\n logEntry.enrichments = enrichments;\n }\n\n this._logQueue.push(logEntry);\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'log', logEntry);\n }\n\n if (this._logQueue.length >= this._flushMaxEvents) {\n this._flush('threshold');\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startCleanupInterval(): void {\n if (this._cleanupTimer) {\n return;\n }\n\n this._cleanupTimer = setInterval(() => {\n this._cleanupOldRequests();\n }, this._cleanupIntervalMs);\n }\n\n private _cleanupOldRequests(): void {\n try {\n const currentTime = nowMs();\n const threshold = currentTime - this._duplicateThresholdMs;\n\n for (const [hash, timestamp] of this._requestsMap) {\n if (timestamp < threshold) {\n this._requestsMap.delete(hash);\n }\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startFlushInterval(): void {\n if (this._flushTimer) {\n return;\n }\n\n this._flushTimer = setInterval(() => {\n this._flush('interval');\n }, this._flushIntervalMs);\n }\n\n private _attachLifecycleListeners(): void {\n try {\n this._boundOnVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this._flush('visibilitychange');\n }\n };\n\n this._boundOnPageHide = () => {\n this._flush('pagehide');\n };\n\n document.addEventListener('visibilitychange', this._boundOnVisibilityChange);\n window.addEventListener('pagehide', this._boundOnPageHide);\n } catch (_) {\n // nothing\n }\n }\n\n private _detachLifecycleListeners(): void {\n try {\n if (this._boundOnVisibilityChange) {\n document.removeEventListener('visibilitychange', this._boundOnVisibilityChange);\n this._boundOnVisibilityChange = null;\n }\n\n if (this._boundOnPageHide) {\n window.removeEventListener('pagehide', this._boundOnPageHide);\n this._boundOnPageHide = null;\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _flush(trigger: string, meta?: unknown): RdrFlushResult {\n try {\n if (this._logQueue.length === 0) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n\n const entries = this._logQueue.slice();\n const count = entries.length;\n\n this._logQueue = [];\n\n const flushPayload: RdrFlushPayload = { trigger, entries };\n\n if (meta !== undefined) {\n flushPayload.meta = meta;\n }\n\n if (this._sendFn) {\n try {\n this._sendFn(flushPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RDR | flush | ${trigger}`, flushPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'flush', flushPayload);\n }\n\n return { initialized: this._initialized, flushed: true, entriesCount: count };\n } catch (_) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n }\n}\n\nconst rdr = new RDR();\n\nexport const initRDR = (config?: RdrConfig): boolean => {\n return rdr.init(config);\n};\n\nexport default rdr;\n\nexport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrSendFn,\n RdrKeyFactory,\n RdrConfig,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n ActionData,\n ActionSnapshot,\n RequestKeyResult,\n StructuredHashResult,\n HashLimitsConfig,\n EnvSnapshot,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n\nexport { hashText, makeRpcRequestKey, makeHttpRequestKey } from '../shared/hash';\nexport { VERSION } from './config';\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RT. */\nexport const CHROME_EXT_EVENT_NAME = 'rt';\n\n/** Console log event name. */\nexport const EVENT_NAME = 'cosmic_eye_route_transition';\n\n/** Regex for normalizing numeric path segments to :id. */\nexport const NORMALIZE_ID_REGEX = /\\/\\d+/g;\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 1,\n SAMPLING_STORAGE_KEY: 'rum_rt_id',\n CRITICAL_TIMEOUT_MS: 20_000,\n IDLE_TIMEOUT_MS: 1_500,\n RAF_COUNT: 2,\n} as const;\n","/** Generate a unique ID string. Uses crypto.randomUUID when available. */\nexport const generateId = (): string =>\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n","import { NORMALIZE_ID_REGEX } from './config';\n\nexport { nowMs } from '../shared/time';\nexport { generateId } from '../shared/generate-id';\n\nexport const normalizeRoute = (pathname: string): string =>\n pathname ? pathname.replace(NORMALIZE_ID_REGEX, '/:id') : '/';\n\nexport const afterFrames = (callback: () => void, count: number): void => {\n if (count <= 0) {\n callback();\n return;\n }\n\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => afterFrames(callback, count - 1));\n } else {\n setTimeout(() => afterFrames(callback, count - 1), 16);\n }\n};\n\nexport const whenIdle = (callback: () => void, timeout: number): void => {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(callback, { timeout });\n } else {\n setTimeout(callback, 0);\n }\n};\n","import { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, EVENT_NAME, CHROME_EXT_EVENT_NAME } from './config';\nimport { nowMs, normalizeRoute, afterFrames, whenIdle, generateId } from './utils';\nimport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtConfig,\n RtSendFn,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n} from './types';\nimport type { EnricherLimitsConfig } from '../shared/types';\n\nclass RT {\n private _currentTransition: Transition | null = null;\n private _criticalTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private _initialized = false;\n\n // Config-derived fields (set during init)\n private _criticalTimeoutMs: number = DEFAULTS.CRITICAL_TIMEOUT_MS;\n private _idleTimeoutMs: number = DEFAULTS.IDLE_TIMEOUT_MS;\n private _rafCount: number = DEFAULTS.RAF_COUNT;\n private _includePathname = false;\n private _includeSearch = false;\n private _sendFn: RtSendFn | null = null;\n private _enrichers: RtConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RtConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply config BEFORE setting _initialized\n this._applyConfig(config);\n\n // Sampling check\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n startTransition(pathname: string, search = ''): RtStartTransitionResult {\n if (!this._initialized) {\n return { initialized: false, started: false };\n }\n\n try {\n if (this._currentTransition && !this._currentTransition.sent) {\n this._currentTransition.aborted = true;\n }\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = {\n id: generateId(),\n startAt: nowMs(),\n renderedAt: null,\n interactiveAt: null,\n pathname,\n search,\n routeName: normalizeRoute(pathname),\n pendingCritical: 0,\n aborted: false,\n timedOut: false,\n sent: false,\n };\n\n this._criticalTimeoutId = setTimeout(() => {\n const t = this._currentTransition;\n\n if (t && !t.sent && !t.aborted) {\n t.timedOut = true;\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }\n }, this._criticalTimeoutMs);\n\n return { initialized: true, started: true };\n } catch (_) {\n return { initialized: true, started: false };\n }\n }\n\n markRendered(pathname: string): RtMarkRenderedResult {\n if (!this._initialized) {\n return { initialized: false, marked: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, marked: false };\n }\n\n if (t.pathname !== pathname || t.renderedAt !== null) {\n return { initialized: true, marked: false };\n }\n\n t.renderedAt = nowMs();\n this._checkInteractive();\n\n return { initialized: true, marked: true };\n } catch (_) {\n return { initialized: true, marked: false };\n }\n }\n\n trackCritical(promise?: Promise<unknown>): RtTrackCriticalResult {\n if (!this._initialized || !this._currentTransition) {\n const noopDone = typeof promise === 'undefined' ? () => {} : undefined;\n\n return { initialized: this._initialized, tracked: false, done: noopDone };\n }\n\n const t = this._currentTransition;\n\n t.pendingCritical++;\n\n const done = (): void => {\n if (t.pendingCritical > 0) {\n t.pendingCritical--;\n }\n\n if (t === this._currentTransition) {\n this._checkInteractive();\n }\n };\n\n if (promise && typeof promise.finally === 'function') {\n promise.finally(done);\n\n return { initialized: true, tracked: true };\n }\n\n return { initialized: true, tracked: true, done };\n }\n\n abortPending(reason?: string): RtAbortPendingResult {\n if (!this._initialized) {\n return { initialized: false, aborted: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, aborted: false };\n }\n\n t.aborted = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n // Send an abort event so the consumer knows\n const payload = this._buildPayload(t);\n payload.aborted = true;\n\n if (reason) {\n payload.abortReason = reason;\n }\n\n this._sendEventPayload({ type: 'abort', entry: payload });\n\n this._currentTransition = null;\n\n return { initialized: true, aborted: true };\n } catch (_) {\n return { initialized: true, aborted: false };\n }\n }\n\n destroy(): RtDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = null;\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RtConfig): void {\n if (!config) {\n return;\n }\n\n if (config.criticalTimeoutMs !== undefined) {\n this._criticalTimeoutMs = config.criticalTimeoutMs;\n }\n if (config.idleTimeoutMs !== undefined) {\n this._idleTimeoutMs = config.idleTimeoutMs;\n }\n if (config.rafCount !== undefined) {\n this._rafCount = config.rafCount;\n }\n if (config.includePathname !== undefined) {\n this._includePathname = config.includePathname;\n }\n if (config.includeSearch !== undefined) {\n this._includeSearch = config.includeSearch;\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _checkInteractive(): void {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted || t.renderedAt === null || t.pendingCritical > 0) {\n return;\n }\n\n afterFrames(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n whenIdle(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n if (t.pendingCritical > 0) {\n return;\n }\n\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }, this._idleTimeoutMs);\n }, this._rafCount);\n }\n\n private _finishTransition(transition: Transition): void {\n if (transition.sent || transition.aborted) {\n return;\n }\n\n transition.sent = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n const payload = this._buildPayload(transition);\n\n if (transition.timedOut) {\n payload.timedOut = true;\n }\n\n this._sendEventPayload({ type: 'transition', entry: payload });\n }\n\n private _buildPayload(transition: Transition): RTLogEntry {\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const payload: RTLogEntry = {\n ver: VERSION,\n id: transition.id,\n routeName: transition.routeName,\n routeRenderMs: transition.renderedAt !== null\n ? Math.round(transition.renderedAt - transition.startAt)\n : null,\n routeTtiMs: transition.interactiveAt !== null\n ? Math.round(transition.interactiveAt - transition.startAt)\n : null,\n };\n\n if (this._includePathname) {\n payload.pathname = transition.pathname;\n }\n\n if (this._includeSearch && transition.search) {\n payload.search = transition.search;\n }\n\n if (this._tag) {\n payload.tag = this._tag;\n }\n\n if (enrichments) {\n payload.enrichments = enrichments;\n }\n\n return payload;\n }\n\n private _sendEventPayload(eventPayload: RtEventPayload): void {\n try {\n if (this._sendFn) {\n try {\n this._sendFn(eventPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RT | ${eventPayload.type} | ${EVENT_NAME}`, eventPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, eventPayload.type, eventPayload);\n }\n } catch (_) {\n // nothing\n }\n }\n}\n\nconst rt = new RT();\n\nexport const initRT = (config?: RtConfig): boolean => {\n return rt.init(config);\n};\n\n/** Convenience wrapper for rt.trackCritical(). */\nexport const trackCritical = (promise?: Promise<unknown>): RtTrackCriticalResult => {\n return rt.trackCritical(promise);\n};\n\nexport default rt;\n\nexport { VERSION } from './config';\n\nexport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtSendFn,\n RtConfig,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n","import type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationEvent,\n NavigationListener,\n} from './types';\n\n/** WeakMap ensures idempotency — one observer per history object. */\nconst observers = new WeakMap<HistoryLike, HistoryRouteObserver>();\n\n/**\n * Parse string or object location into { pathname, search }.\n * Pure helper — no side effects, no imports from RT/RDR.\n */\nconst parseLocation = (\n pathOrLocation: string | Partial<HistoryLocation>,\n fallbackPathname: string,\n): { pathname: string; search: string } => {\n if (typeof pathOrLocation === 'string') {\n try {\n const url = new URL(pathOrLocation, 'http://localhost');\n return { pathname: url.pathname, search: url.search };\n } catch {\n return { pathname: pathOrLocation, search: '' };\n }\n }\n\n if (pathOrLocation && typeof pathOrLocation === 'object') {\n return {\n pathname: pathOrLocation.pathname || fallbackPathname,\n search: pathOrLocation.search || '',\n };\n }\n\n return { pathname: fallbackPathname, search: '' };\n};\n\n/**\n * Observe navigation events on a history-like object.\n *\n * - Patches `push` and `replace` to emit PUSH/REPLACE events **before** the original call.\n * - Subscribes to `history.listen` to catch POP (back/forward) events.\n * - Emits a single INIT event on first subscription.\n * - Idempotent via WeakMap — calling again with the same history returns the same observer.\n * - Fully neutral: no imports from RT or RDR.\n *\n * @example\n * ```ts\n * import { observeHistory } from 'cosmic-eye';\n *\n * const observer = observeHistory(history);\n * const unsub = observer.subscribe(({ pathname, search, action }) => {\n * console.log(action, pathname, search);\n * });\n * // later:\n * unsub();\n * observer.unpatch();\n * ```\n */\nexport function observeHistory(history: HistoryLike): HistoryRouteObserver {\n const existing = observers.get(history);\n\n if (existing) {\n return existing;\n }\n\n const listeners = new Set<NavigationListener>();\n let destroyed = false;\n\n const emit = (event: NavigationEvent): void => {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (_) {\n // listener errors must not break the observer\n }\n }\n };\n\n // --- Patch push ---\n const originalPush = history.push.bind(history);\n\n history.push = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'PUSH' });\n }\n return originalPush(pathOrLocation, state);\n };\n\n // --- Patch replace ---\n const originalReplace = history.replace.bind(history);\n\n history.replace = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'REPLACE' });\n }\n return originalReplace(pathOrLocation, state);\n };\n\n // --- Listen for POP (back/forward) only ---\n // PUSH and REPLACE are already emitted by patched methods above.\n // history.listen fires for ALL actions, so we filter to POP only to avoid duplicates.\n let unlisten: (() => void) | void;\n\n unlisten = history.listen((...args: unknown[]) => {\n if (destroyed) {\n return;\n }\n\n let location: HistoryLocation;\n let action: string;\n\n if (args.length >= 2 && typeof args[1] === 'string') {\n // history v4: callback(location, action)\n location = args[0] as HistoryLocation;\n action = args[1];\n } else if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\n // history v5: callback({ location, action })\n const update = args[0] as { location: HistoryLocation; action: string };\n location = update.location;\n action = update.action;\n } else {\n return;\n }\n\n // Only emit POP — PUSH/REPLACE are handled by patched methods\n if (action !== 'POP') {\n return;\n }\n\n emit({\n pathname: location.pathname,\n search: location.search || '',\n action: 'POP',\n });\n });\n\n // --- INIT event emitted once on first subscribe ---\n let initEmitted = false;\n\n const subscribe = (listener: NavigationListener): (() => void) => {\n listeners.add(listener);\n\n if (!initEmitted && !destroyed) {\n initEmitted = true;\n const { pathname, search } = history.location;\n emit({ pathname, search: search || '', action: 'INIT' });\n }\n\n return () => {\n listeners.delete(listener);\n };\n };\n\n const unpatch = (): void => {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n\n // Restore original methods\n history.push = originalPush;\n history.replace = originalReplace;\n\n // Call unlisten if available\n if (typeof unlisten === 'function') {\n unlisten();\n unlisten = undefined;\n }\n\n // Clear listeners\n listeners.clear();\n\n // Remove from WeakMap so a fresh observer can be created later\n observers.delete(history);\n };\n\n const observer: HistoryRouteObserver = { subscribe, unpatch };\n\n observers.set(history, observer);\n\n return observer;\n}\n\nexport type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationAction,\n NavigationEvent,\n NavigationListener,\n} from './types';\n","import { nowMs } from '../../shared/time';\nimport type { MobxSpySnapshot, MobxSpyConfig } from './types';\n\nconst DEFAULTS = {\n BUFFER_MAX_SIZE: 5,\n TRACKED_TYPES: ['action', 'reaction'] as readonly string[],\n} as const;\n\ninterface BufferAction {\n ts: number;\n name: string | null;\n storeName: string | null;\n}\n\ninterface BufferReaction {\n ts: number;\n name: string | null;\n}\n\nconst _actionsBuffer: BufferAction[] = [];\nconst _reactionsBuffer: BufferReaction[] = [];\nlet _disposer: (() => void) | null = null;\nlet _bufferMaxSize: number = DEFAULTS.BUFFER_MAX_SIZE;\nlet _trackedTypes: readonly string[] = DEFAULTS.TRACKED_TYPES;\n\nconst _getStoreName = (object: unknown): string | null => {\n if (!object) {\n return null;\n }\n\n try {\n const obj = object as { constructor?: { name?: string }; name?: string };\n return obj.constructor?.name || obj.name || null;\n } catch (_) {\n return null;\n }\n};\n\nconst _onSpyEvent = (event: { type: string; name?: string; object?: unknown }): void => {\n try {\n const type = event.type;\n\n if (!_trackedTypes.includes(type)) {\n return;\n }\n\n if (type === 'action') {\n if (_actionsBuffer.length >= _bufferMaxSize) {\n _actionsBuffer.length = 0;\n }\n\n _actionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n storeName: _getStoreName(event.object),\n });\n }\n\n if (type === 'reaction') {\n if (_reactionsBuffer.length >= _bufferMaxSize) {\n _reactionsBuffer.length = 0;\n }\n\n _reactionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n });\n }\n } catch (_) {\n // nothing\n }\n};\n\n/**\n * MobX spy extension.\n *\n * If mobx is not installed, all methods are safe no-ops.\n * Designed to be used as a presend enricher via `mobxSpy.snapshot()`.\n */\nexport const mobxSpy = {\n init(config?: MobxSpyConfig): void {\n if (_disposer) {\n return;\n }\n\n _bufferMaxSize = config?.bufferMaxSize ?? DEFAULTS.BUFFER_MAX_SIZE;\n _trackedTypes = config?.trackedTypes ?? DEFAULTS.TRACKED_TYPES;\n\n try {\n // Dynamic import to avoid fatal error when mobx is not installed.\n // mobx is an optional peer dependency — may not exist at runtime.\n const moduleName = 'mobx';\n\n void import(moduleName).then((mobx: { spy?: (listener: (event: never) => void) => () => void }) => {\n if (_disposer) return; // already initialized by another call\n if (typeof mobx?.spy === 'function') {\n _disposer = mobx.spy(_onSpyEvent as (event: never) => void);\n }\n }).catch(() => {\n // mobx not available — no-op\n });\n } catch (_) {\n // mobx not available — no-op\n }\n },\n\n reset(): void {\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n\n snapshot(currentTime?: number): MobxSpySnapshot {\n const now = currentTime ?? nowMs();\n const lastAction = _actionsBuffer[_actionsBuffer.length - 1] || null;\n const lastReaction = _reactionsBuffer[_reactionsBuffer.length - 1] || null;\n\n const result: MobxSpySnapshot = {\n lastAction: null,\n lastReaction: null,\n };\n\n if (lastAction) {\n result.lastAction = {\n name: lastAction.name,\n storeName: lastAction.storeName,\n timeSinceMs: now - lastAction.ts,\n };\n }\n\n if (lastReaction) {\n result.lastReaction = {\n name: lastReaction.name,\n timeSinceMs: now - lastReaction.ts,\n };\n }\n\n return result;\n },\n\n destroy(): void {\n if (_disposer) {\n try {\n _disposer();\n } catch (_) {\n // nothing\n }\n _disposer = null;\n }\n\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n};\n\nexport type { MobxSpySnapshot, MobxSpyConfig, MobxActionEntry, MobxReactionEntry } from './types';\n"]}
1
+ {"version":3,"sources":["../src/shared/hash.ts","../src/shared/time.ts","../src/shared/env.ts","../src/shared/sampling.ts","../src/shared/enrichers.ts","../src/shared/chrome-ext.ts","../src/rdr/config.ts","../src/rdr/actions.ts","../src/rdr/index.ts","../src/rt/config.ts","../src/shared/generate-id.ts","../src/rt/utils.ts","../src/rt/index.ts","../src/extensions/history-route-observer/index.ts","../src/extensions/mobx-spy/index.ts"],"names":["VERSION","CHROME_EXT_EVENT_NAME","DEFAULTS","_bufferMaxSize"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { HashLimitsConfig, RequestKeyResult, StructuredHashResult } from './types';\n\nexport const DEFAULT_HASH_LIMITS: HashLimitsConfig = {\n MAX_DEPTH: 20,\n MAX_NODES: 5_000,\n MAX_OBJECT_KEYS: 300,\n MAX_ARRAY_ITEMS: 1_000,\n MAX_STRING_CHARS: 2_048,\n} as const;\n\nconst HASH_SEED = 0x811c9dc5;\nconst HASH_PRIME = 0x01000193;\n\ninterface Hasher {\n write: (text: string) => void;\n hex: () => string;\n}\n\nconst _makeHasher = (): Hasher => {\n let state = HASH_SEED;\n\n const write = (text: string): void => {\n const value = String(text);\n for (let i = 0; i < value.length; i++) {\n state ^= value.charCodeAt(i);\n state = Math.imul(state, HASH_PRIME) >>> 0;\n }\n };\n\n const hex = (): string => (state >>> 0).toString(16).padStart(8, '0');\n\n return { write, hex };\n};\n\nexport const hashText = (text: string): string => {\n const hasher = _makeHasher();\n hasher.write(text);\n return hasher.hex();\n};\n\nexport const hashStructuredData = (\n input: unknown,\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): StructuredHashResult => {\n const pathObjects = new WeakSet();\n const hasher = _makeHasher();\n let nodesVisited = 0;\n let wasTruncated = false;\n\n const writeToken = (token: string): void => {\n hasher.write(token);\n };\n\n const writeString = (str: string): void => {\n writeToken('str:');\n if (str.length > limits.MAX_STRING_CHARS) {\n wasTruncated = true;\n writeToken(str.slice(0, limits.MAX_STRING_CHARS));\n writeToken(`#len=${str.length}`);\n return;\n }\n writeToken(str);\n };\n\n const writeNumber = (num: number): void => {\n if (Number.isNaN(num)) {\n writeToken('num:NaN');\n return;\n }\n if (num === Infinity) {\n writeToken('num:Infinity');\n return;\n }\n if (num === -Infinity) {\n writeToken('num:-Infinity');\n return;\n }\n if (Object.is(num, -0)) {\n writeToken('num:-0');\n return;\n }\n\n writeToken(`num:${num}`);\n };\n\n const walk = (value: unknown, depth: number): void => {\n if (nodesVisited++ >= limits.MAX_NODES) {\n wasTruncated = true;\n writeToken('[maxNodes]');\n return;\n }\n\n if (depth > limits.MAX_DEPTH) {\n wasTruncated = true;\n writeToken('[maxDepth]');\n return;\n }\n\n if (value === null) {\n writeToken('null');\n return;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n return writeString(value as string);\n }\n if (type === 'number') {\n return writeNumber(value as number);\n }\n if (type === 'boolean') {\n writeToken(value ? 'bool:true' : 'bool:false');\n return;\n }\n if (type === 'bigint') {\n writeToken(`bigint:${(value as bigint).toString()}`);\n return;\n }\n if (type === 'undefined') {\n writeToken('undef');\n return;\n }\n if (type === 'symbol') {\n writeToken(`symbol:${String(value)}`);\n return;\n }\n if (type === 'function') {\n writeToken('function');\n return;\n }\n\n if (value instanceof Date) {\n const ts = value.getTime();\n\n if (Number.isNaN(ts)) {\n wasTruncated = true;\n writeToken('date:Invalid');\n return;\n }\n\n writeToken('date:');\n writeToken(value.toISOString());\n return;\n }\n\n const obj = value as object;\n\n if (pathObjects.has(obj)) {\n wasTruncated = true;\n writeToken('[circular]');\n return;\n }\n\n pathObjects.add(obj);\n\n try {\n if (Array.isArray(obj)) {\n writeToken('[');\n const itemsToHash = Math.min(obj.length, limits.MAX_ARRAY_ITEMS);\n\n if (obj.length > itemsToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < itemsToHash; i++) {\n writeToken(`i:${i}|`);\n walk(obj[i], depth + 1);\n writeToken(';');\n }\n\n if (obj.length > itemsToHash) {\n writeToken(`#len=${obj.length}`);\n }\n writeToken(']');\n return;\n }\n\n writeToken('{');\n\n const sortedKeys = Object.keys(obj).sort();\n const keysToHash = Math.min(sortedKeys.length, limits.MAX_OBJECT_KEYS);\n\n if (sortedKeys.length > keysToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < keysToHash; i++) {\n const key = sortedKeys[i];\n const propValue = (obj as Record<string, unknown>)[key];\n\n if (propValue === undefined) {\n continue;\n }\n\n writeToken('k:');\n writeString(key);\n writeToken('|v:');\n walk(propValue, depth + 1);\n writeToken(';');\n }\n\n if (sortedKeys.length > keysToHash) {\n writeToken(`#keys=${sortedKeys.length}`);\n }\n writeToken('}');\n } catch (_) {\n wasTruncated = true;\n writeToken('[unhashableObject]');\n } finally {\n pathObjects.delete(obj);\n }\n };\n\n walk(input, 0);\n\n return {\n hashHex: hasher.hex(),\n wasTruncated,\n nodesVisited,\n };\n};\n\n/** Generate a request fingerprint for RPC-style requests (service + method + params + body). */\nexport const makeRpcRequestKey = (\n apiMessage: { s?: string; m?: string; p?: unknown; b?: unknown },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const serviceName = String(apiMessage?.s ?? '');\n const methodName = String(apiMessage?.m ?? '');\n const endpoint = `${serviceName}.${methodName}`;\n const endpointHash = hashText(endpoint);\n const paramsHash = hashStructuredData(apiMessage?.p ?? {}, limits);\n const bodyHash = hashStructuredData(apiMessage?.b ?? {}, limits);\n\n const truncationMask = (paramsHash.wasTruncated ? 1 : 0) | (bodyHash.wasTruncated ? 2 : 0);\n\n return {\n endpoint,\n reqHash: `req_${endpointHash}_${paramsHash.hashHex}_${bodyHash.hashHex}_${truncationMask}`,\n };\n};\n\n/**\n * Generate a request fingerprint for HTTP-style requests (method + endpoint URL + body text).\n * httpMethod is included in the hash to avoid false collisions (e.g. GET vs POST to same URL).\n */\nexport const makeHttpRequestKey = (\n request: { httpMethod: string; endpoint: string; bodyText?: string },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const method = String(request.httpMethod ?? '').toUpperCase();\n const endpoint = String(request.endpoint ?? '');\n const bodyText = String(request.bodyText ?? '');\n\n const endpointWithMethod = `${method}:${endpoint}`;\n const endpointHash = hashText(endpointWithMethod);\n\n const truncatedBody = bodyText.length > limits.MAX_STRING_CHARS\n ? bodyText.slice(0, limits.MAX_STRING_CHARS)\n : bodyText;\n const bodyHash = hashText(truncatedBody);\n const wasTruncated = bodyText.length > limits.MAX_STRING_CHARS;\n\n const truncationMask = wasTruncated ? 2 : 0;\n\n return {\n endpoint: endpointWithMethod,\n reqHash: `req_${endpointHash}_${bodyHash}_${truncationMask}`,\n };\n};\n","/** Shared time utilities used by rdr, rt, and extensions. All values in milliseconds. */\n\n/**\n * Current high-resolution timestamp in milliseconds.\n * Uses performance.now() when available, falls back to Date.now().\n * Result is always rounded to the nearest integer.\n */\nexport const nowMs = (): number => {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return Math.round(performance.now());\n }\n\n return Date.now();\n};\n\n/**\n * Elapsed time in milliseconds since a given timestamp.\n * Both `since` and the result are rounded integers.\n */\nexport const elapsedMs = (since: number): number => {\n const current = nowMs();\n const sinceRounded = typeof since === 'number' ? Math.round(since) : 0;\n\n return current - sinceRounded;\n};\n","import type { EnvSnapshot, NavigatorWithConnection } from './types';\n\nexport const env = {\n snapshot(): EnvSnapshot {\n const result: EnvSnapshot = {\n visibility: 'unknown',\n net: null,\n };\n\n try {\n if (typeof document !== 'undefined' && document.visibilityState) {\n result.visibility = document.visibilityState;\n }\n } catch (_) {\n // nothing\n }\n\n try {\n const nav = navigator as NavigatorWithConnection;\n const conn = nav?.connection || nav?.mozConnection || nav?.webkitConnection;\n\n if (conn) {\n result.net = {\n effectiveType: conn.effectiveType || null,\n };\n }\n } catch (_) {\n // nothing\n }\n\n return result;\n },\n};\n","import { hashText } from './hash';\nimport type { SamplingConfig } from './types';\n\n/**\n * Determine whether a client should be sampled, based on config.\n * Fully config-driven — no implicit dev exceptions.\n *\n * @param config.rate — sampling rate (0..1). 1 = always enabled, 0 = always disabled.\n * @param config.storageKey — localStorage key for persisting client ID.\n * @param config.clientId — optional explicit client ID (overrides localStorage).\n * @returns true if this client is sampled.\n */\nexport const shouldEnableSample = (config: SamplingConfig): boolean => {\n try {\n if (config.rate >= 1) {\n return true;\n }\n\n if (config.rate <= 0) {\n return false;\n }\n\n const id = getClientId(config);\n const h = hashText(id);\n const bucket = (parseInt(h, 16) % 10_000) / 10_000;\n\n return bucket < config.rate;\n } catch (_) {\n return false;\n }\n};\n\n/**\n * Resolve client ID: explicit config > localStorage > generate new.\n */\nexport const getClientId = (config: SamplingConfig): string => {\n if (config.clientId) {\n return config.clientId;\n }\n\n try {\n const stored = localStorage.getItem(config.storageKey);\n\n if (stored) {\n return stored;\n }\n\n const generated = crypto?.randomUUID?.() || String(Math.random()) + String(Date.now());\n localStorage.setItem(config.storageKey, generated);\n\n return generated;\n } catch (_) {\n return String(Math.random()) + String(Date.now());\n }\n};\n","import { nowMs } from './time';\nimport type { Enricher, EnricherLimitsConfig } from './types';\n\nexport const DEFAULT_ENRICHER_LIMITS: EnricherLimitsConfig = {\n maxDepth: 5,\n maxStringChars: 1_024,\n} as const;\n\n/**\n * Run all enrichers and collect results into a record.\n * Each getter is called synchronously with try/catch.\n * If a getter throws, the entry is set to `{ error: 'enricher_failed' }`.\n * Output values are truncated according to limits.\n */\nexport const collectEnrichers = (\n enrichers: Enricher[] | undefined,\n limits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS,\n): Record<string, unknown> | undefined => {\n if (!enrichers || enrichers.length === 0) {\n return undefined;\n }\n\n const result: Record<string, unknown> = {};\n const currentTime = nowMs();\n\n for (const enricher of enrichers) {\n try {\n const value = enricher.get(currentTime);\n result[enricher.name] = truncateValue(value, limits.maxDepth, limits.maxStringChars, 0);\n } catch (_) {\n result[enricher.name] = { error: 'enricher_failed' };\n }\n }\n\n return result;\n};\n\n/** Recursively truncate a value to enforce depth and string limits. */\nconst truncateValue = (\n value: unknown,\n maxDepth: number,\n maxStringChars: number,\n depth: number,\n): unknown => {\n if (depth > maxDepth) {\n return '[maxDepth]';\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n const str = value as string;\n return str.length > maxStringChars ? str.slice(0, maxStringChars) + '...' : str;\n }\n\n if (type === 'number' || type === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => truncateValue(item, maxDepth, maxStringChars, depth + 1));\n }\n\n if (type === 'object') {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = truncateValue(\n (value as Record<string, unknown>)[key],\n maxDepth,\n maxStringChars,\n depth + 1,\n );\n }\n\n return result;\n }\n\n return String(value);\n};\n","/**\n * Dispatch a CustomEvent to window for chrome extension integration.\n * @param eventName — 'rdr' or 'rt'\n * @param type — event type, e.g. 'flush', 'event', 'reset'\n * @param data — payload data\n */\nexport const dispatchExtensionEvent = (\n eventName: string,\n type: string,\n data: unknown,\n): void => {\n try {\n window.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { type, data },\n }),\n );\n } catch (_) {\n // nothing\n }\n};\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RDR. */\nexport const CHROME_EXT_EVENT_NAME = 'rdr';\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 0.05,\n SAMPLING_STORAGE_KEY: 'rum_user_id',\n DUPLICATE_THRESHOLD_MS: 1_000,\n CLEANUP_INTERVAL_MS: 10_000,\n FLUSH_INTERVAL_MS: 15_000,\n FLUSH_MAX_EVENTS: 50,\n ACTIONS_BUFFER_MAX_SIZE: 3,\n ACTIONS_TRACKED_EVENTS: ['click', 'keydown', 'touchstart'] as readonly string[],\n} as const;\n","import { nowMs } from '../shared/time';\nimport { DEFAULTS } from './config';\nimport type { ActionData, ActionSnapshot } from './types';\n\ninterface BufferEntry {\n ts: number;\n type: string;\n rum_id: string | null;\n}\n\nconst _buffer: BufferEntry[] = [];\nlet _listenersAttached = false;\nlet _bufferMaxSize: number = DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\nlet _trackedEvents: readonly string[] = DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\nconst _getRumId = (target: EventTarget | null): string | null => {\n try {\n if (!target || typeof (target as HTMLElement).closest !== 'function') {\n return null;\n }\n\n const el = (target as HTMLElement).closest('[rum-id]');\n\n return el ? el.getAttribute('rum-id') : null;\n } catch (_) {\n return null;\n }\n};\n\nconst _reset = (): void => {\n _buffer.length = 0;\n};\n\nconst _onEvent = (e: Event): void => {\n try {\n if (_buffer.length >= _bufferMaxSize) {\n _reset();\n }\n\n _buffer.push({\n ts: nowMs(),\n type: e.type,\n rum_id: _getRumId(e.target),\n });\n } catch (_) {\n // nothing\n }\n};\n\nexport const actions = {\n init(bufferMaxSize?: number, trackedEvents?: string[]): void {\n if (_listenersAttached) {\n return;\n }\n\n _bufferMaxSize = bufferMaxSize ?? DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\n _trackedEvents = trackedEvents ?? DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\n try {\n for (const eventType of _trackedEvents) {\n window.addEventListener(eventType, _onEvent, { capture: true, passive: true });\n }\n _listenersAttached = true;\n } catch (_) {\n // nothing\n }\n },\n\n reset(): void {\n _reset();\n },\n\n snapshot(currentTime: number): ActionSnapshot {\n const last = _buffer[_buffer.length - 1] || null;\n\n if (!last) {\n return {\n lastAction: null,\n timeSinceLastActionMs: null,\n };\n }\n\n const actionData: ActionData = { type: last.type };\n\n if (last.rum_id) {\n actionData.rum_id = last.rum_id;\n }\n\n return {\n lastAction: actionData,\n timeSinceLastActionMs: currentTime - last.ts,\n };\n },\n\n destroy(): void {\n if (!_listenersAttached) {\n return;\n }\n\n try {\n for (const eventType of _trackedEvents) {\n window.removeEventListener(eventType, _onEvent, { capture: true });\n }\n _listenersAttached = false;\n _reset();\n } catch (_) {\n // nothing\n }\n },\n};\n","import { makeRpcRequestKey, makeHttpRequestKey, DEFAULT_HASH_LIMITS } from '../shared/hash';\nimport { nowMs, elapsedMs } from '../shared/time';\nimport { env } from '../shared/env';\nimport { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, CHROME_EXT_EVENT_NAME } from './config';\nimport { actions } from './actions';\nimport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrConfig,\n RdrSendFn,\n RdrKeyFactory,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n} from './types';\nimport type { HashLimitsConfig, RequestKeyResult, EnricherLimitsConfig } from '../shared/types';\n\nclass RDR {\n private _requestsMap = new Map<string, number>();\n private _logQueue: RdrLogEntry[] = [];\n private _cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _initialized = false;\n private _pageLoadTime: number | null = null;\n private _boundOnVisibilityChange: (() => void) | null = null;\n private _boundOnPageHide: (() => void) | null = null;\n\n // Config-derived fields (set during init)\n private _duplicateThresholdMs: number = DEFAULTS.DUPLICATE_THRESHOLD_MS;\n private _cleanupIntervalMs: number = DEFAULTS.CLEANUP_INTERVAL_MS;\n private _flushIntervalMs: number = DEFAULTS.FLUSH_INTERVAL_MS;\n private _flushMaxEvents: number = DEFAULTS.FLUSH_MAX_EVENTS;\n private _hashLimits: HashLimitsConfig = DEFAULT_HASH_LIMITS;\n private _sendFn: RdrSendFn | null = null;\n private _rpcKeyFactory: RdrKeyFactory | null = null;\n private _httpKeyFactory: RdrKeyFactory | null = null;\n private _enrichers: RdrConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RdrConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply and validate config BEFORE setting _initialized\n this._applyConfig(config);\n\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n this._pageLoadTime = nowMs();\n actions.init(config?.actionsBufferMaxSize, config?.actionsTrackedEvents);\n this._startCleanupInterval();\n this._startFlushInterval();\n this._attachLifecycleListeners();\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n reqHandlerRpc(payload: RpcRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.s || !payload?.m) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._rpcKeyFactory) {\n try {\n reqData = this._rpcKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genRpcHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n reqHandlerHttp(payload: HttpRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.httpMethod || !payload?.endpoint) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._httpKeyFactory) {\n try {\n reqData = this._httpKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genHttpHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n flush(trigger = 'manual', meta?: unknown): RdrFlushResult {\n if (!this._initialized) {\n return { initialized: false, flushed: false, entriesCount: 0 };\n }\n\n return this._flush(trigger, meta);\n }\n\n resetTiming(): RdrResetTimingResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n this._pageLoadTime = nowMs();\n\n return { initialized: true, reset: true };\n }\n\n resetActions(): RdrResetActionsResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n actions.reset();\n\n return { initialized: true, reset: true };\n }\n\n destroy(): RdrDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._cleanupTimer) {\n clearInterval(this._cleanupTimer);\n this._cleanupTimer = null;\n }\n\n if (this._flushTimer) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n\n this._detachLifecycleListeners();\n this._flush('destroy');\n actions.destroy();\n this._requestsMap.clear();\n this._logQueue = [];\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RdrConfig): void {\n if (!config) {\n return;\n }\n\n if (config.duplicateThresholdMs !== undefined) {\n this._duplicateThresholdMs = config.duplicateThresholdMs;\n }\n if (config.cleanupIntervalMs !== undefined) {\n this._cleanupIntervalMs = config.cleanupIntervalMs;\n }\n if (config.flushIntervalMs !== undefined) {\n this._flushIntervalMs = config.flushIntervalMs;\n }\n if (config.flushMaxEvents !== undefined) {\n this._flushMaxEvents = config.flushMaxEvents;\n }\n if (config.hashLimits) {\n this._hashLimits = { ...DEFAULT_HASH_LIMITS, ...config.hashLimits };\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.rpcKeyFactory) {\n this._rpcKeyFactory = config.rpcKeyFactory;\n }\n if (config.httpKeyFactory) {\n this._httpKeyFactory = config.httpKeyFactory;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _processRequest(reqData: RequestKeyResult): RdrReqHandlerResult {\n const currentTime = nowMs();\n const lastRequestTime = this._requestsMap.get(reqData.reqHash);\n let isDuplicate = false;\n\n if (lastRequestTime !== undefined) {\n const timeDiff = elapsedMs(lastRequestTime);\n\n if (timeDiff < this._duplicateThresholdMs) {\n this._addToLogQueue(reqData, currentTime, timeDiff);\n isDuplicate = true;\n }\n }\n\n this._requestsMap.set(reqData.reqHash, currentTime);\n\n return { initialized: true, processed: true, duplicate: isDuplicate };\n }\n\n private _genRpcHash(payload: RpcRequestPayload): RequestKeyResult | null {\n try {\n return makeRpcRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _genHttpHash(payload: HttpRequestPayload): RequestKeyResult | null {\n try {\n return makeHttpRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _addToLogQueue(reqData: RequestKeyResult, currentTime: number, timeDiff: number): void {\n try {\n const actionsSnapshot = actions.snapshot(currentTime);\n const envSnapshot = env.snapshot();\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const logEntry: RdrLogEntry = {\n ver: VERSION,\n endpoint: reqData.endpoint,\n reqHash: reqData.reqHash,\n deltaMs: timeDiff,\n timings: {\n timeSincePageLoadMs: elapsedMs(this._pageLoadTime!),\n timeSinceLastActionMs: actionsSnapshot.timeSinceLastActionMs,\n },\n lastAction: actionsSnapshot.lastAction,\n env: envSnapshot,\n };\n\n if (this._tag) {\n logEntry.tag = this._tag;\n }\n\n if (enrichments) {\n logEntry.enrichments = enrichments;\n }\n\n this._logQueue.push(logEntry);\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'log', logEntry);\n }\n\n if (this._logQueue.length >= this._flushMaxEvents) {\n this._flush('threshold');\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startCleanupInterval(): void {\n if (this._cleanupTimer) {\n return;\n }\n\n this._cleanupTimer = setInterval(() => {\n this._cleanupOldRequests();\n }, this._cleanupIntervalMs);\n }\n\n private _cleanupOldRequests(): void {\n try {\n const currentTime = nowMs();\n const threshold = currentTime - this._duplicateThresholdMs;\n\n for (const [hash, timestamp] of this._requestsMap) {\n if (timestamp < threshold) {\n this._requestsMap.delete(hash);\n }\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startFlushInterval(): void {\n if (this._flushTimer) {\n return;\n }\n\n this._flushTimer = setInterval(() => {\n this._flush('interval');\n }, this._flushIntervalMs);\n }\n\n private _attachLifecycleListeners(): void {\n try {\n this._boundOnVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this._flush('visibilitychange');\n }\n };\n\n this._boundOnPageHide = () => {\n this._flush('pagehide');\n };\n\n document.addEventListener('visibilitychange', this._boundOnVisibilityChange);\n window.addEventListener('pagehide', this._boundOnPageHide);\n } catch (_) {\n // nothing\n }\n }\n\n private _detachLifecycleListeners(): void {\n try {\n if (this._boundOnVisibilityChange) {\n document.removeEventListener('visibilitychange', this._boundOnVisibilityChange);\n this._boundOnVisibilityChange = null;\n }\n\n if (this._boundOnPageHide) {\n window.removeEventListener('pagehide', this._boundOnPageHide);\n this._boundOnPageHide = null;\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _flush(trigger: string, meta?: unknown): RdrFlushResult {\n try {\n if (this._logQueue.length === 0) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n\n const entries = this._logQueue.slice();\n const count = entries.length;\n\n this._logQueue = [];\n\n const flushPayload: RdrFlushPayload = { trigger, entries };\n\n if (meta !== undefined) {\n flushPayload.meta = meta;\n }\n\n if (this._sendFn) {\n try {\n this._sendFn(flushPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RDR | flush | ${trigger}`, flushPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'flush', flushPayload);\n }\n\n return { initialized: this._initialized, flushed: true, entriesCount: count };\n } catch (_) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n }\n}\n\nconst rdr = new RDR();\n\nexport const initRDR = (config?: RdrConfig): boolean => {\n return rdr.init(config);\n};\n\nexport default rdr;\n\nexport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrSendFn,\n RdrKeyFactory,\n RdrConfig,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n ActionData,\n ActionSnapshot,\n RequestKeyResult,\n StructuredHashResult,\n HashLimitsConfig,\n EnvSnapshot,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n\nexport { hashText, makeRpcRequestKey, makeHttpRequestKey } from '../shared/hash';\nexport { VERSION } from './config';\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RT. */\nexport const CHROME_EXT_EVENT_NAME = 'rt';\n\n/** Console log event name. */\nexport const EVENT_NAME = 'cosmic_eye_route_transition';\n\n/** Regex for normalizing numeric path segments to :id. */\nexport const NORMALIZE_ID_REGEX = /\\/\\d+/g;\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 0.05,\n SAMPLING_STORAGE_KEY: 'rum_rt_id',\n CRITICAL_TIMEOUT_MS: 20_000,\n IDLE_TIMEOUT_MS: 1_500,\n RAF_COUNT: 2,\n} as const;\n","/** Generate a unique ID string. Uses crypto.randomUUID when available. */\nexport const generateId = (): string =>\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n","import { NORMALIZE_ID_REGEX } from './config';\n\nexport { nowMs } from '../shared/time';\nexport { generateId } from '../shared/generate-id';\n\nexport const normalizeRoute = (pathname: string): string =>\n pathname ? pathname.replace(NORMALIZE_ID_REGEX, '/:id') : '/';\n\nexport const afterFrames = (callback: () => void, count: number): void => {\n if (count <= 0) {\n callback();\n return;\n }\n\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => afterFrames(callback, count - 1));\n } else {\n setTimeout(() => afterFrames(callback, count - 1), 16);\n }\n};\n\nexport const whenIdle = (callback: () => void, timeout: number): void => {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(callback, { timeout });\n } else {\n setTimeout(callback, 0);\n }\n};\n","import { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, EVENT_NAME, CHROME_EXT_EVENT_NAME } from './config';\nimport { nowMs, normalizeRoute, afterFrames, whenIdle, generateId } from './utils';\nimport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtConfig,\n RtSendFn,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n} from './types';\nimport type { EnricherLimitsConfig } from '../shared/types';\n\nclass RT {\n private _currentTransition: Transition | null = null;\n private _criticalTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private _initialized = false;\n\n // Config-derived fields (set during init)\n private _criticalTimeoutMs: number = DEFAULTS.CRITICAL_TIMEOUT_MS;\n private _idleTimeoutMs: number = DEFAULTS.IDLE_TIMEOUT_MS;\n private _rafCount: number = DEFAULTS.RAF_COUNT;\n private _includePathname = false;\n private _includeSearch = false;\n private _sendFn: RtSendFn | null = null;\n private _enrichers: RtConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RtConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply config BEFORE setting _initialized\n this._applyConfig(config);\n\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n startTransition(pathname: string, search = ''): RtStartTransitionResult {\n if (!this._initialized) {\n return { initialized: false, started: false };\n }\n\n try {\n if (this._currentTransition && !this._currentTransition.sent) {\n this._currentTransition.aborted = true;\n }\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = {\n id: generateId(),\n startAt: nowMs(),\n renderedAt: null,\n interactiveAt: null,\n pathname,\n search,\n routeName: normalizeRoute(pathname),\n pendingCritical: 0,\n aborted: false,\n timedOut: false,\n sent: false,\n };\n\n this._criticalTimeoutId = setTimeout(() => {\n const t = this._currentTransition;\n\n if (t && !t.sent && !t.aborted) {\n t.timedOut = true;\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }\n }, this._criticalTimeoutMs);\n\n return { initialized: true, started: true };\n } catch (_) {\n return { initialized: true, started: false };\n }\n }\n\n markRendered(pathname: string): RtMarkRenderedResult {\n if (!this._initialized) {\n return { initialized: false, marked: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, marked: false };\n }\n\n if (t.pathname !== pathname || t.renderedAt !== null) {\n return { initialized: true, marked: false };\n }\n\n t.renderedAt = nowMs();\n this._checkInteractive();\n\n return { initialized: true, marked: true };\n } catch (_) {\n return { initialized: true, marked: false };\n }\n }\n\n trackCritical(promise?: Promise<unknown>): RtTrackCriticalResult {\n if (!this._initialized || !this._currentTransition) {\n const noopDone = typeof promise === 'undefined' ? () => {} : undefined;\n\n return { initialized: this._initialized, tracked: false, done: noopDone };\n }\n\n const t = this._currentTransition;\n\n t.pendingCritical++;\n\n const done = (): void => {\n if (t.pendingCritical > 0) {\n t.pendingCritical--;\n }\n\n if (t === this._currentTransition) {\n this._checkInteractive();\n }\n };\n\n if (promise && typeof promise.finally === 'function') {\n promise.finally(done);\n\n return { initialized: true, tracked: true };\n }\n\n return { initialized: true, tracked: true, done };\n }\n\n abortPending(reason?: string): RtAbortPendingResult {\n if (!this._initialized) {\n return { initialized: false, aborted: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, aborted: false };\n }\n\n t.aborted = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n // Send an abort event so the consumer knows\n const payload = this._buildPayload(t);\n payload.aborted = true;\n\n if (reason) {\n payload.abortReason = reason;\n }\n\n this._sendEventPayload({ type: 'abort', entry: payload });\n\n this._currentTransition = null;\n\n return { initialized: true, aborted: true };\n } catch (_) {\n return { initialized: true, aborted: false };\n }\n }\n\n destroy(): RtDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = null;\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RtConfig): void {\n if (!config) {\n return;\n }\n\n if (config.criticalTimeoutMs !== undefined) {\n this._criticalTimeoutMs = config.criticalTimeoutMs;\n }\n if (config.idleTimeoutMs !== undefined) {\n this._idleTimeoutMs = config.idleTimeoutMs;\n }\n if (config.rafCount !== undefined) {\n this._rafCount = config.rafCount;\n }\n if (config.includePathname !== undefined) {\n this._includePathname = config.includePathname;\n }\n if (config.includeSearch !== undefined) {\n this._includeSearch = config.includeSearch;\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _checkInteractive(): void {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted || t.renderedAt === null || t.pendingCritical > 0) {\n return;\n }\n\n afterFrames(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n whenIdle(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n if (t.pendingCritical > 0) {\n return;\n }\n\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }, this._idleTimeoutMs);\n }, this._rafCount);\n }\n\n private _finishTransition(transition: Transition): void {\n if (transition.sent || transition.aborted) {\n return;\n }\n\n transition.sent = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n const payload = this._buildPayload(transition);\n\n if (transition.timedOut) {\n payload.timedOut = true;\n }\n\n this._sendEventPayload({ type: 'transition', entry: payload });\n }\n\n private _buildPayload(transition: Transition): RTLogEntry {\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const payload: RTLogEntry = {\n ver: VERSION,\n id: transition.id,\n routeName: transition.routeName,\n routeRenderMs: transition.renderedAt !== null\n ? Math.round(transition.renderedAt - transition.startAt)\n : null,\n routeTtiMs: transition.interactiveAt !== null\n ? Math.round(transition.interactiveAt - transition.startAt)\n : null,\n };\n\n if (this._includePathname) {\n payload.pathname = transition.pathname;\n }\n\n if (this._includeSearch && transition.search) {\n payload.search = transition.search;\n }\n\n if (this._tag) {\n payload.tag = this._tag;\n }\n\n if (enrichments) {\n payload.enrichments = enrichments;\n }\n\n return payload;\n }\n\n private _sendEventPayload(eventPayload: RtEventPayload): void {\n try {\n if (this._sendFn) {\n try {\n this._sendFn(eventPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RT | ${eventPayload.type} | ${EVENT_NAME}`, eventPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, eventPayload.type, eventPayload);\n }\n } catch (_) {\n // nothing\n }\n }\n}\n\nconst rt = new RT();\n\nexport const initRT = (config?: RtConfig): boolean => {\n return rt.init(config);\n};\n\n/** Convenience wrapper for rt.trackCritical(). */\nexport const trackCritical = (promise?: Promise<unknown>): RtTrackCriticalResult => {\n return rt.trackCritical(promise);\n};\n\nexport default rt;\n\nexport { VERSION } from './config';\n\nexport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtSendFn,\n RtConfig,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n","import type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationEvent,\n NavigationListener,\n} from './types';\n\n/** WeakMap ensures idempotency — one observer per history object. */\nconst observers = new WeakMap<HistoryLike, HistoryRouteObserver>();\n\n/**\n * Parse string or object location into { pathname, search }.\n * Pure helper — no side effects, no imports from RT/RDR.\n */\nconst parseLocation = (\n pathOrLocation: string | Partial<HistoryLocation>,\n fallbackPathname: string,\n): { pathname: string; search: string } => {\n if (typeof pathOrLocation === 'string') {\n try {\n const url = new URL(pathOrLocation, 'http://localhost');\n return { pathname: url.pathname, search: url.search };\n } catch {\n return { pathname: pathOrLocation, search: '' };\n }\n }\n\n if (pathOrLocation && typeof pathOrLocation === 'object') {\n return {\n pathname: pathOrLocation.pathname || fallbackPathname,\n search: pathOrLocation.search || '',\n };\n }\n\n return { pathname: fallbackPathname, search: '' };\n};\n\n/**\n * Observe navigation events on a history-like object.\n *\n * - Patches `push` and `replace` to emit PUSH/REPLACE events **before** the original call.\n * - Subscribes to `history.listen` to catch POP (back/forward) events.\n * - Emits a single INIT event on first subscription.\n * - Idempotent via WeakMap — calling again with the same history returns the same observer.\n * - Fully neutral: no imports from RT or RDR.\n *\n * @example\n * ```ts\n * import { observeHistory } from 'cosmic-eye';\n *\n * const observer = observeHistory(history);\n * const unsub = observer.subscribe(({ pathname, search, action }) => {\n * console.log(action, pathname, search);\n * });\n * // later:\n * unsub();\n * observer.unpatch();\n * ```\n */\nexport function observeHistory(history: HistoryLike): HistoryRouteObserver {\n const existing = observers.get(history);\n\n if (existing) {\n return existing;\n }\n\n const listeners = new Set<NavigationListener>();\n let destroyed = false;\n\n const emit = (event: NavigationEvent): void => {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (_) {\n // listener errors must not break the observer\n }\n }\n };\n\n // --- Patch push ---\n const originalPush = history.push.bind(history);\n\n history.push = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'PUSH' });\n }\n return originalPush(pathOrLocation, state);\n };\n\n // --- Patch replace ---\n const originalReplace = history.replace.bind(history);\n\n history.replace = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'REPLACE' });\n }\n return originalReplace(pathOrLocation, state);\n };\n\n // --- Listen for POP (back/forward) only ---\n // PUSH and REPLACE are already emitted by patched methods above.\n // history.listen fires for ALL actions, so we filter to POP only to avoid duplicates.\n let unlisten: (() => void) | void;\n\n unlisten = history.listen((...args: unknown[]) => {\n if (destroyed) {\n return;\n }\n\n let location: HistoryLocation;\n let action: string;\n\n if (args.length >= 2 && typeof args[1] === 'string') {\n // history v4: callback(location, action)\n location = args[0] as HistoryLocation;\n action = args[1];\n } else if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\n // history v5: callback({ location, action })\n const update = args[0] as { location: HistoryLocation; action: string };\n location = update.location;\n action = update.action;\n } else {\n return;\n }\n\n // Only emit POP — PUSH/REPLACE are handled by patched methods\n if (action !== 'POP') {\n return;\n }\n\n emit({\n pathname: location.pathname,\n search: location.search || '',\n action: 'POP',\n });\n });\n\n // --- INIT event emitted once on first subscribe ---\n let initEmitted = false;\n\n const subscribe = (listener: NavigationListener): (() => void) => {\n listeners.add(listener);\n\n if (!initEmitted && !destroyed) {\n initEmitted = true;\n const { pathname, search } = history.location;\n emit({ pathname, search: search || '', action: 'INIT' });\n }\n\n return () => {\n listeners.delete(listener);\n };\n };\n\n const unpatch = (): void => {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n\n // Restore original methods\n history.push = originalPush;\n history.replace = originalReplace;\n\n // Call unlisten if available\n if (typeof unlisten === 'function') {\n unlisten();\n unlisten = undefined;\n }\n\n // Clear listeners\n listeners.clear();\n\n // Remove from WeakMap so a fresh observer can be created later\n observers.delete(history);\n };\n\n const observer: HistoryRouteObserver = { subscribe, unpatch };\n\n observers.set(history, observer);\n\n return observer;\n}\n\nexport type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationAction,\n NavigationEvent,\n NavigationListener,\n} from './types';\n","import { nowMs } from '../../shared/time';\nimport type { MobxSpySnapshot, MobxSpyConfig } from './types';\n\nconst DEFAULTS = {\n BUFFER_MAX_SIZE: 5,\n TRACKED_TYPES: ['action', 'reaction'] as readonly string[],\n} as const;\n\ninterface BufferAction {\n ts: number;\n name: string | null;\n storeName: string | null;\n}\n\ninterface BufferReaction {\n ts: number;\n name: string | null;\n}\n\nconst _actionsBuffer: BufferAction[] = [];\nconst _reactionsBuffer: BufferReaction[] = [];\nlet _disposer: (() => void) | null = null;\nlet _bufferMaxSize: number = DEFAULTS.BUFFER_MAX_SIZE;\nlet _trackedTypes: readonly string[] = DEFAULTS.TRACKED_TYPES;\n\nconst _getStoreName = (object: unknown): string | null => {\n if (!object) {\n return null;\n }\n\n try {\n const obj = object as { constructor?: { name?: string }; name?: string };\n return obj.constructor?.name || obj.name || null;\n } catch (_) {\n return null;\n }\n};\n\nconst _onSpyEvent = (event: { type: string; name?: string; object?: unknown }): void => {\n try {\n const type = event.type;\n\n if (!_trackedTypes.includes(type)) {\n return;\n }\n\n if (type === 'action') {\n if (_actionsBuffer.length >= _bufferMaxSize) {\n _actionsBuffer.length = 0;\n }\n\n _actionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n storeName: _getStoreName(event.object),\n });\n }\n\n if (type === 'reaction') {\n if (_reactionsBuffer.length >= _bufferMaxSize) {\n _reactionsBuffer.length = 0;\n }\n\n _reactionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n });\n }\n } catch (_) {\n // nothing\n }\n};\n\n/**\n * MobX spy extension.\n *\n * If mobx is not installed, all methods are safe no-ops.\n * Designed to be used as a presend enricher via `mobxSpy.snapshot()`.\n */\nexport const mobxSpy = {\n init(config?: MobxSpyConfig): void {\n if (_disposer) {\n return;\n }\n\n _bufferMaxSize = config?.bufferMaxSize ?? DEFAULTS.BUFFER_MAX_SIZE;\n _trackedTypes = config?.trackedTypes ?? DEFAULTS.TRACKED_TYPES;\n\n try {\n // Dynamic import to avoid fatal error when mobx is not installed.\n // mobx is an optional peer dependency — may not exist at runtime.\n const moduleName = 'mobx';\n\n void import(moduleName).then((mobx: { spy?: (listener: (event: never) => void) => () => void }) => {\n if (_disposer) return; // already initialized by another call\n if (typeof mobx?.spy === 'function') {\n _disposer = mobx.spy(_onSpyEvent as (event: never) => void);\n }\n }).catch(() => {\n // mobx not available — no-op\n });\n } catch (_) {\n // mobx not available — no-op\n }\n },\n\n reset(): void {\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n\n snapshot(currentTime?: number): MobxSpySnapshot {\n const now = currentTime ?? nowMs();\n const lastAction = _actionsBuffer[_actionsBuffer.length - 1] || null;\n const lastReaction = _reactionsBuffer[_reactionsBuffer.length - 1] || null;\n\n const result: MobxSpySnapshot = {\n lastAction: null,\n lastReaction: null,\n };\n\n if (lastAction) {\n result.lastAction = {\n name: lastAction.name,\n storeName: lastAction.storeName,\n timeSinceMs: now - lastAction.ts,\n };\n }\n\n if (lastReaction) {\n result.lastReaction = {\n name: lastReaction.name,\n timeSinceMs: now - lastReaction.ts,\n };\n }\n\n return result;\n },\n\n destroy(): void {\n if (_disposer) {\n try {\n _disposer();\n } catch (_) {\n // nothing\n }\n _disposer = null;\n }\n\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n};\n\nexport type { MobxSpySnapshot, MobxSpyConfig, MobxActionEntry, MobxReactionEntry } from './types';\n"]}
package/dist/index.d.cts CHANGED
@@ -96,7 +96,7 @@ type RdrSendFn = (payload: RdrFlushPayload) => void;
96
96
  type RdrKeyFactory = (payload: unknown) => RequestKeyResult;
97
97
  /** RDR initialization config. */
98
98
  interface RdrConfig {
99
- /** Sampling rate (0..1). 1 = always enabled, 0 = always disabled. Default: 1. */
99
+ /** Sampling rate (0..1). 1 = always enabled, 0 = always disabled. Default: 0.05. */
100
100
  samplingRate?: number;
101
101
  /** localStorage key for persisting client ID. Default: 'rum_user_id'. */
102
102
  samplingStorageKey?: string;
@@ -259,7 +259,7 @@ interface RtEventPayload {
259
259
  type RtSendFn = (payload: RtEventPayload) => void;
260
260
  /** RT initialization config. */
261
261
  interface RtConfig {
262
- /** Sampling rate (0..1). 1 = always enabled. Default: 1. */
262
+ /** Sampling rate (0..1). 1 = always enabled. Default: 0.05. */
263
263
  samplingRate?: number;
264
264
  /** localStorage key for persisting client ID. Default: 'rum_rt_id'. */
265
265
  samplingStorageKey?: string;
package/dist/index.d.ts CHANGED
@@ -96,7 +96,7 @@ type RdrSendFn = (payload: RdrFlushPayload) => void;
96
96
  type RdrKeyFactory = (payload: unknown) => RequestKeyResult;
97
97
  /** RDR initialization config. */
98
98
  interface RdrConfig {
99
- /** Sampling rate (0..1). 1 = always enabled, 0 = always disabled. Default: 1. */
99
+ /** Sampling rate (0..1). 1 = always enabled, 0 = always disabled. Default: 0.05. */
100
100
  samplingRate?: number;
101
101
  /** localStorage key for persisting client ID. Default: 'rum_user_id'. */
102
102
  samplingStorageKey?: string;
@@ -259,7 +259,7 @@ interface RtEventPayload {
259
259
  type RtSendFn = (payload: RtEventPayload) => void;
260
260
  /** RT initialization config. */
261
261
  interface RtConfig {
262
- /** Sampling rate (0..1). 1 = always enabled. Default: 1. */
262
+ /** Sampling rate (0..1). 1 = always enabled. Default: 0.05. */
263
263
  samplingRate?: number;
264
264
  /** localStorage key for persisting client ID. Default: 'rum_rt_id'. */
265
265
  samplingStorageKey?: string;
package/dist/index.js CHANGED
@@ -349,7 +349,7 @@ var dispatchExtensionEvent = (eventName, type, data) => {
349
349
  var VERSION = "0.1";
350
350
  var CHROME_EXT_EVENT_NAME = "rdr";
351
351
  var DEFAULTS = {
352
- SAMPLING_RATE: 1,
352
+ SAMPLING_RATE: 0.05,
353
353
  SAMPLING_STORAGE_KEY: "rum_user_id",
354
354
  DUPLICATE_THRESHOLD_MS: 1e3,
355
355
  CLEANUP_INTERVAL_MS: 1e4,
@@ -790,7 +790,7 @@ var CHROME_EXT_EVENT_NAME2 = "rt";
790
790
  var EVENT_NAME = "cosmic_eye_route_transition";
791
791
  var NORMALIZE_ID_REGEX = /\/\d+/g;
792
792
  var DEFAULTS2 = {
793
- SAMPLING_RATE: 1,
793
+ SAMPLING_RATE: 0.05,
794
794
  SAMPLING_STORAGE_KEY: "rum_rt_id",
795
795
  CRITICAL_TIMEOUT_MS: 2e4,
796
796
  IDLE_TIMEOUT_MS: 1500,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/hash.ts","../src/shared/time.ts","../src/shared/env.ts","../src/shared/sampling.ts","../src/shared/enrichers.ts","../src/shared/chrome-ext.ts","../src/rdr/config.ts","../src/rdr/actions.ts","../src/rdr/index.ts","../src/rt/config.ts","../src/shared/generate-id.ts","../src/rt/utils.ts","../src/rt/index.ts","../src/extensions/history-route-observer/index.ts","../src/extensions/mobx-spy/index.ts"],"names":["VERSION","CHROME_EXT_EVENT_NAME","DEFAULTS","_bufferMaxSize"],"mappings":"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","file":"index.js","sourcesContent":["import type { HashLimitsConfig, RequestKeyResult, StructuredHashResult } from './types';\n\nexport const DEFAULT_HASH_LIMITS: HashLimitsConfig = {\n MAX_DEPTH: 20,\n MAX_NODES: 5_000,\n MAX_OBJECT_KEYS: 300,\n MAX_ARRAY_ITEMS: 1_000,\n MAX_STRING_CHARS: 2_048,\n} as const;\n\nconst HASH_SEED = 0x811c9dc5;\nconst HASH_PRIME = 0x01000193;\n\ninterface Hasher {\n write: (text: string) => void;\n hex: () => string;\n}\n\nconst _makeHasher = (): Hasher => {\n let state = HASH_SEED;\n\n const write = (text: string): void => {\n const value = String(text);\n for (let i = 0; i < value.length; i++) {\n state ^= value.charCodeAt(i);\n state = Math.imul(state, HASH_PRIME) >>> 0;\n }\n };\n\n const hex = (): string => (state >>> 0).toString(16).padStart(8, '0');\n\n return { write, hex };\n};\n\nexport const hashText = (text: string): string => {\n const hasher = _makeHasher();\n hasher.write(text);\n return hasher.hex();\n};\n\nexport const hashStructuredData = (\n input: unknown,\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): StructuredHashResult => {\n const pathObjects = new WeakSet();\n const hasher = _makeHasher();\n let nodesVisited = 0;\n let wasTruncated = false;\n\n const writeToken = (token: string): void => {\n hasher.write(token);\n };\n\n const writeString = (str: string): void => {\n writeToken('str:');\n if (str.length > limits.MAX_STRING_CHARS) {\n wasTruncated = true;\n writeToken(str.slice(0, limits.MAX_STRING_CHARS));\n writeToken(`#len=${str.length}`);\n return;\n }\n writeToken(str);\n };\n\n const writeNumber = (num: number): void => {\n if (Number.isNaN(num)) {\n writeToken('num:NaN');\n return;\n }\n if (num === Infinity) {\n writeToken('num:Infinity');\n return;\n }\n if (num === -Infinity) {\n writeToken('num:-Infinity');\n return;\n }\n if (Object.is(num, -0)) {\n writeToken('num:-0');\n return;\n }\n\n writeToken(`num:${num}`);\n };\n\n const walk = (value: unknown, depth: number): void => {\n if (nodesVisited++ >= limits.MAX_NODES) {\n wasTruncated = true;\n writeToken('[maxNodes]');\n return;\n }\n\n if (depth > limits.MAX_DEPTH) {\n wasTruncated = true;\n writeToken('[maxDepth]');\n return;\n }\n\n if (value === null) {\n writeToken('null');\n return;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n return writeString(value as string);\n }\n if (type === 'number') {\n return writeNumber(value as number);\n }\n if (type === 'boolean') {\n writeToken(value ? 'bool:true' : 'bool:false');\n return;\n }\n if (type === 'bigint') {\n writeToken(`bigint:${(value as bigint).toString()}`);\n return;\n }\n if (type === 'undefined') {\n writeToken('undef');\n return;\n }\n if (type === 'symbol') {\n writeToken(`symbol:${String(value)}`);\n return;\n }\n if (type === 'function') {\n writeToken('function');\n return;\n }\n\n if (value instanceof Date) {\n const ts = value.getTime();\n\n if (Number.isNaN(ts)) {\n wasTruncated = true;\n writeToken('date:Invalid');\n return;\n }\n\n writeToken('date:');\n writeToken(value.toISOString());\n return;\n }\n\n const obj = value as object;\n\n if (pathObjects.has(obj)) {\n wasTruncated = true;\n writeToken('[circular]');\n return;\n }\n\n pathObjects.add(obj);\n\n try {\n if (Array.isArray(obj)) {\n writeToken('[');\n const itemsToHash = Math.min(obj.length, limits.MAX_ARRAY_ITEMS);\n\n if (obj.length > itemsToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < itemsToHash; i++) {\n writeToken(`i:${i}|`);\n walk(obj[i], depth + 1);\n writeToken(';');\n }\n\n if (obj.length > itemsToHash) {\n writeToken(`#len=${obj.length}`);\n }\n writeToken(']');\n return;\n }\n\n writeToken('{');\n\n const sortedKeys = Object.keys(obj).sort();\n const keysToHash = Math.min(sortedKeys.length, limits.MAX_OBJECT_KEYS);\n\n if (sortedKeys.length > keysToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < keysToHash; i++) {\n const key = sortedKeys[i];\n const propValue = (obj as Record<string, unknown>)[key];\n\n if (propValue === undefined) {\n continue;\n }\n\n writeToken('k:');\n writeString(key);\n writeToken('|v:');\n walk(propValue, depth + 1);\n writeToken(';');\n }\n\n if (sortedKeys.length > keysToHash) {\n writeToken(`#keys=${sortedKeys.length}`);\n }\n writeToken('}');\n } catch (_) {\n wasTruncated = true;\n writeToken('[unhashableObject]');\n } finally {\n pathObjects.delete(obj);\n }\n };\n\n walk(input, 0);\n\n return {\n hashHex: hasher.hex(),\n wasTruncated,\n nodesVisited,\n };\n};\n\n/** Generate a request fingerprint for RPC-style requests (service + method + params + body). */\nexport const makeRpcRequestKey = (\n apiMessage: { s?: string; m?: string; p?: unknown; b?: unknown },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const serviceName = String(apiMessage?.s ?? '');\n const methodName = String(apiMessage?.m ?? '');\n const endpoint = `${serviceName}.${methodName}`;\n const endpointHash = hashText(endpoint);\n const paramsHash = hashStructuredData(apiMessage?.p ?? {}, limits);\n const bodyHash = hashStructuredData(apiMessage?.b ?? {}, limits);\n\n const truncationMask = (paramsHash.wasTruncated ? 1 : 0) | (bodyHash.wasTruncated ? 2 : 0);\n\n return {\n endpoint,\n reqHash: `req_${endpointHash}_${paramsHash.hashHex}_${bodyHash.hashHex}_${truncationMask}`,\n };\n};\n\n/**\n * Generate a request fingerprint for HTTP-style requests (method + endpoint URL + body text).\n * httpMethod is included in the hash to avoid false collisions (e.g. GET vs POST to same URL).\n */\nexport const makeHttpRequestKey = (\n request: { httpMethod: string; endpoint: string; bodyText?: string },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const method = String(request.httpMethod ?? '').toUpperCase();\n const endpoint = String(request.endpoint ?? '');\n const bodyText = String(request.bodyText ?? '');\n\n const endpointWithMethod = `${method}:${endpoint}`;\n const endpointHash = hashText(endpointWithMethod);\n\n const truncatedBody = bodyText.length > limits.MAX_STRING_CHARS\n ? bodyText.slice(0, limits.MAX_STRING_CHARS)\n : bodyText;\n const bodyHash = hashText(truncatedBody);\n const wasTruncated = bodyText.length > limits.MAX_STRING_CHARS;\n\n const truncationMask = wasTruncated ? 2 : 0;\n\n return {\n endpoint: endpointWithMethod,\n reqHash: `req_${endpointHash}_${bodyHash}_${truncationMask}`,\n };\n};\n","/** Shared time utilities used by rdr, rt, and extensions. All values in milliseconds. */\n\n/**\n * Current high-resolution timestamp in milliseconds.\n * Uses performance.now() when available, falls back to Date.now().\n * Result is always rounded to the nearest integer.\n */\nexport const nowMs = (): number => {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return Math.round(performance.now());\n }\n\n return Date.now();\n};\n\n/**\n * Elapsed time in milliseconds since a given timestamp.\n * Both `since` and the result are rounded integers.\n */\nexport const elapsedMs = (since: number): number => {\n const current = nowMs();\n const sinceRounded = typeof since === 'number' ? Math.round(since) : 0;\n\n return current - sinceRounded;\n};\n","import type { EnvSnapshot, NavigatorWithConnection } from './types';\n\nexport const env = {\n snapshot(): EnvSnapshot {\n const result: EnvSnapshot = {\n visibility: 'unknown',\n net: null,\n };\n\n try {\n if (typeof document !== 'undefined' && document.visibilityState) {\n result.visibility = document.visibilityState;\n }\n } catch (_) {\n // nothing\n }\n\n try {\n const nav = navigator as NavigatorWithConnection;\n const conn = nav?.connection || nav?.mozConnection || nav?.webkitConnection;\n\n if (conn) {\n result.net = {\n effectiveType: conn.effectiveType || null,\n };\n }\n } catch (_) {\n // nothing\n }\n\n return result;\n },\n};\n","import { hashText } from './hash';\nimport type { SamplingConfig } from './types';\n\n/**\n * Determine whether a client should be sampled, based on config.\n * Fully config-driven — no implicit dev exceptions.\n *\n * @param config.rate — sampling rate (0..1). 1 = always enabled, 0 = always disabled.\n * @param config.storageKey — localStorage key for persisting client ID.\n * @param config.clientId — optional explicit client ID (overrides localStorage).\n * @returns true if this client is sampled.\n */\nexport const shouldEnableSample = (config: SamplingConfig): boolean => {\n try {\n if (config.rate >= 1) {\n return true;\n }\n\n if (config.rate <= 0) {\n return false;\n }\n\n const id = getClientId(config);\n const h = hashText(id);\n const bucket = (parseInt(h, 16) % 10_000) / 10_000;\n\n return bucket < config.rate;\n } catch (_) {\n return false;\n }\n};\n\n/**\n * Resolve client ID: explicit config > localStorage > generate new.\n */\nexport const getClientId = (config: SamplingConfig): string => {\n if (config.clientId) {\n return config.clientId;\n }\n\n try {\n const stored = localStorage.getItem(config.storageKey);\n\n if (stored) {\n return stored;\n }\n\n const generated = crypto?.randomUUID?.() || String(Math.random()) + String(Date.now());\n localStorage.setItem(config.storageKey, generated);\n\n return generated;\n } catch (_) {\n return String(Math.random()) + String(Date.now());\n }\n};\n","import { nowMs } from './time';\nimport type { Enricher, EnricherLimitsConfig } from './types';\n\nexport const DEFAULT_ENRICHER_LIMITS: EnricherLimitsConfig = {\n maxDepth: 5,\n maxStringChars: 1_024,\n} as const;\n\n/**\n * Run all enrichers and collect results into a record.\n * Each getter is called synchronously with try/catch.\n * If a getter throws, the entry is set to `{ error: 'enricher_failed' }`.\n * Output values are truncated according to limits.\n */\nexport const collectEnrichers = (\n enrichers: Enricher[] | undefined,\n limits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS,\n): Record<string, unknown> | undefined => {\n if (!enrichers || enrichers.length === 0) {\n return undefined;\n }\n\n const result: Record<string, unknown> = {};\n const currentTime = nowMs();\n\n for (const enricher of enrichers) {\n try {\n const value = enricher.get(currentTime);\n result[enricher.name] = truncateValue(value, limits.maxDepth, limits.maxStringChars, 0);\n } catch (_) {\n result[enricher.name] = { error: 'enricher_failed' };\n }\n }\n\n return result;\n};\n\n/** Recursively truncate a value to enforce depth and string limits. */\nconst truncateValue = (\n value: unknown,\n maxDepth: number,\n maxStringChars: number,\n depth: number,\n): unknown => {\n if (depth > maxDepth) {\n return '[maxDepth]';\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n const str = value as string;\n return str.length > maxStringChars ? str.slice(0, maxStringChars) + '...' : str;\n }\n\n if (type === 'number' || type === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => truncateValue(item, maxDepth, maxStringChars, depth + 1));\n }\n\n if (type === 'object') {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = truncateValue(\n (value as Record<string, unknown>)[key],\n maxDepth,\n maxStringChars,\n depth + 1,\n );\n }\n\n return result;\n }\n\n return String(value);\n};\n","/**\n * Dispatch a CustomEvent to window for chrome extension integration.\n * @param eventName — 'rdr' or 'rt'\n * @param type — event type, e.g. 'flush', 'event', 'reset'\n * @param data — payload data\n */\nexport const dispatchExtensionEvent = (\n eventName: string,\n type: string,\n data: unknown,\n): void => {\n try {\n window.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { type, data },\n }),\n );\n } catch (_) {\n // nothing\n }\n};\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RDR. */\nexport const CHROME_EXT_EVENT_NAME = 'rdr';\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 1,\n SAMPLING_STORAGE_KEY: 'rum_user_id',\n DUPLICATE_THRESHOLD_MS: 1_000,\n CLEANUP_INTERVAL_MS: 10_000,\n FLUSH_INTERVAL_MS: 15_000,\n FLUSH_MAX_EVENTS: 50,\n ACTIONS_BUFFER_MAX_SIZE: 3,\n ACTIONS_TRACKED_EVENTS: ['click', 'keydown', 'touchstart'] as readonly string[],\n} as const;\n","import { nowMs } from '../shared/time';\nimport { DEFAULTS } from './config';\nimport type { ActionData, ActionSnapshot } from './types';\n\ninterface BufferEntry {\n ts: number;\n type: string;\n rum_id: string | null;\n}\n\nconst _buffer: BufferEntry[] = [];\nlet _listenersAttached = false;\nlet _bufferMaxSize: number = DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\nlet _trackedEvents: readonly string[] = DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\nconst _getRumId = (target: EventTarget | null): string | null => {\n try {\n if (!target || typeof (target as HTMLElement).closest !== 'function') {\n return null;\n }\n\n const el = (target as HTMLElement).closest('[rum-id]');\n\n return el ? el.getAttribute('rum-id') : null;\n } catch (_) {\n return null;\n }\n};\n\nconst _reset = (): void => {\n _buffer.length = 0;\n};\n\nconst _onEvent = (e: Event): void => {\n try {\n if (_buffer.length >= _bufferMaxSize) {\n _reset();\n }\n\n _buffer.push({\n ts: nowMs(),\n type: e.type,\n rum_id: _getRumId(e.target),\n });\n } catch (_) {\n // nothing\n }\n};\n\nexport const actions = {\n init(bufferMaxSize?: number, trackedEvents?: string[]): void {\n if (_listenersAttached) {\n return;\n }\n\n _bufferMaxSize = bufferMaxSize ?? DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\n _trackedEvents = trackedEvents ?? DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\n try {\n for (const eventType of _trackedEvents) {\n window.addEventListener(eventType, _onEvent, { capture: true, passive: true });\n }\n _listenersAttached = true;\n } catch (_) {\n // nothing\n }\n },\n\n reset(): void {\n _reset();\n },\n\n snapshot(currentTime: number): ActionSnapshot {\n const last = _buffer[_buffer.length - 1] || null;\n\n if (!last) {\n return {\n lastAction: null,\n timeSinceLastActionMs: null,\n };\n }\n\n const actionData: ActionData = { type: last.type };\n\n if (last.rum_id) {\n actionData.rum_id = last.rum_id;\n }\n\n return {\n lastAction: actionData,\n timeSinceLastActionMs: currentTime - last.ts,\n };\n },\n\n destroy(): void {\n if (!_listenersAttached) {\n return;\n }\n\n try {\n for (const eventType of _trackedEvents) {\n window.removeEventListener(eventType, _onEvent, { capture: true });\n }\n _listenersAttached = false;\n _reset();\n } catch (_) {\n // nothing\n }\n },\n};\n","import { makeRpcRequestKey, makeHttpRequestKey, DEFAULT_HASH_LIMITS } from '../shared/hash';\nimport { nowMs, elapsedMs } from '../shared/time';\nimport { env } from '../shared/env';\nimport { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, CHROME_EXT_EVENT_NAME } from './config';\nimport { actions } from './actions';\nimport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrConfig,\n RdrSendFn,\n RdrKeyFactory,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n} from './types';\nimport type { HashLimitsConfig, RequestKeyResult, EnricherLimitsConfig } from '../shared/types';\n\nclass RDR {\n private _requestsMap = new Map<string, number>();\n private _logQueue: RdrLogEntry[] = [];\n private _cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _initialized = false;\n private _pageLoadTime: number | null = null;\n private _boundOnVisibilityChange: (() => void) | null = null;\n private _boundOnPageHide: (() => void) | null = null;\n\n // Config-derived fields (set during init)\n private _duplicateThresholdMs: number = DEFAULTS.DUPLICATE_THRESHOLD_MS;\n private _cleanupIntervalMs: number = DEFAULTS.CLEANUP_INTERVAL_MS;\n private _flushIntervalMs: number = DEFAULTS.FLUSH_INTERVAL_MS;\n private _flushMaxEvents: number = DEFAULTS.FLUSH_MAX_EVENTS;\n private _hashLimits: HashLimitsConfig = DEFAULT_HASH_LIMITS;\n private _sendFn: RdrSendFn | null = null;\n private _rpcKeyFactory: RdrKeyFactory | null = null;\n private _httpKeyFactory: RdrKeyFactory | null = null;\n private _enrichers: RdrConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RdrConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply and validate config BEFORE setting _initialized\n this._applyConfig(config);\n\n // Sampling check\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n this._pageLoadTime = nowMs();\n actions.init(config?.actionsBufferMaxSize, config?.actionsTrackedEvents);\n this._startCleanupInterval();\n this._startFlushInterval();\n this._attachLifecycleListeners();\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n reqHandlerRpc(payload: RpcRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.s || !payload?.m) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._rpcKeyFactory) {\n try {\n reqData = this._rpcKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genRpcHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n reqHandlerHttp(payload: HttpRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.httpMethod || !payload?.endpoint) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._httpKeyFactory) {\n try {\n reqData = this._httpKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genHttpHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n flush(trigger = 'manual', meta?: unknown): RdrFlushResult {\n if (!this._initialized) {\n return { initialized: false, flushed: false, entriesCount: 0 };\n }\n\n return this._flush(trigger, meta);\n }\n\n resetTiming(): RdrResetTimingResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n this._pageLoadTime = nowMs();\n\n return { initialized: true, reset: true };\n }\n\n resetActions(): RdrResetActionsResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n actions.reset();\n\n return { initialized: true, reset: true };\n }\n\n destroy(): RdrDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._cleanupTimer) {\n clearInterval(this._cleanupTimer);\n this._cleanupTimer = null;\n }\n\n if (this._flushTimer) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n\n this._detachLifecycleListeners();\n this._flush('destroy');\n actions.destroy();\n this._requestsMap.clear();\n this._logQueue = [];\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RdrConfig): void {\n if (!config) {\n return;\n }\n\n if (config.duplicateThresholdMs !== undefined) {\n this._duplicateThresholdMs = config.duplicateThresholdMs;\n }\n if (config.cleanupIntervalMs !== undefined) {\n this._cleanupIntervalMs = config.cleanupIntervalMs;\n }\n if (config.flushIntervalMs !== undefined) {\n this._flushIntervalMs = config.flushIntervalMs;\n }\n if (config.flushMaxEvents !== undefined) {\n this._flushMaxEvents = config.flushMaxEvents;\n }\n if (config.hashLimits) {\n this._hashLimits = { ...DEFAULT_HASH_LIMITS, ...config.hashLimits };\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.rpcKeyFactory) {\n this._rpcKeyFactory = config.rpcKeyFactory;\n }\n if (config.httpKeyFactory) {\n this._httpKeyFactory = config.httpKeyFactory;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _processRequest(reqData: RequestKeyResult): RdrReqHandlerResult {\n const currentTime = nowMs();\n const lastRequestTime = this._requestsMap.get(reqData.reqHash);\n let isDuplicate = false;\n\n if (lastRequestTime !== undefined) {\n const timeDiff = elapsedMs(lastRequestTime);\n\n if (timeDiff < this._duplicateThresholdMs) {\n this._addToLogQueue(reqData, currentTime, timeDiff);\n isDuplicate = true;\n }\n }\n\n this._requestsMap.set(reqData.reqHash, currentTime);\n\n return { initialized: true, processed: true, duplicate: isDuplicate };\n }\n\n private _genRpcHash(payload: RpcRequestPayload): RequestKeyResult | null {\n try {\n return makeRpcRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _genHttpHash(payload: HttpRequestPayload): RequestKeyResult | null {\n try {\n return makeHttpRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _addToLogQueue(reqData: RequestKeyResult, currentTime: number, timeDiff: number): void {\n try {\n const actionsSnapshot = actions.snapshot(currentTime);\n const envSnapshot = env.snapshot();\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const logEntry: RdrLogEntry = {\n ver: VERSION,\n endpoint: reqData.endpoint,\n reqHash: reqData.reqHash,\n deltaMs: timeDiff,\n timings: {\n timeSincePageLoadMs: elapsedMs(this._pageLoadTime!),\n timeSinceLastActionMs: actionsSnapshot.timeSinceLastActionMs,\n },\n lastAction: actionsSnapshot.lastAction,\n env: envSnapshot,\n };\n\n if (this._tag) {\n logEntry.tag = this._tag;\n }\n\n if (enrichments) {\n logEntry.enrichments = enrichments;\n }\n\n this._logQueue.push(logEntry);\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'log', logEntry);\n }\n\n if (this._logQueue.length >= this._flushMaxEvents) {\n this._flush('threshold');\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startCleanupInterval(): void {\n if (this._cleanupTimer) {\n return;\n }\n\n this._cleanupTimer = setInterval(() => {\n this._cleanupOldRequests();\n }, this._cleanupIntervalMs);\n }\n\n private _cleanupOldRequests(): void {\n try {\n const currentTime = nowMs();\n const threshold = currentTime - this._duplicateThresholdMs;\n\n for (const [hash, timestamp] of this._requestsMap) {\n if (timestamp < threshold) {\n this._requestsMap.delete(hash);\n }\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startFlushInterval(): void {\n if (this._flushTimer) {\n return;\n }\n\n this._flushTimer = setInterval(() => {\n this._flush('interval');\n }, this._flushIntervalMs);\n }\n\n private _attachLifecycleListeners(): void {\n try {\n this._boundOnVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this._flush('visibilitychange');\n }\n };\n\n this._boundOnPageHide = () => {\n this._flush('pagehide');\n };\n\n document.addEventListener('visibilitychange', this._boundOnVisibilityChange);\n window.addEventListener('pagehide', this._boundOnPageHide);\n } catch (_) {\n // nothing\n }\n }\n\n private _detachLifecycleListeners(): void {\n try {\n if (this._boundOnVisibilityChange) {\n document.removeEventListener('visibilitychange', this._boundOnVisibilityChange);\n this._boundOnVisibilityChange = null;\n }\n\n if (this._boundOnPageHide) {\n window.removeEventListener('pagehide', this._boundOnPageHide);\n this._boundOnPageHide = null;\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _flush(trigger: string, meta?: unknown): RdrFlushResult {\n try {\n if (this._logQueue.length === 0) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n\n const entries = this._logQueue.slice();\n const count = entries.length;\n\n this._logQueue = [];\n\n const flushPayload: RdrFlushPayload = { trigger, entries };\n\n if (meta !== undefined) {\n flushPayload.meta = meta;\n }\n\n if (this._sendFn) {\n try {\n this._sendFn(flushPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RDR | flush | ${trigger}`, flushPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'flush', flushPayload);\n }\n\n return { initialized: this._initialized, flushed: true, entriesCount: count };\n } catch (_) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n }\n}\n\nconst rdr = new RDR();\n\nexport const initRDR = (config?: RdrConfig): boolean => {\n return rdr.init(config);\n};\n\nexport default rdr;\n\nexport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrSendFn,\n RdrKeyFactory,\n RdrConfig,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n ActionData,\n ActionSnapshot,\n RequestKeyResult,\n StructuredHashResult,\n HashLimitsConfig,\n EnvSnapshot,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n\nexport { hashText, makeRpcRequestKey, makeHttpRequestKey } from '../shared/hash';\nexport { VERSION } from './config';\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RT. */\nexport const CHROME_EXT_EVENT_NAME = 'rt';\n\n/** Console log event name. */\nexport const EVENT_NAME = 'cosmic_eye_route_transition';\n\n/** Regex for normalizing numeric path segments to :id. */\nexport const NORMALIZE_ID_REGEX = /\\/\\d+/g;\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 1,\n SAMPLING_STORAGE_KEY: 'rum_rt_id',\n CRITICAL_TIMEOUT_MS: 20_000,\n IDLE_TIMEOUT_MS: 1_500,\n RAF_COUNT: 2,\n} as const;\n","/** Generate a unique ID string. Uses crypto.randomUUID when available. */\nexport const generateId = (): string =>\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n","import { NORMALIZE_ID_REGEX } from './config';\n\nexport { nowMs } from '../shared/time';\nexport { generateId } from '../shared/generate-id';\n\nexport const normalizeRoute = (pathname: string): string =>\n pathname ? pathname.replace(NORMALIZE_ID_REGEX, '/:id') : '/';\n\nexport const afterFrames = (callback: () => void, count: number): void => {\n if (count <= 0) {\n callback();\n return;\n }\n\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => afterFrames(callback, count - 1));\n } else {\n setTimeout(() => afterFrames(callback, count - 1), 16);\n }\n};\n\nexport const whenIdle = (callback: () => void, timeout: number): void => {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(callback, { timeout });\n } else {\n setTimeout(callback, 0);\n }\n};\n","import { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, EVENT_NAME, CHROME_EXT_EVENT_NAME } from './config';\nimport { nowMs, normalizeRoute, afterFrames, whenIdle, generateId } from './utils';\nimport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtConfig,\n RtSendFn,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n} from './types';\nimport type { EnricherLimitsConfig } from '../shared/types';\n\nclass RT {\n private _currentTransition: Transition | null = null;\n private _criticalTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private _initialized = false;\n\n // Config-derived fields (set during init)\n private _criticalTimeoutMs: number = DEFAULTS.CRITICAL_TIMEOUT_MS;\n private _idleTimeoutMs: number = DEFAULTS.IDLE_TIMEOUT_MS;\n private _rafCount: number = DEFAULTS.RAF_COUNT;\n private _includePathname = false;\n private _includeSearch = false;\n private _sendFn: RtSendFn | null = null;\n private _enrichers: RtConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RtConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply config BEFORE setting _initialized\n this._applyConfig(config);\n\n // Sampling check\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n startTransition(pathname: string, search = ''): RtStartTransitionResult {\n if (!this._initialized) {\n return { initialized: false, started: false };\n }\n\n try {\n if (this._currentTransition && !this._currentTransition.sent) {\n this._currentTransition.aborted = true;\n }\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = {\n id: generateId(),\n startAt: nowMs(),\n renderedAt: null,\n interactiveAt: null,\n pathname,\n search,\n routeName: normalizeRoute(pathname),\n pendingCritical: 0,\n aborted: false,\n timedOut: false,\n sent: false,\n };\n\n this._criticalTimeoutId = setTimeout(() => {\n const t = this._currentTransition;\n\n if (t && !t.sent && !t.aborted) {\n t.timedOut = true;\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }\n }, this._criticalTimeoutMs);\n\n return { initialized: true, started: true };\n } catch (_) {\n return { initialized: true, started: false };\n }\n }\n\n markRendered(pathname: string): RtMarkRenderedResult {\n if (!this._initialized) {\n return { initialized: false, marked: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, marked: false };\n }\n\n if (t.pathname !== pathname || t.renderedAt !== null) {\n return { initialized: true, marked: false };\n }\n\n t.renderedAt = nowMs();\n this._checkInteractive();\n\n return { initialized: true, marked: true };\n } catch (_) {\n return { initialized: true, marked: false };\n }\n }\n\n trackCritical(promise?: Promise<unknown>): RtTrackCriticalResult {\n if (!this._initialized || !this._currentTransition) {\n const noopDone = typeof promise === 'undefined' ? () => {} : undefined;\n\n return { initialized: this._initialized, tracked: false, done: noopDone };\n }\n\n const t = this._currentTransition;\n\n t.pendingCritical++;\n\n const done = (): void => {\n if (t.pendingCritical > 0) {\n t.pendingCritical--;\n }\n\n if (t === this._currentTransition) {\n this._checkInteractive();\n }\n };\n\n if (promise && typeof promise.finally === 'function') {\n promise.finally(done);\n\n return { initialized: true, tracked: true };\n }\n\n return { initialized: true, tracked: true, done };\n }\n\n abortPending(reason?: string): RtAbortPendingResult {\n if (!this._initialized) {\n return { initialized: false, aborted: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, aborted: false };\n }\n\n t.aborted = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n // Send an abort event so the consumer knows\n const payload = this._buildPayload(t);\n payload.aborted = true;\n\n if (reason) {\n payload.abortReason = reason;\n }\n\n this._sendEventPayload({ type: 'abort', entry: payload });\n\n this._currentTransition = null;\n\n return { initialized: true, aborted: true };\n } catch (_) {\n return { initialized: true, aborted: false };\n }\n }\n\n destroy(): RtDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = null;\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RtConfig): void {\n if (!config) {\n return;\n }\n\n if (config.criticalTimeoutMs !== undefined) {\n this._criticalTimeoutMs = config.criticalTimeoutMs;\n }\n if (config.idleTimeoutMs !== undefined) {\n this._idleTimeoutMs = config.idleTimeoutMs;\n }\n if (config.rafCount !== undefined) {\n this._rafCount = config.rafCount;\n }\n if (config.includePathname !== undefined) {\n this._includePathname = config.includePathname;\n }\n if (config.includeSearch !== undefined) {\n this._includeSearch = config.includeSearch;\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _checkInteractive(): void {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted || t.renderedAt === null || t.pendingCritical > 0) {\n return;\n }\n\n afterFrames(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n whenIdle(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n if (t.pendingCritical > 0) {\n return;\n }\n\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }, this._idleTimeoutMs);\n }, this._rafCount);\n }\n\n private _finishTransition(transition: Transition): void {\n if (transition.sent || transition.aborted) {\n return;\n }\n\n transition.sent = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n const payload = this._buildPayload(transition);\n\n if (transition.timedOut) {\n payload.timedOut = true;\n }\n\n this._sendEventPayload({ type: 'transition', entry: payload });\n }\n\n private _buildPayload(transition: Transition): RTLogEntry {\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const payload: RTLogEntry = {\n ver: VERSION,\n id: transition.id,\n routeName: transition.routeName,\n routeRenderMs: transition.renderedAt !== null\n ? Math.round(transition.renderedAt - transition.startAt)\n : null,\n routeTtiMs: transition.interactiveAt !== null\n ? Math.round(transition.interactiveAt - transition.startAt)\n : null,\n };\n\n if (this._includePathname) {\n payload.pathname = transition.pathname;\n }\n\n if (this._includeSearch && transition.search) {\n payload.search = transition.search;\n }\n\n if (this._tag) {\n payload.tag = this._tag;\n }\n\n if (enrichments) {\n payload.enrichments = enrichments;\n }\n\n return payload;\n }\n\n private _sendEventPayload(eventPayload: RtEventPayload): void {\n try {\n if (this._sendFn) {\n try {\n this._sendFn(eventPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RT | ${eventPayload.type} | ${EVENT_NAME}`, eventPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, eventPayload.type, eventPayload);\n }\n } catch (_) {\n // nothing\n }\n }\n}\n\nconst rt = new RT();\n\nexport const initRT = (config?: RtConfig): boolean => {\n return rt.init(config);\n};\n\n/** Convenience wrapper for rt.trackCritical(). */\nexport const trackCritical = (promise?: Promise<unknown>): RtTrackCriticalResult => {\n return rt.trackCritical(promise);\n};\n\nexport default rt;\n\nexport { VERSION } from './config';\n\nexport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtSendFn,\n RtConfig,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n","import type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationEvent,\n NavigationListener,\n} from './types';\n\n/** WeakMap ensures idempotency — one observer per history object. */\nconst observers = new WeakMap<HistoryLike, HistoryRouteObserver>();\n\n/**\n * Parse string or object location into { pathname, search }.\n * Pure helper — no side effects, no imports from RT/RDR.\n */\nconst parseLocation = (\n pathOrLocation: string | Partial<HistoryLocation>,\n fallbackPathname: string,\n): { pathname: string; search: string } => {\n if (typeof pathOrLocation === 'string') {\n try {\n const url = new URL(pathOrLocation, 'http://localhost');\n return { pathname: url.pathname, search: url.search };\n } catch {\n return { pathname: pathOrLocation, search: '' };\n }\n }\n\n if (pathOrLocation && typeof pathOrLocation === 'object') {\n return {\n pathname: pathOrLocation.pathname || fallbackPathname,\n search: pathOrLocation.search || '',\n };\n }\n\n return { pathname: fallbackPathname, search: '' };\n};\n\n/**\n * Observe navigation events on a history-like object.\n *\n * - Patches `push` and `replace` to emit PUSH/REPLACE events **before** the original call.\n * - Subscribes to `history.listen` to catch POP (back/forward) events.\n * - Emits a single INIT event on first subscription.\n * - Idempotent via WeakMap — calling again with the same history returns the same observer.\n * - Fully neutral: no imports from RT or RDR.\n *\n * @example\n * ```ts\n * import { observeHistory } from 'cosmic-eye';\n *\n * const observer = observeHistory(history);\n * const unsub = observer.subscribe(({ pathname, search, action }) => {\n * console.log(action, pathname, search);\n * });\n * // later:\n * unsub();\n * observer.unpatch();\n * ```\n */\nexport function observeHistory(history: HistoryLike): HistoryRouteObserver {\n const existing = observers.get(history);\n\n if (existing) {\n return existing;\n }\n\n const listeners = new Set<NavigationListener>();\n let destroyed = false;\n\n const emit = (event: NavigationEvent): void => {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (_) {\n // listener errors must not break the observer\n }\n }\n };\n\n // --- Patch push ---\n const originalPush = history.push.bind(history);\n\n history.push = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'PUSH' });\n }\n return originalPush(pathOrLocation, state);\n };\n\n // --- Patch replace ---\n const originalReplace = history.replace.bind(history);\n\n history.replace = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'REPLACE' });\n }\n return originalReplace(pathOrLocation, state);\n };\n\n // --- Listen for POP (back/forward) only ---\n // PUSH and REPLACE are already emitted by patched methods above.\n // history.listen fires for ALL actions, so we filter to POP only to avoid duplicates.\n let unlisten: (() => void) | void;\n\n unlisten = history.listen((...args: unknown[]) => {\n if (destroyed) {\n return;\n }\n\n let location: HistoryLocation;\n let action: string;\n\n if (args.length >= 2 && typeof args[1] === 'string') {\n // history v4: callback(location, action)\n location = args[0] as HistoryLocation;\n action = args[1];\n } else if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\n // history v5: callback({ location, action })\n const update = args[0] as { location: HistoryLocation; action: string };\n location = update.location;\n action = update.action;\n } else {\n return;\n }\n\n // Only emit POP — PUSH/REPLACE are handled by patched methods\n if (action !== 'POP') {\n return;\n }\n\n emit({\n pathname: location.pathname,\n search: location.search || '',\n action: 'POP',\n });\n });\n\n // --- INIT event emitted once on first subscribe ---\n let initEmitted = false;\n\n const subscribe = (listener: NavigationListener): (() => void) => {\n listeners.add(listener);\n\n if (!initEmitted && !destroyed) {\n initEmitted = true;\n const { pathname, search } = history.location;\n emit({ pathname, search: search || '', action: 'INIT' });\n }\n\n return () => {\n listeners.delete(listener);\n };\n };\n\n const unpatch = (): void => {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n\n // Restore original methods\n history.push = originalPush;\n history.replace = originalReplace;\n\n // Call unlisten if available\n if (typeof unlisten === 'function') {\n unlisten();\n unlisten = undefined;\n }\n\n // Clear listeners\n listeners.clear();\n\n // Remove from WeakMap so a fresh observer can be created later\n observers.delete(history);\n };\n\n const observer: HistoryRouteObserver = { subscribe, unpatch };\n\n observers.set(history, observer);\n\n return observer;\n}\n\nexport type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationAction,\n NavigationEvent,\n NavigationListener,\n} from './types';\n","import { nowMs } from '../../shared/time';\nimport type { MobxSpySnapshot, MobxSpyConfig } from './types';\n\nconst DEFAULTS = {\n BUFFER_MAX_SIZE: 5,\n TRACKED_TYPES: ['action', 'reaction'] as readonly string[],\n} as const;\n\ninterface BufferAction {\n ts: number;\n name: string | null;\n storeName: string | null;\n}\n\ninterface BufferReaction {\n ts: number;\n name: string | null;\n}\n\nconst _actionsBuffer: BufferAction[] = [];\nconst _reactionsBuffer: BufferReaction[] = [];\nlet _disposer: (() => void) | null = null;\nlet _bufferMaxSize: number = DEFAULTS.BUFFER_MAX_SIZE;\nlet _trackedTypes: readonly string[] = DEFAULTS.TRACKED_TYPES;\n\nconst _getStoreName = (object: unknown): string | null => {\n if (!object) {\n return null;\n }\n\n try {\n const obj = object as { constructor?: { name?: string }; name?: string };\n return obj.constructor?.name || obj.name || null;\n } catch (_) {\n return null;\n }\n};\n\nconst _onSpyEvent = (event: { type: string; name?: string; object?: unknown }): void => {\n try {\n const type = event.type;\n\n if (!_trackedTypes.includes(type)) {\n return;\n }\n\n if (type === 'action') {\n if (_actionsBuffer.length >= _bufferMaxSize) {\n _actionsBuffer.length = 0;\n }\n\n _actionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n storeName: _getStoreName(event.object),\n });\n }\n\n if (type === 'reaction') {\n if (_reactionsBuffer.length >= _bufferMaxSize) {\n _reactionsBuffer.length = 0;\n }\n\n _reactionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n });\n }\n } catch (_) {\n // nothing\n }\n};\n\n/**\n * MobX spy extension.\n *\n * If mobx is not installed, all methods are safe no-ops.\n * Designed to be used as a presend enricher via `mobxSpy.snapshot()`.\n */\nexport const mobxSpy = {\n init(config?: MobxSpyConfig): void {\n if (_disposer) {\n return;\n }\n\n _bufferMaxSize = config?.bufferMaxSize ?? DEFAULTS.BUFFER_MAX_SIZE;\n _trackedTypes = config?.trackedTypes ?? DEFAULTS.TRACKED_TYPES;\n\n try {\n // Dynamic import to avoid fatal error when mobx is not installed.\n // mobx is an optional peer dependency — may not exist at runtime.\n const moduleName = 'mobx';\n\n void import(moduleName).then((mobx: { spy?: (listener: (event: never) => void) => () => void }) => {\n if (_disposer) return; // already initialized by another call\n if (typeof mobx?.spy === 'function') {\n _disposer = mobx.spy(_onSpyEvent as (event: never) => void);\n }\n }).catch(() => {\n // mobx not available — no-op\n });\n } catch (_) {\n // mobx not available — no-op\n }\n },\n\n reset(): void {\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n\n snapshot(currentTime?: number): MobxSpySnapshot {\n const now = currentTime ?? nowMs();\n const lastAction = _actionsBuffer[_actionsBuffer.length - 1] || null;\n const lastReaction = _reactionsBuffer[_reactionsBuffer.length - 1] || null;\n\n const result: MobxSpySnapshot = {\n lastAction: null,\n lastReaction: null,\n };\n\n if (lastAction) {\n result.lastAction = {\n name: lastAction.name,\n storeName: lastAction.storeName,\n timeSinceMs: now - lastAction.ts,\n };\n }\n\n if (lastReaction) {\n result.lastReaction = {\n name: lastReaction.name,\n timeSinceMs: now - lastReaction.ts,\n };\n }\n\n return result;\n },\n\n destroy(): void {\n if (_disposer) {\n try {\n _disposer();\n } catch (_) {\n // nothing\n }\n _disposer = null;\n }\n\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n};\n\nexport type { MobxSpySnapshot, MobxSpyConfig, MobxActionEntry, MobxReactionEntry } from './types';\n"]}
1
+ {"version":3,"sources":["../src/shared/hash.ts","../src/shared/time.ts","../src/shared/env.ts","../src/shared/sampling.ts","../src/shared/enrichers.ts","../src/shared/chrome-ext.ts","../src/rdr/config.ts","../src/rdr/actions.ts","../src/rdr/index.ts","../src/rt/config.ts","../src/shared/generate-id.ts","../src/rt/utils.ts","../src/rt/index.ts","../src/extensions/history-route-observer/index.ts","../src/extensions/mobx-spy/index.ts"],"names":["VERSION","CHROME_EXT_EVENT_NAME","DEFAULTS","_bufferMaxSize"],"mappings":";AAEO,IAAM,mBAAA,GAAwC;AAAA,EACnD,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,eAAA,EAAiB,GAAA;AAAA,EACjB,eAAA,EAAiB,GAAA;AAAA,EACjB,gBAAA,EAAkB;AACpB,CAAA;AAEA,IAAM,SAAA,GAAY,UAAA;AAClB,IAAM,UAAA,GAAa,QAAA;AAOnB,IAAM,cAAc,MAAc;AAChC,EAAA,IAAI,KAAA,GAAQ,SAAA;AAEZ,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAuB;AACpC,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,KAAA,IAAS,KAAA,CAAM,WAAW,CAAC,CAAA;AAC3B,MAAA,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,UAAU,CAAA,KAAM,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,OAAe,KAAA,KAAU,CAAA,EAAG,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAEpE,EAAA,OAAO,EAAE,OAAO,GAAA,EAAI;AACtB,CAAA;AAEO,IAAM,QAAA,GAAW,CAAC,IAAA,KAAyB;AAChD,EAAA,MAAM,SAAS,WAAA,EAAY;AAC3B,EAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AACjB,EAAA,OAAO,OAAO,GAAA,EAAI;AACpB;AAEO,IAAM,kBAAA,GAAqB,CAChC,KAAA,EACA,MAAA,GAA2B,mBAAA,KACF;AACzB,EAAA,MAAM,WAAA,uBAAkB,OAAA,EAAQ;AAChC,EAAA,MAAM,SAAS,WAAA,EAAY;AAC3B,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAwB;AAC1C,IAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAsB;AACzC,IAAA,UAAA,CAAW,MAAM,CAAA;AACjB,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,MAAA,CAAO,gBAAA,EAAkB;AACxC,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,gBAAgB,CAAC,CAAA;AAChD,MAAA,UAAA,CAAW,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAC/B,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,GAAG,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAsB;AACzC,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACrB,MAAA,UAAA,CAAW,SAAS,CAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,UAAA,CAAW,cAAc,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,CAAA,QAAA,EAAW;AACrB,MAAA,UAAA,CAAW,eAAe,CAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,EAAE,CAAA,EAAG;AACtB,MAAA,UAAA,CAAW,QAAQ,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAgB,KAAA,KAAwB;AACpD,IAAA,IAAI,YAAA,EAAA,IAAkB,OAAO,SAAA,EAAW;AACtC,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,UAAA,CAAW,YAAY,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,GAAQ,OAAO,SAAA,EAAW;AAC5B,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,UAAA,CAAW,YAAY,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,UAAA,CAAW,MAAM,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,OAAO,KAAA;AAEpB,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAO,YAAY,KAAe,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAO,YAAY,KAAe,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,UAAA,CAAW,KAAA,GAAQ,cAAc,YAAY,CAAA;AAC7C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,UAAA,CAAW,CAAA,OAAA,EAAW,KAAA,CAAiB,QAAA,EAAU,CAAA,CAAE,CAAA;AACnD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,UAAA,CAAW,OAAO,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,UAAA,CAAW,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AACpC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,UAAA,CAAW,UAAU,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,MAAM,EAAA,GAAK,MAAM,OAAA,EAAQ;AAEzB,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AACpB,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,UAAA,CAAW,cAAc,CAAA;AACzB,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,OAAO,CAAA;AAClB,MAAA,UAAA,CAAW,KAAA,CAAM,aAAa,CAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAA;AAEZ,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,UAAA,CAAW,YAAY,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,IAAI,GAAG,CAAA;AAEnB,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,QAAA,UAAA,CAAW,GAAG,CAAA;AACd,QAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,OAAO,eAAe,CAAA;AAE/D,QAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,UAAA,YAAA,GAAe,IAAA;AAAA,QACjB;AAEA,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,UAAA,UAAA,CAAW,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AACpB,UAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA;AACtB,UAAA,UAAA,CAAW,GAAG,CAAA;AAAA,QAChB;AAEA,QAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,UAAA,UAAA,CAAW,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,QACjC;AACA,QAAA,UAAA,CAAW,GAAG,CAAA;AACd,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,GAAG,CAAA;AAEd,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AACzC,MAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,OAAO,eAAe,CAAA;AAErE,MAAA,IAAI,UAAA,CAAW,SAAS,UAAA,EAAY;AAClC,QAAA,YAAA,GAAe,IAAA;AAAA,MACjB;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,QAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,QAAA,MAAM,SAAA,GAAa,IAAgC,GAAG,CAAA;AAEtD,QAAA,IAAI,cAAc,KAAA,CAAA,EAAW;AAC3B,UAAA;AAAA,QACF;AAEA,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,WAAA,CAAY,GAAG,CAAA;AACf,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAC,CAAA;AACzB,QAAA,UAAA,CAAW,GAAG,CAAA;AAAA,MAChB;AAEA,MAAA,IAAI,UAAA,CAAW,SAAS,UAAA,EAAY;AAClC,QAAA,UAAA,CAAW,CAAA,MAAA,EAAS,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,MACzC;AACA,MAAA,UAAA,CAAW,GAAG,CAAA;AAAA,IAChB,SAAS,CAAA,EAAG;AACV,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,UAAA,CAAW,oBAAoB,CAAA;AAAA,IACjC,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AAEb,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,GAAA,EAAI;AAAA,IACpB,YAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAGO,IAAM,iBAAA,GAAoB,CAC/B,UAAA,EACA,MAAA,GAA2B,mBAAA,KACN;AACrB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,EAAY,CAAA,IAAK,EAAE,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,EAAY,CAAA,IAAK,EAAE,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,SAAS,QAAQ,CAAA;AACtC,EAAA,MAAM,aAAa,kBAAA,CAAmB,UAAA,EAAY,CAAA,IAAK,IAAI,MAAM,CAAA;AACjE,EAAA,MAAM,WAAW,kBAAA,CAAmB,UAAA,EAAY,CAAA,IAAK,IAAI,MAAM,CAAA;AAE/D,EAAA,MAAM,kBAAkB,UAAA,CAAW,YAAA,GAAe,IAAI,CAAA,KAAM,QAAA,CAAS,eAAe,CAAA,GAAI,CAAA,CAAA;AAExF,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,OAAA,EAAS,CAAA,IAAA,EAAO,YAAY,CAAA,CAAA,EAAI,UAAA,CAAW,OAAO,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI,cAAc,CAAA;AAAA,GAC1F;AACF;AAMO,IAAM,kBAAA,GAAqB,CAChC,OAAA,EACA,MAAA,GAA2B,mBAAA,KACN;AACrB,EAAA,MAAM,SAAS,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,EAAE,EAAE,WAAA,EAAY;AAC5D,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA;AAE9C,EAAA,MAAM,kBAAA,GAAqB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,SAAS,kBAAkB,CAAA;AAEhD,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,gBAAA,GAC3C,SAAS,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,gBAAgB,CAAA,GACzC,QAAA;AACJ,EAAA,MAAM,QAAA,GAAW,SAAS,aAAa,CAAA;AACvC,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,gBAAA;AAE9C,EAAA,MAAM,cAAA,GAAiB,eAAe,CAAA,GAAI,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,kBAAA;AAAA,IACV,SAAS,CAAA,IAAA,EAAO,YAAY,CAAA,CAAA,EAAI,QAAQ,IAAI,cAAc,CAAA;AAAA,GAC5D;AACF;;;ACvQO,IAAM,QAAQ,MAAc;AACjC,EAAA,IAAI,OAAO,WAAA,KAAgB,WAAA,IAAe,OAAO,WAAA,CAAY,QAAQ,UAAA,EAAY;AAC/E,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB,CAAA;AAMO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA0B;AAClD,EAAA,MAAM,UAAU,KAAA,EAAM;AACtB,EAAA,MAAM,eAAe,OAAO,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,CAAA;AAErE,EAAA,OAAO,OAAA,GAAU,YAAA;AACnB,CAAA;;;ACtBO,IAAM,GAAA,GAAM;AAAA,EACjB,QAAA,GAAwB;AACtB,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,UAAA,EAAY,SAAA;AAAA,MACZ,GAAA,EAAK;AAAA,KACP;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,QAAA,CAAS,eAAA,EAAiB;AAC/D,QAAA,MAAA,CAAO,aAAa,QAAA,CAAS,eAAA;AAAA,MAC/B;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,SAAA;AACZ,MAAA,MAAM,IAAA,GAAO,GAAA,EAAK,UAAA,IAAc,GAAA,EAAK,iBAAiB,GAAA,EAAK,gBAAA;AAE3D,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,CAAO,GAAA,GAAM;AAAA,UACX,aAAA,EAAe,KAAK,aAAA,IAAiB;AAAA,SACvC;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;ACpBO,IAAM,kBAAA,GAAqB,CAAC,MAAA,KAAoC;AACrE,EAAA,IAAI;AACF,IAAA,IAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAA,GAAK,YAAY,MAAM,CAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,SAAS,EAAE,CAAA;AACrB,IAAA,MAAM,MAAA,GAAU,QAAA,CAAS,CAAA,EAAG,EAAE,IAAI,GAAA,GAAU,GAAA;AAE5C,IAAA,OAAO,SAAS,MAAA,CAAO,IAAA;AAAA,EACzB,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAKO,IAAM,WAAA,GAAc,CAAC,MAAA,KAAmC;AAC7D,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAErD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,UAAA,IAAa,IAAK,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AACrF,IAAA,YAAA,CAAa,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,SAAS,CAAA;AAEjD,IAAA,OAAO,SAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,MAAA,CAAO,KAAK,MAAA,EAAQ,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EAClD;AACF,CAAA;;;ACnDO,IAAM,uBAAA,GAAgD;AAAA,EAC3D,QAAA,EAAU,CAAA;AAAA,EACV,cAAA,EAAgB;AAClB,CAAA;AAQO,IAAM,gBAAA,GAAmB,CAC9B,SAAA,EACA,MAAA,GAA+B,uBAAA,KACS;AACxC,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,MAAM,cAAc,KAAA,EAAM;AAE1B,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA;AACtC,MAAA,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,aAAA,CAAc,OAAO,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,cAAA,EAAgB,CAAC,CAAA;AAAA,IACxF,SAAS,CAAA,EAAG;AACV,MAAA,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,EAAE,OAAO,iBAAA,EAAkB;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAGA,IAAM,aAAA,GAAgB,CACpB,KAAA,EACA,QAAA,EACA,gBACA,KAAA,KACY;AACZ,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAO,OAAO,KAAA;AAEpB,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,OAAO,GAAA,CAAI,SAAS,cAAA,GAAiB,GAAA,CAAI,MAAM,CAAA,EAAG,cAAc,IAAI,KAAA,GAAQ,GAAA;AAAA,EAC9E;AAEA,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,SAAA,EAAW;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,aAAA,CAAc,MAAM,QAAA,EAAU,cAAA,EAAgB,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,EACrF;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA,EAAG;AAC/D,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,aAAA;AAAA,QACX,MAAkC,GAAG,CAAA;AAAA,QACtC,QAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA,GAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB,CAAA;;;AC7EO,IAAM,sBAAA,GAAyB,CACpC,SAAA,EACA,IAAA,EACA,IAAA,KACS;AACT,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,aAAA;AAAA,MACL,IAAI,YAAY,SAAA,EAAW;AAAA,QACzB,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA;AAAK,OACtB;AAAA,KACH;AAAA,EACF,SAAS,CAAA,EAAG;AAAA,EAEZ;AACF,CAAA;;;ACnBO,IAAM,OAAA,GAAU,KAAA;AAGhB,IAAM,qBAAA,GAAwB,KAAA;AAI9B,IAAM,QAAA,GAAW;AAAA,EACtB,aAAA,EAAe,IAAA;AAAA,EACf,oBAAA,EAAsB,aAAA;AAAA,EACtB,sBAAA,EAAwB,GAAA;AAAA,EACxB,mBAAA,EAAqB,GAAA;AAAA,EACrB,iBAAA,EAAmB,IAAA;AAAA,EACnB,gBAAA,EAAkB,EAAA;AAAA,EAClB,uBAAA,EAAyB,CAAA;AAAA,EACzB,sBAAA,EAAwB,CAAC,OAAA,EAAS,SAAA,EAAW,YAAY;AAC3D,CAAA;;;ACPA,IAAM,UAAyB,EAAC;AAChC,IAAI,kBAAA,GAAqB,KAAA;AACzB,IAAI,iBAAyB,QAAA,CAAS,uBAAA;AACtC,IAAI,iBAAoC,QAAA,CAAS,sBAAA;AAEjD,IAAM,SAAA,GAAY,CAAC,MAAA,KAA8C;AAC/D,EAAA,IAAI;AACF,IAAA,IAAI,CAAC,MAAA,IAAU,OAAQ,MAAA,CAAuB,YAAY,UAAA,EAAY;AACpE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAA,GAAM,MAAA,CAAuB,OAAA,CAAQ,UAAU,CAAA;AAErD,IAAA,OAAO,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,QAAQ,CAAA,GAAI,IAAA;AAAA,EAC1C,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,SAAS,MAAY;AACzB,EAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AACnB,CAAA;AAEA,IAAM,QAAA,GAAW,CAAC,CAAA,KAAmB;AACnC,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,CAAQ,UAAU,cAAA,EAAgB;AACpC,MAAA,MAAA,EAAO;AAAA,IACT;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAI,KAAA,EAAM;AAAA,MACV,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAA,EAAQ,SAAA,CAAU,CAAA,CAAE,MAAM;AAAA,KAC3B,CAAA;AAAA,EACH,SAAS,CAAA,EAAG;AAAA,EAEZ;AACF,CAAA;AAEO,IAAM,OAAA,GAAU;AAAA,EACrB,IAAA,CAAK,eAAwB,aAAA,EAAgC;AAC3D,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,GAAiB,iBAAiB,QAAA,CAAS,uBAAA;AAC3C,IAAA,cAAA,GAAiB,iBAAiB,QAAA,CAAS,sBAAA;AAE3C,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,QAAA,EAAU,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAAA,MAC/E;AACA,MAAA,kBAAA,GAAqB,IAAA;AAAA,IACvB,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF,CAAA;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AAAA,EAEA,SAAS,WAAA,EAAqC;AAC5C,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AAE5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,IAAA;AAAA,QACZ,qBAAA,EAAuB;AAAA,OACzB;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAyB,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK;AAEjD,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,UAAA,CAAW,SAAS,IAAA,CAAK,MAAA;AAAA,IAC3B;AAEA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,UAAA;AAAA,MACZ,qBAAA,EAAuB,cAAc,IAAA,CAAK;AAAA,KAC5C;AAAA,EACF,CAAA;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,QAAA,MAAA,CAAO,oBAAoB,SAAA,EAAW,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,MACnE;AACA,MAAA,kBAAA,GAAqB,KAAA;AACrB,MAAA,MAAA,EAAO;AAAA,IACT,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF;AACF,CAAA;;;ACrFA,IAAM,MAAN,MAAU;AAAA,EAAV,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAAoB;AAC/C,IAAA,IAAA,CAAQ,YAA2B,EAAC;AACpC,IAAA,IAAA,CAAQ,aAAA,GAAuD,IAAA;AAC/D,IAAA,IAAA,CAAQ,WAAA,GAAqD,IAAA;AAC7D,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AACvB,IAAA,IAAA,CAAQ,aAAA,GAA+B,IAAA;AACvC,IAAA,IAAA,CAAQ,wBAAA,GAAgD,IAAA;AACxD,IAAA,IAAA,CAAQ,gBAAA,GAAwC,IAAA;AAGhD;AAAA,IAAA,IAAA,CAAQ,wBAAgC,QAAA,CAAS,sBAAA;AACjD,IAAA,IAAA,CAAQ,qBAA6B,QAAA,CAAS,mBAAA;AAC9C,IAAA,IAAA,CAAQ,mBAA2B,QAAA,CAAS,iBAAA;AAC5C,IAAA,IAAA,CAAQ,kBAA0B,QAAA,CAAS,gBAAA;AAC3C,IAAA,IAAA,CAAQ,WAAA,GAAgC,mBAAA;AACxC,IAAA,IAAA,CAAQ,OAAA,GAA4B,IAAA;AACpC,IAAA,IAAA,CAAQ,cAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAQ,eAAA,GAAwC,IAAA;AAChD,IAAA,IAAA,CAAQ,UAAA,GAAqC,MAAA;AAC7C,IAAA,IAAA,CAAQ,eAAA,GAAwC,uBAAA;AAChD,IAAA,IAAA,CAAQ,IAAA,GAA2B,MAAA;AACnC,IAAA,IAAA,CAAQ,sBAAA,GAAyB,KAAA;AAAA,EAAA;AAAA,EAEjC,KAAK,MAAA,EAA6B;AAChC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA;AAExB,MAAA,MAAM,UAAU,kBAAA,CAAmB;AAAA,QACjC,IAAA,EAAM,MAAA,EAAQ,YAAA,IAAgB,QAAA,CAAS,aAAA;AAAA,QACvC,UAAA,EAAY,MAAA,EAAQ,kBAAA,IAAsB,QAAA,CAAS,oBAAA;AAAA,QACnD,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,OAC/B,CAAA;AAED,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,oBAAA,EAAsB,MAAA,EAAQ,oBAAoB,CAAA;AACvE,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,IAAA,CAAK,yBAAA,EAA0B;AAE/B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,cAAc,OAAA,EAAiD;AAC7D,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,IAClE;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,EAAS,CAAA,IAAK,CAAC,SAAS,CAAA,EAAG;AAC9B,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,MACjE;AAEA,MAAA,IAAI,OAAA;AAEJ,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,IAAI;AACF,UAAA,OAAA,GAAU,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,QACvC,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,MACpC;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,MACjE;AAEA,MAAA,OAAO,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,IACrC,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,eAAe,OAAA,EAAkD;AAC/D,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,IAClE;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,EAAS,UAAA,IAAc,CAAC,SAAS,QAAA,EAAU;AAC9C,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,MACjE;AAEA,MAAA,IAAI,OAAA;AAEJ,MAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,QAAA,IAAI;AACF,UAAA,OAAA,GAAU,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,QACxC,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MACrC;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,MACjE;AAEA,MAAA,OAAO,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,IACrC,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,OAAA,GAAU,QAAA,EAAU,IAAA,EAAgC;AACxD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,cAAc,CAAA,EAAE;AAAA,IAC/D;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,WAAA,GAAoC;AAClC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAE3B,IAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,EAC1C;AAAA,EAEA,YAAA,GAAsC;AACpC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,IAC5C;AAEA,IAAA,OAAA,CAAQ,KAAA,EAAM;AAEd,IAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,EAC1C;AAAA,EAEA,OAAA,GAA4B;AAC1B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,KAAA,EAAM;AAAA,IAChD;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,aAAA,CAAc,KAAK,aAAa,CAAA;AAChC,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,MACvB;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,aAAA,CAAc,KAAK,WAAW,CAAA;AAC9B,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,MACrB;AAEA,MAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,MAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AACrB,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,MAAA,IAAA,CAAK,YAAY,EAAC;AAClB,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAEpB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,IAAA,EAAK;AAAA,IAC/C,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,YAAA,EAAc,WAAW,KAAA,EAAM;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA,EAIQ,aAAa,MAAA,EAA0B;AAC7C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,yBAAyB,MAAA,EAAW;AAC7C,MAAA,IAAA,CAAK,wBAAwB,MAAA,CAAO,oBAAA;AAAA,IACtC;AACA,IAAA,IAAI,MAAA,CAAO,sBAAsB,MAAA,EAAW;AAC1C,MAAA,IAAA,CAAK,qBAAqB,MAAA,CAAO,iBAAA;AAAA,IACnC;AACA,IAAA,IAAI,MAAA,CAAO,oBAAoB,MAAA,EAAW;AACxC,MAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,eAAA;AAAA,IACjC;AACA,IAAA,IAAI,MAAA,CAAO,mBAAmB,MAAA,EAAW;AACvC,MAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,cAAA;AAAA,IAChC;AACA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,IAAA,CAAK,cAAc,EAAE,GAAG,mBAAA,EAAqB,GAAG,OAAO,UAAA,EAAW;AAAA,IACpE;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,IAAA;AAAA,IACxB;AACA,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,aAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,cAAA;AAAA,IAChC;AACA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,IAAA,CAAK,aAAa,MAAA,CAAO,SAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,kBAAkB,EAAE,GAAG,uBAAA,EAAyB,GAAG,OAAO,cAAA,EAAe;AAAA,IAChF;AACA,IAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,IAAA,GAAO,OAAO,GAAA,IAAO,MAAA;AAAA,IAC5B;AACA,IAAA,IAAI,MAAA,CAAO,0BAA0B,MAAA,EAAW;AAC9C,MAAA,IAAA,CAAK,yBAAyB,MAAA,CAAO,qBAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAA,EAAgD;AACtE,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,OAAO,CAAA;AAC7D,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,MAAM,QAAA,GAAW,UAAU,eAAe,CAAA;AAE1C,MAAA,IAAI,QAAA,GAAW,KAAK,qBAAA,EAAuB;AACzC,QAAA,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,WAAA,EAAa,QAAQ,CAAA;AAClD,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,WAAW,CAAA;AAElD,IAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,WAAW,WAAA,EAAY;AAAA,EACtE;AAAA,EAEQ,YAAY,OAAA,EAAqD;AACvE,IAAA,IAAI;AACF,MAAA,OAAO,iBAAA,CAAkB,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA;AAAA,IACpD,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,aAAa,OAAA,EAAsD;AACzE,IAAA,IAAI;AACF,MAAA,OAAO,kBAAA,CAAmB,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA;AAAA,IACrD,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,cAAA,CAAe,OAAA,EAA2B,WAAA,EAAqB,QAAA,EAAwB;AAC7F,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AACpD,MAAA,MAAM,WAAA,GAAc,IAAI,QAAA,EAAS;AACjC,MAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,UAAA,EAAY,KAAK,eAAe,CAAA;AAE1E,MAAA,MAAM,QAAA,GAAwB;AAAA,QAC5B,GAAA,EAAK,OAAA;AAAA,QACL,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP,mBAAA,EAAqB,SAAA,CAAU,IAAA,CAAK,aAAc,CAAA;AAAA,UAClD,uBAAuB,eAAA,CAAgB;AAAA,SACzC;AAAA,QACA,YAAY,eAAA,CAAgB,UAAA;AAAA,QAC5B,GAAA,EAAK;AAAA,OACP;AAEA,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,QAAA,CAAS,MAAM,IAAA,CAAK,IAAA;AAAA,MACtB;AAEA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,CAAS,WAAA,GAAc,WAAA;AAAA,MACzB;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAE5B,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,sBAAA,CAAuB,qBAAA,EAAuB,OAAO,QAAQ,CAAA;AAAA,MAC/D;AAEA,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,IAAA,CAAK,eAAA,EAAiB;AACjD,QAAA,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA,MACzB;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF;AAAA,EAEQ,qBAAA,GAA8B;AACpC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAY,MAAM;AACrC,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,IAC3B,CAAA,EAAG,KAAK,kBAAkB,CAAA;AAAA,EAC5B;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,MAAA,MAAM,SAAA,GAAY,cAAc,IAAA,CAAK,qBAAA;AAErC,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,KAAK,YAAA,EAAc;AACjD,QAAA,IAAI,YAAY,SAAA,EAAW;AACzB,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,YAAY,MAAM;AACnC,MAAA,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,IACxB,CAAA,EAAG,KAAK,gBAAgB,CAAA;AAAA,EAC1B;AAAA,EAEQ,yBAAA,GAAkC;AACxC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,2BAA2B,MAAM;AACpC,QAAA,IAAI,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACzC,UAAA,IAAA,CAAK,OAAO,kBAAkB,CAAA;AAAA,QAChC;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,mBAAmB,MAAM;AAC5B,QAAA,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,MACxB,CAAA;AAEA,MAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,wBAAwB,CAAA;AAC3E,MAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC3D,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF;AAAA,EAEQ,yBAAA,GAAkC;AACxC,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,wBAAA,EAA0B;AACjC,QAAA,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,wBAAwB,CAAA;AAC9E,QAAA,IAAA,CAAK,wBAAA,GAA2B,IAAA;AAAA,MAClC;AAEA,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,gBAAgB,CAAA;AAC5D,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF;AAAA,EAEQ,MAAA,CAAO,SAAiB,IAAA,EAAgC;AAC9D,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC/B,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,cAAc,OAAA,EAAS,KAAA,EAAO,cAAc,CAAA,EAAE;AAAA,MAC3E;AAEA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,EAAM;AACrC,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AAEtB,MAAA,IAAA,CAAK,YAAY,EAAC;AAElB,MAAA,MAAM,YAAA,GAAgC,EAAE,OAAA,EAAS,OAAA,EAAQ;AAEzD,MAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,QAAA,YAAA,CAAa,IAAA,GAAO,IAAA;AAAA,MACtB;AAEA,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,QAAQ,YAAY,CAAA;AAAA,QAC3B,SAAS,CAAA,EAAG;AAAA,QAEZ;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA;AAAA,MACjE;AAEA,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,sBAAA,CAAuB,qBAAA,EAAuB,SAAS,YAAY,CAAA;AAAA,MACrE;AAEA,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,cAAc,OAAA,EAAS,IAAA,EAAM,cAAc,KAAA,EAAM;AAAA,IAC9E,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,cAAc,OAAA,EAAS,KAAA,EAAO,cAAc,CAAA,EAAE;AAAA,IAC3E;AAAA,EACF;AACF,CAAA;AAEA,IAAM,GAAA,GAAM,IAAI,GAAA,EAAI;AAEb,IAAM,OAAA,GAAU,CAAC,MAAA,KAAgC;AACtD,EAAA,OAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AACxB;AAEA,IAAO,WAAA,GAAQ;;;ACxbR,IAAMA,QAAAA,GAAU,KAAA;AAGhB,IAAMC,sBAAAA,GAAwB,IAAA;AAG9B,IAAM,UAAA,GAAa,6BAAA;AAGnB,IAAM,kBAAA,GAAqB,QAAA;AAI3B,IAAMC,SAAAA,GAAW;AAAA,EACtB,aAAA,EAAe,IAAA;AAAA,EACf,oBAAA,EAAsB,WAAA;AAAA,EACtB,mBAAA,EAAqB,GAAA;AAAA,EACrB,eAAA,EAAiB,IAAA;AAAA,EACjB,SAAA,EAAW;AACb,CAAA;;;ACnBO,IAAM,aAAa,MACxB,OAAO,WAAW,WAAA,IAAe,OAAO,OAAO,UAAA,KAAe,UAAA,GAC1D,OAAO,UAAA,EAAW,GAClB,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;;;ACC7B,IAAM,cAAA,GAAiB,CAAC,QAAA,KAC7B,QAAA,GAAW,SAAS,OAAA,CAAQ,kBAAA,EAAoB,MAAM,CAAA,GAAI,GAAA;AAErD,IAAM,WAAA,GAAc,CAAC,QAAA,EAAsB,KAAA,KAAwB;AACxE,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,QAAA,EAAS;AACT,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,0BAA0B,WAAA,EAAa;AAChD,IAAA,qBAAA,CAAsB,MAAM,WAAA,CAAY,QAAA,EAAU,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,EAC9D,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,MAAM,WAAA,CAAY,QAAA,EAAU,KAAA,GAAQ,CAAC,GAAG,EAAE,CAAA;AAAA,EACvD;AACF,CAAA;AAEO,IAAM,QAAA,GAAW,CAAC,QAAA,EAAsB,OAAA,KAA0B;AACvE,EAAA,IAAI,OAAO,wBAAwB,WAAA,EAAa;AAC9C,IAAA,mBAAA,CAAoB,QAAA,EAAU,EAAE,OAAA,EAAS,CAAA;AAAA,EAC3C,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,EACxB;AACF,CAAA;;;ACRA,IAAM,KAAN,MAAS;AAAA,EAAT,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,kBAAA,GAAwC,IAAA;AAChD,IAAA,IAAA,CAAQ,kBAAA,GAA2D,IAAA;AACnE,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAGvB;AAAA,IAAA,IAAA,CAAQ,qBAA6BA,SAAAA,CAAS,mBAAA;AAC9C,IAAA,IAAA,CAAQ,iBAAyBA,SAAAA,CAAS,eAAA;AAC1C,IAAA,IAAA,CAAQ,YAAoBA,SAAAA,CAAS,SAAA;AACrC,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAC3B,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AACzB,IAAA,IAAA,CAAQ,OAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,UAAA,GAAoC,MAAA;AAC5C,IAAA,IAAA,CAAQ,eAAA,GAAwC,uBAAA;AAChD,IAAA,IAAA,CAAQ,IAAA,GAA2B,MAAA;AACnC,IAAA,IAAA,CAAQ,sBAAA,GAAyB,KAAA;AAAA,EAAA;AAAA,EAEjC,KAAK,MAAA,EAA4B;AAC/B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA;AAExB,MAAA,MAAM,UAAU,kBAAA,CAAmB;AAAA,QACjC,IAAA,EAAM,MAAA,EAAQ,YAAA,IAAgBA,SAAAA,CAAS,aAAA;AAAA,QACvC,UAAA,EAAY,MAAA,EAAQ,kBAAA,IAAsBA,SAAAA,CAAS,oBAAA;AAAA,QACnD,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,OAC/B,CAAA;AAED,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,eAAA,CAAgB,QAAA,EAAkB,MAAA,GAAS,EAAA,EAA6B;AACtE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAAA,IAC9C;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,CAAC,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC5D,QAAA,IAAA,CAAK,mBAAmB,OAAA,GAAU,IAAA;AAAA,MACpC;AAEA,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,MAC5B;AAEA,MAAA,IAAA,CAAK,kBAAA,GAAqB;AAAA,QACxB,IAAI,UAAA,EAAW;AAAA,QACf,SAAS,KAAA,EAAM;AAAA,QACf,UAAA,EAAY,IAAA;AAAA,QACZ,aAAA,EAAe,IAAA;AAAA,QACf,QAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW,eAAe,QAAQ,CAAA;AAAA,QAClC,eAAA,EAAiB,CAAA;AAAA,QACjB,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAEA,MAAA,IAAA,CAAK,kBAAA,GAAqB,WAAW,MAAM;AACzC,QAAA,MAAM,IAAI,IAAA,CAAK,kBAAA;AAEf,QAAA,IAAI,KAAK,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAC,EAAE,OAAA,EAAS;AAC9B,UAAA,CAAA,CAAE,QAAA,GAAW,IAAA;AACb,UAAA,CAAA,CAAE,gBAAgB,KAAA,EAAM;AACxB,UAAA,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA,EAAG,KAAK,kBAAkB,CAAA;AAE1B,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IAC5C,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,aAAa,QAAA,EAAwC;AACnD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAAA,IAC7C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,IAAA,CAAK,kBAAA;AAEf,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,OAAA,EAAS;AAC7B,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,MAC5C;AAEA,MAAA,IAAI,CAAA,CAAE,QAAA,KAAa,QAAA,IAAY,CAAA,CAAE,eAAe,IAAA,EAAM;AACpD,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,MAC5C;AAEA,MAAA,CAAA,CAAE,aAAa,KAAA,EAAM;AACrB,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,IAC3C,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,cAAc,OAAA,EAAmD;AAC/D,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAC,KAAK,kBAAA,EAAoB;AAClD,MAAA,MAAM,QAAA,GAAW,OAAO,OAAA,KAAY,WAAA,GAAc,MAAM;AAAA,MAAC,CAAA,GAAI,MAAA;AAE7D,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,cAAc,OAAA,EAAS,KAAA,EAAO,MAAM,QAAA,EAAS;AAAA,IAC1E;AAEA,IAAA,MAAM,IAAI,IAAA,CAAK,kBAAA;AAEf,IAAA,CAAA,CAAE,eAAA,EAAA;AAEF,IAAA,MAAM,OAAO,MAAY;AACvB,MAAA,IAAI,CAAA,CAAE,kBAAkB,CAAA,EAAG;AACzB,QAAA,CAAA,CAAE,eAAA,EAAA;AAAA,MACJ;AAEA,MAAA,IAAI,CAAA,KAAM,KAAK,kBAAA,EAAoB;AACjC,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,MACzB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,OAAA,IAAW,OAAO,OAAA,CAAQ,OAAA,KAAY,UAAA,EAAY;AACpD,MAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAEpB,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IAC5C;AAEA,IAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,MAAM,IAAA,EAAK;AAAA,EAClD;AAAA,EAEA,aAAa,MAAA,EAAuC;AAClD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAAA,IAC9C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,IAAA,CAAK,kBAAA;AAEf,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,OAAA,EAAS;AAC7B,QAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAAA,MAC7C;AAEA,MAAA,CAAA,CAAE,OAAA,GAAU,IAAA;AAEZ,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,MAC5B;AAGA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,CAAC,CAAA;AACpC,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAElB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAA,CAAQ,WAAA,GAAc,MAAA;AAAA,MACxB;AAEA,MAAA,IAAA,CAAK,kBAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAExD,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAE1B,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,IAC5C,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,OAAA,GAA2B;AACzB,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,KAAA,EAAM;AAAA,IAChD;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,QAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,MAC5B;AAEA,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAEpB,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,IAAA,EAAK;AAAA,IAC/C,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,YAAA,EAAc,WAAW,KAAA,EAAM;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA,EAIQ,aAAa,MAAA,EAAyB;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,sBAAsB,MAAA,EAAW;AAC1C,MAAA,IAAA,CAAK,qBAAqB,MAAA,CAAO,iBAAA;AAAA,IACnC;AACA,IAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAW;AACtC,MAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,aAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,MAAA,IAAA,CAAK,YAAY,MAAA,CAAO,QAAA;AAAA,IAC1B;AACA,IAAA,IAAI,MAAA,CAAO,oBAAoB,MAAA,EAAW;AACxC,MAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,eAAA;AAAA,IACjC;AACA,IAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAW;AACtC,MAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,aAAA;AAAA,IAC/B;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,UAAU,MAAA,CAAO,IAAA;AAAA,IACxB;AACA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,IAAA,CAAK,aAAa,MAAA,CAAO,SAAA;AAAA,IAC3B;AACA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,kBAAkB,EAAE,GAAG,uBAAA,EAAyB,GAAG,OAAO,cAAA,EAAe;AAAA,IAChF;AACA,IAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,IAAA,GAAO,OAAO,GAAA,IAAO,MAAA;AAAA,IAC5B;AACA,IAAA,IAAI,MAAA,CAAO,0BAA0B,MAAA,EAAW;AAC9C,MAAA,IAAA,CAAK,yBAAyB,MAAA,CAAO,qBAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,MAAM,IAAI,IAAA,CAAK,kBAAA;AAEf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,UAAA,KAAe,IAAA,IAAQ,CAAA,CAAE,eAAA,GAAkB,CAAA,EAAG;AAC/E,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,MAAM;AAChB,MAAA,IAAI,CAAC,KAAK,kBAAA,IAAsB,IAAA,CAAK,uBAAuB,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,OAAA,EAAS;AACpF,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,MAAM;AACb,QAAA,IAAI,CAAC,KAAK,kBAAA,IAAsB,IAAA,CAAK,uBAAuB,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,OAAA,EAAS;AACpF,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAA,CAAE,kBAAkB,CAAA,EAAG;AACzB,UAAA;AAAA,QACF;AAEA,QAAA,CAAA,CAAE,gBAAgB,KAAA,EAAM;AACxB,QAAA,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAAA,MAC1B,CAAA,EAAG,KAAK,cAAc,CAAA;AAAA,IACxB,CAAA,EAAG,KAAK,SAAS,CAAA;AAAA,EACnB;AAAA,EAEQ,kBAAkB,UAAA,EAA8B;AACtD,IAAA,IAAI,UAAA,CAAW,IAAA,IAAQ,UAAA,CAAW,OAAA,EAAS;AACzC,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAA,GAAO,IAAA;AAElB,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAE7C,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAA;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,kBAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEQ,cAAc,UAAA,EAAoC;AACxD,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,UAAA,EAAY,KAAK,eAAe,CAAA;AAE1E,IAAA,MAAM,OAAA,GAAsB;AAAA,MAC1B,GAAA,EAAKF,QAAAA;AAAA,MACL,IAAI,UAAA,CAAW,EAAA;AAAA,MACf,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,aAAA,EAAe,UAAA,CAAW,UAAA,KAAe,IAAA,GACrC,IAAA,CAAK,MAAM,UAAA,CAAW,UAAA,GAAa,UAAA,CAAW,OAAO,CAAA,GACrD,IAAA;AAAA,MACJ,UAAA,EAAY,UAAA,CAAW,aAAA,KAAkB,IAAA,GACrC,IAAA,CAAK,MAAM,UAAA,CAAW,aAAA,GAAgB,UAAA,CAAW,OAAO,CAAA,GACxD;AAAA,KACN;AAEA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,OAAA,CAAQ,WAAW,UAAA,CAAW,QAAA;AAAA,IAChC;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,UAAA,CAAW,MAAA,EAAQ;AAC5C,MAAA,OAAA,CAAQ,SAAS,UAAA,CAAW,MAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,IAAA;AAAA,IACrB;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,WAAA,GAAc,WAAA;AAAA,IACxB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,YAAA,EAAoC;AAC5D,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,QAAQ,YAAY,CAAA;AAAA,QAC3B,SAAS,CAAA,EAAG;AAAA,QAEZ;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,YAAA,CAAa,IAAI,CAAA,GAAA,EAAM,UAAU,IAAI,YAAY,CAAA;AAAA,MAClF;AAEA,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,QAAA,sBAAA,CAAuBC,sBAAAA,EAAuB,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAAA,MAC/E;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF;AACF,CAAA;AAEA,IAAM,EAAA,GAAK,IAAI,EAAA,EAAG;AAEX,IAAM,MAAA,GAAS,CAAC,MAAA,KAA+B;AACpD,EAAA,OAAO,EAAA,CAAG,KAAK,MAAM,CAAA;AACvB;AAGO,IAAM,aAAA,GAAgB,CAAC,OAAA,KAAsD;AAClF,EAAA,OAAO,EAAA,CAAG,cAAc,OAAO,CAAA;AACjC;AAEA,IAAO,UAAA,GAAQ;;;ACjXf,IAAM,SAAA,uBAAgB,OAAA,EAA2C;AAMjE,IAAM,aAAA,GAAgB,CACpB,cAAA,EACA,gBAAA,KACyC;AACzC,EAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,cAAA,EAAgB,kBAAkB,CAAA;AACtD,MAAA,OAAO,EAAE,QAAA,EAAU,GAAA,CAAI,QAAA,EAAU,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,QAAA,EAAU,cAAA,EAAgB,MAAA,EAAQ,EAAA,EAAG;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,IAAI,cAAA,IAAkB,OAAO,cAAA,KAAmB,QAAA,EAAU;AACxD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,eAAe,QAAA,IAAY,gBAAA;AAAA,MACrC,MAAA,EAAQ,eAAe,MAAA,IAAU;AAAA,KACnC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,gBAAA,EAAkB,MAAA,EAAQ,EAAA,EAAG;AAClD,CAAA;AAwBO,SAAS,eAAe,OAAA,EAA4C;AACzE,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAEtC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAwB;AAC9C,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KAAiC;AAC7C,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,SAAS,CAAA,EAAG;AAAA,MAEZ;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAE9C,EAAA,OAAA,CAAQ,IAAA,GAAO,CAAC,cAAA,EAAmD,KAAA,KAAoB;AACrF,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,EAAE,UAAU,MAAA,EAAO,GAAI,cAAc,cAAA,EAAgB,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACpF,MAAA,IAAA,CAAK,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,YAAA,CAAa,gBAAgB,KAAK,CAAA;AAAA,EAC3C,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAEpD,EAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,cAAA,EAAmD,KAAA,KAAoB;AACxF,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,EAAE,UAAU,MAAA,EAAO,GAAI,cAAc,cAAA,EAAgB,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACpF,MAAA,IAAA,CAAK,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,eAAA,CAAgB,gBAAgB,KAAK,CAAA;AAAA,EAC9C,CAAA;AAKA,EAAA,IAAI,QAAA;AAEJ,EAAA,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,GAAI,IAAA,KAAoB;AAChD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,KAAK,MAAA,IAAU,CAAA,IAAK,OAAO,IAAA,CAAK,CAAC,MAAM,QAAA,EAAU;AAEnD,MAAA,QAAA,GAAW,KAAK,CAAC,CAAA;AACjB,MAAA,MAAA,GAAS,KAAK,CAAC,CAAA;AAAA,IACjB,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,IAAY,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,EAAM;AAE/E,MAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,MAAA,QAAA,GAAW,MAAA,CAAO,QAAA;AAClB,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK;AAAA,MACH,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,MAAA,EAAQ,SAAS,MAAA,IAAU,EAAA;AAAA,MAC3B,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,KAA+C;AAChE,IAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAEtB,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,SAAA,EAAW;AAC9B,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,OAAA,CAAQ,QAAA;AACrC,MAAA,IAAA,CAAK,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAU,EAAA,EAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAC3B,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,GAAY,IAAA;AAGZ,IAAA,OAAA,CAAQ,IAAA,GAAO,YAAA;AACf,IAAA,OAAA,CAAQ,OAAA,GAAU,eAAA;AAGlB,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,MAAA,QAAA,EAAS;AACT,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AAGA,IAAA,SAAA,CAAU,KAAA,EAAM;AAGhB,IAAA,SAAA,CAAU,OAAO,OAAO,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,QAAA,GAAiC,EAAE,SAAA,EAAW,OAAA,EAAQ;AAE5D,EAAA,SAAA,CAAU,GAAA,CAAI,SAAS,QAAQ,CAAA;AAE/B,EAAA,OAAO,QAAA;AACT;;;ACvLA,IAAMC,SAAAA,GAAW;AAAA,EACf,eAAA,EAAiB,CAAA;AAAA,EACjB,aAAA,EAAe,CAAC,QAAA,EAAU,UAAU;AACtC,CAAA;AAaA,IAAM,iBAAiC,EAAC;AACxC,IAAM,mBAAqC,EAAC;AAC5C,IAAI,SAAA,GAAiC,IAAA;AACrC,IAAIC,kBAAyBD,SAAAA,CAAS,eAAA;AACtC,IAAI,gBAAmCA,SAAAA,CAAS,aAAA;AAEhD,IAAM,aAAA,GAAgB,CAAC,MAAA,KAAmC;AACxD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,OAAO,GAAA,CAAI,WAAA,EAAa,IAAA,IAAQ,GAAA,CAAI,IAAA,IAAQ,IAAA;AAAA,EAC9C,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,WAAA,GAAc,CAAC,KAAA,KAAmE;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAEnB,IAAA,IAAI,CAAC,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAI,cAAA,CAAe,UAAUC,eAAAA,EAAgB;AAC3C,QAAA,cAAA,CAAe,MAAA,GAAS,CAAA;AAAA,MAC1B;AAEA,MAAA,cAAA,CAAe,IAAA,CAAK;AAAA,QAClB,IAAI,KAAA,EAAM;AAAA,QACV,IAAA,EAAM,MAAM,IAAA,IAAQ,IAAA;AAAA,QACpB,SAAA,EAAW,aAAA,CAAc,KAAA,CAAM,MAAM;AAAA,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,IAAI,gBAAA,CAAiB,UAAUA,eAAAA,EAAgB;AAC7C,QAAA,gBAAA,CAAiB,MAAA,GAAS,CAAA;AAAA,MAC5B;AAEA,MAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,QACpB,IAAI,KAAA,EAAM;AAAA,QACV,IAAA,EAAM,MAAM,IAAA,IAAQ;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF,SAAS,CAAA,EAAG;AAAA,EAEZ;AACF,CAAA;AAQO,IAAM,OAAA,GAAU;AAAA,EACrB,KAAK,MAAA,EAA8B;AACjC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AAEA,IAAAA,eAAAA,GAAiB,MAAA,EAAQ,aAAA,IAAiBD,SAAAA,CAAS,eAAA;AACnD,IAAA,aAAA,GAAgB,MAAA,EAAQ,gBAAgBA,SAAAA,CAAS,aAAA;AAEjD,IAAA,IAAI;AAGF,MAAA,MAAM,UAAA,GAAa,MAAA;AAEnB,MAAA,KAAK,OAAO,UAAA,CAAA,CAAY,IAAA,CAAK,CAAC,IAAA,KAAqE;AACjG,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,IAAI,OAAO,IAAA,EAAM,GAAA,KAAQ,UAAA,EAAY;AACnC,UAAA,SAAA,GAAY,IAAA,CAAK,IAAI,WAAqC,CAAA;AAAA,QAC5D;AAAA,MACF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAEf,CAAC,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AAAA,IAEZ;AAAA,EACF,CAAA;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,cAAA,CAAe,MAAA,GAAS,CAAA;AACxB,IAAA,gBAAA,CAAiB,MAAA,GAAS,CAAA;AAAA,EAC5B,CAAA;AAAA,EAEA,SAAS,WAAA,EAAuC;AAC9C,IAAA,MAAM,GAAA,GAAM,eAAe,KAAA,EAAM;AACjC,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AAChE,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,gBAAA,CAAiB,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AAEtE,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC9B,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,CAAO,UAAA,GAAa;AAAA,QAClB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,WAAW,UAAA,CAAW,SAAA;AAAA,QACtB,WAAA,EAAa,MAAM,UAAA,CAAW;AAAA,OAChC;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAA,CAAO,YAAA,GAAe;AAAA,QACpB,MAAM,YAAA,CAAa,IAAA;AAAA,QACnB,WAAA,EAAa,MAAM,YAAA,CAAa;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,SAAA,EAAU;AAAA,MACZ,SAAS,CAAA,EAAG;AAAA,MAEZ;AACA,MAAA,SAAA,GAAY,IAAA;AAAA,IACd;AAEA,IAAA,cAAA,CAAe,MAAA,GAAS,CAAA;AACxB,IAAA,gBAAA,CAAiB,MAAA,GAAS,CAAA;AAAA,EAC5B;AACF","file":"index.js","sourcesContent":["import type { HashLimitsConfig, RequestKeyResult, StructuredHashResult } from './types';\n\nexport const DEFAULT_HASH_LIMITS: HashLimitsConfig = {\n MAX_DEPTH: 20,\n MAX_NODES: 5_000,\n MAX_OBJECT_KEYS: 300,\n MAX_ARRAY_ITEMS: 1_000,\n MAX_STRING_CHARS: 2_048,\n} as const;\n\nconst HASH_SEED = 0x811c9dc5;\nconst HASH_PRIME = 0x01000193;\n\ninterface Hasher {\n write: (text: string) => void;\n hex: () => string;\n}\n\nconst _makeHasher = (): Hasher => {\n let state = HASH_SEED;\n\n const write = (text: string): void => {\n const value = String(text);\n for (let i = 0; i < value.length; i++) {\n state ^= value.charCodeAt(i);\n state = Math.imul(state, HASH_PRIME) >>> 0;\n }\n };\n\n const hex = (): string => (state >>> 0).toString(16).padStart(8, '0');\n\n return { write, hex };\n};\n\nexport const hashText = (text: string): string => {\n const hasher = _makeHasher();\n hasher.write(text);\n return hasher.hex();\n};\n\nexport const hashStructuredData = (\n input: unknown,\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): StructuredHashResult => {\n const pathObjects = new WeakSet();\n const hasher = _makeHasher();\n let nodesVisited = 0;\n let wasTruncated = false;\n\n const writeToken = (token: string): void => {\n hasher.write(token);\n };\n\n const writeString = (str: string): void => {\n writeToken('str:');\n if (str.length > limits.MAX_STRING_CHARS) {\n wasTruncated = true;\n writeToken(str.slice(0, limits.MAX_STRING_CHARS));\n writeToken(`#len=${str.length}`);\n return;\n }\n writeToken(str);\n };\n\n const writeNumber = (num: number): void => {\n if (Number.isNaN(num)) {\n writeToken('num:NaN');\n return;\n }\n if (num === Infinity) {\n writeToken('num:Infinity');\n return;\n }\n if (num === -Infinity) {\n writeToken('num:-Infinity');\n return;\n }\n if (Object.is(num, -0)) {\n writeToken('num:-0');\n return;\n }\n\n writeToken(`num:${num}`);\n };\n\n const walk = (value: unknown, depth: number): void => {\n if (nodesVisited++ >= limits.MAX_NODES) {\n wasTruncated = true;\n writeToken('[maxNodes]');\n return;\n }\n\n if (depth > limits.MAX_DEPTH) {\n wasTruncated = true;\n writeToken('[maxDepth]');\n return;\n }\n\n if (value === null) {\n writeToken('null');\n return;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n return writeString(value as string);\n }\n if (type === 'number') {\n return writeNumber(value as number);\n }\n if (type === 'boolean') {\n writeToken(value ? 'bool:true' : 'bool:false');\n return;\n }\n if (type === 'bigint') {\n writeToken(`bigint:${(value as bigint).toString()}`);\n return;\n }\n if (type === 'undefined') {\n writeToken('undef');\n return;\n }\n if (type === 'symbol') {\n writeToken(`symbol:${String(value)}`);\n return;\n }\n if (type === 'function') {\n writeToken('function');\n return;\n }\n\n if (value instanceof Date) {\n const ts = value.getTime();\n\n if (Number.isNaN(ts)) {\n wasTruncated = true;\n writeToken('date:Invalid');\n return;\n }\n\n writeToken('date:');\n writeToken(value.toISOString());\n return;\n }\n\n const obj = value as object;\n\n if (pathObjects.has(obj)) {\n wasTruncated = true;\n writeToken('[circular]');\n return;\n }\n\n pathObjects.add(obj);\n\n try {\n if (Array.isArray(obj)) {\n writeToken('[');\n const itemsToHash = Math.min(obj.length, limits.MAX_ARRAY_ITEMS);\n\n if (obj.length > itemsToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < itemsToHash; i++) {\n writeToken(`i:${i}|`);\n walk(obj[i], depth + 1);\n writeToken(';');\n }\n\n if (obj.length > itemsToHash) {\n writeToken(`#len=${obj.length}`);\n }\n writeToken(']');\n return;\n }\n\n writeToken('{');\n\n const sortedKeys = Object.keys(obj).sort();\n const keysToHash = Math.min(sortedKeys.length, limits.MAX_OBJECT_KEYS);\n\n if (sortedKeys.length > keysToHash) {\n wasTruncated = true;\n }\n\n for (let i = 0; i < keysToHash; i++) {\n const key = sortedKeys[i];\n const propValue = (obj as Record<string, unknown>)[key];\n\n if (propValue === undefined) {\n continue;\n }\n\n writeToken('k:');\n writeString(key);\n writeToken('|v:');\n walk(propValue, depth + 1);\n writeToken(';');\n }\n\n if (sortedKeys.length > keysToHash) {\n writeToken(`#keys=${sortedKeys.length}`);\n }\n writeToken('}');\n } catch (_) {\n wasTruncated = true;\n writeToken('[unhashableObject]');\n } finally {\n pathObjects.delete(obj);\n }\n };\n\n walk(input, 0);\n\n return {\n hashHex: hasher.hex(),\n wasTruncated,\n nodesVisited,\n };\n};\n\n/** Generate a request fingerprint for RPC-style requests (service + method + params + body). */\nexport const makeRpcRequestKey = (\n apiMessage: { s?: string; m?: string; p?: unknown; b?: unknown },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const serviceName = String(apiMessage?.s ?? '');\n const methodName = String(apiMessage?.m ?? '');\n const endpoint = `${serviceName}.${methodName}`;\n const endpointHash = hashText(endpoint);\n const paramsHash = hashStructuredData(apiMessage?.p ?? {}, limits);\n const bodyHash = hashStructuredData(apiMessage?.b ?? {}, limits);\n\n const truncationMask = (paramsHash.wasTruncated ? 1 : 0) | (bodyHash.wasTruncated ? 2 : 0);\n\n return {\n endpoint,\n reqHash: `req_${endpointHash}_${paramsHash.hashHex}_${bodyHash.hashHex}_${truncationMask}`,\n };\n};\n\n/**\n * Generate a request fingerprint for HTTP-style requests (method + endpoint URL + body text).\n * httpMethod is included in the hash to avoid false collisions (e.g. GET vs POST to same URL).\n */\nexport const makeHttpRequestKey = (\n request: { httpMethod: string; endpoint: string; bodyText?: string },\n limits: HashLimitsConfig = DEFAULT_HASH_LIMITS,\n): RequestKeyResult => {\n const method = String(request.httpMethod ?? '').toUpperCase();\n const endpoint = String(request.endpoint ?? '');\n const bodyText = String(request.bodyText ?? '');\n\n const endpointWithMethod = `${method}:${endpoint}`;\n const endpointHash = hashText(endpointWithMethod);\n\n const truncatedBody = bodyText.length > limits.MAX_STRING_CHARS\n ? bodyText.slice(0, limits.MAX_STRING_CHARS)\n : bodyText;\n const bodyHash = hashText(truncatedBody);\n const wasTruncated = bodyText.length > limits.MAX_STRING_CHARS;\n\n const truncationMask = wasTruncated ? 2 : 0;\n\n return {\n endpoint: endpointWithMethod,\n reqHash: `req_${endpointHash}_${bodyHash}_${truncationMask}`,\n };\n};\n","/** Shared time utilities used by rdr, rt, and extensions. All values in milliseconds. */\n\n/**\n * Current high-resolution timestamp in milliseconds.\n * Uses performance.now() when available, falls back to Date.now().\n * Result is always rounded to the nearest integer.\n */\nexport const nowMs = (): number => {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return Math.round(performance.now());\n }\n\n return Date.now();\n};\n\n/**\n * Elapsed time in milliseconds since a given timestamp.\n * Both `since` and the result are rounded integers.\n */\nexport const elapsedMs = (since: number): number => {\n const current = nowMs();\n const sinceRounded = typeof since === 'number' ? Math.round(since) : 0;\n\n return current - sinceRounded;\n};\n","import type { EnvSnapshot, NavigatorWithConnection } from './types';\n\nexport const env = {\n snapshot(): EnvSnapshot {\n const result: EnvSnapshot = {\n visibility: 'unknown',\n net: null,\n };\n\n try {\n if (typeof document !== 'undefined' && document.visibilityState) {\n result.visibility = document.visibilityState;\n }\n } catch (_) {\n // nothing\n }\n\n try {\n const nav = navigator as NavigatorWithConnection;\n const conn = nav?.connection || nav?.mozConnection || nav?.webkitConnection;\n\n if (conn) {\n result.net = {\n effectiveType: conn.effectiveType || null,\n };\n }\n } catch (_) {\n // nothing\n }\n\n return result;\n },\n};\n","import { hashText } from './hash';\nimport type { SamplingConfig } from './types';\n\n/**\n * Determine whether a client should be sampled, based on config.\n * Fully config-driven — no implicit dev exceptions.\n *\n * @param config.rate — sampling rate (0..1). 1 = always enabled, 0 = always disabled.\n * @param config.storageKey — localStorage key for persisting client ID.\n * @param config.clientId — optional explicit client ID (overrides localStorage).\n * @returns true if this client is sampled.\n */\nexport const shouldEnableSample = (config: SamplingConfig): boolean => {\n try {\n if (config.rate >= 1) {\n return true;\n }\n\n if (config.rate <= 0) {\n return false;\n }\n\n const id = getClientId(config);\n const h = hashText(id);\n const bucket = (parseInt(h, 16) % 10_000) / 10_000;\n\n return bucket < config.rate;\n } catch (_) {\n return false;\n }\n};\n\n/**\n * Resolve client ID: explicit config > localStorage > generate new.\n */\nexport const getClientId = (config: SamplingConfig): string => {\n if (config.clientId) {\n return config.clientId;\n }\n\n try {\n const stored = localStorage.getItem(config.storageKey);\n\n if (stored) {\n return stored;\n }\n\n const generated = crypto?.randomUUID?.() || String(Math.random()) + String(Date.now());\n localStorage.setItem(config.storageKey, generated);\n\n return generated;\n } catch (_) {\n return String(Math.random()) + String(Date.now());\n }\n};\n","import { nowMs } from './time';\nimport type { Enricher, EnricherLimitsConfig } from './types';\n\nexport const DEFAULT_ENRICHER_LIMITS: EnricherLimitsConfig = {\n maxDepth: 5,\n maxStringChars: 1_024,\n} as const;\n\n/**\n * Run all enrichers and collect results into a record.\n * Each getter is called synchronously with try/catch.\n * If a getter throws, the entry is set to `{ error: 'enricher_failed' }`.\n * Output values are truncated according to limits.\n */\nexport const collectEnrichers = (\n enrichers: Enricher[] | undefined,\n limits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS,\n): Record<string, unknown> | undefined => {\n if (!enrichers || enrichers.length === 0) {\n return undefined;\n }\n\n const result: Record<string, unknown> = {};\n const currentTime = nowMs();\n\n for (const enricher of enrichers) {\n try {\n const value = enricher.get(currentTime);\n result[enricher.name] = truncateValue(value, limits.maxDepth, limits.maxStringChars, 0);\n } catch (_) {\n result[enricher.name] = { error: 'enricher_failed' };\n }\n }\n\n return result;\n};\n\n/** Recursively truncate a value to enforce depth and string limits. */\nconst truncateValue = (\n value: unknown,\n maxDepth: number,\n maxStringChars: number,\n depth: number,\n): unknown => {\n if (depth > maxDepth) {\n return '[maxDepth]';\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n const type = typeof value;\n\n if (type === 'string') {\n const str = value as string;\n return str.length > maxStringChars ? str.slice(0, maxStringChars) + '...' : str;\n }\n\n if (type === 'number' || type === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => truncateValue(item, maxDepth, maxStringChars, depth + 1));\n }\n\n if (type === 'object') {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = truncateValue(\n (value as Record<string, unknown>)[key],\n maxDepth,\n maxStringChars,\n depth + 1,\n );\n }\n\n return result;\n }\n\n return String(value);\n};\n","/**\n * Dispatch a CustomEvent to window for chrome extension integration.\n * @param eventName — 'rdr' or 'rt'\n * @param type — event type, e.g. 'flush', 'event', 'reset'\n * @param data — payload data\n */\nexport const dispatchExtensionEvent = (\n eventName: string,\n type: string,\n data: unknown,\n): void => {\n try {\n window.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { type, data },\n }),\n );\n } catch (_) {\n // nothing\n }\n};\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RDR. */\nexport const CHROME_EXT_EVENT_NAME = 'rdr';\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 0.05,\n SAMPLING_STORAGE_KEY: 'rum_user_id',\n DUPLICATE_THRESHOLD_MS: 1_000,\n CLEANUP_INTERVAL_MS: 10_000,\n FLUSH_INTERVAL_MS: 15_000,\n FLUSH_MAX_EVENTS: 50,\n ACTIONS_BUFFER_MAX_SIZE: 3,\n ACTIONS_TRACKED_EVENTS: ['click', 'keydown', 'touchstart'] as readonly string[],\n} as const;\n","import { nowMs } from '../shared/time';\nimport { DEFAULTS } from './config';\nimport type { ActionData, ActionSnapshot } from './types';\n\ninterface BufferEntry {\n ts: number;\n type: string;\n rum_id: string | null;\n}\n\nconst _buffer: BufferEntry[] = [];\nlet _listenersAttached = false;\nlet _bufferMaxSize: number = DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\nlet _trackedEvents: readonly string[] = DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\nconst _getRumId = (target: EventTarget | null): string | null => {\n try {\n if (!target || typeof (target as HTMLElement).closest !== 'function') {\n return null;\n }\n\n const el = (target as HTMLElement).closest('[rum-id]');\n\n return el ? el.getAttribute('rum-id') : null;\n } catch (_) {\n return null;\n }\n};\n\nconst _reset = (): void => {\n _buffer.length = 0;\n};\n\nconst _onEvent = (e: Event): void => {\n try {\n if (_buffer.length >= _bufferMaxSize) {\n _reset();\n }\n\n _buffer.push({\n ts: nowMs(),\n type: e.type,\n rum_id: _getRumId(e.target),\n });\n } catch (_) {\n // nothing\n }\n};\n\nexport const actions = {\n init(bufferMaxSize?: number, trackedEvents?: string[]): void {\n if (_listenersAttached) {\n return;\n }\n\n _bufferMaxSize = bufferMaxSize ?? DEFAULTS.ACTIONS_BUFFER_MAX_SIZE;\n _trackedEvents = trackedEvents ?? DEFAULTS.ACTIONS_TRACKED_EVENTS;\n\n try {\n for (const eventType of _trackedEvents) {\n window.addEventListener(eventType, _onEvent, { capture: true, passive: true });\n }\n _listenersAttached = true;\n } catch (_) {\n // nothing\n }\n },\n\n reset(): void {\n _reset();\n },\n\n snapshot(currentTime: number): ActionSnapshot {\n const last = _buffer[_buffer.length - 1] || null;\n\n if (!last) {\n return {\n lastAction: null,\n timeSinceLastActionMs: null,\n };\n }\n\n const actionData: ActionData = { type: last.type };\n\n if (last.rum_id) {\n actionData.rum_id = last.rum_id;\n }\n\n return {\n lastAction: actionData,\n timeSinceLastActionMs: currentTime - last.ts,\n };\n },\n\n destroy(): void {\n if (!_listenersAttached) {\n return;\n }\n\n try {\n for (const eventType of _trackedEvents) {\n window.removeEventListener(eventType, _onEvent, { capture: true });\n }\n _listenersAttached = false;\n _reset();\n } catch (_) {\n // nothing\n }\n },\n};\n","import { makeRpcRequestKey, makeHttpRequestKey, DEFAULT_HASH_LIMITS } from '../shared/hash';\nimport { nowMs, elapsedMs } from '../shared/time';\nimport { env } from '../shared/env';\nimport { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, CHROME_EXT_EVENT_NAME } from './config';\nimport { actions } from './actions';\nimport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrConfig,\n RdrSendFn,\n RdrKeyFactory,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n} from './types';\nimport type { HashLimitsConfig, RequestKeyResult, EnricherLimitsConfig } from '../shared/types';\n\nclass RDR {\n private _requestsMap = new Map<string, number>();\n private _logQueue: RdrLogEntry[] = [];\n private _cleanupTimer: ReturnType<typeof setInterval> | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _initialized = false;\n private _pageLoadTime: number | null = null;\n private _boundOnVisibilityChange: (() => void) | null = null;\n private _boundOnPageHide: (() => void) | null = null;\n\n // Config-derived fields (set during init)\n private _duplicateThresholdMs: number = DEFAULTS.DUPLICATE_THRESHOLD_MS;\n private _cleanupIntervalMs: number = DEFAULTS.CLEANUP_INTERVAL_MS;\n private _flushIntervalMs: number = DEFAULTS.FLUSH_INTERVAL_MS;\n private _flushMaxEvents: number = DEFAULTS.FLUSH_MAX_EVENTS;\n private _hashLimits: HashLimitsConfig = DEFAULT_HASH_LIMITS;\n private _sendFn: RdrSendFn | null = null;\n private _rpcKeyFactory: RdrKeyFactory | null = null;\n private _httpKeyFactory: RdrKeyFactory | null = null;\n private _enrichers: RdrConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RdrConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply and validate config BEFORE setting _initialized\n this._applyConfig(config);\n\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n this._pageLoadTime = nowMs();\n actions.init(config?.actionsBufferMaxSize, config?.actionsTrackedEvents);\n this._startCleanupInterval();\n this._startFlushInterval();\n this._attachLifecycleListeners();\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n reqHandlerRpc(payload: RpcRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.s || !payload?.m) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._rpcKeyFactory) {\n try {\n reqData = this._rpcKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genRpcHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n reqHandlerHttp(payload: HttpRequestPayload): RdrReqHandlerResult {\n if (!this._initialized) {\n return { initialized: false, processed: false, duplicate: false };\n }\n\n try {\n if (!payload?.httpMethod || !payload?.endpoint) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n let reqData: RequestKeyResult | null;\n\n if (this._httpKeyFactory) {\n try {\n reqData = this._httpKeyFactory(payload);\n } catch (_) {\n reqData = null;\n }\n } else {\n reqData = this._genHttpHash(payload);\n }\n\n if (!reqData) {\n return { initialized: true, processed: false, duplicate: false };\n }\n\n return this._processRequest(reqData);\n } catch (_) {\n return { initialized: true, processed: false, duplicate: false };\n }\n }\n\n flush(trigger = 'manual', meta?: unknown): RdrFlushResult {\n if (!this._initialized) {\n return { initialized: false, flushed: false, entriesCount: 0 };\n }\n\n return this._flush(trigger, meta);\n }\n\n resetTiming(): RdrResetTimingResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n this._pageLoadTime = nowMs();\n\n return { initialized: true, reset: true };\n }\n\n resetActions(): RdrResetActionsResult {\n if (!this._initialized) {\n return { initialized: false, reset: false };\n }\n\n actions.reset();\n\n return { initialized: true, reset: true };\n }\n\n destroy(): RdrDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._cleanupTimer) {\n clearInterval(this._cleanupTimer);\n this._cleanupTimer = null;\n }\n\n if (this._flushTimer) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n\n this._detachLifecycleListeners();\n this._flush('destroy');\n actions.destroy();\n this._requestsMap.clear();\n this._logQueue = [];\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RdrConfig): void {\n if (!config) {\n return;\n }\n\n if (config.duplicateThresholdMs !== undefined) {\n this._duplicateThresholdMs = config.duplicateThresholdMs;\n }\n if (config.cleanupIntervalMs !== undefined) {\n this._cleanupIntervalMs = config.cleanupIntervalMs;\n }\n if (config.flushIntervalMs !== undefined) {\n this._flushIntervalMs = config.flushIntervalMs;\n }\n if (config.flushMaxEvents !== undefined) {\n this._flushMaxEvents = config.flushMaxEvents;\n }\n if (config.hashLimits) {\n this._hashLimits = { ...DEFAULT_HASH_LIMITS, ...config.hashLimits };\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.rpcKeyFactory) {\n this._rpcKeyFactory = config.rpcKeyFactory;\n }\n if (config.httpKeyFactory) {\n this._httpKeyFactory = config.httpKeyFactory;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _processRequest(reqData: RequestKeyResult): RdrReqHandlerResult {\n const currentTime = nowMs();\n const lastRequestTime = this._requestsMap.get(reqData.reqHash);\n let isDuplicate = false;\n\n if (lastRequestTime !== undefined) {\n const timeDiff = elapsedMs(lastRequestTime);\n\n if (timeDiff < this._duplicateThresholdMs) {\n this._addToLogQueue(reqData, currentTime, timeDiff);\n isDuplicate = true;\n }\n }\n\n this._requestsMap.set(reqData.reqHash, currentTime);\n\n return { initialized: true, processed: true, duplicate: isDuplicate };\n }\n\n private _genRpcHash(payload: RpcRequestPayload): RequestKeyResult | null {\n try {\n return makeRpcRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _genHttpHash(payload: HttpRequestPayload): RequestKeyResult | null {\n try {\n return makeHttpRequestKey(payload, this._hashLimits);\n } catch (_) {\n return null;\n }\n }\n\n private _addToLogQueue(reqData: RequestKeyResult, currentTime: number, timeDiff: number): void {\n try {\n const actionsSnapshot = actions.snapshot(currentTime);\n const envSnapshot = env.snapshot();\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const logEntry: RdrLogEntry = {\n ver: VERSION,\n endpoint: reqData.endpoint,\n reqHash: reqData.reqHash,\n deltaMs: timeDiff,\n timings: {\n timeSincePageLoadMs: elapsedMs(this._pageLoadTime!),\n timeSinceLastActionMs: actionsSnapshot.timeSinceLastActionMs,\n },\n lastAction: actionsSnapshot.lastAction,\n env: envSnapshot,\n };\n\n if (this._tag) {\n logEntry.tag = this._tag;\n }\n\n if (enrichments) {\n logEntry.enrichments = enrichments;\n }\n\n this._logQueue.push(logEntry);\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'log', logEntry);\n }\n\n if (this._logQueue.length >= this._flushMaxEvents) {\n this._flush('threshold');\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startCleanupInterval(): void {\n if (this._cleanupTimer) {\n return;\n }\n\n this._cleanupTimer = setInterval(() => {\n this._cleanupOldRequests();\n }, this._cleanupIntervalMs);\n }\n\n private _cleanupOldRequests(): void {\n try {\n const currentTime = nowMs();\n const threshold = currentTime - this._duplicateThresholdMs;\n\n for (const [hash, timestamp] of this._requestsMap) {\n if (timestamp < threshold) {\n this._requestsMap.delete(hash);\n }\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _startFlushInterval(): void {\n if (this._flushTimer) {\n return;\n }\n\n this._flushTimer = setInterval(() => {\n this._flush('interval');\n }, this._flushIntervalMs);\n }\n\n private _attachLifecycleListeners(): void {\n try {\n this._boundOnVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this._flush('visibilitychange');\n }\n };\n\n this._boundOnPageHide = () => {\n this._flush('pagehide');\n };\n\n document.addEventListener('visibilitychange', this._boundOnVisibilityChange);\n window.addEventListener('pagehide', this._boundOnPageHide);\n } catch (_) {\n // nothing\n }\n }\n\n private _detachLifecycleListeners(): void {\n try {\n if (this._boundOnVisibilityChange) {\n document.removeEventListener('visibilitychange', this._boundOnVisibilityChange);\n this._boundOnVisibilityChange = null;\n }\n\n if (this._boundOnPageHide) {\n window.removeEventListener('pagehide', this._boundOnPageHide);\n this._boundOnPageHide = null;\n }\n } catch (_) {\n // nothing\n }\n }\n\n private _flush(trigger: string, meta?: unknown): RdrFlushResult {\n try {\n if (this._logQueue.length === 0) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n\n const entries = this._logQueue.slice();\n const count = entries.length;\n\n this._logQueue = [];\n\n const flushPayload: RdrFlushPayload = { trigger, entries };\n\n if (meta !== undefined) {\n flushPayload.meta = meta;\n }\n\n if (this._sendFn) {\n try {\n this._sendFn(flushPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RDR | flush | ${trigger}`, flushPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, 'flush', flushPayload);\n }\n\n return { initialized: this._initialized, flushed: true, entriesCount: count };\n } catch (_) {\n return { initialized: this._initialized, flushed: false, entriesCount: 0 };\n }\n }\n}\n\nconst rdr = new RDR();\n\nexport const initRDR = (config?: RdrConfig): boolean => {\n return rdr.init(config);\n};\n\nexport default rdr;\n\nexport type {\n RpcRequestPayload,\n HttpRequestPayload,\n RdrLogEntry,\n RdrFlushPayload,\n RdrSendFn,\n RdrKeyFactory,\n RdrConfig,\n RdrFlushResult,\n RdrReqHandlerResult,\n RdrResetTimingResult,\n RdrResetActionsResult,\n RdrDestroyResult,\n ActionData,\n ActionSnapshot,\n RequestKeyResult,\n StructuredHashResult,\n HashLimitsConfig,\n EnvSnapshot,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n\nexport { hashText, makeRpcRequestKey, makeHttpRequestKey } from '../shared/hash';\nexport { VERSION } from './config';\n","/** Log schema version. NOT changeable via config — this is a contract. */\nexport const VERSION = '0.1';\n\n/** Chrome extension event name for RT. */\nexport const CHROME_EXT_EVENT_NAME = 'rt';\n\n/** Console log event name. */\nexport const EVENT_NAME = 'cosmic_eye_route_transition';\n\n/** Regex for normalizing numeric path segments to :id. */\nexport const NORMALIZE_ID_REGEX = /\\/\\d+/g;\n\n// ─── Defaults (used when config does not override) ───\n\nexport const DEFAULTS = {\n SAMPLING_RATE: 0.05,\n SAMPLING_STORAGE_KEY: 'rum_rt_id',\n CRITICAL_TIMEOUT_MS: 20_000,\n IDLE_TIMEOUT_MS: 1_500,\n RAF_COUNT: 2,\n} as const;\n","/** Generate a unique ID string. Uses crypto.randomUUID when available. */\nexport const generateId = (): string =>\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random()}`;\n","import { NORMALIZE_ID_REGEX } from './config';\n\nexport { nowMs } from '../shared/time';\nexport { generateId } from '../shared/generate-id';\n\nexport const normalizeRoute = (pathname: string): string =>\n pathname ? pathname.replace(NORMALIZE_ID_REGEX, '/:id') : '/';\n\nexport const afterFrames = (callback: () => void, count: number): void => {\n if (count <= 0) {\n callback();\n return;\n }\n\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => afterFrames(callback, count - 1));\n } else {\n setTimeout(() => afterFrames(callback, count - 1), 16);\n }\n};\n\nexport const whenIdle = (callback: () => void, timeout: number): void => {\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(callback, { timeout });\n } else {\n setTimeout(callback, 0);\n }\n};\n","import { shouldEnableSample } from '../shared/sampling';\nimport { collectEnrichers, DEFAULT_ENRICHER_LIMITS } from '../shared/enrichers';\nimport { dispatchExtensionEvent } from '../shared/chrome-ext';\nimport { VERSION, DEFAULTS, EVENT_NAME, CHROME_EXT_EVENT_NAME } from './config';\nimport { nowMs, normalizeRoute, afterFrames, whenIdle, generateId } from './utils';\nimport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtConfig,\n RtSendFn,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n} from './types';\nimport type { EnricherLimitsConfig } from '../shared/types';\n\nclass RT {\n private _currentTransition: Transition | null = null;\n private _criticalTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private _initialized = false;\n\n // Config-derived fields (set during init)\n private _criticalTimeoutMs: number = DEFAULTS.CRITICAL_TIMEOUT_MS;\n private _idleTimeoutMs: number = DEFAULTS.IDLE_TIMEOUT_MS;\n private _rafCount: number = DEFAULTS.RAF_COUNT;\n private _includePathname = false;\n private _includeSearch = false;\n private _sendFn: RtSendFn | null = null;\n private _enrichers: RtConfig['enrichers'] = undefined;\n private _enricherLimits: EnricherLimitsConfig = DEFAULT_ENRICHER_LIMITS;\n private _tag: string | undefined = undefined;\n private _chromeExtensionEvents = false;\n\n init(config?: RtConfig): boolean {\n if (this._initialized) {\n return true;\n }\n\n try {\n // Apply config BEFORE setting _initialized\n this._applyConfig(config);\n\n const sampled = shouldEnableSample({\n rate: config?.samplingRate ?? DEFAULTS.SAMPLING_RATE,\n storageKey: config?.samplingStorageKey ?? DEFAULTS.SAMPLING_STORAGE_KEY,\n clientId: config?.clientId ?? null,\n });\n\n if (!sampled) {\n return false;\n }\n\n this._initialized = true;\n\n return true;\n } catch (_) {\n return false;\n }\n }\n\n isInitialized(): boolean {\n return this._initialized;\n }\n\n startTransition(pathname: string, search = ''): RtStartTransitionResult {\n if (!this._initialized) {\n return { initialized: false, started: false };\n }\n\n try {\n if (this._currentTransition && !this._currentTransition.sent) {\n this._currentTransition.aborted = true;\n }\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = {\n id: generateId(),\n startAt: nowMs(),\n renderedAt: null,\n interactiveAt: null,\n pathname,\n search,\n routeName: normalizeRoute(pathname),\n pendingCritical: 0,\n aborted: false,\n timedOut: false,\n sent: false,\n };\n\n this._criticalTimeoutId = setTimeout(() => {\n const t = this._currentTransition;\n\n if (t && !t.sent && !t.aborted) {\n t.timedOut = true;\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }\n }, this._criticalTimeoutMs);\n\n return { initialized: true, started: true };\n } catch (_) {\n return { initialized: true, started: false };\n }\n }\n\n markRendered(pathname: string): RtMarkRenderedResult {\n if (!this._initialized) {\n return { initialized: false, marked: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, marked: false };\n }\n\n if (t.pathname !== pathname || t.renderedAt !== null) {\n return { initialized: true, marked: false };\n }\n\n t.renderedAt = nowMs();\n this._checkInteractive();\n\n return { initialized: true, marked: true };\n } catch (_) {\n return { initialized: true, marked: false };\n }\n }\n\n trackCritical(promise?: Promise<unknown>): RtTrackCriticalResult {\n if (!this._initialized || !this._currentTransition) {\n const noopDone = typeof promise === 'undefined' ? () => {} : undefined;\n\n return { initialized: this._initialized, tracked: false, done: noopDone };\n }\n\n const t = this._currentTransition;\n\n t.pendingCritical++;\n\n const done = (): void => {\n if (t.pendingCritical > 0) {\n t.pendingCritical--;\n }\n\n if (t === this._currentTransition) {\n this._checkInteractive();\n }\n };\n\n if (promise && typeof promise.finally === 'function') {\n promise.finally(done);\n\n return { initialized: true, tracked: true };\n }\n\n return { initialized: true, tracked: true, done };\n }\n\n abortPending(reason?: string): RtAbortPendingResult {\n if (!this._initialized) {\n return { initialized: false, aborted: false };\n }\n\n try {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted) {\n return { initialized: true, aborted: false };\n }\n\n t.aborted = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n // Send an abort event so the consumer knows\n const payload = this._buildPayload(t);\n payload.aborted = true;\n\n if (reason) {\n payload.abortReason = reason;\n }\n\n this._sendEventPayload({ type: 'abort', entry: payload });\n\n this._currentTransition = null;\n\n return { initialized: true, aborted: true };\n } catch (_) {\n return { initialized: true, aborted: false };\n }\n }\n\n destroy(): RtDestroyResult {\n if (!this._initialized) {\n return { initialized: false, destroyed: false };\n }\n\n try {\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n this._currentTransition = null;\n this._initialized = false;\n\n return { initialized: false, destroyed: true };\n } catch (_) {\n return { initialized: this._initialized, destroyed: false };\n }\n }\n\n // ─── Private ───\n\n private _applyConfig(config?: RtConfig): void {\n if (!config) {\n return;\n }\n\n if (config.criticalTimeoutMs !== undefined) {\n this._criticalTimeoutMs = config.criticalTimeoutMs;\n }\n if (config.idleTimeoutMs !== undefined) {\n this._idleTimeoutMs = config.idleTimeoutMs;\n }\n if (config.rafCount !== undefined) {\n this._rafCount = config.rafCount;\n }\n if (config.includePathname !== undefined) {\n this._includePathname = config.includePathname;\n }\n if (config.includeSearch !== undefined) {\n this._includeSearch = config.includeSearch;\n }\n if (config.send) {\n this._sendFn = config.send;\n }\n if (config.enrichers) {\n this._enrichers = config.enrichers;\n }\n if (config.enricherLimits) {\n this._enricherLimits = { ...DEFAULT_ENRICHER_LIMITS, ...config.enricherLimits };\n }\n if (config.tag !== undefined) {\n this._tag = config.tag || undefined;\n }\n if (config.chromeExtensionEvents !== undefined) {\n this._chromeExtensionEvents = config.chromeExtensionEvents;\n }\n }\n\n private _checkInteractive(): void {\n const t = this._currentTransition;\n\n if (!t || t.sent || t.aborted || t.renderedAt === null || t.pendingCritical > 0) {\n return;\n }\n\n afterFrames(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n whenIdle(() => {\n if (!this._currentTransition || this._currentTransition !== t || t.sent || t.aborted) {\n return;\n }\n\n if (t.pendingCritical > 0) {\n return;\n }\n\n t.interactiveAt = nowMs();\n this._finishTransition(t);\n }, this._idleTimeoutMs);\n }, this._rafCount);\n }\n\n private _finishTransition(transition: Transition): void {\n if (transition.sent || transition.aborted) {\n return;\n }\n\n transition.sent = true;\n\n if (this._criticalTimeoutId) {\n clearTimeout(this._criticalTimeoutId);\n this._criticalTimeoutId = null;\n }\n\n const payload = this._buildPayload(transition);\n\n if (transition.timedOut) {\n payload.timedOut = true;\n }\n\n this._sendEventPayload({ type: 'transition', entry: payload });\n }\n\n private _buildPayload(transition: Transition): RTLogEntry {\n const enrichments = collectEnrichers(this._enrichers, this._enricherLimits);\n\n const payload: RTLogEntry = {\n ver: VERSION,\n id: transition.id,\n routeName: transition.routeName,\n routeRenderMs: transition.renderedAt !== null\n ? Math.round(transition.renderedAt - transition.startAt)\n : null,\n routeTtiMs: transition.interactiveAt !== null\n ? Math.round(transition.interactiveAt - transition.startAt)\n : null,\n };\n\n if (this._includePathname) {\n payload.pathname = transition.pathname;\n }\n\n if (this._includeSearch && transition.search) {\n payload.search = transition.search;\n }\n\n if (this._tag) {\n payload.tag = this._tag;\n }\n\n if (enrichments) {\n payload.enrichments = enrichments;\n }\n\n return payload;\n }\n\n private _sendEventPayload(eventPayload: RtEventPayload): void {\n try {\n if (this._sendFn) {\n try {\n this._sendFn(eventPayload);\n } catch (_) {\n // nothing\n }\n } else {\n // eslint-disable-next-line no-console\n console.log(`CosmicEye: RT | ${eventPayload.type} | ${EVENT_NAME}`, eventPayload);\n }\n\n if (this._chromeExtensionEvents) {\n dispatchExtensionEvent(CHROME_EXT_EVENT_NAME, eventPayload.type, eventPayload);\n }\n } catch (_) {\n // nothing\n }\n }\n}\n\nconst rt = new RT();\n\nexport const initRT = (config?: RtConfig): boolean => {\n return rt.init(config);\n};\n\n/** Convenience wrapper for rt.trackCritical(). */\nexport const trackCritical = (promise?: Promise<unknown>): RtTrackCriticalResult => {\n return rt.trackCritical(promise);\n};\n\nexport default rt;\n\nexport { VERSION } from './config';\n\nexport type {\n Transition,\n RTLogEntry,\n RtEventPayload,\n RtSendFn,\n RtConfig,\n RtStartTransitionResult,\n RtMarkRenderedResult,\n RtTrackCriticalResult,\n RtAbortPendingResult,\n RtDestroyResult,\n Enricher,\n EnricherLimitsConfig,\n} from './types';\n","import type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationEvent,\n NavigationListener,\n} from './types';\n\n/** WeakMap ensures idempotency — one observer per history object. */\nconst observers = new WeakMap<HistoryLike, HistoryRouteObserver>();\n\n/**\n * Parse string or object location into { pathname, search }.\n * Pure helper — no side effects, no imports from RT/RDR.\n */\nconst parseLocation = (\n pathOrLocation: string | Partial<HistoryLocation>,\n fallbackPathname: string,\n): { pathname: string; search: string } => {\n if (typeof pathOrLocation === 'string') {\n try {\n const url = new URL(pathOrLocation, 'http://localhost');\n return { pathname: url.pathname, search: url.search };\n } catch {\n return { pathname: pathOrLocation, search: '' };\n }\n }\n\n if (pathOrLocation && typeof pathOrLocation === 'object') {\n return {\n pathname: pathOrLocation.pathname || fallbackPathname,\n search: pathOrLocation.search || '',\n };\n }\n\n return { pathname: fallbackPathname, search: '' };\n};\n\n/**\n * Observe navigation events on a history-like object.\n *\n * - Patches `push` and `replace` to emit PUSH/REPLACE events **before** the original call.\n * - Subscribes to `history.listen` to catch POP (back/forward) events.\n * - Emits a single INIT event on first subscription.\n * - Idempotent via WeakMap — calling again with the same history returns the same observer.\n * - Fully neutral: no imports from RT or RDR.\n *\n * @example\n * ```ts\n * import { observeHistory } from 'cosmic-eye';\n *\n * const observer = observeHistory(history);\n * const unsub = observer.subscribe(({ pathname, search, action }) => {\n * console.log(action, pathname, search);\n * });\n * // later:\n * unsub();\n * observer.unpatch();\n * ```\n */\nexport function observeHistory(history: HistoryLike): HistoryRouteObserver {\n const existing = observers.get(history);\n\n if (existing) {\n return existing;\n }\n\n const listeners = new Set<NavigationListener>();\n let destroyed = false;\n\n const emit = (event: NavigationEvent): void => {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (_) {\n // listener errors must not break the observer\n }\n }\n };\n\n // --- Patch push ---\n const originalPush = history.push.bind(history);\n\n history.push = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'PUSH' });\n }\n return originalPush(pathOrLocation, state);\n };\n\n // --- Patch replace ---\n const originalReplace = history.replace.bind(history);\n\n history.replace = (pathOrLocation: string | Partial<HistoryLocation>, state?: unknown) => {\n if (!destroyed) {\n const { pathname, search } = parseLocation(pathOrLocation, history.location.pathname);\n emit({ pathname, search, action: 'REPLACE' });\n }\n return originalReplace(pathOrLocation, state);\n };\n\n // --- Listen for POP (back/forward) only ---\n // PUSH and REPLACE are already emitted by patched methods above.\n // history.listen fires for ALL actions, so we filter to POP only to avoid duplicates.\n let unlisten: (() => void) | void;\n\n unlisten = history.listen((...args: unknown[]) => {\n if (destroyed) {\n return;\n }\n\n let location: HistoryLocation;\n let action: string;\n\n if (args.length >= 2 && typeof args[1] === 'string') {\n // history v4: callback(location, action)\n location = args[0] as HistoryLocation;\n action = args[1];\n } else if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null) {\n // history v5: callback({ location, action })\n const update = args[0] as { location: HistoryLocation; action: string };\n location = update.location;\n action = update.action;\n } else {\n return;\n }\n\n // Only emit POP — PUSH/REPLACE are handled by patched methods\n if (action !== 'POP') {\n return;\n }\n\n emit({\n pathname: location.pathname,\n search: location.search || '',\n action: 'POP',\n });\n });\n\n // --- INIT event emitted once on first subscribe ---\n let initEmitted = false;\n\n const subscribe = (listener: NavigationListener): (() => void) => {\n listeners.add(listener);\n\n if (!initEmitted && !destroyed) {\n initEmitted = true;\n const { pathname, search } = history.location;\n emit({ pathname, search: search || '', action: 'INIT' });\n }\n\n return () => {\n listeners.delete(listener);\n };\n };\n\n const unpatch = (): void => {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n\n // Restore original methods\n history.push = originalPush;\n history.replace = originalReplace;\n\n // Call unlisten if available\n if (typeof unlisten === 'function') {\n unlisten();\n unlisten = undefined;\n }\n\n // Clear listeners\n listeners.clear();\n\n // Remove from WeakMap so a fresh observer can be created later\n observers.delete(history);\n };\n\n const observer: HistoryRouteObserver = { subscribe, unpatch };\n\n observers.set(history, observer);\n\n return observer;\n}\n\nexport type {\n HistoryLike,\n HistoryLocation,\n HistoryRouteObserver,\n NavigationAction,\n NavigationEvent,\n NavigationListener,\n} from './types';\n","import { nowMs } from '../../shared/time';\nimport type { MobxSpySnapshot, MobxSpyConfig } from './types';\n\nconst DEFAULTS = {\n BUFFER_MAX_SIZE: 5,\n TRACKED_TYPES: ['action', 'reaction'] as readonly string[],\n} as const;\n\ninterface BufferAction {\n ts: number;\n name: string | null;\n storeName: string | null;\n}\n\ninterface BufferReaction {\n ts: number;\n name: string | null;\n}\n\nconst _actionsBuffer: BufferAction[] = [];\nconst _reactionsBuffer: BufferReaction[] = [];\nlet _disposer: (() => void) | null = null;\nlet _bufferMaxSize: number = DEFAULTS.BUFFER_MAX_SIZE;\nlet _trackedTypes: readonly string[] = DEFAULTS.TRACKED_TYPES;\n\nconst _getStoreName = (object: unknown): string | null => {\n if (!object) {\n return null;\n }\n\n try {\n const obj = object as { constructor?: { name?: string }; name?: string };\n return obj.constructor?.name || obj.name || null;\n } catch (_) {\n return null;\n }\n};\n\nconst _onSpyEvent = (event: { type: string; name?: string; object?: unknown }): void => {\n try {\n const type = event.type;\n\n if (!_trackedTypes.includes(type)) {\n return;\n }\n\n if (type === 'action') {\n if (_actionsBuffer.length >= _bufferMaxSize) {\n _actionsBuffer.length = 0;\n }\n\n _actionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n storeName: _getStoreName(event.object),\n });\n }\n\n if (type === 'reaction') {\n if (_reactionsBuffer.length >= _bufferMaxSize) {\n _reactionsBuffer.length = 0;\n }\n\n _reactionsBuffer.push({\n ts: nowMs(),\n name: event.name || null,\n });\n }\n } catch (_) {\n // nothing\n }\n};\n\n/**\n * MobX spy extension.\n *\n * If mobx is not installed, all methods are safe no-ops.\n * Designed to be used as a presend enricher via `mobxSpy.snapshot()`.\n */\nexport const mobxSpy = {\n init(config?: MobxSpyConfig): void {\n if (_disposer) {\n return;\n }\n\n _bufferMaxSize = config?.bufferMaxSize ?? DEFAULTS.BUFFER_MAX_SIZE;\n _trackedTypes = config?.trackedTypes ?? DEFAULTS.TRACKED_TYPES;\n\n try {\n // Dynamic import to avoid fatal error when mobx is not installed.\n // mobx is an optional peer dependency — may not exist at runtime.\n const moduleName = 'mobx';\n\n void import(moduleName).then((mobx: { spy?: (listener: (event: never) => void) => () => void }) => {\n if (_disposer) return; // already initialized by another call\n if (typeof mobx?.spy === 'function') {\n _disposer = mobx.spy(_onSpyEvent as (event: never) => void);\n }\n }).catch(() => {\n // mobx not available — no-op\n });\n } catch (_) {\n // mobx not available — no-op\n }\n },\n\n reset(): void {\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n\n snapshot(currentTime?: number): MobxSpySnapshot {\n const now = currentTime ?? nowMs();\n const lastAction = _actionsBuffer[_actionsBuffer.length - 1] || null;\n const lastReaction = _reactionsBuffer[_reactionsBuffer.length - 1] || null;\n\n const result: MobxSpySnapshot = {\n lastAction: null,\n lastReaction: null,\n };\n\n if (lastAction) {\n result.lastAction = {\n name: lastAction.name,\n storeName: lastAction.storeName,\n timeSinceMs: now - lastAction.ts,\n };\n }\n\n if (lastReaction) {\n result.lastReaction = {\n name: lastReaction.name,\n timeSinceMs: now - lastReaction.ts,\n };\n }\n\n return result;\n },\n\n destroy(): void {\n if (_disposer) {\n try {\n _disposer();\n } catch (_) {\n // nothing\n }\n _disposer = null;\n }\n\n _actionsBuffer.length = 0;\n _reactionsBuffer.length = 0;\n },\n};\n\nexport type { MobxSpySnapshot, MobxSpyConfig, MobxActionEntry, MobxReactionEntry } from './types';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cosmic-eye",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "RDR (RUM Duplicate Requests) — detects and logs duplicate API requests in SPAs",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",