@loggerjs/browser 0.6.0 → 0.7.0

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.
Files changed (59) hide show
  1. package/README.md +2 -2
  2. package/dist/chunks/http-capture-utils-DbhpUirh.cjs +83 -0
  3. package/dist/chunks/http-capture-utils-DbhpUirh.cjs.map +1 -0
  4. package/dist/chunks/http-capture-utils-_hG5wepA.js +48 -0
  5. package/dist/chunks/http-capture-utils-_hG5wepA.js.map +1 -0
  6. package/dist/context-propagation-integration.cjs +5 -4
  7. package/dist/context-propagation-integration.cjs.map +1 -1
  8. package/dist/context-propagation-integration.d.ts +2 -1
  9. package/dist/context-propagation-integration.d.ts.map +1 -1
  10. package/dist/context-propagation-integration.js +2 -1
  11. package/dist/context-propagation-integration.js.map +1 -1
  12. package/dist/fetch-integration.cjs +8 -52
  13. package/dist/fetch-integration.cjs.map +1 -1
  14. package/dist/fetch-integration.js +1 -45
  15. package/dist/fetch-integration.js.map +1 -1
  16. package/dist/http-transport.cjs +90 -16
  17. package/dist/http-transport.cjs.map +1 -1
  18. package/dist/http-transport.d.ts +17 -0
  19. package/dist/http-transport.d.ts.map +1 -1
  20. package/dist/http-transport.js +90 -16
  21. package/dist/http-transport.js.map +1 -1
  22. package/dist/index.cjs +58 -4167
  23. package/dist/index.d.ts +243 -17
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +25 -4135
  26. package/dist/indexeddb-offline-queue.cjs +8 -1
  27. package/dist/indexeddb-offline-queue.cjs.map +1 -1
  28. package/dist/indexeddb-offline-queue.d.ts.map +1 -1
  29. package/dist/indexeddb-offline-queue.js +8 -1
  30. package/dist/indexeddb-offline-queue.js.map +1 -1
  31. package/dist/indexeddb-transport.cjs +24 -4
  32. package/dist/indexeddb-transport.cjs.map +1 -1
  33. package/dist/indexeddb-transport.d.ts.map +1 -1
  34. package/dist/indexeddb-transport.js +24 -4
  35. package/dist/indexeddb-transport.js.map +1 -1
  36. package/dist/offline-first-transport.cjs +2 -1029
  37. package/dist/offline-first-transport.cjs.map +1 -1
  38. package/dist/offline-first-transport.js +2 -1029
  39. package/dist/offline-first-transport.js.map +1 -1
  40. package/dist/payload-transforms.cjs +3 -3
  41. package/dist/payload-transforms.cjs.map +1 -1
  42. package/dist/payload-transforms.d.ts.map +1 -1
  43. package/dist/payload-transforms.js +1 -1
  44. package/dist/payload-transforms.js.map +1 -1
  45. package/dist/websocket-integration.cjs +5 -32
  46. package/dist/websocket-integration.cjs.map +1 -1
  47. package/dist/websocket-integration.js +1 -28
  48. package/dist/websocket-integration.js.map +1 -1
  49. package/dist/websocket-transport.cjs +1 -1
  50. package/dist/websocket-transport.cjs.map +1 -1
  51. package/dist/websocket-transport.js +2 -2
  52. package/dist/websocket-transport.js.map +1 -1
  53. package/dist/xhr-integration.cjs +6 -33
  54. package/dist/xhr-integration.cjs.map +1 -1
  55. package/dist/xhr-integration.js +1 -28
  56. package/dist/xhr-integration.js.map +1 -1
  57. package/package.json +5 -2
  58. package/dist/index.cjs.map +0 -1
  59. package/dist/index.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { incrementLoggerMetaCounter, safeJsonCodec } from "@loggerjs/core";
1
+ import { incrementLoggerMetaCounter, safeJsonEncoder } from "@loggerjs/core";
2
2
  //#region src/websocket-transport.ts
3
3
  const WS_CONNECTING = 0;
4
4
  const WS_OPEN = 1;
@@ -12,7 +12,7 @@ function toSendPayload(payload) {
12
12
  }
