@dxos/observability 0.8.4-main.b97322e → 0.8.4-main.dedc0f3

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 (109) hide show
  1. package/dist/lib/browser/{chunk-YEPQFAES.mjs → chunk-LJO63BXO.mjs} +2 -2
  2. package/dist/lib/browser/{chunk-YEPQFAES.mjs.map → chunk-LJO63BXO.mjs.map} +3 -3
  3. package/dist/lib/browser/{chunk-UG3VTDOH.mjs → chunk-MB7KKARJ.mjs} +75 -46
  4. package/dist/lib/browser/chunk-MB7KKARJ.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-MWTIKIBZ.mjs → chunk-VSEBD3XA.mjs} +42 -28
  6. package/dist/lib/browser/chunk-VSEBD3XA.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +3 -3
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/observability-NZM3OOLO.mjs +10 -0
  10. package/dist/lib/browser/{otel-IRDZ7PES.mjs → otel-UHLVSR24.mjs} +118 -70
  11. package/dist/lib/browser/{otel-IRDZ7PES.mjs.map → otel-UHLVSR24.mjs.map} +3 -3
  12. package/dist/lib/browser/segment/index.mjs +2 -2
  13. package/dist/lib/browser/sentry/index.mjs +1 -1
  14. package/dist/lib/browser/{sentry-log-processor-N3QNOQ2O.mjs → sentry-log-processor-RG4CFVGL.mjs} +53 -39
  15. package/dist/lib/browser/{sentry-log-processor-N3QNOQ2O.mjs.map → sentry-log-processor-RG4CFVGL.mjs.map} +3 -3
  16. package/dist/lib/node-esm/{chunk-552KLA6Z.mjs → chunk-GOWQOSY6.mjs} +65 -38
  17. package/dist/lib/node-esm/chunk-GOWQOSY6.mjs.map +7 -0
  18. package/dist/lib/node-esm/{chunk-TEH6VIKV.mjs → chunk-QK5IUYVA.mjs} +2 -2
  19. package/dist/lib/node-esm/{chunk-TEH6VIKV.mjs.map → chunk-QK5IUYVA.mjs.map} +3 -3
  20. package/dist/lib/node-esm/{chunk-WLRNZ2S2.mjs → chunk-YLYRR73V.mjs} +75 -46
  21. package/dist/lib/{browser/chunk-UG3VTDOH.mjs.map → node-esm/chunk-YLYRR73V.mjs.map} +3 -3
  22. package/dist/lib/node-esm/index.mjs +3 -3
  23. package/dist/lib/node-esm/meta.json +1 -1
  24. package/dist/lib/node-esm/{observability-F2NNZIF6.mjs → observability-2CTGITMR.mjs} +4 -4
  25. package/dist/lib/node-esm/{otel-62HYJETM.mjs → otel-W6KWKVW5.mjs} +108 -60
  26. package/dist/lib/node-esm/{otel-62HYJETM.mjs.map → otel-W6KWKVW5.mjs.map} +3 -3
  27. package/dist/lib/node-esm/segment/index.mjs +2 -2
  28. package/dist/lib/node-esm/sentry/index.mjs +1 -1
  29. package/dist/lib/node-esm/{sentry-log-processor-FN6Y5TNI.mjs → sentry-log-processor-3BDS4BB4.mjs} +53 -39
  30. package/dist/lib/node-esm/{sentry-log-processor-FN6Y5TNI.mjs.map → sentry-log-processor-3BDS4BB4.mjs.map} +3 -3
  31. package/dist/types/src/helpers/browser-observability.d.ts.map +1 -1
  32. package/dist/types/src/helpers/browser-observability.js +4 -6
  33. package/dist/types/src/helpers/browser-observability.js.map +1 -1
  34. package/dist/types/src/helpers/common.js +1 -1
  35. package/dist/types/src/helpers/common.js.map +1 -1
  36. package/dist/types/src/helpers/map-spaces.js +5 -6
  37. package/dist/types/src/helpers/map-spaces.js.map +1 -1
  38. package/dist/types/src/helpers/node-observability.d.ts +1 -1
  39. package/dist/types/src/helpers/node-observability.d.ts.map +1 -1
  40. package/dist/types/src/helpers/node-observability.js +7 -11
  41. package/dist/types/src/helpers/node-observability.js.map +1 -1
  42. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +1 -1
  43. package/dist/types/src/helpers/setup-telemetry-listeners.js +4 -7
  44. package/dist/types/src/helpers/setup-telemetry-listeners.js.map +1 -1
  45. package/dist/types/src/observability.d.ts +1 -1
  46. package/dist/types/src/observability.d.ts.map +1 -1
  47. package/dist/types/src/observability.js +68 -59
  48. package/dist/types/src/observability.js.map +1 -1
  49. package/dist/types/src/otel/logs.d.ts.map +1 -1
  50. package/dist/types/src/otel/logs.js +20 -19
  51. package/dist/types/src/otel/logs.js.map +1 -1
  52. package/dist/types/src/otel/metrics.js +5 -2
  53. package/dist/types/src/otel/metrics.js.map +1 -1
  54. package/dist/types/src/otel/otel.js +1 -1
  55. package/dist/types/src/otel/otel.js.map +1 -1
  56. package/dist/types/src/otel/traces-browser.js +3 -1
  57. package/dist/types/src/otel/traces-browser.js.map +1 -1
  58. package/dist/types/src/otel/traces.js +2 -0
  59. package/dist/types/src/otel/traces.js.map +1 -1
  60. package/dist/types/src/segment/base.d.ts +1 -1
  61. package/dist/types/src/segment/base.d.ts.map +1 -1
  62. package/dist/types/src/segment/base.js +2 -1
  63. package/dist/types/src/segment/base.js.map +1 -1
  64. package/dist/types/src/segment/browser.d.ts +1 -1
  65. package/dist/types/src/segment/browser.d.ts.map +1 -1
  66. package/dist/types/src/segment/browser.js +6 -10
  67. package/dist/types/src/segment/browser.js.map +1 -1
  68. package/dist/types/src/segment/node.d.ts +1 -1
  69. package/dist/types/src/segment/node.d.ts.map +1 -1
  70. package/dist/types/src/segment/node.js +2 -1
  71. package/dist/types/src/segment/node.js.map +1 -1
  72. package/dist/types/src/sentry/browser.d.ts.map +1 -1
  73. package/dist/types/src/sentry/browser.js +4 -6
  74. package/dist/types/src/sentry/browser.js.map +1 -1
  75. package/dist/types/src/sentry/node.d.ts.map +1 -1
  76. package/dist/types/src/sentry/node.js +8 -13
  77. package/dist/types/src/sentry/node.js.map +1 -1
  78. package/dist/types/src/sentry/node.node.test.js +3 -5
  79. package/dist/types/src/sentry/node.node.test.js.map +1 -1
  80. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +1 -1
  81. package/dist/types/src/sentry/sentry-log-processor.js +56 -63
  82. package/dist/types/src/sentry/sentry-log-processor.js.map +1 -1
  83. package/dist/types/src/sentry/sentry.node.test.js +1 -1
  84. package/dist/types/src/sentry/sentry.node.test.js.map +1 -1
  85. package/dist/types/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +18 -15
  87. package/src/helpers/browser-observability.ts +2 -1
  88. package/src/helpers/node-observability.ts +3 -2
  89. package/src/helpers/setup-telemetry-listeners.ts +2 -1
  90. package/src/observability.ts +4 -4
  91. package/src/otel/logs.ts +2 -2
  92. package/src/otel/metrics.ts +1 -1
  93. package/src/otel/otel.ts +1 -1
  94. package/src/otel/traces-browser.ts +3 -3
  95. package/src/otel/traces.ts +2 -2
  96. package/src/segment/base.ts +1 -1
  97. package/src/segment/browser.ts +3 -2
  98. package/src/segment/node.ts +3 -2
  99. package/src/sentry/browser.ts +7 -7
  100. package/src/sentry/node.node.test.ts +2 -1
  101. package/src/sentry/node.ts +3 -3
  102. package/src/sentry/sentry-log-processor.ts +2 -2
  103. package/src/sentry/sentry.node.test.ts +2 -1
  104. package/dist/lib/browser/chunk-MWTIKIBZ.mjs.map +0 -7
  105. package/dist/lib/browser/observability-7LFMAZBF.mjs +0 -10
  106. package/dist/lib/node-esm/chunk-552KLA6Z.mjs.map +0 -7
  107. package/dist/lib/node-esm/chunk-WLRNZ2S2.mjs.map +0 -7
  108. /package/dist/lib/browser/{observability-7LFMAZBF.mjs.map → observability-NZM3OOLO.mjs.map} +0 -0
  109. /package/dist/lib/node-esm/{observability-F2NNZIF6.mjs.map → observability-2CTGITMR.mjs.map} +0 -0
