datadog-frontend-toolkit 1.0.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 (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +486 -0
  3. package/dist/cjs/context/ContextManager.js +197 -0
  4. package/dist/cjs/context/ContextManager.js.map +1 -0
  5. package/dist/cjs/core/BootstrapGuard.js +81 -0
  6. package/dist/cjs/core/BootstrapGuard.js.map +1 -0
  7. package/dist/cjs/core/ConfigManager.js +133 -0
  8. package/dist/cjs/core/ConfigManager.js.map +1 -0
  9. package/dist/cjs/core/ObservabilitySDK.js +355 -0
  10. package/dist/cjs/core/ObservabilitySDK.js.map +1 -0
  11. package/dist/cjs/errors/ErrorBoundary.js +187 -0
  12. package/dist/cjs/errors/ErrorBoundary.js.map +1 -0
  13. package/dist/cjs/index.js +110 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/logger/LoggerService.js +256 -0
  16. package/dist/cjs/logger/LoggerService.js.map +1 -0
  17. package/dist/cjs/logs/LogsManager.js +112 -0
  18. package/dist/cjs/logs/LogsManager.js.map +1 -0
  19. package/dist/cjs/network/NetworkInterceptor.js +185 -0
  20. package/dist/cjs/network/NetworkInterceptor.js.map +1 -0
  21. package/dist/cjs/performance/PerformanceMonitor.js +290 -0
  22. package/dist/cjs/performance/PerformanceMonitor.js.map +1 -0
  23. package/dist/cjs/resources/ResourceProvisioner.js +210 -0
  24. package/dist/cjs/resources/ResourceProvisioner.js.map +1 -0
  25. package/dist/cjs/resources/templates/dashboard.js +333 -0
  26. package/dist/cjs/resources/templates/dashboard.js.map +1 -0
  27. package/dist/cjs/resources/templates/monitors.js +120 -0
  28. package/dist/cjs/resources/templates/monitors.js.map +1 -0
  29. package/dist/cjs/resources/templates/slos.js +79 -0
  30. package/dist/cjs/resources/templates/slos.js.map +1 -0
  31. package/dist/cjs/rum/RumManager.js +164 -0
  32. package/dist/cjs/rum/RumManager.js.map +1 -0
  33. package/dist/cjs/types/config.js +13 -0
  34. package/dist/cjs/types/config.js.map +1 -0
  35. package/dist/cjs/types/events.js +26 -0
  36. package/dist/cjs/types/events.js.map +1 -0
  37. package/dist/cjs/types/index.js +20 -0
  38. package/dist/cjs/types/index.js.map +1 -0
  39. package/dist/cjs/types/logger.js +13 -0
  40. package/dist/cjs/types/logger.js.map +1 -0
  41. package/dist/cjs/utils/EventEmitter.js +49 -0
  42. package/dist/cjs/utils/EventEmitter.js.map +1 -0
  43. package/dist/cjs/utils/fingerprint.js +48 -0
  44. package/dist/cjs/utils/fingerprint.js.map +1 -0
  45. package/dist/cjs/utils/retry.js +35 -0
  46. package/dist/cjs/utils/retry.js.map +1 -0
  47. package/dist/cjs/utils/sanitizer.js +106 -0
  48. package/dist/cjs/utils/sanitizer.js.map +1 -0
  49. package/dist/cjs/utils/storage.js +99 -0
  50. package/dist/cjs/utils/storage.js.map +1 -0
  51. package/dist/cli/commands/setup.js +178 -0
  52. package/dist/cli/commands/setup.js.map +1 -0
  53. package/dist/cli/commands/status.js +103 -0
  54. package/dist/cli/commands/status.js.map +1 -0
  55. package/dist/cli/index.js +111 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/prompt.js +140 -0
  58. package/dist/cli/prompt.js.map +1 -0
  59. package/dist/esm/context/ContextManager.js +193 -0
  60. package/dist/esm/context/ContextManager.js.map +1 -0
  61. package/dist/esm/core/BootstrapGuard.js +77 -0
  62. package/dist/esm/core/BootstrapGuard.js.map +1 -0
  63. package/dist/esm/core/ConfigManager.js +129 -0
  64. package/dist/esm/core/ConfigManager.js.map +1 -0
  65. package/dist/esm/core/ObservabilitySDK.js +351 -0
  66. package/dist/esm/core/ObservabilitySDK.js.map +1 -0
  67. package/dist/esm/errors/ErrorBoundary.js +183 -0
  68. package/dist/esm/errors/ErrorBoundary.js.map +1 -0
  69. package/dist/esm/index.js +87 -0
  70. package/dist/esm/index.js.map +1 -0
  71. package/dist/esm/logger/LoggerService.js +251 -0
  72. package/dist/esm/logger/LoggerService.js.map +1 -0
  73. package/dist/esm/logs/LogsManager.js +108 -0
  74. package/dist/esm/logs/LogsManager.js.map +1 -0
  75. package/dist/esm/network/NetworkInterceptor.js +181 -0
  76. package/dist/esm/network/NetworkInterceptor.js.map +1 -0
  77. package/dist/esm/performance/PerformanceMonitor.js +286 -0
  78. package/dist/esm/performance/PerformanceMonitor.js.map +1 -0
  79. package/dist/esm/resources/ResourceProvisioner.js +206 -0
  80. package/dist/esm/resources/ResourceProvisioner.js.map +1 -0
  81. package/dist/esm/resources/templates/dashboard.js +330 -0
  82. package/dist/esm/resources/templates/dashboard.js.map +1 -0
  83. package/dist/esm/resources/templates/monitors.js +117 -0
  84. package/dist/esm/resources/templates/monitors.js.map +1 -0
  85. package/dist/esm/resources/templates/slos.js +76 -0
  86. package/dist/esm/resources/templates/slos.js.map +1 -0
  87. package/dist/esm/rum/RumManager.js +160 -0
  88. package/dist/esm/rum/RumManager.js.map +1 -0
  89. package/dist/esm/types/config.js +10 -0
  90. package/dist/esm/types/config.js.map +1 -0
  91. package/dist/esm/types/events.js +23 -0
  92. package/dist/esm/types/events.js.map +1 -0
  93. package/dist/esm/types/index.js +4 -0
  94. package/dist/esm/types/index.js.map +1 -0
  95. package/dist/esm/types/logger.js +10 -0
  96. package/dist/esm/types/logger.js.map +1 -0
  97. package/dist/esm/utils/EventEmitter.js +45 -0
  98. package/dist/esm/utils/EventEmitter.js.map +1 -0
  99. package/dist/esm/utils/fingerprint.js +44 -0
  100. package/dist/esm/utils/fingerprint.js.map +1 -0
  101. package/dist/esm/utils/retry.js +32 -0
  102. package/dist/esm/utils/retry.js.map +1 -0
  103. package/dist/esm/utils/sanitizer.js +102 -0
  104. package/dist/esm/utils/sanitizer.js.map +1 -0
  105. package/dist/esm/utils/storage.js +95 -0
  106. package/dist/esm/utils/storage.js.map +1 -0
  107. package/dist/resources/ResourceProvisioner.js +207 -0
  108. package/dist/resources/ResourceProvisioner.js.map +1 -0
  109. package/dist/resources/templates/dashboard.js +333 -0
  110. package/dist/resources/templates/dashboard.js.map +1 -0
  111. package/dist/resources/templates/monitors.js +120 -0
  112. package/dist/resources/templates/monitors.js.map +1 -0
  113. package/dist/resources/templates/slos.js +79 -0
  114. package/dist/resources/templates/slos.js.map +1 -0
  115. package/dist/types/config.js +13 -0
  116. package/dist/types/config.js.map +1 -0
  117. package/dist/types/context/ContextManager.d.ts +63 -0
  118. package/dist/types/context/ContextManager.d.ts.map +1 -0
  119. package/dist/types/core/BootstrapGuard.d.ts +46 -0
  120. package/dist/types/core/BootstrapGuard.d.ts.map +1 -0
  121. package/dist/types/core/ConfigManager.d.ts +13 -0
  122. package/dist/types/core/ConfigManager.d.ts.map +1 -0
  123. package/dist/types/core/ObservabilitySDK.d.ts +141 -0
  124. package/dist/types/core/ObservabilitySDK.d.ts.map +1 -0
  125. package/dist/types/errors/ErrorBoundary.d.ts +55 -0
  126. package/dist/types/errors/ErrorBoundary.d.ts.map +1 -0
  127. package/dist/types/events.js +26 -0
  128. package/dist/types/events.js.map +1 -0
  129. package/dist/types/index.d.ts +75 -0
  130. package/dist/types/index.d.ts.map +1 -0
  131. package/dist/types/index.js +20 -0
  132. package/dist/types/index.js.map +1 -0
  133. package/dist/types/logger/LoggerService.d.ts +104 -0
  134. package/dist/types/logger/LoggerService.d.ts.map +1 -0
  135. package/dist/types/logger.js +13 -0
  136. package/dist/types/logger.js.map +1 -0
  137. package/dist/types/logs/LogsManager.d.ts +41 -0
  138. package/dist/types/logs/LogsManager.d.ts.map +1 -0
  139. package/dist/types/network/NetworkInterceptor.d.ts +35 -0
  140. package/dist/types/network/NetworkInterceptor.d.ts.map +1 -0
  141. package/dist/types/performance/PerformanceMonitor.d.ts +44 -0
  142. package/dist/types/performance/PerformanceMonitor.d.ts.map +1 -0
  143. package/dist/types/resources/ResourceProvisioner.d.ts +46 -0
  144. package/dist/types/resources/ResourceProvisioner.d.ts.map +1 -0
  145. package/dist/types/resources/templates/dashboard.d.ts +6 -0
  146. package/dist/types/resources/templates/dashboard.d.ts.map +1 -0
  147. package/dist/types/resources/templates/monitors.d.ts +11 -0
  148. package/dist/types/resources/templates/monitors.d.ts.map +1 -0
  149. package/dist/types/resources/templates/slos.d.ts +18 -0
  150. package/dist/types/resources/templates/slos.d.ts.map +1 -0
  151. package/dist/types/rum/RumManager.d.ts +70 -0
  152. package/dist/types/rum/RumManager.d.ts.map +1 -0
  153. package/dist/types/types/config.d.ts +271 -0
  154. package/dist/types/types/config.d.ts.map +1 -0
  155. package/dist/types/types/events.d.ts +71 -0
  156. package/dist/types/types/events.d.ts.map +1 -0
  157. package/dist/types/types/index.d.ts +4 -0
  158. package/dist/types/types/index.d.ts.map +1 -0
  159. package/dist/types/types/logger.d.ts +102 -0
  160. package/dist/types/types/logger.d.ts.map +1 -0
  161. package/dist/types/utils/EventEmitter.d.ts +14 -0
  162. package/dist/types/utils/EventEmitter.d.ts.map +1 -0
  163. package/dist/types/utils/fingerprint.d.ts +10 -0
  164. package/dist/types/utils/fingerprint.d.ts.map +1 -0
  165. package/dist/types/utils/retry.d.ts +9 -0
  166. package/dist/types/utils/retry.d.ts.map +1 -0
  167. package/dist/types/utils/sanitizer.d.ts +14 -0
  168. package/dist/types/utils/sanitizer.d.ts.map +1 -0
  169. package/dist/types/utils/storage.d.ts +17 -0
  170. package/dist/types/utils/storage.d.ts.map +1 -0
  171. package/dist/utils/retry.js +35 -0
  172. package/dist/utils/retry.js.map +1 -0
  173. package/package.json +84 -0
@@ -0,0 +1,351 @@
1
+ import { SDKEvent } from '../types/events';
2
+ import { ConfigManager } from './ConfigManager';
3
+ import { BootstrapGuard } from './BootstrapGuard';
4
+ import { ContextManager } from '../context/ContextManager';
5
+ import { RumManager } from '../rum/RumManager';
6
+ import { LogsManager } from '../logs/LogsManager';
7
+ import { LoggerService } from '../logger/LoggerService';
8
+ import { ErrorBoundary } from '../errors/ErrorBoundary';
9
+ import { PerformanceMonitor } from '../performance/PerformanceMonitor';
10
+ import { NetworkInterceptor } from '../network/NetworkInterceptor';
11
+ import { EventEmitter } from '../utils/EventEmitter';
12
+ /**
13
+ * Main orchestrator for the Observability Toolkit.
14
+ *
15
+ * Implements the Facade pattern to provide a single entry point
16
+ * for all observability features. Manages the lifecycle of all
17
+ * sub-modules and coordinates initialization.
18
+ *
19
+ * Usage:
20
+ * ```ts
21
+ * import { init } from 'datadog-frontend-toolkit';
22
+ *
23
+ * const observatory = init({
24
+ * clientToken: 'pub-xxx',
25
+ * applicationId: 'xxx',
26
+ * service: 'my-app',
27
+ * env: 'production',
28
+ * });
29
+ *
30
+ * const logger = observatory.logger;
31
+ * logger.info('App started');
32
+ * ```
33
+ */
34
+ export class ObservabilitySDK {
35
+ static instance = null;
36
+ config;
37
+ emitter;
38
+ contextManager;
39
+ rumManager;
40
+ logsManager;
41
+ errorBoundary;
42
+ performanceMonitor;
43
+ networkInterceptor;
44
+ /** Public logger instance */
45
+ logger;
46
+ destroyed = false;
47
+ constructor(config) {
48
+ // Apply lifecycle hook
49
+ const finalConfig = config.hooks?.beforeInit?.(config) ?? config;
50
+ // Resolve config with defaults
51
+ this.config = ConfigManager.resolve(finalConfig);
52
+ // Initialize core infrastructure
53
+ this.emitter = new EventEmitter();
54
+ this.contextManager = new ContextManager(this.config, this.emitter);
55
+ // Initialize Datadog SDKs
56
+ this.rumManager = new RumManager(this.config, this.contextManager);
57
+ this.logsManager = new LogsManager(this.config, this.contextManager);
58
+ // Initialize logger
59
+ this.logger = new LoggerService(this.logsManager, this.contextManager, this.emitter, {
60
+ minLevel: this.config.logLevel,
61
+ consoleOutput: this.config.consoleOutput,
62
+ service: this.config.service,
63
+ env: this.config.env,
64
+ version: this.config.version,
65
+ piiFields: this.config.privacy.piiFields,
66
+ });
67
+ // Initialize error boundary
68
+ this.errorBoundary = new ErrorBoundary(this.config, this.logger, this.rumManager, this.contextManager, this.emitter);
69
+ // Initialize performance monitor
70
+ this.performanceMonitor = new PerformanceMonitor(this.config, this.logger, this.rumManager, this.emitter);
71
+ // Initialize network interceptor
72
+ this.networkInterceptor = new NetworkInterceptor(this.config, this.logger, this.emitter);
73
+ }
74
+ /**
75
+ * Initializes the Observability SDK.
76
+ * This is the main entry point — call once at application bootstrap.
77
+ *
78
+ * Returns the SDK instance (singleton). Subsequent calls return the same instance.
79
+ */
80
+ static init(config) {
81
+ const guard = BootstrapGuard.getInstance();
82
+ // Prevent double initialization
83
+ if (ObservabilitySDK.instance && !ObservabilitySDK.instance.destroyed) {
84
+ if (ObservabilitySDK.instance.config.debug) {
85
+ // eslint-disable-next-line no-console
86
+ console.warn('[dd-frontend-toolkit] SDK already initialized. Returning existing instance.');
87
+ }
88
+ return ObservabilitySDK.instance;
89
+ }
90
+ const sdk = new ObservabilitySDK(config);
91
+ ObservabilitySDK.instance = sdk;
92
+ // Track bootstrap
93
+ const isFirstBoot = guard.isFirstBootstrap(sdk.config.service, sdk.config.env);
94
+ guard.markInitialized(sdk.config.service, sdk.config.env, sdk.config.version);
95
+ // Boot all modules
96
+ sdk.boot(isFirstBoot);
97
+ return sdk;
98
+ }
99
+ /**
100
+ * Returns the current SDK instance, or null if not initialized.
101
+ */
102
+ static getInstance() {
103
+ return ObservabilitySDK.instance;
104
+ }
105
+ /**
106
+ * Destroys the SDK and cleans up all handlers.
107
+ */
108
+ async destroy() {
109
+ if (this.destroyed)
110
+ return;
111
+ // Teardown plugins
112
+ for (const plugin of this.config.plugins) {
113
+ try {
114
+ await plugin.teardown?.();
115
+ }
116
+ catch {
117
+ // Swallow plugin teardown errors
118
+ }
119
+ }
120
+ this.errorBoundary.uninstall();
121
+ this.networkInterceptor.uninstall();
122
+ this.performanceMonitor.stop();
123
+ this.rumManager.stop();
124
+ this.emitter.removeAllListeners();
125
+ this.destroyed = true;
126
+ ObservabilitySDK.instance = null;
127
+ this.emitter.emit(SDKEvent.DESTROYED, {
128
+ type: SDKEvent.DESTROYED,
129
+ timestamp: Date.now(),
130
+ });
131
+ }
132
+ // ── Public API ──────────────────────────────────────────────
133
+ /**
134
+ * Sets the current user context across all Datadog modules.
135
+ */
136
+ setUser(user) {
137
+ this.contextManager.setUser(user);
138
+ this.rumManager.setUser(user);
139
+ }
140
+ /**
141
+ * Clears the current user context.
142
+ */
143
+ clearUser() {
144
+ this.contextManager.clearUser();
145
+ this.rumManager.clearUser();
146
+ }
147
+ /**
148
+ * Adds a key-value pair to the global context.
149
+ */
150
+ addGlobalContext(key, value) {
151
+ this.contextManager.setGlobalContext(key, value);
152
+ this.rumManager.setGlobalContext(key, value);
153
+ this.logsManager.setGlobalContext(key, value);
154
+ }
155
+ /**
156
+ * Removes a key from the global context.
157
+ */
158
+ removeGlobalContext(key) {
159
+ this.contextManager.removeGlobalContext(key);
160
+ this.rumManager.removeGlobalContext(key);
161
+ this.logsManager.removeGlobalContext(key);
162
+ }
163
+ /**
164
+ * Sets the current view/route name.
165
+ * Use this when navigating between pages in SPAs.
166
+ */
167
+ setView(name) {
168
+ this.contextManager.setView(name);
169
+ if (this.config.actions.trackViewsManually) {
170
+ this.rumManager.startView(name);
171
+ }
172
+ }
173
+ /**
174
+ * Tracks a custom user action.
175
+ */
176
+ trackAction(name, context) {
177
+ this.rumManager.addAction(name, context);
178
+ }
179
+ /**
180
+ * Manually captures an error and sends it to Datadog.
181
+ */
182
+ captureError(error, context) {
183
+ this.errorBoundary.captureError(error, context);
184
+ }
185
+ /**
186
+ * Captures a message as an error-level event.
187
+ */
188
+ captureMessage(message, context) {
189
+ this.errorBoundary.captureMessage(message, context);
190
+ }
191
+ /**
192
+ * Records a custom performance timing.
193
+ */
194
+ addTiming(name, duration) {
195
+ this.rumManager.addTiming(name, duration);
196
+ }
197
+ /**
198
+ * Marks a performance checkpoint.
199
+ */
200
+ mark(name) {
201
+ this.performanceMonitor.mark(name);
202
+ }
203
+ /**
204
+ * Measures time between two performance marks.
205
+ */
206
+ measure(name, startMark, endMark) {
207
+ return this.performanceMonitor.measure(name, startMark, endMark);
208
+ }
209
+ /**
210
+ * Starts session replay recording.
211
+ */
212
+ startSessionReplay() {
213
+ this.rumManager.startSessionReplay();
214
+ }
215
+ /**
216
+ * Stops session replay recording.
217
+ */
218
+ stopSessionReplay() {
219
+ this.rumManager.stopSessionReplay();
220
+ }
221
+ /**
222
+ * Grants consent for tracking (when privacy.requireConsent is true).
223
+ */
224
+ grantConsent() {
225
+ this.emitter.emit(SDKEvent.CONSENT_GRANTED, {
226
+ type: SDKEvent.CONSENT_GRANTED,
227
+ timestamp: Date.now(),
228
+ });
229
+ }
230
+ /**
231
+ * Revokes consent for tracking.
232
+ */
233
+ revokeConsent() {
234
+ this.emitter.emit(SDKEvent.CONSENT_REVOKED, {
235
+ type: SDKEvent.CONSENT_REVOKED,
236
+ timestamp: Date.now(),
237
+ });
238
+ }
239
+ /**
240
+ * Subscribes to SDK lifecycle events.
241
+ */
242
+ onEvent(event, handler) {
243
+ this.emitter.on(event, handler);
244
+ }
245
+ /**
246
+ * Unsubscribes from SDK lifecycle events.
247
+ */
248
+ offEvent(event, handler) {
249
+ this.emitter.off(event, handler);
250
+ }
251
+ /**
252
+ * Returns the resolved (with defaults) configuration.
253
+ */
254
+ getConfig() {
255
+ return Object.freeze({ ...this.config });
256
+ }
257
+ /**
258
+ * Returns the RUM internal context (session ID, view ID, etc.).
259
+ */
260
+ getRumContext() {
261
+ return this.rumManager.getInternalContext();
262
+ }
263
+ /**
264
+ * Returns whether the SDK has been initialized and is active.
265
+ */
266
+ isActive() {
267
+ return !this.destroyed;
268
+ }
269
+ // ── Private Boot Sequence ───────────────────────────────────
270
+ boot(isFirstBoot) {
271
+ // 1. Initialize Datadog SDKs
272
+ this.rumManager.init();
273
+ this.logsManager.init();
274
+ // 2. Install error boundary
275
+ if (this.config.errorTracking.enabled) {
276
+ this.errorBoundary.install();
277
+ }
278
+ // 3. Start performance monitoring
279
+ if (this.config.performance.webVitals || this.config.performance.longTasks) {
280
+ this.performanceMonitor.start();
281
+ }
282
+ // 4. Install network interceptor
283
+ if (this.config.network.enabled) {
284
+ this.networkInterceptor.install();
285
+ }
286
+ // 5. Start session replay if configured
287
+ if (this.config.sampling.sessionReplaySampleRate > 0) {
288
+ this.rumManager.startSessionReplay();
289
+ }
290
+ // 6. Load plugins
291
+ this.loadPlugins();
292
+ // 7. Log initialization
293
+ this.logger.info('Observability SDK initialized', {
294
+ service: this.config.service,
295
+ env: this.config.env,
296
+ version: this.config.version,
297
+ isFirstBoot,
298
+ features: {
299
+ rum: this.rumManager.isInitialized(),
300
+ logs: this.logsManager.isInitialized(),
301
+ errorTracking: this.config.errorTracking.enabled,
302
+ performanceMonitoring: this.config.performance.webVitals,
303
+ networkInterception: this.config.network.enabled,
304
+ sessionReplay: this.config.sampling.sessionReplaySampleRate > 0,
305
+ },
306
+ });
307
+ // 8. Emit initialized event
308
+ this.emitter.emit(SDKEvent.INITIALIZED, {
309
+ type: SDKEvent.INITIALIZED,
310
+ timestamp: Date.now(),
311
+ data: { isFirstBoot },
312
+ });
313
+ // 9. Call afterInit hook
314
+ this.config.hooks.afterInit?.();
315
+ }
316
+ loadPlugins() {
317
+ for (const plugin of this.config.plugins) {
318
+ this.loadPlugin(plugin);
319
+ }
320
+ }
321
+ loadPlugin(plugin) {
322
+ try {
323
+ plugin.setup(this);
324
+ this.emitter.emit(SDKEvent.PLUGIN_LOADED, {
325
+ type: SDKEvent.PLUGIN_LOADED,
326
+ timestamp: Date.now(),
327
+ data: { name: plugin.name, version: plugin.version },
328
+ });
329
+ if (this.config.debug) {
330
+ this.logger.debug(`Plugin loaded: ${plugin.name}@${plugin.version}`);
331
+ }
332
+ }
333
+ catch (error) {
334
+ this.emitter.emit(SDKEvent.PLUGIN_ERROR, {
335
+ type: SDKEvent.PLUGIN_ERROR,
336
+ timestamp: Date.now(),
337
+ data: {
338
+ name: plugin.name,
339
+ error: error instanceof Error ? error.message : String(error),
340
+ },
341
+ });
342
+ this.logger.error(`Failed to load plugin: ${plugin.name}`, error instanceof Error ? error : new Error(String(error)));
343
+ }
344
+ }
345
+ /** @internal For testing only */
346
+ static resetInstance() {
347
+ ObservabilitySDK.instance = null;
348
+ BootstrapGuard.resetInstance();
349
+ }
350
+ }
351
+ //# sourceMappingURL=ObservabilitySDK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObservabilitySDK.js","sourceRoot":"","sources":["../../../src/core/ObservabilitySDK.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { SDKEvent } from '../types/events';
2
+ /**
3
+ * Global error boundary that intercepts unhandled errors and promise rejections.
4
+ * Automatically forwards them to Datadog with full context.
5
+ *
6
+ * Features:
7
+ * - Global window.onerror handler
8
+ * - Unhandled promise rejection handler
9
+ * - Error throttling to prevent log flooding
10
+ * - Error pattern filtering
11
+ * - Stack trace enrichment
12
+ *
13
+ * Follows the Chain of Responsibility pattern for error processing.
14
+ */
15
+ export class ErrorBoundary {
16
+ config;
17
+ logger;
18
+ rumManager;
19
+ contextManager;
20
+ emitter;
21
+ errorCount = 0;
22
+ errorWindowStart = Date.now();
23
+ installed = false;
24
+ originalOnError = null;
25
+ originalOnUnhandledRejection = null;
26
+ boundErrorHandler;
27
+ boundRejectionHandler;
28
+ constructor(config, logger, rumManager, contextManager, emitter) {
29
+ this.config = config;
30
+ this.logger = logger;
31
+ this.rumManager = rumManager;
32
+ this.contextManager = contextManager;
33
+ this.emitter = emitter;
34
+ this.boundErrorHandler = this.handleError.bind(this);
35
+ this.boundRejectionHandler = this.handleRejection.bind(this);
36
+ }
37
+ /**
38
+ * Installs global error handlers.
39
+ */
40
+ install() {
41
+ if (this.installed || typeof window === 'undefined') {
42
+ return;
43
+ }
44
+ // Preserve existing handlers
45
+ this.originalOnError = window.onerror;
46
+ this.originalOnUnhandledRejection = window.onunhandledrejection;
47
+ // Install our handlers
48
+ window.addEventListener('error', this.boundErrorHandler);
49
+ if (this.config.errorTracking.unhandledRejections) {
50
+ window.addEventListener('unhandledrejection', this.boundRejectionHandler);
51
+ }
52
+ this.installed = true;
53
+ }
54
+ /**
55
+ * Uninstalls global error handlers and restores originals.
56
+ */
57
+ uninstall() {
58
+ if (!this.installed || typeof window === 'undefined') {
59
+ return;
60
+ }
61
+ window.removeEventListener('error', this.boundErrorHandler);
62
+ window.removeEventListener('unhandledrejection', this.boundRejectionHandler);
63
+ // Restore original handlers
64
+ if (this.originalOnError !== undefined) {
65
+ window.onerror = this.originalOnError;
66
+ }
67
+ if (this.originalOnUnhandledRejection !== undefined) {
68
+ window.onunhandledrejection = this.originalOnUnhandledRejection;
69
+ }
70
+ this.installed = false;
71
+ }
72
+ /**
73
+ * Manually capture an error (for framework integrations).
74
+ */
75
+ captureError(error, context) {
76
+ this.processError(error, 'custom', true, context);
77
+ }
78
+ /**
79
+ * Manually capture a message as an error.
80
+ */
81
+ captureMessage(message, context) {
82
+ const error = new Error(message);
83
+ error.name = 'CapturedMessage';
84
+ this.processError(error, 'custom', true, context);
85
+ }
86
+ handleError(event) {
87
+ const error = event.error instanceof Error
88
+ ? event.error
89
+ : new Error(event.message || 'Unknown error');
90
+ if (!(event.error instanceof Error)) {
91
+ error.name = 'UncaughtError';
92
+ }
93
+ const context = {
94
+ filename: event.filename,
95
+ lineno: event.lineno,
96
+ colno: event.colno,
97
+ };
98
+ this.processError(error, 'global', false, context);
99
+ }
100
+ handleRejection(event) {
101
+ const error = event.reason instanceof Error
102
+ ? event.reason
103
+ : new Error(typeof event.reason === 'string'
104
+ ? event.reason
105
+ : 'Unhandled promise rejection');
106
+ if (!(event.reason instanceof Error)) {
107
+ error.name = 'UnhandledRejection';
108
+ }
109
+ this.processError(error, 'promise', false, {
110
+ type: 'unhandled_rejection',
111
+ });
112
+ }
113
+ processError(error, source, handled, context) {
114
+ // Check if error should be ignored
115
+ if (this.shouldIgnore(error)) {
116
+ return;
117
+ }
118
+ // Throttle check
119
+ if (this.isThrottled()) {
120
+ return;
121
+ }
122
+ // Enrich context
123
+ const enrichedContext = {
124
+ ...context,
125
+ error_source: source,
126
+ handled,
127
+ url: typeof window !== 'undefined' ? window.location.href : undefined,
128
+ view: this.contextManager.getView(),
129
+ user_id: this.contextManager.getUser()?.id,
130
+ };
131
+ // Log the error
132
+ this.logger.error(`[${source}] ${error.message}`, error, enrichedContext);
133
+ // Report to RUM
134
+ this.rumManager.addError(error, enrichedContext);
135
+ // Emit event
136
+ const payload = {
137
+ type: SDKEvent.ERROR_CAPTURED,
138
+ timestamp: Date.now(),
139
+ data: {
140
+ error,
141
+ source,
142
+ context: enrichedContext,
143
+ handled,
144
+ },
145
+ };
146
+ this.emitter.emit(SDKEvent.ERROR_CAPTURED, payload);
147
+ }
148
+ shouldIgnore(error) {
149
+ const message = error.message || '';
150
+ return this.config.errorTracking.ignorePatterns.some((pattern) => {
151
+ if (typeof pattern === 'string') {
152
+ return message.includes(pattern);
153
+ }
154
+ return pattern.test(message);
155
+ });
156
+ }
157
+ isThrottled() {
158
+ const now = Date.now();
159
+ const windowMs = 60000; // 1 minute window
160
+ // Reset window if expired
161
+ if (now - this.errorWindowStart > windowMs) {
162
+ this.errorCount = 0;
163
+ this.errorWindowStart = now;
164
+ }
165
+ this.errorCount++;
166
+ if (this.errorCount > this.config.errorTracking.maxErrorsPerMinute) {
167
+ if (this.errorCount === this.config.errorTracking.maxErrorsPerMinute + 1) {
168
+ // Log throttle activation once
169
+ this.emitter.emit(SDKEvent.THROTTLE_ACTIVATED, {
170
+ type: SDKEvent.THROTTLE_ACTIVATED,
171
+ timestamp: now,
172
+ data: {
173
+ errorsPerMinute: this.errorCount,
174
+ threshold: this.config.errorTracking.maxErrorsPerMinute,
175
+ },
176
+ });
177
+ }
178
+ return true;
179
+ }
180
+ return false;
181
+ }
182
+ }
183
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../../src/errors/ErrorBoundary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * datadog-frontend-toolkit
3
+ *
4
+ * Enterprise-grade, framework-agnostic frontend observability toolkit for Datadog.
5
+ * Auto-instruments RUM, Logs, Error Tracking, Performance Monitoring,
6
+ * and provisions Dashboards, Monitors & SLOs.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { init } from 'datadog-frontend-toolkit';
11
+ *
12
+ * const observatory = init({
13
+ * clientToken: 'pub-xxx',
14
+ * applicationId: 'xxx-xxx-xxx',
15
+ * service: 'my-frontend-app',
16
+ * env: 'production',
17
+ * version: '1.2.3',
18
+ * });
19
+ *
20
+ * // Use the logger
21
+ * observatory.logger.info('Application started');
22
+ * observatory.logger.error('Something failed', new Error('oops'), { orderId: '123' });
23
+ *
24
+ * // Set user context
25
+ * observatory.setUser({ id: 'user-1', name: 'John', email: 'john@example.com' });
26
+ *
27
+ * // Track custom actions
28
+ * observatory.trackAction('checkout_completed', { total: 99.99 });
29
+ *
30
+ * // SPA view tracking
31
+ * observatory.setView('/dashboard');
32
+ * ```
33
+ *
34
+ * @packageDocumentation
35
+ */
36
+ import { ObservabilitySDK } from './core/ObservabilitySDK';
37
+ // ── Main init function ──────────────────────────────────────
38
+ /**
39
+ * Initializes the Observability SDK with the given configuration.
40
+ * Call this once at application bootstrap.
41
+ *
42
+ * @param config - SDK configuration. Only `clientToken`, `applicationId`, `service`, and `env` are required.
43
+ * @returns The SDK instance with logger and all observability features.
44
+ */
45
+ export function init(config) {
46
+ return ObservabilitySDK.init(config);
47
+ }
48
+ /**
49
+ * Returns the current SDK instance, or null if not initialized.
50
+ * Useful for accessing the SDK from anywhere without passing references.
51
+ */
52
+ export function getInstance() {
53
+ return ObservabilitySDK.getInstance();
54
+ }
55
+ /**
56
+ * Shorthand to get the logger from the current SDK instance.
57
+ * Throws if the SDK has not been initialized.
58
+ */
59
+ export function getLogger() {
60
+ const instance = ObservabilitySDK.getInstance();
61
+ if (!instance) {
62
+ throw new Error('[dd-frontend-toolkit] SDK not initialized. Call init() first.');
63
+ }
64
+ return instance.logger;
65
+ }
66
+ // ── Re-exports ──────────────────────────────────────────────
67
+ // Core
68
+ export { ObservabilitySDK } from './core/ObservabilitySDK';
69
+ export { ConfigManager } from './core/ConfigManager';
70
+ export { BootstrapGuard } from './core/BootstrapGuard';
71
+ // Modules
72
+ export { LoggerService, ChildLogger } from './logger/LoggerService';
73
+ export { RumManager } from './rum/RumManager';
74
+ export { LogsManager } from './logs/LogsManager';
75
+ export { ErrorBoundary } from './errors/ErrorBoundary';
76
+ export { PerformanceMonitor } from './performance/PerformanceMonitor';
77
+ export { NetworkInterceptor } from './network/NetworkInterceptor';
78
+ export { ContextManager } from './context/ContextManager';
79
+ // Resource provisioning (CLI/server-side only)
80
+ export { ResourceProvisioner } from './resources/ResourceProvisioner';
81
+ // Utilities
82
+ export { Sanitizer } from './utils/sanitizer';
83
+ export { EventEmitter } from './utils/EventEmitter';
84
+ export { LogLevel } from './types/config';
85
+ export { LOG_LEVEL_PRIORITY } from './types/logger';
86
+ export { SDKEvent } from './types/events';
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,+DAA+D;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAC,MAA2B;IAC9C,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,gBAAgB,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB,CAAC;AAED,+DAA+D;AAE/D,OAAO;AACP,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,+CAA+C;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAuBpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAa1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAWpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}