13
13
  function browserWebSocketTransport(options) {
14
14
  const transportName = options.name ?? "browser-websocket";
15
- const codec = options.codec ?? safeJsonCodec();
15
+ const codec = options.codec ?? safeJsonEncoder();
16
16
  const maxQueueSize = options.maxQueueSize ?? 1e3;
17
17
  const dropPolicy = options.dropPolicy ?? "drop-oldest";
18
18
  const webSocketFactory = options.webSocketFactory ?? defaultWebSocketFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-transport.js","names":[],"sources":["../src/websocket-transport.ts"],"sourcesContent":["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"],"mappings":"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"}
1
+ {"version":3,"file":"websocket-transport.js","names":[],"sources":["../src/websocket-transport.ts"],"sourcesContent":["import {\n incrementLoggerMetaCounter,\n safeJsonEncoder,\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 ?? safeJsonEncoder();\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"],"mappings":"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"}
@@ -1,32 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/http-capture-utils.ts
3
- function nowMs() {
4
- return typeof performance !== "undefined" ? performance.now() : Date.now();
5
- }
6
- function durationMs(started) {
7
- return nowMs() - started;
8
- }
9
- function sanitizeHttpUrl(rawUrl, sanitizer) {
10
- const stripped = stripSensitiveUrlParts(rawUrl);
11
- return sanitizer ? sanitizer(stripped) : stripped;
12
- }
13
- function shouldSample(sampleRate, random) {
14
- if (sampleRate >= 1) return true;
15
- if (sampleRate <= 0) return false;
16
- return random() < sampleRate;
17
- }
18
- function stripSensitiveUrlParts(rawUrl) {
19
- if (!/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(rawUrl)) return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;
20
- try {
21
- const url = new URL(rawUrl);
22
- url.search = "";
23
- url.hash = "";
24
- return url.toString();
25
- } catch {
26
- return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;
27
- }
28
- }
29
- //#endregion
2
+ const require_http_capture_utils = require("./chunks/http-capture-utils-DbhpUirh.cjs");
30
3
  //#region src/xhr-integration.ts
31
4
  const XHR_META = "__LOGGERJS_XHR_META__";
32
5
  function captureXHRIntegration(options = {}) {
@@ -46,7 +19,7 @@ function captureXHRIntegration(options = {}) {
46
19
  proto.open = function patchedOpen(method, url, ...rest) {
47
20
  this[XHR_META] = {
48
21
  method: method.toUpperCase(),
49
- url: sanitizeHttpUrl(String(url), options.sanitizeUrl),
22
+ url: require_http_capture_utils.sanitizeHttpUrl(String(url), options.sanitizeUrl),
50
23
  started: 0
51
24
  };
52
25
  return originalOpen.apply(this, [
@@ -57,11 +30,11 @@ function captureXHRIntegration(options = {}) {
57
30
  };
58
31
  proto.send = function patchedSend(body) {
59
32
  const meta = this[XHR_META];
60
- if (meta) meta.started = nowMs();
33
+ if (meta) meta.started = require_http_capture_utils.nowMs();
61
34
  let captured = false;
62
35
  const onLoadEnd = () => {
63
36
  if (!meta || captured) return;
64
- if (this.status >= minStatus || captureAll && shouldSample(sampleRate, random)) {
37
+ if (this.status >= minStatus || captureAll && require_http_capture_utils.shouldSample(sampleRate, random)) {
65
38
  captured = true;
66
39
  capture({
67
40
  level: this.status >= minStatus ? "warn" : "debug",
@@ -71,7 +44,7 @@ function captureXHRIntegration(options = {}) {
71
44
  method: meta.method,
72
45
  url: meta.url,
73
46
  status: this.status,
74
- durationMs: durationMs(meta.started)
47
+ durationMs: require_http_capture_utils.durationMs(meta.started)
75
48
  } }
76
49
  });
77
50
  }
@@ -86,7 +59,7 @@ function captureXHRIntegration(options = {}) {
86
59
  kind: "xhr",
87
60
  method: meta.method,
88
61
  url: meta.url,
89
- durationMs: durationMs(meta.started)
62
+ durationMs: require_http_capture_utils.durationMs(meta.started)
90
63
  } }
91
64
  });
92
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"xhr-integration.cjs","names":[],"sources":["../src/http-capture-utils.ts","../src/xhr-integration.ts"],"sourcesContent":["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 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"],"mappings":"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"}
1
+ {"version":3,"file":"xhr-integration.cjs","names":["sanitizeHttpUrl","nowMs","shouldSample","durationMs"],"sources":["../src/xhr-integration.ts"],"sourcesContent":["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"],"mappings":";;;AAkBA,MAAM,WAAW;AAEjB,SAAgB,sBAAsB,UAA6B,CAAC,GAAgB;CAClF,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,aAAa,QAAQ,cAAc,QAAQ,qBAAqB;CACtE,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,SAAS,QAAQ,UAAU,KAAK;CAEtC,OAAO;EACL,MAAM;EACN,MAAM,KAA8B;GAClC,IAAI,OAAO,mBAAmB,aAAa;GAC3C,MAAM,QAAQ,eAAe;GAC7B,MAAM,eAAe,MAAM;GAC3B,MAAM,eAAe,MAAM;GAC3B,IAAI,UAAU,mBAAmB;GACjC,MAAM,UAAU,IAAI,OAAO,UAAwB,IAAI,QAAQ,KAAK,CAAC;GAErE,MAAM,OAAO,SAAS,YAEpB,QACA,KACA,GAAG,MACH;IACA,KAA6C,YAAY;KACvD,QAAQ,OAAO,YAAY;KAC3B,KAAKA,2BAAAA,gBAAgB,OAAO,GAAG,GAAG,QAAQ,WAAW;KACrD,SAAS;IACX;IACA,OAAQ,aAAyD,MAAM,MAAM;KAC3E;KACA;KACA,GAAG;IACL,CAAC;GACH;GAEA,MAAM,OAAO,SAAS,YAEpB,MACA;IACA,MAAM,OAAQ,KAA4C;IAC1D,IAAI,MAAM,KAAK,UAAUC,2BAAAA,MAAM;IAC/B,IAAI,WAAW;IAEf,MAAM,kBAAkB;KACtB,IAAI,CAAC,QAAQ,UAAU;KAGvB,IADE,KAAK,UAAU,aAAc,cAAcC,2BAAAA,aAAa,YAAY,MAAM,GACzD;MACjB,WAAW;MACX,QAAQ;OACN,OAAO,KAAK,UAAU,YAAY,SAAS;OAC3C,SAAS,OAAO,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK;OACnD,OAAO,EACL,MAAM;QACJ,MAAM;QACN,QAAQ,KAAK;QACb,KAAK,KAAK;QACV,QAAQ,KAAK;QACb,YAAYC,2BAAAA,WAAW,KAAK,OAAO;OACrC,EACF;MACF,CAAC;KACH;IACF;IAEA,MAAM,gBAAgB;KACpB,IAAI,CAAC,QAAQ,UAAU;KACvB,WAAW;KACX,QAAQ;MACN,OAAO;MACP,SAAS,qBAAqB,KAAK,OAAO,GAAG,KAAK;MAClD,OAAO,EACL,MAAM;OACJ,MAAM;OACN,QAAQ,KAAK;OACb,KAAK,KAAK;OACV,YAAYA,2BAAAA,WAAW,KAAK,OAAO;MACrC,EACF;KACF,CAAC;IACH;IAEA,KAAK,iBAAiB,WAAW,WAAW,EAAE,MAAM,KAAK,CAAC;IAC1D,KAAK,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;IACtD,OAAQ,aAAyD,MAAM,MAAM,CAAC,IAAI,CAAC;GACrF;GAEA,aAAa;IACX,MAAM,OAAO;IACb,MAAM,OAAO;GACf;EACF;CACF;AACF"}
@@ -1,31 +1,4 @@
1
- //#region src/http-capture-utils.ts
2
- function nowMs() {
3
- return typeof performance !== "undefined" ? performance.now() : Date.now();
4
- }
5
- function durationMs(started) {
6
- return nowMs() - started;
7
- }
8
- function sanitizeHttpUrl(rawUrl, sanitizer) {
9
- const stripped = stripSensitiveUrlParts(rawUrl);
10
- return sanitizer ? sanitizer(stripped) : stripped;
11
- }
12
- function shouldSample(sampleRate, random) {
13
- if (sampleRate >= 1) return true;
14
- if (sampleRate <= 0) return false;
15
- return random() < sampleRate;
16
- }
17
- function stripSensitiveUrlParts(rawUrl) {
18
- if (!/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(rawUrl)) return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;
19
- try {
20
- const url = new URL(rawUrl);
21
- url.search = "";
22
- url.hash = "";
23
- return url.toString();
24
- } catch {
25
- return rawUrl.split(/[?#]/, 1)[0] ?? rawUrl;
26
- }
27
- }
28
- //#endregion
1
+ import { a as sanitizeHttpUrl, o as shouldSample, r as nowMs, t as durationMs } from "./chunks/http-capture-utils-_hG5wepA.js";
29
2
  //#region src/xhr-integration.ts
30
3
  const XHR_META = "__LOGGERJS_XHR_META__";
31
4
  function captureXHRIntegration(options = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"xhr-integration.js","names":[],"sources":["../src/http-capture-utils.ts","../src/xhr-integration.ts"],"sourcesContent":["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 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"],"mappings":"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"}
1
+ {"version":3,"file":"xhr-integration.js","names":[],"sources":["../src/xhr-integration.ts"],"sourcesContent":["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"],"mappings":";;AAkBA,MAAM,WAAW;AAEjB,SAAgB,sBAAsB,UAA6B,CAAC,GAAgB;CAClF,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,aAAa,QAAQ,cAAc,QAAQ,qBAAqB;CACtE,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,SAAS,QAAQ,UAAU,KAAK;CAEtC,OAAO;EACL,MAAM;EACN,MAAM,KAA8B;GAClC,IAAI,OAAO,mBAAmB,aAAa;GAC3C,MAAM,QAAQ,eAAe;GAC7B,MAAM,eAAe,MAAM;GAC3B,MAAM,eAAe,MAAM;GAC3B,IAAI,UAAU,mBAAmB;GACjC,MAAM,UAAU,IAAI,OAAO,UAAwB,IAAI,QAAQ,KAAK,CAAC;GAErE,MAAM,OAAO,SAAS,YAEpB,QACA,KACA,GAAG,MACH;IACA,KAA6C,YAAY;KACvD,QAAQ,OAAO,YAAY;KAC3B,KAAK,gBAAgB,OAAO,GAAG,GAAG,QAAQ,WAAW;KACrD,SAAS;IACX;IACA,OAAQ,aAAyD,MAAM,MAAM;KAC3E;KACA;KACA,GAAG;IACL,CAAC;GACH;GAEA,MAAM,OAAO,SAAS,YAEpB,MACA;IACA,MAAM,OAAQ,KAA4C;IAC1D,IAAI,MAAM,KAAK,UAAU,MAAM;IAC/B,IAAI,WAAW;IAEf,MAAM,kBAAkB;KACtB,IAAI,CAAC,QAAQ,UAAU;KAGvB,IADE,KAAK,UAAU,aAAc,cAAc,aAAa,YAAY,MAAM,GACzD;MACjB,WAAW;MACX,QAAQ;OACN,OAAO,KAAK,UAAU,YAAY,SAAS;OAC3C,SAAS,OAAO,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK;OACnD,OAAO,EACL,MAAM;QACJ,MAAM;QACN,QAAQ,KAAK;QACb,KAAK,KAAK;QACV,QAAQ,KAAK;QACb,YAAY,WAAW,KAAK,OAAO;OACrC,EACF;MACF,CAAC;KACH;IACF;IAEA,MAAM,gBAAgB;KACpB,IAAI,CAAC,QAAQ,UAAU;KACvB,WAAW;KACX,QAAQ;MACN,OAAO;MACP,SAAS,qBAAqB,KAAK,OAAO,GAAG,KAAK;MAClD,OAAO,EACL,MAAM;OACJ,MAAM;OACN,QAAQ,KAAK;OACb,KAAK,KAAK;OACV,YAAY,WAAW,KAAK,OAAO;MACrC,EACF;KACF,CAAC;IACH;IAEA,KAAK,iBAAiB,WAAW,WAAW,EAAE,MAAM,KAAK,CAAC;IAC1D,KAAK,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;IACtD,OAAQ,aAAyD,MAAM,MAAM,CAAC,IAAI,CAAC;GACrF;GAEA,aAAa;IACX,MAAM,OAAO;IACb,MAAM,OAAO;GACf;EACF;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loggerjs/browser",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Browser transports and integrations for loggerjs.",
5
5
  "homepage": "https://github.com/jskits/loggerjs/tree/main/packages/browser#readme",
6
6
  "bugs": {
@@ -159,7 +159,10 @@
159
159
  "provenance": true
160
160
  },
161
161
  "dependencies": {
162
- "@loggerjs/core": "0.6.0"
162
+ "@loggerjs/core": "^0.7.0"
163
+ },
164
+ "engines": {
165
+ "node": ">=20.19.0"
163
166
  },
164
167
  "loggerjsSubpathEntries": {
165
168
  "http-transport": "src/http-transport.ts",