@@ -2,17 +2,66 @@ import {
2
2
  captureException,
3
3
  captureMessage,
4
4
  withScope
5
- } from "./chunk-YEPQFAES.mjs";
5
+ } from "./chunk-LJO63BXO.mjs";
6
6
 
7
7
  // src/sentry/sentry-log-processor.ts
8
8
  import { InvariantViolation } from "@dxos/invariant";
9
9
  import { LogLevel, shouldLog } from "@dxos/log";
10
10
  import { CircularBuffer, getDebugName } from "@dxos/util";
11
+ function _define_property(obj, key, value) {
12
+ if (key in obj) {
13
+ Object.defineProperty(obj, key, {
14
+ value,
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true
18
+ });
19
+ } else {
20
+ obj[key] = value;
21
+ }
22
+ return obj;
23
+ }
11
24
  var MAX_LOG_BREADCRUMBS = 150;
12
25
  var SentryLogProcessor = class {
26
+ addLogBreadcrumbsTo(event) {
27
+ var _event;
28
+ (_event = event).breadcrumbs ?? (_event.breadcrumbs = []);
29
+ for (const breadcrumb of this._breadcrumbs) {
30
+ event.breadcrumbs.push(breadcrumb);
31
+ }
32
+ event.breadcrumbs.sort((b1, b2) => {
33
+ if (b1.timestamp === void 0 || b2.timestamp === void 0) {
34
+ return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === void 0 ? -1 : 1;
35
+ }
36
+ return b1.timestamp - b2.timestamp;
37
+ });
38
+ }
39
+ _addBreadcrumb(eventId, message, severity, context) {
40
+ const breadcrumb = {
41
+ type: "console",
42
+ level: severity,
43
+ event_id: eventId,
44
+ category: "log",
45
+ message,
46
+ data: context,
47
+ timestamp: Math.floor(Date.now() / 1e3)
48
+ };
49
+ const lastRecorded = this._breadcrumbs.getLast();
50
+ if (lastRecorded && lastRecorded.message === breadcrumb.message) {
51
+ const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};
52
+ const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount) ? 1 : Number(lastRecorded.data?.mergedBreadcrumbCount);
53
+ lastRecorded.data = {
54
+ mergedBreadcrumbCount: mergedBreadcrumbCount + 1,
55
+ firstBreadcrumbData,
56
+ lastBreadcrumbData: breadcrumb.data
57
+ };
58
+ return;
59
+ }
60
+ this._breadcrumbs.push(breadcrumb);
61
+ }
13
62
  constructor() {
14
- this._breadcrumbs = new CircularBuffer(MAX_LOG_BREADCRUMBS);
15
- this.logProcessor = (config, entry) => {
63
+ _define_property(this, "_breadcrumbs", new CircularBuffer(MAX_LOG_BREADCRUMBS));
64
+ _define_property(this, "logProcessor", (config, entry) => {
16
65
  const { level, meta, error } = entry;
17
66
  if (!shouldLog(entry, config.captureFilters) || meta?.S?.remoteSessionId) {
18
67
  if (entry.level > LogLevel.DEBUG) {
@@ -63,43 +112,8 @@ var SentryLogProcessor = class {
63
112
  const eventId = captureMessage(extendedMessage);
64
113
  this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);
65
114
  });
66
- };
67
- }
68
- addLogBreadcrumbsTo(event) {
69
- event.breadcrumbs ??= [];
70
- for (const breadcrumb of this._breadcrumbs) {
71
- event.breadcrumbs.push(breadcrumb);
72
- }
73
- event.breadcrumbs.sort((b1, b2) => {
74
- if (b1.timestamp === void 0 || b2.timestamp === void 0) {
75
- return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === void 0 ? -1 : 1;
76
- }
77
- return b1.timestamp - b2.timestamp;
78
115
  });
79
116
  }
80
- _addBreadcrumb(eventId, message, severity, context) {
81
- const breadcrumb = {
82
- type: "console",
83
- level: severity,
84
- event_id: eventId,
85
- category: "log",
86
- message,
87
- data: context,
88
- timestamp: Math.floor(Date.now() / 1e3)
89
- };
90
- const lastRecorded = this._breadcrumbs.getLast();
91
- if (lastRecorded && lastRecorded.message === breadcrumb.message) {
92
- const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};
93
- const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount) ? 1 : Number(lastRecorded.data?.mergedBreadcrumbCount);
94
- lastRecorded.data = {
95
- mergedBreadcrumbCount: mergedBreadcrumbCount + 1,
96
- firstBreadcrumbData,
97
- lastBreadcrumbData: breadcrumb.data
98
- };
99
- return;
100
- }
101
- this._breadcrumbs.push(breadcrumb);
102
- }
103
117
  };
