@loggerjs/browser 0.1.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["sourceSequence","createSourceId","defaultMapEvent","defaultMapBatch","payloadByteLength","DEFAULT_DB_NAME","DEFAULT_STORE_NAME","requestToPromise","compareEntries","orderEntries","nowMs","levelFor","textEncoder","textEncoder","dataType","record","dataByteLength","messagePayload","message","record","supportsEntryType"],"sources":["../src/broadcast-channel-transport.ts","../src/http-transport.ts","../src/payload-transforms.ts","../src/service-worker-transport.ts","../src/websocket-transport.ts","../src/indexeddb-offline-queue.ts","../src/indexeddb-transport.ts","../src/offline-first-transport.ts","../src/zip-export.ts","../src/console-integration.ts","../src/context-propagation-integration.ts","../src/error-integration.ts","../src/http-capture-utils.ts","../src/fetch-integration.ts","../src/xhr-integration.ts","../src/framework-error-integration.ts","../src/framework-router-integrations.ts","../src/reporting-integration.ts","../src/router-integration.ts","../src/runtime-host-integration.ts","../src/service-worker-integration.ts","../src/user-action-integration.ts","../src/websocket-integration.ts","../src/web-vitals-integration.ts","../src/performance-integration.ts","../src/page-lifecycle.ts"],"sourcesContent":["import {\n incrementLoggerMetaCounter,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport interface BrowserBroadcastChannelLike {\n postMessage: (message: unknown) => void;\n close?: () => void;\n}\n\nexport type BrowserBroadcastChannelFactory = (channelName: string) => BrowserBroadcastChannelLike;\n\nexport interface BrowserBroadcastChannelEventMessage {\n type: \"loggerjs.event\";\n source: string;\n event: LogEvent;\n}\n\nexport interface BrowserBroadcastChannelBatchMessage {\n type: \"loggerjs.batch\";\n source: string;\n events: readonly LogEvent[];\n}\n\nexport type BrowserBroadcastChannelMessage =\n | BrowserBroadcastChannelEventMessage\n | BrowserBroadcastChannelBatchMessage;\n\nexport interface BrowserBroadcastChannelMapContext {\n channelName: string;\n source: string;\n}\n\nexport interface BrowserBroadcastChannelErrorDetail {\n operation: \"create-channel\" | \"post-message\" | \"close-channel\" | \"on-error\";\n droppedEvents: number;\n}\n\nexport interface BrowserBroadcastChannelTransportOptions {\n channelName: string;\n name?: string;\n source?: string;\n minLevel?: LoggerLevel;\n channelFactory?: BrowserBroadcastChannelFactory;\n closeChannelOnClose?: boolean;\n mapEvent?: (event: LogEvent, context: BrowserBroadcastChannelMapContext) => unknown;\n mapBatch?: (events: readonly LogEvent[], context: BrowserBroadcastChannelMapContext) => unknown;\n onError?: (error: unknown, detail: BrowserBroadcastChannelErrorDetail) => void;\n}\n\nlet sourceSequence = 0;\n\nfunction createSourceId() {\n sourceSequence += 1;\n return `loggerjs-${Date.now().toString(36)}-${sourceSequence.toString(36)}`;\n}\n\nfunction defaultChannelFactory(channelName: string): BrowserBroadcastChannelLike {\n if (typeof BroadcastChannel === \"undefined\") {\n throw new Error(\"BroadcastChannel is not available\");\n }\n return new BroadcastChannel(channelName);\n}\n\nfunction defaultMapEvent(\n event: LogEvent,\n context: BrowserBroadcastChannelMapContext,\n): BrowserBroadcastChannelEventMessage {\n return { type: \"loggerjs.event\", source: context.source, event };\n}\n\nfunction defaultMapBatch(\n events: readonly LogEvent[],\n context: BrowserBroadcastChannelMapContext,\n): BrowserBroadcastChannelBatchMessage {\n return { type: \"loggerjs.batch\", source: context.source, events };\n}\n\nexport function browserBroadcastChannelTransport(\n options: BrowserBroadcastChannelTransportOptions,\n): Transport {\n const transportName = options.name ?? \"browser-broadcast-channel\";\n const source = options.source ?? createSourceId();\n const mapContext: BrowserBroadcastChannelMapContext = {\n channelName: options.channelName,\n source,\n };\n const mapEvent = options.mapEvent ?? defaultMapEvent;\n const mapBatch = options.mapBatch ?? defaultMapBatch;\n const channelFactory = options.channelFactory ?? defaultChannelFactory;\n const closeChannelOnClose = options.closeChannelOnClose ?? true;\n let channel: BrowserBroadcastChannelLike | undefined;\n let closed = false;\n\n const reportError = (\n error: unknown,\n context: TransportContext | undefined,\n detail: BrowserBroadcastChannelErrorDetail,\n ) => {\n if (detail.droppedEvents > 0) {\n incrementLoggerMetaCounter(\"transport.dropped\", detail.droppedEvents);\n incrementLoggerMetaCounter(`transport.dropped.${detail.operation}`, detail.droppedEvents);\n }\n\n try {\n options.onError?.(error, detail);\n } catch (onErrorError) {\n context?.reportInternalError(onErrorError, {\n operation: \"on-error\",\n phase: \"transport\",\n transport: transportName,\n });\n }\n\n context?.reportInternalError(error, {\n operation: detail.operation,\n phase: \"transport\",\n transport: transportName,\n });\n };\n\n const getChannel = (context: TransportContext) => {\n if (closed) return undefined;\n if (channel) return channel;\n try {\n channel = channelFactory(options.channelName);\n return channel;\n } catch (error) {\n reportError(error, context, {\n droppedEvents: 1,\n operation: \"create-channel\",\n });\n return undefined;\n }\n };\n\n const postMessage = (message: unknown, context: TransportContext, droppedEvents: number) => {\n const currentChannel = getChannel(context);\n if (!currentChannel) return;\n try {\n // oxlint-disable-next-line require-post-message-target-origin -- BroadcastChannel.postMessage does not accept targetOrigin.\n currentChannel.postMessage(message);\n } catch (error) {\n reportError(error, context, {\n droppedEvents,\n operation: \"post-message\",\n });\n }\n };\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n log(event, context) {\n postMessage(mapEvent(event, mapContext), context, 1);\n },\n logBatch(events, context) {\n if (events.length === 0) return;\n postMessage(mapBatch(events, mapContext), context, events.length);\n },\n async close() {\n closed = true;\n if (!channel || !closeChannelOnClose) return;\n try {\n channel.close?.();\n } catch (error) {\n reportError(error, undefined, {\n droppedEvents: 0,\n operation: \"close-channel\",\n });\n } finally {\n channel = undefined;\n }\n },\n };\n}\n","import {\n applyPayloadTransforms,\n incrementLoggerMetaCounter,\n safeJsonCodec,\n toLevelValue,\n type Codec,\n type EncodedPayload,\n type LogEvent,\n type LoggerLevel,\n type PayloadTransform,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserHttpDropPolicy = \"drop-oldest\" | \"drop-newest\";\n\nconst DEFAULT_BEACON_MAX_BYTES = 60 * 1024;\n\nconst sleep = (delayMs: number) =>\n delayMs <= 0 ? Promise.resolve() : new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n\nexport interface BrowserHttpOfflineEntry {\n id: string;\n url: string;\n method: \"POST\" | \"PUT\";\n headers: Record<string, string>;\n body: string | Uint8Array;\n credentials?: RequestCredentials;\n keepalive: boolean;\n createdAt: number;\n}\n\nexport interface BrowserHttpOfflineQueue {\n enqueue: (entry: BrowserHttpOfflineEntry) => void | Promise<void>;\n replay: (send: (entry: BrowserHttpOfflineEntry) => Promise<void>) => void | Promise<void>;\n}\n\nexport interface MemoryBrowserHttpOfflineQueueOptions {\n maxEntries?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n onDrop?: (entry: BrowserHttpOfflineEntry, reason: string) => void;\n}\n\nexport interface BrowserHttpTransportOptions {\n url: string;\n name?: string;\n method?: \"POST\" | \"PUT\";\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n keepalive?: boolean;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n maxBatchSize?: number;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n useBeaconOnPageHide?: boolean;\n beaconMaxBytes?: number;\n offlineQueue?: BrowserHttpOfflineQueue;\n offlineReplayMaxRetries?: number;\n offlineReplayBaseDelayMs?: number;\n offlineReplayMaxDelayMs?: number;\n random?: () => number;\n fetchFn?: typeof fetch;\n transformPayload?: PayloadTransform | readonly PayloadTransform[];\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\nexport function memoryBrowserHttpOfflineQueue(\n options: MemoryBrowserHttpOfflineQueueOptions = {},\n): BrowserHttpOfflineQueue & { size: () => number } {\n const entries: BrowserHttpOfflineEntry[] = [];\n const maxEntries = options.maxEntries ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n\n const drop = (entry: BrowserHttpOfflineEntry, reason: string) => {\n incrementLoggerMetaCounter(\"transport.offline.dropped\");\n incrementLoggerMetaCounter(`transport.offline.dropped.${reason}`);\n options.onDrop?.(entry, reason);\n };\n\n return {\n enqueue(entry) {\n if (entries.length >= maxEntries) {\n if (dropPolicy === \"drop-newest\") {\n drop(entry, \"queue-full\");\n return;\n }\n const dropped = entries.shift();\n if (dropped) drop(dropped, \"queue-full\");\n }\n entries.push(entry);\n },\n async replay(send) {\n while (entries.length > 0) {\n const entry = entries[0];\n if (!entry) return;\n // oxlint-disable-next-line no-await-in-loop -- Replay must remove entries only after each send succeeds.\n await send(entry);\n entries.shift();\n }\n },\n size() {\n return entries.length;\n },\n };\n}\n\nfunction payloadToBody(payload: EncodedPayload): BodyInit {\n if (typeof payload === \"string\") return payload;\n return Uint8Array.from(payload);\n}\n\nfunction payloadByteLength(payload: EncodedPayload): number {\n if (typeof payload !== \"string\") return payload.byteLength;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(payload).byteLength;\n return new Blob([payload]).size;\n}\n\nfunction payloadToBeaconBody(payload: EncodedPayload, contentType: string): BodyInit {\n return new Blob([typeof payload === \"string\" ? payload : Uint8Array.from(payload)], {\n type: contentType,\n });\n}\n\ninterface BeaconChunk {\n events: LogEvent[];\n payload: string | Uint8Array;\n}\n\nfunction remainingEvents(chunks: BeaconChunk[], startIndex: number): LogEvent[] {\n const events: LogEvent[] = [];\n for (let index = startIndex; index < chunks.length; index++) {\n const chunk = chunks[index];\n if (chunk) events.push(...chunk.events);\n }\n return events;\n}\n\nexport function browserHttpTransport(options: BrowserHttpTransportOptions): Transport {\n const codec = options.codec ?? safeJsonCodec();\n const queue: LogEvent[] = [];\n const maxBatchSize = options.maxBatchSize ?? 50;\n const flushIntervalMs = options.flushIntervalMs ?? 2000;\n const maxQueueSize = options.maxQueueSize ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const beaconMaxBytes = options.beaconMaxBytes ?? DEFAULT_BEACON_MAX_BYTES;\n const offlineQueue = options.offlineQueue;\n const offlineReplayMaxRetries = options.offlineReplayMaxRetries ?? 3;\n const offlineReplayBaseDelayMs = options.offlineReplayBaseDelayMs ?? 250;\n const offlineReplayMaxDelayMs = options.offlineReplayMaxDelayMs ?? 5000;\n const random = options.random ?? Math.random;\n const fetchFn = options.fetchFn ?? globalThis.fetch?.bind(globalThis);\n let offlineEntrySeq = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushing = false;\n let replayingOffline = false;\n let lastContext: TransportContext | undefined;\n\n const headers = (payloadHeaders?: Record<string, string>, contentType = codec.contentType) => ({\n \"content-type\": contentType,\n ...payloadHeaders,\n ...options.headers,\n });\n\n const clearTimer = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n\n const reportDrop = (event: LogEvent, reason: string) => {\n incrementLoggerMetaCounter(\"transport.dropped\");\n incrementLoggerMetaCounter(`transport.dropped.${reason}`);\n options.onDrop?.(event, reason);\n };\n\n const reportInternalError = (error: unknown, operation: string) => {\n lastContext?.reportInternalError(error, {\n phase: \"transport\",\n transport: options.name ?? \"browser-http\",\n operation,\n });\n };\n\n const createBeaconChunks = (batch: LogEvent[]): BeaconChunk[] => {\n const chunks: BeaconChunk[] = [];\n let currentEvents: LogEvent[] = [];\n let currentPayload: string | Uint8Array | undefined;\n\n for (const event of batch) {\n const candidateEvents = [...currentEvents, event];\n const candidatePayload = codec.encode(candidateEvents);\n if (payloadByteLength(candidatePayload) <= beaconMaxBytes) {\n currentEvents = candidateEvents;\n currentPayload = candidatePayload;\n continue;\n }\n\n if (currentEvents.length > 0 && currentPayload) {\n chunks.push({ events: currentEvents, payload: currentPayload });\n }\n\n const singlePayload = codec.encode([event]);\n if (payloadByteLength(singlePayload) <= beaconMaxBytes) {\n currentEvents = [event];\n currentPayload = singlePayload;\n } else {\n currentEvents = [];\n currentPayload = undefined;\n reportDrop(event, \"beacon-too-large\");\n }\n }\n\n if (currentEvents.length > 0 && currentPayload) {\n chunks.push({ events: currentEvents, payload: currentPayload });\n }\n\n return chunks;\n };\n\n const sendBeaconBatch = (batch: LogEvent[]): { ok: boolean; remaining: LogEvent[] } => {\n if (typeof navigator === \"undefined\" || !navigator.sendBeacon) {\n return { ok: false, remaining: batch };\n }\n\n const chunks = createBeaconChunks(batch);\n for (let index = 0; index < chunks.length; index++) {\n const chunk = chunks[index];\n if (!chunk) continue;\n const ok = navigator.sendBeacon(\n options.url,\n payloadToBeaconBody(chunk.payload, codec.contentType),\n );\n if (!ok) return { ok: false, remaining: remainingEvents(chunks, index) };\n }\n\n return { ok: true, remaining: [] };\n };\n\n const sendPayload = async (entry: BrowserHttpOfflineEntry) => {\n if (!fetchFn) throw new Error(\"fetch is not available for browserHttpTransport\");\n const response = await fetchFn(entry.url, {\n method: entry.method,\n headers: entry.headers,\n body: payloadToBody(entry.body),\n credentials: entry.credentials,\n keepalive: entry.keepalive,\n });\n if (!response.ok) throw new Error(`browserHttpTransport failed with status ${response.status}`);\n };\n\n const encodeTransformedPayload = async (batch: LogEvent[]) => {\n const encoded = codec.encode(batch);\n return applyPayloadTransforms(\n encoded,\n {\n contentType: codec.contentType,\n events: batch,\n transport: options.name ?? \"browser-http\",\n },\n options.transformPayload,\n );\n };\n\n const createOfflineEntry = (\n payload: string | Uint8Array,\n payloadHeaders?: Record<string, string>,\n contentType?: string,\n ): BrowserHttpOfflineEntry => ({\n id: `${Date.now().toString(36)}-${(offlineEntrySeq++).toString(36)}`,\n url: options.url,\n method: options.method ?? \"POST\",\n headers: headers(payloadHeaders, contentType),\n body: payload,\n credentials: options.credentials,\n keepalive: options.keepalive ?? true,\n createdAt: Date.now(),\n });\n\n const enqueueOfflinePayload = async (\n payload: string | Uint8Array,\n payloadHeaders?: Record<string, string>,\n contentType?: string,\n ) => {\n if (!offlineQueue) return false;\n await offlineQueue.enqueue(createOfflineEntry(payload, payloadHeaders, contentType));\n incrementLoggerMetaCounter(\"transport.offline.queued\");\n return true;\n };\n\n const sendFetchBatch = async (batch: LogEvent[]) => {\n if (batch.length === 0) return;\n const transformed = await encodeTransformedPayload(batch);\n if (offlineQueue && typeof navigator !== \"undefined\" && navigator.onLine === false) {\n await enqueueOfflinePayload(\n transformed.payload,\n transformed.headers,\n transformed.contentType,\n );\n return;\n }\n try {\n await sendPayload(\n createOfflineEntry(transformed.payload, transformed.headers, transformed.contentType),\n );\n } catch (error) {\n if (\n await enqueueOfflinePayload(\n transformed.payload,\n transformed.headers,\n transformed.contentType,\n )\n ) {\n return;\n }\n throw error;\n }\n };\n\n const replayRetryDelay = (attempt: number): number => {\n const cap = Math.min(offlineReplayMaxDelayMs, offlineReplayBaseDelayMs * 2 ** attempt);\n return cap <= 0 ? 0 : random() * cap;\n };\n\n const sendOfflineEntryWithRetry = async (entry: BrowserHttpOfflineEntry) => {\n for (let attempt = 0; ; attempt++) {\n try {\n // oxlint-disable-next-line no-await-in-loop -- Retry attempts must run sequentially.\n await sendPayload(entry);\n incrementLoggerMetaCounter(\"transport.offline.replayed\");\n return;\n } catch (error) {\n if (attempt >= offlineReplayMaxRetries) {\n incrementLoggerMetaCounter(\"transport.offline.replay.failed\");\n throw error;\n }\n incrementLoggerMetaCounter(\"transport.offline.retry\");\n // oxlint-disable-next-line no-await-in-loop -- Backoff must complete before the next retry.\n await sleep(replayRetryDelay(attempt));\n }\n }\n };\n\n const replayOfflineQueue = async () => {\n if (!offlineQueue || replayingOffline) return;\n replayingOffline = true;\n try {\n await offlineQueue.replay(sendOfflineEntryWithRetry);\n } finally {\n replayingOffline = false;\n }\n };\n\n const flush = async (preferBeacon = false) => {\n if (flushing || queue.length === 0) return;\n flushing = true;\n clearTimer();\n const batch = queue.splice(0, queue.length);\n let pendingBatch = batch;\n\n try {\n if (preferBeacon && !options.transformPayload) {\n const beaconResult = sendBeaconBatch(batch);\n if (beaconResult.ok || beaconResult.remaining.length === 0) return;\n pendingBatch = beaconResult.remaining;\n }\n\n await sendFetchBatch(pendingBatch);\n pendingBatch = [];\n } catch (error) {\n if (pendingBatch.length > 0) queue.unshift(...pendingBatch);\n throw error;\n } finally {\n flushing = false;\n if (queue.length > 0) schedule();\n }\n };\n\n const schedule = () => {\n if (timer || flushIntervalMs <= 0) return;\n timer = setTimeout(() => {\n void flush(false).catch((error: unknown) => reportInternalError(error, \"flush\"));\n }, flushIntervalMs);\n };\n\n const onPageHide = () => {\n void flush(true).catch((error: unknown) => reportInternalError(error, \"pagehide-flush\"));\n };\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n void flush(true).catch((error: unknown) => reportInternalError(error, \"visibility-flush\"));\n }\n };\n const onOnline = () => {\n void replayOfflineQueue().catch((error: unknown) => reportInternalError(error, \"replay\"));\n };\n\n if (options.useBeaconOnPageHide ?? true) {\n globalThis.addEventListener?.(\"pagehide\", onPageHide);\n globalThis.addEventListener?.(\"visibilitychange\", onVisibilityChange);\n }\n if (offlineQueue) globalThis.addEventListener?.(\"online\", onOnline);\n\n return {\n name: options.name ?? \"browser-http\",\n minLevel: options.minLevel,\n log(event, context) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n lastContext = context;\n if (queue.length >= maxQueueSize) {\n if (dropPolicy === \"drop-newest\") {\n reportDrop(event, \"queue-full\");\n return;\n }\n const dropped = queue.shift();\n if (dropped) reportDrop(dropped, \"queue-full\");\n }\n queue.push(event);\n if (queue.length >= maxBatchSize) {\n void flush(false).catch((error: unknown) => reportInternalError(error, \"flush\"));\n } else schedule();\n },\n flush() {\n return flush(false);\n },\n close() {\n globalThis.removeEventListener?.(\"pagehide\", onPageHide);\n globalThis.removeEventListener?.(\"visibilitychange\", onVisibilityChange);\n globalThis.removeEventListener?.(\"online\", onOnline);\n return flush(true);\n },\n };\n}\n","import {\n encodedPayloadToUint8Array,\n type PayloadTransform,\n type PayloadTransformContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserCompressionFormat = \"gzip\" | \"deflate\";\n\nexport interface BrowserCompressionPayloadTransformOptions {\n format?: BrowserCompressionFormat;\n headers?: Record<string, string>;\n compress?: (\n payload: Uint8Array,\n context: PayloadTransformContext & { format: BrowserCompressionFormat },\n ) => Uint8Array | Promise<Uint8Array>;\n streamFactory?: (format: BrowserCompressionFormat) => CompressionStream;\n}\n\nasync function compressWithStream(\n payload: Uint8Array,\n format: BrowserCompressionFormat,\n streamFactory?: (format: BrowserCompressionFormat) => CompressionStream,\n): Promise<Uint8Array> {\n const createStream =\n streamFactory ??\n ((nextFormat: BrowserCompressionFormat) => {\n if (typeof CompressionStream === \"undefined\") {\n throw new Error(\"CompressionStream is not available in this browser\");\n }\n return new CompressionStream(nextFormat);\n });\n const stream = createStream(format);\n const writer = stream.writable.getWriter();\n await writer.write(Uint8Array.from(payload) as BufferSource);\n await writer.close();\n return new Uint8Array(await new Response(stream.readable).arrayBuffer());\n}\n\nexport function browserCompressionPayloadTransform(\n options: BrowserCompressionPayloadTransformOptions = {},\n): PayloadTransform {\n const format = options.format ?? \"gzip\";\n return async (payload, context) => ({\n payload: await (options.compress\n ? options.compress(encodedPayloadToUint8Array(payload), { ...context, format })\n : compressWithStream(encodedPayloadToUint8Array(payload), format, options.streamFactory)),\n headers: {\n \"content-encoding\": format,\n ...options.headers,\n },\n });\n}\n","import {\n incrementLoggerMetaCounter,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserServiceWorkerDropPolicy = \"drop-oldest\" | \"drop-newest\";\nexport type BrowserServiceWorkerTarget = \"controller\" | \"ready\";\n\nexport interface BrowserServiceWorkerLike {\n postMessage: (message: unknown, transfer?: Transferable[] | StructuredSerializeOptions) => void;\n}\n\nexport interface BrowserServiceWorkerRegistrationLike {\n active?: BrowserServiceWorkerLike | null;\n waiting?: BrowserServiceWorkerLike | null;\n installing?: BrowserServiceWorkerLike | null;\n}\n\nexport interface BrowserServiceWorkerContainerLike {\n controller?: BrowserServiceWorkerLike | null;\n ready?: Promise<BrowserServiceWorkerRegistrationLike>;\n}\n\nexport interface BrowserServiceWorkerEventMessage {\n type: \"loggerjs.event\";\n source: string;\n event: LogEvent;\n}\n\nexport interface BrowserServiceWorkerBatchMessage {\n type: \"loggerjs.batch\";\n source: string;\n events: readonly LogEvent[];\n}\n\nexport type BrowserServiceWorkerMessage =\n | BrowserServiceWorkerEventMessage\n | BrowserServiceWorkerBatchMessage;\n\nexport interface BrowserServiceWorkerMapContext {\n source: string;\n target: BrowserServiceWorkerTarget;\n}\n\nexport interface BrowserServiceWorkerTransportOptions {\n name?: string;\n minLevel?: LoggerLevel;\n source?: string;\n target?: BrowserServiceWorkerTarget;\n serviceWorker?: BrowserServiceWorkerContainerLike;\n maxQueueSize?: number;\n dropPolicy?: BrowserServiceWorkerDropPolicy;\n transfer?: (message: unknown) => Transferable[] | StructuredSerializeOptions | undefined;\n mapEvent?: (event: LogEvent, context: BrowserServiceWorkerMapContext) => unknown;\n mapBatch?: (events: readonly LogEvent[], context: BrowserServiceWorkerMapContext) => unknown;\n onDrop?: (event: LogEvent, reason: string) => void;\n onError?: (error: unknown, detail: { operation: string; droppedEvents: number }) => void;\n}\n\ninterface QueueItem {\n events: readonly LogEvent[];\n message: unknown;\n}\n\nlet sourceSequence = 0;\n\nfunction createSourceId() {\n sourceSequence += 1;\n return `loggerjs-${Date.now().toString(36)}-${sourceSequence.toString(36)}`;\n}\n\nfunction defaultMapEvent(\n event: LogEvent,\n context: BrowserServiceWorkerMapContext,\n): BrowserServiceWorkerEventMessage {\n return { type: \"loggerjs.event\", source: context.source, event };\n}\n\nfunction defaultMapBatch(\n events: readonly LogEvent[],\n context: BrowserServiceWorkerMapContext,\n): BrowserServiceWorkerBatchMessage {\n return { type: \"loggerjs.batch\", source: context.source, events };\n}\n\nfunction serviceWorkerContainer(): BrowserServiceWorkerContainerLike | undefined {\n return typeof navigator === \"undefined\"\n ? undefined\n : (navigator.serviceWorker as unknown as BrowserServiceWorkerContainerLike);\n}\n\nfunction workerFromRegistration(registration: BrowserServiceWorkerRegistrationLike) {\n return registration.active ?? registration.waiting ?? registration.installing ?? undefined;\n}\n\nexport function browserServiceWorkerTransport(\n options: BrowserServiceWorkerTransportOptions = {},\n): Transport & { queueSize: () => number } {\n const transportName = options.name ?? \"browser-service-worker\";\n const target = options.target ?? \"controller\";\n const source = options.source ?? createSourceId();\n const maxQueueSize = options.maxQueueSize ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const mapContext: BrowserServiceWorkerMapContext = { source, target };\n const mapEvent = options.mapEvent ?? defaultMapEvent;\n const mapBatch = options.mapBatch ?? defaultMapBatch;\n const queue: QueueItem[] = [];\n let readyWorker: BrowserServiceWorkerLike | undefined;\n let readyStarted = false;\n let lastContext: TransportContext | undefined;\n\n const reportError = (\n error: unknown,\n context: TransportContext | undefined,\n operation: string,\n droppedEvents = 0,\n ) => {\n try {\n options.onError?.(error, { droppedEvents, operation });\n } catch (onErrorError) {\n context?.reportInternalError(onErrorError, {\n operation: \"on-error\",\n phase: \"transport\",\n transport: transportName,\n });\n }\n context?.reportInternalError(error, {\n operation,\n phase: \"transport\",\n transport: transportName,\n });\n };\n\n const reportDrop = (item: QueueItem, reason: string) => {\n incrementLoggerMetaCounter(\"transport.dropped\", item.events.length);\n incrementLoggerMetaCounter(`transport.dropped.${reason}`, item.events.length);\n for (const event of item.events) options.onDrop?.(event, reason);\n };\n\n const currentWorker = () => {\n const container = options.serviceWorker ?? serviceWorkerContainer();\n if (!container) return undefined;\n if (target === \"controller\") return container.controller ?? undefined;\n return readyWorker;\n };\n\n const post = (worker: BrowserServiceWorkerLike, item: QueueItem, context: TransportContext) => {\n try {\n worker.postMessage(item.message, options.transfer?.(item.message));\n return true;\n } catch (error) {\n reportDrop(item, \"post-message\");\n reportError(error, context, \"post-message\", item.events.length);\n return false;\n }\n };\n\n const drain = (context = lastContext) => {\n const worker = currentWorker();\n if (!worker || !context) return;\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) return;\n post(worker, item, context);\n }\n };\n\n const startReady = (context: TransportContext) => {\n if (target !== \"ready\" || readyStarted) return;\n readyStarted = true;\n const container = options.serviceWorker ?? serviceWorkerContainer();\n if (!container?.ready) {\n reportError(new Error(\"serviceWorker.ready is not available\"), context, \"ready\");\n return;\n }\n void container.ready\n .then((registration) => {\n readyWorker = workerFromRegistration(registration);\n if (!readyWorker) {\n const pending = queue.splice(0);\n for (const item of pending) reportDrop(item, \"unavailable\");\n return;\n }\n drain(context);\n })\n .catch((error) => {\n const pending = queue.splice(0);\n for (const item of pending) reportDrop(item, \"ready\");\n reportError(\n error,\n context,\n \"ready\",\n pending.reduce((total, item) => total + item.events.length, 0),\n );\n });\n };\n\n const enqueue = (item: QueueItem) => {\n if (queue.length >= maxQueueSize) {\n if (dropPolicy === \"drop-newest\") {\n reportDrop(item, \"queue-full\");\n return false;\n }\n const dropped = queue.shift();\n if (dropped) reportDrop(dropped, \"queue-full\");\n }\n queue.push(item);\n return true;\n };\n\n const send = (item: QueueItem, context: TransportContext) => {\n lastContext = context;\n const worker = currentWorker();\n if (worker) {\n post(worker, item, context);\n return;\n }\n if (target === \"ready\") {\n if (enqueue(item)) startReady(context);\n return;\n }\n reportDrop(item, \"unavailable\");\n reportError(\n new Error(\"service worker controller is not available\"),\n context,\n \"unavailable\",\n item.events.length,\n );\n };\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n queueSize() {\n return queue.length;\n },\n log(event, context) {\n send({ events: [event], message: mapEvent(event, mapContext) }, context);\n },\n logBatch(events, context) {\n if (events.length === 0) return;\n send({ events, message: mapBatch(events, mapContext) }, context);\n },\n flush() {\n drain();\n },\n close() {\n const pending = queue.splice(0);\n for (const item of pending) reportDrop(item, \"closed\");\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n safeJsonCodec,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserWebSocketDropPolicy = \"drop-oldest\" | \"drop-newest\";\nexport type BrowserWebSocketPayload = string | Uint8Array;\nexport type BrowserWebSocketEventType = \"close\" | \"error\" | \"open\";\ntype BrowserWebSocketSendPayload = Parameters<WebSocket[\"send\"]>[0];\n\nexport interface BrowserWebSocketLike {\n readonly readyState: number;\n send: (data: BrowserWebSocketSendPayload) => void;\n close: (code?: number, reason?: string) => void;\n addEventListener: (type: BrowserWebSocketEventType, listener: (event: Event) => void) => void;\n removeEventListener: (type: BrowserWebSocketEventType, listener: (event: Event) => void) => void;\n}\n\nexport type BrowserWebSocketFactory = (\n url: string,\n protocols?: string | string[],\n) => BrowserWebSocketLike;\n\nexport interface BrowserWebSocketErrorDetail {\n operation: \"close-socket\" | \"create-socket\" | \"send\" | \"socket-error\" | \"on-error\";\n droppedEvents: number;\n}\n\nexport interface BrowserWebSocketTransportOptions {\n url: string;\n name?: string;\n protocols?: string | string[];\n minLevel?: LoggerLevel;\n codec?: Codec<BrowserWebSocketPayload>;\n maxQueueSize?: number;\n dropPolicy?: BrowserWebSocketDropPolicy;\n webSocketFactory?: BrowserWebSocketFactory;\n closeCode?: number;\n closeReason?: string;\n onDrop?: (event: LogEvent, reason: string) => void;\n onError?: (error: unknown, detail: BrowserWebSocketErrorDetail) => void;\n}\n\nexport interface BrowserWebSocketTransport extends Transport {\n queueSize: () => number;\n}\n\ninterface QueueItem {\n events: readonly LogEvent[];\n payload: BrowserWebSocketPayload;\n}\n\ninterface ActiveSocket {\n socket: BrowserWebSocketLike;\n onOpen: (event: Event) => void;\n onClose: (event: Event) => void;\n onError: (event: Event) => void;\n}\n\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\n\nfunction defaultWebSocketFactory(url: string, protocols?: string | string[]): BrowserWebSocketLike {\n if (typeof WebSocket === \"undefined\") {\n throw new Error(\"WebSocket is not available\");\n }\n return new WebSocket(url, protocols);\n}\n\nfunction toSendPayload(payload: BrowserWebSocketPayload): BrowserWebSocketSendPayload {\n if (typeof payload === \"string\") return payload;\n return Uint8Array.from(payload);\n}\n\nexport function browserWebSocketTransport(\n options: BrowserWebSocketTransportOptions,\n): BrowserWebSocketTransport {\n const transportName = options.name ?? \"browser-websocket\";\n const codec = options.codec ?? safeJsonCodec();\n const maxQueueSize = options.maxQueueSize ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const webSocketFactory = options.webSocketFactory ?? defaultWebSocketFactory;\n const queue: QueueItem[] = [];\n let active: ActiveSocket | undefined;\n let closed = false;\n let lastContext: TransportContext | undefined;\n\n const reportDrop = (item: QueueItem, reason: string) => {\n incrementLoggerMetaCounter(\"transport.dropped\", item.events.length);\n incrementLoggerMetaCounter(`transport.dropped.${reason}`, item.events.length);\n for (const event of item.events) options.onDrop?.(event, reason);\n };\n\n const reportError = (\n error: unknown,\n context: TransportContext | undefined,\n detail: BrowserWebSocketErrorDetail,\n ) => {\n try {\n options.onError?.(error, detail);\n } catch (onErrorError) {\n context?.reportInternalError(onErrorError, {\n operation: \"on-error\",\n phase: \"transport\",\n transport: transportName,\n });\n }\n\n context?.reportInternalError(error, {\n operation: detail.operation,\n phase: \"transport\",\n transport: transportName,\n });\n };\n\n const detachSocket = () => {\n if (!active) return;\n const current = active;\n current.socket.removeEventListener(\"open\", current.onOpen);\n current.socket.removeEventListener(\"close\", current.onClose);\n current.socket.removeEventListener(\"error\", current.onError);\n active = undefined;\n };\n\n const drainQueue = (context = lastContext) => {\n const socket = active?.socket;\n if (!socket || socket.readyState !== WS_OPEN) return;\n\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) return;\n try {\n socket.send(toSendPayload(item.payload));\n } catch (error) {\n reportDrop(item, \"send\");\n reportError(error, context, {\n droppedEvents: item.events.length,\n operation: \"send\",\n });\n return;\n }\n }\n };\n\n const createSocket = (context: TransportContext, droppedEvents: number) => {\n if (closed) return undefined;\n if (\n active &&\n (active.socket.readyState === WS_CONNECTING || active.socket.readyState === WS_OPEN)\n ) {\n return active.socket;\n }\n\n detachSocket();\n\n try {\n const socket = webSocketFactory(options.url, options.protocols);\n const nextActive: ActiveSocket = {\n socket,\n onOpen() {\n drainQueue(context);\n },\n onClose() {\n if (active?.socket === socket) detachSocket();\n },\n onError(errorEvent) {\n reportError(errorEvent, context, {\n droppedEvents: 0,\n operation: \"socket-error\",\n });\n },\n };\n active = nextActive;\n socket.addEventListener(\"open\", nextActive.onOpen);\n socket.addEventListener(\"close\", nextActive.onClose);\n socket.addEventListener(\"error\", nextActive.onError);\n return socket;\n } catch (error) {\n reportError(error, context, {\n droppedEvents,\n operation: \"create-socket\",\n });\n return undefined;\n }\n };\n\n const enqueue = (item: QueueItem) => {\n if (queue.length >= maxQueueSize) {\n if (dropPolicy === \"drop-newest\") {\n reportDrop(item, \"queue-full\");\n return false;\n }\n\n const dropped = queue.shift();\n if (dropped) reportDrop(dropped, \"queue-full\");\n }\n\n queue.push(item);\n return true;\n };\n\n const sendOrQueue = (item: QueueItem, context: TransportContext) => {\n lastContext = context;\n if (closed) {\n reportDrop(item, \"closed\");\n return;\n }\n\n const socket = createSocket(context, item.events.length);\n if (!socket) {\n reportDrop(item, \"create-socket\");\n return;\n }\n\n if (socket.readyState === WS_OPEN) {\n try {\n socket.send(toSendPayload(item.payload));\n } catch (error) {\n reportDrop(item, \"send\");\n reportError(error, context, {\n droppedEvents: item.events.length,\n operation: \"send\",\n });\n }\n return;\n }\n\n enqueue(item);\n };\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n queueSize() {\n return queue.length;\n },\n log(event, context) {\n sendOrQueue({ events: [event], payload: codec.encode(event) }, context);\n },\n logBatch(events, context) {\n if (events.length === 0) return;\n sendOrQueue({ events, payload: codec.encode(events) }, context);\n },\n flush() {\n drainQueue();\n },\n async close() {\n closed = true;\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) reportDrop(item, \"closed\");\n }\n\n const socket = active?.socket;\n detachSocket();\n if (!socket) return;\n\n try {\n socket.close(options.closeCode, options.closeReason);\n } catch (error) {\n reportError(error, lastContext, {\n droppedEvents: 0,\n operation: \"close-socket\",\n });\n }\n },\n };\n}\n","import { incrementLoggerMetaCounter } from \"@loggerjs/core\";\nimport type {\n BrowserHttpDropPolicy,\n BrowserHttpOfflineEntry,\n BrowserHttpOfflineQueue,\n} from \"./http-transport\";\n\nexport interface IndexedDbBrowserHttpOfflineQueueOptions {\n dbName?: string;\n storeName?: string;\n maxEntries?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n indexedDB?: IDBFactory;\n onDrop?: (entry: BrowserHttpOfflineEntry, reason: string) => void;\n}\n\nexport interface IndexedDbBrowserHttpOfflineQueue extends BrowserHttpOfflineQueue {\n size: () => Promise<number>;\n clear: () => Promise<void>;\n close: () => void;\n}\n\nconst DEFAULT_DB_NAME = \"loggerjs\";\nconst DEFAULT_STORE_NAME = \"browser-http-offline\";\n\nfunction normalizeMaxEntries(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) return 1000;\n return Math.max(0, Math.floor(value));\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB request failed\")),\n { once: true },\n );\n });\n}\n\nfunction compareEntries(a: BrowserHttpOfflineEntry, b: BrowserHttpOfflineEntry): number {\n if (a.createdAt !== b.createdAt) return a.createdAt - b.createdAt;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n\nfunction orderEntries(entries: BrowserHttpOfflineEntry[]): BrowserHttpOfflineEntry[] {\n const ordered: BrowserHttpOfflineEntry[] = [];\n for (const entry of entries) {\n let index = 0;\n while (\n index < ordered.length &&\n compareEntries(ordered[index] as BrowserHttpOfflineEntry, entry) <= 0\n ) {\n index += 1;\n }\n ordered.splice(index, 0, entry);\n }\n return ordered;\n}\n\nexport function indexedDbBrowserHttpOfflineQueue(\n options: IndexedDbBrowserHttpOfflineQueueOptions = {},\n): IndexedDbBrowserHttpOfflineQueue {\n const dbName = options.dbName ?? DEFAULT_DB_NAME;\n const storeName = options.storeName ?? DEFAULT_STORE_NAME;\n const maxEntries = normalizeMaxEntries(options.maxEntries);\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const idb = options.indexedDB ?? globalThis.indexedDB;\n let dbPromise: Promise<IDBDatabase> | undefined;\n\n const drop = (entry: BrowserHttpOfflineEntry, reason: string) => {\n incrementLoggerMetaCounter(\"transport.offline.dropped\");\n incrementLoggerMetaCounter(`transport.offline.dropped.${reason}`);\n options.onDrop?.(entry, reason);\n };\n\n const openDb = () => {\n if (!idb) throw new Error(\"IndexedDB is not available for loggerjs offline queue\");\n dbPromise ??= new Promise<IDBDatabase>((resolve, reject) => {\n const request = idb.open(dbName, 1);\n request.addEventListener(\"upgradeneeded\", () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName, { keyPath: \"id\" });\n }\n });\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB open failed\")),\n { once: true },\n );\n });\n return dbPromise;\n };\n\n const withStore = async <T>(\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore) => Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = db.transaction(storeName, mode);\n return run(tx.objectStore(storeName));\n };\n\n const getEntries = async () =>\n orderEntries(\n await withStore(\"readonly\", (store) =>\n requestToPromise(store.getAll() as IDBRequest<BrowserHttpOfflineEntry[]>),\n ),\n );\n\n const putEntry = (entry: BrowserHttpOfflineEntry) =>\n withStore(\"readwrite\", (store) => requestToPromise(store.put(entry)));\n\n const deleteEntry = (id: string) =>\n withStore(\"readwrite\", (store) => requestToPromise(store.delete(id)));\n\n const queue: IndexedDbBrowserHttpOfflineQueue = {\n async enqueue(entry) {\n if (maxEntries === 0) {\n drop(entry, \"queue-full\");\n return;\n }\n\n const entries = await getEntries();\n if (entries.length >= maxEntries) {\n if (dropPolicy === \"drop-newest\") {\n drop(entry, \"queue-full\");\n return;\n }\n const dropCount = entries.length - maxEntries + 1;\n for (let index = 0; index < dropCount; index += 1) {\n const dropped = entries[index];\n if (!dropped) continue;\n // oxlint-disable-next-line no-await-in-loop -- Drops must be durable before adding the new entry.\n await deleteEntry(dropped.id);\n drop(dropped, \"queue-full\");\n }\n }\n\n await putEntry(entry);\n },\n async replay(send) {\n const entries = await getEntries();\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Replay must preserve order and delete only after send succeeds.\n await send(entry);\n // oxlint-disable-next-line no-await-in-loop -- The entry must remain durable until send resolves.\n await deleteEntry(entry.id);\n }\n },\n async size() {\n return (await getEntries()).length;\n },\n clear() {\n return withStore(\"readwrite\", (store) => requestToPromise(store.clear()));\n },\n close() {\n const promise = dbPromise;\n dbPromise = undefined;\n void promise?.then((db) => db.close());\n },\n };\n\n return queue;\n}\n","import {\n incrementLoggerMetaCounter,\n safeJsonCodec,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport type { BrowserHttpDropPolicy } from \"./http-transport\";\n\nexport interface IndexedDbLogEntry {\n id: string;\n seq: number;\n createdAt: number;\n level: number;\n levelName: string;\n logger: string;\n type?: string;\n byteLength: number;\n payload: string | Uint8Array;\n}\n\nexport interface IndexedDbTransportQueryOptions {\n from?: number;\n to?: number;\n minLevel?: LoggerLevel;\n logger?: string;\n type?: string;\n limit?: number;\n order?: \"asc\" | \"desc\";\n}\n\nexport type IndexedDbTransportDurability = \"default\" | \"strict\" | \"relaxed\";\n\nexport type IndexedDbStorageBucketDurability = \"strict\" | \"relaxed\";\n\nexport interface IndexedDbTransportStats {\n bufferDepth: number;\n maxBufferDepth: number;\n pendingFlush: boolean;\n enqueued: number;\n persisted: number;\n dropped: number;\n droppedByReason: Record<string, number>;\n persistedDropped: number;\n persistedDroppedByReason: Record<string, number>;\n flushes: number;\n flushErrors: number;\n lastFlushBatchSize: number;\n lastFlushDurationMs: number;\n prunes: number;\n pruneFallbacks: number;\n lastPruneDurationMs: number;\n queries: number;\n queryFallbacks: number;\n lastQueryDurationMs: number;\n databaseOpenCount: number;\n storageBucketFallbacks: number;\n transactionOptionFallbacks: number;\n errors: number;\n errorsByOperation: Record<string, number>;\n}\n\nexport interface IndexedDbTransportOptions {\n name?: string;\n dbName?: string;\n storeName?: string;\n maxEntries?: number;\n maxBytes?: number;\n ttlMs?: number;\n batchSize?: number;\n flushIntervalMs?: number;\n maxBufferSize?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n flushOnPageHide?: boolean;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n durability?: IndexedDbTransportDurability;\n storageBucketName?: string;\n storageBucketPersisted?: boolean;\n storageBucketDurability?: IndexedDbStorageBucketDurability;\n indexedDB?: IDBFactory;\n onDrop?: (event: LogEvent, reason: string) => void;\n onPersistedDrop?: (entry: IndexedDbLogEntry, reason: string) => void;\n}\n\nexport interface IndexedDbTransport extends Transport {\n count: () => Promise<number>;\n clear: () => Promise<void>;\n remove: (ids: string | readonly string[]) => Promise<void>;\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n stats: () => IndexedDbTransportStats;\n}\n\nconst DEFAULT_DB_NAME = \"loggerjs\";\nconst DEFAULT_STORE_NAME = \"logs\";\nconst DB_VERSION = 2;\nconst ORDER_INDEX_NAME = \"createdAtSeq\";\n\ninterface StorageBucketLike {\n indexedDB?: IDBFactory;\n}\n\ninterface StorageBucketManagerLike {\n open: (\n name: string,\n options?: {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n },\n ) => Promise<StorageBucketLike>;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction incrementRecord(record: Record<string, number>, key: string, amount = 1): void {\n record[key] = (record[key] ?? 0) + amount;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB request failed\")),\n { once: true },\n );\n });\n}\n\nfunction transactionToPromise(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.addEventListener(\"complete\", () => resolve(), { once: true });\n transaction.addEventListener(\n \"abort\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction aborted\")),\n { once: true },\n );\n transaction.addEventListener(\n \"error\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction failed\")),\n { once: true },\n );\n });\n}\n\nfunction payloadByteLength(payload: string | Uint8Array): number {\n if (typeof payload !== \"string\") return payload.byteLength;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(payload).byteLength;\n return new Blob([payload]).size;\n}\n\nfunction compareEntries(a: IndexedDbLogEntry, b: IndexedDbLogEntry): number {\n if (a.createdAt !== b.createdAt) return a.createdAt - b.createdAt;\n if (a.seq !== b.seq) return a.seq - b.seq;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n\nfunction orderEntries(\n entries: readonly IndexedDbLogEntry[],\n order: \"asc\" | \"desc\" = \"asc\",\n): IndexedDbLogEntry[] {\n // oxlint-disable-next-line no-array-sort -- Sort a copy to preserve ES2020 compatibility and caller immutability.\n const sorted = [...entries].sort(compareEntries);\n if (order === \"asc\") return sorted;\n const reversed: IndexedDbLogEntry[] = [];\n for (let index = sorted.length - 1; index >= 0; index -= 1) {\n reversed.push(sorted[index] as IndexedDbLogEntry);\n }\n return reversed;\n}\n\nfunction indexExists(store: IDBObjectStore, name: string): boolean {\n return store.indexNames.contains(name);\n}\n\nfunction ensureIndex(store: IDBObjectStore, name: string, keyPath: string | readonly string[]) {\n if (!indexExists(store, name)) store.createIndex(name, keyPath);\n}\n\nfunction getStoreIndex(store: IDBObjectStore, name: string): IDBIndex | undefined {\n const maybeStore = store as IDBObjectStore & {\n index?: (indexName: string) => IDBIndex;\n };\n if (typeof maybeStore.index !== \"function\" || !indexExists(store, name)) return undefined;\n return maybeStore.index(name);\n}\n\nfunction getStorageBucketManager(): StorageBucketManagerLike | undefined {\n return (globalThis.navigator as unknown as { storageBuckets?: StorageBucketManagerLike })\n ?.storageBuckets;\n}\n\nfunction storageBucketOpenOptions(options: IndexedDbTransportOptions):\n | {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n }\n | undefined {\n if (\n options.storageBucketDurability === undefined &&\n options.storageBucketPersisted === undefined\n ) {\n return undefined;\n }\n return {\n durability: options.storageBucketDurability,\n persisted: options.storageBucketPersisted,\n };\n}\n\nfunction decodeEntry(\n entry: IndexedDbLogEntry,\n codec: Codec<string | Uint8Array>,\n): LogEvent | undefined {\n if (!codec.decode) throw new Error(\"indexedDbTransport query requires a codec with decode\");\n const decoded = codec.decode(entry.payload);\n return Array.isArray(decoded) ? decoded[0] : decoded;\n}\n\nfunction shouldKeepEntry(entry: IndexedDbLogEntry, options: IndexedDbTransportQueryOptions) {\n if (options.from !== undefined && entry.createdAt < options.from) return false;\n if (options.to !== undefined && entry.createdAt > options.to) return false;\n if (options.minLevel !== undefined && entry.level < toLevelValue(options.minLevel)) return false;\n if (options.logger !== undefined && entry.logger !== options.logger) return false;\n if (options.type !== undefined && entry.type !== options.type) return false;\n return true;\n}\n\nfunction orderRangeForQuery(options: IndexedDbTransportQueryOptions): IDBKeyRange | undefined {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n const lower =\n options.from === undefined ? undefined : [options.from, Number.MIN_SAFE_INTEGER, \"\"];\n const upper =\n options.to === undefined ? undefined : [options.to, Number.MAX_SAFE_INTEGER, \"\\uffff\"];\n if (lower && upper) return IDBKeyRange.bound(lower, upper);\n if (lower) return IDBKeyRange.lowerBound(lower);\n if (upper) return IDBKeyRange.upperBound(upper);\n return undefined;\n}\n\nfunction iterateCursor(\n request: IDBRequest<IDBCursorWithValue | null>,\n visit: (cursor: IDBCursorWithValue) => boolean | void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\n \"success\",\n () => {\n const cursor = request.result;\n if (!cursor) {\n resolve();\n return;\n }\n try {\n const shouldContinue = visit(cursor);\n if (shouldContinue === false) {\n resolve();\n return;\n }\n cursor.continue();\n } catch (error) {\n reject(error);\n }\n },\n false,\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB cursor failed\")),\n { once: true },\n );\n });\n}\n\nexport function indexedDbTransport(options: IndexedDbTransportOptions = {}): IndexedDbTransport {\n const dbName = options.dbName ?? DEFAULT_DB_NAME;\n const storeName = options.storeName ?? DEFAULT_STORE_NAME;\n const codec = options.codec ?? (safeJsonCodec() as Codec<string | Uint8Array>);\n const batchSize = normalizePositiveInteger(options.batchSize, 100);\n const flushIntervalMs = normalizePositiveInteger(options.flushIntervalMs, 1000);\n const maxBufferSize = normalizePositiveInteger(options.maxBufferSize, 1000);\n const maxEntries = normalizePositiveInteger(options.maxEntries, 50_000);\n const maxBytes = normalizePositiveInteger(options.maxBytes, 50 * 1024 * 1024);\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const flushOnPageHide = options.flushOnPageHide ?? true;\n const durability = options.durability ?? \"default\";\n const rootIndexedDB = options.indexedDB ?? globalThis.indexedDB;\n const transactionOptions =\n durability === \"default\"\n ? undefined\n : ({\n durability,\n } satisfies IDBTransactionOptions);\n\n const buffer: LogEvent[] = [];\n let dbPromise: Promise<IDBDatabase> | undefined;\n let indexedDBFactoryPromise: Promise<IDBFactory | undefined> | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushPromise: Promise<void> | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n const statsState: IndexedDbTransportStats = {\n bufferDepth: 0,\n maxBufferDepth: 0,\n pendingFlush: false,\n enqueued: 0,\n persisted: 0,\n dropped: 0,\n droppedByReason: {},\n persistedDropped: 0,\n persistedDroppedByReason: {},\n flushes: 0,\n flushErrors: 0,\n lastFlushBatchSize: 0,\n lastFlushDurationMs: 0,\n prunes: 0,\n pruneFallbacks: 0,\n lastPruneDurationMs: 0,\n queries: 0,\n queryFallbacks: 0,\n lastQueryDurationMs: 0,\n databaseOpenCount: 0,\n storageBucketFallbacks: 0,\n transactionOptionFallbacks: 0,\n errors: 0,\n errorsByOperation: {},\n };\n\n const snapshotStats = (): IndexedDbTransportStats => ({\n ...statsState,\n bufferDepth: buffer.length,\n droppedByReason: { ...statsState.droppedByReason },\n errorsByOperation: { ...statsState.errorsByOperation },\n pendingFlush: flushPromise !== undefined,\n persistedDroppedByReason: { ...statsState.persistedDroppedByReason },\n });\n\n const reportInternalError = (error: unknown, operation: string) => {\n statsState.errors += 1;\n incrementRecord(statsState.errorsByOperation, operation);\n lastContext?.reportInternalError(error, {\n operation,\n phase: \"transport\",\n transport: options.name ?? \"indexeddb\",\n });\n };\n\n const dropEvent = (event: LogEvent, reason: string) => {\n statsState.dropped += 1;\n incrementRecord(statsState.droppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.dropped.${reason}`);\n options.onDrop?.(event, reason);\n };\n\n const dropPersistedEntry = (entry: IndexedDbLogEntry, reason: string) => {\n statsState.persistedDropped += 1;\n incrementRecord(statsState.persistedDroppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.persisted.dropped.${reason}`);\n options.onPersistedDrop?.(entry, reason);\n };\n\n const resolveIndexedDBFactory = async () => {\n if (options.indexedDB || !options.storageBucketName) return rootIndexedDB;\n indexedDBFactoryPromise ??= (async () => {\n const manager = getStorageBucketManager();\n if (!manager) {\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n }\n try {\n const bucket = await manager.open(\n options.storageBucketName as string,\n storageBucketOpenOptions(options),\n );\n if (bucket.indexedDB) return bucket.indexedDB;\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n } catch (error) {\n statsState.storageBucketFallbacks += 1;\n reportInternalError(error, \"storage-bucket-open\");\n return rootIndexedDB;\n }\n })();\n return indexedDBFactoryPromise;\n };\n\n const openDb = () => {\n dbPromise ??= resolveIndexedDBFactory().then((idb) => {\n if (!idb) throw new Error(\"IndexedDB is not available for indexedDbTransport\");\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = idb.open(dbName, DB_VERSION);\n request.addEventListener(\"upgradeneeded\", () => {\n const db = request.result;\n const store = db.objectStoreNames.contains(storeName)\n ? request.transaction?.objectStore(storeName)\n : db.createObjectStore(storeName, { keyPath: \"id\" });\n if (!store) return;\n ensureIndex(store, \"createdAt\", \"createdAt\");\n ensureIndex(store, \"level\", \"level\");\n ensureIndex(store, \"logger\", \"logger\");\n ensureIndex(store, \"type\", \"type\");\n ensureIndex(store, ORDER_INDEX_NAME, [\"createdAt\", \"seq\", \"id\"]);\n });\n request.addEventListener(\n \"success\",\n () => {\n statsState.databaseOpenCount += 1;\n resolve(request.result);\n },\n { once: true },\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB open failed\")),\n { once: true },\n );\n });\n });\n return dbPromise;\n };\n\n const createTransaction = (db: IDBDatabase, mode: IDBTransactionMode) => {\n if (mode !== \"readwrite\" || !transactionOptions) return db.transaction(storeName, mode);\n try {\n return db.transaction(storeName, mode, transactionOptions);\n } catch {\n statsState.transactionOptionFallbacks += 1;\n return db.transaction(storeName, mode);\n }\n };\n\n const withStore = async <T>(\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore, transaction: IDBTransaction) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(storeName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const getEntries = async () =>\n orderEntries(\n await withStore(\"readonly\", (store) =>\n requestToPromise(store.getAll() as IDBRequest<IndexedDbLogEntry[]>),\n ),\n );\n\n const countEntries = async (): Promise<number | undefined> =>\n withStore(\"readonly\", (store) => {\n const maybeStore = store as IDBObjectStore & {\n count?: () => IDBRequest<number>;\n };\n if (typeof maybeStore.count !== \"function\") return undefined;\n return requestToPromise(maybeStore.count.call(store));\n });\n\n const deleteEntries = async (entries: readonly IndexedDbLogEntry[], reason: string) => {\n if (entries.length === 0) return;\n await withStore(\"readwrite\", async (store) => {\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Deletes are sequenced for fake IDB compatibility.\n await requestToPromise(store.delete(entry.id));\n dropPersistedEntry(entry, reason);\n }\n });\n };\n\n const deleteByCursor = async (\n reason: string,\n openCursor: (store: IDBObjectStore) => IDBRequest<IDBCursorWithValue | null> | undefined,\n shouldDelete: (entry: IndexedDbLogEntry, deleted: number) => boolean,\n ): Promise<number | undefined> =>\n withStore(\"readwrite\", async (store) => {\n const request = openCursor(store);\n if (!request) return undefined;\n let deleted = 0;\n await iterateCursor(request, (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldDelete(entry, deleted)) return false;\n cursor.delete();\n deleted += 1;\n dropPersistedEntry(entry, reason);\n return true;\n });\n return deleted;\n });\n\n const deleteExpiredByCursor = async (cutoff: number): Promise<number | undefined> => {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n const range = IDBKeyRange.upperBound(cutoff, true);\n return deleteByCursor(\n \"ttl\",\n (store) => getStoreIndex(store, \"createdAt\")?.openCursor(range),\n () => true,\n );\n };\n\n const deleteOldestByCursor = async (\n reason: string,\n count: number,\n ): Promise<number | undefined> => {\n if (count <= 0) return 0;\n return deleteByCursor(\n reason,\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (_entry, deleted) => deleted < count,\n );\n };\n\n const deleteOldestBytesByCursor = async (bytesToFree: number): Promise<number | undefined> => {\n if (bytesToFree <= 0) return 0;\n let freed = 0;\n return deleteByCursor(\n \"max-bytes\",\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (entry) => {\n if (freed >= bytesToFree) return false;\n freed += entry.byteLength;\n return true;\n },\n );\n };\n\n const sumBytesByCursor = async (): Promise<number | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(store, ORDER_INDEX_NAME);\n if (!index) return undefined;\n let total = 0;\n await iterateCursor(index.openCursor(), (cursor) => {\n total += (cursor.value as IndexedDbLogEntry).byteLength;\n });\n return total;\n });\n\n const queryEntriesByCursor = async (\n queryOptions: IndexedDbTransportQueryOptions,\n ): Promise<IndexedDbLogEntry[] | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(store, ORDER_INDEX_NAME);\n if (!index) return undefined;\n const entries: IndexedDbLogEntry[] = [];\n const limit = queryOptions.limit;\n if (limit !== undefined && limit <= 0) return entries;\n await iterateCursor(\n index.openCursor(\n orderRangeForQuery(queryOptions),\n queryOptions.order === \"desc\" ? \"prev\" : \"next\",\n ),\n (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldKeepEntry(entry, queryOptions)) return true;\n entries.push(entry);\n return limit === undefined || entries.length < limit;\n },\n );\n return entries;\n });\n\n const pruneWithEntries = async () => {\n const now = Date.now();\n let entries = await getEntries();\n const expired =\n options.ttlMs === undefined\n ? []\n : entries.filter((entry) => now - entry.createdAt > (options.ttlMs as number));\n if (expired.length > 0) {\n await deleteEntries(expired, \"ttl\");\n const expiredIds = new Set(expired.map((entry) => entry.id));\n entries = entries.filter((entry) => !expiredIds.has(entry.id));\n }\n\n if (maxEntries >= 0 && entries.length > maxEntries) {\n const dropped = entries.slice(0, entries.length - maxEntries);\n await deleteEntries(dropped, \"max-entries\");\n entries = entries.slice(entries.length - maxEntries);\n }\n\n if (maxBytes >= 0) {\n let total = entries.reduce((sum, entry) => sum + entry.byteLength, 0);\n const dropped: IndexedDbLogEntry[] = [];\n for (const entry of entries) {\n if (total <= maxBytes) break;\n total -= entry.byteLength;\n dropped.push(entry);\n }\n await deleteEntries(dropped, \"max-bytes\");\n }\n };\n\n const pruneWithCursors = async (): Promise<boolean> => {\n if (options.ttlMs !== undefined) {\n const deleted = await deleteExpiredByCursor(Date.now() - options.ttlMs);\n if (deleted === undefined) return false;\n }\n\n if (maxEntries >= 0) {\n const persistedCount = await countEntries();\n if (persistedCount === undefined) return false;\n if (persistedCount > maxEntries) {\n const deleted = await deleteOldestByCursor(\"max-entries\", persistedCount - maxEntries);\n if (deleted === undefined) return false;\n }\n }\n\n if (maxBytes >= 0) {\n const totalBytes = await sumBytesByCursor();\n if (totalBytes === undefined) return false;\n if (totalBytes > maxBytes) {\n const deleted = await deleteOldestBytesByCursor(totalBytes - maxBytes);\n if (deleted === undefined) return false;\n }\n }\n\n return true;\n };\n\n const prune = async () => {\n const startedAt = nowMs();\n try {\n if (await pruneWithCursors()) return;\n statsState.pruneFallbacks += 1;\n await pruneWithEntries();\n } finally {\n statsState.prunes += 1;\n statsState.lastPruneDurationMs = nowMs() - startedAt;\n }\n };\n\n const eventToEntry = (event: LogEvent): IndexedDbLogEntry => {\n const payload = codec.encode(event);\n return {\n id: event.id,\n seq: event.seq,\n createdAt: event.time,\n level: event.level,\n levelName: event.levelName,\n logger: event.logger,\n type: event.type,\n byteLength: payloadByteLength(payload),\n payload,\n };\n };\n\n const writeBatch = async (events: readonly LogEvent[]) => {\n if (events.length === 0) return;\n const startedAt = nowMs();\n statsState.lastFlushBatchSize = events.length;\n const entries = events.map(eventToEntry);\n try {\n await withStore(\"readwrite\", (store) => {\n for (const entry of entries) {\n store.put(entry);\n }\n });\n statsState.persisted += entries.length;\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted\", entries.length);\n await prune();\n statsState.flushes += 1;\n } catch (error) {\n statsState.flushErrors += 1;\n throw error;\n } finally {\n statsState.lastFlushDurationMs = nowMs() - startedAt;\n }\n };\n\n const clearTimer = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n\n const flushPending = async () => {\n if (flushPromise) return flushPromise;\n clearTimer();\n const batch = buffer.splice(0, buffer.length);\n flushPromise = writeBatch(batch).finally(() => {\n flushPromise = undefined;\n if (buffer.length > 0 && !closed) schedule();\n });\n return flushPromise;\n };\n\n const schedule = () => {\n if (timer || flushIntervalMs <= 0 || closed) return;\n timer = setTimeout(() => {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n }, flushIntervalMs);\n };\n\n const onPageHide = () => {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"pagehide-flush\"));\n };\n\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"visibility-flush\"));\n }\n };\n\n if (flushOnPageHide) {\n globalThis.addEventListener?.(\"pagehide\", onPageHide);\n globalThis.addEventListener?.(\"visibilitychange\", onVisibilityChange);\n }\n\n return {\n name: options.name ?? \"indexeddb\",\n minLevel: options.minLevel,\n log(event, context) {\n if (closed) return;\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n lastContext = context;\n if (maxBufferSize === 0 || buffer.length >= maxBufferSize) {\n if (dropPolicy === \"drop-newest\") {\n dropEvent(event, \"buffer-full\");\n return;\n }\n const dropped = buffer.shift();\n if (dropped) dropEvent(dropped, \"buffer-full\");\n }\n buffer.push(event);\n statsState.enqueued += 1;\n statsState.maxBufferDepth = Math.max(statsState.maxBufferDepth, buffer.length);\n if (buffer.length >= batchSize || flushIntervalMs === 0) {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n } else {\n schedule();\n }\n },\n flush() {\n return flushPending();\n },\n async count() {\n await flushPending();\n return (await countEntries()) ?? (await getEntries()).length;\n },\n async clear() {\n buffer.length = 0;\n clearTimer();\n await withStore(\"readwrite\", (store) => requestToPromise(store.clear()));\n },\n async remove(ids) {\n await flushPending();\n const items = typeof ids === \"string\" ? [ids] : ids;\n if (items.length === 0) return;\n await withStore(\"readwrite\", async (store) => {\n for (const id of items) {\n // oxlint-disable-next-line no-await-in-loop -- Deletes must preserve fake IDB transaction ordering.\n await requestToPromise(store.delete(id));\n }\n });\n },\n async *query(queryOptions: IndexedDbTransportQueryOptions = {}) {\n await flushPending();\n const startedAt = nowMs();\n const cursorEntries = await queryEntriesByCursor(queryOptions);\n if (cursorEntries === undefined) statsState.queryFallbacks += 1;\n const entries =\n cursorEntries ??\n orderEntries(await getEntries(), queryOptions.order ?? \"asc\")\n .filter((entry) => shouldKeepEntry(entry, queryOptions))\n .slice(0, queryOptions.limit);\n statsState.queries += 1;\n statsState.lastQueryDurationMs = nowMs() - startedAt;\n for (const entry of entries) {\n const event = decodeEntry(entry, codec);\n if (event) yield event;\n }\n },\n stats() {\n return snapshotStats();\n },\n close() {\n closed = true;\n clearTimer();\n globalThis.removeEventListener?.(\"pagehide\", onPageHide);\n globalThis.removeEventListener?.(\"visibilitychange\", onVisibilityChange);\n const flushed = flushPending();\n const promise = dbPromise;\n dbPromise = undefined;\n return flushed.finally(() => {\n void promise?.then((db) => db.close());\n });\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n recordToEvent,\n retryTransport,\n toLevelValue,\n type LogEvent,\n type LoggerLevel,\n type RetryTransportOptions,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport {\n indexedDbTransport,\n type IndexedDbTransportOptions,\n type IndexedDbTransportQueryOptions,\n} from \"./indexeddb-transport\";\n\nexport interface OfflineFirstQueue {\n log: (event: LogEvent, context: TransportContext) => void | Promise<void>;\n flush?: () => void | Promise<void>;\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n remove: (ids: string | readonly string[]) => Promise<void>;\n count?: () => Promise<number>;\n clear?: () => Promise<void>;\n close?: () => void | Promise<void>;\n}\n\nexport interface OfflineFirstTransportOptions {\n name?: string;\n minLevel?: LoggerLevel;\n queue?: OfflineFirstQueue;\n queueOptions?: IndexedDbTransportOptions;\n replayBatchSize?: number;\n replayOnOnline?: boolean;\n online?: () => boolean;\n retry?: RetryTransportOptions;\n onQueued?: (event: LogEvent, error?: unknown) => void;\n onReplayed?: (events: readonly LogEvent[]) => void;\n}\n\nexport interface OfflineFirstTransport extends Transport {\n replay: () => Promise<void>;\n queuedCount: () => Promise<number | undefined>;\n clearQueue: () => Promise<void>;\n queue: OfflineFirstQueue;\n}\n\nfunction normalizeBatchSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return 100;\n return Math.floor(value);\n}\n\nasync function collectBatch(\n queue: OfflineFirstQueue,\n replayBatchSize: number,\n): Promise<LogEvent[]> {\n const events: LogEvent[] = [];\n for await (const event of queue.query({ order: \"asc\", limit: replayBatchSize })) {\n events.push(event);\n }\n return events;\n}\n\nfunction isBrowserOnline(options: OfflineFirstTransportOptions): boolean {\n if (options.online) return options.online();\n if (typeof navigator === \"undefined\") return true;\n return navigator.onLine !== false;\n}\n\nexport function offlineFirstTransport(\n remote: Transport,\n options: OfflineFirstTransportOptions = {},\n): OfflineFirstTransport {\n const name = options.name ?? `offline-first(${remote.name ?? \"transport\"})`;\n const replayBatchSize = normalizeBatchSize(options.replayBatchSize);\n const queue: OfflineFirstQueue =\n options.queue ??\n (indexedDbTransport({\n dbName: \"loggerjs-offline\",\n flushIntervalMs: 0,\n name: `${name}:queue`,\n storeName: \"offline-events\",\n ...options.queueOptions,\n }) as OfflineFirstQueue);\n const reliableRemote = retryTransport(remote, {\n maxRetries: 2,\n retryBaseDelayMs: 250,\n retryMaxDelayMs: 5000,\n ...options.retry,\n name: `${name}:remote`,\n }) as Transport & {\n log: NonNullable<Transport[\"log\"]>;\n logBatch: NonNullable<Transport[\"logBatch\"]>;\n };\n let lastContext: TransportContext | undefined;\n let replayPromise: Promise<void> | undefined;\n\n const replayContext: TransportContext = {\n loggerName: name,\n now: () => Date.now(),\n toEvent: recordToEvent,\n reportInternalError() {},\n };\n\n const contextForReplay = () => lastContext ?? replayContext;\n\n const reportInternalError = (error: unknown, operation: string) => {\n contextForReplay().reportInternalError(error, {\n phase: \"transport\",\n transport: name,\n operation,\n });\n };\n\n const queueEvent = async (event: LogEvent, context: TransportContext, error?: unknown) => {\n await queue.log(event, context);\n await queue.flush?.();\n incrementLoggerMetaCounter(\"transport.offline.queued\");\n options.onQueued?.(event, error);\n };\n\n const sendRemoteBatch = async (events: readonly LogEvent[], context: TransportContext) => {\n await reliableRemote.logBatch?.([...events], context);\n };\n\n const sendOrQueue = async (event: LogEvent, context: TransportContext) => {\n lastContext = context;\n if (!isBrowserOnline(options)) {\n await queueEvent(event, context);\n return;\n }\n\n try {\n await reliableRemote.log?.(event, context);\n } catch (error) {\n incrementLoggerMetaCounter(\"transport.offline.remote.failed\");\n await queueEvent(event, context, error);\n }\n };\n\n const replay = async () => {\n if (replayPromise) return replayPromise;\n replayPromise = (async () => {\n if (!isBrowserOnline(options)) return;\n const context = contextForReplay();\n await queue.flush?.();\n\n for (;;) {\n // oxlint-disable-next-line no-await-in-loop -- Replay reads the next durable batch after prior deletes settle.\n const batch = await collectBatch(queue, replayBatchSize);\n if (batch.length === 0) return;\n try {\n // oxlint-disable-next-line no-await-in-loop -- Replay removes durable entries only after delivery succeeds.\n await sendRemoteBatch(batch, context);\n // oxlint-disable-next-line no-await-in-loop -- Delete only the delivered ids before reading the next batch.\n await queue.remove(batch.map((event) => event.id));\n incrementLoggerMetaCounter(\"transport.offline.replayed\", batch.length);\n options.onReplayed?.(batch);\n } catch (error) {\n incrementLoggerMetaCounter(\"transport.offline.replay.failed\");\n reportInternalError(error, \"replay\");\n throw error;\n }\n }\n })().finally(() => {\n replayPromise = undefined;\n });\n return replayPromise;\n };\n\n const onOnline = () => {\n void replay().catch((error: unknown) => reportInternalError(error, \"online-replay\"));\n };\n\n if (options.replayOnOnline ?? true) {\n globalThis.addEventListener?.(\"online\", onOnline);\n }\n\n return {\n name,\n minLevel: options.minLevel ?? remote.minLevel,\n queue,\n write(record, context) {\n return sendOrQueue(context.toEvent(record), context);\n },\n writeBatch(records, context) {\n return Promise.all(\n records.map((record) => sendOrQueue(context.toEvent(record), context)),\n ).then(() => undefined);\n },\n log(event, context) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n return sendOrQueue(event, context);\n },\n logBatch(events, context) {\n return Promise.all(\n events.map((event) =>\n options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)\n ? undefined\n : sendOrQueue(event, context),\n ),\n ).then(() => undefined);\n },\n replay,\n async flush() {\n await replay();\n await reliableRemote.flush?.();\n await queue.flush?.();\n },\n flushSync() {\n reliableRemote.flushSync?.();\n },\n async close() {\n globalThis.removeEventListener?.(\"online\", onOnline);\n await replay();\n await reliableRemote.close?.();\n await queue.close?.();\n },\n async queuedCount() {\n await queue.flush?.();\n return queue.count?.();\n },\n async clearQueue() {\n await queue.clear?.();\n },\n };\n}\n","import { safeJsonStringify, type LogEvent, type SafeStringifyOptions } from \"@loggerjs/core\";\nimport type { IndexedDbTransportQueryOptions } from \"./indexeddb-transport\";\n\nexport type LogZipExportFormat = \"ndjson\" | \"json\";\n\nexport interface ZipExportFile {\n name: string;\n content: string | Uint8Array | ArrayBuffer;\n lastModified?: number;\n}\n\nexport interface LogZipBlobOptions {\n lastModified?: number;\n type?: string;\n}\n\nexport interface LogZipExportQuerySource {\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n}\n\nexport type LogZipExportSource = AsyncIterable<LogEvent> | LogZipExportQuerySource;\n\nexport interface LogZipExportManifest {\n schema: \"loggerjs.log-export.v1\";\n createdAt: string;\n source?: string;\n format: LogZipExportFormat;\n logFileName: string;\n logCount: number;\n skippedCount: number;\n query?: IndexedDbTransportQueryOptions;\n timeRange?: {\n from: number;\n to: number;\n };\n}\n\nexport interface LogZipExportOptions {\n query?: IndexedDbTransportQueryOptions;\n format?: LogZipExportFormat;\n logFileName?: string;\n includeManifest?: boolean;\n manifestFileName?: string;\n source?: string;\n createdAt?: number;\n maxEvents?: number;\n stringify?: SafeStringifyOptions;\n serializeEvent?: (event: LogEvent) => string;\n mapEvent?: (event: LogEvent) => LogEvent | false | null | undefined;\n}\n\nexport interface DownloadBlobOptions {\n filename?: string;\n document?: Document;\n url?: Pick<typeof URL, \"createObjectURL\" | \"revokeObjectURL\">;\n revokeDelayMs?: number;\n}\n\ninterface NormalizedZipFile {\n name: string;\n nameBytes: Uint8Array;\n contentBytes: Uint8Array;\n crc32: number;\n modifiedTime: number;\n modifiedDate: number;\n localHeaderOffset: number;\n}\n\nconst ZIP_UTF8_FLAG = 0x0800;\nconst ZIP_STORE_METHOD = 0;\nconst ZIP_VERSION = 20;\nconst ZIP_MAX_UINT16 = 0xffff;\nconst ZIP_MAX_UINT32 = 0xffffffff;\nconst LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50;\n\nlet crc32Table: Uint32Array | undefined;\n\nfunction getCrc32Table(): Uint32Array {\n if (crc32Table) return crc32Table;\n const table = new Uint32Array(256);\n for (let index = 0; index < table.length; index += 1) {\n let crc = index;\n for (let bit = 0; bit < 8; bit += 1) {\n crc = crc & 1 ? 0xedb88320 ^ (crc >>> 1) : crc >>> 1;\n }\n table[index] = crc >>> 0;\n }\n crc32Table = table;\n return table;\n}\n\nfunction crc32(bytes: Uint8Array): number {\n const table = getCrc32Table();\n let crc = 0xffffffff;\n for (const byte of bytes) {\n crc = (crc >>> 8) ^ (table[(crc ^ byte) & 0xff] ?? 0);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction encodeText(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nfunction normalizeFileContent(content: ZipExportFile[\"content\"]): Uint8Array {\n if (typeof content === \"string\") return encodeText(content);\n if (content instanceof Uint8Array) return content;\n return new Uint8Array(content);\n}\n\nfunction normalizeZipFileName(name: string): string {\n const normalized = name\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .filter((part) => part.length > 0 && part !== \".\" && part !== \"..\")\n .join(\"/\");\n if (!normalized) throw new Error(\"ZIP file name cannot be empty\");\n return normalized;\n}\n\nfunction toDosDateTime(timestamp: number): { time: number; date: number } {\n const date = new Date(Number.isFinite(timestamp) ? timestamp : Date.now());\n const year = Math.min(2107, Math.max(1980, date.getFullYear()));\n return {\n time: (date.getHours() << 11) | (date.getMinutes() << 5) | Math.floor(date.getSeconds() / 2),\n date: ((year - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate(),\n };\n}\n\nfunction assertZipUint16(value: number, label: string) {\n if (!Number.isSafeInteger(value) || value < 0 || value > ZIP_MAX_UINT16) {\n throw new Error(`${label} exceeds ZIP32 limit`);\n }\n}\n\nfunction assertZipUint32(value: number, label: string) {\n if (!Number.isSafeInteger(value) || value < 0 || value > ZIP_MAX_UINT32) {\n throw new Error(`${label} exceeds ZIP32 limit`);\n }\n}\n\nfunction createLocalFileHeader(file: NormalizedZipFile): Uint8Array {\n const header = new Uint8Array(30);\n const view = new DataView(header.buffer);\n view.setUint32(0, LOCAL_FILE_HEADER_SIGNATURE, true);\n view.setUint16(4, ZIP_VERSION, true);\n view.setUint16(6, ZIP_UTF8_FLAG, true);\n view.setUint16(8, ZIP_STORE_METHOD, true);\n view.setUint16(10, file.modifiedTime, true);\n view.setUint16(12, file.modifiedDate, true);\n view.setUint32(14, file.crc32, true);\n view.setUint32(18, file.contentBytes.byteLength, true);\n view.setUint32(22, file.contentBytes.byteLength, true);\n view.setUint16(26, file.nameBytes.byteLength, true);\n view.setUint16(28, 0, true);\n return header;\n}\n\nfunction createCentralDirectoryHeader(file: NormalizedZipFile): Uint8Array {\n const header = new Uint8Array(46);\n const view = new DataView(header.buffer);\n view.setUint32(0, CENTRAL_DIRECTORY_SIGNATURE, true);\n view.setUint16(4, ZIP_VERSION, true);\n view.setUint16(6, ZIP_VERSION, true);\n view.setUint16(8, ZIP_UTF8_FLAG, true);\n view.setUint16(10, ZIP_STORE_METHOD, true);\n view.setUint16(12, file.modifiedTime, true);\n view.setUint16(14, file.modifiedDate, true);\n view.setUint32(16, file.crc32, true);\n view.setUint32(20, file.contentBytes.byteLength, true);\n view.setUint32(24, file.contentBytes.byteLength, true);\n view.setUint16(28, file.nameBytes.byteLength, true);\n view.setUint16(30, 0, true);\n view.setUint16(32, 0, true);\n view.setUint16(34, 0, true);\n view.setUint16(36, 0, true);\n view.setUint32(38, 0, true);\n view.setUint32(42, file.localHeaderOffset, true);\n return header;\n}\n\nfunction createEndOfCentralDirectory(\n fileCount: number,\n centralDirectorySize: number,\n centralDirectoryOffset: number,\n): Uint8Array {\n assertZipUint16(fileCount, \"ZIP file count\");\n assertZipUint32(centralDirectorySize, \"ZIP central directory size\");\n assertZipUint32(centralDirectoryOffset, \"ZIP central directory offset\");\n\n const footer = new Uint8Array(22);\n const view = new DataView(footer.buffer);\n view.setUint32(0, END_OF_CENTRAL_DIRECTORY_SIGNATURE, true);\n view.setUint16(4, 0, true);\n view.setUint16(6, 0, true);\n view.setUint16(8, fileCount, true);\n view.setUint16(10, fileCount, true);\n view.setUint32(12, centralDirectorySize, true);\n view.setUint32(16, centralDirectoryOffset, true);\n view.setUint16(20, 0, true);\n return footer;\n}\n\nfunction createNormalizedZipFiles(\n files: readonly ZipExportFile[],\n options: LogZipBlobOptions,\n): NormalizedZipFile[] {\n const names = new Set<string>();\n let offset = 0;\n return files.map((file) => {\n const name = normalizeZipFileName(file.name);\n if (names.has(name)) throw new Error(`Duplicate ZIP file name: ${name}`);\n names.add(name);\n\n const nameBytes = encodeText(name);\n const contentBytes = normalizeFileContent(file.content);\n assertZipUint16(nameBytes.byteLength, `ZIP file name ${name}`);\n assertZipUint32(contentBytes.byteLength, `ZIP file ${name}`);\n assertZipUint32(offset, \"ZIP local header offset\");\n\n const modified = toDosDateTime(file.lastModified ?? options.lastModified ?? Date.now());\n const normalized: NormalizedZipFile = {\n name,\n nameBytes,\n contentBytes,\n crc32: crc32(contentBytes),\n modifiedTime: modified.time,\n modifiedDate: modified.date,\n localHeaderOffset: offset,\n };\n offset += 30 + nameBytes.byteLength + contentBytes.byteLength;\n assertZipUint32(offset, \"ZIP local data size\");\n return normalized;\n });\n}\n\nfunction isQuerySource(source: LogZipExportSource): source is LogZipExportQuerySource {\n return \"query\" in source && typeof source.query === \"function\";\n}\n\nfunction resolveSource(\n source: LogZipExportSource,\n query: IndexedDbTransportQueryOptions | undefined,\n): AsyncIterable<LogEvent> {\n if (isQuerySource(source)) return source.query(query);\n if (query) throw new Error(\"Log ZIP export query options require a source with query()\");\n return source;\n}\n\nfunction normalizeMaxEvents(value: number | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (!Number.isFinite(value)) return undefined;\n return Math.max(0, Math.floor(value));\n}\n\nexport function createLogZipBlob(\n files: readonly ZipExportFile[],\n options: LogZipBlobOptions = {},\n): Blob {\n const normalizedFiles = createNormalizedZipFiles(files, options);\n const parts: Uint8Array[] = [];\n let centralDirectoryOffset = 0;\n for (const file of normalizedFiles) {\n parts.push(createLocalFileHeader(file), file.nameBytes, file.contentBytes);\n centralDirectoryOffset += 30 + file.nameBytes.byteLength + file.contentBytes.byteLength;\n }\n\n let centralDirectorySize = 0;\n for (const file of normalizedFiles) {\n const header = createCentralDirectoryHeader(file);\n parts.push(header, file.nameBytes);\n centralDirectorySize += header.byteLength + file.nameBytes.byteLength;\n }\n parts.push(\n createEndOfCentralDirectory(\n normalizedFiles.length,\n centralDirectorySize,\n centralDirectoryOffset,\n ),\n );\n\n return new Blob(parts as unknown as BlobPart[], { type: options.type ?? \"application/zip\" });\n}\n\nexport async function exportLogsToZip(\n source: LogZipExportSource,\n options: LogZipExportOptions = {},\n): Promise<Blob> {\n const format = options.format ?? \"ndjson\";\n const createdAt = options.createdAt ?? Date.now();\n const logFileName = options.logFileName ?? (format === \"json\" ? \"logs.json\" : \"logs.ndjson\");\n const maxEvents = normalizeMaxEvents(options.maxEvents);\n const serialize =\n options.serializeEvent ??\n ((event: LogEvent) => safeJsonStringify(event, options.stringify ?? {}));\n const lines: string[] = [];\n let skippedCount = 0;\n let from: number | undefined;\n let to: number | undefined;\n\n for await (const event of resolveSource(source, options.query)) {\n if (maxEvents !== undefined && lines.length >= maxEvents) break;\n const mapped = options.mapEvent ? options.mapEvent(event) : event;\n if (!mapped) {\n skippedCount += 1;\n continue;\n }\n lines.push(serialize(mapped));\n from = from === undefined ? mapped.time : Math.min(from, mapped.time);\n to = to === undefined ? mapped.time : Math.max(to, mapped.time);\n }\n\n const logContent =\n format === \"json\" ? `[${lines.join(\",\")}]` : lines.length > 0 ? `${lines.join(\"\\n\")}\\n` : \"\";\n\n const files: ZipExportFile[] = [\n {\n name: logFileName,\n content: logContent,\n lastModified: createdAt,\n },\n ];\n\n if (options.includeManifest ?? true) {\n const manifest: LogZipExportManifest = {\n schema: \"loggerjs.log-export.v1\",\n createdAt: new Date(createdAt).toISOString(),\n source: options.source,\n format,\n logFileName: normalizeZipFileName(logFileName),\n logCount: lines.length,\n skippedCount,\n query: options.query,\n timeRange: from === undefined || to === undefined ? undefined : { from, to },\n };\n files.push({\n name: options.manifestFileName ?? \"manifest.json\",\n content: `${safeJsonStringify(manifest, { space: 2 })}\\n`,\n lastModified: createdAt,\n });\n }\n\n return createLogZipBlob(files, { lastModified: createdAt });\n}\n\nexport function downloadBlob(\n blob: Blob,\n filenameOrOptions: string | DownloadBlobOptions = {},\n): string {\n const options =\n typeof filenameOrOptions === \"string\" ? { filename: filenameOrOptions } : filenameOrOptions;\n const documentRef = options.document ?? globalThis.document;\n const urlRef = options.url ?? globalThis.URL;\n if (!documentRef?.body || !urlRef?.createObjectURL || !urlRef.revokeObjectURL) {\n throw new Error(\"downloadBlob requires document and URL.createObjectURL\");\n }\n\n const href = urlRef.createObjectURL(blob);\n const anchor = documentRef.createElement(\"a\");\n anchor.href = href;\n anchor.download = options.filename ?? \"loggerjs-logs.zip\";\n anchor.style.display = \"none\";\n documentRef.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n\n const revoke = () => urlRef.revokeObjectURL(href);\n const revokeDelayMs = options.revokeDelayMs ?? 1000;\n if (revokeDelayMs <= 0) {\n revoke();\n } else {\n setTimeout(revoke, revokeDelayMs);\n }\n\n return href;\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\ntype ConsoleLevel = \"debug\" | \"info\" | \"log\" | \"trace\" | \"warn\" | \"error\";\n\ntype ConsoleRecord = Partial<Record<ConsoleLevel, (...args: unknown[]) => void>>;\n\nconst defaultLevels: ConsoleLevel[] = [\"debug\", \"info\", \"log\", \"trace\", \"warn\", \"error\"];\n\nconst levelMap: Record<ConsoleLevel, LoggerLevel> = {\n debug: \"debug\",\n info: \"info\",\n log: \"info\",\n trace: \"trace\",\n warn: \"warn\",\n error: \"error\",\n};\n\nexport interface CaptureConsoleOptions {\n levels?: ConsoleLevel[];\n preserveConsole?: boolean;\n captureArguments?: boolean;\n maxCapturesPerSecond?: number;\n}\n\nfunction formatConsoleMessage(args: unknown[]): string {\n return args\n .map((arg) => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return arg.message;\n try {\n return JSON.stringify(\n normalizeValue(arg, { maxDepth: 3, maxArrayLength: 20, maxObjectKeys: 40 }),\n );\n } catch {\n return String(arg);\n }\n })\n .join(\" \");\n}\n\nfunction reportRateLimitDrop() {\n incrementLoggerMetaCounter(\"integration.dropped\");\n incrementLoggerMetaCounter(\"integration.dropped.rate-limit\");\n}\n\nexport function captureConsoleIntegration(options: CaptureConsoleOptions = {}): Integration {\n const levels = options.levels ?? defaultLevels;\n const preserveConsole = options.preserveConsole ?? true;\n const captureArguments = options.captureArguments ?? false;\n const maxCapturesPerSecond = options.maxCapturesPerSecond ?? 100;\n\n return {\n name: \"capture-console\",\n setup(api: IntegrationSetupContext) {\n if (typeof console === \"undefined\") return;\n const originals: ConsoleRecord = {};\n const boundOriginals: ConsoleRecord = {};\n let windowStarted = Date.now();\n let capturesInWindow = 0;\n let disposed = false;\n\n const shouldCapture = () => {\n const now = Date.now();\n if (now - windowStarted >= 1000) {\n windowStarted = now;\n capturesInWindow = 0;\n }\n if (capturesInWindow >= maxCapturesPerSecond) {\n reportRateLimitDrop();\n return false;\n }\n capturesInWindow += 1;\n return true;\n };\n\n for (const level of levels) {\n const original = (console as unknown as ConsoleRecord)[level] ?? console.log.bind(console);\n originals[level] = original;\n const unpatched = api.unpatched.console[level] ?? original;\n api.unpatched.console[level] ??= original;\n boundOriginals[level] = unpatched.bind(console);\n\n const capture = api.guard((args: unknown[]) => {\n if (!shouldCapture()) return;\n const consoleData: Record<string, unknown> = { level };\n if (captureArguments) {\n consoleData.arguments = normalizeValue(args, { maxDepth: 4 });\n }\n api.capture({\n level: levelMap[level],\n message: formatConsoleMessage(args),\n props: { console: consoleData },\n });\n });\n\n (console as unknown as ConsoleRecord)[level] = (...args: unknown[]) => {\n capture(args);\n if (preserveConsole) boundOriginals[level]?.(...args);\n };\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const level of levels) {\n if (originals[level]) (console as unknown as ConsoleRecord)[level] = originals[level];\n }\n };\n },\n };\n}\n","import {\n addContextProvider,\n formatBaggage,\n formatTraceparent,\n parseBaggage,\n parseTraceparent,\n type Baggage,\n type Integration,\n type TraceContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserContextActionEventName = \"change\" | \"click\" | \"input\" | \"keydown\" | \"submit\";\n\nexport interface BrowserContextEventTargetLike {\n addEventListener: typeof globalThis.addEventListener;\n removeEventListener: typeof globalThis.removeEventListener;\n}\n\nexport interface BrowserContextPropagationOptions {\n sessionId?: string | (() => string | undefined);\n requestId?: () => string | undefined;\n trace?: TraceContext | (() => TraceContext | undefined);\n traceparent?: string | (() => string | undefined);\n baggage?: Baggage | string | (() => Baggage | string | undefined);\n actionEvents?: readonly BrowserContextActionEventName[];\n actionTtlMs?: number;\n root?: BrowserContextEventTargetLike;\n clock?: () => number;\n idFactory?: () => string;\n}\n\nconst defaultActionEvents: readonly BrowserContextActionEventName[] = [\n \"click\",\n \"input\",\n \"change\",\n \"submit\",\n];\n\nlet fallbackIdSeq = 0;\n\nfunction defaultIdFactory(): string {\n const cryptoRandomUUID = globalThis.crypto?.randomUUID;\n if (cryptoRandomUUID) return cryptoRandomUUID.call(globalThis.crypto);\n return `${Date.now().toString(36)}-${(fallbackIdSeq++).toString(36)}`;\n}\n\nfunction resolveValue<T>(value: T | (() => T | undefined) | undefined): T | undefined {\n return typeof value === \"function\" ? (value as () => T | undefined)() : value;\n}\n\nfunction normalizeBaggage(value: Baggage | string | undefined): Baggage | undefined {\n if (typeof value === \"string\") return parseBaggage(value);\n return value;\n}\n\nfunction actionTargetName(target: EventTarget | null): string | undefined {\n const item = target as { tagName?: string; id?: string; name?: string } | null;\n if (!item) return undefined;\n return item.id || item.name || item.tagName?.toLowerCase();\n}\n\nexport function browserContextPropagationIntegration(\n options: BrowserContextPropagationOptions = {},\n): Integration {\n const actionEvents = options.actionEvents ?? defaultActionEvents;\n const actionTtlMs = Math.max(0, Math.floor(options.actionTtlMs ?? 5000));\n const clock = options.clock ?? Date.now;\n const idFactory = options.idFactory ?? defaultIdFactory;\n let lastAction:\n | {\n id: string;\n type: string;\n target?: string;\n time: number;\n }\n | undefined;\n\n return {\n name: \"browser-context-propagation\",\n setup() {\n const root = options.root ?? globalThis.document;\n const disposeProvider = addContextProvider(() => {\n const sessionId = resolveValue(options.sessionId);\n const requestId = options.requestId?.();\n const explicitTrace = resolveValue(options.trace);\n const trace = explicitTrace ?? parseTraceparent(resolveValue(options.traceparent));\n const baggage = normalizeBaggage(resolveValue(options.baggage)) ?? trace?.baggage;\n const traceparent = formatTraceparent(trace);\n const now = clock();\n const action =\n lastAction && now - lastAction.time <= actionTtlMs\n ? {\n actionId: lastAction.id,\n actionType: lastAction.type,\n actionTarget: lastAction.target,\n }\n : undefined;\n\n return {\n sessionId,\n requestId,\n traceparent,\n baggage: formatBaggage(baggage),\n ...action,\n };\n });\n\n if (!root?.addEventListener || !root.removeEventListener || actionEvents.length === 0) {\n return disposeProvider;\n }\n\n const onAction = (event: Event) => {\n lastAction = {\n id: idFactory(),\n type: event.type,\n target: actionTargetName(event.target),\n time: clock(),\n };\n };\n\n for (const event of actionEvents) root.addEventListener(event, onAction, true);\n\n return () => {\n for (const event of actionEvents) root.removeEventListener(event, onAction, true);\n disposeProvider();\n };\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n} from \"@loggerjs/core\";\n\nexport interface CaptureBrowserErrorsOptions {\n captureWindowError?: boolean;\n captureUnhandledRejection?: boolean;\n captureResourceErrors?: boolean;\n captureSecurityPolicyViolation?: boolean;\n scriptErrorDedupeWindowMs?: number;\n}\n\nfunction resourceInfo(target: unknown): Record<string, unknown> {\n const element = target as {\n tagName?: string;\n src?: string;\n href?: string;\n currentSrc?: string;\n outerHTML?: string;\n } | null;\n return {\n tagName: element?.tagName,\n url: element?.src || element?.currentSrc || element?.href,\n html: element?.outerHTML?.slice(0, 500),\n };\n}\n\nfunction reportDrop(reason: string) {\n incrementLoggerMetaCounter(\"integration.dropped\");\n incrementLoggerMetaCounter(`integration.dropped.${reason}`);\n}\n\nexport function captureBrowserErrorsIntegration(\n options: CaptureBrowserErrorsOptions = {},\n): Integration {\n const captureWindowError = options.captureWindowError ?? true;\n const captureUnhandledRejection = options.captureUnhandledRejection ?? true;\n const captureResourceErrors = options.captureResourceErrors ?? true;\n const captureSecurityPolicyViolation = options.captureSecurityPolicyViolation ?? false;\n const scriptErrorDedupeWindowMs = options.scriptErrorDedupeWindowMs ?? 1000;\n\n return {\n name: \"capture-browser-errors\",\n setup(api: IntegrationSetupContext) {\n const disposers: Array<() => void> = [];\n let lastScriptErrorAt = 0;\n let disposed = false;\n\n const shouldDropScriptError = (message: string | undefined) => {\n if (message !== \"Script error.\") return false;\n const now = Date.now();\n if (now - lastScriptErrorAt <= scriptErrorDedupeWindowMs) {\n reportDrop(\"script-error-duplicate\");\n return true;\n }\n lastScriptErrorAt = now;\n return false;\n };\n\n if (captureWindowError && typeof addEventListener !== \"undefined\") {\n const onError = api.guard((event: ErrorEvent | Event) => {\n const errorEvent = event as ErrorEvent;\n if (\"message\" in errorEvent && shouldDropScriptError(errorEvent.message)) return;\n\n if (\"error\" in errorEvent && errorEvent.error) {\n api.capture({\n level: \"error\",\n message: errorEvent.message || errorEvent.error.message,\n error: errorEvent.error,\n props: {\n browser: {\n kind: \"script-error\",\n file: errorEvent.filename,\n line: errorEvent.lineno,\n column: errorEvent.colno,\n },\n },\n });\n return;\n }\n\n if (\"message\" in errorEvent && errorEvent.message) {\n api.capture({\n level: \"error\",\n message: errorEvent.message,\n props: {\n browser: {\n kind: \"script-error\",\n file: errorEvent.filename,\n line: errorEvent.lineno,\n column: errorEvent.colno,\n },\n },\n });\n return;\n }\n\n if (captureResourceErrors) {\n api.capture({\n level: \"error\",\n message: \"Browser resource load error\",\n props: {\n browser: {\n kind: \"resource-error\",\n ...resourceInfo((event as Event).target),\n },\n },\n });\n }\n });\n addEventListener(\"error\", onError, true);\n disposers.push(() => removeEventListener(\"error\", onError, true));\n }\n\n if (captureUnhandledRejection && typeof addEventListener !== \"undefined\") {\n const onUnhandledRejection = api.guard((event: PromiseRejectionEvent) => {\n const reason = event.reason;\n api.capture({\n level: \"error\",\n message: reason instanceof Error ? reason.message : \"Unhandled promise rejection\",\n error: reason,\n props: {\n browser: { kind: \"unhandledrejection\" },\n reason: normalizeValue(reason, { maxDepth: 5 }),\n },\n });\n });\n addEventListener(\"unhandledrejection\", onUnhandledRejection);\n disposers.push(() => removeEventListener(\"unhandledrejection\", onUnhandledRejection));\n }\n\n if (captureSecurityPolicyViolation && typeof addEventListener !== \"undefined\") {\n const onSecurityPolicyViolation = api.guard((event: SecurityPolicyViolationEvent) => {\n api.capture({\n level: \"warn\",\n message: `Security policy violation: ${event.violatedDirective}`,\n props: {\n browser: {\n kind: \"securitypolicyviolation\",\n blockedURI: event.blockedURI,\n documentURI: event.documentURI,\n file: event.sourceFile,\n line: event.lineNumber,\n column: event.columnNumber,\n originalPolicy: event.originalPolicy,\n effectiveDirective: event.effectiveDirective,\n },\n },\n });\n });\n addEventListener(\"securitypolicyviolation\", onSecurityPolicyViolation);\n disposers.push(() =>\n removeEventListener(\"securitypolicyviolation\", onSecurityPolicyViolation),\n );\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","export function nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nexport function durationMs(started: number): number {\n return nowMs() - started;\n}\n\nexport function sanitizeHttpUrl(rawUrl: string, sanitizer?: (url: string) => string): string {\n const stripped = stripSensitiveUrlParts(rawUrl);\n return sanitizer ? sanitizer(stripped) : stripped;\n}\n\nexport function pickAllowedHeaders(\n headers: Headers | undefined,\n allowList: readonly string[] | undefined,\n): Record<string, string> | undefined {\n if (!headers || !allowList || allowList.length === 0) return undefined;\n const out: Record<string, string> = {};\n for (const name of allowList) {\n const value = headers.get(name);\n if (value !== null) out[name.toLowerCase()] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function headersFromInit(headers: HeadersInit | undefined): Headers | undefined {\n if (!headers) return undefined;\n try {\n return new Headers(headers);\n } catch {\n return undefined;\n }\n}\n\nexport function shouldSample(sampleRate: number, random: () => number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n return random() < sampleRate;\n}\n\nfunction stripSensitiveUrlParts(rawUrl: string): string {\n if (!/^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(rawUrl)) {\n return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;\n }\n\n try {\n const url = new URL(rawUrl);\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n } catch {\n return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;\n }\n}\n","import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type UnpatchedFunction,\n} from \"@loggerjs/core\";\nimport {\n durationMs,\n headersFromInit,\n nowMs,\n pickAllowedHeaders,\n sanitizeHttpUrl,\n shouldSample,\n} from \"./http-capture-utils\";\n\nexport interface CaptureFetchOptions {\n minStatus?: number;\n captureRequestHeaders?: readonly string[];\n captureResponseHeaders?: readonly string[];\n captureAll?: boolean;\n captureSuccessful?: boolean;\n sampleRate?: number;\n random?: () => number;\n sanitizeUrl?: (url: string) => string;\n}\n\ntype BrowserFetch = typeof fetch;\n\nfunction requestUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction requestMethod(input: RequestInfo | URL, init?: RequestInit): string {\n if (init?.method) return init.method.toUpperCase();\n if (typeof input === \"object\" && \"method\" in input && input.method)\n return input.method.toUpperCase();\n return \"GET\";\n}\n\nexport function captureFetchIntegration(options: CaptureFetchOptions = {}): Integration {\n const minStatus = options.minStatus ?? 400;\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-fetch\",\n setup(api: IntegrationSetupContext) {\n const current = globalThis.fetch;\n if (!current) return;\n const original =\n (api.unpatched.fetch as BrowserFetch | undefined) ?? current.bind(globalThis);\n api.unpatched.fetch ??= original as UnpatchedFunction;\n\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n\n globalThis.fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const started = nowMs();\n const url = sanitizeHttpUrl(requestUrl(input), options.sanitizeUrl);\n const method = requestMethod(input, init);\n try {\n const response = await original(input, init);\n const shouldCapture =\n response.status >= minStatus || (captureAll && shouldSample(sampleRate, random));\n if (shouldCapture) {\n capture({\n level: response.status >= minStatus ? \"warn\" : \"debug\",\n message: `Fetch ${response.status} ${method} ${url}`,\n props: {\n http: {\n kind: \"fetch\",\n method,\n url,\n status: response.status,\n ok: response.ok,\n durationMs: durationMs(started),\n requestHeaders: pickAllowedHeaders(\n headersFromInit(init?.headers),\n options.captureRequestHeaders,\n ),\n responseHeaders: pickAllowedHeaders(\n response.headers,\n options.captureResponseHeaders,\n ),\n },\n },\n });\n }\n return response;\n } catch (error) {\n capture({\n level: \"error\",\n message: `Fetch network error ${method} ${url}`,\n error,\n props: {\n http: { kind: \"fetch\", method, url, durationMs: durationMs(started) },\n input: normalizeValue(input, { maxDepth: 3 }),\n },\n });\n throw error;\n }\n };\n\n return () => {\n globalThis.fetch = current;\n };\n },\n };\n}\n","import type { CaptureInput, Integration, IntegrationSetupContext } from \"@loggerjs/core\";\nimport { durationMs, nowMs, sanitizeHttpUrl, shouldSample } from \"./http-capture-utils\";\n\nexport interface CaptureXHROptions {\n minStatus?: number;\n captureAll?: boolean;\n captureSuccessful?: boolean;\n sampleRate?: number;\n random?: () => number;\n sanitizeUrl?: (url: string) => string;\n}\n\ninterface XHRMeta {\n method: string;\n url: string;\n started: number;\n}\n\nconst XHR_META = \"__LOGGERJS_XHR_META__\";\n\nexport function captureXHRIntegration(options: CaptureXHROptions = {}): Integration {\n const minStatus = options.minStatus ?? 400;\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-xhr\",\n setup(api: IntegrationSetupContext) {\n if (typeof XMLHttpRequest === \"undefined\") return;\n const proto = XMLHttpRequest.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n api.unpatched.XMLHttpRequest ??= XMLHttpRequest as unknown;\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n\n proto.open = function patchedOpen(\n this: XMLHttpRequest,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n (this as unknown as Record<string, XHRMeta>)[XHR_META] = {\n method: method.toUpperCase(),\n url: sanitizeHttpUrl(String(url), options.sanitizeUrl),\n started: 0,\n };\n return (originalOpen as unknown as (...args: unknown[]) => void).apply(this, [\n method,\n url,\n ...rest,\n ]);\n };\n\n proto.send = function patchedSend(\n this: XMLHttpRequest,\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const meta = (this as unknown as Record<string, XHRMeta>)[XHR_META];\n if (meta) meta.started = nowMs();\n let captured = false;\n\n const onLoadEnd = () => {\n if (!meta || captured) return;\n const shouldCapture =\n this.status >= minStatus || (captureAll && shouldSample(sampleRate, random));\n if (shouldCapture) {\n captured = true;\n capture({\n level: this.status >= minStatus ? \"warn\" : \"debug\",\n message: `XHR ${this.status} ${meta.method} ${meta.url}`,\n props: {\n http: {\n kind: \"xhr\",\n method: meta.method,\n url: meta.url,\n status: this.status,\n durationMs: durationMs(meta.started),\n },\n },\n });\n }\n };\n\n const onError = () => {\n if (!meta || captured) return;\n captured = true;\n capture({\n level: \"error\",\n message: `XHR network error ${meta.method} ${meta.url}`,\n props: {\n http: {\n kind: \"xhr\",\n method: meta.method,\n url: meta.url,\n durationMs: durationMs(meta.started),\n },\n },\n });\n };\n\n this.addEventListener(\"loadend\", onLoadEnd, { once: true });\n this.addEventListener(\"error\", onError, { once: true });\n return (originalSend as unknown as (...args: unknown[]) => void).apply(this, [body]);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport type BrowserFrameworkName = \"angular\" | \"react\" | \"solid\" | \"svelte\" | \"vue\" | string;\n\nexport interface BrowserFrameworkErrorInfo {\n framework?: BrowserFrameworkName;\n componentName?: string;\n componentStack?: string;\n info?: unknown;\n props?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface CaptureFrameworkErrorsOptions {\n name?: string;\n framework?: BrowserFrameworkName;\n level?: LoggerLevel;\n maxPending?: number;\n infoMaxDepth?: number;\n getMessage?: (error: unknown, info: BrowserFrameworkErrorInfo) => string;\n}\n\nexport interface BrowserFrameworkErrorIntegration extends Integration {\n capture: (error: unknown, info?: BrowserFrameworkErrorInfo | string) => void;\n reactComponentDidCatch: (error: unknown, errorInfo?: { componentStack?: string }) => void;\n vueErrorHandler: (error: unknown, instance?: unknown, info?: string) => void;\n solidErrorHandler: (error: unknown) => void;\n svelteErrorHandler: (error: unknown, info?: BrowserFrameworkErrorInfo | string) => void;\n}\n\ninterface PendingFrameworkError {\n error: unknown;\n info?: BrowserFrameworkErrorInfo | string;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Framework error\";\n}\n\nfunction instanceComponentName(instance: unknown): string | undefined {\n const record = instance as\n | {\n constructor?: { name?: string };\n $options?: { name?: string };\n type?: { name?: string; displayName?: string };\n }\n | undefined;\n return (\n record?.$options?.name ??\n record?.type?.displayName ??\n record?.type?.name ??\n record?.constructor?.name\n );\n}\n\nfunction normalizeFrameworkInfo(\n input: BrowserFrameworkErrorInfo | string | undefined,\n fallbackFramework: BrowserFrameworkName,\n): BrowserFrameworkErrorInfo {\n if (typeof input === \"string\") return { framework: fallbackFramework, info: input };\n return { framework: fallbackFramework, ...input };\n}\n\nexport function captureFrameworkErrorsIntegration(\n options: CaptureFrameworkErrorsOptions = {},\n): BrowserFrameworkErrorIntegration {\n const integrationName = options.name ?? \"capture-framework-errors\";\n const fallbackFramework = options.framework ?? \"framework\";\n const level = options.level ?? \"error\";\n const maxPending = Math.max(0, Math.floor(options.maxPending ?? 10));\n const infoMaxDepth = options.infoMaxDepth ?? 6;\n const pending: PendingFrameworkError[] = [];\n let api: IntegrationSetupContext | undefined;\n let started = false;\n let disposed = false;\n\n const emit = (error: unknown, rawInfo?: BrowserFrameworkErrorInfo | string) => {\n const info = normalizeFrameworkInfo(rawInfo, fallbackFramework);\n const message = options.getMessage?.(error, info) ?? errorMessage(error);\n api?.capture({\n level,\n message,\n error,\n props: {\n browser: {\n kind: \"framework-error\",\n framework: info.framework,\n componentName: info.componentName,\n componentStack: info.componentStack,\n info: normalizeValue(info.info, { maxDepth: infoMaxDepth, maxObjectKeys: 80 }),\n props: normalizeValue(info.props, { maxDepth: infoMaxDepth, maxObjectKeys: 80 }),\n },\n },\n });\n };\n\n const capture = (error: unknown, info?: BrowserFrameworkErrorInfo | string) => {\n if (api) {\n emit(error, info);\n return;\n }\n if (started || disposed || pending.length >= maxPending) return;\n pending.push({ error, info });\n };\n\n const integration: BrowserFrameworkErrorIntegration = {\n name: integrationName,\n setup(nextApi) {\n api = nextApi;\n started = true;\n disposed = false;\n for (const item of pending.splice(0)) emit(item.error, item.info);\n return () => {\n api = undefined;\n disposed = true;\n };\n },\n capture,\n reactComponentDidCatch(error, errorInfo) {\n capture(error, {\n framework: \"react\",\n componentStack: errorInfo?.componentStack,\n });\n },\n vueErrorHandler(error, instance, info) {\n capture(error, {\n framework: \"vue\",\n componentName: instanceComponentName(instance),\n info,\n });\n },\n solidErrorHandler(error) {\n capture(error, { framework: \"solid\" });\n },\n svelteErrorHandler(error, info) {\n capture(error, normalizeFrameworkInfo(info, \"svelte\"));\n },\n };\n\n return integration;\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface FrameworkRouterIntegrationOptions {\n level?: LoggerLevel;\n sanitizeUrl?: (url: string) => string;\n includeState?: boolean;\n}\n\nexport interface NextRouterLike {\n asPath?: string;\n events?: {\n on?: (event: string, listener: (url: string) => void) => void;\n off?: (event: string, listener: (url: string) => void) => void;\n };\n}\n\nexport interface ReactRouterHistoryLike {\n location?: unknown;\n listen?: (listener: (update: unknown) => void) => void | (() => void);\n}\n\nexport interface VueRouterLike {\n currentRoute?: unknown;\n afterEach?: (listener: (to: unknown, from: unknown) => void) => void | (() => void);\n}\n\nexport interface NextRouterIntegrationOptions extends FrameworkRouterIntegrationOptions {\n router: NextRouterLike;\n}\n\nexport interface ReactRouterIntegrationOptions extends FrameworkRouterIntegrationOptions {\n history: ReactRouterHistoryLike;\n}\n\nexport interface VueRouterIntegrationOptions extends FrameworkRouterIntegrationOptions {\n router: VueRouterLike;\n framework?: \"vue-router\" | \"nuxt\";\n}\n\nfunction routePath(input: unknown): string {\n if (typeof input === \"string\") return input;\n if (input && typeof input === \"object\") {\n const route = input as {\n fullPath?: string;\n pathname?: string;\n path?: string;\n location?: unknown;\n };\n if (typeof route.fullPath === \"string\") return route.fullPath;\n if (typeof route.pathname === \"string\") return route.pathname;\n if (typeof route.path === \"string\") return route.path;\n if (route.location) return routePath(route.location);\n }\n return \"\";\n}\n\nfunction emitRouteChange(\n api: IntegrationSetupContext,\n framework: string,\n level: LoggerLevel,\n to: unknown,\n from: unknown,\n options: FrameworkRouterIntegrationOptions,\n) {\n const sanitize = options.sanitizeUrl;\n const toPath = sanitize ? sanitize(routePath(to)) : routePath(to);\n const fromPath =\n from === undefined ? undefined : sanitize ? sanitize(routePath(from)) : routePath(from);\n api.capture({\n level,\n message: `${framework} route ${toPath}`,\n props: {\n browser: {\n kind: \"framework-route-change\",\n framework,\n route: {\n to: toPath,\n from: fromPath,\n state: options.includeState ? normalizeValue(to, { maxDepth: 4 }) : undefined,\n },\n },\n },\n });\n}\n\nexport function nextRouterIntegration(options: NextRouterIntegrationOptions): Integration {\n const level = options.level ?? \"info\";\n return {\n name: \"next-router\",\n setup(api) {\n const router = options.router;\n if (!router.events?.on || !router.events.off) return;\n const onRoute = api.guard((url: string) =>\n emitRouteChange(api, \"next\", level, url, router.asPath, options),\n );\n router.events.on(\"routeChangeComplete\", onRoute);\n router.events.on(\"hashChangeComplete\", onRoute);\n return () => {\n router.events?.off?.(\"routeChangeComplete\", onRoute);\n router.events?.off?.(\"hashChangeComplete\", onRoute);\n };\n },\n };\n}\n\nexport function reactRouterIntegration(options: ReactRouterIntegrationOptions): Integration {\n const level = options.level ?? \"info\";\n return {\n name: \"react-router\",\n setup(api) {\n let previous = options.history.location;\n const dispose = options.history.listen?.(\n api.guard((update: unknown) => {\n const next = (update as { location?: unknown })?.location ?? update;\n emitRouteChange(api, \"react-router\", level, next, previous, options);\n previous = next;\n }),\n );\n return typeof dispose === \"function\" ? dispose : undefined;\n },\n };\n}\n\nexport function vueRouterIntegration(options: VueRouterIntegrationOptions): Integration {\n const level = options.level ?? \"info\";\n const framework = options.framework ?? \"vue-router\";\n return {\n name: framework,\n setup(api) {\n const dispose = options.router.afterEach?.(\n api.guard((to: unknown, from: unknown) =>\n emitRouteChange(api, framework, level, to, from, options),\n ),\n );\n return typeof dispose === \"function\" ? dispose : undefined;\n },\n };\n}\n\nexport function nuxtRouterIntegration(\n options: Omit<VueRouterIntegrationOptions, \"framework\">,\n): Integration {\n return vueRouterIntegration({ ...options, framework: \"nuxt\" });\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserReportLike {\n type?: string;\n url?: string;\n body?: unknown;\n toJSON?: () => unknown;\n}\n\nexport interface BrowserReportingObserverLike {\n observe: () => void;\n disconnect: () => void;\n takeRecords?: () => BrowserReportLike[];\n}\n\nexport interface BrowserReportingObserverConstructor {\n new (\n callback: (reports: BrowserReportLike[], observer: BrowserReportingObserverLike) => void,\n options?: { buffered?: boolean; types?: readonly string[] },\n ): BrowserReportingObserverLike;\n}\n\nexport interface BrowserReportPayload {\n type: string;\n url?: string;\n body?: unknown;\n}\n\nexport interface BrowserCspViolationPayload {\n type: \"securitypolicyviolation\";\n blockedURI?: string;\n documentURI?: string;\n effectiveDirective?: string;\n violatedDirective?: string;\n disposition?: string;\n sourceFile?: string;\n lineNumber?: number;\n columnNumber?: number;\n statusCode?: number;\n sample?: string;\n}\n\nexport interface CaptureReportingOptions {\n captureSecurityPolicyViolation?: boolean;\n captureReportingObserver?: boolean;\n reportTypes?: readonly string[];\n level?:\n | LoggerLevel\n | ((report: BrowserReportPayload | BrowserCspViolationPayload) => LoggerLevel);\n buffered?: boolean;\n sanitizeUrl?: (url: string) => string;\n ReportingObserver?: BrowserReportingObserverConstructor;\n addEventListener?: typeof globalThis.addEventListener;\n removeEventListener?: typeof globalThis.removeEventListener;\n}\n\nconst defaultReportTypes = [\"csp-violation\", \"deprecation\", \"intervention\", \"crash\"] as const;\n\nfunction levelFor(\n level: CaptureReportingOptions[\"level\"],\n report: BrowserReportPayload | BrowserCspViolationPayload,\n): LoggerLevel {\n if (typeof level === \"function\") return level(report);\n if (level) return level;\n return report.type === \"deprecation\" ? \"info\" : \"warn\";\n}\n\nfunction maybeSanitize(\n url: string | undefined,\n sanitizeUrl: ((url: string) => string) | undefined,\n) {\n return url && sanitizeUrl ? sanitizeUrl(url) : url;\n}\n\nfunction normalizeReport(\n report: BrowserReportLike,\n sanitizeUrl: ((url: string) => string) | undefined,\n): BrowserReportPayload {\n const raw = typeof report.toJSON === \"function\" ? report.toJSON() : report;\n const record = raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n const body = \"body\" in record ? record.body : report.body;\n const url = typeof record.url === \"string\" ? record.url : report.url;\n const type = typeof record.type === \"string\" ? record.type : (report.type ?? \"unknown\");\n return {\n type,\n url: maybeSanitize(url, sanitizeUrl),\n body: normalizeValue(body, { maxDepth: 6, maxObjectKeys: 80 }),\n };\n}\n\nfunction normalizeCspViolation(\n event: SecurityPolicyViolationEvent,\n sanitizeUrl: ((url: string) => string) | undefined,\n): BrowserCspViolationPayload {\n return {\n type: \"securitypolicyviolation\",\n blockedURI: maybeSanitize(event.blockedURI, sanitizeUrl),\n documentURI: maybeSanitize(event.documentURI, sanitizeUrl),\n effectiveDirective: event.effectiveDirective,\n violatedDirective: event.violatedDirective,\n disposition: event.disposition,\n sourceFile: maybeSanitize(event.sourceFile, sanitizeUrl),\n lineNumber: event.lineNumber,\n columnNumber: event.columnNumber,\n statusCode: event.statusCode,\n sample: event.sample,\n };\n}\n\nexport function captureReportingIntegration(options: CaptureReportingOptions = {}): Integration {\n const captureSecurityPolicyViolation = options.captureSecurityPolicyViolation ?? true;\n const captureReportingObserver = options.captureReportingObserver ?? true;\n const reportTypes = options.reportTypes ?? defaultReportTypes;\n const buffered = options.buffered ?? true;\n\n return {\n name: \"capture-reporting\",\n setup(api: IntegrationSetupContext) {\n const add = options.addEventListener ?? globalThis.addEventListener?.bind(globalThis);\n const remove =\n options.removeEventListener ?? globalThis.removeEventListener?.bind(globalThis);\n const Observer =\n options.ReportingObserver ??\n (globalThis as unknown as { ReportingObserver?: BrowserReportingObserverConstructor })\n .ReportingObserver;\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const captureReport = api.guard((report: BrowserReportPayload) => {\n if (disposed) return;\n api.capture({\n level: levelFor(options.level, report),\n message: `Browser report ${report.type}`,\n props: { browser: { kind: \"report\", report } },\n });\n });\n\n if (captureSecurityPolicyViolation && add && remove) {\n const onViolation = api.guard((event: SecurityPolicyViolationEvent) => {\n const report = normalizeCspViolation(event, options.sanitizeUrl);\n api.capture({\n level: levelFor(options.level, report),\n message: `Security policy violation: ${report.effectiveDirective ?? report.violatedDirective ?? \"unknown\"}`,\n props: { browser: { kind: \"securitypolicyviolation\", report } },\n });\n });\n add(\"securitypolicyviolation\", onViolation);\n disposers.push(() => remove(\"securitypolicyviolation\", onViolation));\n }\n\n if (captureReportingObserver && Observer) {\n try {\n const observer = new Observer(\n (reports) => {\n for (const report of reports)\n captureReport(normalizeReport(report, options.sanitizeUrl));\n },\n { buffered, types: reportTypes },\n );\n observer.observe();\n disposers.push(() => {\n for (const report of observer.takeRecords?.() ?? [])\n captureReport(normalizeReport(report, options.sanitizeUrl));\n observer.disconnect();\n });\n } catch {\n // ReportingObserver is still uneven across browsers; failures should not break setup.\n }\n }\n\n return () => {\n if (disposed) return;\n for (const dispose of disposers) dispose();\n disposed = true;\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserHistoryLike {\n state?: unknown;\n pushState?: (data: unknown, unused: string, url?: string | URL | null) => unknown;\n replaceState?: (data: unknown, unused: string, url?: string | URL | null) => unknown;\n}\n\nexport interface BrowserLocationLike {\n href?: string;\n pathname?: string;\n search?: string;\n hash?: string;\n}\n\nexport type BrowserRouteTrigger =\n | \"initial\"\n | \"pushState\"\n | \"replaceState\"\n | \"popstate\"\n | \"hashchange\";\nexport type BrowserRouteUrlMode = \"path\" | \"href\";\n\nexport interface BrowserRouteChangePayload {\n trigger: BrowserRouteTrigger;\n from?: string;\n to: string;\n state?: unknown;\n}\n\nexport interface CaptureRouterOptions {\n level?: LoggerLevel;\n captureInitial?: boolean;\n includeState?: boolean;\n stateMaxDepth?: number;\n urlMode?: BrowserRouteUrlMode;\n sanitizeUrl?: (url: string) => string;\n history?: BrowserHistoryLike;\n location?: BrowserLocationLike;\n addEventListener?: typeof globalThis.addEventListener;\n removeEventListener?: typeof globalThis.removeEventListener;\n}\n\nfunction locationHref(location: BrowserLocationLike | undefined): string {\n if (!location) return \"http://localhost/\";\n if (location.href) return location.href;\n return `${location.pathname ?? \"/\"}${location.search ?? \"\"}${location.hash ?? \"\"}`;\n}\n\nfunction normalizeRouteUrl(\n url: string | URL | null | undefined,\n location: BrowserLocationLike | undefined,\n mode: BrowserRouteUrlMode,\n sanitizeUrl: ((url: string) => string) | undefined,\n): string {\n const fallback = locationHref(location);\n const raw = url === undefined || url === null ? fallback : String(url);\n let normalized = raw;\n try {\n const parsed = new URL(raw, fallback);\n normalized = mode === \"href\" ? parsed.href : `${parsed.pathname}${parsed.search}${parsed.hash}`;\n } catch {\n normalized = raw;\n }\n return sanitizeUrl ? sanitizeUrl(normalized) : normalized;\n}\n\nfunction routeState(includeState: boolean, state: unknown, maxDepth: number): unknown {\n return includeState ? normalizeValue(state, { maxDepth, maxObjectKeys: 80 }) : undefined;\n}\n\nexport function captureRouterIntegration(options: CaptureRouterOptions = {}): Integration {\n const level = options.level ?? \"info\";\n const captureInitial = options.captureInitial ?? true;\n const includeState = options.includeState ?? false;\n const stateMaxDepth = options.stateMaxDepth ?? 4;\n const urlMode = options.urlMode ?? \"path\";\n\n return {\n name: \"capture-router\",\n setup(api: IntegrationSetupContext) {\n const history = options.history ?? globalThis.history;\n const location = options.location ?? globalThis.location;\n const add = options.addEventListener ?? globalThis.addEventListener?.bind(globalThis);\n const remove =\n options.removeEventListener ?? globalThis.removeEventListener?.bind(globalThis);\n const originalPushState = history?.pushState;\n const originalReplaceState = history?.replaceState;\n let current = normalizeRouteUrl(undefined, location, urlMode, options.sanitizeUrl);\n let disposed = false;\n\n const capture = (trigger: BrowserRouteTrigger, to: string, state?: unknown) => {\n if (disposed) return;\n const previous = current;\n current = to;\n if (trigger !== \"initial\" && previous === to) return;\n const route: BrowserRouteChangePayload = {\n trigger,\n from: trigger === \"initial\" ? undefined : previous,\n to,\n state: routeState(includeState, state, stateMaxDepth),\n };\n api.capture({\n level,\n message: trigger === \"initial\" ? `Route initial ${to}` : `Route change ${to}`,\n props: { browser: { kind: \"route-change\", route } },\n });\n };\n\n if (captureInitial) capture(\"initial\", current, history?.state);\n\n if (history && originalPushState) {\n history.pushState = function pushState(\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ) {\n const result = originalPushState.call(this, data, unused, url);\n capture(\n \"pushState\",\n normalizeRouteUrl(url, location, urlMode, options.sanitizeUrl),\n data,\n );\n return result;\n };\n }\n\n if (history && originalReplaceState) {\n history.replaceState = function replaceState(\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ) {\n const result = originalReplaceState.call(this, data, unused, url);\n capture(\n \"replaceState\",\n normalizeRouteUrl(url, location, urlMode, options.sanitizeUrl),\n data,\n );\n return result;\n };\n }\n\n const onPopState = api.guard((event: PopStateEvent) => {\n capture(\n \"popstate\",\n normalizeRouteUrl(undefined, location, urlMode, options.sanitizeUrl),\n event.state,\n );\n });\n const onHashChange = api.guard((event: HashChangeEvent) => {\n capture(\n \"hashchange\",\n normalizeRouteUrl(event.newURL, location, urlMode, options.sanitizeUrl),\n history?.state,\n );\n });\n\n add?.(\"popstate\", onPopState);\n add?.(\"hashchange\", onHashChange);\n\n return () => {\n if (disposed) return;\n disposed = true;\n if (history && originalPushState) history.pushState = originalPushState;\n if (history && originalReplaceState) history.replaceState = originalReplaceState;\n remove?.(\"popstate\", onPopState);\n remove?.(\"hashchange\", onHashChange);\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserExtensionEventLike<TListener extends (...args: never[]) => unknown> {\n addListener?: (listener: TListener) => void;\n removeListener?: (listener: TListener) => void;\n}\n\nexport interface BrowserExtensionRuntimeLike {\n id?: string;\n getManifest?: () => { name?: string; version?: string };\n onMessage?: BrowserExtensionEventLike<\n (message: unknown, sender?: BrowserExtensionMessageSenderLike) => unknown\n >;\n onInstalled?: BrowserExtensionEventLike<(details: unknown) => void>;\n}\n\nexport interface BrowserExtensionMessageSenderLike {\n id?: string;\n origin?: string;\n url?: string;\n tab?: {\n id?: number;\n url?: string;\n };\n}\n\nexport interface ElectronIpcRendererLike {\n on?: (channel: string, listener: (...args: unknown[]) => void) => unknown;\n off?: (channel: string, listener: (...args: unknown[]) => void) => unknown;\n removeListener?: (channel: string, listener: (...args: unknown[]) => void) => unknown;\n send?: (channel: string, ...args: unknown[]) => void;\n invoke?: (channel: string, ...args: unknown[]) => Promise<unknown>;\n}\n\nexport interface CaptureRuntimeHostOptions {\n level?: LoggerLevel;\n captureExtensionMessages?: boolean;\n captureExtensionInstalled?: boolean;\n captureExtensionMessageData?: boolean;\n captureElectronMessages?: boolean;\n captureElectronSend?: boolean;\n captureElectronInvoke?: boolean;\n captureElectronMessageData?: boolean;\n electronChannels?: readonly string[];\n extensionRuntime?: BrowserExtensionRuntimeLike;\n ipcRenderer?: ElectronIpcRendererLike;\n sanitizeUrl?: (url: string) => string;\n}\n\nconst textEncoder = new TextEncoder();\n\nfunction byteLength(value: unknown): number | undefined {\n if (typeof value === \"string\") return textEncoder.encode(value).byteLength;\n if (value instanceof ArrayBuffer) return value.byteLength;\n if (ArrayBuffer.isView(value)) return value.byteLength;\n return undefined;\n}\n\nfunction valueSummary(value: unknown, includeData: boolean): Record<string, unknown> {\n return {\n dataType:\n typeof value === \"object\" && value\n ? ((value as { constructor?: { name?: string } }).constructor?.name ?? \"object\")\n : typeof value,\n byteLength: byteLength(value),\n data: includeData ? normalizeValue(value, { maxDepth: 4, maxObjectKeys: 80 }) : undefined,\n };\n}\n\nfunction senderInfo(\n sender: BrowserExtensionMessageSenderLike | undefined,\n sanitizeUrl: ((url: string) => string) | undefined,\n) {\n if (!sender) return undefined;\n const sanitize = (url: string | undefined) => (url && sanitizeUrl ? sanitizeUrl(url) : url);\n return {\n id: sender.id,\n origin: sender.origin,\n url: sanitize(sender.url),\n tab: sender.tab\n ? {\n id: sender.tab.id,\n url: sanitize(sender.tab.url),\n }\n : undefined,\n };\n}\n\nfunction defaultExtensionRuntime(): BrowserExtensionRuntimeLike | undefined {\n const global = globalThis as unknown as {\n browser?: { runtime?: BrowserExtensionRuntimeLike };\n chrome?: { runtime?: BrowserExtensionRuntimeLike };\n };\n return global.browser?.runtime ?? global.chrome?.runtime;\n}\n\nfunction defaultIpcRenderer(): ElectronIpcRendererLike | undefined {\n const global = globalThis as unknown as {\n electron?: { ipcRenderer?: ElectronIpcRendererLike };\n require?: (id: string) => unknown;\n };\n if (global.electron?.ipcRenderer) return global.electron.ipcRenderer;\n try {\n return (global.require?.(\"electron\") as { ipcRenderer?: ElectronIpcRendererLike } | undefined)\n ?.ipcRenderer;\n } catch {\n return undefined;\n }\n}\n\nexport function captureRuntimeHostIntegration(\n options: CaptureRuntimeHostOptions = {},\n): Integration {\n const level = options.level ?? \"debug\";\n const captureExtensionMessages = options.captureExtensionMessages ?? true;\n const captureExtensionInstalled = options.captureExtensionInstalled ?? true;\n const captureExtensionMessageData = options.captureExtensionMessageData ?? false;\n const captureElectronMessages = options.captureElectronMessages ?? true;\n const captureElectronSend = options.captureElectronSend ?? true;\n const captureElectronInvoke = options.captureElectronInvoke ?? true;\n const captureElectronMessageData = options.captureElectronMessageData ?? false;\n const electronChannels = options.electronChannels ?? [];\n\n return {\n name: \"capture-runtime-host\",\n setup(api: IntegrationSetupContext) {\n const extensionRuntime = options.extensionRuntime ?? defaultExtensionRuntime();\n const ipcRenderer = options.ipcRenderer ?? defaultIpcRenderer();\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const capture = api.guard((input: Parameters<IntegrationSetupContext[\"capture\"]>[0]) => {\n if (!disposed) api.capture(input);\n });\n\n if (extensionRuntime) {\n const manifest = extensionRuntime.getManifest?.();\n\n if (captureExtensionMessages && extensionRuntime.onMessage?.addListener) {\n const onMessage = (message: unknown, sender?: BrowserExtensionMessageSenderLike) => {\n capture({\n level,\n message: \"Browser extension message\",\n props: {\n browser: {\n kind: \"extension-message\",\n extension: {\n id: extensionRuntime.id,\n name: manifest?.name,\n version: manifest?.version,\n },\n message: valueSummary(message, captureExtensionMessageData),\n sender: senderInfo(sender, options.sanitizeUrl),\n },\n },\n });\n };\n extensionRuntime.onMessage.addListener(onMessage as never);\n disposers.push(() => extensionRuntime.onMessage?.removeListener?.(onMessage as never));\n }\n\n if (captureExtensionInstalled && extensionRuntime.onInstalled?.addListener) {\n const onInstalled = (details: unknown) => {\n capture({\n level,\n message: \"Browser extension installed\",\n props: {\n browser: {\n kind: \"extension-installed\",\n extension: {\n id: extensionRuntime.id,\n name: manifest?.name,\n version: manifest?.version,\n },\n details: normalizeValue(details, { maxDepth: 4, maxObjectKeys: 80 }),\n },\n },\n });\n };\n extensionRuntime.onInstalled.addListener(onInstalled as never);\n disposers.push(() =>\n extensionRuntime.onInstalled?.removeListener?.(onInstalled as never),\n );\n }\n }\n\n if (ipcRenderer) {\n if (captureElectronMessages && ipcRenderer.on) {\n for (const channel of electronChannels) {\n const listener = (_event: unknown, ...args: unknown[]) => {\n capture({\n level,\n message: `Electron IPC message ${channel}`,\n props: {\n browser: {\n kind: \"electron-ipc\",\n direction: \"incoming\",\n channel,\n args: args.map((arg) => valueSummary(arg, captureElectronMessageData)),\n },\n },\n });\n };\n ipcRenderer.on(channel, listener);\n disposers.push(() => {\n if (ipcRenderer.off) ipcRenderer.off(channel, listener);\n else ipcRenderer.removeListener?.(channel, listener);\n });\n }\n }\n\n if (captureElectronSend && ipcRenderer.send) {\n const originalSend = ipcRenderer.send;\n ipcRenderer.send = (channel: string, ...args: unknown[]) => {\n capture({\n level,\n message: `Electron IPC send ${channel}`,\n props: {\n browser: {\n kind: \"electron-ipc\",\n direction: \"outgoing\",\n channel,\n args: args.map((arg) => valueSummary(arg, captureElectronMessageData)),\n },\n },\n });\n return originalSend.call(ipcRenderer, channel, ...args);\n };\n disposers.push(() => {\n ipcRenderer.send = originalSend;\n });\n }\n\n if (captureElectronInvoke && ipcRenderer.invoke) {\n const originalInvoke = ipcRenderer.invoke;\n ipcRenderer.invoke = (channel: string, ...args: unknown[]) => {\n capture({\n level,\n message: `Electron IPC invoke ${channel}`,\n props: {\n browser: {\n kind: \"electron-ipc\",\n direction: \"invoke\",\n channel,\n args: args.map((arg) => valueSummary(arg, captureElectronMessageData)),\n },\n },\n });\n return originalInvoke.call(ipcRenderer, channel, ...args);\n };\n disposers.push(() => {\n ipcRenderer.invoke = originalInvoke;\n });\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserServiceWorkerControllerLike {\n scriptURL?: string;\n state?: string;\n}\n\nexport interface BrowserServiceWorkerContainerEventsLike {\n controller?: BrowserServiceWorkerControllerLike | null;\n addEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n}\n\nexport interface BrowserServiceWorkerMessagePayload {\n dataType: string;\n byteLength?: number;\n data?: unknown;\n origin?: string;\n lastEventId?: string;\n}\n\nexport interface CaptureServiceWorkerOptions {\n level?: LoggerLevel;\n captureControllerChange?: boolean;\n captureMessages?: boolean;\n captureMessageErrors?: boolean;\n captureMessageData?: boolean;\n serviceWorker?: BrowserServiceWorkerContainerEventsLike;\n sanitizeUrl?: (url: string) => string;\n}\n\nconst textEncoder = new TextEncoder();\n\nfunction dataType(data: unknown): string {\n if (typeof data === \"string\") return \"string\";\n if (data instanceof ArrayBuffer) return \"arraybuffer\";\n if (ArrayBuffer.isView(data)) return data.constructor.name;\n const record = data as { constructor?: { name?: string } } | undefined;\n return record?.constructor?.name ?? typeof data;\n}\n\nfunction dataByteLength(data: unknown): number | undefined {\n if (typeof data === \"string\") return textEncoder.encode(data).byteLength;\n if (data instanceof ArrayBuffer) return data.byteLength;\n if (ArrayBuffer.isView(data)) return data.byteLength;\n const size = (data as { size?: unknown } | undefined)?.size;\n return typeof size === \"number\" && Number.isFinite(size) ? size : undefined;\n}\n\nfunction controllerInfo(\n controller: BrowserServiceWorkerControllerLike | null | undefined,\n sanitizeUrl: ((url: string) => string) | undefined,\n) {\n if (!controller) return undefined;\n return {\n scriptURL:\n controller.scriptURL && sanitizeUrl\n ? sanitizeUrl(controller.scriptURL)\n : controller.scriptURL,\n state: controller.state,\n };\n}\n\nfunction messagePayload(\n event: MessageEvent,\n captureMessageData: boolean,\n): BrowserServiceWorkerMessagePayload {\n return {\n dataType: dataType(event.data),\n byteLength: dataByteLength(event.data),\n data: captureMessageData\n ? normalizeValue(event.data, { maxDepth: 4, maxObjectKeys: 80 })\n : undefined,\n origin: event.origin,\n lastEventId: event.lastEventId,\n };\n}\n\nexport function captureServiceWorkerIntegration(\n options: CaptureServiceWorkerOptions = {},\n): Integration {\n const level = options.level ?? \"debug\";\n const captureControllerChange = options.captureControllerChange ?? true;\n const captureMessages = options.captureMessages ?? true;\n const captureMessageErrors = options.captureMessageErrors ?? true;\n const captureMessageData = options.captureMessageData ?? false;\n\n return {\n name: \"capture-service-worker\",\n setup(api: IntegrationSetupContext) {\n const serviceWorker =\n options.serviceWorker ??\n (typeof navigator === \"undefined\" ? undefined : navigator.serviceWorker);\n if (!serviceWorker?.addEventListener || !serviceWorker.removeEventListener) return;\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const capture = api.guard((input: Parameters<IntegrationSetupContext[\"capture\"]>[0]) => {\n if (!disposed) api.capture(input);\n });\n\n if (captureControllerChange) {\n const onControllerChange = () => {\n capture({\n level,\n message: \"Service worker controller change\",\n props: {\n browser: {\n kind: \"service-worker\",\n event: \"controllerchange\",\n controller: controllerInfo(serviceWorker.controller, options.sanitizeUrl),\n },\n },\n });\n };\n serviceWorker.addEventListener(\"controllerchange\", onControllerChange);\n disposers.push(() =>\n serviceWorker.removeEventListener(\"controllerchange\", onControllerChange),\n );\n }\n\n if (captureMessages) {\n const onMessage = (event: Event) => {\n const message = event as MessageEvent;\n capture({\n level,\n message: \"Service worker message\",\n props: {\n browser: {\n kind: \"service-worker\",\n event: \"message\",\n message: messagePayload(message, captureMessageData),\n },\n },\n });\n };\n serviceWorker.addEventListener(\"message\", onMessage);\n disposers.push(() => serviceWorker.removeEventListener(\"message\", onMessage));\n }\n\n if (captureMessageErrors) {\n const onMessageError = (event: Event) => {\n capture({\n level: \"warn\",\n message: \"Service worker message error\",\n props: {\n browser: {\n kind: \"service-worker\",\n event: \"messageerror\",\n type: event.type,\n },\n },\n });\n };\n serviceWorker.addEventListener(\"messageerror\", onMessageError);\n disposers.push(() => serviceWorker.removeEventListener(\"messageerror\", onMessageError));\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext, LoggerLevel } from \"@loggerjs/core\";\n\nexport type BrowserUserActionEventName =\n | \"change\"\n | \"click\"\n | \"dblclick\"\n | \"input\"\n | \"keydown\"\n | \"submit\";\n\nexport interface BrowserUserActionTarget {\n tagName?: string;\n id?: string;\n name?: string;\n role?: string;\n type?: string;\n href?: string;\n label?: string;\n text?: string;\n value?: string;\n}\n\nexport interface BrowserUserActionPayload {\n type: BrowserUserActionEventName | string;\n target: BrowserUserActionTarget;\n}\n\nexport interface BrowserEventTargetLike {\n addEventListener: typeof globalThis.addEventListener;\n removeEventListener: typeof globalThis.removeEventListener;\n}\n\nexport interface CaptureUserActionsOptions {\n events?: readonly BrowserUserActionEventName[];\n level?: LoggerLevel;\n listenerCapture?: boolean;\n throttleMs?: number;\n captureText?: boolean;\n captureValue?: boolean;\n maxTextLength?: number;\n labelAttributes?: readonly string[];\n root?: BrowserEventTargetLike;\n clock?: () => number;\n sanitize?: (value: string, field: keyof BrowserUserActionTarget) => string;\n ignore?: (event: Event, target: BrowserUserActionTarget) => boolean;\n}\n\ntype ElementLike = {\n tagName?: string;\n id?: string;\n name?: string;\n role?: string;\n type?: string;\n href?: string;\n textContent?: string | null;\n value?: string;\n getAttribute?: (name: string) => string | null;\n};\n\nconst defaultEvents: readonly BrowserUserActionEventName[] = [\"click\", \"input\", \"change\", \"submit\"];\nconst defaultLabelAttributes = [\"data-loggerjs-label\", \"aria-label\", \"name\", \"id\"] as const;\n\nfunction truncate(value: string | undefined, maxLength: number): string | undefined {\n if (!value) return undefined;\n return value.length > maxLength ? value.slice(0, maxLength) : value;\n}\n\nfunction readAttribute(target: ElementLike, name: string): string | undefined {\n const value = target.getAttribute?.(name);\n return value || undefined;\n}\n\nfunction sanitizeField(\n value: string | undefined,\n field: keyof BrowserUserActionTarget,\n sanitize: CaptureUserActionsOptions[\"sanitize\"],\n): string | undefined {\n if (!value) return undefined;\n return sanitize ? sanitize(value, field) : value;\n}\n\nfunction firstLabel(target: ElementLike, attributes: readonly string[]): string | undefined {\n for (const name of attributes) {\n const value = readAttribute(target, name) ?? (target as Record<string, unknown>)[name];\n if (typeof value === \"string\" && value) return value;\n }\n return undefined;\n}\n\nfunction targetInfo(target: EventTarget | null, options: CaptureUserActionsOptions) {\n const element = target as ElementLike | null;\n if (!element || typeof element !== \"object\") return {};\n const maxTextLength = options.maxTextLength ?? 120;\n const sanitize = options.sanitize;\n const info: BrowserUserActionTarget = {\n tagName: sanitizeField(element.tagName?.toLowerCase(), \"tagName\", sanitize),\n id: sanitizeField(element.id, \"id\", sanitize),\n name: sanitizeField(element.name, \"name\", sanitize),\n role: sanitizeField(element.role ?? readAttribute(element, \"role\"), \"role\", sanitize),\n type: sanitizeField(element.type, \"type\", sanitize),\n href: sanitizeField(element.href, \"href\", sanitize),\n label: sanitizeField(\n firstLabel(element, options.labelAttributes ?? defaultLabelAttributes),\n \"label\",\n sanitize,\n ),\n };\n\n if (options.captureText) {\n info.text = sanitizeField(\n truncate(element.textContent ?? undefined, maxTextLength),\n \"text\",\n sanitize,\n );\n }\n if (options.captureValue) {\n info.value = sanitizeField(truncate(element.value, maxTextLength), \"value\", sanitize);\n }\n return info;\n}\n\nfunction throttleKey(event: Event, target: BrowserUserActionTarget): string {\n return `${event.type}:${target.tagName ?? \"\"}:${target.id ?? \"\"}:${target.name ?? \"\"}:${target.label ?? \"\"}`;\n}\n\nexport function captureUserActionsIntegration(\n options: CaptureUserActionsOptions = {},\n): Integration {\n const events = options.events ?? defaultEvents;\n const level = options.level ?? \"info\";\n const listenerCapture = options.listenerCapture ?? true;\n const throttleMs = Math.max(0, Math.floor(options.throttleMs ?? 250));\n const clock = options.clock ?? Date.now;\n\n return {\n name: \"capture-user-actions\",\n setup(api: IntegrationSetupContext) {\n const root = options.root ?? globalThis.document;\n if (!root?.addEventListener || !root.removeEventListener) return;\n const lastSeen = new Map<string, number>();\n let disposed = false;\n\n const onAction = api.guard((event: Event) => {\n if (disposed) return;\n const target = targetInfo(event.target, options);\n if (options.ignore?.(event, target)) return;\n const now = clock();\n const key = throttleKey(event, target);\n const last = lastSeen.get(key) ?? 0;\n if (throttleMs > 0 && now - last < throttleMs) return;\n lastSeen.set(key, now);\n const action: BrowserUserActionPayload = {\n type: event.type,\n target,\n };\n api.capture({\n level,\n message: `User action ${event.type}${target.label ? ` ${target.label}` : \"\"}`,\n props: { browser: { kind: \"user-action\", action } },\n });\n });\n\n for (const event of events) root.addEventListener(event, onAction, listenerCapture);\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const event of events) root.removeEventListener(event, onAction, listenerCapture);\n };\n },\n };\n}\n","import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\nimport { durationMs, nowMs, sanitizeHttpUrl, shouldSample } from \"./http-capture-utils\";\n\ntype BrowserWebSocketSendPayload = Parameters<WebSocket[\"send\"]>[0];\n\nexport interface BrowserCapturedWebSocketLike {\n url?: string;\n send?: (data: BrowserWebSocketSendPayload) => void;\n close?: (code?: number, reason?: string) => void;\n addEventListener?: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener?: (type: string, listener: EventListenerOrEventListenerObject) => void;\n}\n\nexport interface BrowserCapturedWebSocketConstructor {\n new (url: string | URL, protocols?: string | string[]): BrowserCapturedWebSocketLike;\n prototype?: unknown;\n CONNECTING?: number;\n OPEN?: number;\n CLOSING?: number;\n CLOSED?: number;\n}\n\nexport type BrowserWebSocketDirection = \"incoming\" | \"outgoing\";\n\nexport interface BrowserWebSocketMessagePayload {\n direction: BrowserWebSocketDirection;\n dataType: string;\n byteLength?: number;\n data?: unknown;\n}\n\nexport interface CaptureWebSocketOptions {\n level?: LoggerLevel;\n captureConnect?: boolean;\n captureOpen?: boolean;\n captureClose?: boolean;\n captureError?: boolean;\n captureMessages?: boolean;\n captureSentMessages?: boolean;\n captureMessageData?: boolean;\n sampleRate?: number;\n random?: () => number;\n sanitizeUrl?: (url: string) => string;\n WebSocket?: BrowserCapturedWebSocketConstructor;\n}\n\nconst registryKey = \"browser.WebSocket\";\nconst textEncoder = new TextEncoder();\n\nfunction dataType(data: unknown): string {\n if (typeof data === \"string\") return \"string\";\n if (data instanceof ArrayBuffer) return \"arraybuffer\";\n if (ArrayBuffer.isView(data)) return data.constructor.name;\n const record = data as { constructor?: { name?: string } } | undefined;\n return record?.constructor?.name ?? typeof data;\n}\n\nfunction dataByteLength(data: unknown): number | undefined {\n if (typeof data === \"string\") return textEncoder.encode(data).byteLength;\n if (data instanceof ArrayBuffer) return data.byteLength;\n if (ArrayBuffer.isView(data)) return data.byteLength;\n const size = (data as { size?: unknown } | undefined)?.size;\n return typeof size === \"number\" && Number.isFinite(size) ? size : undefined;\n}\n\nfunction messagePayload(\n direction: BrowserWebSocketDirection,\n data: unknown,\n captureMessageData: boolean,\n): BrowserWebSocketMessagePayload {\n return {\n direction,\n dataType: dataType(data),\n byteLength: dataByteLength(data),\n data: captureMessageData ? normalizeValue(data, { maxDepth: 4, maxObjectKeys: 80 }) : undefined,\n };\n}\n\nfunction closeEventPayload(event: Event): Record<string, unknown> {\n const close = event as CloseEvent;\n return {\n code: close.code,\n reason: close.reason,\n wasClean: close.wasClean,\n };\n}\n\nfunction copyStaticConstants(\n target: BrowserCapturedWebSocketConstructor,\n source: BrowserCapturedWebSocketConstructor,\n) {\n for (const key of [\"CONNECTING\", \"OPEN\", \"CLOSING\", \"CLOSED\"] as const) {\n if (source[key] !== undefined) target[key] = source[key];\n }\n}\n\nexport function captureWebSocketIntegration(options: CaptureWebSocketOptions = {}): Integration {\n const level = options.level ?? \"debug\";\n const captureConnect = options.captureConnect ?? true;\n const captureOpen = options.captureOpen ?? true;\n const captureClose = options.captureClose ?? true;\n const captureError = options.captureError ?? true;\n const captureMessages = options.captureMessages ?? false;\n const captureSentMessages = options.captureSentMessages ?? false;\n const captureMessageData = options.captureMessageData ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-websocket\",\n setup(api: IntegrationSetupContext) {\n const globalWebSocket = globalThis.WebSocket as\n | BrowserCapturedWebSocketConstructor\n | undefined;\n const current = options.WebSocket ?? globalWebSocket;\n if (!current) return;\n const original =\n api.unpatched.get<BrowserCapturedWebSocketConstructor>(registryKey) ?? current;\n api.unpatched.set(registryKey, original);\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n\n const PatchedWebSocket = function WebSocket(\n this: BrowserCapturedWebSocketLike,\n url: string | URL,\n protocols?: string | string[],\n ) {\n const started = nowMs();\n const sanitizedUrl = sanitizeHttpUrl(String(url), options.sanitizeUrl);\n const socket = new original(url, protocols);\n\n const captureLifecycle = (\n event: \"close\" | \"connect\" | \"error\" | \"open\",\n extra: Record<string, unknown> = {},\n error?: unknown,\n ) => {\n if (!shouldSample(sampleRate, random)) return;\n capture({\n level: event === \"error\" ? \"error\" : level,\n message: `WebSocket ${event} ${sanitizedUrl}`,\n error,\n props: {\n websocket: {\n kind: \"websocket\",\n event,\n url: sanitizedUrl,\n durationMs: durationMs(started),\n ...extra,\n },\n },\n });\n };\n\n if (captureConnect) captureLifecycle(\"connect\");\n\n if (captureOpen) {\n socket.addEventListener?.(\"open\", () => captureLifecycle(\"open\"));\n }\n if (captureClose) {\n socket.addEventListener?.(\"close\", (event) =>\n captureLifecycle(\"close\", closeEventPayload(event)),\n );\n }\n if (captureError) {\n socket.addEventListener?.(\"error\", (event) =>\n captureLifecycle(\"error\", { type: event.type }, event),\n );\n }\n if (captureMessages) {\n socket.addEventListener?.(\"message\", (event) => {\n const message = event as MessageEvent;\n capture({\n level,\n message: `WebSocket message ${sanitizedUrl}`,\n props: {\n websocket: {\n kind: \"websocket-message\",\n url: sanitizedUrl,\n message: messagePayload(\"incoming\", message.data, captureMessageData),\n },\n },\n });\n });\n }\n\n if (captureSentMessages && socket.send) {\n const originalSend = socket.send.bind(socket);\n socket.send = (data: BrowserWebSocketSendPayload) => {\n capture({\n level,\n message: `WebSocket send ${sanitizedUrl}`,\n props: {\n websocket: {\n kind: \"websocket-message\",\n url: sanitizedUrl,\n message: messagePayload(\"outgoing\", data, captureMessageData),\n },\n },\n });\n return originalSend(data);\n };\n }\n\n return socket;\n } as unknown as BrowserCapturedWebSocketConstructor;\n\n PatchedWebSocket.prototype = original.prototype;\n copyStaticConstants(PatchedWebSocket, original);\n globalThis.WebSocket = PatchedWebSocket as unknown as typeof WebSocket;\n\n return () => {\n globalThis.WebSocket = current as unknown as typeof WebSocket;\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext, LoggerLevel } from \"@loggerjs/core\";\n\nexport type WebVitalName = \"CLS\" | \"FCP\" | \"INP\" | \"LCP\" | \"TTFB\";\nexport type WebVitalRating = \"good\" | \"needs-improvement\" | \"poor\";\n\nexport interface WebVitalMetric {\n name: WebVitalName;\n value: number;\n delta: number;\n rating: WebVitalRating;\n id: string;\n final: boolean;\n}\n\nexport interface CaptureWebVitalsOptions {\n metrics?: readonly WebVitalName[];\n level?: LoggerLevel;\n reportAllChanges?: boolean;\n flushOnHidden?: boolean;\n PerformanceObserver?: typeof PerformanceObserver;\n performance?: Pick<Performance, \"getEntriesByName\" | \"getEntriesByType\">;\n addEventListener?: typeof globalThis.addEventListener;\n removeEventListener?: typeof globalThis.removeEventListener;\n}\n\ntype PerformanceEntryLike = PerformanceEntry & Record<string, unknown>;\n\nconst defaultMetrics: readonly WebVitalName[] = [\"CLS\", \"FCP\", \"INP\", \"LCP\", \"TTFB\"];\n\nconst thresholds: Record<WebVitalName, readonly [number, number]> = {\n CLS: [0.1, 0.25],\n FCP: [1800, 3000],\n INP: [200, 500],\n LCP: [2500, 4000],\n TTFB: [800, 1800],\n};\n\nfunction ratingFor(name: WebVitalName, value: number): WebVitalRating {\n const [good, needsImprovement] = thresholds[name];\n if (value <= good) return \"good\";\n if (value <= needsImprovement) return \"needs-improvement\";\n return \"poor\";\n}\n\nfunction metricId(name: WebVitalName): string {\n return `${name.toLowerCase()}-${Date.now().toString(36)}`;\n}\n\nfunction entryValue(entry: PerformanceEntryLike, field: string): number | undefined {\n const value = entry[field];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction hasMetric(metrics: readonly WebVitalName[], name: WebVitalName): boolean {\n return metrics.includes(name);\n}\n\nfunction supportsEntryType(\n Observer: typeof PerformanceObserver | undefined,\n type: string,\n): boolean {\n const supported = Observer?.supportedEntryTypes;\n return !supported || supported.includes(type);\n}\n\nexport function captureWebVitalsIntegration(options: CaptureWebVitalsOptions = {}): Integration {\n const metrics = options.metrics ?? defaultMetrics;\n const level = options.level ?? \"info\";\n const reportAllChanges = options.reportAllChanges ?? false;\n const flushOnHidden = options.flushOnHidden ?? true;\n\n return {\n name: \"capture-web-vitals\",\n setup(api: IntegrationSetupContext) {\n const Observer = options.PerformanceObserver ?? globalThis.PerformanceObserver;\n const perf = options.performance ?? globalThis.performance;\n const add = options.addEventListener ?? globalThis.addEventListener?.bind(globalThis);\n const remove =\n options.removeEventListener ?? globalThis.removeEventListener?.bind(globalThis);\n const disposers: Array<() => void> = [];\n const currentValues = new Map<WebVitalName, number>();\n const reportedValues = new Map<WebVitalName, number>();\n const emitted = new Set<string>();\n let disposed = false;\n\n const emit = (name: WebVitalName, value: number, final: boolean) => {\n if (!Number.isFinite(value)) return;\n const finalKey = `${name}:final`;\n if (final && emitted.has(finalKey)) return;\n const previous = reportedValues.get(name) ?? 0;\n currentValues.set(name, value);\n reportedValues.set(name, value);\n if (final) emitted.add(finalKey);\n const metric: WebVitalMetric = {\n name,\n value,\n delta: value - previous,\n rating: ratingFor(name, value),\n id: metricId(name),\n final,\n };\n api.capture({\n level,\n message: `Web vital ${metric.name} ${metric.value}`,\n props: { webVital: metric },\n });\n };\n\n const observe = (\n type: string,\n callback: (entry: PerformanceEntryLike) => void,\n init: PerformanceObserverInit = { type, buffered: true },\n ) => {\n if (!Observer || !supportsEntryType(Observer, type)) return;\n try {\n const observer = new Observer((list) => {\n for (const entry of list.getEntries()) callback(entry as PerformanceEntryLike);\n });\n observer.observe(init);\n disposers.push(() => observer.disconnect());\n } catch {\n // Unsupported observer types vary across browsers; missing vitals are simply skipped.\n }\n };\n\n if (hasMetric(metrics, \"TTFB\") && perf) {\n const navigation = perf.getEntriesByType(\"navigation\")[0] as\n | PerformanceEntryLike\n | undefined;\n if (navigation) {\n const responseStart = entryValue(navigation, \"responseStart\");\n const startTime = entryValue(navigation, \"startTime\") ?? 0;\n if (responseStart !== undefined) emit(\"TTFB\", responseStart - startTime, true);\n }\n }\n\n if (hasMetric(metrics, \"FCP\") && perf) {\n const existing = perf.getEntriesByName(\"first-contentful-paint\")[0];\n if (existing) emit(\"FCP\", existing.startTime, true);\n observe(\"paint\", (entry) => {\n if (entry.name === \"first-contentful-paint\") emit(\"FCP\", entry.startTime, true);\n });\n }\n\n if (hasMetric(metrics, \"CLS\")) {\n observe(\"layout-shift\", (entry) => {\n if (entry.hadRecentInput === true) return;\n const value = entryValue(entry, \"value\") ?? 0;\n const next = (currentValues.get(\"CLS\") ?? 0) + value;\n if (reportAllChanges) emit(\"CLS\", next, false);\n else currentValues.set(\"CLS\", next);\n });\n }\n\n if (hasMetric(metrics, \"LCP\")) {\n observe(\"largest-contentful-paint\", (entry) => {\n currentValues.set(\"LCP\", entry.startTime);\n if (reportAllChanges) emit(\"LCP\", entry.startTime, false);\n });\n }\n\n if (hasMetric(metrics, \"INP\")) {\n observe(\n \"event\",\n (entry) => {\n const duration = entryValue(entry, \"duration\") ?? 0;\n if (duration <= (currentValues.get(\"INP\") ?? 0)) return;\n currentValues.set(\"INP\", duration);\n if (reportAllChanges) emit(\"INP\", duration, false);\n },\n { type: \"event\", buffered: true, durationThreshold: 40 } as PerformanceObserverInit,\n );\n }\n\n const flushFinal = api.guard(() => {\n const cls = currentValues.get(\"CLS\");\n if (cls !== undefined && cls > 0) emit(\"CLS\", cls, true);\n const lcp = currentValues.get(\"LCP\");\n if (lcp !== undefined) emit(\"LCP\", lcp, true);\n const inp = currentValues.get(\"INP\");\n if (inp !== undefined) emit(\"INP\", inp, true);\n });\n\n if (flushOnHidden && add && remove) {\n const onPageHide = () => flushFinal();\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\")\n flushFinal();\n };\n add(\"pagehide\", onPageHide);\n add(\"visibilitychange\", onVisibilityChange);\n disposers.push(() => {\n remove(\"pagehide\", onPageHide);\n remove(\"visibilitychange\", onVisibilityChange);\n });\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n flushFinal();\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext, LoggerLevel } from \"@loggerjs/core\";\n\nexport type BrowserPerformanceEntryType =\n | \"element\"\n | \"event\"\n | \"longtask\"\n | \"mark\"\n | \"measure\"\n | \"navigation\"\n | \"paint\"\n | \"resource\"\n | string;\n\nexport interface BrowserPerformanceEntryPayload {\n name: string;\n entryType: string;\n startTime: number;\n duration: number;\n initiatorType?: string;\n nextHopProtocol?: string;\n renderBlockingStatus?: string;\n responseStatus?: number;\n transferSize?: number;\n encodedBodySize?: number;\n decodedBodySize?: number;\n workerStart?: number;\n redirectStart?: number;\n redirectEnd?: number;\n fetchStart?: number;\n domainLookupStart?: number;\n domainLookupEnd?: number;\n connectStart?: number;\n connectEnd?: number;\n requestStart?: number;\n responseStart?: number;\n responseEnd?: number;\n detail?: unknown;\n}\n\nexport interface CapturePerformanceOptions {\n entryTypes?: readonly BrowserPerformanceEntryType[];\n level?: LoggerLevel | ((entry: BrowserPerformanceEntryPayload) => LoggerLevel);\n buffered?: boolean;\n emitExisting?: boolean;\n maxEntries?: number;\n minDurationMs?: number | Partial<Record<string, number>>;\n sampleRate?: number;\n random?: () => number;\n captureDetail?: boolean;\n sanitizeName?: (name: string, entryType: string) => string;\n ignore?: (entry: BrowserPerformanceEntryPayload) => boolean;\n PerformanceObserver?: typeof PerformanceObserver;\n performance?: Pick<Performance, \"getEntriesByType\">;\n}\n\ntype PerformanceEntryLike = PerformanceEntry & Record<string, unknown>;\n\nconst defaultEntryTypes: readonly BrowserPerformanceEntryType[] = [\n \"navigation\",\n \"resource\",\n \"longtask\",\n \"measure\",\n \"mark\",\n];\n\nconst numberFields = [\n \"transferSize\",\n \"encodedBodySize\",\n \"decodedBodySize\",\n \"workerStart\",\n \"redirectStart\",\n \"redirectEnd\",\n \"fetchStart\",\n \"domainLookupStart\",\n \"domainLookupEnd\",\n \"connectStart\",\n \"connectEnd\",\n \"requestStart\",\n \"responseStart\",\n \"responseEnd\",\n] as const;\n\nfunction supportsEntryType(\n Observer: typeof PerformanceObserver | undefined,\n type: string,\n): boolean {\n const supported = Observer?.supportedEntryTypes;\n return !supported || supported.includes(type);\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nexport function normalizeBrowserPerformanceEntry(\n entry: PerformanceEntry,\n options: Pick<CapturePerformanceOptions, \"captureDetail\" | \"sanitizeName\"> = {},\n): BrowserPerformanceEntryPayload {\n const raw = entry as PerformanceEntryLike;\n const payload: BrowserPerformanceEntryPayload = {\n name: options.sanitizeName ? options.sanitizeName(entry.name, entry.entryType) : entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n };\n\n for (const field of numberFields) {\n const value = finiteNumber(raw[field]);\n if (value !== undefined) payload[field] = value;\n }\n\n const responseStatus = finiteNumber(raw.responseStatus);\n if (responseStatus !== undefined) payload.responseStatus = responseStatus;\n const initiatorType = stringValue(raw.initiatorType);\n if (initiatorType) payload.initiatorType = initiatorType;\n const nextHopProtocol = stringValue(raw.nextHopProtocol);\n if (nextHopProtocol) payload.nextHopProtocol = nextHopProtocol;\n const renderBlockingStatus = stringValue(raw.renderBlockingStatus);\n if (renderBlockingStatus) payload.renderBlockingStatus = renderBlockingStatus;\n if (options.captureDetail && raw.detail !== undefined) payload.detail = raw.detail;\n\n return payload;\n}\n\nfunction minDurationFor(\n value: CapturePerformanceOptions[\"minDurationMs\"],\n entryType: string,\n): number {\n if (typeof value === \"number\") return value;\n return value?.[entryType] ?? 0;\n}\n\nfunction levelFor(\n value: CapturePerformanceOptions[\"level\"],\n entry: BrowserPerformanceEntryPayload,\n): LoggerLevel {\n if (typeof value === \"function\") return value(entry);\n if (value) return value;\n return entry.entryType === \"longtask\" ? \"warn\" : \"info\";\n}\n\nfunction entryKey(entry: BrowserPerformanceEntryPayload): string {\n return `${entry.entryType}:${entry.name}:${entry.startTime}:${entry.duration}`;\n}\n\nexport function capturePerformanceIntegration(\n options: CapturePerformanceOptions = {},\n): Integration {\n const entryTypes = options.entryTypes ?? defaultEntryTypes;\n const buffered = options.buffered ?? true;\n const emitExisting = options.emitExisting ?? true;\n const maxEntries = Math.max(0, Math.floor(options.maxEntries ?? 200));\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-performance\",\n setup(api: IntegrationSetupContext) {\n const Observer = options.PerformanceObserver ?? globalThis.PerformanceObserver;\n const perf = options.performance ?? globalThis.performance;\n const seen = new Set<string>();\n const disposers: Array<() => void> = [];\n let emitted = 0;\n let disposed = false;\n\n const capture = api.guard((entry: PerformanceEntry) => {\n if (disposed || emitted >= maxEntries) return;\n const payload = normalizeBrowserPerformanceEntry(entry, options);\n if (payload.duration < minDurationFor(options.minDurationMs, payload.entryType)) return;\n if (sampleRate < 1 && random() >= sampleRate) return;\n if (options.ignore?.(payload)) return;\n const key = entryKey(payload);\n if (seen.has(key)) return;\n seen.add(key);\n emitted += 1;\n api.capture({\n level: levelFor(options.level, payload),\n message: `Performance ${payload.entryType} ${payload.name}`,\n props: { performance: payload },\n });\n });\n\n const emitExistingEntries = (type: string) => {\n if (!emitExisting || !perf) return;\n try {\n for (const entry of perf.getEntriesByType(type)) capture(entry);\n } catch {\n // Some browser-like runtimes expose partial Performance APIs.\n }\n };\n\n for (const type of entryTypes) {\n emitExistingEntries(type);\n if (!Observer || !supportsEntryType(Observer, type)) continue;\n try {\n const observer = new Observer((list) => {\n for (const entry of list.getEntries()) capture(entry);\n });\n observer.observe({ type, buffered } as PerformanceObserverInit);\n disposers.push(() => observer.disconnect());\n } catch {\n // Unsupported observer types are skipped so other entry types still work.\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext } from \"@loggerjs/core\";\n\nexport interface PageLifecycleOptions {\n flushOnPageHide?: boolean;\n flushOnHidden?: boolean;\n coalesceMs?: number;\n}\n\nexport function pageLifecycleIntegration(options: PageLifecycleOptions = {}): Integration {\n const flushOnPageHide = options.flushOnPageHide ?? true;\n const flushOnHidden = options.flushOnHidden ?? true;\n const coalesceMs = options.coalesceMs ?? 250;\n\n return {\n name: \"page-lifecycle\",\n setup(api: IntegrationSetupContext) {\n if (typeof addEventListener === \"undefined\") return;\n let disposed = false;\n let flushInFlight: Promise<void> | undefined;\n let lastFlushAt = 0;\n\n const flush = () => {\n const now = Date.now();\n if (flushInFlight || now - lastFlushAt < coalesceMs) return;\n lastFlushAt = now;\n flushInFlight = Promise.resolve(api.flush())\n .catch(() => {})\n .finally(() => {\n flushInFlight = undefined;\n });\n };\n const onVisibility = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") flush();\n };\n if (flushOnPageHide) addEventListener(\"pagehide\", flush);\n if (flushOnHidden) addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n if (disposed) return;\n disposed = true;\n if (flushOnPageHide) removeEventListener(\"pagehide\", flush);\n if (flushOnHidden) removeEventListener(\"visibilitychange\", onVisibility);\n };\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["sourceSequence","createSourceId","defaultMapEvent","defaultMapBatch","payloadByteLength","DEFAULT_DB_NAME","DEFAULT_STORE_NAME","requestToPromise","compareEntries","orderEntries","nowMs","levelFor","textEncoder","textEncoder","dataType","record","dataByteLength","messagePayload","message","record","supportsEntryType"],"sources":["../src/broadcast-channel-transport.ts","../src/http-transport.ts","../src/payload-transforms.ts","../src/service-worker-transport.ts","../src/websocket-transport.ts","../src/indexeddb-offline-queue.ts","../src/indexeddb-transport.ts","../src/offline-first-transport.ts","../src/zip-export.ts","../src/console-integration.ts","../src/context-propagation-integration.ts","../src/error-integration.ts","../src/http-capture-utils.ts","../src/fetch-integration.ts","../src/xhr-integration.ts","../src/framework-error-integration.ts","../src/framework-router-integrations.ts","../src/reporting-integration.ts","../src/router-integration.ts","../src/runtime-host-integration.ts","../src/service-worker-integration.ts","../src/user-action-integration.ts","../src/websocket-integration.ts","../src/web-vitals-integration.ts","../src/performance-integration.ts","../src/page-lifecycle.ts"],"sourcesContent":["import {\n incrementLoggerMetaCounter,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport interface BrowserBroadcastChannelLike {\n postMessage: (message: unknown) => void;\n close?: () => void;\n}\n\nexport type BrowserBroadcastChannelFactory = (channelName: string) => BrowserBroadcastChannelLike;\n\nexport interface BrowserBroadcastChannelEventMessage {\n type: \"loggerjs.event\";\n source: string;\n event: LogEvent;\n}\n\nexport interface BrowserBroadcastChannelBatchMessage {\n type: \"loggerjs.batch\";\n source: string;\n events: readonly LogEvent[];\n}\n\nexport type BrowserBroadcastChannelMessage =\n | BrowserBroadcastChannelEventMessage\n | BrowserBroadcastChannelBatchMessage;\n\nexport interface BrowserBroadcastChannelMapContext {\n channelName: string;\n source: string;\n}\n\nexport interface BrowserBroadcastChannelErrorDetail {\n operation: \"create-channel\" | \"post-message\" | \"close-channel\" | \"on-error\";\n droppedEvents: number;\n}\n\nexport interface BrowserBroadcastChannelTransportOptions {\n channelName: string;\n name?: string;\n source?: string;\n minLevel?: LoggerLevel;\n channelFactory?: BrowserBroadcastChannelFactory;\n closeChannelOnClose?: boolean;\n mapEvent?: (event: LogEvent, context: BrowserBroadcastChannelMapContext) => unknown;\n mapBatch?: (events: readonly LogEvent[], context: BrowserBroadcastChannelMapContext) => unknown;\n onError?: (error: unknown, detail: BrowserBroadcastChannelErrorDetail) => void;\n}\n\nlet sourceSequence = 0;\n\nfunction createSourceId() {\n sourceSequence += 1;\n return `loggerjs-${Date.now().toString(36)}-${sourceSequence.toString(36)}`;\n}\n\nfunction defaultChannelFactory(channelName: string): BrowserBroadcastChannelLike {\n if (typeof BroadcastChannel === \"undefined\") {\n throw new Error(\"BroadcastChannel is not available\");\n }\n return new BroadcastChannel(channelName);\n}\n\nfunction defaultMapEvent(\n event: LogEvent,\n context: BrowserBroadcastChannelMapContext,\n): BrowserBroadcastChannelEventMessage {\n return { type: \"loggerjs.event\", source: context.source, event };\n}\n\nfunction defaultMapBatch(\n events: readonly LogEvent[],\n context: BrowserBroadcastChannelMapContext,\n): BrowserBroadcastChannelBatchMessage {\n return { type: \"loggerjs.batch\", source: context.source, events };\n}\n\nexport function browserBroadcastChannelTransport(\n options: BrowserBroadcastChannelTransportOptions,\n): Transport {\n const transportName = options.name ?? \"browser-broadcast-channel\";\n const source = options.source ?? createSourceId();\n const mapContext: BrowserBroadcastChannelMapContext = {\n channelName: options.channelName,\n source,\n };\n const mapEvent = options.mapEvent ?? defaultMapEvent;\n const mapBatch = options.mapBatch ?? defaultMapBatch;\n const channelFactory = options.channelFactory ?? defaultChannelFactory;\n const closeChannelOnClose = options.closeChannelOnClose ?? true;\n let channel: BrowserBroadcastChannelLike | undefined;\n let closed = false;\n\n const reportError = (\n error: unknown,\n context: TransportContext | undefined,\n detail: BrowserBroadcastChannelErrorDetail,\n ) => {\n if (detail.droppedEvents > 0) {\n incrementLoggerMetaCounter(\"transport.dropped\", detail.droppedEvents);\n incrementLoggerMetaCounter(`transport.dropped.${detail.operation}`, detail.droppedEvents);\n }\n\n try {\n options.onError?.(error, detail);\n } catch (onErrorError) {\n context?.reportInternalError(onErrorError, {\n operation: \"on-error\",\n phase: \"transport\",\n transport: transportName,\n });\n }\n\n context?.reportInternalError(error, {\n operation: detail.operation,\n phase: \"transport\",\n transport: transportName,\n });\n };\n\n const getChannel = (context: TransportContext) => {\n if (closed) return undefined;\n if (channel) return channel;\n try {\n channel = channelFactory(options.channelName);\n return channel;\n } catch (error) {\n reportError(error, context, {\n droppedEvents: 1,\n operation: \"create-channel\",\n });\n return undefined;\n }\n };\n\n const postMessage = (message: unknown, context: TransportContext, droppedEvents: number) => {\n const currentChannel = getChannel(context);\n if (!currentChannel) return;\n try {\n // oxlint-disable-next-line require-post-message-target-origin -- BroadcastChannel.postMessage does not accept targetOrigin.\n currentChannel.postMessage(message);\n } catch (error) {\n reportError(error, context, {\n droppedEvents,\n operation: \"post-message\",\n });\n }\n };\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n log(event, context) {\n postMessage(mapEvent(event, mapContext), context, 1);\n },\n logBatch(events, context) {\n if (events.length === 0) return;\n postMessage(mapBatch(events, mapContext), context, events.length);\n },\n async close() {\n closed = true;\n if (!channel || !closeChannelOnClose) return;\n try {\n channel.close?.();\n } catch (error) {\n reportError(error, undefined, {\n droppedEvents: 0,\n operation: \"close-channel\",\n });\n } finally {\n channel = undefined;\n }\n },\n };\n}\n","import {\n applyPayloadTransforms,\n incrementLoggerMetaCounter,\n safeJsonCodec,\n toLevelValue,\n type Codec,\n type EncodedPayload,\n type LogEvent,\n type LoggerLevel,\n type PayloadTransform,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserHttpDropPolicy = \"drop-oldest\" | \"drop-newest\";\n\nconst DEFAULT_BEACON_MAX_BYTES = 60 * 1024;\n\nconst sleep = (delayMs: number) =>\n delayMs <= 0 ? Promise.resolve() : new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n\nexport interface BrowserHttpOfflineEntry {\n id: string;\n url: string;\n method: \"POST\" | \"PUT\";\n headers: Record<string, string>;\n body: string | Uint8Array;\n credentials?: RequestCredentials;\n keepalive: boolean;\n createdAt: number;\n}\n\nexport interface BrowserHttpOfflineQueue {\n enqueue: (entry: BrowserHttpOfflineEntry) => void | Promise<void>;\n replay: (send: (entry: BrowserHttpOfflineEntry) => Promise<void>) => void | Promise<void>;\n}\n\nexport interface MemoryBrowserHttpOfflineQueueOptions {\n maxEntries?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n onDrop?: (entry: BrowserHttpOfflineEntry, reason: string) => void;\n}\n\nexport interface BrowserHttpTransportOptions {\n url: string;\n name?: string;\n method?: \"POST\" | \"PUT\";\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n keepalive?: boolean;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n maxBatchSize?: number;\n flushIntervalMs?: number;\n maxQueueSize?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n useBeaconOnPageHide?: boolean;\n beaconMaxBytes?: number;\n offlineQueue?: BrowserHttpOfflineQueue;\n offlineReplayMaxRetries?: number;\n offlineReplayBaseDelayMs?: number;\n offlineReplayMaxDelayMs?: number;\n random?: () => number;\n fetchFn?: typeof fetch;\n transformPayload?: PayloadTransform | readonly PayloadTransform[];\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\nexport function memoryBrowserHttpOfflineQueue(\n options: MemoryBrowserHttpOfflineQueueOptions = {},\n): BrowserHttpOfflineQueue & { size: () => number } {\n const entries: BrowserHttpOfflineEntry[] = [];\n const maxEntries = options.maxEntries ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n\n const drop = (entry: BrowserHttpOfflineEntry, reason: string) => {\n incrementLoggerMetaCounter(\"transport.offline.dropped\");\n incrementLoggerMetaCounter(`transport.offline.dropped.${reason}`);\n options.onDrop?.(entry, reason);\n };\n\n return {\n enqueue(entry) {\n if (entries.length >= maxEntries) {\n if (dropPolicy === \"drop-newest\") {\n drop(entry, \"queue-full\");\n return;\n }\n const dropped = entries.shift();\n if (dropped) drop(dropped, \"queue-full\");\n }\n entries.push(entry);\n },\n async replay(send) {\n while (entries.length > 0) {\n const entry = entries[0];\n if (!entry) return;\n // oxlint-disable-next-line no-await-in-loop -- Replay must remove entries only after each send succeeds.\n await send(entry);\n entries.shift();\n }\n },\n size() {\n return entries.length;\n },\n };\n}\n\nfunction payloadToBody(payload: EncodedPayload): BodyInit {\n if (typeof payload === \"string\") return payload;\n return Uint8Array.from(payload);\n}\n\nfunction payloadByteLength(payload: EncodedPayload): number {\n if (typeof payload !== \"string\") return payload.byteLength;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(payload).byteLength;\n return new Blob([payload]).size;\n}\n\nfunction payloadToBeaconBody(payload: EncodedPayload, contentType: string): BodyInit {\n return new Blob([typeof payload === \"string\" ? payload : Uint8Array.from(payload)], {\n type: contentType,\n });\n}\n\ninterface BeaconChunk {\n events: LogEvent[];\n payload: string | Uint8Array;\n}\n\nfunction remainingEvents(chunks: BeaconChunk[], startIndex: number): LogEvent[] {\n const events: LogEvent[] = [];\n for (let index = startIndex; index < chunks.length; index++) {\n const chunk = chunks[index];\n if (chunk) events.push(...chunk.events);\n }\n return events;\n}\n\nexport function browserHttpTransport(options: BrowserHttpTransportOptions): Transport {\n const codec = options.codec ?? safeJsonCodec();\n const queue: LogEvent[] = [];\n const maxBatchSize = options.maxBatchSize ?? 50;\n const flushIntervalMs = options.flushIntervalMs ?? 2000;\n const maxQueueSize = options.maxQueueSize ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const beaconMaxBytes = options.beaconMaxBytes ?? DEFAULT_BEACON_MAX_BYTES;\n const offlineQueue = options.offlineQueue;\n const offlineReplayMaxRetries = options.offlineReplayMaxRetries ?? 3;\n const offlineReplayBaseDelayMs = options.offlineReplayBaseDelayMs ?? 250;\n const offlineReplayMaxDelayMs = options.offlineReplayMaxDelayMs ?? 5000;\n const random = options.random ?? Math.random;\n const fetchFn = options.fetchFn ?? globalThis.fetch?.bind(globalThis);\n let offlineEntrySeq = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushing = false;\n let replayingOffline = false;\n let lastContext: TransportContext | undefined;\n\n const headers = (payloadHeaders?: Record<string, string>, contentType = codec.contentType) => ({\n \"content-type\": contentType,\n ...payloadHeaders,\n ...options.headers,\n });\n\n const clearTimer = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n\n const reportDrop = (event: LogEvent, reason: string) => {\n incrementLoggerMetaCounter(\"transport.dropped\");\n incrementLoggerMetaCounter(`transport.dropped.${reason}`);\n options.onDrop?.(event, reason);\n };\n\n const reportInternalError = (error: unknown, operation: string) => {\n lastContext?.reportInternalError(error, {\n phase: \"transport\",\n transport: options.name ?? \"browser-http\",\n operation,\n });\n };\n\n const createBeaconChunks = (batch: LogEvent[]): BeaconChunk[] => {\n const chunks: BeaconChunk[] = [];\n let currentEvents: LogEvent[] = [];\n let currentPayload: string | Uint8Array | undefined;\n\n for (const event of batch) {\n const candidateEvents = [...currentEvents, event];\n const candidatePayload = codec.encode(candidateEvents);\n if (payloadByteLength(candidatePayload) <= beaconMaxBytes) {\n currentEvents = candidateEvents;\n currentPayload = candidatePayload;\n continue;\n }\n\n if (currentEvents.length > 0 && currentPayload) {\n chunks.push({ events: currentEvents, payload: currentPayload });\n }\n\n const singlePayload = codec.encode([event]);\n if (payloadByteLength(singlePayload) <= beaconMaxBytes) {\n currentEvents = [event];\n currentPayload = singlePayload;\n } else {\n currentEvents = [];\n currentPayload = undefined;\n reportDrop(event, \"beacon-too-large\");\n }\n }\n\n if (currentEvents.length > 0 && currentPayload) {\n chunks.push({ events: currentEvents, payload: currentPayload });\n }\n\n return chunks;\n };\n\n const sendBeaconBatch = (batch: LogEvent[]): { ok: boolean; remaining: LogEvent[] } => {\n if (typeof navigator === \"undefined\" || !navigator.sendBeacon) {\n return { ok: false, remaining: batch };\n }\n\n const chunks = createBeaconChunks(batch);\n for (let index = 0; index < chunks.length; index++) {\n const chunk = chunks[index];\n if (!chunk) continue;\n const ok = navigator.sendBeacon(\n options.url,\n payloadToBeaconBody(chunk.payload, codec.contentType),\n );\n if (!ok) return { ok: false, remaining: remainingEvents(chunks, index) };\n }\n\n return { ok: true, remaining: [] };\n };\n\n const sendPayload = async (entry: BrowserHttpOfflineEntry) => {\n if (!fetchFn) throw new Error(\"fetch is not available for browserHttpTransport\");\n const response = await fetchFn(entry.url, {\n method: entry.method,\n headers: entry.headers,\n body: payloadToBody(entry.body),\n credentials: entry.credentials,\n keepalive: entry.keepalive,\n });\n if (!response.ok) throw new Error(`browserHttpTransport failed with status ${response.status}`);\n };\n\n const encodeTransformedPayload = async (batch: LogEvent[]) => {\n const encoded = codec.encode(batch);\n return applyPayloadTransforms(\n encoded,\n {\n contentType: codec.contentType,\n events: batch,\n transport: options.name ?? \"browser-http\",\n },\n options.transformPayload,\n );\n };\n\n const createOfflineEntry = (\n payload: string | Uint8Array,\n payloadHeaders?: Record<string, string>,\n contentType?: string,\n ): BrowserHttpOfflineEntry => ({\n id: `${Date.now().toString(36)}-${(offlineEntrySeq++).toString(36)}`,\n url: options.url,\n method: options.method ?? \"POST\",\n headers: headers(payloadHeaders, contentType),\n body: payload,\n credentials: options.credentials,\n keepalive: options.keepalive ?? true,\n createdAt: Date.now(),\n });\n\n const enqueueOfflinePayload = async (\n payload: string | Uint8Array,\n payloadHeaders?: Record<string, string>,\n contentType?: string,\n ) => {\n if (!offlineQueue) return false;\n await offlineQueue.enqueue(createOfflineEntry(payload, payloadHeaders, contentType));\n incrementLoggerMetaCounter(\"transport.offline.queued\");\n return true;\n };\n\n const sendFetchBatch = async (batch: LogEvent[]) => {\n if (batch.length === 0) return;\n const transformed = await encodeTransformedPayload(batch);\n if (offlineQueue && typeof navigator !== \"undefined\" && navigator.onLine === false) {\n await enqueueOfflinePayload(\n transformed.payload,\n transformed.headers,\n transformed.contentType,\n );\n return;\n }\n try {\n await sendPayload(\n createOfflineEntry(transformed.payload, transformed.headers, transformed.contentType),\n );\n } catch (error) {\n if (\n await enqueueOfflinePayload(\n transformed.payload,\n transformed.headers,\n transformed.contentType,\n )\n ) {\n return;\n }\n throw error;\n }\n };\n\n const replayRetryDelay = (attempt: number): number => {\n const cap = Math.min(offlineReplayMaxDelayMs, offlineReplayBaseDelayMs * 2 ** attempt);\n return cap <= 0 ? 0 : random() * cap;\n };\n\n const sendOfflineEntryWithRetry = async (entry: BrowserHttpOfflineEntry) => {\n for (let attempt = 0; ; attempt++) {\n try {\n // oxlint-disable-next-line no-await-in-loop -- Retry attempts must run sequentially.\n await sendPayload(entry);\n incrementLoggerMetaCounter(\"transport.offline.replayed\");\n return;\n } catch (error) {\n if (attempt >= offlineReplayMaxRetries) {\n incrementLoggerMetaCounter(\"transport.offline.replay.failed\");\n throw error;\n }\n incrementLoggerMetaCounter(\"transport.offline.retry\");\n // oxlint-disable-next-line no-await-in-loop -- Backoff must complete before the next retry.\n await sleep(replayRetryDelay(attempt));\n }\n }\n };\n\n const replayOfflineQueue = async () => {\n if (!offlineQueue || replayingOffline) return;\n replayingOffline = true;\n try {\n await offlineQueue.replay(sendOfflineEntryWithRetry);\n } finally {\n replayingOffline = false;\n }\n };\n\n const flush = async (preferBeacon = false) => {\n if (flushing || queue.length === 0) return;\n flushing = true;\n clearTimer();\n const batch = queue.splice(0, queue.length);\n let pendingBatch = batch;\n\n try {\n if (preferBeacon && !options.transformPayload) {\n const beaconResult = sendBeaconBatch(batch);\n if (beaconResult.ok || beaconResult.remaining.length === 0) return;\n pendingBatch = beaconResult.remaining;\n }\n\n await sendFetchBatch(pendingBatch);\n pendingBatch = [];\n } catch (error) {\n if (pendingBatch.length > 0) queue.unshift(...pendingBatch);\n throw error;\n } finally {\n flushing = false;\n if (queue.length > 0) schedule();\n }\n };\n\n const schedule = () => {\n if (timer || flushIntervalMs <= 0) return;\n timer = setTimeout(() => {\n void flush(false).catch((error: unknown) => reportInternalError(error, \"flush\"));\n }, flushIntervalMs);\n };\n\n const onPageHide = () => {\n void flush(true).catch((error: unknown) => reportInternalError(error, \"pagehide-flush\"));\n };\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n void flush(true).catch((error: unknown) => reportInternalError(error, \"visibility-flush\"));\n }\n };\n const onOnline = () => {\n void replayOfflineQueue().catch((error: unknown) => reportInternalError(error, \"replay\"));\n };\n\n if (options.useBeaconOnPageHide ?? true) {\n globalThis.addEventListener?.(\"pagehide\", onPageHide);\n globalThis.addEventListener?.(\"visibilitychange\", onVisibilityChange);\n }\n if (offlineQueue) globalThis.addEventListener?.(\"online\", onOnline);\n\n return {\n name: options.name ?? \"browser-http\",\n minLevel: options.minLevel,\n log(event, context) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n lastContext = context;\n if (queue.length >= maxQueueSize) {\n if (dropPolicy === \"drop-newest\") {\n reportDrop(event, \"queue-full\");\n return;\n }\n const dropped = queue.shift();\n if (dropped) reportDrop(dropped, \"queue-full\");\n }\n queue.push(event);\n if (queue.length >= maxBatchSize) {\n void flush(false).catch((error: unknown) => reportInternalError(error, \"flush\"));\n } else schedule();\n },\n flush() {\n return flush(false);\n },\n close() {\n globalThis.removeEventListener?.(\"pagehide\", onPageHide);\n globalThis.removeEventListener?.(\"visibilitychange\", onVisibilityChange);\n globalThis.removeEventListener?.(\"online\", onOnline);\n return flush(true);\n },\n };\n}\n","import {\n encodedPayloadToUint8Array,\n type PayloadTransform,\n type PayloadTransformContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserCompressionFormat = \"gzip\" | \"deflate\";\n\nexport interface BrowserCompressionPayloadTransformOptions {\n format?: BrowserCompressionFormat;\n headers?: Record<string, string>;\n compress?: (\n payload: Uint8Array,\n context: PayloadTransformContext & { format: BrowserCompressionFormat },\n ) => Uint8Array | Promise<Uint8Array>;\n streamFactory?: (format: BrowserCompressionFormat) => CompressionStream;\n}\n\nasync function compressWithStream(\n payload: Uint8Array,\n format: BrowserCompressionFormat,\n streamFactory?: (format: BrowserCompressionFormat) => CompressionStream,\n): Promise<Uint8Array> {\n const createStream =\n streamFactory ??\n ((nextFormat: BrowserCompressionFormat) => {\n if (typeof CompressionStream === \"undefined\") {\n throw new Error(\"CompressionStream is not available in this browser\");\n }\n return new CompressionStream(nextFormat);\n });\n const stream = createStream(format);\n const writer = stream.writable.getWriter();\n await writer.write(Uint8Array.from(payload) as BufferSource);\n await writer.close();\n return new Uint8Array(await new Response(stream.readable).arrayBuffer());\n}\n\nexport function browserCompressionPayloadTransform(\n options: BrowserCompressionPayloadTransformOptions = {},\n): PayloadTransform {\n const format = options.format ?? \"gzip\";\n return async (payload, context) => ({\n payload: await (options.compress\n ? options.compress(encodedPayloadToUint8Array(payload), { ...context, format })\n : compressWithStream(encodedPayloadToUint8Array(payload), format, options.streamFactory)),\n headers: {\n \"content-encoding\": format,\n ...options.headers,\n },\n });\n}\n","import {\n incrementLoggerMetaCounter,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserServiceWorkerDropPolicy = \"drop-oldest\" | \"drop-newest\";\nexport type BrowserServiceWorkerTarget = \"controller\" | \"ready\";\n\nexport interface BrowserServiceWorkerLike {\n postMessage: (message: unknown, transfer?: Transferable[] | StructuredSerializeOptions) => void;\n}\n\nexport interface BrowserServiceWorkerRegistrationLike {\n active?: BrowserServiceWorkerLike | null;\n waiting?: BrowserServiceWorkerLike | null;\n installing?: BrowserServiceWorkerLike | null;\n}\n\nexport interface BrowserServiceWorkerContainerLike {\n controller?: BrowserServiceWorkerLike | null;\n ready?: Promise<BrowserServiceWorkerRegistrationLike>;\n}\n\nexport interface BrowserServiceWorkerEventMessage {\n type: \"loggerjs.event\";\n source: string;\n event: LogEvent;\n}\n\nexport interface BrowserServiceWorkerBatchMessage {\n type: \"loggerjs.batch\";\n source: string;\n events: readonly LogEvent[];\n}\n\nexport type BrowserServiceWorkerMessage =\n | BrowserServiceWorkerEventMessage\n | BrowserServiceWorkerBatchMessage;\n\nexport interface BrowserServiceWorkerMapContext {\n source: string;\n target: BrowserServiceWorkerTarget;\n}\n\nexport interface BrowserServiceWorkerTransportOptions {\n name?: string;\n minLevel?: LoggerLevel;\n source?: string;\n target?: BrowserServiceWorkerTarget;\n serviceWorker?: BrowserServiceWorkerContainerLike;\n maxQueueSize?: number;\n dropPolicy?: BrowserServiceWorkerDropPolicy;\n transfer?: (message: unknown) => Transferable[] | StructuredSerializeOptions | undefined;\n mapEvent?: (event: LogEvent, context: BrowserServiceWorkerMapContext) => unknown;\n mapBatch?: (events: readonly LogEvent[], context: BrowserServiceWorkerMapContext) => unknown;\n onDrop?: (event: LogEvent, reason: string) => void;\n onError?: (error: unknown, detail: { operation: string; droppedEvents: number }) => void;\n}\n\ninterface QueueItem {\n events: readonly LogEvent[];\n message: unknown;\n}\n\nlet sourceSequence = 0;\n\nfunction createSourceId() {\n sourceSequence += 1;\n return `loggerjs-${Date.now().toString(36)}-${sourceSequence.toString(36)}`;\n}\n\nfunction defaultMapEvent(\n event: LogEvent,\n context: BrowserServiceWorkerMapContext,\n): BrowserServiceWorkerEventMessage {\n return { type: \"loggerjs.event\", source: context.source, event };\n}\n\nfunction defaultMapBatch(\n events: readonly LogEvent[],\n context: BrowserServiceWorkerMapContext,\n): BrowserServiceWorkerBatchMessage {\n return { type: \"loggerjs.batch\", source: context.source, events };\n}\n\nfunction serviceWorkerContainer(): BrowserServiceWorkerContainerLike | undefined {\n return typeof navigator === \"undefined\"\n ? undefined\n : (navigator.serviceWorker as unknown as BrowserServiceWorkerContainerLike);\n}\n\nfunction workerFromRegistration(registration: BrowserServiceWorkerRegistrationLike) {\n return registration.active ?? registration.waiting ?? registration.installing ?? undefined;\n}\n\nexport function browserServiceWorkerTransport(\n options: BrowserServiceWorkerTransportOptions = {},\n): Transport & { queueSize: () => number } {\n const transportName = options.name ?? \"browser-service-worker\";\n const target = options.target ?? \"controller\";\n const source = options.source ?? createSourceId();\n const maxQueueSize = options.maxQueueSize ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const mapContext: BrowserServiceWorkerMapContext = { source, target };\n const mapEvent = options.mapEvent ?? defaultMapEvent;\n const mapBatch = options.mapBatch ?? defaultMapBatch;\n const queue: QueueItem[] = [];\n let readyWorker: BrowserServiceWorkerLike | undefined;\n let readyPromise: Promise<void> | undefined;\n let lastContext: TransportContext | undefined;\n\n const reportError = (\n error: unknown,\n context: TransportContext | undefined,\n operation: string,\n droppedEvents = 0,\n ) => {\n try {\n options.onError?.(error, { droppedEvents, operation });\n } catch (onErrorError) {\n context?.reportInternalError(onErrorError, {\n operation: \"on-error\",\n phase: \"transport\",\n transport: transportName,\n });\n }\n context?.reportInternalError(error, {\n operation,\n phase: \"transport\",\n transport: transportName,\n });\n };\n\n const reportDrop = (item: QueueItem, reason: string) => {\n incrementLoggerMetaCounter(\"transport.dropped\", item.events.length);\n incrementLoggerMetaCounter(`transport.dropped.${reason}`, item.events.length);\n for (const event of item.events) options.onDrop?.(event, reason);\n };\n\n const currentWorker = () => {\n const container = options.serviceWorker ?? serviceWorkerContainer();\n if (!container) return undefined;\n if (target === \"controller\") return container.controller ?? undefined;\n return readyWorker;\n };\n\n const post = (worker: BrowserServiceWorkerLike, item: QueueItem, context: TransportContext) => {\n try {\n worker.postMessage(item.message, options.transfer?.(item.message));\n return true;\n } catch (error) {\n reportDrop(item, \"post-message\");\n reportError(error, context, \"post-message\", item.events.length);\n return false;\n }\n };\n\n const drain = (context = lastContext) => {\n const worker = currentWorker();\n if (!worker || !context) return;\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) return;\n post(worker, item, context);\n }\n };\n\n const dropQueued = (reason: string) => {\n const pending = queue.splice(0);\n for (const item of pending) reportDrop(item, reason);\n return pending.reduce((total, item) => total + item.events.length, 0);\n };\n\n const waitForReady = (context?: TransportContext) => {\n const worker = currentWorker();\n if (worker) return Promise.resolve();\n if (target !== \"ready\") {\n return Promise.reject(new Error(\"service worker controller is not available\"));\n }\n if (readyPromise) return readyPromise;\n const container = options.serviceWorker ?? serviceWorkerContainer();\n if (!container?.ready) {\n const error = new Error(\"serviceWorker.ready is not available\");\n const droppedEvents = dropQueued(\"ready\");\n reportError(error, context, \"ready\", droppedEvents);\n return Promise.reject(error);\n }\n readyPromise = container.ready\n .then((registration) => {\n readyWorker = workerFromRegistration(registration);\n if (!readyWorker) {\n throw new Error(\"service worker registration has no active worker\");\n }\n drain(context ?? lastContext);\n })\n .catch((error) => {\n readyPromise = undefined;\n const droppedEvents = dropQueued(\"ready\");\n reportError(error, context ?? lastContext, \"ready\", droppedEvents);\n throw error;\n });\n return readyPromise;\n };\n\n const startReady = (context: TransportContext) => {\n void waitForReady(context).catch(() => {\n // Errors are already reported through the transport context.\n });\n };\n\n const enqueue = (item: QueueItem) => {\n if (queue.length >= maxQueueSize) {\n if (dropPolicy === \"drop-newest\") {\n reportDrop(item, \"queue-full\");\n return false;\n }\n const dropped = queue.shift();\n if (dropped) reportDrop(dropped, \"queue-full\");\n }\n queue.push(item);\n return true;\n };\n\n const send = (item: QueueItem, context: TransportContext) => {\n lastContext = context;\n const worker = currentWorker();\n if (worker) {\n post(worker, item, context);\n return;\n }\n if (target === \"ready\") {\n if (enqueue(item)) startReady(context);\n return;\n }\n reportDrop(item, \"unavailable\");\n reportError(\n new Error(\"service worker controller is not available\"),\n context,\n \"unavailable\",\n item.events.length,\n );\n };\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n queueSize() {\n return queue.length;\n },\n ready() {\n return waitForReady();\n },\n log(event, context) {\n send({ events: [event], message: mapEvent(event, mapContext) }, context);\n },\n logBatch(events, context) {\n if (events.length === 0) return;\n send({ events, message: mapBatch(events, mapContext) }, context);\n },\n flush() {\n drain();\n },\n close() {\n const pending = queue.splice(0);\n for (const item of pending) reportDrop(item, \"closed\");\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n safeJsonCodec,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserWebSocketDropPolicy = \"drop-oldest\" | \"drop-newest\";\nexport type BrowserWebSocketPayload = string | Uint8Array;\nexport type BrowserWebSocketEventType = \"close\" | \"error\" | \"open\";\ntype BrowserWebSocketSendPayload = Parameters<WebSocket[\"send\"]>[0];\n\nexport interface BrowserWebSocketLike {\n readonly readyState: number;\n send: (data: BrowserWebSocketSendPayload) => void;\n close: (code?: number, reason?: string) => void;\n addEventListener: (type: BrowserWebSocketEventType, listener: (event: Event) => void) => void;\n removeEventListener: (type: BrowserWebSocketEventType, listener: (event: Event) => void) => void;\n}\n\nexport type BrowserWebSocketFactory = (\n url: string,\n protocols?: string | string[],\n) => BrowserWebSocketLike;\n\nexport interface BrowserWebSocketErrorDetail {\n operation: \"close-socket\" | \"create-socket\" | \"send\" | \"socket-error\" | \"on-error\";\n droppedEvents: number;\n}\n\nexport interface BrowserWebSocketTransportOptions {\n url: string;\n name?: string;\n protocols?: string | string[];\n minLevel?: LoggerLevel;\n codec?: Codec<BrowserWebSocketPayload>;\n maxQueueSize?: number;\n dropPolicy?: BrowserWebSocketDropPolicy;\n webSocketFactory?: BrowserWebSocketFactory;\n closeCode?: number;\n closeReason?: string;\n onDrop?: (event: LogEvent, reason: string) => void;\n onError?: (error: unknown, detail: BrowserWebSocketErrorDetail) => void;\n}\n\nexport interface BrowserWebSocketTransport extends Transport {\n queueSize: () => number;\n}\n\ninterface QueueItem {\n events: readonly LogEvent[];\n payload: BrowserWebSocketPayload;\n}\n\ninterface ActiveSocket {\n socket: BrowserWebSocketLike;\n onOpen: (event: Event) => void;\n onClose: (event: Event) => void;\n onError: (event: Event) => void;\n}\n\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\n\nfunction defaultWebSocketFactory(url: string, protocols?: string | string[]): BrowserWebSocketLike {\n if (typeof WebSocket === \"undefined\") {\n throw new Error(\"WebSocket is not available\");\n }\n return new WebSocket(url, protocols);\n}\n\nfunction toSendPayload(payload: BrowserWebSocketPayload): BrowserWebSocketSendPayload {\n if (typeof payload === \"string\") return payload;\n return Uint8Array.from(payload);\n}\n\nexport function browserWebSocketTransport(\n options: BrowserWebSocketTransportOptions,\n): BrowserWebSocketTransport {\n const transportName = options.name ?? \"browser-websocket\";\n const codec = options.codec ?? safeJsonCodec();\n const maxQueueSize = options.maxQueueSize ?? 1000;\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const webSocketFactory = options.webSocketFactory ?? defaultWebSocketFactory;\n const queue: QueueItem[] = [];\n let active: ActiveSocket | undefined;\n let closed = false;\n let lastContext: TransportContext | undefined;\n\n const reportDrop = (item: QueueItem, reason: string) => {\n incrementLoggerMetaCounter(\"transport.dropped\", item.events.length);\n incrementLoggerMetaCounter(`transport.dropped.${reason}`, item.events.length);\n for (const event of item.events) options.onDrop?.(event, reason);\n };\n\n const reportError = (\n error: unknown,\n context: TransportContext | undefined,\n detail: BrowserWebSocketErrorDetail,\n ) => {\n try {\n options.onError?.(error, detail);\n } catch (onErrorError) {\n context?.reportInternalError(onErrorError, {\n operation: \"on-error\",\n phase: \"transport\",\n transport: transportName,\n });\n }\n\n context?.reportInternalError(error, {\n operation: detail.operation,\n phase: \"transport\",\n transport: transportName,\n });\n };\n\n const detachSocket = () => {\n if (!active) return;\n const current = active;\n current.socket.removeEventListener(\"open\", current.onOpen);\n current.socket.removeEventListener(\"close\", current.onClose);\n current.socket.removeEventListener(\"error\", current.onError);\n active = undefined;\n };\n\n const drainQueue = (context = lastContext) => {\n const socket = active?.socket;\n if (!socket || socket.readyState !== WS_OPEN) return;\n\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) return;\n try {\n socket.send(toSendPayload(item.payload));\n } catch (error) {\n reportDrop(item, \"send\");\n reportError(error, context, {\n droppedEvents: item.events.length,\n operation: \"send\",\n });\n return;\n }\n }\n };\n\n const createSocket = (context: TransportContext, droppedEvents: number) => {\n if (closed) return undefined;\n if (\n active &&\n (active.socket.readyState === WS_CONNECTING || active.socket.readyState === WS_OPEN)\n ) {\n return active.socket;\n }\n\n detachSocket();\n\n try {\n const socket = webSocketFactory(options.url, options.protocols);\n const nextActive: ActiveSocket = {\n socket,\n onOpen() {\n drainQueue(context);\n },\n onClose() {\n if (active?.socket === socket) detachSocket();\n },\n onError(errorEvent) {\n reportError(errorEvent, context, {\n droppedEvents: 0,\n operation: \"socket-error\",\n });\n },\n };\n active = nextActive;\n socket.addEventListener(\"open\", nextActive.onOpen);\n socket.addEventListener(\"close\", nextActive.onClose);\n socket.addEventListener(\"error\", nextActive.onError);\n return socket;\n } catch (error) {\n reportError(error, context, {\n droppedEvents,\n operation: \"create-socket\",\n });\n return undefined;\n }\n };\n\n const enqueue = (item: QueueItem) => {\n if (queue.length >= maxQueueSize) {\n if (dropPolicy === \"drop-newest\") {\n reportDrop(item, \"queue-full\");\n return false;\n }\n\n const dropped = queue.shift();\n if (dropped) reportDrop(dropped, \"queue-full\");\n }\n\n queue.push(item);\n return true;\n };\n\n const sendOrQueue = (item: QueueItem, context: TransportContext) => {\n lastContext = context;\n if (closed) {\n reportDrop(item, \"closed\");\n return;\n }\n\n const socket = createSocket(context, item.events.length);\n if (!socket) {\n reportDrop(item, \"create-socket\");\n return;\n }\n\n if (socket.readyState === WS_OPEN) {\n try {\n socket.send(toSendPayload(item.payload));\n } catch (error) {\n reportDrop(item, \"send\");\n reportError(error, context, {\n droppedEvents: item.events.length,\n operation: \"send\",\n });\n }\n return;\n }\n\n enqueue(item);\n };\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n queueSize() {\n return queue.length;\n },\n log(event, context) {\n sendOrQueue({ events: [event], payload: codec.encode(event) }, context);\n },\n logBatch(events, context) {\n if (events.length === 0) return;\n sendOrQueue({ events, payload: codec.encode(events) }, context);\n },\n flush() {\n drainQueue();\n },\n async close() {\n closed = true;\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) reportDrop(item, \"closed\");\n }\n\n const socket = active?.socket;\n detachSocket();\n if (!socket) return;\n\n try {\n socket.close(options.closeCode, options.closeReason);\n } catch (error) {\n reportError(error, lastContext, {\n droppedEvents: 0,\n operation: \"close-socket\",\n });\n }\n },\n };\n}\n","import { incrementLoggerMetaCounter } from \"@loggerjs/core\";\nimport type {\n BrowserHttpDropPolicy,\n BrowserHttpOfflineEntry,\n BrowserHttpOfflineQueue,\n} from \"./http-transport\";\n\nexport interface IndexedDbBrowserHttpOfflineQueueOptions {\n dbName?: string;\n storeName?: string;\n maxEntries?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n indexedDB?: IDBFactory;\n onDrop?: (entry: BrowserHttpOfflineEntry, reason: string) => void;\n}\n\nexport interface IndexedDbBrowserHttpOfflineQueue extends BrowserHttpOfflineQueue {\n size: () => Promise<number>;\n clear: () => Promise<void>;\n close: () => void;\n}\n\nconst DEFAULT_DB_NAME = \"loggerjs\";\nconst DEFAULT_STORE_NAME = \"browser-http-offline\";\n\nfunction normalizeMaxEntries(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) return 1000;\n return Math.max(0, Math.floor(value));\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB request failed\")),\n { once: true },\n );\n });\n}\n\nfunction compareEntries(a: BrowserHttpOfflineEntry, b: BrowserHttpOfflineEntry): number {\n if (a.createdAt !== b.createdAt) return a.createdAt - b.createdAt;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n\nfunction orderEntries(entries: BrowserHttpOfflineEntry[]): BrowserHttpOfflineEntry[] {\n const ordered: BrowserHttpOfflineEntry[] = [];\n for (const entry of entries) {\n let index = 0;\n while (\n index < ordered.length &&\n compareEntries(ordered[index] as BrowserHttpOfflineEntry, entry) <= 0\n ) {\n index += 1;\n }\n ordered.splice(index, 0, entry);\n }\n return ordered;\n}\n\nexport function indexedDbBrowserHttpOfflineQueue(\n options: IndexedDbBrowserHttpOfflineQueueOptions = {},\n): IndexedDbBrowserHttpOfflineQueue {\n const dbName = options.dbName ?? DEFAULT_DB_NAME;\n const storeName = options.storeName ?? DEFAULT_STORE_NAME;\n const maxEntries = normalizeMaxEntries(options.maxEntries);\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const idb = options.indexedDB ?? globalThis.indexedDB;\n let dbPromise: Promise<IDBDatabase> | undefined;\n\n const drop = (entry: BrowserHttpOfflineEntry, reason: string) => {\n incrementLoggerMetaCounter(\"transport.offline.dropped\");\n incrementLoggerMetaCounter(`transport.offline.dropped.${reason}`);\n options.onDrop?.(entry, reason);\n };\n\n const openDb = () => {\n if (!idb) throw new Error(\"IndexedDB is not available for loggerjs offline queue\");\n dbPromise ??= new Promise<IDBDatabase>((resolve, reject) => {\n const request = idb.open(dbName, 1);\n request.addEventListener(\"upgradeneeded\", () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName, { keyPath: \"id\" });\n }\n });\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB open failed\")),\n { once: true },\n );\n });\n return dbPromise;\n };\n\n const withStore = async <T>(\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore) => Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = db.transaction(storeName, mode);\n return run(tx.objectStore(storeName));\n };\n\n const getEntries = async () =>\n orderEntries(\n await withStore(\"readonly\", (store) =>\n requestToPromise(store.getAll() as IDBRequest<BrowserHttpOfflineEntry[]>),\n ),\n );\n\n const putEntry = (entry: BrowserHttpOfflineEntry) =>\n withStore(\"readwrite\", (store) => requestToPromise(store.put(entry)));\n\n const deleteEntry = (id: string) =>\n withStore(\"readwrite\", (store) => requestToPromise(store.delete(id)));\n\n const queue: IndexedDbBrowserHttpOfflineQueue = {\n async enqueue(entry) {\n if (maxEntries === 0) {\n drop(entry, \"queue-full\");\n return;\n }\n\n const entries = await getEntries();\n if (entries.length >= maxEntries) {\n if (dropPolicy === \"drop-newest\") {\n drop(entry, \"queue-full\");\n return;\n }\n const dropCount = entries.length - maxEntries + 1;\n for (let index = 0; index < dropCount; index += 1) {\n const dropped = entries[index];\n if (!dropped) continue;\n // oxlint-disable-next-line no-await-in-loop -- Drops must be durable before adding the new entry.\n await deleteEntry(dropped.id);\n drop(dropped, \"queue-full\");\n }\n }\n\n await putEntry(entry);\n },\n async replay(send) {\n const entries = await getEntries();\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Replay must preserve order and delete only after send succeeds.\n await send(entry);\n // oxlint-disable-next-line no-await-in-loop -- The entry must remain durable until send resolves.\n await deleteEntry(entry.id);\n }\n },\n async size() {\n return (await getEntries()).length;\n },\n clear() {\n return withStore(\"readwrite\", (store) => requestToPromise(store.clear()));\n },\n close() {\n const promise = dbPromise;\n dbPromise = undefined;\n void promise?.then((db) => db.close());\n },\n };\n\n return queue;\n}\n","import {\n incrementLoggerMetaCounter,\n safeJsonCodec,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport type { BrowserHttpDropPolicy } from \"./http-transport\";\n\nexport interface IndexedDbLogEntry {\n id: string;\n seq: number;\n createdAt: number;\n level: number;\n levelName: string;\n logger: string;\n type?: string;\n byteLength: number;\n payload: string | Uint8Array;\n}\n\nexport interface IndexedDbTransportQueryOptions {\n from?: number;\n to?: number;\n minLevel?: LoggerLevel;\n logger?: string;\n type?: string;\n limit?: number;\n order?: \"asc\" | \"desc\";\n}\n\nexport type IndexedDbTransportDurability = \"default\" | \"strict\" | \"relaxed\";\n\nexport type IndexedDbStorageBucketDurability = \"strict\" | \"relaxed\";\n\nexport interface IndexedDbTransportStats {\n bufferDepth: number;\n maxBufferDepth: number;\n pendingFlush: boolean;\n enqueued: number;\n persisted: number;\n dropped: number;\n droppedByReason: Record<string, number>;\n persistedDropped: number;\n persistedDroppedByReason: Record<string, number>;\n flushes: number;\n flushErrors: number;\n lastFlushBatchSize: number;\n lastFlushDurationMs: number;\n prunes: number;\n pruneFallbacks: number;\n lastPruneDurationMs: number;\n queries: number;\n queryFallbacks: number;\n lastQueryDurationMs: number;\n databaseOpenCount: number;\n storageBucketFallbacks: number;\n transactionOptionFallbacks: number;\n errors: number;\n errorsByOperation: Record<string, number>;\n}\n\nexport interface IndexedDbTransportOptions {\n name?: string;\n dbName?: string;\n storeName?: string;\n maxEntries?: number;\n maxBytes?: number;\n ttlMs?: number;\n batchSize?: number;\n flushIntervalMs?: number;\n maxBufferSize?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n flushOnPageHide?: boolean;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n durability?: IndexedDbTransportDurability;\n storageBucketName?: string;\n storageBucketPersisted?: boolean;\n storageBucketDurability?: IndexedDbStorageBucketDurability;\n indexedDB?: IDBFactory;\n onDrop?: (event: LogEvent, reason: string) => void;\n onPersistedDrop?: (entry: IndexedDbLogEntry, reason: string) => void;\n}\n\nexport interface IndexedDbTransport extends Transport {\n count: () => Promise<number>;\n clear: () => Promise<void>;\n remove: (ids: string | readonly string[]) => Promise<void>;\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n stats: () => IndexedDbTransportStats;\n}\n\nconst DEFAULT_DB_NAME = \"loggerjs\";\nconst DEFAULT_STORE_NAME = \"logs\";\nconst DB_VERSION = 2;\nconst ORDER_INDEX_NAME = \"createdAtSeq\";\n\ninterface StorageBucketLike {\n indexedDB?: IDBFactory;\n}\n\ninterface StorageBucketManagerLike {\n open: (\n name: string,\n options?: {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n },\n ) => Promise<StorageBucketLike>;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction incrementRecord(record: Record<string, number>, key: string, amount = 1): void {\n record[key] = (record[key] ?? 0) + amount;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB request failed\")),\n { once: true },\n );\n });\n}\n\nfunction transactionToPromise(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.addEventListener(\"complete\", () => resolve(), { once: true });\n transaction.addEventListener(\n \"abort\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction aborted\")),\n { once: true },\n );\n transaction.addEventListener(\n \"error\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction failed\")),\n { once: true },\n );\n });\n}\n\nfunction payloadByteLength(payload: string | Uint8Array): number {\n if (typeof payload !== \"string\") return payload.byteLength;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(payload).byteLength;\n return new Blob([payload]).size;\n}\n\nfunction compareEntries(a: IndexedDbLogEntry, b: IndexedDbLogEntry): number {\n if (a.createdAt !== b.createdAt) return a.createdAt - b.createdAt;\n if (a.seq !== b.seq) return a.seq - b.seq;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n\nfunction orderEntries(\n entries: readonly IndexedDbLogEntry[],\n order: \"asc\" | \"desc\" = \"asc\",\n): IndexedDbLogEntry[] {\n // oxlint-disable-next-line no-array-sort -- Sort a copy to preserve ES2020 compatibility and caller immutability.\n const sorted = [...entries].sort(compareEntries);\n if (order === \"asc\") return sorted;\n const reversed: IndexedDbLogEntry[] = [];\n for (let index = sorted.length - 1; index >= 0; index -= 1) {\n reversed.push(sorted[index] as IndexedDbLogEntry);\n }\n return reversed;\n}\n\nfunction indexExists(store: IDBObjectStore, name: string): boolean {\n return store.indexNames.contains(name);\n}\n\nfunction ensureIndex(store: IDBObjectStore, name: string, keyPath: string | readonly string[]) {\n if (!indexExists(store, name)) store.createIndex(name, keyPath);\n}\n\nfunction getStoreIndex(store: IDBObjectStore, name: string): IDBIndex | undefined {\n const maybeStore = store as IDBObjectStore & {\n index?: (indexName: string) => IDBIndex;\n };\n if (typeof maybeStore.index !== \"function\" || !indexExists(store, name)) return undefined;\n return maybeStore.index(name);\n}\n\nfunction getStorageBucketManager(): StorageBucketManagerLike | undefined {\n return (globalThis.navigator as unknown as { storageBuckets?: StorageBucketManagerLike })\n ?.storageBuckets;\n}\n\nfunction storageBucketOpenOptions(options: IndexedDbTransportOptions):\n | {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n }\n | undefined {\n if (\n options.storageBucketDurability === undefined &&\n options.storageBucketPersisted === undefined\n ) {\n return undefined;\n }\n return {\n durability: options.storageBucketDurability,\n persisted: options.storageBucketPersisted,\n };\n}\n\nfunction decodeEntry(\n entry: IndexedDbLogEntry,\n codec: Codec<string | Uint8Array>,\n): LogEvent | undefined {\n if (!codec.decode) throw new Error(\"indexedDbTransport query requires a codec with decode\");\n const decoded = codec.decode(entry.payload);\n return Array.isArray(decoded) ? decoded[0] : decoded;\n}\n\nfunction shouldKeepEntry(entry: IndexedDbLogEntry, options: IndexedDbTransportQueryOptions) {\n if (options.from !== undefined && entry.createdAt < options.from) return false;\n if (options.to !== undefined && entry.createdAt > options.to) return false;\n if (options.minLevel !== undefined && entry.level < toLevelValue(options.minLevel)) return false;\n if (options.logger !== undefined && entry.logger !== options.logger) return false;\n if (options.type !== undefined && entry.type !== options.type) return false;\n return true;\n}\n\nfunction orderRangeForQuery(options: IndexedDbTransportQueryOptions): IDBKeyRange | undefined {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n const lower =\n options.from === undefined ? undefined : [options.from, Number.MIN_SAFE_INTEGER, \"\"];\n const upper =\n options.to === undefined ? undefined : [options.to, Number.MAX_SAFE_INTEGER, \"\\uffff\"];\n if (lower && upper) return IDBKeyRange.bound(lower, upper);\n if (lower) return IDBKeyRange.lowerBound(lower);\n if (upper) return IDBKeyRange.upperBound(upper);\n return undefined;\n}\n\nfunction iterateCursor(\n request: IDBRequest<IDBCursorWithValue | null>,\n visit: (cursor: IDBCursorWithValue) => boolean | void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\n \"success\",\n () => {\n const cursor = request.result;\n if (!cursor) {\n resolve();\n return;\n }\n try {\n const shouldContinue = visit(cursor);\n if (shouldContinue === false) {\n resolve();\n return;\n }\n cursor.continue();\n } catch (error) {\n reject(error);\n }\n },\n false,\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB cursor failed\")),\n { once: true },\n );\n });\n}\n\nexport function indexedDbTransport(options: IndexedDbTransportOptions = {}): IndexedDbTransport {\n const dbName = options.dbName ?? DEFAULT_DB_NAME;\n const storeName = options.storeName ?? DEFAULT_STORE_NAME;\n const codec = options.codec ?? (safeJsonCodec() as Codec<string | Uint8Array>);\n const batchSize = normalizePositiveInteger(options.batchSize, 100);\n const flushIntervalMs = normalizePositiveInteger(options.flushIntervalMs, 1000);\n const maxBufferSize = normalizePositiveInteger(options.maxBufferSize, 1000);\n const maxEntries = normalizePositiveInteger(options.maxEntries, 50_000);\n const maxBytes = normalizePositiveInteger(options.maxBytes, 50 * 1024 * 1024);\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const flushOnPageHide = options.flushOnPageHide ?? true;\n const durability = options.durability ?? \"default\";\n const rootIndexedDB = options.indexedDB ?? globalThis.indexedDB;\n const transactionOptions =\n durability === \"default\"\n ? undefined\n : ({\n durability,\n } satisfies IDBTransactionOptions);\n\n const buffer: LogEvent[] = [];\n let dbPromise: Promise<IDBDatabase> | undefined;\n let indexedDBFactoryPromise: Promise<IDBFactory | undefined> | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushPromise: Promise<void> | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n const statsState: IndexedDbTransportStats = {\n bufferDepth: 0,\n maxBufferDepth: 0,\n pendingFlush: false,\n enqueued: 0,\n persisted: 0,\n dropped: 0,\n droppedByReason: {},\n persistedDropped: 0,\n persistedDroppedByReason: {},\n flushes: 0,\n flushErrors: 0,\n lastFlushBatchSize: 0,\n lastFlushDurationMs: 0,\n prunes: 0,\n pruneFallbacks: 0,\n lastPruneDurationMs: 0,\n queries: 0,\n queryFallbacks: 0,\n lastQueryDurationMs: 0,\n databaseOpenCount: 0,\n storageBucketFallbacks: 0,\n transactionOptionFallbacks: 0,\n errors: 0,\n errorsByOperation: {},\n };\n\n const snapshotStats = (): IndexedDbTransportStats => ({\n ...statsState,\n bufferDepth: buffer.length,\n droppedByReason: { ...statsState.droppedByReason },\n errorsByOperation: { ...statsState.errorsByOperation },\n pendingFlush: flushPromise !== undefined,\n persistedDroppedByReason: { ...statsState.persistedDroppedByReason },\n });\n\n const reportInternalError = (error: unknown, operation: string) => {\n statsState.errors += 1;\n incrementRecord(statsState.errorsByOperation, operation);\n lastContext?.reportInternalError(error, {\n operation,\n phase: \"transport\",\n transport: options.name ?? \"indexeddb\",\n });\n };\n\n const dropEvent = (event: LogEvent, reason: string) => {\n statsState.dropped += 1;\n incrementRecord(statsState.droppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.dropped.${reason}`);\n options.onDrop?.(event, reason);\n };\n\n const dropPersistedEntry = (entry: IndexedDbLogEntry, reason: string) => {\n statsState.persistedDropped += 1;\n incrementRecord(statsState.persistedDroppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.persisted.dropped.${reason}`);\n options.onPersistedDrop?.(entry, reason);\n };\n\n const resolveIndexedDBFactory = async () => {\n if (options.indexedDB || !options.storageBucketName) return rootIndexedDB;\n indexedDBFactoryPromise ??= (async () => {\n const manager = getStorageBucketManager();\n if (!manager) {\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n }\n try {\n const bucket = await manager.open(\n options.storageBucketName as string,\n storageBucketOpenOptions(options),\n );\n if (bucket.indexedDB) return bucket.indexedDB;\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n } catch (error) {\n statsState.storageBucketFallbacks += 1;\n reportInternalError(error, \"storage-bucket-open\");\n return rootIndexedDB;\n }\n })();\n return indexedDBFactoryPromise;\n };\n\n const openDb = () => {\n dbPromise ??= resolveIndexedDBFactory().then((idb) => {\n if (!idb) throw new Error(\"IndexedDB is not available for indexedDbTransport\");\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = idb.open(dbName, DB_VERSION);\n request.addEventListener(\"upgradeneeded\", () => {\n const db = request.result;\n const store = db.objectStoreNames.contains(storeName)\n ? request.transaction?.objectStore(storeName)\n : db.createObjectStore(storeName, { keyPath: \"id\" });\n if (!store) return;\n ensureIndex(store, \"createdAt\", \"createdAt\");\n ensureIndex(store, \"level\", \"level\");\n ensureIndex(store, \"logger\", \"logger\");\n ensureIndex(store, \"type\", \"type\");\n ensureIndex(store, ORDER_INDEX_NAME, [\"createdAt\", \"seq\", \"id\"]);\n });\n request.addEventListener(\n \"success\",\n () => {\n statsState.databaseOpenCount += 1;\n resolve(request.result);\n },\n { once: true },\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB open failed\")),\n { once: true },\n );\n });\n });\n return dbPromise;\n };\n\n const createTransaction = (db: IDBDatabase, mode: IDBTransactionMode) => {\n if (mode !== \"readwrite\" || !transactionOptions) return db.transaction(storeName, mode);\n try {\n return db.transaction(storeName, mode, transactionOptions);\n } catch {\n statsState.transactionOptionFallbacks += 1;\n return db.transaction(storeName, mode);\n }\n };\n\n const withStore = async <T>(\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore, transaction: IDBTransaction) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(storeName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const getEntries = async () =>\n orderEntries(\n await withStore(\"readonly\", (store) =>\n requestToPromise(store.getAll() as IDBRequest<IndexedDbLogEntry[]>),\n ),\n );\n\n const countEntries = async (): Promise<number | undefined> =>\n withStore(\"readonly\", (store) => {\n const maybeStore = store as IDBObjectStore & {\n count?: () => IDBRequest<number>;\n };\n if (typeof maybeStore.count !== \"function\") return undefined;\n return requestToPromise(maybeStore.count.call(store));\n });\n\n const deleteEntries = async (entries: readonly IndexedDbLogEntry[], reason: string) => {\n if (entries.length === 0) return;\n await withStore(\"readwrite\", async (store) => {\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Deletes are sequenced for fake IDB compatibility.\n await requestToPromise(store.delete(entry.id));\n dropPersistedEntry(entry, reason);\n }\n });\n };\n\n const deleteByCursor = async (\n reason: string,\n openCursor: (store: IDBObjectStore) => IDBRequest<IDBCursorWithValue | null> | undefined,\n shouldDelete: (entry: IndexedDbLogEntry, deleted: number) => boolean,\n ): Promise<number | undefined> =>\n withStore(\"readwrite\", async (store) => {\n const request = openCursor(store);\n if (!request) return undefined;\n let deleted = 0;\n await iterateCursor(request, (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldDelete(entry, deleted)) return false;\n cursor.delete();\n deleted += 1;\n dropPersistedEntry(entry, reason);\n return true;\n });\n return deleted;\n });\n\n const deleteExpiredByCursor = async (cutoff: number): Promise<number | undefined> => {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n const range = IDBKeyRange.upperBound(cutoff, true);\n return deleteByCursor(\n \"ttl\",\n (store) => getStoreIndex(store, \"createdAt\")?.openCursor(range),\n () => true,\n );\n };\n\n const deleteOldestByCursor = async (\n reason: string,\n count: number,\n ): Promise<number | undefined> => {\n if (count <= 0) return 0;\n return deleteByCursor(\n reason,\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (_entry, deleted) => deleted < count,\n );\n };\n\n const deleteOldestBytesByCursor = async (bytesToFree: number): Promise<number | undefined> => {\n if (bytesToFree <= 0) return 0;\n let freed = 0;\n return deleteByCursor(\n \"max-bytes\",\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (entry) => {\n if (freed >= bytesToFree) return false;\n freed += entry.byteLength;\n return true;\n },\n );\n };\n\n const sumBytesByCursor = async (): Promise<number | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(store, ORDER_INDEX_NAME);\n if (!index) return undefined;\n let total = 0;\n await iterateCursor(index.openCursor(), (cursor) => {\n total += (cursor.value as IndexedDbLogEntry).byteLength;\n });\n return total;\n });\n\n const queryEntriesByCursor = async (\n queryOptions: IndexedDbTransportQueryOptions,\n ): Promise<IndexedDbLogEntry[] | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(store, ORDER_INDEX_NAME);\n if (!index) return undefined;\n const entries: IndexedDbLogEntry[] = [];\n const limit = queryOptions.limit;\n if (limit !== undefined && limit <= 0) return entries;\n await iterateCursor(\n index.openCursor(\n orderRangeForQuery(queryOptions),\n queryOptions.order === \"desc\" ? \"prev\" : \"next\",\n ),\n (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldKeepEntry(entry, queryOptions)) return true;\n entries.push(entry);\n return limit === undefined || entries.length < limit;\n },\n );\n return entries;\n });\n\n const pruneWithEntries = async () => {\n const now = Date.now();\n let entries = await getEntries();\n const expired =\n options.ttlMs === undefined\n ? []\n : entries.filter((entry) => now - entry.createdAt > (options.ttlMs as number));\n if (expired.length > 0) {\n await deleteEntries(expired, \"ttl\");\n const expiredIds = new Set(expired.map((entry) => entry.id));\n entries = entries.filter((entry) => !expiredIds.has(entry.id));\n }\n\n if (maxEntries >= 0 && entries.length > maxEntries) {\n const dropped = entries.slice(0, entries.length - maxEntries);\n await deleteEntries(dropped, \"max-entries\");\n entries = entries.slice(entries.length - maxEntries);\n }\n\n if (maxBytes >= 0) {\n let total = entries.reduce((sum, entry) => sum + entry.byteLength, 0);\n const dropped: IndexedDbLogEntry[] = [];\n for (const entry of entries) {\n if (total <= maxBytes) break;\n total -= entry.byteLength;\n dropped.push(entry);\n }\n await deleteEntries(dropped, \"max-bytes\");\n }\n };\n\n const pruneWithCursors = async (): Promise<boolean> => {\n if (options.ttlMs !== undefined) {\n const deleted = await deleteExpiredByCursor(Date.now() - options.ttlMs);\n if (deleted === undefined) return false;\n }\n\n if (maxEntries >= 0) {\n const persistedCount = await countEntries();\n if (persistedCount === undefined) return false;\n if (persistedCount > maxEntries) {\n const deleted = await deleteOldestByCursor(\"max-entries\", persistedCount - maxEntries);\n if (deleted === undefined) return false;\n }\n }\n\n if (maxBytes >= 0) {\n const totalBytes = await sumBytesByCursor();\n if (totalBytes === undefined) return false;\n if (totalBytes > maxBytes) {\n const deleted = await deleteOldestBytesByCursor(totalBytes - maxBytes);\n if (deleted === undefined) return false;\n }\n }\n\n return true;\n };\n\n const prune = async () => {\n const startedAt = nowMs();\n try {\n if (await pruneWithCursors()) return;\n statsState.pruneFallbacks += 1;\n await pruneWithEntries();\n } finally {\n statsState.prunes += 1;\n statsState.lastPruneDurationMs = nowMs() - startedAt;\n }\n };\n\n const eventToEntry = (event: LogEvent): IndexedDbLogEntry => {\n const payload = codec.encode(event);\n return {\n id: event.id,\n seq: event.seq,\n createdAt: event.time,\n level: event.level,\n levelName: event.levelName,\n logger: event.logger,\n type: event.type,\n byteLength: payloadByteLength(payload),\n payload,\n };\n };\n\n const writeBatch = async (events: readonly LogEvent[]) => {\n if (events.length === 0) return;\n const startedAt = nowMs();\n statsState.lastFlushBatchSize = events.length;\n const entries = events.map(eventToEntry);\n try {\n await withStore(\"readwrite\", (store) => {\n for (const entry of entries) {\n store.put(entry);\n }\n });\n statsState.persisted += entries.length;\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted\", entries.length);\n await prune();\n statsState.flushes += 1;\n } catch (error) {\n statsState.flushErrors += 1;\n throw error;\n } finally {\n statsState.lastFlushDurationMs = nowMs() - startedAt;\n }\n };\n\n const clearTimer = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n\n const flushPending = async () => {\n if (flushPromise) return flushPromise;\n clearTimer();\n const batch = buffer.splice(0, buffer.length);\n flushPromise = writeBatch(batch).finally(() => {\n flushPromise = undefined;\n if (buffer.length > 0 && !closed) schedule();\n });\n return flushPromise;\n };\n\n const schedule = () => {\n if (timer || flushIntervalMs <= 0 || closed) return;\n timer = setTimeout(() => {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n }, flushIntervalMs);\n };\n\n const onPageHide = () => {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"pagehide-flush\"));\n };\n\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"visibility-flush\"));\n }\n };\n\n if (flushOnPageHide) {\n globalThis.addEventListener?.(\"pagehide\", onPageHide);\n globalThis.addEventListener?.(\"visibilitychange\", onVisibilityChange);\n }\n\n return {\n name: options.name ?? \"indexeddb\",\n minLevel: options.minLevel,\n log(event, context) {\n if (closed) return;\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n lastContext = context;\n if (maxBufferSize === 0 || buffer.length >= maxBufferSize) {\n if (dropPolicy === \"drop-newest\") {\n dropEvent(event, \"buffer-full\");\n return;\n }\n const dropped = buffer.shift();\n if (dropped) dropEvent(dropped, \"buffer-full\");\n }\n buffer.push(event);\n statsState.enqueued += 1;\n statsState.maxBufferDepth = Math.max(statsState.maxBufferDepth, buffer.length);\n if (buffer.length >= batchSize || flushIntervalMs === 0) {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n } else {\n schedule();\n }\n },\n flush() {\n return flushPending();\n },\n async count() {\n await flushPending();\n return (await countEntries()) ?? (await getEntries()).length;\n },\n async clear() {\n buffer.length = 0;\n clearTimer();\n await withStore(\"readwrite\", (store) => requestToPromise(store.clear()));\n },\n async remove(ids) {\n await flushPending();\n const items = typeof ids === \"string\" ? [ids] : ids;\n if (items.length === 0) return;\n await withStore(\"readwrite\", async (store) => {\n for (const id of items) {\n // oxlint-disable-next-line no-await-in-loop -- Deletes must preserve fake IDB transaction ordering.\n await requestToPromise(store.delete(id));\n }\n });\n },\n async *query(queryOptions: IndexedDbTransportQueryOptions = {}) {\n await flushPending();\n const startedAt = nowMs();\n const cursorEntries = await queryEntriesByCursor(queryOptions);\n if (cursorEntries === undefined) statsState.queryFallbacks += 1;\n const entries =\n cursorEntries ??\n orderEntries(await getEntries(), queryOptions.order ?? \"asc\")\n .filter((entry) => shouldKeepEntry(entry, queryOptions))\n .slice(0, queryOptions.limit);\n statsState.queries += 1;\n statsState.lastQueryDurationMs = nowMs() - startedAt;\n for (const entry of entries) {\n const event = decodeEntry(entry, codec);\n if (event) yield event;\n }\n },\n stats() {\n return snapshotStats();\n },\n close() {\n closed = true;\n clearTimer();\n globalThis.removeEventListener?.(\"pagehide\", onPageHide);\n globalThis.removeEventListener?.(\"visibilitychange\", onVisibilityChange);\n const flushed = flushPending();\n const promise = dbPromise;\n dbPromise = undefined;\n return flushed.finally(() => {\n void promise?.then((db) => db.close());\n });\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n recordToEvent,\n retryTransport,\n toLevelValue,\n type LogEvent,\n type LoggerLevel,\n type RetryTransportOptions,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport {\n indexedDbTransport,\n type IndexedDbTransportOptions,\n type IndexedDbTransportQueryOptions,\n} from \"./indexeddb-transport\";\n\nexport interface OfflineFirstQueue {\n log: (event: LogEvent, context: TransportContext) => void | Promise<void>;\n flush?: () => void | Promise<void>;\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n remove: (ids: string | readonly string[]) => Promise<void>;\n count?: () => Promise<number>;\n clear?: () => Promise<void>;\n close?: () => void | Promise<void>;\n}\n\nexport interface OfflineFirstTransportOptions {\n name?: string;\n minLevel?: LoggerLevel;\n queue?: OfflineFirstQueue;\n queueOptions?: IndexedDbTransportOptions;\n replayBatchSize?: number;\n replayOnOnline?: boolean;\n online?: () => boolean;\n retry?: RetryTransportOptions;\n onQueued?: (event: LogEvent, error?: unknown) => void;\n onReplayed?: (events: readonly LogEvent[]) => void;\n}\n\nexport interface OfflineFirstTransport extends Transport {\n replay: () => Promise<void>;\n queuedCount: () => Promise<number | undefined>;\n clearQueue: () => Promise<void>;\n queue: OfflineFirstQueue;\n}\n\nfunction normalizeBatchSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return 100;\n return Math.floor(value);\n}\n\nasync function collectBatch(\n queue: OfflineFirstQueue,\n replayBatchSize: number,\n): Promise<LogEvent[]> {\n const events: LogEvent[] = [];\n for await (const event of queue.query({ order: \"asc\", limit: replayBatchSize })) {\n events.push(event);\n }\n return events;\n}\n\nfunction isBrowserOnline(options: OfflineFirstTransportOptions): boolean {\n if (options.online) return options.online();\n if (typeof navigator === \"undefined\") return true;\n return navigator.onLine !== false;\n}\n\nexport function offlineFirstTransport(\n remote: Transport,\n options: OfflineFirstTransportOptions = {},\n): OfflineFirstTransport {\n const name = options.name ?? `offline-first(${remote.name ?? \"transport\"})`;\n const replayBatchSize = normalizeBatchSize(options.replayBatchSize);\n const queue: OfflineFirstQueue =\n options.queue ??\n (indexedDbTransport({\n dbName: \"loggerjs-offline\",\n flushIntervalMs: 0,\n name: `${name}:queue`,\n storeName: \"offline-events\",\n ...options.queueOptions,\n }) as OfflineFirstQueue);\n const reliableRemote = retryTransport(remote, {\n maxRetries: 2,\n retryBaseDelayMs: 250,\n retryMaxDelayMs: 5000,\n ...options.retry,\n name: `${name}:remote`,\n }) as Transport & {\n log: NonNullable<Transport[\"log\"]>;\n logBatch: NonNullable<Transport[\"logBatch\"]>;\n };\n let lastContext: TransportContext | undefined;\n let replayPromise: Promise<void> | undefined;\n\n const replayContext: TransportContext = {\n loggerName: name,\n now: () => Date.now(),\n toEvent: recordToEvent,\n reportInternalError() {},\n };\n\n const contextForReplay = () => lastContext ?? replayContext;\n\n const reportInternalError = (error: unknown, operation: string) => {\n contextForReplay().reportInternalError(error, {\n phase: \"transport\",\n transport: name,\n operation,\n });\n };\n\n const queueEvent = async (event: LogEvent, context: TransportContext, error?: unknown) => {\n await queue.log(event, context);\n await queue.flush?.();\n incrementLoggerMetaCounter(\"transport.offline.queued\");\n options.onQueued?.(event, error);\n };\n\n const sendRemoteBatch = async (events: readonly LogEvent[], context: TransportContext) => {\n await reliableRemote.logBatch?.([...events], context);\n };\n\n const sendOrQueue = async (event: LogEvent, context: TransportContext) => {\n lastContext = context;\n if (!isBrowserOnline(options)) {\n await queueEvent(event, context);\n return;\n }\n\n try {\n await reliableRemote.log?.(event, context);\n } catch (error) {\n incrementLoggerMetaCounter(\"transport.offline.remote.failed\");\n await queueEvent(event, context, error);\n }\n };\n\n const replay = async () => {\n if (replayPromise) return replayPromise;\n replayPromise = (async () => {\n if (!isBrowserOnline(options)) return;\n const context = contextForReplay();\n await queue.flush?.();\n\n for (;;) {\n // oxlint-disable-next-line no-await-in-loop -- Replay reads the next durable batch after prior deletes settle.\n const batch = await collectBatch(queue, replayBatchSize);\n if (batch.length === 0) return;\n try {\n // oxlint-disable-next-line no-await-in-loop -- Replay removes durable entries only after delivery succeeds.\n await sendRemoteBatch(batch, context);\n // oxlint-disable-next-line no-await-in-loop -- Delete only the delivered ids before reading the next batch.\n await queue.remove(batch.map((event) => event.id));\n incrementLoggerMetaCounter(\"transport.offline.replayed\", batch.length);\n options.onReplayed?.(batch);\n } catch (error) {\n incrementLoggerMetaCounter(\"transport.offline.replay.failed\");\n reportInternalError(error, \"replay\");\n throw error;\n }\n }\n })().finally(() => {\n replayPromise = undefined;\n });\n return replayPromise;\n };\n\n const onOnline = () => {\n void replay().catch((error: unknown) => reportInternalError(error, \"online-replay\"));\n };\n\n if (options.replayOnOnline ?? true) {\n globalThis.addEventListener?.(\"online\", onOnline);\n }\n\n return {\n name,\n minLevel: options.minLevel ?? remote.minLevel,\n queue,\n write(record, context) {\n return sendOrQueue(context.toEvent(record), context);\n },\n writeBatch(records, context) {\n return Promise.all(\n records.map((record) => sendOrQueue(context.toEvent(record), context)),\n ).then(() => undefined);\n },\n log(event, context) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n return sendOrQueue(event, context);\n },\n logBatch(events, context) {\n return Promise.all(\n events.map((event) =>\n options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)\n ? undefined\n : sendOrQueue(event, context),\n ),\n ).then(() => undefined);\n },\n replay,\n async flush() {\n await replay();\n await reliableRemote.flush?.();\n await queue.flush?.();\n },\n flushSync() {\n reliableRemote.flushSync?.();\n },\n async close() {\n globalThis.removeEventListener?.(\"online\", onOnline);\n await replay();\n await reliableRemote.close?.();\n await queue.close?.();\n },\n async queuedCount() {\n await queue.flush?.();\n return queue.count?.();\n },\n async clearQueue() {\n await queue.clear?.();\n },\n };\n}\n","import { safeJsonStringify, type LogEvent, type SafeStringifyOptions } from \"@loggerjs/core\";\nimport type { IndexedDbTransportQueryOptions } from \"./indexeddb-transport\";\n\nexport type LogZipExportFormat = \"ndjson\" | \"json\";\n\nexport interface ZipExportFile {\n name: string;\n content: string | Uint8Array | ArrayBuffer;\n lastModified?: number;\n}\n\nexport interface LogZipBlobOptions {\n lastModified?: number;\n type?: string;\n}\n\nexport interface LogZipExportQuerySource {\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n}\n\nexport type LogZipExportSource = AsyncIterable<LogEvent> | LogZipExportQuerySource;\n\nexport interface LogZipExportManifest {\n schema: \"loggerjs.log-export.v1\";\n createdAt: string;\n source?: string;\n format: LogZipExportFormat;\n logFileName: string;\n logCount: number;\n skippedCount: number;\n query?: IndexedDbTransportQueryOptions;\n timeRange?: {\n from: number;\n to: number;\n };\n}\n\nexport interface LogZipExportOptions {\n query?: IndexedDbTransportQueryOptions;\n format?: LogZipExportFormat;\n logFileName?: string;\n includeManifest?: boolean;\n manifestFileName?: string;\n source?: string;\n createdAt?: number;\n maxEvents?: number;\n stringify?: SafeStringifyOptions;\n serializeEvent?: (event: LogEvent) => string;\n mapEvent?: (event: LogEvent) => LogEvent | false | null | undefined;\n}\n\nexport interface DownloadBlobOptions {\n filename?: string;\n document?: Document;\n url?: Pick<typeof URL, \"createObjectURL\" | \"revokeObjectURL\">;\n revokeDelayMs?: number;\n}\n\ninterface NormalizedZipFile {\n name: string;\n nameBytes: Uint8Array;\n contentBytes: Uint8Array;\n crc32: number;\n modifiedTime: number;\n modifiedDate: number;\n localHeaderOffset: number;\n}\n\nconst ZIP_UTF8_FLAG = 0x0800;\nconst ZIP_STORE_METHOD = 0;\nconst ZIP_VERSION = 20;\nconst ZIP_MAX_UINT16 = 0xffff;\nconst ZIP_MAX_UINT32 = 0xffffffff;\nconst LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50;\n\nlet crc32Table: Uint32Array | undefined;\n\nfunction getCrc32Table(): Uint32Array {\n if (crc32Table) return crc32Table;\n const table = new Uint32Array(256);\n for (let index = 0; index < table.length; index += 1) {\n let crc = index;\n for (let bit = 0; bit < 8; bit += 1) {\n crc = crc & 1 ? 0xedb88320 ^ (crc >>> 1) : crc >>> 1;\n }\n table[index] = crc >>> 0;\n }\n crc32Table = table;\n return table;\n}\n\nfunction crc32(bytes: Uint8Array): number {\n const table = getCrc32Table();\n let crc = 0xffffffff;\n for (const byte of bytes) {\n crc = (crc >>> 8) ^ (table[(crc ^ byte) & 0xff] ?? 0);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction encodeText(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nfunction normalizeFileContent(content: ZipExportFile[\"content\"]): Uint8Array {\n if (typeof content === \"string\") return encodeText(content);\n if (content instanceof Uint8Array) return content;\n return new Uint8Array(content);\n}\n\nfunction normalizeZipFileName(name: string): string {\n const normalized = name\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .filter((part) => part.length > 0 && part !== \".\" && part !== \"..\")\n .join(\"/\");\n if (!normalized) throw new Error(\"ZIP file name cannot be empty\");\n return normalized;\n}\n\nfunction toDosDateTime(timestamp: number): { time: number; date: number } {\n const date = new Date(Number.isFinite(timestamp) ? timestamp : Date.now());\n const year = Math.min(2107, Math.max(1980, date.getFullYear()));\n return {\n time: (date.getHours() << 11) | (date.getMinutes() << 5) | Math.floor(date.getSeconds() / 2),\n date: ((year - 1980) << 9) | ((date.getMonth() + 1) << 5) | date.getDate(),\n };\n}\n\nfunction assertZipUint16(value: number, label: string) {\n if (!Number.isSafeInteger(value) || value < 0 || value > ZIP_MAX_UINT16) {\n throw new Error(`${label} exceeds ZIP32 limit`);\n }\n}\n\nfunction assertZipUint32(value: number, label: string) {\n if (!Number.isSafeInteger(value) || value < 0 || value > ZIP_MAX_UINT32) {\n throw new Error(`${label} exceeds ZIP32 limit`);\n }\n}\n\nfunction createLocalFileHeader(file: NormalizedZipFile): Uint8Array {\n const header = new Uint8Array(30);\n const view = new DataView(header.buffer);\n view.setUint32(0, LOCAL_FILE_HEADER_SIGNATURE, true);\n view.setUint16(4, ZIP_VERSION, true);\n view.setUint16(6, ZIP_UTF8_FLAG, true);\n view.setUint16(8, ZIP_STORE_METHOD, true);\n view.setUint16(10, file.modifiedTime, true);\n view.setUint16(12, file.modifiedDate, true);\n view.setUint32(14, file.crc32, true);\n view.setUint32(18, file.contentBytes.byteLength, true);\n view.setUint32(22, file.contentBytes.byteLength, true);\n view.setUint16(26, file.nameBytes.byteLength, true);\n view.setUint16(28, 0, true);\n return header;\n}\n\nfunction createCentralDirectoryHeader(file: NormalizedZipFile): Uint8Array {\n const header = new Uint8Array(46);\n const view = new DataView(header.buffer);\n view.setUint32(0, CENTRAL_DIRECTORY_SIGNATURE, true);\n view.setUint16(4, ZIP_VERSION, true);\n view.setUint16(6, ZIP_VERSION, true);\n view.setUint16(8, ZIP_UTF8_FLAG, true);\n view.setUint16(10, ZIP_STORE_METHOD, true);\n view.setUint16(12, file.modifiedTime, true);\n view.setUint16(14, file.modifiedDate, true);\n view.setUint32(16, file.crc32, true);\n view.setUint32(20, file.contentBytes.byteLength, true);\n view.setUint32(24, file.contentBytes.byteLength, true);\n view.setUint16(28, file.nameBytes.byteLength, true);\n view.setUint16(30, 0, true);\n view.setUint16(32, 0, true);\n view.setUint16(34, 0, true);\n view.setUint16(36, 0, true);\n view.setUint32(38, 0, true);\n view.setUint32(42, file.localHeaderOffset, true);\n return header;\n}\n\nfunction createEndOfCentralDirectory(\n fileCount: number,\n centralDirectorySize: number,\n centralDirectoryOffset: number,\n): Uint8Array {\n assertZipUint16(fileCount, \"ZIP file count\");\n assertZipUint32(centralDirectorySize, \"ZIP central directory size\");\n assertZipUint32(centralDirectoryOffset, \"ZIP central directory offset\");\n\n const footer = new Uint8Array(22);\n const view = new DataView(footer.buffer);\n view.setUint32(0, END_OF_CENTRAL_DIRECTORY_SIGNATURE, true);\n view.setUint16(4, 0, true);\n view.setUint16(6, 0, true);\n view.setUint16(8, fileCount, true);\n view.setUint16(10, fileCount, true);\n view.setUint32(12, centralDirectorySize, true);\n view.setUint32(16, centralDirectoryOffset, true);\n view.setUint16(20, 0, true);\n return footer;\n}\n\nfunction createNormalizedZipFiles(\n files: readonly ZipExportFile[],\n options: LogZipBlobOptions,\n): NormalizedZipFile[] {\n const names = new Set<string>();\n let offset = 0;\n return files.map((file) => {\n const name = normalizeZipFileName(file.name);\n if (names.has(name)) throw new Error(`Duplicate ZIP file name: ${name}`);\n names.add(name);\n\n const nameBytes = encodeText(name);\n const contentBytes = normalizeFileContent(file.content);\n assertZipUint16(nameBytes.byteLength, `ZIP file name ${name}`);\n assertZipUint32(contentBytes.byteLength, `ZIP file ${name}`);\n assertZipUint32(offset, \"ZIP local header offset\");\n\n const modified = toDosDateTime(file.lastModified ?? options.lastModified ?? Date.now());\n const normalized: NormalizedZipFile = {\n name,\n nameBytes,\n contentBytes,\n crc32: crc32(contentBytes),\n modifiedTime: modified.time,\n modifiedDate: modified.date,\n localHeaderOffset: offset,\n };\n offset += 30 + nameBytes.byteLength + contentBytes.byteLength;\n assertZipUint32(offset, \"ZIP local data size\");\n return normalized;\n });\n}\n\nfunction isQuerySource(source: LogZipExportSource): source is LogZipExportQuerySource {\n return \"query\" in source && typeof source.query === \"function\";\n}\n\nfunction resolveSource(\n source: LogZipExportSource,\n query: IndexedDbTransportQueryOptions | undefined,\n): AsyncIterable<LogEvent> {\n if (isQuerySource(source)) return source.query(query);\n if (query) throw new Error(\"Log ZIP export query options require a source with query()\");\n return source;\n}\n\nfunction normalizeMaxEvents(value: number | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (!Number.isFinite(value)) return undefined;\n return Math.max(0, Math.floor(value));\n}\n\nexport function createLogZipBlob(\n files: readonly ZipExportFile[],\n options: LogZipBlobOptions = {},\n): Blob {\n const normalizedFiles = createNormalizedZipFiles(files, options);\n const parts: Uint8Array[] = [];\n let centralDirectoryOffset = 0;\n for (const file of normalizedFiles) {\n parts.push(createLocalFileHeader(file), file.nameBytes, file.contentBytes);\n centralDirectoryOffset += 30 + file.nameBytes.byteLength + file.contentBytes.byteLength;\n }\n\n let centralDirectorySize = 0;\n for (const file of normalizedFiles) {\n const header = createCentralDirectoryHeader(file);\n parts.push(header, file.nameBytes);\n centralDirectorySize += header.byteLength + file.nameBytes.byteLength;\n }\n parts.push(\n createEndOfCentralDirectory(\n normalizedFiles.length,\n centralDirectorySize,\n centralDirectoryOffset,\n ),\n );\n\n return new Blob(parts as unknown as BlobPart[], { type: options.type ?? \"application/zip\" });\n}\n\nexport async function exportLogsToZip(\n source: LogZipExportSource,\n options: LogZipExportOptions = {},\n): Promise<Blob> {\n const format = options.format ?? \"ndjson\";\n const createdAt = options.createdAt ?? Date.now();\n const logFileName = options.logFileName ?? (format === \"json\" ? \"logs.json\" : \"logs.ndjson\");\n const maxEvents = normalizeMaxEvents(options.maxEvents);\n const serialize =\n options.serializeEvent ??\n ((event: LogEvent) => safeJsonStringify(event, options.stringify ?? {}));\n const lines: string[] = [];\n let skippedCount = 0;\n let from: number | undefined;\n let to: number | undefined;\n\n for await (const event of resolveSource(source, options.query)) {\n if (maxEvents !== undefined && lines.length >= maxEvents) break;\n const mapped = options.mapEvent ? options.mapEvent(event) : event;\n if (!mapped) {\n skippedCount += 1;\n continue;\n }\n lines.push(serialize(mapped));\n from = from === undefined ? mapped.time : Math.min(from, mapped.time);\n to = to === undefined ? mapped.time : Math.max(to, mapped.time);\n }\n\n const logContent =\n format === \"json\" ? `[${lines.join(\",\")}]` : lines.length > 0 ? `${lines.join(\"\\n\")}\\n` : \"\";\n\n const files: ZipExportFile[] = [\n {\n name: logFileName,\n content: logContent,\n lastModified: createdAt,\n },\n ];\n\n if (options.includeManifest ?? true) {\n const manifest: LogZipExportManifest = {\n schema: \"loggerjs.log-export.v1\",\n createdAt: new Date(createdAt).toISOString(),\n source: options.source,\n format,\n logFileName: normalizeZipFileName(logFileName),\n logCount: lines.length,\n skippedCount,\n query: options.query,\n timeRange: from === undefined || to === undefined ? undefined : { from, to },\n };\n files.push({\n name: options.manifestFileName ?? \"manifest.json\",\n content: `${safeJsonStringify(manifest, { space: 2 })}\\n`,\n lastModified: createdAt,\n });\n }\n\n return createLogZipBlob(files, { lastModified: createdAt });\n}\n\nexport function downloadBlob(\n blob: Blob,\n filenameOrOptions: string | DownloadBlobOptions = {},\n): string {\n const options =\n typeof filenameOrOptions === \"string\" ? { filename: filenameOrOptions } : filenameOrOptions;\n const documentRef = options.document ?? globalThis.document;\n const urlRef = options.url ?? globalThis.URL;\n if (!documentRef?.body || !urlRef?.createObjectURL || !urlRef.revokeObjectURL) {\n throw new Error(\"downloadBlob requires document and URL.createObjectURL\");\n }\n\n const href = urlRef.createObjectURL(blob);\n const anchor = documentRef.createElement(\"a\");\n anchor.href = href;\n anchor.download = options.filename ?? \"loggerjs-logs.zip\";\n anchor.style.display = \"none\";\n documentRef.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n\n const revoke = () => urlRef.revokeObjectURL(href);\n const revokeDelayMs = options.revokeDelayMs ?? 1000;\n if (revokeDelayMs <= 0) {\n revoke();\n } else {\n setTimeout(revoke, revokeDelayMs);\n }\n\n return href;\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\ntype ConsoleLevel = \"debug\" | \"info\" | \"log\" | \"trace\" | \"warn\" | \"error\";\n\ntype ConsoleRecord = Partial<Record<ConsoleLevel, (...args: unknown[]) => void>>;\n\nconst defaultLevels: ConsoleLevel[] = [\"debug\", \"info\", \"log\", \"trace\", \"warn\", \"error\"];\n\nconst levelMap: Record<ConsoleLevel, LoggerLevel> = {\n debug: \"debug\",\n info: \"info\",\n log: \"info\",\n trace: \"trace\",\n warn: \"warn\",\n error: \"error\",\n};\n\nexport interface CaptureConsoleOptions {\n levels?: ConsoleLevel[];\n preserveConsole?: boolean;\n captureArguments?: boolean;\n maxCapturesPerSecond?: number;\n}\n\nfunction formatConsoleMessage(args: unknown[]): string {\n return args\n .map((arg) => {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return arg.message;\n try {\n return JSON.stringify(\n normalizeValue(arg, { maxDepth: 3, maxArrayLength: 20, maxObjectKeys: 40 }),\n );\n } catch {\n return String(arg);\n }\n })\n .join(\" \");\n}\n\nfunction reportRateLimitDrop() {\n incrementLoggerMetaCounter(\"integration.dropped\");\n incrementLoggerMetaCounter(\"integration.dropped.rate-limit\");\n}\n\nexport function captureConsoleIntegration(options: CaptureConsoleOptions = {}): Integration {\n const levels = options.levels ?? defaultLevels;\n const preserveConsole = options.preserveConsole ?? true;\n const captureArguments = options.captureArguments ?? false;\n const maxCapturesPerSecond = options.maxCapturesPerSecond ?? 100;\n\n return {\n name: \"capture-console\",\n setup(api: IntegrationSetupContext) {\n if (typeof console === \"undefined\") return;\n const originals: ConsoleRecord = {};\n const boundOriginals: ConsoleRecord = {};\n let windowStarted = Date.now();\n let capturesInWindow = 0;\n let disposed = false;\n\n const shouldCapture = () => {\n const now = Date.now();\n if (now - windowStarted >= 1000) {\n windowStarted = now;\n capturesInWindow = 0;\n }\n if (capturesInWindow >= maxCapturesPerSecond) {\n reportRateLimitDrop();\n return false;\n }\n capturesInWindow += 1;\n return true;\n };\n\n for (const level of levels) {\n const original = (console as unknown as ConsoleRecord)[level] ?? console.log.bind(console);\n originals[level] = original;\n const unpatched = api.unpatched.console[level] ?? original;\n api.unpatched.console[level] ??= original;\n boundOriginals[level] = unpatched.bind(console);\n\n const capture = api.guard((args: unknown[]) => {\n if (!shouldCapture()) return;\n const consoleData: Record<string, unknown> = { level };\n if (captureArguments) {\n consoleData.arguments = normalizeValue(args, { maxDepth: 4 });\n }\n api.capture({\n level: levelMap[level],\n message: formatConsoleMessage(args),\n props: { console: consoleData },\n });\n });\n\n (console as unknown as ConsoleRecord)[level] = (...args: unknown[]) => {\n capture(args);\n if (preserveConsole) boundOriginals[level]?.(...args);\n };\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const level of levels) {\n if (originals[level]) (console as unknown as ConsoleRecord)[level] = originals[level];\n }\n };\n },\n };\n}\n","import {\n addContextProvider,\n formatBaggage,\n formatTraceparent,\n parseBaggage,\n parseTraceparent,\n type Baggage,\n type Integration,\n type TraceContext,\n} from \"@loggerjs/core\";\n\nexport type BrowserContextActionEventName = \"change\" | \"click\" | \"input\" | \"keydown\" | \"submit\";\n\nexport interface BrowserContextEventTargetLike {\n addEventListener: typeof globalThis.addEventListener;\n removeEventListener: typeof globalThis.removeEventListener;\n}\n\nexport interface BrowserContextPropagationOptions {\n sessionId?: string | (() => string | undefined);\n requestId?: () => string | undefined;\n trace?: TraceContext | (() => TraceContext | undefined);\n traceparent?: string | (() => string | undefined);\n baggage?: Baggage | string | (() => Baggage | string | undefined);\n actionEvents?: readonly BrowserContextActionEventName[];\n actionTtlMs?: number;\n root?: BrowserContextEventTargetLike;\n clock?: () => number;\n idFactory?: () => string;\n}\n\nconst defaultActionEvents: readonly BrowserContextActionEventName[] = [\n \"click\",\n \"input\",\n \"change\",\n \"submit\",\n];\n\nlet fallbackIdSeq = 0;\n\nfunction defaultIdFactory(): string {\n const cryptoRandomUUID = globalThis.crypto?.randomUUID;\n if (cryptoRandomUUID) return cryptoRandomUUID.call(globalThis.crypto);\n return `${Date.now().toString(36)}-${(fallbackIdSeq++).toString(36)}`;\n}\n\nfunction resolveValue<T>(value: T | (() => T | undefined) | undefined): T | undefined {\n return typeof value === \"function\" ? (value as () => T | undefined)() : value;\n}\n\nfunction normalizeBaggage(value: Baggage | string | undefined): Baggage | undefined {\n if (typeof value === \"string\") return parseBaggage(value);\n return value;\n}\n\nfunction actionTargetName(target: EventTarget | null): string | undefined {\n const item = target as { tagName?: string; id?: string; name?: string } | null;\n if (!item) return undefined;\n return item.id || item.name || item.tagName?.toLowerCase();\n}\n\nexport function browserContextPropagationIntegration(\n options: BrowserContextPropagationOptions = {},\n): Integration {\n const actionEvents = options.actionEvents ?? defaultActionEvents;\n const actionTtlMs = Math.max(0, Math.floor(options.actionTtlMs ?? 5000));\n const clock = options.clock ?? Date.now;\n const idFactory = options.idFactory ?? defaultIdFactory;\n let lastAction:\n | {\n id: string;\n type: string;\n target?: string;\n time: number;\n }\n | undefined;\n\n return {\n name: \"browser-context-propagation\",\n setup() {\n const root = options.root ?? globalThis.document;\n const disposeProvider = addContextProvider(() => {\n const sessionId = resolveValue(options.sessionId);\n const requestId = options.requestId?.();\n const explicitTrace = resolveValue(options.trace);\n const trace = explicitTrace ?? parseTraceparent(resolveValue(options.traceparent));\n const baggage = normalizeBaggage(resolveValue(options.baggage)) ?? trace?.baggage;\n const traceparent = formatTraceparent(trace);\n const now = clock();\n const action =\n lastAction && now - lastAction.time <= actionTtlMs\n ? {\n actionId: lastAction.id,\n actionType: lastAction.type,\n actionTarget: lastAction.target,\n }\n : undefined;\n\n return {\n sessionId,\n requestId,\n traceparent,\n baggage: formatBaggage(baggage),\n ...action,\n };\n });\n\n if (!root?.addEventListener || !root.removeEventListener || actionEvents.length === 0) {\n return disposeProvider;\n }\n\n const onAction = (event: Event) => {\n lastAction = {\n id: idFactory(),\n type: event.type,\n target: actionTargetName(event.target),\n time: clock(),\n };\n };\n\n for (const event of actionEvents) root.addEventListener(event, onAction, true);\n\n return () => {\n for (const event of actionEvents) root.removeEventListener(event, onAction, true);\n disposeProvider();\n };\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n} from \"@loggerjs/core\";\n\nexport interface CaptureBrowserErrorsOptions {\n captureWindowError?: boolean;\n captureUnhandledRejection?: boolean;\n captureResourceErrors?: boolean;\n captureSecurityPolicyViolation?: boolean;\n scriptErrorDedupeWindowMs?: number;\n}\n\nfunction resourceInfo(target: unknown): Record<string, unknown> {\n const element = target as {\n tagName?: string;\n src?: string;\n href?: string;\n currentSrc?: string;\n outerHTML?: string;\n } | null;\n return {\n tagName: element?.tagName,\n url: element?.src || element?.currentSrc || element?.href,\n html: element?.outerHTML?.slice(0, 500),\n };\n}\n\nfunction reportDrop(reason: string) {\n incrementLoggerMetaCounter(\"integration.dropped\");\n incrementLoggerMetaCounter(`integration.dropped.${reason}`);\n}\n\nexport function captureBrowserErrorsIntegration(\n options: CaptureBrowserErrorsOptions = {},\n): Integration {\n const captureWindowError = options.captureWindowError ?? true;\n const captureUnhandledRejection = options.captureUnhandledRejection ?? true;\n const captureResourceErrors = options.captureResourceErrors ?? true;\n const captureSecurityPolicyViolation = options.captureSecurityPolicyViolation ?? false;\n const scriptErrorDedupeWindowMs = options.scriptErrorDedupeWindowMs ?? 1000;\n\n return {\n name: \"capture-browser-errors\",\n setup(api: IntegrationSetupContext) {\n const disposers: Array<() => void> = [];\n let lastScriptErrorAt = 0;\n let disposed = false;\n\n const shouldDropScriptError = (message: string | undefined) => {\n if (message !== \"Script error.\") return false;\n const now = Date.now();\n if (now - lastScriptErrorAt <= scriptErrorDedupeWindowMs) {\n reportDrop(\"script-error-duplicate\");\n return true;\n }\n lastScriptErrorAt = now;\n return false;\n };\n\n if (captureWindowError && typeof addEventListener !== \"undefined\") {\n const onError = api.guard((event: ErrorEvent | Event) => {\n const errorEvent = event as ErrorEvent;\n if (\"message\" in errorEvent && shouldDropScriptError(errorEvent.message)) return;\n\n if (\"error\" in errorEvent && errorEvent.error) {\n api.capture({\n level: \"error\",\n message: errorEvent.message || errorEvent.error.message,\n error: errorEvent.error,\n props: {\n browser: {\n kind: \"script-error\",\n file: errorEvent.filename,\n line: errorEvent.lineno,\n column: errorEvent.colno,\n },\n },\n });\n return;\n }\n\n if (\"message\" in errorEvent && errorEvent.message) {\n api.capture({\n level: \"error\",\n message: errorEvent.message,\n props: {\n browser: {\n kind: \"script-error\",\n file: errorEvent.filename,\n line: errorEvent.lineno,\n column: errorEvent.colno,\n },\n },\n });\n return;\n }\n\n if (captureResourceErrors) {\n api.capture({\n level: \"error\",\n message: \"Browser resource load error\",\n props: {\n browser: {\n kind: \"resource-error\",\n ...resourceInfo((event as Event).target),\n },\n },\n });\n }\n });\n addEventListener(\"error\", onError, true);\n disposers.push(() => removeEventListener(\"error\", onError, true));\n }\n\n if (captureUnhandledRejection && typeof addEventListener !== \"undefined\") {\n const onUnhandledRejection = api.guard((event: PromiseRejectionEvent) => {\n const reason = event.reason;\n api.capture({\n level: \"error\",\n message: reason instanceof Error ? reason.message : \"Unhandled promise rejection\",\n error: reason,\n props: {\n browser: { kind: \"unhandledrejection\" },\n reason: normalizeValue(reason, { maxDepth: 5 }),\n },\n });\n });\n addEventListener(\"unhandledrejection\", onUnhandledRejection);\n disposers.push(() => removeEventListener(\"unhandledrejection\", onUnhandledRejection));\n }\n\n if (captureSecurityPolicyViolation && typeof addEventListener !== \"undefined\") {\n const onSecurityPolicyViolation = api.guard((event: SecurityPolicyViolationEvent) => {\n api.capture({\n level: \"warn\",\n message: `Security policy violation: ${event.violatedDirective}`,\n props: {\n browser: {\n kind: \"securitypolicyviolation\",\n blockedURI: event.blockedURI,\n documentURI: event.documentURI,\n file: event.sourceFile,\n line: event.lineNumber,\n column: event.columnNumber,\n originalPolicy: event.originalPolicy,\n effectiveDirective: event.effectiveDirective,\n },\n },\n });\n });\n addEventListener(\"securitypolicyviolation\", onSecurityPolicyViolation);\n disposers.push(() =>\n removeEventListener(\"securitypolicyviolation\", onSecurityPolicyViolation),\n );\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","export function nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nexport function durationMs(started: number): number {\n return nowMs() - started;\n}\n\nexport function sanitizeHttpUrl(rawUrl: string, sanitizer?: (url: string) => string): string {\n const stripped = stripSensitiveUrlParts(rawUrl);\n return sanitizer ? sanitizer(stripped) : stripped;\n}\n\nexport function pickAllowedHeaders(\n headers: Headers | undefined,\n allowList: readonly string[] | undefined,\n): Record<string, string> | undefined {\n if (!headers || !allowList || allowList.length === 0) return undefined;\n const out: Record<string, string> = {};\n for (const name of allowList) {\n const value = headers.get(name);\n if (value !== null) out[name.toLowerCase()] = value;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function headersFromInit(headers: HeadersInit | undefined): Headers | undefined {\n if (!headers) return undefined;\n try {\n return new Headers(headers);\n } catch {\n return undefined;\n }\n}\n\nexport function shouldSample(sampleRate: number, random: () => number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n return random() < sampleRate;\n}\n\nfunction stripSensitiveUrlParts(rawUrl: string): string {\n if (!/^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(rawUrl)) {\n return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;\n }\n\n try {\n const url = new URL(rawUrl);\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n } catch {\n return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;\n }\n}\n","import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type UnpatchedFunction,\n} from \"@loggerjs/core\";\nimport {\n durationMs,\n headersFromInit,\n nowMs,\n pickAllowedHeaders,\n sanitizeHttpUrl,\n shouldSample,\n} from \"./http-capture-utils\";\n\nexport interface CaptureFetchOptions {\n minStatus?: number;\n captureRequestHeaders?: readonly string[];\n captureResponseHeaders?: readonly string[];\n captureAll?: boolean;\n captureSuccessful?: boolean;\n sampleRate?: number;\n random?: () => number;\n sanitizeUrl?: (url: string) => string;\n}\n\ntype BrowserFetch = typeof fetch;\n\nfunction requestUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction requestMethod(input: RequestInfo | URL, init?: RequestInit): string {\n if (init?.method) return init.method.toUpperCase();\n if (typeof input === \"object\" && \"method\" in input && input.method)\n return input.method.toUpperCase();\n return \"GET\";\n}\n\nexport function captureFetchIntegration(options: CaptureFetchOptions = {}): Integration {\n const minStatus = options.minStatus ?? 400;\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-fetch\",\n setup(api: IntegrationSetupContext) {\n const current = globalThis.fetch;\n if (!current) return;\n const original =\n (api.unpatched.fetch as BrowserFetch | undefined) ?? current.bind(globalThis);\n api.unpatched.fetch ??= original as UnpatchedFunction;\n\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n\n globalThis.fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const started = nowMs();\n const url = sanitizeHttpUrl(requestUrl(input), options.sanitizeUrl);\n const method = requestMethod(input, init);\n try {\n const response = await original(input, init);\n const shouldCapture =\n response.status >= minStatus || (captureAll && shouldSample(sampleRate, random));\n if (shouldCapture) {\n capture({\n level: response.status >= minStatus ? \"warn\" : \"debug\",\n message: `Fetch ${response.status} ${method} ${url}`,\n props: {\n http: {\n kind: \"fetch\",\n method,\n url,\n status: response.status,\n ok: response.ok,\n durationMs: durationMs(started),\n requestHeaders: pickAllowedHeaders(\n headersFromInit(init?.headers),\n options.captureRequestHeaders,\n ),\n responseHeaders: pickAllowedHeaders(\n response.headers,\n options.captureResponseHeaders,\n ),\n },\n },\n });\n }\n return response;\n } catch (error) {\n capture({\n level: \"error\",\n message: `Fetch network error ${method} ${url}`,\n error,\n props: {\n http: { kind: \"fetch\", method, url, durationMs: durationMs(started) },\n input: normalizeValue(input, { maxDepth: 3 }),\n },\n });\n throw error;\n }\n };\n\n return () => {\n globalThis.fetch = current;\n };\n },\n };\n}\n","import type { CaptureInput, Integration, IntegrationSetupContext } from \"@loggerjs/core\";\nimport { durationMs, nowMs, sanitizeHttpUrl, shouldSample } from \"./http-capture-utils\";\n\nexport interface CaptureXHROptions {\n minStatus?: number;\n captureAll?: boolean;\n captureSuccessful?: boolean;\n sampleRate?: number;\n random?: () => number;\n sanitizeUrl?: (url: string) => string;\n}\n\ninterface XHRMeta {\n method: string;\n url: string;\n started: number;\n}\n\nconst XHR_META = \"__LOGGERJS_XHR_META__\";\n\nexport function captureXHRIntegration(options: CaptureXHROptions = {}): Integration {\n const minStatus = options.minStatus ?? 400;\n const captureAll = options.captureAll ?? options.captureSuccessful ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-xhr\",\n setup(api: IntegrationSetupContext) {\n if (typeof XMLHttpRequest === \"undefined\") return;\n const proto = XMLHttpRequest.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n api.unpatched.XMLHttpRequest ??= XMLHttpRequest as unknown;\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n\n proto.open = function patchedOpen(\n this: XMLHttpRequest,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n (this as unknown as Record<string, XHRMeta>)[XHR_META] = {\n method: method.toUpperCase(),\n url: sanitizeHttpUrl(String(url), options.sanitizeUrl),\n started: 0,\n };\n return (originalOpen as unknown as (...args: unknown[]) => void).apply(this, [\n method,\n url,\n ...rest,\n ]);\n };\n\n proto.send = function patchedSend(\n this: XMLHttpRequest,\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const meta = (this as unknown as Record<string, XHRMeta>)[XHR_META];\n if (meta) meta.started = nowMs();\n let captured = false;\n\n const onLoadEnd = () => {\n if (!meta || captured) return;\n const shouldCapture =\n this.status >= minStatus || (captureAll && shouldSample(sampleRate, random));\n if (shouldCapture) {\n captured = true;\n capture({\n level: this.status >= minStatus ? \"warn\" : \"debug\",\n message: `XHR ${this.status} ${meta.method} ${meta.url}`,\n props: {\n http: {\n kind: \"xhr\",\n method: meta.method,\n url: meta.url,\n status: this.status,\n durationMs: durationMs(meta.started),\n },\n },\n });\n }\n };\n\n const onError = () => {\n if (!meta || captured) return;\n captured = true;\n capture({\n level: \"error\",\n message: `XHR network error ${meta.method} ${meta.url}`,\n props: {\n http: {\n kind: \"xhr\",\n method: meta.method,\n url: meta.url,\n durationMs: durationMs(meta.started),\n },\n },\n });\n };\n\n this.addEventListener(\"loadend\", onLoadEnd, { once: true });\n this.addEventListener(\"error\", onError, { once: true });\n return (originalSend as unknown as (...args: unknown[]) => void).apply(this, [body]);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport type BrowserFrameworkName = \"angular\" | \"react\" | \"solid\" | \"svelte\" | \"vue\" | string;\n\nexport interface BrowserFrameworkErrorInfo {\n framework?: BrowserFrameworkName;\n componentName?: string;\n componentStack?: string;\n info?: unknown;\n props?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface CaptureFrameworkErrorsOptions {\n name?: string;\n framework?: BrowserFrameworkName;\n level?: LoggerLevel;\n maxPending?: number;\n infoMaxDepth?: number;\n getMessage?: (error: unknown, info: BrowserFrameworkErrorInfo) => string;\n}\n\nexport interface BrowserFrameworkErrorIntegration extends Integration {\n capture: (error: unknown, info?: BrowserFrameworkErrorInfo | string) => void;\n reactComponentDidCatch: (error: unknown, errorInfo?: { componentStack?: string }) => void;\n vueErrorHandler: (error: unknown, instance?: unknown, info?: string) => void;\n solidErrorHandler: (error: unknown) => void;\n svelteErrorHandler: (error: unknown, info?: BrowserFrameworkErrorInfo | string) => void;\n}\n\ninterface PendingFrameworkError {\n error: unknown;\n info?: BrowserFrameworkErrorInfo | string;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Framework error\";\n}\n\nfunction instanceComponentName(instance: unknown): string | undefined {\n const record = instance as\n | {\n constructor?: { name?: string };\n $options?: { name?: string };\n type?: { name?: string; displayName?: string };\n }\n | undefined;\n return (\n record?.$options?.name ??\n record?.type?.displayName ??\n record?.type?.name ??\n record?.constructor?.name\n );\n}\n\nfunction normalizeFrameworkInfo(\n input: BrowserFrameworkErrorInfo | string | undefined,\n fallbackFramework: BrowserFrameworkName,\n): BrowserFrameworkErrorInfo {\n if (typeof input === \"string\") return { framework: fallbackFramework, info: input };\n return { framework: fallbackFramework, ...input };\n}\n\nexport function captureFrameworkErrorsIntegration(\n options: CaptureFrameworkErrorsOptions = {},\n): BrowserFrameworkErrorIntegration {\n const integrationName = options.name ?? \"capture-framework-errors\";\n const fallbackFramework = options.framework ?? \"framework\";\n const level = options.level ?? \"error\";\n const maxPending = Math.max(0, Math.floor(options.maxPending ?? 10));\n const infoMaxDepth = options.infoMaxDepth ?? 6;\n const pending: PendingFrameworkError[] = [];\n let api: IntegrationSetupContext | undefined;\n let started = false;\n let disposed = false;\n\n const emit = (error: unknown, rawInfo?: BrowserFrameworkErrorInfo | string) => {\n const info = normalizeFrameworkInfo(rawInfo, fallbackFramework);\n const message = options.getMessage?.(error, info) ?? errorMessage(error);\n api?.capture({\n level,\n message,\n error,\n props: {\n browser: {\n kind: \"framework-error\",\n framework: info.framework,\n componentName: info.componentName,\n componentStack: info.componentStack,\n info: normalizeValue(info.info, { maxDepth: infoMaxDepth, maxObjectKeys: 80 }),\n props: normalizeValue(info.props, { maxDepth: infoMaxDepth, maxObjectKeys: 80 }),\n },\n },\n });\n };\n\n const capture = (error: unknown, info?: BrowserFrameworkErrorInfo | string) => {\n if (api) {\n emit(error, info);\n return;\n }\n if (started || disposed || pending.length >= maxPending) return;\n pending.push({ error, info });\n };\n\n const integration: BrowserFrameworkErrorIntegration = {\n name: integrationName,\n setup(nextApi) {\n api = nextApi;\n started = true;\n disposed = false;\n for (const item of pending.splice(0)) emit(item.error, item.info);\n return () => {\n api = undefined;\n disposed = true;\n };\n },\n capture,\n reactComponentDidCatch(error, errorInfo) {\n capture(error, {\n framework: \"react\",\n componentStack: errorInfo?.componentStack,\n });\n },\n vueErrorHandler(error, instance, info) {\n capture(error, {\n framework: \"vue\",\n componentName: instanceComponentName(instance),\n info,\n });\n },\n solidErrorHandler(error) {\n capture(error, { framework: \"solid\" });\n },\n svelteErrorHandler(error, info) {\n capture(error, normalizeFrameworkInfo(info, \"svelte\"));\n },\n };\n\n return integration;\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface FrameworkRouterIntegrationOptions {\n level?: LoggerLevel;\n sanitizeUrl?: (url: string) => string;\n includeState?: boolean;\n}\n\nexport interface NextRouterLike {\n asPath?: string;\n events?: {\n on?: (event: string, listener: (url: string) => void) => void;\n off?: (event: string, listener: (url: string) => void) => void;\n };\n}\n\nexport interface ReactRouterHistoryLike {\n location?: unknown;\n listen?: (listener: (update: unknown) => void) => void | (() => void);\n}\n\nexport interface VueRouterLike {\n currentRoute?: unknown;\n afterEach?: (listener: (to: unknown, from: unknown) => void) => void | (() => void);\n}\n\nexport interface NextRouterIntegrationOptions extends FrameworkRouterIntegrationOptions {\n router: NextRouterLike;\n}\n\nexport interface ReactRouterIntegrationOptions extends FrameworkRouterIntegrationOptions {\n history: ReactRouterHistoryLike;\n}\n\nexport interface VueRouterIntegrationOptions extends FrameworkRouterIntegrationOptions {\n router: VueRouterLike;\n framework?: \"vue-router\" | \"nuxt\";\n}\n\nfunction routePath(input: unknown): string {\n if (typeof input === \"string\") return input;\n if (input && typeof input === \"object\") {\n const route = input as {\n fullPath?: string;\n pathname?: string;\n path?: string;\n location?: unknown;\n };\n if (typeof route.fullPath === \"string\") return route.fullPath;\n if (typeof route.pathname === \"string\") return route.pathname;\n if (typeof route.path === \"string\") return route.path;\n if (route.location) return routePath(route.location);\n }\n return \"\";\n}\n\nfunction emitRouteChange(\n api: IntegrationSetupContext,\n framework: string,\n level: LoggerLevel,\n to: unknown,\n from: unknown,\n options: FrameworkRouterIntegrationOptions,\n) {\n const sanitize = options.sanitizeUrl;\n const toPath = sanitize ? sanitize(routePath(to)) : routePath(to);\n const fromPath =\n from === undefined ? undefined : sanitize ? sanitize(routePath(from)) : routePath(from);\n api.capture({\n level,\n message: `${framework} route ${toPath}`,\n props: {\n browser: {\n kind: \"framework-route-change\",\n framework,\n route: {\n to: toPath,\n from: fromPath,\n state: options.includeState ? normalizeValue(to, { maxDepth: 4 }) : undefined,\n },\n },\n },\n });\n}\n\nexport function nextRouterIntegration(options: NextRouterIntegrationOptions): Integration {\n const level = options.level ?? \"info\";\n return {\n name: \"next-router\",\n setup(api) {\n const router = options.router;\n if (!router.events?.on || !router.events.off) return;\n const onRoute = api.guard((url: string) =>\n emitRouteChange(api, \"next\", level, url, router.asPath, options),\n );\n router.events.on(\"routeChangeComplete\", onRoute);\n router.events.on(\"hashChangeComplete\", onRoute);\n return () => {\n router.events?.off?.(\"routeChangeComplete\", onRoute);\n router.events?.off?.(\"hashChangeComplete\", onRoute);\n };\n },\n };\n}\n\nexport function reactRouterIntegration(options: ReactRouterIntegrationOptions): Integration {\n const level = options.level ?? \"info\";\n return {\n name: \"react-router\",\n setup(api) {\n let previous = options.history.location;\n const dispose = options.history.listen?.(\n api.guard((update: unknown) => {\n const next = (update as { location?: unknown })?.location ?? update;\n emitRouteChange(api, \"react-router\", level, next, previous, options);\n previous = next;\n }),\n );\n return typeof dispose === \"function\" ? dispose : undefined;\n },\n };\n}\n\nexport function vueRouterIntegration(options: VueRouterIntegrationOptions): Integration {\n const level = options.level ?? \"info\";\n const framework = options.framework ?? \"vue-router\";\n return {\n name: framework,\n setup(api) {\n const dispose = options.router.afterEach?.(\n api.guard((to: unknown, from: unknown) =>\n emitRouteChange(api, framework, level, to, from, options),\n ),\n );\n return typeof dispose === \"function\" ? dispose : undefined;\n },\n };\n}\n\nexport function nuxtRouterIntegration(\n options: Omit<VueRouterIntegrationOptions, \"framework\">,\n): Integration {\n return vueRouterIntegration({ ...options, framework: \"nuxt\" });\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserReportLike {\n type?: string;\n url?: string;\n body?: unknown;\n toJSON?: () => unknown;\n}\n\nexport interface BrowserReportingObserverLike {\n observe: () => void;\n disconnect: () => void;\n takeRecords?: () => BrowserReportLike[];\n}\n\nexport interface BrowserReportingObserverConstructor {\n new (\n callback: (reports: BrowserReportLike[], observer: BrowserReportingObserverLike) => void,\n options?: { buffered?: boolean; types?: readonly string[] },\n ): BrowserReportingObserverLike;\n}\n\nexport interface BrowserReportPayload {\n type: string;\n url?: string;\n body?: unknown;\n}\n\nexport interface BrowserCspViolationPayload {\n type: \"securitypolicyviolation\";\n blockedURI?: string;\n documentURI?: string;\n effectiveDirective?: string;\n violatedDirective?: string;\n disposition?: string;\n sourceFile?: string;\n lineNumber?: number;\n columnNumber?: number;\n statusCode?: number;\n sample?: string;\n}\n\nexport interface CaptureReportingOptions {\n captureSecurityPolicyViolation?: boolean;\n captureReportingObserver?: boolean;\n reportTypes?: readonly string[];\n level?:\n | LoggerLevel\n | ((report: BrowserReportPayload | BrowserCspViolationPayload) => LoggerLevel);\n buffered?: boolean;\n sanitizeUrl?: (url: string) => string;\n ReportingObserver?: BrowserReportingObserverConstructor;\n addEventListener?: typeof globalThis.addEventListener;\n removeEventListener?: typeof globalThis.removeEventListener;\n}\n\nconst defaultReportTypes = [\"csp-violation\", \"deprecation\", \"intervention\", \"crash\"] as const;\n\nfunction levelFor(\n level: CaptureReportingOptions[\"level\"],\n report: BrowserReportPayload | BrowserCspViolationPayload,\n): LoggerLevel {\n if (typeof level === \"function\") return level(report);\n if (level) return level;\n return report.type === \"deprecation\" ? \"info\" : \"warn\";\n}\n\nfunction maybeSanitize(\n url: string | undefined,\n sanitizeUrl: ((url: string) => string) | undefined,\n) {\n return url && sanitizeUrl ? sanitizeUrl(url) : url;\n}\n\nfunction normalizeReport(\n report: BrowserReportLike,\n sanitizeUrl: ((url: string) => string) | undefined,\n): BrowserReportPayload {\n const raw = typeof report.toJSON === \"function\" ? report.toJSON() : report;\n const record = raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n const body = \"body\" in record ? record.body : report.body;\n const url = typeof record.url === \"string\" ? record.url : report.url;\n const type = typeof record.type === \"string\" ? record.type : (report.type ?? \"unknown\");\n return {\n type,\n url: maybeSanitize(url, sanitizeUrl),\n body: normalizeValue(body, { maxDepth: 6, maxObjectKeys: 80 }),\n };\n}\n\nfunction normalizeCspViolation(\n event: SecurityPolicyViolationEvent,\n sanitizeUrl: ((url: string) => string) | undefined,\n): BrowserCspViolationPayload {\n return {\n type: \"securitypolicyviolation\",\n blockedURI: maybeSanitize(event.blockedURI, sanitizeUrl),\n documentURI: maybeSanitize(event.documentURI, sanitizeUrl),\n effectiveDirective: event.effectiveDirective,\n violatedDirective: event.violatedDirective,\n disposition: event.disposition,\n sourceFile: maybeSanitize(event.sourceFile, sanitizeUrl),\n lineNumber: event.lineNumber,\n columnNumber: event.columnNumber,\n statusCode: event.statusCode,\n sample: event.sample,\n };\n}\n\nexport function captureReportingIntegration(options: CaptureReportingOptions = {}): Integration {\n const captureSecurityPolicyViolation = options.captureSecurityPolicyViolation ?? true;\n const captureReportingObserver = options.captureReportingObserver ?? true;\n const reportTypes = options.reportTypes ?? defaultReportTypes;\n const buffered = options.buffered ?? true;\n\n return {\n name: \"capture-reporting\",\n setup(api: IntegrationSetupContext) {\n const add = options.addEventListener ?? globalThis.addEventListener?.bind(globalThis);\n const remove =\n options.removeEventListener ?? globalThis.removeEventListener?.bind(globalThis);\n const Observer =\n options.ReportingObserver ??\n (globalThis as unknown as { ReportingObserver?: BrowserReportingObserverConstructor })\n .ReportingObserver;\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const captureReport = api.guard((report: BrowserReportPayload) => {\n if (disposed) return;\n api.capture({\n level: levelFor(options.level, report),\n message: `Browser report ${report.type}`,\n props: { browser: { kind: \"report\", report } },\n });\n });\n\n if (captureSecurityPolicyViolation && add && remove) {\n const onViolation = api.guard((event: SecurityPolicyViolationEvent) => {\n const report = normalizeCspViolation(event, options.sanitizeUrl);\n api.capture({\n level: levelFor(options.level, report),\n message: `Security policy violation: ${report.effectiveDirective ?? report.violatedDirective ?? \"unknown\"}`,\n props: { browser: { kind: \"securitypolicyviolation\", report } },\n });\n });\n add(\"securitypolicyviolation\", onViolation);\n disposers.push(() => remove(\"securitypolicyviolation\", onViolation));\n }\n\n if (captureReportingObserver && Observer) {\n try {\n const observer = new Observer(\n (reports) => {\n for (const report of reports)\n captureReport(normalizeReport(report, options.sanitizeUrl));\n },\n { buffered, types: reportTypes },\n );\n observer.observe();\n disposers.push(() => {\n for (const report of observer.takeRecords?.() ?? [])\n captureReport(normalizeReport(report, options.sanitizeUrl));\n observer.disconnect();\n });\n } catch {\n // ReportingObserver is still uneven across browsers; failures should not break setup.\n }\n }\n\n return () => {\n if (disposed) return;\n for (const dispose of disposers) dispose();\n disposed = true;\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserHistoryLike {\n state?: unknown;\n pushState?: (data: unknown, unused: string, url?: string | URL | null) => unknown;\n replaceState?: (data: unknown, unused: string, url?: string | URL | null) => unknown;\n}\n\nexport interface BrowserLocationLike {\n href?: string;\n pathname?: string;\n search?: string;\n hash?: string;\n}\n\nexport type BrowserRouteTrigger =\n | \"initial\"\n | \"pushState\"\n | \"replaceState\"\n | \"popstate\"\n | \"hashchange\";\nexport type BrowserRouteUrlMode = \"path\" | \"href\";\n\nexport interface BrowserRouteChangePayload {\n trigger: BrowserRouteTrigger;\n from?: string;\n to: string;\n state?: unknown;\n}\n\nexport interface CaptureRouterOptions {\n level?: LoggerLevel;\n captureInitial?: boolean;\n includeState?: boolean;\n stateMaxDepth?: number;\n urlMode?: BrowserRouteUrlMode;\n sanitizeUrl?: (url: string) => string;\n history?: BrowserHistoryLike;\n location?: BrowserLocationLike;\n addEventListener?: typeof globalThis.addEventListener;\n removeEventListener?: typeof globalThis.removeEventListener;\n}\n\nfunction locationHref(location: BrowserLocationLike | undefined): string {\n if (!location) return \"http://localhost/\";\n if (location.href) return location.href;\n return `${location.pathname ?? \"/\"}${location.search ?? \"\"}${location.hash ?? \"\"}`;\n}\n\nfunction normalizeRouteUrl(\n url: string | URL | null | undefined,\n location: BrowserLocationLike | undefined,\n mode: BrowserRouteUrlMode,\n sanitizeUrl: ((url: string) => string) | undefined,\n): string {\n const fallback = locationHref(location);\n const raw = url === undefined || url === null ? fallback : String(url);\n let normalized = raw;\n try {\n const parsed = new URL(raw, fallback);\n normalized = mode === \"href\" ? parsed.href : `${parsed.pathname}${parsed.search}${parsed.hash}`;\n } catch {\n normalized = raw;\n }\n return sanitizeUrl ? sanitizeUrl(normalized) : normalized;\n}\n\nfunction routeState(includeState: boolean, state: unknown, maxDepth: number): unknown {\n return includeState ? normalizeValue(state, { maxDepth, maxObjectKeys: 80 }) : undefined;\n}\n\nexport function captureRouterIntegration(options: CaptureRouterOptions = {}): Integration {\n const level = options.level ?? \"info\";\n const captureInitial = options.captureInitial ?? true;\n const includeState = options.includeState ?? false;\n const stateMaxDepth = options.stateMaxDepth ?? 4;\n const urlMode = options.urlMode ?? \"path\";\n\n return {\n name: \"capture-router\",\n setup(api: IntegrationSetupContext) {\n const history = options.history ?? globalThis.history;\n const location = options.location ?? globalThis.location;\n const add = options.addEventListener ?? globalThis.addEventListener?.bind(globalThis);\n const remove =\n options.removeEventListener ?? globalThis.removeEventListener?.bind(globalThis);\n const originalPushState = history?.pushState;\n const originalReplaceState = history?.replaceState;\n let current = normalizeRouteUrl(undefined, location, urlMode, options.sanitizeUrl);\n let disposed = false;\n\n const capture = (trigger: BrowserRouteTrigger, to: string, state?: unknown) => {\n if (disposed) return;\n const previous = current;\n current = to;\n if (trigger !== \"initial\" && previous === to) return;\n const route: BrowserRouteChangePayload = {\n trigger,\n from: trigger === \"initial\" ? undefined : previous,\n to,\n state: routeState(includeState, state, stateMaxDepth),\n };\n api.capture({\n level,\n message: trigger === \"initial\" ? `Route initial ${to}` : `Route change ${to}`,\n props: { browser: { kind: \"route-change\", route } },\n });\n };\n\n if (captureInitial) capture(\"initial\", current, history?.state);\n\n if (history && originalPushState) {\n history.pushState = function pushState(\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ) {\n const result = originalPushState.call(this, data, unused, url);\n capture(\n \"pushState\",\n normalizeRouteUrl(url, location, urlMode, options.sanitizeUrl),\n data,\n );\n return result;\n };\n }\n\n if (history && originalReplaceState) {\n history.replaceState = function replaceState(\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ) {\n const result = originalReplaceState.call(this, data, unused, url);\n capture(\n \"replaceState\",\n normalizeRouteUrl(url, location, urlMode, options.sanitizeUrl),\n data,\n );\n return result;\n };\n }\n\n const onPopState = api.guard((event: PopStateEvent) => {\n capture(\n \"popstate\",\n normalizeRouteUrl(undefined, location, urlMode, options.sanitizeUrl),\n event.state,\n );\n });\n const onHashChange = api.guard((event: HashChangeEvent) => {\n capture(\n \"hashchange\",\n normalizeRouteUrl(event.newURL, location, urlMode, options.sanitizeUrl),\n history?.state,\n );\n });\n\n add?.(\"popstate\", onPopState);\n add?.(\"hashchange\", onHashChange);\n\n return () => {\n if (disposed) return;\n disposed = true;\n if (history && originalPushState) history.pushState = originalPushState;\n if (history && originalReplaceState) history.replaceState = originalReplaceState;\n remove?.(\"popstate\", onPopState);\n remove?.(\"hashchange\", onHashChange);\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserExtensionEventLike<TListener extends (...args: never[]) => unknown> {\n addListener?: (listener: TListener) => void;\n removeListener?: (listener: TListener) => void;\n}\n\nexport interface BrowserExtensionRuntimeLike {\n id?: string;\n getManifest?: () => { name?: string; version?: string };\n onMessage?: BrowserExtensionEventLike<\n (message: unknown, sender?: BrowserExtensionMessageSenderLike) => unknown\n >;\n onInstalled?: BrowserExtensionEventLike<(details: unknown) => void>;\n}\n\nexport interface BrowserExtensionMessageSenderLike {\n id?: string;\n origin?: string;\n url?: string;\n tab?: {\n id?: number;\n url?: string;\n };\n}\n\nexport interface ElectronIpcRendererLike {\n on?: (channel: string, listener: (...args: unknown[]) => void) => unknown;\n off?: (channel: string, listener: (...args: unknown[]) => void) => unknown;\n removeListener?: (channel: string, listener: (...args: unknown[]) => void) => unknown;\n send?: (channel: string, ...args: unknown[]) => void;\n invoke?: (channel: string, ...args: unknown[]) => Promise<unknown>;\n}\n\nexport interface CaptureRuntimeHostOptions {\n level?: LoggerLevel;\n captureExtensionMessages?: boolean;\n captureExtensionInstalled?: boolean;\n captureExtensionMessageData?: boolean;\n captureElectronMessages?: boolean;\n captureElectronSend?: boolean;\n captureElectronInvoke?: boolean;\n captureElectronMessageData?: boolean;\n electronChannels?: readonly string[];\n extensionRuntime?: BrowserExtensionRuntimeLike;\n ipcRenderer?: ElectronIpcRendererLike;\n sanitizeUrl?: (url: string) => string;\n}\n\nconst textEncoder = new TextEncoder();\n\nfunction byteLength(value: unknown): number | undefined {\n if (typeof value === \"string\") return textEncoder.encode(value).byteLength;\n if (value instanceof ArrayBuffer) return value.byteLength;\n if (ArrayBuffer.isView(value)) return value.byteLength;\n return undefined;\n}\n\nfunction valueSummary(value: unknown, includeData: boolean): Record<string, unknown> {\n return {\n dataType:\n typeof value === \"object\" && value\n ? ((value as { constructor?: { name?: string } }).constructor?.name ?? \"object\")\n : typeof value,\n byteLength: byteLength(value),\n data: includeData ? normalizeValue(value, { maxDepth: 4, maxObjectKeys: 80 }) : undefined,\n };\n}\n\nfunction senderInfo(\n sender: BrowserExtensionMessageSenderLike | undefined,\n sanitizeUrl: ((url: string) => string) | undefined,\n) {\n if (!sender) return undefined;\n const sanitize = (url: string | undefined) => (url && sanitizeUrl ? sanitizeUrl(url) : url);\n return {\n id: sender.id,\n origin: sender.origin,\n url: sanitize(sender.url),\n tab: sender.tab\n ? {\n id: sender.tab.id,\n url: sanitize(sender.tab.url),\n }\n : undefined,\n };\n}\n\nfunction defaultExtensionRuntime(): BrowserExtensionRuntimeLike | undefined {\n const global = globalThis as unknown as {\n browser?: { runtime?: BrowserExtensionRuntimeLike };\n chrome?: { runtime?: BrowserExtensionRuntimeLike };\n };\n return global.browser?.runtime ?? global.chrome?.runtime;\n}\n\nfunction defaultIpcRenderer(): ElectronIpcRendererLike | undefined {\n const global = globalThis as unknown as {\n electron?: { ipcRenderer?: ElectronIpcRendererLike };\n require?: (id: string) => unknown;\n };\n if (global.electron?.ipcRenderer) return global.electron.ipcRenderer;\n try {\n return (global.require?.(\"electron\") as { ipcRenderer?: ElectronIpcRendererLike } | undefined)\n ?.ipcRenderer;\n } catch {\n return undefined;\n }\n}\n\nexport function captureRuntimeHostIntegration(\n options: CaptureRuntimeHostOptions = {},\n): Integration {\n const level = options.level ?? \"debug\";\n const captureExtensionMessages = options.captureExtensionMessages ?? true;\n const captureExtensionInstalled = options.captureExtensionInstalled ?? true;\n const captureExtensionMessageData = options.captureExtensionMessageData ?? false;\n const captureElectronMessages = options.captureElectronMessages ?? true;\n const captureElectronSend = options.captureElectronSend ?? true;\n const captureElectronInvoke = options.captureElectronInvoke ?? true;\n const captureElectronMessageData = options.captureElectronMessageData ?? false;\n const electronChannels = options.electronChannels ?? [];\n\n return {\n name: \"capture-runtime-host\",\n setup(api: IntegrationSetupContext) {\n const extensionRuntime = options.extensionRuntime ?? defaultExtensionRuntime();\n const ipcRenderer = options.ipcRenderer ?? defaultIpcRenderer();\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const capture = api.guard((input: Parameters<IntegrationSetupContext[\"capture\"]>[0]) => {\n if (!disposed) api.capture(input);\n });\n\n if (extensionRuntime) {\n const manifest = extensionRuntime.getManifest?.();\n\n if (captureExtensionMessages && extensionRuntime.onMessage?.addListener) {\n const onMessage = (message: unknown, sender?: BrowserExtensionMessageSenderLike) => {\n capture({\n level,\n message: \"Browser extension message\",\n props: {\n browser: {\n kind: \"extension-message\",\n extension: {\n id: extensionRuntime.id,\n name: manifest?.name,\n version: manifest?.version,\n },\n message: valueSummary(message, captureExtensionMessageData),\n sender: senderInfo(sender, options.sanitizeUrl),\n },\n },\n });\n };\n extensionRuntime.onMessage.addListener(onMessage as never);\n disposers.push(() => extensionRuntime.onMessage?.removeListener?.(onMessage as never));\n }\n\n if (captureExtensionInstalled && extensionRuntime.onInstalled?.addListener) {\n const onInstalled = (details: unknown) => {\n capture({\n level,\n message: \"Browser extension installed\",\n props: {\n browser: {\n kind: \"extension-installed\",\n extension: {\n id: extensionRuntime.id,\n name: manifest?.name,\n version: manifest?.version,\n },\n details: normalizeValue(details, { maxDepth: 4, maxObjectKeys: 80 }),\n },\n },\n });\n };\n extensionRuntime.onInstalled.addListener(onInstalled as never);\n disposers.push(() =>\n extensionRuntime.onInstalled?.removeListener?.(onInstalled as never),\n );\n }\n }\n\n if (ipcRenderer) {\n if (captureElectronMessages && ipcRenderer.on) {\n for (const channel of electronChannels) {\n const listener = (_event: unknown, ...args: unknown[]) => {\n capture({\n level,\n message: `Electron IPC message ${channel}`,\n props: {\n browser: {\n kind: \"electron-ipc\",\n direction: \"incoming\",\n channel,\n args: args.map((arg) => valueSummary(arg, captureElectronMessageData)),\n },\n },\n });\n };\n ipcRenderer.on(channel, listener);\n disposers.push(() => {\n if (ipcRenderer.off) ipcRenderer.off(channel, listener);\n else ipcRenderer.removeListener?.(channel, listener);\n });\n }\n }\n\n if (captureElectronSend && ipcRenderer.send) {\n const originalSend = ipcRenderer.send;\n ipcRenderer.send = (channel: string, ...args: unknown[]) => {\n capture({\n level,\n message: `Electron IPC send ${channel}`,\n props: {\n browser: {\n kind: \"electron-ipc\",\n direction: \"outgoing\",\n channel,\n args: args.map((arg) => valueSummary(arg, captureElectronMessageData)),\n },\n },\n });\n return originalSend.call(ipcRenderer, channel, ...args);\n };\n disposers.push(() => {\n ipcRenderer.send = originalSend;\n });\n }\n\n if (captureElectronInvoke && ipcRenderer.invoke) {\n const originalInvoke = ipcRenderer.invoke;\n ipcRenderer.invoke = (channel: string, ...args: unknown[]) => {\n capture({\n level,\n message: `Electron IPC invoke ${channel}`,\n props: {\n browser: {\n kind: \"electron-ipc\",\n direction: \"invoke\",\n channel,\n args: args.map((arg) => valueSummary(arg, captureElectronMessageData)),\n },\n },\n });\n return originalInvoke.call(ipcRenderer, channel, ...args);\n };\n disposers.push(() => {\n ipcRenderer.invoke = originalInvoke;\n });\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import {\n normalizeValue,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\n\nexport interface BrowserServiceWorkerControllerLike {\n scriptURL?: string;\n state?: string;\n}\n\nexport interface BrowserServiceWorkerContainerEventsLike {\n controller?: BrowserServiceWorkerControllerLike | null;\n addEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener: (type: string, listener: EventListenerOrEventListenerObject) => void;\n}\n\nexport interface BrowserServiceWorkerMessagePayload {\n dataType: string;\n byteLength?: number;\n data?: unknown;\n origin?: string;\n lastEventId?: string;\n}\n\nexport interface CaptureServiceWorkerOptions {\n level?: LoggerLevel;\n captureControllerChange?: boolean;\n captureMessages?: boolean;\n captureMessageErrors?: boolean;\n captureMessageData?: boolean;\n serviceWorker?: BrowserServiceWorkerContainerEventsLike;\n sanitizeUrl?: (url: string) => string;\n}\n\nconst textEncoder = new TextEncoder();\n\nfunction dataType(data: unknown): string {\n if (typeof data === \"string\") return \"string\";\n if (data instanceof ArrayBuffer) return \"arraybuffer\";\n if (ArrayBuffer.isView(data)) return data.constructor.name;\n const record = data as { constructor?: { name?: string } } | undefined;\n return record?.constructor?.name ?? typeof data;\n}\n\nfunction dataByteLength(data: unknown): number | undefined {\n if (typeof data === \"string\") return textEncoder.encode(data).byteLength;\n if (data instanceof ArrayBuffer) return data.byteLength;\n if (ArrayBuffer.isView(data)) return data.byteLength;\n const size = (data as { size?: unknown } | undefined)?.size;\n return typeof size === \"number\" && Number.isFinite(size) ? size : undefined;\n}\n\nfunction controllerInfo(\n controller: BrowserServiceWorkerControllerLike | null | undefined,\n sanitizeUrl: ((url: string) => string) | undefined,\n) {\n if (!controller) return undefined;\n return {\n scriptURL:\n controller.scriptURL && sanitizeUrl\n ? sanitizeUrl(controller.scriptURL)\n : controller.scriptURL,\n state: controller.state,\n };\n}\n\nfunction messagePayload(\n event: MessageEvent,\n captureMessageData: boolean,\n): BrowserServiceWorkerMessagePayload {\n return {\n dataType: dataType(event.data),\n byteLength: dataByteLength(event.data),\n data: captureMessageData\n ? normalizeValue(event.data, { maxDepth: 4, maxObjectKeys: 80 })\n : undefined,\n origin: event.origin,\n lastEventId: event.lastEventId,\n };\n}\n\nexport function captureServiceWorkerIntegration(\n options: CaptureServiceWorkerOptions = {},\n): Integration {\n const level = options.level ?? \"debug\";\n const captureControllerChange = options.captureControllerChange ?? true;\n const captureMessages = options.captureMessages ?? true;\n const captureMessageErrors = options.captureMessageErrors ?? true;\n const captureMessageData = options.captureMessageData ?? false;\n\n return {\n name: \"capture-service-worker\",\n setup(api: IntegrationSetupContext) {\n const serviceWorker =\n options.serviceWorker ??\n (typeof navigator === \"undefined\" ? undefined : navigator.serviceWorker);\n if (!serviceWorker?.addEventListener || !serviceWorker.removeEventListener) return;\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n const capture = api.guard((input: Parameters<IntegrationSetupContext[\"capture\"]>[0]) => {\n if (!disposed) api.capture(input);\n });\n\n if (captureControllerChange) {\n const onControllerChange = () => {\n capture({\n level,\n message: \"Service worker controller change\",\n props: {\n browser: {\n kind: \"service-worker\",\n event: \"controllerchange\",\n controller: controllerInfo(serviceWorker.controller, options.sanitizeUrl),\n },\n },\n });\n };\n serviceWorker.addEventListener(\"controllerchange\", onControllerChange);\n disposers.push(() =>\n serviceWorker.removeEventListener(\"controllerchange\", onControllerChange),\n );\n }\n\n if (captureMessages) {\n const onMessage = (event: Event) => {\n const message = event as MessageEvent;\n capture({\n level,\n message: \"Service worker message\",\n props: {\n browser: {\n kind: \"service-worker\",\n event: \"message\",\n message: messagePayload(message, captureMessageData),\n },\n },\n });\n };\n serviceWorker.addEventListener(\"message\", onMessage);\n disposers.push(() => serviceWorker.removeEventListener(\"message\", onMessage));\n }\n\n if (captureMessageErrors) {\n const onMessageError = (event: Event) => {\n capture({\n level: \"warn\",\n message: \"Service worker message error\",\n props: {\n browser: {\n kind: \"service-worker\",\n event: \"messageerror\",\n type: event.type,\n },\n },\n });\n };\n serviceWorker.addEventListener(\"messageerror\", onMessageError);\n disposers.push(() => serviceWorker.removeEventListener(\"messageerror\", onMessageError));\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext, LoggerLevel } from \"@loggerjs/core\";\n\nexport type BrowserUserActionEventName =\n | \"change\"\n | \"click\"\n | \"dblclick\"\n | \"input\"\n | \"keydown\"\n | \"submit\";\n\nexport interface BrowserUserActionTarget {\n tagName?: string;\n id?: string;\n name?: string;\n role?: string;\n type?: string;\n href?: string;\n label?: string;\n text?: string;\n value?: string;\n}\n\nexport interface BrowserUserActionPayload {\n type: BrowserUserActionEventName | string;\n target: BrowserUserActionTarget;\n}\n\nexport interface BrowserEventTargetLike {\n addEventListener: typeof globalThis.addEventListener;\n removeEventListener: typeof globalThis.removeEventListener;\n}\n\nexport interface CaptureUserActionsOptions {\n events?: readonly BrowserUserActionEventName[];\n level?: LoggerLevel;\n listenerCapture?: boolean;\n throttleMs?: number;\n captureText?: boolean;\n captureValue?: boolean;\n maxTextLength?: number;\n labelAttributes?: readonly string[];\n root?: BrowserEventTargetLike;\n clock?: () => number;\n sanitize?: (value: string, field: keyof BrowserUserActionTarget) => string;\n ignore?: (event: Event, target: BrowserUserActionTarget) => boolean;\n}\n\ntype ElementLike = {\n tagName?: string;\n id?: string;\n name?: string;\n role?: string;\n type?: string;\n href?: string;\n textContent?: string | null;\n value?: string;\n getAttribute?: (name: string) => string | null;\n};\n\nconst defaultEvents: readonly BrowserUserActionEventName[] = [\"click\", \"input\", \"change\", \"submit\"];\nconst defaultLabelAttributes = [\"data-loggerjs-label\", \"aria-label\", \"name\", \"id\"] as const;\n\nfunction truncate(value: string | undefined, maxLength: number): string | undefined {\n if (!value) return undefined;\n return value.length > maxLength ? value.slice(0, maxLength) : value;\n}\n\nfunction readAttribute(target: ElementLike, name: string): string | undefined {\n const value = target.getAttribute?.(name);\n return value || undefined;\n}\n\nfunction sanitizeField(\n value: string | undefined,\n field: keyof BrowserUserActionTarget,\n sanitize: CaptureUserActionsOptions[\"sanitize\"],\n): string | undefined {\n if (!value) return undefined;\n return sanitize ? sanitize(value, field) : value;\n}\n\nfunction firstLabel(target: ElementLike, attributes: readonly string[]): string | undefined {\n for (const name of attributes) {\n const value = readAttribute(target, name) ?? (target as Record<string, unknown>)[name];\n if (typeof value === \"string\" && value) return value;\n }\n return undefined;\n}\n\nfunction targetInfo(target: EventTarget | null, options: CaptureUserActionsOptions) {\n const element = target as ElementLike | null;\n if (!element || typeof element !== \"object\") return {};\n const maxTextLength = options.maxTextLength ?? 120;\n const sanitize = options.sanitize;\n const info: BrowserUserActionTarget = {\n tagName: sanitizeField(element.tagName?.toLowerCase(), \"tagName\", sanitize),\n id: sanitizeField(element.id, \"id\", sanitize),\n name: sanitizeField(element.name, \"name\", sanitize),\n role: sanitizeField(element.role ?? readAttribute(element, \"role\"), \"role\", sanitize),\n type: sanitizeField(element.type, \"type\", sanitize),\n href: sanitizeField(element.href, \"href\", sanitize),\n label: sanitizeField(\n firstLabel(element, options.labelAttributes ?? defaultLabelAttributes),\n \"label\",\n sanitize,\n ),\n };\n\n if (options.captureText) {\n info.text = sanitizeField(\n truncate(element.textContent ?? undefined, maxTextLength),\n \"text\",\n sanitize,\n );\n }\n if (options.captureValue) {\n info.value = sanitizeField(truncate(element.value, maxTextLength), \"value\", sanitize);\n }\n return info;\n}\n\nfunction throttleKey(event: Event, target: BrowserUserActionTarget): string {\n return `${event.type}:${target.tagName ?? \"\"}:${target.id ?? \"\"}:${target.name ?? \"\"}:${target.label ?? \"\"}`;\n}\n\nexport function captureUserActionsIntegration(\n options: CaptureUserActionsOptions = {},\n): Integration {\n const events = options.events ?? defaultEvents;\n const level = options.level ?? \"info\";\n const listenerCapture = options.listenerCapture ?? true;\n const throttleMs = Math.max(0, Math.floor(options.throttleMs ?? 250));\n const clock = options.clock ?? Date.now;\n\n return {\n name: \"capture-user-actions\",\n setup(api: IntegrationSetupContext) {\n const root = options.root ?? globalThis.document;\n if (!root?.addEventListener || !root.removeEventListener) return;\n const lastSeen = new Map<string, number>();\n let disposed = false;\n\n const onAction = api.guard((event: Event) => {\n if (disposed) return;\n const target = targetInfo(event.target, options);\n if (options.ignore?.(event, target)) return;\n const now = clock();\n const key = throttleKey(event, target);\n const last = lastSeen.get(key) ?? 0;\n if (throttleMs > 0 && now - last < throttleMs) return;\n lastSeen.set(key, now);\n const action: BrowserUserActionPayload = {\n type: event.type,\n target,\n };\n api.capture({\n level,\n message: `User action ${event.type}${target.label ? ` ${target.label}` : \"\"}`,\n props: { browser: { kind: \"user-action\", action } },\n });\n });\n\n for (const event of events) root.addEventListener(event, onAction, listenerCapture);\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const event of events) root.removeEventListener(event, onAction, listenerCapture);\n };\n },\n };\n}\n","import {\n normalizeValue,\n type CaptureInput,\n type Integration,\n type IntegrationSetupContext,\n type LoggerLevel,\n} from \"@loggerjs/core\";\nimport { durationMs, nowMs, sanitizeHttpUrl, shouldSample } from \"./http-capture-utils\";\n\ntype BrowserWebSocketSendPayload = Parameters<WebSocket[\"send\"]>[0];\n\nexport interface BrowserCapturedWebSocketLike {\n url?: string;\n send?: (data: BrowserWebSocketSendPayload) => void;\n close?: (code?: number, reason?: string) => void;\n addEventListener?: (type: string, listener: EventListenerOrEventListenerObject) => void;\n removeEventListener?: (type: string, listener: EventListenerOrEventListenerObject) => void;\n}\n\nexport interface BrowserCapturedWebSocketConstructor {\n new (url: string | URL, protocols?: string | string[]): BrowserCapturedWebSocketLike;\n prototype?: unknown;\n CONNECTING?: number;\n OPEN?: number;\n CLOSING?: number;\n CLOSED?: number;\n}\n\nexport type BrowserWebSocketDirection = \"incoming\" | \"outgoing\";\n\nexport interface BrowserWebSocketMessagePayload {\n direction: BrowserWebSocketDirection;\n dataType: string;\n byteLength?: number;\n data?: unknown;\n}\n\nexport interface CaptureWebSocketOptions {\n level?: LoggerLevel;\n captureConnect?: boolean;\n captureOpen?: boolean;\n captureClose?: boolean;\n captureError?: boolean;\n captureMessages?: boolean;\n captureSentMessages?: boolean;\n captureMessageData?: boolean;\n sampleRate?: number;\n random?: () => number;\n sanitizeUrl?: (url: string) => string;\n WebSocket?: BrowserCapturedWebSocketConstructor;\n}\n\nconst registryKey = \"browser.WebSocket\";\nconst textEncoder = new TextEncoder();\n\nfunction dataType(data: unknown): string {\n if (typeof data === \"string\") return \"string\";\n if (data instanceof ArrayBuffer) return \"arraybuffer\";\n if (ArrayBuffer.isView(data)) return data.constructor.name;\n const record = data as { constructor?: { name?: string } } | undefined;\n return record?.constructor?.name ?? typeof data;\n}\n\nfunction dataByteLength(data: unknown): number | undefined {\n if (typeof data === \"string\") return textEncoder.encode(data).byteLength;\n if (data instanceof ArrayBuffer) return data.byteLength;\n if (ArrayBuffer.isView(data)) return data.byteLength;\n const size = (data as { size?: unknown } | undefined)?.size;\n return typeof size === \"number\" && Number.isFinite(size) ? size : undefined;\n}\n\nfunction messagePayload(\n direction: BrowserWebSocketDirection,\n data: unknown,\n captureMessageData: boolean,\n): BrowserWebSocketMessagePayload {\n return {\n direction,\n dataType: dataType(data),\n byteLength: dataByteLength(data),\n data: captureMessageData ? normalizeValue(data, { maxDepth: 4, maxObjectKeys: 80 }) : undefined,\n };\n}\n\nfunction closeEventPayload(event: Event): Record<string, unknown> {\n const close = event as CloseEvent;\n return {\n code: close.code,\n reason: close.reason,\n wasClean: close.wasClean,\n };\n}\n\nfunction copyStaticConstants(\n target: BrowserCapturedWebSocketConstructor,\n source: BrowserCapturedWebSocketConstructor,\n) {\n for (const key of [\"CONNECTING\", \"OPEN\", \"CLOSING\", \"CLOSED\"] as const) {\n if (source[key] !== undefined) target[key] = source[key];\n }\n}\n\nexport function captureWebSocketIntegration(options: CaptureWebSocketOptions = {}): Integration {\n const level = options.level ?? \"debug\";\n const captureConnect = options.captureConnect ?? true;\n const captureOpen = options.captureOpen ?? true;\n const captureClose = options.captureClose ?? true;\n const captureError = options.captureError ?? true;\n const captureMessages = options.captureMessages ?? false;\n const captureSentMessages = options.captureSentMessages ?? false;\n const captureMessageData = options.captureMessageData ?? false;\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-websocket\",\n setup(api: IntegrationSetupContext) {\n const globalWebSocket = globalThis.WebSocket as\n | BrowserCapturedWebSocketConstructor\n | undefined;\n const current = options.WebSocket ?? globalWebSocket;\n if (!current) return;\n const original =\n api.unpatched.get<BrowserCapturedWebSocketConstructor>(registryKey) ?? current;\n api.unpatched.set(registryKey, original);\n const capture = api.guard((input: CaptureInput) => api.capture(input));\n\n const PatchedWebSocket = function WebSocket(\n this: BrowserCapturedWebSocketLike,\n url: string | URL,\n protocols?: string | string[],\n ) {\n const started = nowMs();\n const sanitizedUrl = sanitizeHttpUrl(String(url), options.sanitizeUrl);\n const socket = new original(url, protocols);\n\n const captureLifecycle = (\n event: \"close\" | \"connect\" | \"error\" | \"open\",\n extra: Record<string, unknown> = {},\n error?: unknown,\n ) => {\n if (!shouldSample(sampleRate, random)) return;\n capture({\n level: event === \"error\" ? \"error\" : level,\n message: `WebSocket ${event} ${sanitizedUrl}`,\n error,\n props: {\n websocket: {\n kind: \"websocket\",\n event,\n url: sanitizedUrl,\n durationMs: durationMs(started),\n ...extra,\n },\n },\n });\n };\n\n if (captureConnect) captureLifecycle(\"connect\");\n\n if (captureOpen) {\n socket.addEventListener?.(\"open\", () => captureLifecycle(\"open\"));\n }\n if (captureClose) {\n socket.addEventListener?.(\"close\", (event) =>\n captureLifecycle(\"close\", closeEventPayload(event)),\n );\n }\n if (captureError) {\n socket.addEventListener?.(\"error\", (event) =>\n captureLifecycle(\"error\", { type: event.type }, event),\n );\n }\n if (captureMessages) {\n socket.addEventListener?.(\"message\", (event) => {\n const message = event as MessageEvent;\n capture({\n level,\n message: `WebSocket message ${sanitizedUrl}`,\n props: {\n websocket: {\n kind: \"websocket-message\",\n url: sanitizedUrl,\n message: messagePayload(\"incoming\", message.data, captureMessageData),\n },\n },\n });\n });\n }\n\n if (captureSentMessages && socket.send) {\n const originalSend = socket.send.bind(socket);\n socket.send = (data: BrowserWebSocketSendPayload) => {\n capture({\n level,\n message: `WebSocket send ${sanitizedUrl}`,\n props: {\n websocket: {\n kind: \"websocket-message\",\n url: sanitizedUrl,\n message: messagePayload(\"outgoing\", data, captureMessageData),\n },\n },\n });\n return originalSend(data);\n };\n }\n\n return socket;\n } as unknown as BrowserCapturedWebSocketConstructor;\n\n PatchedWebSocket.prototype = original.prototype;\n copyStaticConstants(PatchedWebSocket, original);\n globalThis.WebSocket = PatchedWebSocket as unknown as typeof WebSocket;\n\n return () => {\n globalThis.WebSocket = current as unknown as typeof WebSocket;\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext, LoggerLevel } from \"@loggerjs/core\";\n\nexport type WebVitalName = \"CLS\" | \"FCP\" | \"INP\" | \"LCP\" | \"TTFB\";\nexport type WebVitalRating = \"good\" | \"needs-improvement\" | \"poor\";\n\nexport interface WebVitalMetric {\n name: WebVitalName;\n value: number;\n delta: number;\n rating: WebVitalRating;\n id: string;\n final: boolean;\n}\n\nexport interface CaptureWebVitalsOptions {\n metrics?: readonly WebVitalName[];\n level?: LoggerLevel;\n reportAllChanges?: boolean;\n flushOnHidden?: boolean;\n PerformanceObserver?: typeof PerformanceObserver;\n performance?: Pick<Performance, \"getEntriesByName\" | \"getEntriesByType\">;\n addEventListener?: typeof globalThis.addEventListener;\n removeEventListener?: typeof globalThis.removeEventListener;\n}\n\ntype PerformanceEntryLike = PerformanceEntry & Record<string, unknown>;\n\nconst defaultMetrics: readonly WebVitalName[] = [\"CLS\", \"FCP\", \"INP\", \"LCP\", \"TTFB\"];\n\nconst thresholds: Record<WebVitalName, readonly [number, number]> = {\n CLS: [0.1, 0.25],\n FCP: [1800, 3000],\n INP: [200, 500],\n LCP: [2500, 4000],\n TTFB: [800, 1800],\n};\n\nfunction ratingFor(name: WebVitalName, value: number): WebVitalRating {\n const [good, needsImprovement] = thresholds[name];\n if (value <= good) return \"good\";\n if (value <= needsImprovement) return \"needs-improvement\";\n return \"poor\";\n}\n\nfunction metricId(name: WebVitalName): string {\n return `${name.toLowerCase()}-${Date.now().toString(36)}`;\n}\n\nfunction entryValue(entry: PerformanceEntryLike, field: string): number | undefined {\n const value = entry[field];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction hasMetric(metrics: readonly WebVitalName[], name: WebVitalName): boolean {\n return metrics.includes(name);\n}\n\nfunction supportsEntryType(\n Observer: typeof PerformanceObserver | undefined,\n type: string,\n): boolean {\n const supported = Observer?.supportedEntryTypes;\n return !supported || supported.includes(type);\n}\n\nexport function captureWebVitalsIntegration(options: CaptureWebVitalsOptions = {}): Integration {\n const metrics = options.metrics ?? defaultMetrics;\n const level = options.level ?? \"info\";\n const reportAllChanges = options.reportAllChanges ?? false;\n const flushOnHidden = options.flushOnHidden ?? true;\n\n return {\n name: \"capture-web-vitals\",\n setup(api: IntegrationSetupContext) {\n const Observer = options.PerformanceObserver ?? globalThis.PerformanceObserver;\n const perf = options.performance ?? globalThis.performance;\n const add = options.addEventListener ?? globalThis.addEventListener?.bind(globalThis);\n const remove =\n options.removeEventListener ?? globalThis.removeEventListener?.bind(globalThis);\n const disposers: Array<() => void> = [];\n const currentValues = new Map<WebVitalName, number>();\n const reportedValues = new Map<WebVitalName, number>();\n const emitted = new Set<string>();\n let disposed = false;\n\n const emit = (name: WebVitalName, value: number, final: boolean) => {\n if (!Number.isFinite(value)) return;\n const finalKey = `${name}:final`;\n if (final && emitted.has(finalKey)) return;\n const previous = reportedValues.get(name) ?? 0;\n currentValues.set(name, value);\n reportedValues.set(name, value);\n if (final) emitted.add(finalKey);\n const metric: WebVitalMetric = {\n name,\n value,\n delta: value - previous,\n rating: ratingFor(name, value),\n id: metricId(name),\n final,\n };\n api.capture({\n level,\n message: `Web vital ${metric.name} ${metric.value}`,\n props: { webVital: metric },\n });\n };\n\n const observe = (\n type: string,\n callback: (entry: PerformanceEntryLike) => void,\n init: PerformanceObserverInit = { type, buffered: true },\n ) => {\n if (!Observer || !supportsEntryType(Observer, type)) return;\n try {\n const observer = new Observer((list) => {\n for (const entry of list.getEntries()) callback(entry as PerformanceEntryLike);\n });\n observer.observe(init);\n disposers.push(() => observer.disconnect());\n } catch {\n // Unsupported observer types vary across browsers; missing vitals are simply skipped.\n }\n };\n\n if (hasMetric(metrics, \"TTFB\") && perf) {\n const navigation = perf.getEntriesByType(\"navigation\")[0] as\n | PerformanceEntryLike\n | undefined;\n if (navigation) {\n const responseStart = entryValue(navigation, \"responseStart\");\n const startTime = entryValue(navigation, \"startTime\") ?? 0;\n if (responseStart !== undefined) emit(\"TTFB\", responseStart - startTime, true);\n }\n }\n\n if (hasMetric(metrics, \"FCP\") && perf) {\n const existing = perf.getEntriesByName(\"first-contentful-paint\")[0];\n if (existing) emit(\"FCP\", existing.startTime, true);\n observe(\"paint\", (entry) => {\n if (entry.name === \"first-contentful-paint\") emit(\"FCP\", entry.startTime, true);\n });\n }\n\n if (hasMetric(metrics, \"CLS\")) {\n observe(\"layout-shift\", (entry) => {\n if (entry.hadRecentInput === true) return;\n const value = entryValue(entry, \"value\") ?? 0;\n const next = (currentValues.get(\"CLS\") ?? 0) + value;\n if (reportAllChanges) emit(\"CLS\", next, false);\n else currentValues.set(\"CLS\", next);\n });\n }\n\n if (hasMetric(metrics, \"LCP\")) {\n observe(\"largest-contentful-paint\", (entry) => {\n currentValues.set(\"LCP\", entry.startTime);\n if (reportAllChanges) emit(\"LCP\", entry.startTime, false);\n });\n }\n\n if (hasMetric(metrics, \"INP\")) {\n observe(\n \"event\",\n (entry) => {\n const duration = entryValue(entry, \"duration\") ?? 0;\n if (duration <= (currentValues.get(\"INP\") ?? 0)) return;\n currentValues.set(\"INP\", duration);\n if (reportAllChanges) emit(\"INP\", duration, false);\n },\n { type: \"event\", buffered: true, durationThreshold: 40 } as PerformanceObserverInit,\n );\n }\n\n const flushFinal = api.guard(() => {\n const cls = currentValues.get(\"CLS\");\n if (cls !== undefined && cls > 0) emit(\"CLS\", cls, true);\n const lcp = currentValues.get(\"LCP\");\n if (lcp !== undefined) emit(\"LCP\", lcp, true);\n const inp = currentValues.get(\"INP\");\n if (inp !== undefined) emit(\"INP\", inp, true);\n });\n\n if (flushOnHidden && add && remove) {\n const onPageHide = () => flushFinal();\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\")\n flushFinal();\n };\n add(\"pagehide\", onPageHide);\n add(\"visibilitychange\", onVisibilityChange);\n disposers.push(() => {\n remove(\"pagehide\", onPageHide);\n remove(\"visibilitychange\", onVisibilityChange);\n });\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n flushFinal();\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext, LoggerLevel } from \"@loggerjs/core\";\n\nexport type BrowserPerformanceEntryType =\n | \"element\"\n | \"event\"\n | \"longtask\"\n | \"mark\"\n | \"measure\"\n | \"navigation\"\n | \"paint\"\n | \"resource\"\n | string;\n\nexport interface BrowserPerformanceEntryPayload {\n name: string;\n entryType: string;\n startTime: number;\n duration: number;\n initiatorType?: string;\n nextHopProtocol?: string;\n renderBlockingStatus?: string;\n responseStatus?: number;\n transferSize?: number;\n encodedBodySize?: number;\n decodedBodySize?: number;\n workerStart?: number;\n redirectStart?: number;\n redirectEnd?: number;\n fetchStart?: number;\n domainLookupStart?: number;\n domainLookupEnd?: number;\n connectStart?: number;\n connectEnd?: number;\n requestStart?: number;\n responseStart?: number;\n responseEnd?: number;\n detail?: unknown;\n}\n\nexport interface CapturePerformanceOptions {\n entryTypes?: readonly BrowserPerformanceEntryType[];\n level?: LoggerLevel | ((entry: BrowserPerformanceEntryPayload) => LoggerLevel);\n buffered?: boolean;\n emitExisting?: boolean;\n maxEntries?: number;\n minDurationMs?: number | Partial<Record<string, number>>;\n sampleRate?: number;\n random?: () => number;\n captureDetail?: boolean;\n sanitizeName?: (name: string, entryType: string) => string;\n ignore?: (entry: BrowserPerformanceEntryPayload) => boolean;\n PerformanceObserver?: typeof PerformanceObserver;\n performance?: Pick<Performance, \"getEntriesByType\">;\n}\n\ntype PerformanceEntryLike = PerformanceEntry & Record<string, unknown>;\n\nconst defaultEntryTypes: readonly BrowserPerformanceEntryType[] = [\n \"navigation\",\n \"resource\",\n \"longtask\",\n \"measure\",\n \"mark\",\n];\n\nconst numberFields = [\n \"transferSize\",\n \"encodedBodySize\",\n \"decodedBodySize\",\n \"workerStart\",\n \"redirectStart\",\n \"redirectEnd\",\n \"fetchStart\",\n \"domainLookupStart\",\n \"domainLookupEnd\",\n \"connectStart\",\n \"connectEnd\",\n \"requestStart\",\n \"responseStart\",\n \"responseEnd\",\n] as const;\n\nfunction supportsEntryType(\n Observer: typeof PerformanceObserver | undefined,\n type: string,\n): boolean {\n const supported = Observer?.supportedEntryTypes;\n return !supported || supported.includes(type);\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nexport function normalizeBrowserPerformanceEntry(\n entry: PerformanceEntry,\n options: Pick<CapturePerformanceOptions, \"captureDetail\" | \"sanitizeName\"> = {},\n): BrowserPerformanceEntryPayload {\n const raw = entry as PerformanceEntryLike;\n const payload: BrowserPerformanceEntryPayload = {\n name: options.sanitizeName ? options.sanitizeName(entry.name, entry.entryType) : entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n };\n\n for (const field of numberFields) {\n const value = finiteNumber(raw[field]);\n if (value !== undefined) payload[field] = value;\n }\n\n const responseStatus = finiteNumber(raw.responseStatus);\n if (responseStatus !== undefined) payload.responseStatus = responseStatus;\n const initiatorType = stringValue(raw.initiatorType);\n if (initiatorType) payload.initiatorType = initiatorType;\n const nextHopProtocol = stringValue(raw.nextHopProtocol);\n if (nextHopProtocol) payload.nextHopProtocol = nextHopProtocol;\n const renderBlockingStatus = stringValue(raw.renderBlockingStatus);\n if (renderBlockingStatus) payload.renderBlockingStatus = renderBlockingStatus;\n if (options.captureDetail && raw.detail !== undefined) payload.detail = raw.detail;\n\n return payload;\n}\n\nfunction minDurationFor(\n value: CapturePerformanceOptions[\"minDurationMs\"],\n entryType: string,\n): number {\n if (typeof value === \"number\") return value;\n return value?.[entryType] ?? 0;\n}\n\nfunction levelFor(\n value: CapturePerformanceOptions[\"level\"],\n entry: BrowserPerformanceEntryPayload,\n): LoggerLevel {\n if (typeof value === \"function\") return value(entry);\n if (value) return value;\n return entry.entryType === \"longtask\" ? \"warn\" : \"info\";\n}\n\nfunction entryKey(entry: BrowserPerformanceEntryPayload): string {\n return `${entry.entryType}:${entry.name}:${entry.startTime}:${entry.duration}`;\n}\n\nexport function capturePerformanceIntegration(\n options: CapturePerformanceOptions = {},\n): Integration {\n const entryTypes = options.entryTypes ?? defaultEntryTypes;\n const buffered = options.buffered ?? true;\n const emitExisting = options.emitExisting ?? true;\n const maxEntries = Math.max(0, Math.floor(options.maxEntries ?? 200));\n const sampleRate = options.sampleRate ?? 1;\n const random = options.random ?? Math.random;\n\n return {\n name: \"capture-performance\",\n setup(api: IntegrationSetupContext) {\n const Observer = options.PerformanceObserver ?? globalThis.PerformanceObserver;\n const perf = options.performance ?? globalThis.performance;\n const seen = new Set<string>();\n const disposers: Array<() => void> = [];\n let emitted = 0;\n let disposed = false;\n\n const capture = api.guard((entry: PerformanceEntry) => {\n if (disposed || emitted >= maxEntries) return;\n const payload = normalizeBrowserPerformanceEntry(entry, options);\n if (payload.duration < minDurationFor(options.minDurationMs, payload.entryType)) return;\n if (sampleRate < 1 && random() >= sampleRate) return;\n if (options.ignore?.(payload)) return;\n const key = entryKey(payload);\n if (seen.has(key)) return;\n seen.add(key);\n emitted += 1;\n api.capture({\n level: levelFor(options.level, payload),\n message: `Performance ${payload.entryType} ${payload.name}`,\n props: { performance: payload },\n });\n });\n\n const emitExistingEntries = (type: string) => {\n if (!emitExisting || !perf) return;\n try {\n for (const entry of perf.getEntriesByType(type)) capture(entry);\n } catch {\n // Some browser-like runtimes expose partial Performance APIs.\n }\n };\n\n for (const type of entryTypes) {\n emitExistingEntries(type);\n if (!Observer || !supportsEntryType(Observer, type)) continue;\n try {\n const observer = new Observer((list) => {\n for (const entry of list.getEntries()) capture(entry);\n });\n observer.observe({ type, buffered } as PerformanceObserverInit);\n disposers.push(() => observer.disconnect());\n } catch {\n // Unsupported observer types are skipped so other entry types still work.\n }\n }\n\n return () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers) dispose();\n };\n },\n };\n}\n","import type { Integration, IntegrationSetupContext } from \"@loggerjs/core\";\n\nexport interface PageLifecycleOptions {\n flushOnPageHide?: boolean;\n flushOnHidden?: boolean;\n coalesceMs?: number;\n}\n\nexport function pageLifecycleIntegration(options: PageLifecycleOptions = {}): Integration {\n const flushOnPageHide = options.flushOnPageHide ?? true;\n const flushOnHidden = options.flushOnHidden ?? true;\n const coalesceMs = options.coalesceMs ?? 250;\n\n return {\n name: \"page-lifecycle\",\n setup(api: IntegrationSetupContext) {\n if (typeof addEventListener === \"undefined\") return;\n let disposed = false;\n let flushInFlight: Promise<void> | undefined;\n let lastFlushAt = 0;\n\n const flush = () => {\n const now = Date.now();\n if (flushInFlight || now - lastFlushAt < coalesceMs) return;\n lastFlushAt = now;\n flushInFlight = Promise.resolve(api.flush())\n .catch(() => {})\n .finally(() => {\n flushInFlight = undefined;\n });\n };\n const onVisibility = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") flush();\n };\n if (flushOnPageHide) addEventListener(\"pagehide\", flush);\n if (flushOnHidden) addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n if (disposed) return;\n disposed = true;\n if (flushOnPageHide) removeEventListener(\"pagehide\", flush);\n if (flushOnHidden) removeEventListener(\"visibilitychange\", onVisibility);\n };\n },\n };\n}\n"],"mappings":"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"}