@ihyeon/browser-error-log 0.2.6 → 0.2.8
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/README.ko.md +31 -3
- package/README.md +31 -3
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +2 -2
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../protocol/src/index.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export const SCHEMA_VERSION = 1 as const;\nexport const SDK_VERSION = '0.2.6';\n\nexport type EventType = 'javascript' | 'promise' | 'react' | 'console' | 'http' | 'network' | 'resource' | 'manual';\nexport type Runtime = 'browser' | 'webview-ios' | 'webview-android' | 'unknown';\n\nexport const BREADCRUMB_LIMITS = {\n count: 20, bytes: 12_000, category: 40, message: 256,\n dataKeys: 6, dataKey: 80, dataString: 200,\n} as const;\n\nexport interface Breadcrumb {\n occurredAt: string;\n category: string;\n message: string;\n data?: Record<string, string | number | boolean | null>;\n}\n\n/** Validates the bounded, canonical UTC breadcrumb representation on the wire. */\nexport function isBreadcrumbTrail(value: unknown): value is Breadcrumb[] {\n try {\n if (!Array.isArray(value) || value.length > BREADCRUMB_LIMITS.count) return false;\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return false;\n if (Object.keys(item).some(key => !['occurredAt', 'category', 'message', 'data'].includes(key))) return false;\n if (typeof item.occurredAt !== 'string' || !Number.isFinite(Date.parse(item.occurredAt)) ||\n new Date(item.occurredAt).toISOString() !== item.occurredAt) return false;\n if (typeof item.category !== 'string' || !item.category.trim() || item.category.length > BREADCRUMB_LIMITS.category ||\n typeof item.message !== 'string' || !item.message.trim() || item.message.length > BREADCRUMB_LIMITS.message) return false;\n if (item.data !== undefined) {\n if (!item.data || typeof item.data !== 'object' || Array.isArray(item.data)) return false;\n const entries = Object.entries(item.data);\n if (entries.length > BREADCRUMB_LIMITS.dataKeys || entries.some(([key, field]) =>\n key.length > BREADCRUMB_LIMITS.dataKey || !(field === null || typeof field === 'boolean' ||\n (typeof field === 'string' && field.length <= BREADCRUMB_LIMITS.dataString) ||\n (typeof field === 'number' && Number.isFinite(field))))) return false;\n }\n }\n return new TextEncoder().encode(JSON.stringify(value)).length <= BREADCRUMB_LIMITS.bytes;\n } catch { return false; }\n}\n\nexport interface ErrorEventRecord {\n schemaVersion: 1;\n eventId: string;\n project: string;\n environment: string;\n release: string;\n sdkVersion: string;\n occurredAt: string;\n receivedAt?: string;\n viewId: string;\n sequence: number;\n elapsedMs: number;\n type: EventType;\n message: string;\n name?: string;\n stack?: string;\n componentStack?: string;\n page: string;\n runtime: Runtime;\n browser?: string;\n context?: Record<string, string | number | boolean | null>;\n breadcrumbs?: Breadcrumb[];\n network?: { method: string; url: string; status?: number; durationMs: number };\n}\n\nexport interface EventBatch { schemaVersion: 1; events: ErrorEventRecord[] }\nexport interface EventFilter {\n project?: string;\n environment?: string;\n type?: EventType;\n query?: string;\n from?: string;\n to?: string;\n cursor?: string;\n limit?: number;\n}\nexport interface EventPage { events: ErrorEventRecord[]; nextCursor?: string }\nexport interface EventDataSource {\n listEvents(filter: EventFilter, signal?: AbortSignal): Promise<EventPage>;\n getEvent(project: string, eventId: string, signal?: AbortSignal): Promise<ErrorEventRecord | null>;\n}\n\nexport const EVENT_LABELS: Record<EventType, string> = {\n javascript: 'JavaScript', promise: 'Promise', react: 'React', console: 'Console',\n http: 'HTTP error', network: 'Network failure', resource: 'Resource failure', manual: 'Manual',\n};\n", "import { BREADCRUMB_LIMITS, type Breadcrumb, type ErrorEventRecord, type EventBatch, type EventType, type Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { Breadcrumb, ErrorEventRecord, EventBatch } from '@ihyeon/browser-error-log-protocol';\n\nexport interface CaptureExtra {\n type?: EventType;\n context?: Record<string, unknown>;\n componentStack?: string;\n}\n\nexport interface TransportContext { signal: AbortSignal }\n\nexport interface BrowserErrorLogOptions {\n project: string;\n environment?: string;\n release?: string;\n /** Scalar metadata added to every captured event; event context takes precedence. */\n context?: Record<string, unknown>;\n /** Returns scalar metadata from current application state for each new event. */\n getContext?: () => Record<string, unknown> | undefined;\n endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: boolean;\n /** Captures unhandled promise rejections automatically; defaults to true. */\n captureUnhandledRejections?: boolean;\n /** Includes up to four sanitized Error.cause entries in exception stacks; defaults to false. */\n captureErrorCause?: boolean;\n /** Captures script, stylesheet link, and image load errors; defaults to false. */\n captureResourceErrors?: boolean;\n /** Records sanitized History navigation breadcrumbs; defaults to false. */\n captureNavigation?: boolean;\n /** Defaults to true. With a custom transport, automatic network capture requires endpoint for collector exclusion. */\n captureNetwork?: boolean;\n /** Records sanitized fetch/XHR completion breadcrumbs; defaults to false. Custom transports require endpoint. */\n captureNetworkBreadcrumbs?: boolean;\n /** Filters or replaces each sanitized breadcrumb before it enters the trail. */\n beforeBreadcrumb?: (breadcrumb: Breadcrumb) => BreadcrumbInput | false | null | void;\n beforeSend?: (event: ErrorEventRecord) => ErrorEventRecord | false | null | void;\n /** Suppresses events whose final sanitized message contains any listed literal string. */\n ignoreMessages?: readonly string[];\n sanitizeUrl?: (url: string) => string;\n shouldCaptureHttp?: (status: number, url: string, method: string) => boolean;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n /** Maximum new events admitted in any rolling 60 seconds; disabled by default. */\n maxEventsPerMinute?: number;\n /** Suppresses matching sanitized events for this many milliseconds; disabled by default. */\n dedupeIntervalMs?: number;\n /** Per-attempt deadline, clamped to 250\u201360000 ms; defaults to 5000 ms. */\n transportTimeoutMs?: number;\n /** Holds queued delivery and beacons while navigator.onLine is exactly false; defaults to false. */\n pauseWhileOffline?: boolean;\n}\n\nexport interface BrowserErrorLogClient {\n captureException(error: unknown, extra?: CaptureExtra): void;\n flush(): Promise<void>;\n destroy(): void;\n getStats(): { queued: number; sent: number; dropped: number };\n}\n\nexport interface BreadcrumbInput {\n message: string;\n category?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BrowserErrorLogBreadcrumbClient extends BrowserErrorLogClient {\n addBreadcrumb(input: BreadcrumbInput): void;\n clearBreadcrumbs(): void;\n}\n\nexport type BrowserErrorLogDropReason = 'rateLimit' | 'queueOverflow' | 'payloadTooLarge'\n | 'processingError' | 'deliveryError' | 'destroyed';\n\nexport interface BrowserErrorLogDiagnostics {\n queued: number;\n sent: number;\n dropped: number;\n inFlight: number;\n filtered: number;\n deduplicated: number;\n droppedByReason: Record<BrowserErrorLogDropReason, number>;\n}\n\nexport interface BrowserErrorLogDiagnosticsClient extends BrowserErrorLogBreadcrumbClient {\n getDiagnostics(): BrowserErrorLogDiagnostics;\n}\n\nconst MAX_BATCH_EVENTS = 20;\nconst MAX_BATCH_BYTES = 48_000;\nconst MAX_BEACON_EVENTS = 10;\nconst MAX_BEACON_BYTES = 24_000;\nconst RETRY_DELAYS_MS = [250, 500];\nconst SENSITIVE_KEY = /(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i;\nconst EVENT_TYPES = new Set<EventType>(['javascript', 'promise', 'react', 'console', 'http', 'network', 'manual', 'resource']);\nconst RUNTIMES = new Set<Runtime>(['browser', 'webview-ios', 'webview-android', 'unknown']);\nlet fallbackId = 0;\n\nfunction read(object: unknown, key: PropertyKey): unknown {\n try { return object == null ? undefined : Reflect.get(Object(object), key); }\n catch { return undefined; }\n}\n\nfunction safeString(value: unknown): string {\n try { return String(value); }\n catch { return '[unavailable]'; }\n}\n\nfunction trim(value: unknown, length: number): string {\n return safeString(value).slice(0, length);\n}\n\nfunction now(): number {\n try { return performance.now(); }\n catch { return Date.now(); }\n}\n\nfunction newId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n } catch { /* fall through */ }\n return `${Date.now().toString(36)}-${(++fallbackId).toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction isAbort(error: unknown, signal?: AbortSignal | null): boolean {\n try { if (signal?.aborted) return true; }\n catch { /* ignore hostile signal */ }\n return read(error, 'name') === 'AbortError' || read(error, 'code') === 20;\n}\n\nfunction errorFields(error: unknown): { message: string; name?: string; stack?: string } {\n if (error === null || error === undefined) return { message: 'Unknown error' };\n const message = read(error, 'message');\n const name = read(error, 'name');\n const stack = read(error, 'stack');\n return {\n message: message == null ? safeString(error) : safeString(message),\n ...(name == null ? {} : { name: safeString(name) }),\n ...(stack == null ? {} : { stack: safeString(stack) }),\n };\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction boundedNumber(value: unknown, minimum: number, maximum: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(maximum, Math.max(minimum, Math.floor(value)))\n : fallback;\n}\n\nfunction eventFingerprint(event: ErrorEventRecord): string {\n return JSON.stringify([\n event.type, event.name ?? null, event.message, event.stack ?? null,\n event.componentStack ?? null, event.project, event.environment, event.release,\n event.page, event.runtime, event.browser ?? null,\n event.context === undefined ? null : Object.keys(event.context).sort().map(key => [key, event.context![key]]),\n event.network === undefined ? null : [event.network.method, event.network.url, event.network.status ?? null],\n ]);\n}\n\nclass HttpDeliveryError extends Error {\n constructor(readonly status: number) { super(`Collector responded ${status}`); }\n}\n\nclass UrlSanitizationError extends Error {}\n\nclass ContextResolutionError extends Error {}\n\nclass Client implements BrowserErrorLogDiagnosticsClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: boolean;\n private readonly networkBreadcrumbCaptureEnabled: boolean;\n private readonly navigationCaptureEnabled: boolean;\n private readonly captureErrorCause: boolean;\n private readonly captureUnhandledRejections: boolean;\n private readonly resourceCaptureEnabled: boolean;\n private readonly pauseWhileOffline: boolean;\n private readonly transportTimeoutMs: number;\n private readonly startedAt = now();\n private readonly viewId = newId();\n private readonly seenErrors = new WeakSet<object>();\n private readonly queue: ErrorEventRecord[] = [];\n private readonly breadcrumbs: Breadcrumb[] = [];\n private recordingBreadcrumb = false;\n private readonly maxQueueSize: number;\n private readonly maxEventsPerMinute?: number;\n private readonly dedupeIntervalMs: number;\n private readonly ignoreMessages: readonly string[];\n private readonly dedupeCache = new Map<string, number>();\n private lastDedupeClock?: number;\n private readonly admittedAt: number[] = [];\n private readonly cancelWaits = new Set<() => void>();\n private readonly controllers = new Set<AbortController>();\n private readonly destroySignal: Promise<symbol>;\n private resolveDestroy!: (value: symbol) => void;\n private interval?: ReturnType<typeof setInterval>;\n private flushing?: Promise<void>;\n private onlineFlushRequested = false;\n private sequence = 0;\n private inFlight = 0;\n private sent = 0;\n private dropped = 0;\n private filtered = 0;\n private deduplicated = 0;\n private readonly droppedByReason: Record<BrowserErrorLogDropReason, number> = {\n rateLimit: 0, queueOverflow: 0, payloadTooLarge: 0,\n processingError: 0, deliveryError: 0, destroyed: 0,\n };\n private destroyed = false;\n private lastAdmissionClock?: number;\n\n constructor(options: BrowserErrorLogOptions) {\n this.options = options;\n this.active = options.enabled !== false && typeof window !== 'undefined' && typeof document !== 'undefined';\n const automaticNetworkAllowed = !options.transport || Boolean(options.endpoint);\n this.networkCaptureEnabled = options.captureNetwork !== false && automaticNetworkAllowed;\n this.networkBreadcrumbCaptureEnabled = options.captureNetworkBreadcrumbs === true && automaticNetworkAllowed;\n this.navigationCaptureEnabled = options.captureNavigation === true;\n this.captureErrorCause = options.captureErrorCause === true;\n this.captureUnhandledRejections = options.captureUnhandledRejections !== false;\n this.resourceCaptureEnabled = options.captureResourceErrors === true;\n this.pauseWhileOffline = options.pauseWhileOffline === true;\n this.maxQueueSize = boundedNumber(options.maxQueueSize, 1, 100, 50);\n this.maxEventsPerMinute = typeof options.maxEventsPerMinute === 'number' && Number.isFinite(options.maxEventsPerMinute)\n ? boundedNumber(options.maxEventsPerMinute, 1, 1000, 1) : undefined;\n this.dedupeIntervalMs = boundedNumber(options.dedupeIntervalMs, 0, 60_000, 0);\n this.ignoreMessages = Array.isArray(options.ignoreMessages)\n ? options.ignoreMessages.filter((value): value is string => typeof value === 'string' && value.length > 0)\n : [];\n this.transportTimeoutMs = boundedNumber(options.transportTimeoutMs, 250, 60_000, 5_000);\n this.destroySignal = new Promise(resolve => { this.resolveDestroy = resolve; });\n if (!this.active) return;\n if (!options.project || typeof options.project !== 'string') throw new Error('project is required');\n if (!options.transport && !options.endpoint) throw new Error('endpoint or transport is required');\n this.endpoint = options.endpoint ? this.absoluteUrl(options.endpoint) : undefined;\n window.addEventListener('error', this.onError);\n if (this.resourceCaptureEnabled) window.addEventListener('error', this.onResourceError, true);\n if (this.captureUnhandledRejections) window.addEventListener('unhandledrejection', this.onRejection);\n document.addEventListener('visibilitychange', this.onVisibility);\n window.addEventListener('pagehide', this.onPageHide);\n if (this.pauseWhileOffline) window.addEventListener('online', this.onOnline);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) addNetworkClient(this);\n if (options.captureConsole === true) addConsoleClient(this);\n if (this.navigationCaptureEnabled) addNavigationClient(this);\n this.interval = setInterval(() => { void this.flush(); }, boundedNumber(options.flushIntervalMs, 10, 60_000, 10_000));\n }\n\n captureException(error: unknown, extra: CaptureExtra = {}): void {\n if (!this.active || this.destroyed || isAbort(error)) return;\n try {\n if (error !== null && (typeof error === 'object' || typeof error === 'function')) {\n if (this.seenErrors.has(error)) { this.deduplicated++; return; }\n }\n const fields = this.exceptionFields(error);\n const type = EVENT_TYPES.has(extra.type as EventType) ? extra.type! : 'manual';\n const event = this.makeEvent(type, fields.message, {\n name: fields.name,\n stack: fields.stack,\n componentStack: extra.componentStack,\n context: extra.context,\n });\n if (this.enqueue(event) && error !== null && (typeof error === 'object' || typeof error === 'function')) {\n this.seenErrors.add(error);\n }\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.recordDrop('processingError');\n // Diagnostics must never affect the host app.\n }\n }\n\n reportNetwork(method: string, url: string, status: number | undefined, durationMs: number,\n failure?: unknown, allowErrorCapture = true): void {\n if (this.destroyed || !this.active || this.isCollectorUrl(url) || isAbort(failure)) return;\n let captureError = this.networkCaptureEnabled && allowErrorCapture;\n if (captureError && status !== undefined) {\n try {\n captureError = this.options.shouldCaptureHttp\n ? this.options.shouldCaptureHttp(status, url, method)\n : status >= 500;\n } catch { this.recordDrop('processingError'); return; /* A failing hook cannot expose an unfiltered event or breadcrumb. */ }\n }\n if (this.networkBreadcrumbCaptureEnabled) {\n try {\n const cleaned = this.cleanBreadcrumbUrl(url);\n if (cleaned.url) {\n const data: NonNullable<Breadcrumb['data']> = {\n method: this.cleanNetworkBreadcrumbMethod(method),\n url: cleaned.url,\n durationMs: boundedNumber(durationMs, 0, 3_600_000, 0),\n };\n if (status !== undefined && Number.isInteger(status) && status >= 0 && status <= 599) data.status = status;\n this.appendBreadcrumb({ occurredAt: new Date().toISOString(),\n category: status === undefined ? 'network' : 'http',\n message: status === undefined ? 'Network failure' : 'HTTP response', data });\n } else if (captureError && !cleaned.safeForError) {\n this.recordDrop('processingError');\n return;\n }\n } catch {\n if (captureError) this.recordDrop('processingError');\n return; // A failing URL hook cannot expose an unfiltered breadcrumb or selected error.\n }\n }\n if (!captureError) return;\n try {\n const network = { method: trim(method || 'GET', 16).toUpperCase(), url, status, durationMs };\n const fields = failure === undefined ? undefined : errorFields(failure);\n const event = this.makeEvent(status === undefined ? 'network' : 'http',\n status === undefined ? (fields?.message || 'Network request failed') : `HTTP ${status}`,\n { name: fields?.name, network });\n this.enqueue(event);\n } catch { this.recordDrop('processingError'); /* a failing hook must not expose an unfiltered event */ }\n }\n\n reportZeroStatusCompletion(method: string, url: string, durationMs: number): void {\n if (this.networkBreadcrumbCaptureEnabled) this.reportNetwork(method, url, 0, durationMs, undefined, false);\n }\n\n captureConsole(values: unknown[]): void {\n if (!this.active || this.destroyed) return;\n try {\n const message = values.map(safeString).join(' ');\n let fields: ReturnType<typeof errorFields> | undefined;\n for (const value of values) {\n let isError = false;\n try { isError = value instanceof Error; }\n catch { /* a hostile value must not suppress the console event */ }\n if (isError) { fields = this.exceptionFields(value); break; }\n }\n this.enqueue(this.makeEvent('console', message, { name: fields?.name, stack: fields?.stack }));\n }\n catch { this.recordDrop('processingError'); /* console behavior is never changed by capture */ }\n }\n\n addBreadcrumb(input: BreadcrumbInput): void {\n if (!this.active || this.destroyed || this.recordingBreadcrumb) return;\n try {\n const breadcrumb = this.cleanBreadcrumb(input, new Date().toISOString());\n if (!breadcrumb) return;\n this.appendBreadcrumb(breadcrumb);\n } catch { /* Diagnostics must never affect the host app or error stats. */ }\n }\n\n private appendBreadcrumb(breadcrumb: Breadcrumb): void {\n if (this.recordingBreadcrumb || this.destroyed) return;\n if (!this.options.beforeBreadcrumb) {\n this.breadcrumbs.push(breadcrumb);\n this.boundBreadcrumbs(this.breadcrumbs);\n return;\n }\n this.recordingBreadcrumb = true;\n try {\n const copy = { ...breadcrumb, ...(breadcrumb.data ? { data: { ...breadcrumb.data } } : {}) };\n const result = this.options.beforeBreadcrumb(copy);\n if (result === false || result === null) return;\n const cleaned = this.cleanBreadcrumb(result === undefined ? copy : result, breadcrumb.occurredAt);\n if (!cleaned || this.destroyed) return;\n this.breadcrumbs.push(cleaned);\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* A breadcrumb hook cannot affect the host app or error stats. */ }\n finally { this.recordingBreadcrumb = false; }\n }\n\n reportNavigation(fromHref: string, toHref: string, trigger: NavigationTrigger): void {\n if (!this.active || this.destroyed || !this.navigationCaptureEnabled) return;\n try {\n const from = this.cleanBreadcrumbUrl(fromHref).url;\n const to = this.cleanBreadcrumbUrl(toHref).url;\n if (!from || !to) return;\n if (from === to) return;\n this.appendBreadcrumb({ occurredAt: new Date().toISOString(), category: 'navigation',\n message: 'Navigation', data: { from, to, trigger } });\n } catch { /* A failing URL hook cannot affect navigation or expose an unfiltered breadcrumb. */ }\n }\n\n clearBreadcrumbs(): void {\n if (!this.active || this.destroyed) return;\n this.breadcrumbs.length = 0;\n }\n\n flush(): Promise<void> {\n if (!this.active || this.destroyed) return Promise.resolve();\n if (this.flushing) return this.flushing;\n let startDrain!: (result: Promise<void>) => void;\n const drainResult = new Promise<void>(resolve => { startDrain = resolve; });\n // Publish the flush before drain can enter a synchronous transport callback.\n this.flushing = drainResult.finally(() => {\n this.flushing = undefined;\n if (this.onlineFlushRequested) {\n this.onlineFlushRequested = false;\n if (!this.destroyed && this.queue.length && !this.isExplicitlyOffline()) void this.flush();\n }\n });\n startDrain(this.drain());\n return this.flushing;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.interval) clearInterval(this.interval);\n if (this.active) {\n window.removeEventListener('error', this.onError);\n if (this.resourceCaptureEnabled) window.removeEventListener('error', this.onResourceError, true);\n if (this.captureUnhandledRejections) window.removeEventListener('unhandledrejection', this.onRejection);\n document.removeEventListener('visibilitychange', this.onVisibility);\n window.removeEventListener('pagehide', this.onPageHide);\n if (this.pauseWhileOffline) window.removeEventListener('online', this.onOnline);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) removeNetworkClient(this);\n if (this.options.captureConsole === true) removeConsoleClient(this);\n if (this.navigationCaptureEnabled) removeNavigationClient(this);\n }\n this.recordDrop('destroyed', this.queue.length + this.inFlight);\n this.queue.length = 0;\n this.breadcrumbs.length = 0;\n this.admittedAt.length = 0;\n this.lastAdmissionClock = undefined;\n this.dedupeCache.clear();\n this.lastDedupeClock = undefined;\n for (const cancel of this.cancelWaits) cancel();\n for (const controller of this.controllers) controller.abort();\n this.resolveDestroy(DESTROYED);\n }\n\n getStats(): { queued: number; sent: number; dropped: number } {\n return { queued: this.queue.length, sent: this.sent, dropped: this.dropped };\n }\n\n getDiagnostics(): BrowserErrorLogDiagnostics {\n return { ...this.getStats(), inFlight: this.destroyed ? 0 : this.inFlight,\n filtered: this.filtered, deduplicated: this.deduplicated,\n droppedByReason: { ...this.droppedByReason } };\n }\n\n private recordDrop(reason: BrowserErrorLogDropReason, count = 1): void {\n this.dropped += count;\n this.droppedByReason[reason] += count;\n }\n\n private readonly onError = (event: ErrorEvent): void => {\n try {\n // Browsers can expose a Window proxy as the target; only global errors belong here.\n if (!(read(event, 'target') instanceof Window)) return;\n const filename = read(event, 'filename');\n const lineno = read(event, 'lineno');\n const colno = read(event, 'colno');\n const context: Record<string, unknown> = {};\n if (typeof filename === 'string' && filename.trim()) context.filename = this.cleanUrl(filename);\n if (typeof lineno === 'number' && Number.isFinite(lineno) && lineno > 0) context.lineno = lineno;\n if (typeof colno === 'number' && Number.isFinite(colno) && colno > 0) context.colno = colno;\n this.captureException(read(event, 'error') ?? read(event, 'message') ?? 'Script error', {\n type: 'javascript', ...(Object.keys(context).length ? { context } : {}),\n });\n } catch { this.recordDrop('processingError'); /* a failing URL hook must not affect the host app */ }\n };\n\n private readonly onResourceError = (event: Event): void => {\n if (this.destroyed || !this.active) return;\n try {\n const target = read(event, 'target');\n if (read(target, 'ownerDocument') !== document || !document.contains(target as Node)) return;\n if (read(target, 'namespaceURI') !== 'http://www.w3.org/1999/xhtml') return;\n const localName = read(target, 'localName');\n if (localName !== 'script' && localName !== 'link' && localName !== 'img') return;\n const getAttribute = read(target, 'getAttribute');\n if (typeof getAttribute !== 'function') return;\n const attribute = (name: string): unknown => {\n try { return Reflect.apply(getAttribute, target, [name]); }\n catch { return undefined; }\n };\n const tag: 'script' | 'link' | 'img' = localName;\n let rawUrl: unknown;\n if (tag === 'script') {\n const src = attribute('src');\n if (typeof src !== 'string' || !src.trim()) return;\n rawUrl = read(target, 'src');\n } else if (tag === 'link') {\n const rel = read(target, 'rel');\n if (typeof rel !== 'string' || !rel.split(/\\s+/).some(token => token.toLowerCase() === 'stylesheet')) return;\n const href = attribute('href');\n if (typeof href !== 'string' || !href.trim()) return;\n rawUrl = read(target, 'href');\n } else {\n const currentSrc = read(target, 'currentSrc');\n if (typeof currentSrc === 'string' && currentSrc.trim()) rawUrl = currentSrc;\n else {\n const src = attribute('src');\n if (typeof src !== 'string' || !src.trim()) return;\n rawUrl = read(target, 'src');\n }\n }\n if (typeof rawUrl !== 'string' || !rawUrl.trim()) return;\n let source: URL;\n try { source = new URL(rawUrl, window.location.href); }\n catch { return; }\n if (source.protocol !== 'http:' && source.protocol !== 'https:') return;\n if (this.isCollectorUrl(source.href)) return;\n const resourceUrl = this.cleanUrl(source.href);\n let cleaned: URL;\n try { cleaned = new URL(resourceUrl); }\n catch { throw new UrlSanitizationError('Invalid resource URL'); }\n if ((cleaned.protocol !== 'http:' && cleaned.protocol !== 'https:') || cleaned.username || cleaned.password || cleaned.search || cleaned.hash) {\n throw new UrlSanitizationError('Unsafe resource URL');\n }\n this.enqueue(this.makeEvent('resource', `Failed to load ${tag} resource`, {\n name: 'ResourceLoadError', context: { resourceTag: tag, resourceUrl },\n }));\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.recordDrop('processingError');\n // A hostile DOM value or hook must not change the host application's error behavior.\n }\n };\n\n private readonly onRejection = (event: PromiseRejectionEvent): void => {\n this.captureException(event.reason, { type: 'promise' });\n };\n\n private readonly onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.tryBeacon();\n };\n\n private readonly onPageHide = (): void => {\n this.tryBeacon();\n };\n\n private readonly onOnline = (): void => {\n if (!this.active || this.destroyed || !this.queue.length || this.isExplicitlyOffline()) return;\n if (this.flushing) this.onlineFlushRequested = true;\n else void this.flush();\n };\n\n private isExplicitlyOffline(): boolean {\n if (!this.pauseWhileOffline) return false;\n try { return typeof navigator !== 'undefined' && navigator.onLine === false; }\n catch { return false; }\n }\n\n private absoluteUrl(url: string): string {\n try { return new URL(url, window.location.href).href; }\n catch { return url; }\n }\n\n private isCollectorUrl(url: string): boolean {\n if (!this.endpoint) return false;\n try {\n const request = new URL(url, window.location.href);\n const collector = new URL(this.endpoint, window.location.href);\n return request.origin === collector.origin && request.pathname === collector.pathname;\n } catch { return url === this.endpoint; }\n }\n\n private cleanUrl(input: unknown): string {\n let value = safeString(input);\n if (this.options.sanitizeUrl) {\n try { value = this.options.sanitizeUrl(value); }\n catch { throw new UrlSanitizationError('URL sanitizer failed'); }\n if (typeof value !== 'string' || !value) throw new UrlSanitizationError('URL sanitizer returned no URL');\n }\n try {\n const url = new URL(value, window.location.href);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return '[unsupported URL]';\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return this.cleanText(url.href, 1024, false);\n } catch { return this.cleanText(value, 1024, false).split(/[?#]/, 1)[0]; }\n }\n\n private cleanBreadcrumbUrl(input: string): { url?: string; safeForError: boolean } {\n const cleaned = this.cleanUrl(input);\n if (cleaned === '[unsupported URL]') return { safeForError: true };\n try {\n // cleanUrl's malformed-input fallback is for general diagnostics; breadcrumbs need a valid URL.\n const url = new URL(cleaned);\n if ((url.protocol !== 'http:' && url.protocol !== 'https:') || url.username || url.password || url.search || url.hash) {\n return { safeForError: false };\n }\n return { url: cleaned.slice(0, BREADCRUMB_LIMITS.dataString), safeForError: true };\n } catch { return { safeForError: false }; }\n }\n\n private cleanNetworkBreadcrumbMethod(input: string): string {\n const method = safeString(input || 'GET').trim().toUpperCase();\n return /^[A-Z0-9!#$%&'*+.^_`|~-]{1,16}$/.test(method) ? method : 'GET';\n }\n\n private cleanText(input: unknown, length: number, replaceUrls = true): string {\n let value = safeString(input);\n if (replaceUrls) {\n value = value.replace(/https?:\\/\\/[^\\s<>\"'()[\\]]+/gi, match => this.cleanUrl(match));\n value = value.replace(/(^|[\\s\"'(\\[=])((?:\\/(?!\\/)|\\.{1,2}\\/)[^\\s<>\"'()[\\]?#]*[?#][^\\s<>\"'()[\\]]+|[a-z][\\w.-]*(?:\\/[^\\s<>\"'()[\\]?#]*)?(?:\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+|#[^\\s<>\"'()[\\]]+)|\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+)/gi,\n (_match, prefix: string, url: string) => {\n const punctuation = /[.,;!]+$/.exec(url)?.[0] ?? '';\n const core = url.slice(0, url.length - punctuation.length);\n const cleaned = this.options.sanitizeUrl\n ? this.cleanUrl(core)\n : core.startsWith('?') ? '[redacted query]' : this.cleanText(core.split(/[?#]/, 1)[0], 1024, false);\n return `${prefix}${cleaned}${punctuation}`;\n });\n }\n return value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+/gi, 'Bearer [REDACTED]')\n .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]')\n .slice(0, length);\n }\n\n private exceptionFields(error: unknown): ReturnType<typeof errorFields> {\n const fields = errorFields(error);\n if (!this.captureErrorCause || error === null || (typeof error !== 'object' && typeof error !== 'function')) return fields;\n const seen = new WeakSet<object>([error]);\n const segments: string[] = [];\n let current: object = error;\n for (let depth = 0; depth < 4; depth++) {\n const cause = read(current, 'cause');\n if (cause === null || (typeof cause !== 'object' && typeof cause !== 'function') || seen.has(cause)) break;\n seen.add(cause);\n const message = read(cause, 'message');\n const stack = read(cause, 'stack');\n if (typeof message !== 'string' && typeof stack !== 'string') break;\n const name = read(cause, 'name');\n const safeName = this.cleanText(typeof name === 'string' ? name : 'Error', 100);\n const safeMessage = typeof message === 'string' ? this.cleanText(message, 256) : '';\n const safeStack = typeof stack === 'string' ? this.cleanText(stack, 480) : '';\n segments.push(`Caused by: ${safeName}: ${safeMessage}${safeStack ? `\\n${safeStack}` : ''}`.slice(0, 480));\n current = cause;\n }\n if (!segments.length) return fields;\n const outer = fields.stack === undefined\n ? `${this.cleanText(fields.name ?? 'Error', 100)}: ${this.cleanText(fields.message, 256)}`\n : this.cleanText(fields.stack, 2048);\n return { ...fields, stack: `${outer}\\n${segments.join('\\n')}` };\n }\n\n private cleanContext(input: unknown): ErrorEventRecord['context'] {\n if (!input || typeof input !== 'object') return undefined;\n const output: NonNullable<ErrorEventRecord['context']> = {};\n let keys: string[];\n try { keys = Object.keys(input); }\n catch { return undefined; }\n for (const key of keys) {\n if (Object.keys(output).length >= 12) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const value = read(input, key);\n const safeKey = this.cleanText(key, 80);\n if (typeof value === 'string') output[safeKey] = this.cleanText(value, 500);\n else if (typeof value === 'number' && Number.isFinite(value)) output[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) output[safeKey] = value;\n }\n return Object.keys(output).length ? output : undefined;\n }\n\n private cleanBreadcrumb(input: unknown, timestamp?: string): Breadcrumb | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const occurredAt = timestamp ?? read(input, 'occurredAt');\n if (typeof occurredAt !== 'string') return undefined;\n try { if (new Date(occurredAt).toISOString() !== occurredAt) return undefined; }\n catch { return undefined; }\n const rawCategory = read(input, 'category');\n const rawMessage = read(input, 'message');\n if ((rawCategory !== undefined && typeof rawCategory !== 'string') || typeof rawMessage !== 'string') return undefined;\n const category = this.cleanText(rawCategory ?? (timestamp ? 'manual' : ''), BREADCRUMB_LIMITS.category);\n const message = this.cleanText(rawMessage, BREADCRUMB_LIMITS.message);\n if (!category.trim() || !message.trim()) return undefined;\n const rawData = read(input, 'data');\n const data: NonNullable<Breadcrumb['data']> = {};\n if (rawData && typeof rawData === 'object') {\n let keys: string[];\n try { keys = Object.keys(rawData); }\n catch { keys = []; }\n for (const key of keys) {\n if (Object.keys(data).length >= BREADCRUMB_LIMITS.dataKeys) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const safeKey = this.cleanText(key, BREADCRUMB_LIMITS.dataKey);\n const value = read(rawData, key);\n if (typeof value === 'string') data[safeKey] = this.cleanText(value, BREADCRUMB_LIMITS.dataString);\n else if (typeof value === 'number' && Number.isFinite(value)) data[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) data[safeKey] = value;\n }\n }\n return { occurredAt, category, message, ...(Object.keys(data).length ? { data } : {}) };\n }\n\n private boundBreadcrumbs(trail: Breadcrumb[]): void {\n while (trail.length > BREADCRUMB_LIMITS.count || byteLength(JSON.stringify(trail)) > BREADCRUMB_LIMITS.bytes) trail.shift();\n }\n\n private cleanBreadcrumbTrail(input: unknown): Breadcrumb[] | undefined {\n let length: number;\n try {\n if (!Array.isArray(input)) return undefined;\n length = input.length;\n } catch { return undefined; }\n if (!Number.isSafeInteger(length) || length < 0) return undefined;\n const trail: Breadcrumb[] = [];\n for (let index = Math.max(0, length - BREADCRUMB_LIMITS.count); index < length; index++) {\n const breadcrumb = this.cleanBreadcrumb(read(input, index));\n if (breadcrumb) {\n trail.push(breadcrumb);\n this.boundBreadcrumbs(trail);\n }\n }\n return trail.length ? trail : undefined;\n }\n\n private cleanNetwork(input: unknown): ErrorEventRecord['network'] {\n if (!input || typeof input !== 'object') return undefined;\n const rawStatus = read(input, 'status');\n const status = typeof rawStatus === 'number' && Number.isInteger(rawStatus) && rawStatus >= 100 && rawStatus <= 599\n ? rawStatus : undefined;\n return {\n method: this.cleanText(read(input, 'method') ?? 'GET', 16).toUpperCase(),\n url: this.cleanUrl(read(input, 'url') ?? ''),\n ...(status === undefined ? {} : { status }),\n durationMs: boundedNumber(read(input, 'durationMs'), 0, 3_600_000, 0),\n };\n }\n\n private makeEvent(type: EventType, message: string, extra: {\n name?: string; stack?: string; componentStack?: string;\n context?: unknown; network?: unknown;\n } = {}): ErrorEventRecord {\n const userAgent = read(navigator, 'userAgent');\n const eventContext = this.cleanContext(extra.context);\n let resolved: unknown;\n try { resolved = this.options.getContext?.(); }\n catch { throw new ContextResolutionError('Context resolver failed'); }\n const dynamicContext = this.cleanContext(resolved);\n const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (dynamicContext || defaults) {\n context = { ...eventContext };\n for (const fields of [dynamicContext, defaults]) {\n if (!fields) continue;\n for (const key of Object.keys(fields)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = fields[key];\n }\n }\n }\n const network = this.cleanNetwork(extra.network);\n return {\n schemaVersion: 1,\n eventId: newId(),\n project: this.cleanText(this.options.project, 80),\n environment: this.cleanText(this.options.environment ?? 'development', 80),\n release: this.cleanText(this.options.release ?? 'unknown', 120),\n sdkVersion: '0.2.6',\n occurredAt: new Date().toISOString(),\n viewId: this.viewId,\n sequence: ++this.sequence,\n elapsedMs: boundedNumber(now() - this.startedAt, 0, 3_600_000, 0),\n type,\n message: this.cleanText(message, 1024),\n ...(extra.name === undefined ? {} : { name: this.cleanText(extra.name, 100) }),\n ...(extra.stack === undefined ? {} : { stack: this.cleanText(extra.stack, 4096) }),\n ...(extra.componentStack === undefined ? {} : { componentStack: this.cleanText(extra.componentStack, 2048) }),\n page: this.cleanUrl(window.location.href),\n runtime: RUNTIMES.has(this.options.runtime as Runtime) ? this.options.runtime! : 'browser',\n ...(typeof userAgent === 'string' ? { browser: this.cleanText(userAgent, 300) } : {}),\n ...(context ? { context } : {}),\n ...(this.breadcrumbs.length ? { breadcrumbs: this.breadcrumbs.map(crumb => ({\n ...crumb, ...(crumb.data ? { data: { ...crumb.data } } : {}),\n })) } : {}),\n ...(network ? { network } : {}),\n };\n }\n\n private sanitizeReplacement(candidate: unknown, base: ErrorEventRecord): ErrorEventRecord {\n const type = read(candidate, 'type');\n const runtime = read(candidate, 'runtime');\n const name = read(candidate, 'name');\n const stack = read(candidate, 'stack');\n const componentStack = read(candidate, 'componentStack');\n const browser = read(candidate, 'browser');\n const context = this.cleanContext(read(candidate, 'context'));\n const breadcrumbs = this.cleanBreadcrumbTrail(read(candidate, 'breadcrumbs'));\n const network = this.cleanNetwork(read(candidate, 'network'));\n return {\n ...base,\n type: EVENT_TYPES.has(type as EventType) ? type as EventType : base.type,\n message: this.cleanText(read(candidate, 'message') ?? base.message, 1024),\n ...(name === undefined ? { name: base.name } : { name: this.cleanText(name, 100) }),\n ...(stack === undefined ? { stack: undefined } : { stack: this.cleanText(stack, 4096) }),\n ...(componentStack === undefined ? { componentStack: base.componentStack } : { componentStack: this.cleanText(componentStack, 2048) }),\n page: this.cleanUrl(read(candidate, 'page') ?? base.page),\n runtime: RUNTIMES.has(runtime as Runtime) ? runtime as Runtime : base.runtime,\n ...(browser === undefined ? { browser: base.browser } : { browser: this.cleanText(browser, 300) }),\n ...(context ? { context } : { context: undefined }),\n ...(breadcrumbs ? { breadcrumbs } : { breadcrumbs: undefined }),\n ...(network ? { network } : { network: undefined }),\n };\n }\n\n private admissionTime(): number | undefined {\n const reading = now();\n const current = Number.isFinite(reading)\n ? Math.max(0, reading, this.lastAdmissionClock ?? 0)\n : this.lastAdmissionClock ?? 0;\n this.lastAdmissionClock = current;\n while (this.admittedAt.length && current - this.admittedAt[0] >= 60_000) this.admittedAt.shift();\n return this.admittedAt.length < this.maxEventsPerMinute! ? current : undefined;\n }\n\n private dedupeTime(): number {\n const reading = now();\n const current = Number.isFinite(reading)\n ? Math.max(0, reading, this.lastDedupeClock ?? 0)\n : this.lastDedupeClock ?? 0;\n this.lastDedupeClock = current;\n return current;\n }\n\n private enqueue(event: ErrorEventRecord): boolean {\n if (this.destroyed) return false;\n if (this.maxEventsPerMinute !== undefined && this.admissionTime() === undefined) {\n this.recordDrop('rateLimit');\n return false;\n }\n let finalEvent = event;\n if (this.options.beforeSend) {\n try {\n const copy = { ...event, context: event.context && { ...event.context },\n breadcrumbs: event.breadcrumbs?.map(crumb => ({ ...crumb, data: crumb.data && { ...crumb.data } })),\n network: event.network && { ...event.network } };\n const result = this.options.beforeSend(copy);\n if (result === false || result === null) { this.filtered++; return false; }\n finalEvent = this.sanitizeReplacement(result === undefined ? copy : result, event);\n } catch { this.recordDrop('processingError'); return false; }\n }\n if (this.destroyed) return false;\n if (this.ignoreMessages.some(message => finalEvent.message.includes(message))) { this.filtered++; return false; }\n // A single event can never make a batch exceed its byte budget.\n if (byteLength(JSON.stringify(finalEvent)) > MAX_BATCH_BYTES) { this.recordDrop('payloadTooLarge'); return false; }\n let fingerprint: string | undefined;\n let dedupeAt: number | undefined;\n if (this.dedupeIntervalMs > 0) {\n dedupeAt = this.dedupeTime();\n for (const [key, acceptedAt] of this.dedupeCache) {\n if (dedupeAt - acceptedAt >= this.dedupeIntervalMs) this.dedupeCache.delete(key);\n }\n fingerprint = eventFingerprint(finalEvent);\n if (this.dedupeCache.has(fingerprint)) { this.deduplicated++; return false; }\n }\n const admittedAt = this.maxEventsPerMinute === undefined ? undefined : this.admissionTime();\n if (this.maxEventsPerMinute !== undefined && admittedAt === undefined) { this.recordDrop('rateLimit'); return false; }\n if (this.queue.length >= this.maxQueueSize) { this.queue.shift(); this.recordDrop('queueOverflow'); }\n this.queue.push(finalEvent);\n if (admittedAt !== undefined) this.admittedAt.push(admittedAt);\n if (fingerprint !== undefined && dedupeAt !== undefined) {\n this.dedupeCache.set(fingerprint, dedupeAt);\n if (this.dedupeCache.size > 50) this.dedupeCache.delete(this.dedupeCache.keys().next().value!);\n }\n if (this.queue.length >= this.maxQueueSize) void this.flush();\n return true;\n }\n\n private takeBatch(maxEvents = MAX_BATCH_EVENTS, maxBytes = MAX_BATCH_BYTES): EventBatch {\n const events: ErrorEventRecord[] = [];\n let bytes = byteLength('{\"schemaVersion\":1,\"events\":[]}');\n while (this.queue.length && events.length < maxEvents) {\n const next = this.queue[0];\n const size = byteLength(JSON.stringify(next)) + (events.length ? 1 : 0);\n if (events.length && bytes + size > maxBytes) break;\n if (!events.length && bytes + size > maxBytes) { this.queue.shift(); this.recordDrop('payloadTooLarge'); continue; }\n events.push(this.queue.shift()!);\n bytes += size;\n }\n return { schemaVersion: 1, events };\n }\n\n private async drain(): Promise<void> {\n while (!this.destroyed && this.queue.length && !this.isExplicitlyOffline()) {\n const batch = this.takeBatch();\n if (batch.events.length) {\n this.inFlight += batch.events.length;\n try { await this.sendWithRetry(batch); }\n finally { this.inFlight -= batch.events.length; }\n }\n }\n }\n\n private async sendWithRetry(batch: EventBatch): Promise<void> {\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length && !this.destroyed; attempt++) {\n const controller = new AbortController();\n this.controllers.add(controller);\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timeoutHandle = setTimeout(() => {\n controller.abort();\n reject(new Error('Collector transport timed out'));\n }, this.transportTimeoutMs);\n });\n let retryDelay: number | undefined;\n try {\n const result = await Promise.race([this.send(batch, controller.signal), timeout, this.destroySignal]);\n if (result === DESTROYED || this.destroyed) return;\n this.sent += batch.events.length;\n return;\n } catch (error) {\n if (this.destroyed) return;\n const status = read(error, 'status');\n const retryable = typeof status !== 'number' || status === 429 || status >= 500;\n if (!retryable || attempt === RETRY_DELAYS_MS.length) break;\n retryDelay = RETRY_DELAYS_MS[attempt];\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n this.controllers.delete(controller);\n }\n if (retryDelay !== undefined) await this.wait(retryDelay);\n }\n if (!this.destroyed) this.recordDrop('deliveryError', batch.events.length);\n }\n\n private async send(batch: EventBatch, signal: AbortSignal): Promise<void> {\n if (this.options.transport) { await this.options.transport(batch, { signal }); return; }\n const response = await window.fetch(this.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n credentials: 'omit',\n signal,\n });\n if (!response.ok) throw new HttpDeliveryError(response.status);\n }\n\n private wait(milliseconds: number): Promise<void> {\n return new Promise(resolve => {\n const finish = () => { clearTimeout(timer); this.cancelWaits.delete(finish); resolve(); };\n const timer = setTimeout(finish, milliseconds);\n this.cancelWaits.add(finish);\n });\n }\n\n private tryBeacon(): void {\n if (this.destroyed || this.options.transport || !this.endpoint || !this.queue.length || this.isExplicitlyOffline()) return;\n try {\n const url = new URL(this.endpoint);\n if (url.origin !== window.location.origin || url.search || url.hash || url.username || url.password) return;\n if (typeof navigator.sendBeacon !== 'function') return;\n const candidates = this.queue.slice(0, MAX_BEACON_EVENTS);\n while (candidates.length > 0) {\n const batch: EventBatch = { schemaVersion: 1, events: candidates };\n const body = JSON.stringify(batch);\n if (byteLength(body) <= MAX_BEACON_BYTES) {\n if (navigator.sendBeacon(this.endpoint, new Blob([body], { type: 'application/json' }))) {\n this.queue.splice(0, candidates.length);\n this.sent += candidates.length;\n }\n return;\n }\n candidates.pop();\n }\n } catch { /* best effort only */ }\n }\n}\n\nconst DESTROYED = Symbol('destroyed');\n\ninterface Instrumentation {\n clients: Set<Client>;\n cleanup(): void;\n}\n\nlet networkInstrumentation: Instrumentation | undefined;\nlet consoleInstrumentation: Instrumentation | undefined;\nlet navigationInstrumentation: Instrumentation | undefined;\n\ntype NavigationTrigger = 'pushState' | 'replaceState' | 'popstate' | 'hashchange';\n\nfunction addNavigationClient(client: Client): void {\n if (!navigationInstrumentation) navigationInstrumentation = installNavigation();\n navigationInstrumentation?.clients.add(client);\n}\n\nfunction removeNavigationClient(client: Client): void {\n const instrumentation = navigationInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n navigationInstrumentation = undefined;\n }\n}\n\nfunction inheritedHistoryDescriptor(historyObject: History, key: 'pushState' | 'replaceState'): PropertyDescriptor | undefined {\n const seen = new Set<object>();\n let prototype = Object.getPrototypeOf(historyObject);\n while (prototype && !seen.has(prototype)) {\n seen.add(prototype);\n const descriptor = Object.getOwnPropertyDescriptor(prototype, key);\n if (descriptor) return descriptor;\n prototype = Object.getPrototypeOf(prototype);\n }\n return undefined;\n}\n\nfunction installNavigation(): Instrumentation | undefined {\n let historyObject: History;\n let lastHref: string;\n let originalPush: History['pushState'];\n let originalReplace: History['replaceState'];\n let ownPush: PropertyDescriptor | undefined;\n let ownReplace: PropertyDescriptor | undefined;\n let inheritedPush: PropertyDescriptor | undefined;\n let inheritedReplace: PropertyDescriptor | undefined;\n try {\n historyObject = window.history;\n lastHref = window.location.href;\n ownPush = Object.getOwnPropertyDescriptor(historyObject, 'pushState');\n ownReplace = Object.getOwnPropertyDescriptor(historyObject, 'replaceState');\n inheritedPush = ownPush ? undefined : inheritedHistoryDescriptor(historyObject, 'pushState');\n inheritedReplace = ownReplace ? undefined : inheritedHistoryDescriptor(historyObject, 'replaceState');\n if ((ownPush && !('value' in ownPush)) || (ownReplace && !('value' in ownReplace))) return undefined;\n if ((!ownPush && (!inheritedPush || !('value' in inheritedPush) || inheritedPush.writable !== true)) ||\n (!ownReplace && (!inheritedReplace || !('value' in inheritedReplace) || inheritedReplace.writable !== true))) return undefined;\n originalPush = ownPush ? ownPush.value : historyObject.pushState;\n originalReplace = ownReplace ? ownReplace.value : historyObject.replaceState;\n if (typeof originalPush !== 'function' || typeof originalReplace !== 'function') return undefined;\n const canInstall = (own?: PropertyDescriptor) => own\n ? own.configurable === true || own.writable === true\n : Object.isExtensible(historyObject);\n if (!canInstall(ownPush) || !canInstall(ownReplace)) return undefined;\n } catch { return undefined; }\n\n const clients = new Set<Client>();\n const report = (trigger: NavigationTrigger): void => {\n try {\n const toHref = window.location.href;\n if (toHref === lastHref) return;\n const fromHref = lastHref;\n lastHref = toHref;\n for (const client of clients) {\n try { client.reportNavigation(fromHref, toHref, trigger); }\n catch { /* Telemetry must never alter a successful native call. */ }\n }\n } catch { /* Location can be unavailable in a restricted host. */ }\n };\n const wrappedPush: History['pushState'] = function (this: History, ...args: Parameters<History['pushState']>): void {\n const result = Reflect.apply(originalPush, this, args);\n report('pushState');\n return result;\n };\n const wrappedReplace: History['replaceState'] = function (this: History, ...args: Parameters<History['replaceState']>): void {\n const result = Reflect.apply(originalReplace, this, args);\n report('replaceState');\n return result;\n };\n const onPopState = () => { report('popstate'); };\n const onHashChange = () => { report('hashchange'); };\n const restore = (key: 'pushState' | 'replaceState', wrapper: History['pushState'], own?: PropertyDescriptor): void => {\n try {\n const current = Object.getOwnPropertyDescriptor(historyObject, key);\n if (!current || !('value' in current) || current.value !== wrapper) return;\n if (own) Object.defineProperty(historyObject, key, own);\n else Reflect.deleteProperty(historyObject, key);\n } catch { /* Keep a host-installed replacement and never throw during cleanup. */ }\n };\n let pushInstalled = false;\n let replaceInstalled = false;\n try {\n Object.defineProperty(historyObject, 'pushState', { configurable: ownPush?.configurable ?? true,\n enumerable: ownPush?.enumerable ?? false, writable: ownPush?.writable ?? true, value: wrappedPush });\n pushInstalled = true;\n Object.defineProperty(historyObject, 'replaceState', { configurable: ownReplace?.configurable ?? true,\n enumerable: ownReplace?.enumerable ?? false, writable: ownReplace?.writable ?? true, value: wrappedReplace });\n replaceInstalled = true;\n window.addEventListener('popstate', onPopState);\n window.addEventListener('hashchange', onHashChange);\n } catch {\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n if (replaceInstalled) restore('replaceState', wrappedReplace, ownReplace);\n if (pushInstalled) restore('pushState', wrappedPush, ownPush);\n return undefined;\n }\n return { clients, cleanup() {\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n restore('pushState', wrappedPush, ownPush);\n restore('replaceState', wrappedReplace, ownReplace);\n } };\n}\n\nfunction addNetworkClient(client: Client): void {\n if (!networkInstrumentation) networkInstrumentation = installNetwork();\n networkInstrumentation.clients.add(client);\n}\n\nfunction removeNetworkClient(client: Client): void {\n const instrumentation = networkInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n networkInstrumentation = undefined;\n }\n}\n\nfunction describeFetch(input: RequestInfo | URL, init?: RequestInit): { url: string; method: string; signal?: AbortSignal | null } {\n let requestUrl: string | undefined;\n if (typeof Request !== 'undefined' && input !== null && typeof input === 'object') {\n if (input instanceof Request) requestUrl = read(input, 'url') as string | undefined;\n else {\n try { requestUrl = Object.getOwnPropertyDescriptor(Request.prototype, 'url')?.get?.call(input); }\n catch { /* not a genuine Request */ }\n }\n }\n const initSignal = read(init, 'signal');\n return {\n url: requestUrl ?? safeString(input),\n method: safeString(read(init, 'method') ?? (requestUrl === undefined ? undefined : read(input, 'method')) ?? 'GET'),\n signal: (initSignal === undefined ? (requestUrl === undefined ? undefined : read(input, 'signal')) : initSignal) as AbortSignal | null | undefined,\n };\n}\n\nfunction installNetwork(): Instrumentation {\n const clients = new Set<Client>();\n const originalFetch = window.fetch;\n let wrappedFetch: typeof fetch | undefined;\n if (typeof originalFetch === 'function') {\n wrappedFetch = function (this: typeof window, ...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {\n if (!clients.size) return Reflect.apply(originalFetch, this, args);\n const started = now();\n let request: ReturnType<typeof describeFetch>;\n try { request = describeFetch(args[0], args[1]); }\n catch { request = { url: '', method: 'GET' }; }\n let promise: ReturnType<typeof fetch>;\n try { promise = Reflect.apply(originalFetch, this, args); }\n catch (error) {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n }\n return promise.then(\n response => {\n try {\n const status = response.status;\n for (const client of clients) client.reportNetwork(request.method, request.url, status, now() - started);\n } catch { /* telemetry cannot change the fetch result */ }\n return response;\n },\n error => {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n },\n );\n };\n window.fetch = wrappedFetch;\n }\n\n const prototype = typeof XMLHttpRequest === 'undefined' ? undefined : XMLHttpRequest.prototype;\n const originalOpen = prototype?.open;\n const originalSend = prototype?.send;\n const metadata = new WeakMap<XMLHttpRequest, { method: string; url: string }>();\n const pending = new WeakMap<XMLHttpRequest, () => void>();\n let wrappedOpen: typeof XMLHttpRequest.prototype.open | undefined;\n let wrappedSend: typeof XMLHttpRequest.prototype.send | undefined;\n if (prototype && originalOpen && originalSend) {\n wrappedOpen = (function (this: XMLHttpRequest, ...args: unknown[]): void {\n const result = Reflect.apply(originalOpen, this, args);\n pending.get(this)?.();\n try { metadata.set(this, { method: safeString(args[0]), url: safeString(args[1]) }); }\n catch { /* native open already succeeded */ }\n return result;\n }) as typeof XMLHttpRequest.prototype.open;\n wrappedSend = function (this: XMLHttpRequest, ...args: Parameters<XMLHttpRequest['send']>): void {\n if (!clients.size) return Reflect.apply(originalSend, this, args);\n const details = metadata.get(this);\n if (!details) return Reflect.apply(originalSend, this, args);\n const started = now();\n let aborted = false;\n let failed = false;\n let completed = false;\n const onAbort = () => { aborted = true; };\n const onFailure = () => { failed = true; };\n const cleanup = () => {\n this.removeEventListener('abort', onAbort);\n this.removeEventListener('error', onFailure);\n this.removeEventListener('timeout', onFailure);\n this.removeEventListener('loadend', onLoadEnd);\n if (pending.get(this) === cleanup) pending.delete(this);\n };\n const onLoadEnd = () => {\n completed = true;\n cleanup();\n if (aborted) return;\n try {\n const status = this.status;\n if (status === 0 && !failed) {\n for (const client of clients) client.reportZeroStatusCompletion(details.method, details.url, now() - started);\n return;\n }\n for (const client of clients) client.reportNetwork(details.method, details.url,\n status === 0 ? undefined : status, now() - started);\n } catch { /* XHR state may be unavailable */ }\n };\n try {\n this.addEventListener('abort', onAbort);\n this.addEventListener('error', onFailure);\n this.addEventListener('timeout', onFailure);\n this.addEventListener('loadend', onLoadEnd);\n } catch {\n cleanup();\n return Reflect.apply(originalSend, this, args);\n }\n try {\n const result = Reflect.apply(originalSend, this, args);\n if (!completed) pending.set(this, cleanup);\n return result;\n }\n catch (error) {\n cleanup();\n throw error;\n }\n };\n prototype.open = wrappedOpen!;\n prototype.send = wrappedSend;\n }\n return {\n clients,\n cleanup() {\n if (wrappedFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n if (prototype && wrappedOpen && prototype.open === wrappedOpen) prototype.open = originalOpen!;\n if (prototype && wrappedSend && prototype.send === wrappedSend) prototype.send = originalSend!;\n },\n };\n}\n\nfunction addConsoleClient(client: Client): void {\n if (!consoleInstrumentation) consoleInstrumentation = installConsole();\n consoleInstrumentation.clients.add(client);\n}\n\nfunction removeConsoleClient(client: Client): void {\n const instrumentation = consoleInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n consoleInstrumentation = undefined;\n }\n}\n\nfunction installConsole(): Instrumentation {\n const clients = new Set<Client>();\n const original = console.error;\n const wrapped: typeof console.error = function (this: Console, ...values: unknown[]): void {\n try { return Reflect.apply(original, this, values); }\n finally { for (const client of clients) client.captureConsole(values); }\n };\n console.error = wrapped;\n return { clients, cleanup() { if (console.error === wrapped) console.error = original; } };\n}\n\nexport function init(options: BrowserErrorLogOptions): BrowserErrorLogDiagnosticsClient {\n return new Client(options);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export const SCHEMA_VERSION = 1 as const;\nexport const SDK_VERSION = '0.2.8';\n\nexport type EventType = 'javascript' | 'promise' | 'react' | 'console' | 'http' | 'network' | 'resource' | 'manual';\nexport type Runtime = 'browser' | 'webview-ios' | 'webview-android' | 'unknown';\n\nexport const BREADCRUMB_LIMITS = {\n count: 20, bytes: 12_000, category: 40, message: 256,\n dataKeys: 6, dataKey: 80, dataString: 200,\n} as const;\n\nexport interface Breadcrumb {\n occurredAt: string;\n category: string;\n message: string;\n data?: Record<string, string | number | boolean | null>;\n}\n\n/** Validates the bounded, canonical UTC breadcrumb representation on the wire. */\nexport function isBreadcrumbTrail(value: unknown): value is Breadcrumb[] {\n try {\n if (!Array.isArray(value) || value.length > BREADCRUMB_LIMITS.count) return false;\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return false;\n if (Object.keys(item).some(key => !['occurredAt', 'category', 'message', 'data'].includes(key))) return false;\n if (typeof item.occurredAt !== 'string' || !Number.isFinite(Date.parse(item.occurredAt)) ||\n new Date(item.occurredAt).toISOString() !== item.occurredAt) return false;\n if (typeof item.category !== 'string' || !item.category.trim() || item.category.length > BREADCRUMB_LIMITS.category ||\n typeof item.message !== 'string' || !item.message.trim() || item.message.length > BREADCRUMB_LIMITS.message) return false;\n if (item.data !== undefined) {\n if (!item.data || typeof item.data !== 'object' || Array.isArray(item.data)) return false;\n const entries = Object.entries(item.data);\n if (entries.length > BREADCRUMB_LIMITS.dataKeys || entries.some(([key, field]) =>\n key.length > BREADCRUMB_LIMITS.dataKey || !(field === null || typeof field === 'boolean' ||\n (typeof field === 'string' && field.length <= BREADCRUMB_LIMITS.dataString) ||\n (typeof field === 'number' && Number.isFinite(field))))) return false;\n }\n }\n return new TextEncoder().encode(JSON.stringify(value)).length <= BREADCRUMB_LIMITS.bytes;\n } catch { return false; }\n}\n\nexport interface ErrorEventRecord {\n schemaVersion: 1;\n eventId: string;\n project: string;\n environment: string;\n release: string;\n sdkVersion: string;\n occurredAt: string;\n receivedAt?: string;\n viewId: string;\n sequence: number;\n elapsedMs: number;\n type: EventType;\n message: string;\n name?: string;\n stack?: string;\n componentStack?: string;\n page: string;\n runtime: Runtime;\n browser?: string;\n context?: Record<string, string | number | boolean | null>;\n breadcrumbs?: Breadcrumb[];\n network?: { method: string; url: string; status?: number; durationMs: number };\n}\n\nexport interface EventBatch { schemaVersion: 1; events: ErrorEventRecord[] }\nexport interface EventFilter {\n project?: string;\n environment?: string;\n type?: EventType;\n query?: string;\n from?: string;\n to?: string;\n cursor?: string;\n limit?: number;\n}\nexport interface EventPage { events: ErrorEventRecord[]; nextCursor?: string }\nexport interface EventDataSource {\n listEvents(filter: EventFilter, signal?: AbortSignal): Promise<EventPage>;\n getEvent(project: string, eventId: string, signal?: AbortSignal): Promise<ErrorEventRecord | null>;\n}\n\nexport const EVENT_LABELS: Record<EventType, string> = {\n javascript: 'JavaScript', promise: 'Promise', react: 'React', console: 'Console',\n http: 'HTTP error', network: 'Network failure', resource: 'Resource failure', manual: 'Manual',\n};\n", "import { BREADCRUMB_LIMITS, type Breadcrumb, type ErrorEventRecord, type EventBatch, type EventType, type Runtime } from '@ihyeon/browser-error-log-protocol';\n\nexport type { Breadcrumb, ErrorEventRecord, EventBatch } from '@ihyeon/browser-error-log-protocol';\n\nexport interface CaptureExtra {\n type?: EventType;\n context?: Record<string, unknown>;\n componentStack?: string;\n}\n\nexport interface TransportContext { signal: AbortSignal }\n\nexport interface BrowserErrorLogOptions {\n project: string;\n environment?: string;\n release?: string;\n /** Scalar metadata added to every captured event; event context takes precedence. */\n context?: Record<string, unknown>;\n /** Returns scalar metadata from current application state for each new event. */\n getContext?: () => Record<string, unknown> | undefined;\n endpoint?: string;\n transport?: (batch: EventBatch, context: TransportContext) => void | Promise<void>;\n runtime?: Runtime;\n enabled?: boolean;\n captureConsole?: boolean;\n /** Captures global JavaScript errors automatically; defaults to true. */\n captureGlobalErrors?: boolean;\n /** Captures unhandled promise rejections automatically; defaults to true. */\n captureUnhandledRejections?: boolean;\n /** Includes up to four sanitized Error.cause entries in exception stacks; defaults to false. */\n captureErrorCause?: boolean;\n /** Captures script, stylesheet link, and image load errors; defaults to false. */\n captureResourceErrors?: boolean;\n /** Records sanitized History navigation breadcrumbs; defaults to false. */\n captureNavigation?: boolean;\n /** Defaults to true. With a custom transport, automatic network capture requires endpoint for collector exclusion. */\n captureNetwork?: boolean;\n /** Records sanitized fetch/XHR completion breadcrumbs; defaults to false. Custom transports require endpoint. */\n captureNetworkBreadcrumbs?: boolean;\n /** Filters or replaces each sanitized breadcrumb before it enters the trail. */\n beforeBreadcrumb?: (breadcrumb: Breadcrumb) => BreadcrumbInput | false | null | void;\n beforeSend?: (event: ErrorEventRecord) => ErrorEventRecord | false | null | void;\n /** Suppresses events whose final sanitized message contains any listed literal string. */\n ignoreMessages?: readonly string[];\n sanitizeUrl?: (url: string) => string;\n shouldCaptureHttp?: (status: number, url: string, method: string) => boolean;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n /** Maximum new events admitted in any rolling 60 seconds; disabled by default. */\n maxEventsPerMinute?: number;\n /** Probability of admitting each captured event, from 0 to 1; defaults to 1. */\n sampleRate?: number;\n /** Suppresses matching sanitized events for this many milliseconds; disabled by default. */\n dedupeIntervalMs?: number;\n /** Per-attempt deadline, clamped to 250\u201360000 ms; defaults to 5000 ms. */\n transportTimeoutMs?: number;\n /** Holds queued delivery and beacons while navigator.onLine is exactly false; defaults to false. */\n pauseWhileOffline?: boolean;\n}\n\nexport interface BrowserErrorLogClient {\n captureException(error: unknown, extra?: CaptureExtra): void;\n flush(): Promise<void>;\n destroy(): void;\n getStats(): { queued: number; sent: number; dropped: number };\n}\n\nexport interface BreadcrumbInput {\n message: string;\n category?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface BrowserErrorLogBreadcrumbClient extends BrowserErrorLogClient {\n addBreadcrumb(input: BreadcrumbInput): void;\n clearBreadcrumbs(): void;\n}\n\nexport type BrowserErrorLogDropReason = 'rateLimit' | 'queueOverflow' | 'payloadTooLarge'\n | 'processingError' | 'deliveryError' | 'destroyed';\n\nexport interface BrowserErrorLogDiagnostics {\n queued: number;\n sent: number;\n dropped: number;\n inFlight: number;\n filtered: number;\n deduplicated: number;\n droppedByReason: Record<BrowserErrorLogDropReason, number>;\n}\n\nexport interface BrowserErrorLogDiagnosticsClient extends BrowserErrorLogBreadcrumbClient {\n getDiagnostics(): BrowserErrorLogDiagnostics;\n}\n\nconst MAX_BATCH_EVENTS = 20;\nconst MAX_BATCH_BYTES = 48_000;\nconst MAX_BEACON_EVENTS = 10;\nconst MAX_BEACON_BYTES = 24_000;\nconst RETRY_DELAYS_MS = [250, 500];\nconst SENSITIVE_KEY = /(?:password|passwd|token|secret|authorization|cookie|session|api.?key|credential|bearer|private.?key)/i;\nconst EVENT_TYPES = new Set<EventType>(['javascript', 'promise', 'react', 'console', 'http', 'network', 'manual', 'resource']);\nconst RUNTIMES = new Set<Runtime>(['browser', 'webview-ios', 'webview-android', 'unknown']);\nlet fallbackId = 0;\n\nfunction read(object: unknown, key: PropertyKey): unknown {\n try { return object == null ? undefined : Reflect.get(Object(object), key); }\n catch { return undefined; }\n}\n\nfunction safeString(value: unknown): string {\n try { return String(value); }\n catch { return '[unavailable]'; }\n}\n\nfunction trim(value: unknown, length: number): string {\n return safeString(value).slice(0, length);\n}\n\nfunction now(): number {\n try { return performance.now(); }\n catch { return Date.now(); }\n}\n\nfunction newId(): string {\n try {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n } catch { /* fall through */ }\n return `${Date.now().toString(36)}-${(++fallbackId).toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction isAbort(error: unknown, signal?: AbortSignal | null): boolean {\n try { if (signal?.aborted) return true; }\n catch { /* ignore hostile signal */ }\n return read(error, 'name') === 'AbortError' || read(error, 'code') === 20;\n}\n\nfunction errorFields(error: unknown): { message: string; name?: string; stack?: string } {\n if (error === null || error === undefined) return { message: 'Unknown error' };\n const message = read(error, 'message');\n const name = read(error, 'name');\n const stack = read(error, 'stack');\n return {\n message: message == null ? safeString(error) : safeString(message),\n ...(name == null ? {} : { name: safeString(name) }),\n ...(stack == null ? {} : { stack: safeString(stack) }),\n };\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nfunction boundedNumber(value: unknown, minimum: number, maximum: number, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.min(maximum, Math.max(minimum, Math.floor(value)))\n : fallback;\n}\n\nfunction eventFingerprint(event: ErrorEventRecord): string {\n return JSON.stringify([\n event.type, event.name ?? null, event.message, event.stack ?? null,\n event.componentStack ?? null, event.project, event.environment, event.release,\n event.page, event.runtime, event.browser ?? null,\n event.context === undefined ? null : Object.keys(event.context).sort().map(key => [key, event.context![key]]),\n event.network === undefined ? null : [event.network.method, event.network.url, event.network.status ?? null],\n ]);\n}\n\nclass HttpDeliveryError extends Error {\n constructor(readonly status: number) { super(`Collector responded ${status}`); }\n}\n\nclass UrlSanitizationError extends Error {}\n\nclass ContextResolutionError extends Error {}\n\nclass Client implements BrowserErrorLogDiagnosticsClient {\n private readonly active: boolean;\n private readonly endpoint?: string;\n private readonly options: BrowserErrorLogOptions;\n private readonly networkCaptureEnabled: boolean;\n private readonly networkBreadcrumbCaptureEnabled: boolean;\n private readonly navigationCaptureEnabled: boolean;\n private readonly captureErrorCause: boolean;\n private readonly captureGlobalErrors: boolean;\n private readonly captureUnhandledRejections: boolean;\n private readonly resourceCaptureEnabled: boolean;\n private readonly pauseWhileOffline: boolean;\n private readonly transportTimeoutMs: number;\n private readonly startedAt = now();\n private readonly viewId = newId();\n private readonly seenErrors = new WeakSet<object>();\n private readonly queue: ErrorEventRecord[] = [];\n private readonly breadcrumbs: Breadcrumb[] = [];\n private recordingBreadcrumb = false;\n private readonly maxQueueSize: number;\n private readonly maxEventsPerMinute?: number;\n private readonly sampleRate: number;\n private readonly dedupeIntervalMs: number;\n private readonly ignoreMessages: readonly string[];\n private readonly dedupeCache = new Map<string, number>();\n private lastDedupeClock?: number;\n private readonly admittedAt: number[] = [];\n private readonly cancelWaits = new Set<() => void>();\n private readonly controllers = new Set<AbortController>();\n private readonly destroySignal: Promise<symbol>;\n private resolveDestroy!: (value: symbol) => void;\n private interval?: ReturnType<typeof setInterval>;\n private flushing?: Promise<void>;\n private onlineFlushRequested = false;\n private sequence = 0;\n private inFlight = 0;\n private sent = 0;\n private dropped = 0;\n private filtered = 0;\n private deduplicated = 0;\n private readonly droppedByReason: Record<BrowserErrorLogDropReason, number> = {\n rateLimit: 0, queueOverflow: 0, payloadTooLarge: 0,\n processingError: 0, deliveryError: 0, destroyed: 0,\n };\n private destroyed = false;\n private lastAdmissionClock?: number;\n\n constructor(options: BrowserErrorLogOptions) {\n this.options = options;\n this.active = options.enabled !== false && typeof window !== 'undefined' && typeof document !== 'undefined';\n const automaticNetworkAllowed = !options.transport || Boolean(options.endpoint);\n this.networkCaptureEnabled = options.captureNetwork !== false && automaticNetworkAllowed;\n this.networkBreadcrumbCaptureEnabled = options.captureNetworkBreadcrumbs === true && automaticNetworkAllowed;\n this.navigationCaptureEnabled = options.captureNavigation === true;\n this.captureErrorCause = options.captureErrorCause === true;\n this.captureGlobalErrors = options.captureGlobalErrors !== false;\n this.captureUnhandledRejections = options.captureUnhandledRejections !== false;\n this.resourceCaptureEnabled = options.captureResourceErrors === true;\n this.pauseWhileOffline = options.pauseWhileOffline === true;\n this.maxQueueSize = boundedNumber(options.maxQueueSize, 1, 100, 50);\n this.maxEventsPerMinute = typeof options.maxEventsPerMinute === 'number' && Number.isFinite(options.maxEventsPerMinute)\n ? boundedNumber(options.maxEventsPerMinute, 1, 1000, 1) : undefined;\n this.sampleRate = typeof options.sampleRate === 'number' && Number.isFinite(options.sampleRate)\n ? Math.min(1, Math.max(0, options.sampleRate)) : 1;\n this.dedupeIntervalMs = boundedNumber(options.dedupeIntervalMs, 0, 60_000, 0);\n this.ignoreMessages = Array.isArray(options.ignoreMessages)\n ? options.ignoreMessages.filter((value): value is string => typeof value === 'string' && value.length > 0)\n : [];\n this.transportTimeoutMs = boundedNumber(options.transportTimeoutMs, 250, 60_000, 5_000);\n this.destroySignal = new Promise(resolve => { this.resolveDestroy = resolve; });\n if (!this.active) return;\n if (!options.project || typeof options.project !== 'string') throw new Error('project is required');\n if (!options.transport && !options.endpoint) throw new Error('endpoint or transport is required');\n this.endpoint = options.endpoint ? this.absoluteUrl(options.endpoint) : undefined;\n if (this.captureGlobalErrors) window.addEventListener('error', this.onError);\n if (this.resourceCaptureEnabled) window.addEventListener('error', this.onResourceError, true);\n if (this.captureUnhandledRejections) window.addEventListener('unhandledrejection', this.onRejection);\n document.addEventListener('visibilitychange', this.onVisibility);\n window.addEventListener('pagehide', this.onPageHide);\n if (this.pauseWhileOffline) window.addEventListener('online', this.onOnline);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) addNetworkClient(this);\n if (options.captureConsole === true) addConsoleClient(this);\n if (this.navigationCaptureEnabled) addNavigationClient(this);\n this.interval = setInterval(() => { void this.flush(); }, boundedNumber(options.flushIntervalMs, 10, 60_000, 10_000));\n }\n\n captureException(error: unknown, extra: CaptureExtra = {}): void {\n if (!this.active || this.destroyed || isAbort(error)) return;\n try {\n if (error !== null && (typeof error === 'object' || typeof error === 'function')) {\n if (this.seenErrors.has(error)) { this.deduplicated++; return; }\n }\n const fields = this.exceptionFields(error);\n const type = EVENT_TYPES.has(extra.type as EventType) ? extra.type! : 'manual';\n const event = this.makeEvent(type, fields.message, {\n name: fields.name,\n stack: fields.stack,\n componentStack: extra.componentStack,\n context: extra.context,\n });\n if (this.enqueue(event) && error !== null && (typeof error === 'object' || typeof error === 'function')) {\n this.seenErrors.add(error);\n }\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.recordDrop('processingError');\n // Diagnostics must never affect the host app.\n }\n }\n\n reportNetwork(method: string, url: string, status: number | undefined, durationMs: number,\n failure?: unknown, allowErrorCapture = true): void {\n if (this.destroyed || !this.active || this.isCollectorUrl(url) || isAbort(failure)) return;\n let captureError = this.networkCaptureEnabled && allowErrorCapture;\n if (captureError && status !== undefined) {\n try {\n captureError = this.options.shouldCaptureHttp\n ? this.options.shouldCaptureHttp(status, url, method)\n : status >= 500;\n } catch { this.recordDrop('processingError'); return; /* A failing hook cannot expose an unfiltered event or breadcrumb. */ }\n }\n if (this.networkBreadcrumbCaptureEnabled) {\n try {\n const cleaned = this.cleanBreadcrumbUrl(url);\n if (cleaned.url) {\n const data: NonNullable<Breadcrumb['data']> = {\n method: this.cleanNetworkBreadcrumbMethod(method),\n url: cleaned.url,\n durationMs: boundedNumber(durationMs, 0, 3_600_000, 0),\n };\n if (status !== undefined && Number.isInteger(status) && status >= 0 && status <= 599) data.status = status;\n this.appendBreadcrumb({ occurredAt: new Date().toISOString(),\n category: status === undefined ? 'network' : 'http',\n message: status === undefined ? 'Network failure' : 'HTTP response', data });\n } else if (captureError && !cleaned.safeForError) {\n this.recordDrop('processingError');\n return;\n }\n } catch {\n if (captureError) this.recordDrop('processingError');\n return; // A failing URL hook cannot expose an unfiltered breadcrumb or selected error.\n }\n }\n if (!captureError) return;\n try {\n const network = { method: trim(method || 'GET', 16).toUpperCase(), url, status, durationMs };\n const fields = failure === undefined ? undefined : errorFields(failure);\n const event = this.makeEvent(status === undefined ? 'network' : 'http',\n status === undefined ? (fields?.message || 'Network request failed') : `HTTP ${status}`,\n { name: fields?.name, network });\n this.enqueue(event);\n } catch { this.recordDrop('processingError'); /* a failing hook must not expose an unfiltered event */ }\n }\n\n reportZeroStatusCompletion(method: string, url: string, durationMs: number): void {\n if (this.networkBreadcrumbCaptureEnabled) this.reportNetwork(method, url, 0, durationMs, undefined, false);\n }\n\n captureConsole(values: unknown[]): void {\n if (!this.active || this.destroyed) return;\n try {\n const message = values.map(safeString).join(' ');\n let fields: ReturnType<typeof errorFields> | undefined;\n for (const value of values) {\n let isError = false;\n try { isError = value instanceof Error; }\n catch { /* a hostile value must not suppress the console event */ }\n if (isError) { fields = this.exceptionFields(value); break; }\n }\n this.enqueue(this.makeEvent('console', message, { name: fields?.name, stack: fields?.stack }));\n }\n catch { this.recordDrop('processingError'); /* console behavior is never changed by capture */ }\n }\n\n addBreadcrumb(input: BreadcrumbInput): void {\n if (!this.active || this.destroyed || this.recordingBreadcrumb) return;\n try {\n const breadcrumb = this.cleanBreadcrumb(input, new Date().toISOString());\n if (!breadcrumb) return;\n this.appendBreadcrumb(breadcrumb);\n } catch { /* Diagnostics must never affect the host app or error stats. */ }\n }\n\n private appendBreadcrumb(breadcrumb: Breadcrumb): void {\n if (this.recordingBreadcrumb || this.destroyed) return;\n if (!this.options.beforeBreadcrumb) {\n this.breadcrumbs.push(breadcrumb);\n this.boundBreadcrumbs(this.breadcrumbs);\n return;\n }\n this.recordingBreadcrumb = true;\n try {\n const copy = { ...breadcrumb, ...(breadcrumb.data ? { data: { ...breadcrumb.data } } : {}) };\n const result = this.options.beforeBreadcrumb(copy);\n if (result === false || result === null) return;\n const cleaned = this.cleanBreadcrumb(result === undefined ? copy : result, breadcrumb.occurredAt);\n if (!cleaned || this.destroyed) return;\n this.breadcrumbs.push(cleaned);\n this.boundBreadcrumbs(this.breadcrumbs);\n } catch { /* A breadcrumb hook cannot affect the host app or error stats. */ }\n finally { this.recordingBreadcrumb = false; }\n }\n\n reportNavigation(fromHref: string, toHref: string, trigger: NavigationTrigger): void {\n if (!this.active || this.destroyed || !this.navigationCaptureEnabled) return;\n try {\n const from = this.cleanBreadcrumbUrl(fromHref).url;\n const to = this.cleanBreadcrumbUrl(toHref).url;\n if (!from || !to) return;\n if (from === to) return;\n this.appendBreadcrumb({ occurredAt: new Date().toISOString(), category: 'navigation',\n message: 'Navigation', data: { from, to, trigger } });\n } catch { /* A failing URL hook cannot affect navigation or expose an unfiltered breadcrumb. */ }\n }\n\n clearBreadcrumbs(): void {\n if (!this.active || this.destroyed) return;\n this.breadcrumbs.length = 0;\n }\n\n flush(): Promise<void> {\n if (!this.active || this.destroyed) return Promise.resolve();\n if (this.flushing) return this.flushing;\n let startDrain!: (result: Promise<void>) => void;\n const drainResult = new Promise<void>(resolve => { startDrain = resolve; });\n // Publish the flush before drain can enter a synchronous transport callback.\n this.flushing = drainResult.finally(() => {\n this.flushing = undefined;\n if (this.onlineFlushRequested) {\n this.onlineFlushRequested = false;\n if (!this.destroyed && this.queue.length && !this.isExplicitlyOffline()) void this.flush();\n }\n });\n startDrain(this.drain());\n return this.flushing;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.interval) clearInterval(this.interval);\n if (this.active) {\n if (this.captureGlobalErrors) window.removeEventListener('error', this.onError);\n if (this.resourceCaptureEnabled) window.removeEventListener('error', this.onResourceError, true);\n if (this.captureUnhandledRejections) window.removeEventListener('unhandledrejection', this.onRejection);\n document.removeEventListener('visibilitychange', this.onVisibility);\n window.removeEventListener('pagehide', this.onPageHide);\n if (this.pauseWhileOffline) window.removeEventListener('online', this.onOnline);\n if (this.networkCaptureEnabled || this.networkBreadcrumbCaptureEnabled) removeNetworkClient(this);\n if (this.options.captureConsole === true) removeConsoleClient(this);\n if (this.navigationCaptureEnabled) removeNavigationClient(this);\n }\n this.recordDrop('destroyed', this.queue.length + this.inFlight);\n this.queue.length = 0;\n this.breadcrumbs.length = 0;\n this.admittedAt.length = 0;\n this.lastAdmissionClock = undefined;\n this.dedupeCache.clear();\n this.lastDedupeClock = undefined;\n for (const cancel of this.cancelWaits) cancel();\n for (const controller of this.controllers) controller.abort();\n this.resolveDestroy(DESTROYED);\n }\n\n getStats(): { queued: number; sent: number; dropped: number } {\n return { queued: this.queue.length, sent: this.sent, dropped: this.dropped };\n }\n\n getDiagnostics(): BrowserErrorLogDiagnostics {\n return { ...this.getStats(), inFlight: this.destroyed ? 0 : this.inFlight,\n filtered: this.filtered, deduplicated: this.deduplicated,\n droppedByReason: { ...this.droppedByReason } };\n }\n\n private recordDrop(reason: BrowserErrorLogDropReason, count = 1): void {\n this.dropped += count;\n this.droppedByReason[reason] += count;\n }\n\n private readonly onError = (event: ErrorEvent): void => {\n try {\n // Browsers can expose a Window proxy as the target; only global errors belong here.\n if (!(read(event, 'target') instanceof Window)) return;\n const filename = read(event, 'filename');\n const lineno = read(event, 'lineno');\n const colno = read(event, 'colno');\n const context: Record<string, unknown> = {};\n if (typeof filename === 'string' && filename.trim()) context.filename = this.cleanUrl(filename);\n if (typeof lineno === 'number' && Number.isFinite(lineno) && lineno > 0) context.lineno = lineno;\n if (typeof colno === 'number' && Number.isFinite(colno) && colno > 0) context.colno = colno;\n this.captureException(read(event, 'error') ?? read(event, 'message') ?? 'Script error', {\n type: 'javascript', ...(Object.keys(context).length ? { context } : {}),\n });\n } catch { this.recordDrop('processingError'); /* a failing URL hook must not affect the host app */ }\n };\n\n private readonly onResourceError = (event: Event): void => {\n if (this.destroyed || !this.active) return;\n try {\n const target = read(event, 'target');\n if (read(target, 'ownerDocument') !== document || !document.contains(target as Node)) return;\n if (read(target, 'namespaceURI') !== 'http://www.w3.org/1999/xhtml') return;\n const localName = read(target, 'localName');\n if (localName !== 'script' && localName !== 'link' && localName !== 'img') return;\n const getAttribute = read(target, 'getAttribute');\n if (typeof getAttribute !== 'function') return;\n const attribute = (name: string): unknown => {\n try { return Reflect.apply(getAttribute, target, [name]); }\n catch { return undefined; }\n };\n const tag: 'script' | 'link' | 'img' = localName;\n let rawUrl: unknown;\n if (tag === 'script') {\n const src = attribute('src');\n if (typeof src !== 'string' || !src.trim()) return;\n rawUrl = read(target, 'src');\n } else if (tag === 'link') {\n const rel = read(target, 'rel');\n if (typeof rel !== 'string' || !rel.split(/\\s+/).some(token => token.toLowerCase() === 'stylesheet')) return;\n const href = attribute('href');\n if (typeof href !== 'string' || !href.trim()) return;\n rawUrl = read(target, 'href');\n } else {\n const currentSrc = read(target, 'currentSrc');\n if (typeof currentSrc === 'string' && currentSrc.trim()) rawUrl = currentSrc;\n else {\n const src = attribute('src');\n if (typeof src !== 'string' || !src.trim()) return;\n rawUrl = read(target, 'src');\n }\n }\n if (typeof rawUrl !== 'string' || !rawUrl.trim()) return;\n let source: URL;\n try { source = new URL(rawUrl, window.location.href); }\n catch { return; }\n if (source.protocol !== 'http:' && source.protocol !== 'https:') return;\n if (this.isCollectorUrl(source.href)) return;\n const resourceUrl = this.cleanUrl(source.href);\n let cleaned: URL;\n try { cleaned = new URL(resourceUrl); }\n catch { throw new UrlSanitizationError('Invalid resource URL'); }\n if ((cleaned.protocol !== 'http:' && cleaned.protocol !== 'https:') || cleaned.username || cleaned.password || cleaned.search || cleaned.hash) {\n throw new UrlSanitizationError('Unsafe resource URL');\n }\n this.enqueue(this.makeEvent('resource', `Failed to load ${tag} resource`, {\n name: 'ResourceLoadError', context: { resourceTag: tag, resourceUrl },\n }));\n } catch (error) {\n if (error instanceof UrlSanitizationError || error instanceof ContextResolutionError) this.recordDrop('processingError');\n // A hostile DOM value or hook must not change the host application's error behavior.\n }\n };\n\n private readonly onRejection = (event: PromiseRejectionEvent): void => {\n this.captureException(event.reason, { type: 'promise' });\n };\n\n private readonly onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.tryBeacon();\n };\n\n private readonly onPageHide = (): void => {\n this.tryBeacon();\n };\n\n private readonly onOnline = (): void => {\n if (!this.active || this.destroyed || !this.queue.length || this.isExplicitlyOffline()) return;\n if (this.flushing) this.onlineFlushRequested = true;\n else void this.flush();\n };\n\n private isExplicitlyOffline(): boolean {\n if (!this.pauseWhileOffline) return false;\n try { return typeof navigator !== 'undefined' && navigator.onLine === false; }\n catch { return false; }\n }\n\n private absoluteUrl(url: string): string {\n try { return new URL(url, window.location.href).href; }\n catch { return url; }\n }\n\n private isCollectorUrl(url: string): boolean {\n if (!this.endpoint) return false;\n try {\n const request = new URL(url, window.location.href);\n const collector = new URL(this.endpoint, window.location.href);\n return request.origin === collector.origin && request.pathname === collector.pathname;\n } catch { return url === this.endpoint; }\n }\n\n private cleanUrl(input: unknown): string {\n let value = safeString(input);\n if (this.options.sanitizeUrl) {\n try { value = this.options.sanitizeUrl(value); }\n catch { throw new UrlSanitizationError('URL sanitizer failed'); }\n if (typeof value !== 'string' || !value) throw new UrlSanitizationError('URL sanitizer returned no URL');\n }\n try {\n const url = new URL(value, window.location.href);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return '[unsupported URL]';\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n return this.cleanText(url.href, 1024, false);\n } catch { return this.cleanText(value, 1024, false).split(/[?#]/, 1)[0]; }\n }\n\n private cleanBreadcrumbUrl(input: string): { url?: string; safeForError: boolean } {\n const cleaned = this.cleanUrl(input);\n if (cleaned === '[unsupported URL]') return { safeForError: true };\n try {\n // cleanUrl's malformed-input fallback is for general diagnostics; breadcrumbs need a valid URL.\n const url = new URL(cleaned);\n if ((url.protocol !== 'http:' && url.protocol !== 'https:') || url.username || url.password || url.search || url.hash) {\n return { safeForError: false };\n }\n return { url: cleaned.slice(0, BREADCRUMB_LIMITS.dataString), safeForError: true };\n } catch { return { safeForError: false }; }\n }\n\n private cleanNetworkBreadcrumbMethod(input: string): string {\n const method = safeString(input || 'GET').trim().toUpperCase();\n return /^[A-Z0-9!#$%&'*+.^_`|~-]{1,16}$/.test(method) ? method : 'GET';\n }\n\n private cleanText(input: unknown, length: number, replaceUrls = true): string {\n let value = safeString(input);\n if (replaceUrls) {\n value = value.replace(/https?:\\/\\/[^\\s<>\"'()[\\]]+/gi, match => this.cleanUrl(match));\n value = value.replace(/(^|[\\s\"'(\\[=])((?:\\/(?!\\/)|\\.{1,2}\\/)[^\\s<>\"'()[\\]?#]*[?#][^\\s<>\"'()[\\]]+|[a-z][\\w.-]*(?:\\/[^\\s<>\"'()[\\]?#]*)?(?:\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+|#[^\\s<>\"'()[\\]]+)|\\?[a-z0-9_.-]+=[^\\s<>\"'()[\\]]+)/gi,\n (_match, prefix: string, url: string) => {\n const punctuation = /[.,;!]+$/.exec(url)?.[0] ?? '';\n const core = url.slice(0, url.length - punctuation.length);\n const cleaned = this.options.sanitizeUrl\n ? this.cleanUrl(core)\n : core.startsWith('?') ? '[redacted query]' : this.cleanText(core.split(/[?#]/, 1)[0], 1024, false);\n return `${prefix}${cleaned}${punctuation}`;\n });\n }\n return value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+/gi, 'Bearer [REDACTED]')\n .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi, '[REDACTED_EMAIL]')\n .slice(0, length);\n }\n\n private exceptionFields(error: unknown): ReturnType<typeof errorFields> {\n const fields = errorFields(error);\n if (!this.captureErrorCause || error === null || (typeof error !== 'object' && typeof error !== 'function')) return fields;\n const seen = new WeakSet<object>([error]);\n const segments: string[] = [];\n let current: object = error;\n for (let depth = 0; depth < 4; depth++) {\n const cause = read(current, 'cause');\n if (cause === null || (typeof cause !== 'object' && typeof cause !== 'function') || seen.has(cause)) break;\n seen.add(cause);\n const message = read(cause, 'message');\n const stack = read(cause, 'stack');\n if (typeof message !== 'string' && typeof stack !== 'string') break;\n const name = read(cause, 'name');\n const safeName = this.cleanText(typeof name === 'string' ? name : 'Error', 100);\n const safeMessage = typeof message === 'string' ? this.cleanText(message, 256) : '';\n const safeStack = typeof stack === 'string' ? this.cleanText(stack, 480) : '';\n segments.push(`Caused by: ${safeName}: ${safeMessage}${safeStack ? `\\n${safeStack}` : ''}`.slice(0, 480));\n current = cause;\n }\n if (!segments.length) return fields;\n const outer = fields.stack === undefined\n ? `${this.cleanText(fields.name ?? 'Error', 100)}: ${this.cleanText(fields.message, 256)}`\n : this.cleanText(fields.stack, 2048);\n return { ...fields, stack: `${outer}\\n${segments.join('\\n')}` };\n }\n\n private cleanContext(input: unknown): ErrorEventRecord['context'] {\n if (!input || typeof input !== 'object') return undefined;\n const output: NonNullable<ErrorEventRecord['context']> = {};\n let keys: string[];\n try { keys = Object.keys(input); }\n catch { return undefined; }\n for (const key of keys) {\n if (Object.keys(output).length >= 12) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const value = read(input, key);\n const safeKey = this.cleanText(key, 80);\n if (typeof value === 'string') output[safeKey] = this.cleanText(value, 500);\n else if (typeof value === 'number' && Number.isFinite(value)) output[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) output[safeKey] = value;\n }\n return Object.keys(output).length ? output : undefined;\n }\n\n private cleanBreadcrumb(input: unknown, timestamp?: string): Breadcrumb | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const occurredAt = timestamp ?? read(input, 'occurredAt');\n if (typeof occurredAt !== 'string') return undefined;\n try { if (new Date(occurredAt).toISOString() !== occurredAt) return undefined; }\n catch { return undefined; }\n const rawCategory = read(input, 'category');\n const rawMessage = read(input, 'message');\n if ((rawCategory !== undefined && typeof rawCategory !== 'string') || typeof rawMessage !== 'string') return undefined;\n const category = this.cleanText(rawCategory ?? (timestamp ? 'manual' : ''), BREADCRUMB_LIMITS.category);\n const message = this.cleanText(rawMessage, BREADCRUMB_LIMITS.message);\n if (!category.trim() || !message.trim()) return undefined;\n const rawData = read(input, 'data');\n const data: NonNullable<Breadcrumb['data']> = {};\n if (rawData && typeof rawData === 'object') {\n let keys: string[];\n try { keys = Object.keys(rawData); }\n catch { keys = []; }\n for (const key of keys) {\n if (Object.keys(data).length >= BREADCRUMB_LIMITS.dataKeys) break;\n if (SENSITIVE_KEY.test(key)) continue;\n const safeKey = this.cleanText(key, BREADCRUMB_LIMITS.dataKey);\n const value = read(rawData, key);\n if (typeof value === 'string') data[safeKey] = this.cleanText(value, BREADCRUMB_LIMITS.dataString);\n else if (typeof value === 'number' && Number.isFinite(value)) data[safeKey] = value;\n else if (typeof value === 'boolean' || value === null) data[safeKey] = value;\n }\n }\n return { occurredAt, category, message, ...(Object.keys(data).length ? { data } : {}) };\n }\n\n private boundBreadcrumbs(trail: Breadcrumb[]): void {\n while (trail.length > BREADCRUMB_LIMITS.count || byteLength(JSON.stringify(trail)) > BREADCRUMB_LIMITS.bytes) trail.shift();\n }\n\n private cleanBreadcrumbTrail(input: unknown): Breadcrumb[] | undefined {\n let length: number;\n try {\n if (!Array.isArray(input)) return undefined;\n length = input.length;\n } catch { return undefined; }\n if (!Number.isSafeInteger(length) || length < 0) return undefined;\n const trail: Breadcrumb[] = [];\n for (let index = Math.max(0, length - BREADCRUMB_LIMITS.count); index < length; index++) {\n const breadcrumb = this.cleanBreadcrumb(read(input, index));\n if (breadcrumb) {\n trail.push(breadcrumb);\n this.boundBreadcrumbs(trail);\n }\n }\n return trail.length ? trail : undefined;\n }\n\n private cleanNetwork(input: unknown): ErrorEventRecord['network'] {\n if (!input || typeof input !== 'object') return undefined;\n const rawStatus = read(input, 'status');\n const status = typeof rawStatus === 'number' && Number.isInteger(rawStatus) && rawStatus >= 100 && rawStatus <= 599\n ? rawStatus : undefined;\n return {\n method: this.cleanText(read(input, 'method') ?? 'GET', 16).toUpperCase(),\n url: this.cleanUrl(read(input, 'url') ?? ''),\n ...(status === undefined ? {} : { status }),\n durationMs: boundedNumber(read(input, 'durationMs'), 0, 3_600_000, 0),\n };\n }\n\n private makeEvent(type: EventType, message: string, extra: {\n name?: string; stack?: string; componentStack?: string;\n context?: unknown; network?: unknown;\n } = {}): ErrorEventRecord {\n const userAgent = read(navigator, 'userAgent');\n const eventContext = this.cleanContext(extra.context);\n let resolved: unknown;\n try { resolved = this.options.getContext?.(); }\n catch { throw new ContextResolutionError('Context resolver failed'); }\n const dynamicContext = this.cleanContext(resolved);\n const defaults = this.cleanContext(this.options.context);\n let context = eventContext;\n if (dynamicContext || defaults) {\n context = { ...eventContext };\n for (const fields of [dynamicContext, defaults]) {\n if (!fields) continue;\n for (const key of Object.keys(fields)) {\n if (Object.keys(context).length >= 12) break;\n if (!Object.prototype.hasOwnProperty.call(context, key)) context[key] = fields[key];\n }\n }\n }\n const network = this.cleanNetwork(extra.network);\n return {\n schemaVersion: 1,\n eventId: newId(),\n project: this.cleanText(this.options.project, 80),\n environment: this.cleanText(this.options.environment ?? 'development', 80),\n release: this.cleanText(this.options.release ?? 'unknown', 120),\n sdkVersion: '0.2.8',\n occurredAt: new Date().toISOString(),\n viewId: this.viewId,\n sequence: ++this.sequence,\n elapsedMs: boundedNumber(now() - this.startedAt, 0, 3_600_000, 0),\n type,\n message: this.cleanText(message, 1024),\n ...(extra.name === undefined ? {} : { name: this.cleanText(extra.name, 100) }),\n ...(extra.stack === undefined ? {} : { stack: this.cleanText(extra.stack, 4096) }),\n ...(extra.componentStack === undefined ? {} : { componentStack: this.cleanText(extra.componentStack, 2048) }),\n page: this.cleanUrl(window.location.href),\n runtime: RUNTIMES.has(this.options.runtime as Runtime) ? this.options.runtime! : 'browser',\n ...(typeof userAgent === 'string' ? { browser: this.cleanText(userAgent, 300) } : {}),\n ...(context ? { context } : {}),\n ...(this.breadcrumbs.length ? { breadcrumbs: this.breadcrumbs.map(crumb => ({\n ...crumb, ...(crumb.data ? { data: { ...crumb.data } } : {}),\n })) } : {}),\n ...(network ? { network } : {}),\n };\n }\n\n private sanitizeReplacement(candidate: unknown, base: ErrorEventRecord): ErrorEventRecord {\n const type = read(candidate, 'type');\n const runtime = read(candidate, 'runtime');\n const name = read(candidate, 'name');\n const stack = read(candidate, 'stack');\n const componentStack = read(candidate, 'componentStack');\n const browser = read(candidate, 'browser');\n const context = this.cleanContext(read(candidate, 'context'));\n const breadcrumbs = this.cleanBreadcrumbTrail(read(candidate, 'breadcrumbs'));\n const network = this.cleanNetwork(read(candidate, 'network'));\n return {\n ...base,\n type: EVENT_TYPES.has(type as EventType) ? type as EventType : base.type,\n message: this.cleanText(read(candidate, 'message') ?? base.message, 1024),\n ...(name === undefined ? { name: base.name } : { name: this.cleanText(name, 100) }),\n ...(stack === undefined ? { stack: undefined } : { stack: this.cleanText(stack, 4096) }),\n ...(componentStack === undefined ? { componentStack: base.componentStack } : { componentStack: this.cleanText(componentStack, 2048) }),\n page: this.cleanUrl(read(candidate, 'page') ?? base.page),\n runtime: RUNTIMES.has(runtime as Runtime) ? runtime as Runtime : base.runtime,\n ...(browser === undefined ? { browser: base.browser } : { browser: this.cleanText(browser, 300) }),\n ...(context ? { context } : { context: undefined }),\n ...(breadcrumbs ? { breadcrumbs } : { breadcrumbs: undefined }),\n ...(network ? { network } : { network: undefined }),\n };\n }\n\n private admissionTime(): number | undefined {\n const reading = now();\n const current = Number.isFinite(reading)\n ? Math.max(0, reading, this.lastAdmissionClock ?? 0)\n : this.lastAdmissionClock ?? 0;\n this.lastAdmissionClock = current;\n while (this.admittedAt.length && current - this.admittedAt[0] >= 60_000) this.admittedAt.shift();\n return this.admittedAt.length < this.maxEventsPerMinute! ? current : undefined;\n }\n\n private dedupeTime(): number {\n const reading = now();\n const current = Number.isFinite(reading)\n ? Math.max(0, reading, this.lastDedupeClock ?? 0)\n : this.lastDedupeClock ?? 0;\n this.lastDedupeClock = current;\n return current;\n }\n\n private enqueue(event: ErrorEventRecord): boolean {\n if (this.destroyed) return false;\n if (this.maxEventsPerMinute !== undefined && this.admissionTime() === undefined) {\n this.recordDrop('rateLimit');\n return false;\n }\n let finalEvent = event;\n if (this.options.beforeSend) {\n try {\n const copy = { ...event, context: event.context && { ...event.context },\n breadcrumbs: event.breadcrumbs?.map(crumb => ({ ...crumb, data: crumb.data && { ...crumb.data } })),\n network: event.network && { ...event.network } };\n const result = this.options.beforeSend(copy);\n if (result === false || result === null) { this.filtered++; return false; }\n finalEvent = this.sanitizeReplacement(result === undefined ? copy : result, event);\n } catch { this.recordDrop('processingError'); return false; }\n }\n if (this.destroyed) return false;\n if (this.ignoreMessages.some(message => finalEvent.message.includes(message))) { this.filtered++; return false; }\n if (this.sampleRate === 0 || (this.sampleRate < 1 && Math.random() >= this.sampleRate)) {\n this.filtered++;\n return false;\n }\n // A single event can never make a batch exceed its byte budget.\n if (byteLength(JSON.stringify(finalEvent)) > MAX_BATCH_BYTES) { this.recordDrop('payloadTooLarge'); return false; }\n let fingerprint: string | undefined;\n let dedupeAt: number | undefined;\n if (this.dedupeIntervalMs > 0) {\n dedupeAt = this.dedupeTime();\n for (const [key, acceptedAt] of this.dedupeCache) {\n if (dedupeAt - acceptedAt >= this.dedupeIntervalMs) this.dedupeCache.delete(key);\n }\n fingerprint = eventFingerprint(finalEvent);\n if (this.dedupeCache.has(fingerprint)) { this.deduplicated++; return false; }\n }\n const admittedAt = this.maxEventsPerMinute === undefined ? undefined : this.admissionTime();\n if (this.maxEventsPerMinute !== undefined && admittedAt === undefined) { this.recordDrop('rateLimit'); return false; }\n if (this.queue.length >= this.maxQueueSize) { this.queue.shift(); this.recordDrop('queueOverflow'); }\n this.queue.push(finalEvent);\n if (admittedAt !== undefined) this.admittedAt.push(admittedAt);\n if (fingerprint !== undefined && dedupeAt !== undefined) {\n this.dedupeCache.set(fingerprint, dedupeAt);\n if (this.dedupeCache.size > 50) this.dedupeCache.delete(this.dedupeCache.keys().next().value!);\n }\n if (this.queue.length >= this.maxQueueSize) void this.flush();\n return true;\n }\n\n private takeBatch(maxEvents = MAX_BATCH_EVENTS, maxBytes = MAX_BATCH_BYTES): EventBatch {\n const events: ErrorEventRecord[] = [];\n let bytes = byteLength('{\"schemaVersion\":1,\"events\":[]}');\n while (this.queue.length && events.length < maxEvents) {\n const next = this.queue[0];\n const size = byteLength(JSON.stringify(next)) + (events.length ? 1 : 0);\n if (events.length && bytes + size > maxBytes) break;\n if (!events.length && bytes + size > maxBytes) { this.queue.shift(); this.recordDrop('payloadTooLarge'); continue; }\n events.push(this.queue.shift()!);\n bytes += size;\n }\n return { schemaVersion: 1, events };\n }\n\n private async drain(): Promise<void> {\n while (!this.destroyed && this.queue.length && !this.isExplicitlyOffline()) {\n const batch = this.takeBatch();\n if (batch.events.length) {\n this.inFlight += batch.events.length;\n try { await this.sendWithRetry(batch); }\n finally { this.inFlight -= batch.events.length; }\n }\n }\n }\n\n private async sendWithRetry(batch: EventBatch): Promise<void> {\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length && !this.destroyed; attempt++) {\n const controller = new AbortController();\n this.controllers.add(controller);\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timeoutHandle = setTimeout(() => {\n controller.abort();\n reject(new Error('Collector transport timed out'));\n }, this.transportTimeoutMs);\n });\n let retryDelay: number | undefined;\n try {\n const result = await Promise.race([this.send(batch, controller.signal), timeout, this.destroySignal]);\n if (result === DESTROYED || this.destroyed) return;\n this.sent += batch.events.length;\n return;\n } catch (error) {\n if (this.destroyed) return;\n const status = read(error, 'status');\n const retryable = typeof status !== 'number' || status === 429 || status >= 500;\n if (!retryable || attempt === RETRY_DELAYS_MS.length) break;\n retryDelay = RETRY_DELAYS_MS[attempt];\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n this.controllers.delete(controller);\n }\n if (retryDelay !== undefined) await this.wait(retryDelay);\n }\n if (!this.destroyed) this.recordDrop('deliveryError', batch.events.length);\n }\n\n private async send(batch: EventBatch, signal: AbortSignal): Promise<void> {\n if (this.options.transport) { await this.options.transport(batch, { signal }); return; }\n const response = await window.fetch(this.endpoint!, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n credentials: 'omit',\n signal,\n });\n if (!response.ok) throw new HttpDeliveryError(response.status);\n }\n\n private wait(milliseconds: number): Promise<void> {\n return new Promise(resolve => {\n const finish = () => { clearTimeout(timer); this.cancelWaits.delete(finish); resolve(); };\n const timer = setTimeout(finish, milliseconds);\n this.cancelWaits.add(finish);\n });\n }\n\n private tryBeacon(): void {\n if (this.destroyed || this.options.transport || !this.endpoint || !this.queue.length || this.isExplicitlyOffline()) return;\n try {\n const url = new URL(this.endpoint);\n if (url.origin !== window.location.origin || url.search || url.hash || url.username || url.password) return;\n if (typeof navigator.sendBeacon !== 'function') return;\n const candidates = this.queue.slice(0, MAX_BEACON_EVENTS);\n while (candidates.length > 0) {\n const batch: EventBatch = { schemaVersion: 1, events: candidates };\n const body = JSON.stringify(batch);\n if (byteLength(body) <= MAX_BEACON_BYTES) {\n if (navigator.sendBeacon(this.endpoint, new Blob([body], { type: 'application/json' }))) {\n this.queue.splice(0, candidates.length);\n this.sent += candidates.length;\n }\n return;\n }\n candidates.pop();\n }\n } catch { /* best effort only */ }\n }\n}\n\nconst DESTROYED = Symbol('destroyed');\n\ninterface Instrumentation {\n clients: Set<Client>;\n cleanup(): void;\n}\n\nlet networkInstrumentation: Instrumentation | undefined;\nlet consoleInstrumentation: Instrumentation | undefined;\nlet navigationInstrumentation: Instrumentation | undefined;\n\ntype NavigationTrigger = 'pushState' | 'replaceState' | 'popstate' | 'hashchange';\n\nfunction addNavigationClient(client: Client): void {\n if (!navigationInstrumentation) navigationInstrumentation = installNavigation();\n navigationInstrumentation?.clients.add(client);\n}\n\nfunction removeNavigationClient(client: Client): void {\n const instrumentation = navigationInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n navigationInstrumentation = undefined;\n }\n}\n\nfunction inheritedHistoryDescriptor(historyObject: History, key: 'pushState' | 'replaceState'): PropertyDescriptor | undefined {\n const seen = new Set<object>();\n let prototype = Object.getPrototypeOf(historyObject);\n while (prototype && !seen.has(prototype)) {\n seen.add(prototype);\n const descriptor = Object.getOwnPropertyDescriptor(prototype, key);\n if (descriptor) return descriptor;\n prototype = Object.getPrototypeOf(prototype);\n }\n return undefined;\n}\n\nfunction installNavigation(): Instrumentation | undefined {\n let historyObject: History;\n let lastHref: string;\n let originalPush: History['pushState'];\n let originalReplace: History['replaceState'];\n let ownPush: PropertyDescriptor | undefined;\n let ownReplace: PropertyDescriptor | undefined;\n let inheritedPush: PropertyDescriptor | undefined;\n let inheritedReplace: PropertyDescriptor | undefined;\n try {\n historyObject = window.history;\n lastHref = window.location.href;\n ownPush = Object.getOwnPropertyDescriptor(historyObject, 'pushState');\n ownReplace = Object.getOwnPropertyDescriptor(historyObject, 'replaceState');\n inheritedPush = ownPush ? undefined : inheritedHistoryDescriptor(historyObject, 'pushState');\n inheritedReplace = ownReplace ? undefined : inheritedHistoryDescriptor(historyObject, 'replaceState');\n if ((ownPush && !('value' in ownPush)) || (ownReplace && !('value' in ownReplace))) return undefined;\n if ((!ownPush && (!inheritedPush || !('value' in inheritedPush) || inheritedPush.writable !== true)) ||\n (!ownReplace && (!inheritedReplace || !('value' in inheritedReplace) || inheritedReplace.writable !== true))) return undefined;\n originalPush = ownPush ? ownPush.value : historyObject.pushState;\n originalReplace = ownReplace ? ownReplace.value : historyObject.replaceState;\n if (typeof originalPush !== 'function' || typeof originalReplace !== 'function') return undefined;\n const canInstall = (own?: PropertyDescriptor) => own\n ? own.configurable === true || own.writable === true\n : Object.isExtensible(historyObject);\n if (!canInstall(ownPush) || !canInstall(ownReplace)) return undefined;\n } catch { return undefined; }\n\n const clients = new Set<Client>();\n const report = (trigger: NavigationTrigger): void => {\n try {\n const toHref = window.location.href;\n if (toHref === lastHref) return;\n const fromHref = lastHref;\n lastHref = toHref;\n for (const client of clients) {\n try { client.reportNavigation(fromHref, toHref, trigger); }\n catch { /* Telemetry must never alter a successful native call. */ }\n }\n } catch { /* Location can be unavailable in a restricted host. */ }\n };\n const wrappedPush: History['pushState'] = function (this: History, ...args: Parameters<History['pushState']>): void {\n const result = Reflect.apply(originalPush, this, args);\n report('pushState');\n return result;\n };\n const wrappedReplace: History['replaceState'] = function (this: History, ...args: Parameters<History['replaceState']>): void {\n const result = Reflect.apply(originalReplace, this, args);\n report('replaceState');\n return result;\n };\n const onPopState = () => { report('popstate'); };\n const onHashChange = () => { report('hashchange'); };\n const restore = (key: 'pushState' | 'replaceState', wrapper: History['pushState'], own?: PropertyDescriptor): void => {\n try {\n const current = Object.getOwnPropertyDescriptor(historyObject, key);\n if (!current || !('value' in current) || current.value !== wrapper) return;\n if (own) Object.defineProperty(historyObject, key, own);\n else Reflect.deleteProperty(historyObject, key);\n } catch { /* Keep a host-installed replacement and never throw during cleanup. */ }\n };\n let pushInstalled = false;\n let replaceInstalled = false;\n try {\n Object.defineProperty(historyObject, 'pushState', { configurable: ownPush?.configurable ?? true,\n enumerable: ownPush?.enumerable ?? false, writable: ownPush?.writable ?? true, value: wrappedPush });\n pushInstalled = true;\n Object.defineProperty(historyObject, 'replaceState', { configurable: ownReplace?.configurable ?? true,\n enumerable: ownReplace?.enumerable ?? false, writable: ownReplace?.writable ?? true, value: wrappedReplace });\n replaceInstalled = true;\n window.addEventListener('popstate', onPopState);\n window.addEventListener('hashchange', onHashChange);\n } catch {\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n if (replaceInstalled) restore('replaceState', wrappedReplace, ownReplace);\n if (pushInstalled) restore('pushState', wrappedPush, ownPush);\n return undefined;\n }\n return { clients, cleanup() {\n try { window.removeEventListener('popstate', onPopState); } catch { /* best effort */ }\n try { window.removeEventListener('hashchange', onHashChange); } catch { /* best effort */ }\n restore('pushState', wrappedPush, ownPush);\n restore('replaceState', wrappedReplace, ownReplace);\n } };\n}\n\nfunction addNetworkClient(client: Client): void {\n if (!networkInstrumentation) networkInstrumentation = installNetwork();\n networkInstrumentation.clients.add(client);\n}\n\nfunction removeNetworkClient(client: Client): void {\n const instrumentation = networkInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n networkInstrumentation = undefined;\n }\n}\n\nfunction describeFetch(input: RequestInfo | URL, init?: RequestInit): { url: string; method: string; signal?: AbortSignal | null } {\n let requestUrl: string | undefined;\n if (typeof Request !== 'undefined' && input !== null && typeof input === 'object') {\n if (input instanceof Request) requestUrl = read(input, 'url') as string | undefined;\n else {\n try { requestUrl = Object.getOwnPropertyDescriptor(Request.prototype, 'url')?.get?.call(input); }\n catch { /* not a genuine Request */ }\n }\n }\n const initSignal = read(init, 'signal');\n return {\n url: requestUrl ?? safeString(input),\n method: safeString(read(init, 'method') ?? (requestUrl === undefined ? undefined : read(input, 'method')) ?? 'GET'),\n signal: (initSignal === undefined ? (requestUrl === undefined ? undefined : read(input, 'signal')) : initSignal) as AbortSignal | null | undefined,\n };\n}\n\nfunction installNetwork(): Instrumentation {\n const clients = new Set<Client>();\n const originalFetch = window.fetch;\n let wrappedFetch: typeof fetch | undefined;\n if (typeof originalFetch === 'function') {\n wrappedFetch = function (this: typeof window, ...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {\n if (!clients.size) return Reflect.apply(originalFetch, this, args);\n const started = now();\n let request: ReturnType<typeof describeFetch>;\n try { request = describeFetch(args[0], args[1]); }\n catch { request = { url: '', method: 'GET' }; }\n let promise: ReturnType<typeof fetch>;\n try { promise = Reflect.apply(originalFetch, this, args); }\n catch (error) {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n }\n return promise.then(\n response => {\n try {\n const status = response.status;\n for (const client of clients) client.reportNetwork(request.method, request.url, status, now() - started);\n } catch { /* telemetry cannot change the fetch result */ }\n return response;\n },\n error => {\n if (!isAbort(error, request.signal)) for (const client of clients) client.reportNetwork(request.method, request.url, undefined, now() - started, error);\n throw error;\n },\n );\n };\n window.fetch = wrappedFetch;\n }\n\n const prototype = typeof XMLHttpRequest === 'undefined' ? undefined : XMLHttpRequest.prototype;\n const originalOpen = prototype?.open;\n const originalSend = prototype?.send;\n const metadata = new WeakMap<XMLHttpRequest, { method: string; url: string }>();\n const pending = new WeakMap<XMLHttpRequest, () => void>();\n let wrappedOpen: typeof XMLHttpRequest.prototype.open | undefined;\n let wrappedSend: typeof XMLHttpRequest.prototype.send | undefined;\n if (prototype && originalOpen && originalSend) {\n wrappedOpen = (function (this: XMLHttpRequest, ...args: unknown[]): void {\n const result = Reflect.apply(originalOpen, this, args);\n pending.get(this)?.();\n try { metadata.set(this, { method: safeString(args[0]), url: safeString(args[1]) }); }\n catch { /* native open already succeeded */ }\n return result;\n }) as typeof XMLHttpRequest.prototype.open;\n wrappedSend = function (this: XMLHttpRequest, ...args: Parameters<XMLHttpRequest['send']>): void {\n if (!clients.size) return Reflect.apply(originalSend, this, args);\n const details = metadata.get(this);\n if (!details) return Reflect.apply(originalSend, this, args);\n const started = now();\n let aborted = false;\n let failed = false;\n let completed = false;\n const onAbort = () => { aborted = true; };\n const onFailure = () => { failed = true; };\n const cleanup = () => {\n this.removeEventListener('abort', onAbort);\n this.removeEventListener('error', onFailure);\n this.removeEventListener('timeout', onFailure);\n this.removeEventListener('loadend', onLoadEnd);\n if (pending.get(this) === cleanup) pending.delete(this);\n };\n const onLoadEnd = () => {\n completed = true;\n cleanup();\n if (aborted) return;\n try {\n const status = this.status;\n if (status === 0 && !failed) {\n for (const client of clients) client.reportZeroStatusCompletion(details.method, details.url, now() - started);\n return;\n }\n for (const client of clients) client.reportNetwork(details.method, details.url,\n status === 0 ? undefined : status, now() - started);\n } catch { /* XHR state may be unavailable */ }\n };\n try {\n this.addEventListener('abort', onAbort);\n this.addEventListener('error', onFailure);\n this.addEventListener('timeout', onFailure);\n this.addEventListener('loadend', onLoadEnd);\n } catch {\n cleanup();\n return Reflect.apply(originalSend, this, args);\n }\n try {\n const result = Reflect.apply(originalSend, this, args);\n if (!completed) pending.set(this, cleanup);\n return result;\n }\n catch (error) {\n cleanup();\n throw error;\n }\n };\n prototype.open = wrappedOpen!;\n prototype.send = wrappedSend;\n }\n return {\n clients,\n cleanup() {\n if (wrappedFetch && window.fetch === wrappedFetch) window.fetch = originalFetch;\n if (prototype && wrappedOpen && prototype.open === wrappedOpen) prototype.open = originalOpen!;\n if (prototype && wrappedSend && prototype.send === wrappedSend) prototype.send = originalSend!;\n },\n };\n}\n\nfunction addConsoleClient(client: Client): void {\n if (!consoleInstrumentation) consoleInstrumentation = installConsole();\n consoleInstrumentation.clients.add(client);\n}\n\nfunction removeConsoleClient(client: Client): void {\n const instrumentation = consoleInstrumentation;\n if (!instrumentation) return;\n instrumentation.clients.delete(client);\n if (!instrumentation.clients.size) {\n instrumentation.cleanup();\n consoleInstrumentation = undefined;\n }\n}\n\nfunction installConsole(): Instrumentation {\n const clients = new Set<Client>();\n const original = console.error;\n const wrapped: typeof console.error = function (this: Console, ...values: unknown[]): void {\n try { return Reflect.apply(original, this, values); }\n finally { for (const client of clients) client.captureConsole(values); }\n };\n console.error = wrapped;\n return { clients, cleanup() { if (console.error === wrapped) console.error = original; } };\n}\n\nexport function init(options: BrowserErrorLogOptions): BrowserErrorLogDiagnosticsClient {\n return new Client(options);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["BREADCRUMB_LIMITS", "MAX_BATCH_EVENTS", "MAX_BATCH_BYTES", "MAX_BEACON_EVENTS", "MAX_BEACON_BYTES", "RETRY_DELAYS_MS", "SENSITIVE_KEY", "EVENT_TYPES", "RUNTIMES", "fallbackId", "read", "object", "key", "safeString", "value", "trim", "length", "now", "newId", "isAbort", "error", "signal", "errorFields", "message", "name", "stack", "byteLength", "boundedNumber", "minimum", "maximum", "fallback", "eventFingerprint", "event", "HttpDeliveryError", "status", "__publicField", "UrlSanitizationError", "ContextResolutionError", "Client", "options", "filename", "lineno", "colno", "context", "target", "localName", "getAttribute", "attribute", "tag", "rawUrl", "src", "rel", "token", "href", "currentSrc", "source", "resourceUrl", "cleaned", "automaticNetworkAllowed", "resolve", "addNetworkClient", "addConsoleClient", "addNavigationClient", "extra", "fields", "type", "method", "url", "durationMs", "failure", "allowErrorCapture", "captureError", "data", "network", "values", "isError", "input", "breadcrumb", "copy", "result", "fromHref", "toHref", "trigger", "from", "to", "startDrain", "drainResult", "removeNetworkClient", "removeConsoleClient", "removeNavigationClient", "cancel", "controller", "DESTROYED", "reason", "count", "request", "collector", "BREADCRUMB_LIMITS", "replaceUrls", "match", "_match", "prefix", "punctuation", "core", "seen", "segments", "current", "depth", "cause", "safeName", "safeMessage", "safeStack", "outer", "output", "keys", "safeKey", "timestamp", "occurredAt", "rawCategory", "rawMessage", "category", "rawData", "trail", "index", "rawStatus", "userAgent", "eventContext", "resolved", "dynamicContext", "defaults", "crumb", "candidate", "base", "runtime", "componentStack", "browser", "breadcrumbs", "reading", "finalEvent", "fingerprint", "dedupeAt", "acceptedAt", "admittedAt", "maxEvents", "maxBytes", "events", "bytes", "next", "size", "batch", "attempt", "timeoutHandle", "timeout", "_resolve", "reject", "retryDelay", "response", "milliseconds", "finish", "timer", "candidates", "body", "networkInstrumentation", "consoleInstrumentation", "navigationInstrumentation", "client", "installNavigation", "instrumentation", "inheritedHistoryDescriptor", "historyObject", "prototype", "descriptor", "lastHref", "originalPush", "originalReplace", "ownPush", "ownReplace", "inheritedPush", "inheritedReplace", "canInstall", "own", "clients", "report", "wrappedPush", "args", "wrappedReplace", "onPopState", "onHashChange", "restore", "wrapper", "pushInstalled", "replaceInstalled", "installNetwork", "describeFetch", "init", "requestUrl", "initSignal", "originalFetch", "wrappedFetch", "started", "promise", "originalOpen", "originalSend", "metadata", "pending", "wrappedOpen", "wrappedSend", "details", "aborted", "failed", "completed", "onAbort", "onFailure", "cleanup", "onLoadEnd", "installConsole", "original", "wrapped"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ihyeon/browser-error-log",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "A small, framework-independent browser error SDK for a collector you control.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"browser",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@ihyeon/browser-error-log-protocol": "0.2.
|
|
26
|
+
"@ihyeon/browser-error-log-protocol": "0.2.8"
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist",
|