104
118
  var formatMessageForSentry = (entry) => {
105
119
  const message = entry.message ?? (entry.error ? entry.error.message ?? String(entry.error) : "");
@@ -145,4 +159,4 @@ var getRelativeFilename = (filename) => {
145
159
  export {
146
160
  SentryLogProcessor
147
161
  };
148
- //# sourceMappingURL=sentry-log-processor-N3QNOQ2O.mjs.map
162
+ //# sourceMappingURL=sentry-log-processor-RG4CFVGL.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/sentry/sentry-log-processor.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport type { Breadcrumb, SeverityLevel, Event } from '@sentry/types';\n\nimport { InvariantViolation } from '@dxos/invariant';\nimport { type LogConfig, type LogEntry, LogLevel, type LogProcessor, shouldLog } from '@dxos/log';\nimport { CircularBuffer, getDebugName } from '@dxos/util';\n\nimport { withScope, captureException, captureMessage } from './node';\n\nconst MAX_LOG_BREADCRUMBS = 150;\n\nexport class SentryLogProcessor {\n private _breadcrumbs = new CircularBuffer<Breadcrumb>(MAX_LOG_BREADCRUMBS);\n\n public readonly logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {\n const { level, meta, error } = entry;\n // Don't forward logs from remote sessions.\n if (!shouldLog(entry, config.captureFilters) || meta?.S?.remoteSessionId) {\n if (entry.level > LogLevel.DEBUG) {\n this._addBreadcrumb(\n undefined,\n entry.message ?? (entry.error ? (entry.error.message ?? String(entry.error)) : ''),\n convertLevel(entry.level),\n undefined,\n );\n }\n return;\n }\n if (entry.level !== LogLevel.WARN && entry.level !== LogLevel.ERROR) {\n return;\n }\n\n // TODO(nf): add rate limiting to avoid spamming Sentry/consuming excessive quota.\n withScope((scope) => {\n const severity = convertLevel(level);\n scope.setLevel(severity);\n scope.setContext('dxoslog', entry.context ?? null);\n if (meta) {\n scope.setTag('transaction', `${getRelativeFilename(meta.F)}:${meta.L}`);\n\n if (meta.S?.hostSessionId) {\n scope.setTags({\n service_host_issue: true,\n service_host_session: meta.S?.hostSessionId,\n });\n }\n\n if (!Number.isNaN(meta.S?.uptimeSeconds)) {\n scope.setExtra('uptime_seconds', meta.S?.uptimeSeconds);\n }\n }\n\n const extendedMessage = formatMessageForSentry(entry);\n let capturedError = error;\n if (capturedError == null && entry.level === LogLevel.ERROR) {\n capturedError = Object.values(entry.context ?? {}).find((v): v is Error => v instanceof Error);\n }\n if (capturedError) {\n if (capturedError instanceof InvariantViolation) {\n scope.setExtra('invariant_violation', true);\n }\n const isMessageDifferentFromStackTrace = error == null;\n if (isMessageDifferentFromStackTrace) {\n scope.setExtra('message', extendedMessage);\n }\n const eventId = captureException(capturedError);\n this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);\n return;\n }\n\n const message = entry.message ?? (entry.error ? (entry.error.message ?? String(entry.error)) : '');\n scope.setFingerprint([message]);\n const eventId = captureMessage(extendedMessage);\n this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);\n });\n };\n\n public addLogBreadcrumbsTo(event: Event): void {\n event.breadcrumbs ??= [];\n for (const breadcrumb of this._breadcrumbs) {\n event.breadcrumbs.push(breadcrumb);\n }\n event.breadcrumbs.sort((b1, b2) => {\n if (b1.timestamp === undefined || b2.timestamp === undefined) {\n return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === undefined ? -1 : 1;\n }\n return b1.timestamp - b2.timestamp;\n });\n }\n\n private _addBreadcrumb(\n eventId: string | undefined,\n message: string,\n severity: SeverityLevel,\n context: { [key: string]: any } | undefined,\n ): void {\n const breadcrumb: Breadcrumb = {\n type: 'console',\n level: severity,\n event_id: eventId,\n category: 'log',\n message,\n data: context,\n timestamp: Math.floor(Date.now() / 1000),\n };\n const lastRecorded = this._breadcrumbs.getLast();\n if (lastRecorded && lastRecorded.message === breadcrumb.message) {\n const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};\n const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount)\n ? 1\n : Number(lastRecorded.data?.mergedBreadcrumbCount);\n lastRecorded.data = {\n mergedBreadcrumbCount: mergedBreadcrumbCount + 1,\n firstBreadcrumbData,\n lastBreadcrumbData: breadcrumb.data,\n };\n return;\n }\n this._breadcrumbs.push(breadcrumb);\n }\n}\n\nconst formatMessageForSentry = (entry: LogEntry): string => {\n const message = entry.message ?? (entry.error ? (entry.error.message ?? String(entry.error)) : '');\n\n let scopePrefix: string | undefined;\n if (entry.meta?.S) {\n const scope = entry.meta?.S;\n scopePrefix = scope.name || getDebugName(scope);\n }\n if (scopePrefix == null) {\n return message;\n }\n\n const workerPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';\n return `${workerPrefix}${scopePrefix} ${message}`;\n};\n\nconst convertLevel = (level: LogLevel): SeverityLevel => {\n switch (level) {\n case LogLevel.ERROR:\n return 'error';\n case LogLevel.VERBOSE:\n return 'info';\n case LogLevel.INFO:\n return 'info';\n case LogLevel.WARN:\n return 'warning';\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n return 'debug';\n default:\n throw never(level);\n }\n};\n\nconst never = (_: never) => {\n return new Error('unhandled value');\n};\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n"],
5
- "mappings": "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",
6
- "names": ["InvariantViolation", "LogLevel", "shouldLog", "CircularBuffer", "getDebugName", "MAX_LOG_BREADCRUMBS", "SentryLogProcessor", "_breadcrumbs", "CircularBuffer", "logProcessor", "config", "entry", "level", "meta", "error", "shouldLog", "captureFilters", "S", "remoteSessionId", "LogLevel", "DEBUG", "_addBreadcrumb", "undefined", "message", "String", "convertLevel", "WARN", "ERROR", "withScope", "scope", "severity", "setLevel", "setContext", "context", "setTag", "getRelativeFilename", "F", "L", "hostSessionId", "setTags", "service_host_issue", "service_host_session", "Number", "isNaN", "uptimeSeconds", "setExtra", "extendedMessage", "formatMessageForSentry", "capturedError", "Object", "values", "find", "v", "Error", "InvariantViolation", "isMessageDifferentFromStackTrace", "eventId", "captureException", "setFingerprint", "captureMessage", "addLogBreadcrumbsTo", "event", "breadcrumbs", "breadcrumb", "push", "sort", "b1", "b2", "timestamp", "type", "event_id", "category", "data", "Math", "floor", "Date", "now", "lastRecorded", "getLast", "firstBreadcrumbData", "mergedBreadcrumbCount", "lastBreadcrumbData", "scopePrefix", "name", "getDebugName", "workerPrefix", "VERBOSE", "INFO", "TRACE", "never", "_", "filename", "match", "filePath"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport type { Breadcrumb, Event, SeverityLevel } from '@sentry/types';\n\nimport { InvariantViolation } from '@dxos/invariant';\nimport { type LogConfig, type LogEntry, LogLevel, type LogProcessor, shouldLog } from '@dxos/log';\nimport { CircularBuffer, getDebugName } from '@dxos/util';\n\nimport { captureException, captureMessage, withScope } from './node';\n\nconst MAX_LOG_BREADCRUMBS = 150;\n\nexport class SentryLogProcessor {\n private _breadcrumbs = new CircularBuffer<Breadcrumb>(MAX_LOG_BREADCRUMBS);\n\n public readonly logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {\n const { level, meta, error } = entry;\n // Don't forward logs from remote sessions.\n if (!shouldLog(entry, config.captureFilters) || meta?.S?.remoteSessionId) {\n if (entry.level > LogLevel.DEBUG) {\n this._addBreadcrumb(\n undefined,\n entry.message ?? (entry.error ? (entry.error.message ?? String(entry.error)) : ''),\n convertLevel(entry.level),\n undefined,\n );\n }\n return;\n }\n if (entry.level !== LogLevel.WARN && entry.level !== LogLevel.ERROR) {\n return;\n }\n\n // TODO(nf): add rate limiting to avoid spamming Sentry/consuming excessive quota.\n withScope((scope) => {\n const severity = convertLevel(level);\n scope.setLevel(severity);\n scope.setContext('dxoslog', entry.context ?? null);\n if (meta) {\n scope.setTag('transaction', `${getRelativeFilename(meta.F)}:${meta.L}`);\n\n if (meta.S?.hostSessionId) {\n scope.setTags({\n service_host_issue: true,\n service_host_session: meta.S?.hostSessionId,\n });\n }\n\n if (!Number.isNaN(meta.S?.uptimeSeconds)) {\n scope.setExtra('uptime_seconds', meta.S?.uptimeSeconds);\n }\n }\n\n const extendedMessage = formatMessageForSentry(entry);\n let capturedError = error;\n if (capturedError == null && entry.level === LogLevel.ERROR) {\n capturedError = Object.values(entry.context ?? {}).find((v): v is Error => v instanceof Error);\n }\n if (capturedError) {\n if (capturedError instanceof InvariantViolation) {\n scope.setExtra('invariant_violation', true);\n }\n const isMessageDifferentFromStackTrace = error == null;\n if (isMessageDifferentFromStackTrace) {\n scope.setExtra('message', extendedMessage);\n }\n const eventId = captureException(capturedError);\n this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);\n return;\n }\n\n const message = entry.message ?? (entry.error ? (entry.error.message ?? String(entry.error)) : '');\n scope.setFingerprint([message]);\n const eventId = captureMessage(extendedMessage);\n this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);\n });\n };\n\n public addLogBreadcrumbsTo(event: Event): void {\n event.breadcrumbs ??= [];\n for (const breadcrumb of this._breadcrumbs) {\n event.breadcrumbs.push(breadcrumb);\n }\n event.breadcrumbs.sort((b1, b2) => {\n if (b1.timestamp === undefined || b2.timestamp === undefined) {\n return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === undefined ? -1 : 1;\n }\n return b1.timestamp - b2.timestamp;\n });\n }\n\n private _addBreadcrumb(\n eventId: string | undefined,\n message: string,\n severity: SeverityLevel,\n context: { [key: string]: any } | undefined,\n ): void {\n const breadcrumb: Breadcrumb = {\n type: 'console',\n level: severity,\n event_id: eventId,\n category: 'log',\n message,\n data: context,\n timestamp: Math.floor(Date.now() / 1000),\n };\n const lastRecorded = this._breadcrumbs.getLast();\n if (lastRecorded && lastRecorded.message === breadcrumb.message) {\n const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};\n const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount)\n ? 1\n : Number(lastRecorded.data?.mergedBreadcrumbCount);\n lastRecorded.data = {\n mergedBreadcrumbCount: mergedBreadcrumbCount + 1,\n firstBreadcrumbData,\n lastBreadcrumbData: breadcrumb.data,\n };\n return;\n }\n this._breadcrumbs.push(breadcrumb);\n }\n}\n\nconst formatMessageForSentry = (entry: LogEntry): string => {\n const message = entry.message ?? (entry.error ? (entry.error.message ?? String(entry.error)) : '');\n\n let scopePrefix: string | undefined;\n if (entry.meta?.S) {\n const scope = entry.meta?.S;\n scopePrefix = scope.name || getDebugName(scope);\n }\n if (scopePrefix == null) {\n return message;\n }\n\n const workerPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';\n return `${workerPrefix}${scopePrefix} ${message}`;\n};\n\nconst convertLevel = (level: LogLevel): SeverityLevel => {\n switch (level) {\n case LogLevel.ERROR:\n return 'error';\n case LogLevel.VERBOSE:\n return 'info';\n case LogLevel.INFO:\n return 'info';\n case LogLevel.WARN:\n return 'warning';\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n return 'debug';\n default:\n throw never(level);\n }\n};\n\nconst never = (_: never) => {\n return new Error('unhandled value');\n};\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["InvariantViolation", "LogLevel", "shouldLog", "CircularBuffer", "getDebugName", "MAX_LOG_BREADCRUMBS", "SentryLogProcessor", "addLogBreadcrumbsTo", "event", "breadcrumbs", "breadcrumb", "_breadcrumbs", "push", "sort", "b1", "b2", "timestamp", "undefined", "_addBreadcrumb", "eventId", "message", "severity", "context", "type", "level", "event_id", "category", "data", "Math", "floor", "Date", "now", "lastRecorded", "getLast", "firstBreadcrumbData", "mergedBreadcrumbCount", "Number", "isNaN", "lastBreadcrumbData", "CircularBuffer", "logProcessor", "config", "entry", "meta", "error", "shouldLog", "captureFilters", "S", "remoteSessionId", "LogLevel", "DEBUG", "String", "convertLevel", "WARN", "ERROR", "withScope", "scope", "setLevel", "setContext", "setTag", "getRelativeFilename", "F", "L", "hostSessionId", "setTags", "service_host_issue", "service_host_session", "uptimeSeconds", "setExtra", "extendedMessage", "formatMessageForSentry", "capturedError", "Object", "values", "find", "v", "Error", "InvariantViolation", "isMessageDifferentFromStackTrace", "captureException", "setFingerprint", "captureMessage", "scopePrefix", "name", "getDebugName", "workerPrefix", "VERBOSE", "INFO", "TRACE", "never", "_", "filename", "match", "filePath"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  captureException
4
- } from "./chunk-TEH6VIKV.mjs";
4
+ } from "./chunk-QK5IUYVA.mjs";
5
5
 
6
6
  // src/segment/node.ts
7
7
  import { Analytics } from "@segment/analytics-node";
@@ -19,6 +19,19 @@ var TelemetryEvent = /* @__PURE__ */ function(TelemetryEvent2) {
19
19
  }({});
20
20
 
21
21
  // src/segment/base.ts
22
+ function _define_property(obj, key, value) {
23
+ if (key in obj) {
24
+ Object.defineProperty(obj, key, {
25
+ value,
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true
29
+ });
30
+ } else {
31
+ obj[key] = value;
32
+ }
33
+ return obj;
34
+ }
22
35
  var __dxlog_file = "/__w/dxos/dxos/packages/sdk/observability/src/segment/base.ts";
23
36
  var getIdentityOptions = ({ did, installationId }) => {
24
37
  if (!did && !installationId) {
@@ -35,9 +48,6 @@ var getIdentityOptions = ({ did, installationId }) => {
35
48
  };
36
49
  };
37
50
  var AbstractSegmentTelemetry = class {
38
- constructor(_getTags) {
39
- this._getTags = _getTags;
40
- }
41
51
  createPageProps(options) {
42
52
  const { properties, ...rest } = options;
43
53
  return {
@@ -62,43 +72,35 @@ var AbstractSegmentTelemetry = class {
62
72
  }
63
73
  };
64
74
  }
75
+ constructor(_getTags) {
76
+ _define_property(this, "_getTags", void 0);
77
+ this._getTags = _getTags;
78
+ }
65
79
  };
66
80
 
67
81
  // src/segment/node.ts
82
+ function _define_property2(obj, key, value) {
83
+ if (key in obj) {
84
+ Object.defineProperty(obj, key, {
85
+ value,
86
+ enumerable: true,
87
+ configurable: true,
88
+ writable: true
89
+ });
90
+ } else {
91
+ obj[key] = value;
92
+ }
93
+ return obj;
94
+ }
68
95
  var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/observability/src/segment/node.ts";
69
96
  var SegmentTelemetry = class extends AbstractSegmentTelemetry {
70
- constructor({ apiKey, batchSize, getTags }) {
71
- super(getTags);
72
- try {
73
- invariant(apiKey, "Missing API key.", {
74
- F: __dxlog_file2,
75
- L: 23,
76
- S: this,
77
- A: [
78
- "apiKey",
79
- "'Missing API key.'"
80
- ]
81
- });
82
- this._analytics = new Analytics({
83
- writeKey: apiKey,
84
- flushAt: batchSize
85
- });
86
- } catch (err) {
87
- log2.catch("Failed to initialize telemetry", err, {
88
- F: __dxlog_file2,
89
- L: 29,
90
- S: this,
91
- C: (f, a) => f(...a)
92
- });
93
- }
94
- }
95
97
  identify(options) {
96
98
  if (!this._analytics) {
97
99
  log2("Analytics not initialized", {
98
100
  action: "identify"
99
101
  }, {
100
102
  F: __dxlog_file2,
101
- L: 35,
103
+ L: 36,
102
104
  S: this,
103
105
  C: (f, a) => f(...a)
104
106
  });
@@ -109,7 +111,7 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
109
111
  } catch (err) {
110
112
  log2.catch("Failed to identify", err, {
111
113
  F: __dxlog_file2,
112
- L: 42,
114
+ L: 43,
113
115
  S: this,
114
116
  C: (f, a) => f(...a)
115
117
  });
@@ -121,7 +123,7 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
121
123
  action: "page"
122
124
  }, {
123
125
  F: __dxlog_file2,
124
- L: 48,
126
+ L: 49,
125
127
  S: this,
126
128
  C: (f, a) => f(...a)
127
129
  });
@@ -132,7 +134,7 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
132
134
  } catch (err) {
133
135
  log2.catch("Failed to track page", err, {
134
136
  F: __dxlog_file2,
135
- L: 55,
137
+ L: 56,
136
138
  S: this,
137
139
  C: (f, a) => f(...a)
138
140
  });
@@ -144,7 +146,7 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
144
146
  action: "track"
145
147
  }, {
146
148
  F: __dxlog_file2,
147
- L: 61,
149
+ L: 62,
148
150
  S: this,
149
151
  C: (f, a) => f(...a)
150
152
  });
@@ -154,7 +156,7 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
154
156
  options
155
157
  }, {
156
158
  F: __dxlog_file2,
157
- L: 65,
159
+ L: 66,
158
160
  S: this,
159
161
  C: (f, a) => f(...a)
160
162
  });
@@ -163,7 +165,7 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
163
165
  } catch (err) {
164
166
  log2.catch("Failed to track action", err, {
165
167
  F: __dxlog_file2,
166
- L: 69,
168
+ L: 70,
167
169
  S: this,
168
170
  C: (f, a) => f(...a)
169
171
  });
@@ -175,7 +177,7 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
175
177
  action: "flush"
176
178
  }, {
177
179
  F: __dxlog_file2,
178
- L: 75,
180
+ L: 76,
179
181
  S: this,
180
182
  C: (f, a) => f(...a)
181
183
  });
@@ -193,10 +195,35 @@ var SegmentTelemetry = class extends AbstractSegmentTelemetry {
193
195
  }
194
196
  await this._analytics.closeAndFlush();
195
197
  }
198
+ constructor({ apiKey, batchSize, getTags }) {
199
+ super(getTags), _define_property2(this, "_analytics", void 0);
200
+ try {
201
+ invariant(apiKey, "Missing API key.", {
202
+ F: __dxlog_file2,
203
+ L: 24,
204
+ S: this,
205
+ A: [
206
+ "apiKey",
207
+ "'Missing API key.'"
208
+ ]
209
+ });
210
+ this._analytics = new Analytics({
211
+ writeKey: apiKey,
212
+ flushAt: batchSize
213
+ });
214
+ } catch (err) {
215
+ log2.catch("Failed to initialize telemetry", err, {
216
+ F: __dxlog_file2,
217
+ L: 30,
218
+ S: this,
219
+ C: (f, a) => f(...a)
220
+ });
221
+ }
222
+ }
196
223
  };
197
224
 
198
225
  export {
199
226
  TelemetryEvent,
200
227
  SegmentTelemetry
201
228
  };
202
- //# sourceMappingURL=chunk-552KLA6Z.mjs.map
229
+ //# sourceMappingURL=chunk-GOWQOSY6.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/segment/node.ts", "../../../src/segment/base.ts", "../../../src/segment/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Analytics, type IdentifyParams } from '@segment/analytics-node';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { captureException } from '../sentry';\n\nimport { AbstractSegmentTelemetry } from './base';\nimport type { PageOptions, SegmentTelemetryOptions, TrackOptions } from './types';\n\n/**\n * Node telemetry.\n */\nexport class SegmentTelemetry extends AbstractSegmentTelemetry {\n private _analytics?: Analytics;\n\n constructor({ apiKey, batchSize, getTags }: SegmentTelemetryOptions) {\n super(getTags);\n try {\n invariant(apiKey, 'Missing API key.');\n this._analytics = new Analytics({\n writeKey: apiKey,\n flushAt: batchSize,\n });\n } catch (err) {\n log.catch('Failed to initialize telemetry', err);\n }\n }\n\n identify(options: IdentifyParams): void {\n if (!this._analytics) {\n log('Analytics not initialized', { action: 'identify' });\n return;\n }\n\n try {\n this._analytics.identify(options);\n } catch (err) {\n log.catch('Failed to identify', err);\n }\n }\n\n page(options: PageOptions): void {\n if (!this._analytics) {\n log('Analytics not initialized', { action: 'page' });\n return;\n }\n\n try {\n this._analytics.page(this.createPageProps(options));\n } catch (err) {\n log.catch('Failed to track page', err);\n }\n }\n\n track(options: TrackOptions): void {\n if (!this._analytics) {\n log('Analytics not initialized', { action: 'track' });\n return;\n }\n\n log.info('sending event to telemetry', { options });\n try {\n this._analytics.track(this.createTrackProps(options));\n } catch (err) {\n log.catch('Failed to track action', err);\n }\n }\n\n async flush(): Promise<void> {\n if (!this._analytics) {\n log('Analytics not initialized', { action: 'flush' });\n return;\n }\n\n try {\n await this._analytics.flush();\n } catch (err) {\n // are these errors worth capturing?\n captureException(err);\n }\n }\n\n async close(): Promise<void> {\n if (!this._analytics) {\n return;\n }\n\n await this._analytics.closeAndFlush();\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type IdentifyParams, type PageParams, type TrackParams } from '@segment/analytics-node';\n\nimport { log } from '@dxos/log';\n\nimport {\n type IdentityOptions,\n type PageOptions,\n type SegmentIdentityOptions,\n type Tags,\n TelemetryEvent,\n type TrackOptions,\n} from './types';\n\n/**\n * NOTE: Segment provides a default ID if we don't provide one.\n */\nconst getIdentityOptions = ({ did, installationId }: IdentityOptions): SegmentIdentityOptions => {\n if (!did && !installationId) {\n log.warn('No telemetry identifier provided.');\n }\n\n return {\n userId: did,\n anonymousId: installationId,\n } as SegmentIdentityOptions;\n};\n\n/**\n * Base class for Node and BrowserSegment telemetry.\n */\nexport abstract class AbstractSegmentTelemetry {\n constructor(private readonly _getTags: () => Tags) {}\n\n abstract identify(options: IdentifyParams): void;\n\n abstract page(options: PageOptions): void;\n\n abstract track(options: TrackOptions): void;\n\n protected createPageProps(options: PageOptions): PageParams {\n const { properties, ...rest } = options;\n return {\n ...getIdentityOptions(options),\n ...rest,\n properties: {\n common: this._getTags(),\n custom: properties,\n },\n };\n }\n\n protected createTrackProps(options: TrackOptions): TrackParams {\n const { event, action, properties, ...rest } = options;\n return {\n ...getIdentityOptions(options),\n ...rest,\n event: event ?? TelemetryEvent.ACTION,\n properties: {\n action,\n common: this._getTags(),\n custom: properties,\n },\n };\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nexport type Tags = Record<string, string>;\n\nexport type SegmentTelemetryOptions = {\n apiKey?: string;\n batchSize?: number;\n enable?: boolean;\n getTags: () => Tags;\n};\n\n// Copied from @segment/analytics-node.\nexport type SegmentIdentityOptions =\n | { userId: string; anonymousId?: string }\n | { userId?: string; anonymousId: string };\n\n// TODO(burdon): Should require one or the other.\nexport type IdentityOptions = { did?: string; installationId?: string };\n\nexport type CommonOptions = IdentityOptions & {\n timestamp?: Date;\n properties?: Record<string, unknown>;\n};\n\n/**\n * Page views.\n * https://segment.com/docs/connections/sources/catalog/libraries/server/node/#page\n */\nexport type PageOptions = CommonOptions & {\n category?: string;\n name?: string;\n};\n\n/**\n * Track actions.\n * https://segment.com/docs/connections/sources/catalog/libraries/server/node/#track\n */\nexport type TrackOptions = CommonOptions & {\n event?: TelemetryEvent;\n action: string;\n};\n\n/**\n * Each event will be mapped to a different Postgres table via segment.\n */\nexport enum TelemetryEvent {\n /**\n * Use actions.\n */\n ACTION = 'action',\n /**\n * High-volume technical metrics.\n */\n METRICS = 'metrics',\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Analytics", "invariant", "log", "log", "TelemetryEvent", "getIdentityOptions", "did", "installationId", "log", "warn", "userId", "anonymousId", "AbstractSegmentTelemetry", "createPageProps", "options", "properties", "rest", "common", "_getTags", "custom", "createTrackProps", "event", "action", "TelemetryEvent", "ACTION", "SegmentTelemetry", "AbstractSegmentTelemetry", "identify", "options", "_analytics", "log", "action", "err", "catch", "page", "createPageProps", "track", "info", "createTrackProps", "flush", "captureException", "close", "closeAndFlush", "apiKey", "batchSize", "getTags", "_define_property", "invariant", "Analytics", "writeKey", "flushAt"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
3
  // src/sentry/node.ts
4
- import { init as naturalInit, setTag, addBreadcrumb as naturalAddBreadcrumb, captureException as naturalCaptureException, captureMessage as naturalCaptureMessage, withScope as naturalWithScope, metrics, startInactiveSpan } from "@sentry/node";
4
+ import { metrics, addBreadcrumb as naturalAddBreadcrumb, captureException as naturalCaptureException, captureMessage as naturalCaptureMessage, init as naturalInit, withScope as naturalWithScope, setTag, startInactiveSpan } from "@sentry/node";
5
5
  import { log } from "@dxos/log";
6
6
  import { TRACE_PROCESSOR } from "@dxos/tracing";
7
7
  import { setTag as setTag2, setTags, setUser } from "@sentry/node";
@@ -132,4 +132,4 @@ export {
132
132
  setTags,
133
133
  setUser
134
134
  };
135
- //# sourceMappingURL=chunk-TEH6VIKV.mjs.map
135
+ //# sourceMappingURL=chunk-QK5IUYVA.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/sentry/node.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport {\n type Event,\n init as naturalInit,\n setTag,\n addBreadcrumb as naturalAddBreadcrumb,\n captureException as naturalCaptureException,\n captureMessage as naturalCaptureMessage,\n withScope as naturalWithScope,\n metrics,\n startInactiveSpan,\n} from '@sentry/node';\n\nimport { log } from '@dxos/log';\nimport { TRACE_PROCESSOR } from '@dxos/tracing';\n\nimport { type InitOptions } from './types';\n\n// Polyfill export.\nexport { setTag, setTags, setUser } from '@sentry/node';\n\n/**\n * To use this SDK, call the init function as early as possible in the main entry module.\n * To set context information or send manual events, use the provided methods.\n *\n * @param options {InitOptions}\n */\nexport const init = (options: InitOptions) => {\n try {\n naturalInit({\n enabled: options.enable ?? true,\n dsn: options.destination,\n serverName: options.installationId,\n release: options.release,\n environment: options.environment ?? process.env.DX_ENVIRONMENT,\n integrations: [],\n tracesSampleRate: options.sampleRate,\n transport: options.transport,\n beforeSend: (event) => {\n options.scrubFilenames && scrub(event);\n options.onError?.(event);\n\n return event;\n },\n });\n\n if (options.tracing) {\n TRACE_PROCESSOR.remoteMetrics.registerProcessor(metrics);\n TRACE_PROCESSOR.remoteTracing.registerProcessor({\n startSpan: startInactiveSpan,\n });\n }\n\n Object.entries(options.properties ?? {}).forEach(([key, value]) => {\n setTag(key, value);\n });\n } catch (err) {\n log.catch('Failed to initialize sentry', err);\n }\n};\n\nconst scrub = (event: Event) => {\n event.exception?.values?.forEach((value) => {\n value.stacktrace?.frames?.forEach((frame) => {\n const filename = frame.filename?.split('/');\n frame.filename = filename && filename[filename.length - 1];\n });\n });\n};\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on user's actions prior to an error or crash.\n *\n * https://docs.sentry.io/platforms/javascript/enriching-events/breadcrumbs/\n *\n * @param breadcrumb — The breadcrumb to record.\n */\nexport const addBreadcrumb: typeof naturalAddBreadcrumb = (breadcrumb) => {\n try {\n naturalAddBreadcrumb(breadcrumb);\n log('add breadcrumb', breadcrumb);\n } catch (err) {\n log.catch('Failed to add breadcrumb', err);\n }\n};\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception — An exception-like object.\n * @param captureContext — Additional scope data to apply to exception event.\n * @returns — The generated eventId.\n */\nexport const captureException: typeof naturalCaptureException = (exception, captureContext) => {\n try {\n const eventId = naturalCaptureException(exception, captureContext);\n log('capture exception', { exception, eventId, ...captureContext });\n return eventId;\n } catch (err) {\n log.catch('Failed to capture exception', err);\n return 'unknown';\n }\n};\n\nexport const captureMessage: typeof naturalCaptureMessage = (exception, captureContext) => {\n try {\n const eventId = naturalCaptureMessage(exception, captureContext);\n log('capture message', { exception, eventId, captureContext });\n return eventId;\n } catch (err) {\n log.catch('Failed to capture message', err);\n return 'unknown';\n }\n};\n\nexport const captureUserFeedback = (message: string): Promise<void> => {\n const feedback = `User feedback: ${message}`;\n throw new Error(`Capture user feedback not implemented in node. Use @sentry/browser. Message: ${feedback}`);\n};\n\nexport const withScope = naturalWithScope;\n"],
5
- "mappings": ";;;AAIA,SAEEA,QAAQC,aACRC,QACAC,iBAAiBC,sBACjBC,oBAAoBC,yBACpBC,kBAAkBC,uBAClBC,aAAaC,kBACbC,SACAC,yBACK;AAEP,SAASC,WAAW;AACpB,SAASC,uBAAuB;AAKhC,SAASZ,UAAAA,SAAQa,SAASC,eAAe;;AAQlC,IAAMhB,OAAO,CAACiB,YAAAA;AACnB,MAAI;AACFhB,gBAAY;MACViB,SAASD,QAAQE,UAAU;MAC3BC,KAAKH,QAAQI;MACbC,YAAYL,QAAQM;MACpBC,SAASP,QAAQO;MACjBC,aAAaR,QAAQQ,eAAeC,QAAQC,IAAIC;MAChDC,cAAc,CAAA;MACdC,kBAAkBb,QAAQc;MAC1BC,WAAWf,QAAQe;MACnBC,YAAY,CAACC,UAAAA;AACXjB,gBAAQkB,kBAAkBC,MAAMF,KAAAA;AAChCjB,gBAAQoB,UAAUH,KAAAA;AAElB,eAAOA;MACT;IACF,CAAA;AAEA,QAAIjB,QAAQqB,SAAS;AACnBxB,sBAAgByB,cAAcC,kBAAkB7B,OAAAA;AAChDG,sBAAgB2B,cAAcD,kBAAkB;QAC9CE,WAAW9B;MACb,CAAA;IACF;AAEA+B,WAAOC,QAAQ3B,QAAQ4B,cAAc,CAAC,CAAA,EAAGC,QAAQ,CAAC,CAACC,KAAKC,KAAAA,MAAM;AAC5D9C,aAAO6C,KAAKC,KAAAA;IACd,CAAA;EACF,SAASC,KAAK;AACZpC,QAAIqC,MAAM,+BAA+BD,KAAAA;;;;;;EAC3C;AACF;AAEA,IAAMb,QAAQ,CAACF,UAAAA;AACbA,QAAMiB,WAAWC,QAAQN,QAAQ,CAACE,UAAAA;AAChCA,UAAMK,YAAYC,QAAQR,QAAQ,CAACS,UAAAA;AACjC,YAAMC,WAAWD,MAAMC,UAAUC,MAAM,GAAA;AACvCF,YAAMC,WAAWA,YAAYA,SAASA,SAASE,SAAS,CAAA;IAC1D,CAAA;EACF,CAAA;AACF;AAWO,IAAMvD,gBAA6C,CAACwD,eAAAA;AACzD,MAAI;AACFvD,yBAAqBuD,UAAAA;AACrB9C,QAAI,kBAAkB8C,YAAAA;;;;;;EACxB,SAASV,KAAK;AACZpC,QAAIqC,MAAM,4BAA4BD,KAAAA;;;;;;EACxC;AACF;AASO,IAAM5C,mBAAmD,CAAC8C,WAAWS,mBAAAA;AAC1E,MAAI;AACF,UAAMC,UAAUvD,wBAAwB6C,WAAWS,cAAAA;AACnD/C,QAAI,qBAAqB;MAAEsC;MAAWU;MAAS,GAAGD;IAAe,GAAA;;;;;;AACjE,WAAOC;EACT,SAASZ,KAAK;AACZpC,QAAIqC,MAAM,+BAA+BD,KAAAA;;;;;;AACzC,WAAO;EACT;AACF;AAEO,IAAM1C,iBAA+C,CAAC4C,WAAWS,mBAAAA;AACtE,MAAI;AACF,UAAMC,UAAUrD,sBAAsB2C,WAAWS,cAAAA;AACjD/C,QAAI,mBAAmB;MAAEsC;MAAWU;MAASD;IAAe,GAAA;;;;;;AAC5D,WAAOC;EACT,SAASZ,KAAK;AACZpC,QAAIqC,MAAM,6BAA6BD,KAAAA;;;;;;AACvC,WAAO;EACT;AACF;AAEO,IAAMa,sBAAsB,CAACC,YAAAA;AAClC,QAAMC,WAAW,kBAAkBD,OAAAA;AACnC,QAAM,IAAIE,MAAM,gFAAgFD,QAAAA,EAAU;AAC5G;AAEO,IAAMvD,YAAYC;",
6
- "names": ["init", "naturalInit", "setTag", "addBreadcrumb", "naturalAddBreadcrumb", "captureException", "naturalCaptureException", "captureMessage", "naturalCaptureMessage", "withScope", "naturalWithScope", "metrics", "startInactiveSpan", "log", "TRACE_PROCESSOR", "setTags", "setUser", "options", "enabled", "enable", "dsn", "destination", "serverName", "installationId", "release", "environment", "process", "env", "DX_ENVIRONMENT", "integrations", "tracesSampleRate", "sampleRate", "transport", "beforeSend", "event", "scrubFilenames", "scrub", "onError", "tracing", "remoteMetrics", "registerProcessor", "remoteTracing", "startSpan", "Object", "entries", "properties", "forEach", "key", "value", "err", "catch", "exception", "values", "stacktrace", "frames", "frame", "filename", "split", "length", "breadcrumb", "captureContext", "eventId", "captureUserFeedback", "message", "feedback", "Error"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport {\n type Event,\n metrics,\n addBreadcrumb as naturalAddBreadcrumb,\n captureException as naturalCaptureException,\n captureMessage as naturalCaptureMessage,\n init as naturalInit,\n withScope as naturalWithScope,\n setTag,\n startInactiveSpan,\n} from '@sentry/node';\n\nimport { log } from '@dxos/log';\nimport { TRACE_PROCESSOR } from '@dxos/tracing';\n\nimport { type InitOptions } from './types';\n\n// Polyfill export.\nexport { setTag, setTags, setUser } from '@sentry/node';\n\n/**\n * To use this SDK, call the init function as early as possible in the main entry module.\n * To set context information or send manual events, use the provided methods.\n *\n * @param options {InitOptions}\n */\nexport const init = (options: InitOptions) => {\n try {\n naturalInit({\n enabled: options.enable ?? true,\n dsn: options.destination,\n serverName: options.installationId,\n release: options.release,\n environment: options.environment ?? process.env.DX_ENVIRONMENT,\n integrations: [],\n tracesSampleRate: options.sampleRate,\n transport: options.transport,\n beforeSend: (event) => {\n options.scrubFilenames && scrub(event);\n options.onError?.(event);\n\n return event;\n },\n });\n\n if (options.tracing) {\n TRACE_PROCESSOR.remoteMetrics.registerProcessor(metrics);\n TRACE_PROCESSOR.remoteTracing.registerProcessor({\n startSpan: startInactiveSpan,\n });\n }\n\n Object.entries(options.properties ?? {}).forEach(([key, value]) => {\n setTag(key, value);\n });\n } catch (err) {\n log.catch('Failed to initialize sentry', err);\n }\n};\n\nconst scrub = (event: Event) => {\n event.exception?.values?.forEach((value) => {\n value.stacktrace?.frames?.forEach((frame) => {\n const filename = frame.filename?.split('/');\n frame.filename = filename && filename[filename.length - 1];\n });\n });\n};\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on user's actions prior to an error or crash.\n *\n * https://docs.sentry.io/platforms/javascript/enriching-events/breadcrumbs/\n *\n * @param breadcrumb — The breadcrumb to record.\n */\nexport const addBreadcrumb: typeof naturalAddBreadcrumb = (breadcrumb) => {\n try {\n naturalAddBreadcrumb(breadcrumb);\n log('add breadcrumb', breadcrumb);\n } catch (err) {\n log.catch('Failed to add breadcrumb', err);\n }\n};\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception — An exception-like object.\n * @param captureContext — Additional scope data to apply to exception event.\n * @returns — The generated eventId.\n */\nexport const captureException: typeof naturalCaptureException = (exception, captureContext) => {\n try {\n const eventId = naturalCaptureException(exception, captureContext);\n log('capture exception', { exception, eventId, ...captureContext });\n return eventId;\n } catch (err) {\n log.catch('Failed to capture exception', err);\n return 'unknown';\n }\n};\n\nexport const captureMessage: typeof naturalCaptureMessage = (exception, captureContext) => {\n try {\n const eventId = naturalCaptureMessage(exception, captureContext);\n log('capture message', { exception, eventId, captureContext });\n return eventId;\n } catch (err) {\n log.catch('Failed to capture message', err);\n return 'unknown';\n }\n};\n\nexport const captureUserFeedback = (message: string): Promise<void> => {\n const feedback = `User feedback: ${message}`;\n throw new Error(`Capture user feedback not implemented in node. Use @sentry/browser. Message: ${feedback}`);\n};\n\nexport const withScope = naturalWithScope;\n"],
5
+ "mappings": ";;;AAIA,SAEEA,SACAC,iBAAiBC,sBACjBC,oBAAoBC,yBACpBC,kBAAkBC,uBAClBC,QAAQC,aACRC,aAAaC,kBACbC,QACAC,yBACK;AAEP,SAASC,WAAW;AACpB,SAASC,uBAAuB;AAKhC,SAASH,UAAAA,SAAQI,SAASC,eAAe;;AAQlC,IAAMT,OAAO,CAACU,YAAAA;AACnB,MAAI;AACFT,gBAAY;MACVU,SAASD,QAAQE,UAAU;MAC3BC,KAAKH,QAAQI;MACbC,YAAYL,QAAQM;MACpBC,SAASP,QAAQO;MACjBC,aAAaR,QAAQQ,eAAeC,QAAQC,IAAIC;MAChDC,cAAc,CAAA;MACdC,kBAAkBb,QAAQc;MAC1BC,WAAWf,QAAQe;MACnBC,YAAY,CAACC,UAAAA;AACXjB,gBAAQkB,kBAAkBC,MAAMF,KAAAA;AAChCjB,gBAAQoB,UAAUH,KAAAA;AAElB,eAAOA;MACT;IACF,CAAA;AAEA,QAAIjB,QAAQqB,SAAS;AACnBxB,sBAAgByB,cAAcC,kBAAkBxC,OAAAA;AAChDc,sBAAgB2B,cAAcD,kBAAkB;QAC9CE,WAAW9B;MACb,CAAA;IACF;AAEA+B,WAAOC,QAAQ3B,QAAQ4B,cAAc,CAAC,CAAA,EAAGC,QAAQ,CAAC,CAACC,KAAKC,KAAAA,MAAM;AAC5DrC,aAAOoC,KAAKC,KAAAA;IACd,CAAA;EACF,SAASC,KAAK;AACZpC,QAAIqC,MAAM,+BAA+BD,KAAAA;;;;;;EAC3C;AACF;AAEA,IAAMb,QAAQ,CAACF,UAAAA;AACbA,QAAMiB,WAAWC,QAAQN,QAAQ,CAACE,UAAAA;AAChCA,UAAMK,YAAYC,QAAQR,QAAQ,CAACS,UAAAA;AACjC,YAAMC,WAAWD,MAAMC,UAAUC,MAAM,GAAA;AACvCF,YAAMC,WAAWA,YAAYA,SAASA,SAASE,SAAS,CAAA;IAC1D,CAAA;EACF,CAAA;AACF;AAWO,IAAMzD,gBAA6C,CAAC0D,eAAAA;AACzD,MAAI;AACFzD,yBAAqByD,UAAAA;AACrB9C,QAAI,kBAAkB8C,YAAAA;;;;;;EACxB,SAASV,KAAK;AACZpC,QAAIqC,MAAM,4BAA4BD,KAAAA;;;;;;EACxC;AACF;AASO,IAAM9C,mBAAmD,CAACgD,WAAWS,mBAAAA;AAC1E,MAAI;AACF,UAAMC,UAAUzD,wBAAwB+C,WAAWS,cAAAA;AACnD/C,QAAI,qBAAqB;MAAEsC;MAAWU;MAAS,GAAGD;IAAe,GAAA;;;;;;AACjE,WAAOC;EACT,SAASZ,KAAK;AACZpC,QAAIqC,MAAM,+BAA+BD,KAAAA;;;;;;AACzC,WAAO;EACT;AACF;AAEO,IAAM5C,iBAA+C,CAAC8C,WAAWS,mBAAAA;AACtE,MAAI;AACF,UAAMC,UAAUvD,sBAAsB6C,WAAWS,cAAAA;AACjD/C,QAAI,mBAAmB;MAAEsC;MAAWU;MAASD;IAAe,GAAA;;;;;;AAC5D,WAAOC;EACT,SAASZ,KAAK;AACZpC,QAAIqC,MAAM,6BAA6BD,KAAAA;;;;;;AACvC,WAAO;EACT;AACF;AAEO,IAAMa,sBAAsB,CAACC,YAAAA;AAClC,QAAMC,WAAW,kBAAkBD,OAAAA;AACnC,QAAM,IAAIE,MAAM,gFAAgFD,QAAAA,EAAU;AAC5G;AAEO,IAAMvD,YAAYC;",
6
+ "names": ["metrics", "addBreadcrumb", "naturalAddBreadcrumb", "captureException", "naturalCaptureException", "captureMessage", "naturalCaptureMessage", "init", "naturalInit", "withScope", "naturalWithScope", "setTag", "startInactiveSpan", "log", "TRACE_PROCESSOR", "setTags", "setUser", "options", "enabled", "enable", "dsn", "destination", "serverName", "installationId", "release", "environment", "process", "env", "DX_ENVIRONMENT", "integrations", "tracesSampleRate", "sampleRate", "transport", "beforeSend", "event", "scrubFilenames", "scrub", "onError", "tracing", "remoteMetrics", "registerProcessor", "remoteTracing", "startSpan", "Object", "entries", "properties", "forEach", "key", "value", "err", "catch", "exception", "values", "stacktrace", "frames", "frame", "filename", "split", "length", "breadcrumb", "captureContext", "eventId", "captureUserFeedback", "message", "feedback", "Error"]
7
7
  }