@jaak.ai/stamps 2.1.0 → 2.2.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +42 -9
  2. package/dist/cjs/{index-Ga0t6BMe.js → index-D6NBn_qu.js} +30 -5
  3. package/dist/cjs/index-D6NBn_qu.js.map +1 -0
  4. package/dist/cjs/jaak-stamps-webcomponent.cjs.js +2 -2
  5. package/dist/cjs/jaak-stamps.cjs.entry.js +20082 -11
  6. package/dist/cjs/jaak-stamps.cjs.entry.js.map +1 -1
  7. package/dist/cjs/jaak-stamps.entry.cjs.js.map +1 -1
  8. package/dist/cjs/loader.cjs.js +2 -2
  9. package/dist/collection/components/my-component/my-component.css +82 -2
  10. package/dist/collection/components/my-component/my-component.js +475 -9
  11. package/dist/collection/components/my-component/my-component.js.map +1 -1
  12. package/dist/collection/services/LicenseValidationService.js +111 -0
  13. package/dist/collection/services/LicenseValidationService.js.map +1 -0
  14. package/dist/collection/services/MetricsService.js +350 -0
  15. package/dist/collection/services/MetricsService.js.map +1 -0
  16. package/dist/collection/services/ServiceContainer.js +66 -1
  17. package/dist/collection/services/ServiceContainer.js.map +1 -1
  18. package/dist/collection/services/TracingService.js +442 -0
  19. package/dist/collection/services/TracingService.js.map +1 -0
  20. package/dist/collection/services/interfaces/ILicenseValidationService.js +2 -0
  21. package/dist/collection/services/interfaces/ILicenseValidationService.js.map +1 -0
  22. package/dist/collection/services/interfaces/IMetricsService.js +2 -0
  23. package/dist/collection/services/interfaces/IMetricsService.js.map +1 -0
  24. package/dist/collection/services/interfaces/ITracingService.js +2 -0
  25. package/dist/collection/services/interfaces/ITracingService.js.map +1 -0
  26. package/dist/components/index.js +28 -3
  27. package/dist/components/index.js.map +1 -1
  28. package/dist/components/jaak-stamps.js +20096 -10
  29. package/dist/components/jaak-stamps.js.map +1 -1
  30. package/dist/esm/{index-Drbzcuq-.js → index-BCfAsrzL.js} +30 -5
  31. package/dist/esm/index-BCfAsrzL.js.map +1 -0
  32. package/dist/esm/jaak-stamps-webcomponent.js +3 -3
  33. package/dist/esm/jaak-stamps.entry.js +20082 -11
  34. package/dist/esm/jaak-stamps.entry.js.map +1 -1
  35. package/dist/esm/loader.js +3 -3
  36. package/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js +1 -1
  37. package/dist/jaak-stamps-webcomponent/jaak-stamps.entry.esm.js.map +1 -1
  38. package/dist/jaak-stamps-webcomponent/p-8c49893d.entry.js +7 -0
  39. package/dist/jaak-stamps-webcomponent/p-8c49893d.entry.js.map +1 -0
  40. package/dist/jaak-stamps-webcomponent/p-BCfAsrzL.js +3 -0
  41. package/dist/jaak-stamps-webcomponent/p-BCfAsrzL.js.map +1 -0
  42. package/dist/types/components/my-component/my-component.d.ts +23 -0
  43. package/dist/types/components.d.ts +76 -0
  44. package/dist/types/services/LicenseValidationService.d.ts +59 -0
  45. package/dist/types/services/MetricsService.d.ts +74 -0
  46. package/dist/types/services/ServiceContainer.d.ts +14 -1
  47. package/dist/types/services/TracingService.d.ts +67 -0
  48. package/dist/types/services/interfaces/ILicenseValidationService.d.ts +4 -0
  49. package/dist/types/services/interfaces/IMetricsService.d.ts +70 -0
  50. package/dist/types/services/interfaces/ITracingService.d.ts +59 -0
  51. package/package.json +18 -2
  52. package/dist/cjs/index-Ga0t6BMe.js.map +0 -1
  53. package/dist/esm/index-Drbzcuq-.js.map +0 -1
  54. package/dist/jaak-stamps-webcomponent/p-Drbzcuq-.js +0 -3
  55. package/dist/jaak-stamps-webcomponent/p-Drbzcuq-.js.map +0 -1
  56. package/dist/jaak-stamps-webcomponent/p-c06e5d7b.entry.js +0 -2
  57. package/dist/jaak-stamps-webcomponent/p-c06e5d7b.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceContainer.js","sourceRoot":"","sources":["../../src/services/ServiceContainer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAatD,MAAM,OAAO,gBAAgB;IACnB,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;IAE1C,YAAY,MAAuB;QACjC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,kBAAkB,CAAC,MAAuB;QAChD,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QAC1E,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAC3C,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,yBAAyB,EAChC,MAAM,CAAC,mBAAmB,CAC3B,CAAC;QAEF,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IAED,GAAG,CAAI,WAAmB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,YAAY,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,OAAY,CAAC;IACtB,CAAC;IAGD,WAAW;QACT,OAAO,IAAI,CAAC,GAAG,CAAY,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,GAAG,CAAgB,cAAc,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,GAAG,CAAiB,eAAe,CAAC,CAAC;IACnD,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,GAAG,CAAoB,kBAAkB,CAAC,CAAC;IACzD,CAAC;IAED,YAAY,CAAC,MAAgC;QAC3C,6DAA6D;QAC7D,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;YACpC,MAAM,CAAC,yBAAyB,KAAK,SAAS;YAC9C,MAAM,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;YAC7C,+CAA+C;YAC/C,kDAAkD;QACpD,CAAC;IACH,CAAC;IAED,OAAO;QACL,oCAAoC;QACpC,IAAI,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF","sourcesContent":["import { ICameraService } from './interfaces/ICameraService';\nimport { IDetectionService } from './interfaces/IDetectionService';\nimport { IStateManager } from './interfaces/IStateManager';\nimport { IEventBus } from './interfaces/IEventBus';\n\nimport { EventBusService } from './EventBusService';\nimport { StateManagerService } from './StateManagerService';\nimport { CameraService } from './CameraService';\nimport { DetectionService } from './DetectionService';\n\nexport interface ComponentConfig {\n debug: boolean;\n alignmentTolerance: number;\n maskSize: number;\n cropMargin: number;\n useDocumentClassification: boolean;\n useDocumentDetector: boolean;\n preferredCamera: 'auto' | 'front' | 'back';\n captureDelay: number;\n}\n\nexport class ServiceContainer {\n private services = new Map<string, any>();\n\n constructor(config: ComponentConfig) {\n this.initializeServices(config);\n }\n\n private initializeServices(config: ComponentConfig): void {\n // Initialize services in dependency order\n const eventBus = new EventBusService();\n const stateManager = new StateManagerService(eventBus);\n const cameraService = new CameraService(eventBus, config.preferredCamera);\n const detectionService = new DetectionService(\n config.debug, \n config.useDocumentClassification,\n config.useDocumentDetector\n );\n\n // Register services\n this.services.set('eventBus', eventBus);\n this.services.set('stateManager', stateManager);\n this.services.set('cameraService', cameraService);\n this.services.set('detectionService', detectionService);\n }\n\n get<T>(serviceName: string): T {\n const service = this.services.get(serviceName);\n if (!service) {\n throw new Error(`Service ${serviceName} not found`);\n }\n return service as T;\n }\n\n\n getEventBus(): IEventBus {\n return this.get<IEventBus>('eventBus');\n }\n\n getStateManager(): IStateManager {\n return this.get<IStateManager>('stateManager');\n }\n\n getCameraService(): ICameraService {\n return this.get<ICameraService>('cameraService');\n }\n\n getDetectionService(): IDetectionService {\n return this.get<IDetectionService>('detectionService');\n }\n\n updateConfig(config: Partial<ComponentConfig>): void {\n // Reinitialize services that depend on configuration changes\n if (config.preferredCamera !== undefined || \n config.useDocumentClassification !== undefined ||\n config.useDocumentDetector !== undefined) {\n // Would need to reinitialize specific services\n // For simplicity, this is omitted in this example\n }\n }\n\n cleanup(): void {\n // Cleanup services in reverse order\n this.getDetectionService().cleanup();\n this.getEventBus().clear();\n this.services.clear();\n }\n}"]}
1
+ {"version":3,"file":"ServiceContainer.js","sourceRoot":"","sources":["../../src/services/ServiceContainer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ICameraService } from './interfaces/ICameraService';\nimport { IDetectionService } from './interfaces/IDetectionService';\nimport { IStateManager } from './interfaces/IStateManager';\nimport { IEventBus } from './interfaces/IEventBus';\nimport { ITracingService } from './interfaces/ITracingService';\nimport { IMetricsService } from './interfaces/IMetricsService';\n\nimport { EventBusService } from './EventBusService';\nimport { StateManagerService } from './StateManagerService';\nimport { CameraService } from './CameraService';\nimport { DetectionService } from './DetectionService';\nimport { TracingService } from './TracingService';\nimport { MetricsService } from './MetricsService';\n\nexport interface ComponentConfig {\n debug: boolean;\n alignmentTolerance: number;\n maskSize: number;\n cropMargin: number;\n useDocumentClassification: boolean;\n useDocumentDetector: boolean;\n preferredCamera: 'auto' | 'front' | 'back';\n captureDelay: number;\n telemetryCollectorUrl?: string;\n metricsCollectorUrl?: string;\n enableTelemetry?: boolean;\n enableMetrics?: boolean;\n customerId?: string;\n tenantId?: string;\n environment?: string;\n propagateTraceHeaderCorsUrls?: (string | RegExp)[];\n metricsExportIntervalMillis?: number;\n}\n\nexport class ServiceContainer {\n private services = new Map<string, any>();\n\n constructor(config: ComponentConfig) {\n this.initializeServices(config);\n }\n\n private initializeServices(config: ComponentConfig): void {\n // Initialize services in dependency order\n const eventBus = new EventBusService();\n const stateManager = new StateManagerService(eventBus);\n const cameraService = new CameraService(eventBus, config.preferredCamera);\n const detectionService = new DetectionService(\n config.debug,\n config.useDocumentClassification,\n config.useDocumentDetector\n );\n\n // Initialize tracing service if enabled\n let tracingService: ITracingService | null = null;\n if (config.enableTelemetry !== false) {\n tracingService = new TracingService({\n collectorUrl: config.telemetryCollectorUrl || 'https://collector.jaak.ai/v1/traces',\n serviceName: 'jaak-stamps-webcomponent',\n serviceVersion: '2.1.0',\n debug: config.debug,\n customerId: config.customerId,\n tenantId: config.tenantId,\n environment: config.environment || 'production',\n propagateTraceHeaderCorsUrls: config.propagateTraceHeaderCorsUrls || [],\n enableAutoInstrumentation: true,\n });\n tracingService.initialize();\n }\n\n // Initialize metrics service if enabled\n let metricsService: IMetricsService | null = null;\n if (config.enableMetrics !== false) {\n metricsService = new MetricsService({\n collectorUrl: config.metricsCollectorUrl || 'https://collector.jaak.ai/v1/metrics',\n serviceName: 'jaak-stamps-webcomponent',\n serviceVersion: '2.1.0',\n debug: config.debug,\n customerId: config.customerId,\n tenantId: config.tenantId,\n environment: config.environment || 'production',\n exportIntervalMillis: config.metricsExportIntervalMillis || 60000,\n });\n metricsService.initialize();\n }\n\n // Register services\n this.services.set('eventBus', eventBus);\n this.services.set('stateManager', stateManager);\n this.services.set('cameraService', cameraService);\n this.services.set('detectionService', detectionService);\n if (tracingService) {\n this.services.set('tracingService', tracingService);\n }\n if (metricsService) {\n this.services.set('metricsService', metricsService);\n }\n }\n\n get<T>(serviceName: string): T {\n const service = this.services.get(serviceName);\n if (!service) {\n throw new Error(`Service ${serviceName} not found`);\n }\n return service as T;\n }\n\n\n getEventBus(): IEventBus {\n return this.get<IEventBus>('eventBus');\n }\n\n getStateManager(): IStateManager {\n return this.get<IStateManager>('stateManager');\n }\n\n getCameraService(): ICameraService {\n return this.get<ICameraService>('cameraService');\n }\n\n getDetectionService(): IDetectionService {\n return this.get<IDetectionService>('detectionService');\n }\n\n getTracingService(): ITracingService | null {\n try {\n return this.get<ITracingService>('tracingService');\n } catch {\n return null;\n }\n }\n\n getMetricsService(): IMetricsService | null {\n try {\n return this.get<IMetricsService>('metricsService');\n } catch {\n return null;\n }\n }\n\n updateConfig(config: Partial<ComponentConfig>): void {\n // Reinitialize services that depend on configuration changes\n if (config.preferredCamera !== undefined || \n config.useDocumentClassification !== undefined ||\n config.useDocumentDetector !== undefined) {\n // Would need to reinitialize specific services\n // For simplicity, this is omitted in this example\n }\n }\n\n async cleanup(): Promise<void> {\n // Cleanup services in reverse order\n this.getDetectionService().cleanup();\n\n // Cleanup metrics service if present\n const metricsService = this.getMetricsService();\n if (metricsService) {\n await metricsService.cleanup();\n }\n\n // Cleanup tracing service if present\n const tracingService = this.getTracingService();\n if (tracingService) {\n await tracingService.cleanup();\n }\n\n this.getEventBus().clear();\n this.services.clear();\n }\n}"]}
@@ -0,0 +1,442 @@
1
+ import { trace, SpanStatusCode, context } from "@opentelemetry/api";
2
+ import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
3
+ import { BatchSpanProcessor, ConsoleSpanExporter } from "@opentelemetry/sdk-trace-base";
4
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
5
+ import { ZoneContextManager } from "@opentelemetry/context-zone";
6
+ import { W3CTraceContextPropagator } from "@opentelemetry/core";
7
+ import { registerInstrumentations } from "@opentelemetry/instrumentation";
8
+ import { FetchInstrumentation } from "@opentelemetry/instrumentation-fetch";
9
+ import { XMLHttpRequestInstrumentation } from "@opentelemetry/instrumentation-xml-http-request";
10
+ import { UserInteractionInstrumentation } from "@opentelemetry/instrumentation-user-interaction";
11
+ import { DocumentLoadInstrumentation } from "@opentelemetry/instrumentation-document-load";
12
+ import UAParser from "ua-parser-js";
13
+ // Semantic convention attribute names
14
+ const ATTR_SERVICE_NAME = 'service.name';
15
+ const ATTR_SERVICE_VERSION = 'service.version';
16
+ export class TracingService {
17
+ provider = null;
18
+ tracer = null;
19
+ sessionTraceId = null;
20
+ collectorUrl;
21
+ serviceName;
22
+ serviceVersion;
23
+ debug;
24
+ customerId;
25
+ tenantId;
26
+ environment;
27
+ propagateTraceHeaderCorsUrls;
28
+ enableAutoInstrumentation;
29
+ spanProcessor = null;
30
+ parser;
31
+ geoCache = null;
32
+ geoCacheTimestamp = 0;
33
+ GEO_CACHE_DURATION_MS = 60 * 60 * 1000; // 1 hour
34
+ constructor(config = {}) {
35
+ this.collectorUrl = config.collectorUrl || 'https://collector.jaak.ai/v1/traces';
36
+ this.serviceName = config.serviceName || 'jaak-stamps-webcomponent';
37
+ this.serviceVersion = config.serviceVersion || '2.1.0';
38
+ this.debug = config.debug || false;
39
+ this.customerId = config.customerId;
40
+ this.tenantId = config.tenantId;
41
+ this.environment = config.environment || 'production';
42
+ this.propagateTraceHeaderCorsUrls = config.propagateTraceHeaderCorsUrls || [];
43
+ this.enableAutoInstrumentation = config.enableAutoInstrumentation ?? false; // Default to false
44
+ this.parser = new UAParser();
45
+ }
46
+ initialize() {
47
+ try {
48
+ // Create OTLP exporter
49
+ const exporter = new OTLPTraceExporter({
50
+ url: this.collectorUrl,
51
+ headers: {
52
+ 'Content-Type': 'application/json',
53
+ },
54
+ });
55
+ // Create console exporter for debug mode
56
+ const exporters = [exporter];
57
+ if (this.debug) {
58
+ exporters.push(new ConsoleSpanExporter());
59
+ }
60
+ // Create batch span processor for each exporter
61
+ this.spanProcessor = new BatchSpanProcessor(exporter, {
62
+ maxQueueSize: 100,
63
+ maxExportBatchSize: 10,
64
+ scheduledDelayMillis: 5000,
65
+ exportTimeoutMillis: 30000,
66
+ });
67
+ // Create resource attributes
68
+ const resourceAttributes = {
69
+ [ATTR_SERVICE_NAME]: this.serviceName,
70
+ [ATTR_SERVICE_VERSION]: this.serviceVersion,
71
+ 'deployment.environment': this.environment,
72
+ };
73
+ if (this.customerId) {
74
+ resourceAttributes['customer.id'] = this.customerId;
75
+ }
76
+ if (this.tenantId) {
77
+ resourceAttributes['tenant.id'] = this.tenantId;
78
+ }
79
+ // Create tracer provider with resource
80
+ this.provider = new WebTracerProvider({
81
+ // Resource will be added via span attributes since Resource class is not available
82
+ });
83
+ // Add span processor
84
+ this.provider.addSpanProcessor?.(this.spanProcessor);
85
+ // Configure context manager (Zone.js for async context propagation)
86
+ const contextManager = new ZoneContextManager();
87
+ // Configure propagators (W3C Trace Context + B3 for compatibility)
88
+ const propagator = new W3CTraceContextPropagator();
89
+ // Register the provider globally with context manager and propagator
90
+ this.provider.register({
91
+ contextManager: contextManager,
92
+ propagator: propagator,
93
+ });
94
+ // Get tracer with service metadata
95
+ this.tracer = trace.getTracer(this.serviceName, this.serviceVersion);
96
+ // Initialize auto-instrumentation if enabled
97
+ if (this.enableAutoInstrumentation) {
98
+ this.initializeAutoInstrumentation(resourceAttributes);
99
+ }
100
+ if (this.debug) {
101
+ console.log('[TracingService] Initialized successfully', {
102
+ collectorUrl: this.collectorUrl,
103
+ serviceName: this.serviceName,
104
+ serviceVersion: this.serviceVersion,
105
+ environment: this.environment,
106
+ customerId: this.customerId,
107
+ tenantId: this.tenantId,
108
+ autoInstrumentation: this.enableAutoInstrumentation,
109
+ propagateUrls: this.propagateTraceHeaderCorsUrls,
110
+ });
111
+ }
112
+ }
113
+ catch (error) {
114
+ console.error('[TracingService] Failed to initialize:', error);
115
+ // Don't throw - telemetry should fail silently in production
116
+ }
117
+ }
118
+ initializeAutoInstrumentation(resourceAttributes) {
119
+ try {
120
+ // Auto-instrumentation is disabled by default to reduce noise
121
+ // Enable via config.enableAutoInstrumentation = true if needed
122
+ registerInstrumentations({
123
+ instrumentations: [
124
+ // Fetch API instrumentation
125
+ new FetchInstrumentation({
126
+ propagateTraceHeaderCorsUrls: this.propagateTraceHeaderCorsUrls,
127
+ clearTimingResources: true,
128
+ applyCustomAttributesOnSpan: (span, _request, response) => {
129
+ // Add resource attributes to each span
130
+ Object.entries(resourceAttributes).forEach(([key, value]) => {
131
+ span.setAttribute(key, value);
132
+ });
133
+ // Add custom attributes
134
+ if (response && 'status' in response) {
135
+ span.setAttribute('http.response.status_code', response.status);
136
+ }
137
+ },
138
+ }),
139
+ // XMLHttpRequest instrumentation
140
+ new XMLHttpRequestInstrumentation({
141
+ propagateTraceHeaderCorsUrls: this.propagateTraceHeaderCorsUrls,
142
+ applyCustomAttributesOnSpan: (span) => {
143
+ // Add resource attributes to each span
144
+ Object.entries(resourceAttributes).forEach(([key, value]) => {
145
+ span.setAttribute(key, value);
146
+ });
147
+ },
148
+ }),
149
+ // User interaction instrumentation (clicks, etc.)
150
+ new UserInteractionInstrumentation({
151
+ eventNames: ['click', 'submit'],
152
+ shouldPreventSpanCreation: (_eventType, element) => {
153
+ // Don't create spans for every click, only important ones
154
+ return element.tagName === 'BUTTON' || element.tagName === 'A' || element.tagName === 'FORM';
155
+ },
156
+ }),
157
+ // Document load instrumentation
158
+ new DocumentLoadInstrumentation(),
159
+ ],
160
+ });
161
+ if (this.debug) {
162
+ console.log('[TracingService] Auto-instrumentation enabled');
163
+ }
164
+ }
165
+ catch (error) {
166
+ console.error('[TracingService] Failed to initialize auto-instrumentation:', error);
167
+ }
168
+ }
169
+ getDeviceInfo() {
170
+ const result = this.parser.getResult();
171
+ return {
172
+ type: result.device.type || 'desktop',
173
+ vendor: result.device.vendor || 'unknown',
174
+ model: result.device.model || 'unknown',
175
+ };
176
+ }
177
+ getBrowserInfo() {
178
+ const result = this.parser.getResult();
179
+ return {
180
+ name: result.browser.name || 'unknown',
181
+ version: result.browser.version || 'unknown',
182
+ major: result.browser.major || 'unknown',
183
+ };
184
+ }
185
+ getOSInfo() {
186
+ const result = this.parser.getResult();
187
+ return {
188
+ name: result.os.name || 'unknown',
189
+ version: result.os.version || 'unknown',
190
+ };
191
+ }
192
+ /**
193
+ * Set the session trace ID from external source (license or component prop)
194
+ * @param traceId - The trace ID to use for all spans (32 hex characters)
195
+ */
196
+ setSessionTraceId(traceId) {
197
+ if (traceId && traceId.length === 32 && /^[a-f0-9]{32}$/i.test(traceId)) {
198
+ this.sessionTraceId = traceId.toLowerCase();
199
+ if (this.debug) {
200
+ console.log('[TracingService] Session trace ID set:', this.sessionTraceId);
201
+ }
202
+ }
203
+ else if (traceId) {
204
+ console.warn('[TracingService] Invalid trace ID format. Must be 32 hex characters:', traceId);
205
+ }
206
+ }
207
+ /**
208
+ * Get the current session trace ID
209
+ */
210
+ getSessionTraceId() {
211
+ return this.sessionTraceId;
212
+ }
213
+ /**
214
+ * Generate a random span ID (16 hex characters)
215
+ */
216
+ generateSpanId() {
217
+ const bytes = new Uint8Array(8);
218
+ crypto.getRandomValues(bytes);
219
+ return Array.from(bytes)
220
+ .map(byte => byte.toString(16).padStart(2, '0'))
221
+ .join('');
222
+ }
223
+ async getGeoLocation() {
224
+ const now = Date.now();
225
+ // Return cached value if still valid
226
+ if (this.geoCache && (now - this.geoCacheTimestamp) < this.GEO_CACHE_DURATION_MS) {
227
+ return this.geoCache;
228
+ }
229
+ try {
230
+ const response = await fetch('https://ipapi.co/json/', {
231
+ signal: AbortSignal.timeout(5000), // 5 second timeout
232
+ });
233
+ if (!response.ok) {
234
+ return {};
235
+ }
236
+ const data = await response.json();
237
+ this.geoCache = {
238
+ country: data.country_name,
239
+ region: data.region,
240
+ city: data.city,
241
+ latitude: data.latitude,
242
+ longitude: data.longitude,
243
+ };
244
+ this.geoCacheTimestamp = now;
245
+ return this.geoCache;
246
+ }
247
+ catch (error) {
248
+ console.warn('[TracingService] Failed to fetch geo location:', error);
249
+ return this.geoCache || {};
250
+ }
251
+ }
252
+ startSpan(name, attributes) {
253
+ if (!this.tracer) {
254
+ // Return a no-op span if tracer is not initialized
255
+ return trace.getTracer('noop').startSpan('noop');
256
+ }
257
+ try {
258
+ let currentContext = context.active();
259
+ // If we have a session trace ID, create a span context with it
260
+ if (this.sessionTraceId) {
261
+ const spanContext = {
262
+ traceId: this.sessionTraceId,
263
+ spanId: this.generateSpanId(),
264
+ traceFlags: 0x01, // Sampled
265
+ };
266
+ currentContext = trace.setSpanContext(currentContext, spanContext);
267
+ }
268
+ // Get device info
269
+ const deviceInfo = this.getDeviceInfo();
270
+ const browserInfo = this.getBrowserInfo();
271
+ const osInfo = this.getOSInfo();
272
+ const span = this.tracer.startSpan(name, {
273
+ attributes: {
274
+ ...attributes,
275
+ 'component': this.serviceName.includes('stamps') ? 'jaak-stamps' : 'jaak-visage',
276
+ [ATTR_SERVICE_NAME]: this.serviceName,
277
+ [ATTR_SERVICE_VERSION]: this.serviceVersion,
278
+ 'deployment.environment': this.environment,
279
+ // Add trace.id attribute for easy filtering
280
+ 'trace.id': this.sessionTraceId || 'auto-generated',
281
+ // Device info
282
+ 'device.type': deviceInfo.type,
283
+ 'device.vendor': deviceInfo.vendor,
284
+ 'device.model': deviceInfo.model,
285
+ // Browser info
286
+ 'browser.name': browserInfo.name,
287
+ 'browser.version': browserInfo.version,
288
+ 'browser.major': browserInfo.major,
289
+ // OS info
290
+ 'os.name': osInfo.name,
291
+ 'os.version': osInfo.version,
292
+ // User agent
293
+ 'user_agent': navigator.userAgent,
294
+ ...(this.customerId && { 'customer.id': this.customerId }),
295
+ ...(this.tenantId && { 'tenant.id': this.tenantId }),
296
+ },
297
+ }, currentContext);
298
+ // Async add geo location (non-blocking)
299
+ this.getGeoLocation().then(geo => {
300
+ if (geo.country)
301
+ span.setAttribute('geo.country', geo.country);
302
+ if (geo.region)
303
+ span.setAttribute('geo.region', geo.region);
304
+ if (geo.city)
305
+ span.setAttribute('geo.city', geo.city);
306
+ }).catch(err => console.warn('Failed to add geo attributes:', err));
307
+ if (this.debug) {
308
+ console.log(`[TracingService] Started span: ${name}`, {
309
+ traceId: span.spanContext().traceId,
310
+ spanId: span.spanContext().spanId,
311
+ sessionTraceId: this.sessionTraceId,
312
+ attributes,
313
+ });
314
+ }
315
+ return span;
316
+ }
317
+ catch (error) {
318
+ console.error('[TracingService] Failed to start span:', error);
319
+ return trace.getTracer('noop').startSpan('noop');
320
+ }
321
+ }
322
+ endSpan(span) {
323
+ if (!span)
324
+ return;
325
+ try {
326
+ span.end();
327
+ if (this.debug) {
328
+ const spanContext = span.spanContext();
329
+ console.log('[TracingService] Ended span', {
330
+ traceId: spanContext.traceId,
331
+ spanId: spanContext.spanId,
332
+ });
333
+ }
334
+ }
335
+ catch (error) {
336
+ console.error('[TracingService] Failed to end span:', error);
337
+ }
338
+ }
339
+ addSpanEvent(span, name, attributes) {
340
+ if (!span)
341
+ return;
342
+ try {
343
+ span.addEvent(name, attributes);
344
+ if (this.debug) {
345
+ console.log(`[TracingService] Added event to span: ${name}`, attributes);
346
+ }
347
+ }
348
+ catch (error) {
349
+ console.error('[TracingService] Failed to add span event:', error);
350
+ }
351
+ }
352
+ recordException(span, error) {
353
+ if (!span)
354
+ return;
355
+ try {
356
+ span.recordException(error);
357
+ span.setStatus({
358
+ code: SpanStatusCode.ERROR,
359
+ message: error.message,
360
+ });
361
+ if (this.debug) {
362
+ console.log('[TracingService] Recorded exception:', error);
363
+ }
364
+ }
365
+ catch (err) {
366
+ console.error('[TracingService] Failed to record exception:', err);
367
+ }
368
+ }
369
+ setSpanAttribute(span, key, value) {
370
+ if (!span)
371
+ return;
372
+ try {
373
+ span.setAttribute(key, value);
374
+ if (this.debug) {
375
+ console.log(`[TracingService] Set attribute: ${key} = ${value}`);
376
+ }
377
+ }
378
+ catch (error) {
379
+ console.error('[TracingService] Failed to set span attribute:', error);
380
+ }
381
+ }
382
+ async trace(name, fn, attributes) {
383
+ const span = this.startSpan(name, attributes);
384
+ try {
385
+ // Run the function within the span context
386
+ const result = await context.with(trace.setSpan(context.active(), span), async () => {
387
+ return await fn();
388
+ });
389
+ span.setStatus({ code: SpanStatusCode.OK });
390
+ return result;
391
+ }
392
+ catch (error) {
393
+ this.recordException(span, error);
394
+ throw error;
395
+ }
396
+ finally {
397
+ this.endSpan(span);
398
+ }
399
+ }
400
+ async cleanup() {
401
+ try {
402
+ if (this.spanProcessor) {
403
+ await this.spanProcessor.forceFlush();
404
+ await this.spanProcessor.shutdown();
405
+ }
406
+ if (this.provider) {
407
+ await this.provider.shutdown();
408
+ }
409
+ if (this.debug) {
410
+ console.log('[TracingService] Cleaned up successfully');
411
+ }
412
+ }
413
+ catch (error) {
414
+ console.error('[TracingService] Failed to cleanup:', error);
415
+ }
416
+ }
417
+ /**
418
+ * Get the current trace ID (useful for logging correlation)
419
+ */
420
+ getCurrentTraceId() {
421
+ try {
422
+ const span = trace.getSpan(context.active());
423
+ return span?.spanContext().traceId;
424
+ }
425
+ catch {
426
+ return undefined;
427
+ }
428
+ }
429
+ /**
430
+ * Get the current span ID
431
+ */
432
+ getCurrentSpanId() {
433
+ try {
434
+ const span = trace.getSpan(context.active());
435
+ return span?.spanContext().spanId;
436
+ }
437
+ catch {
438
+ return undefined;
439
+ }
440
+ }
441
+ }
442
+ //# sourceMappingURL=TracingService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TracingService.js","sourceRoot":"","sources":["../../src/services/TracingService.ts"],"names":[],"mappings":"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","sourcesContent":["import { ITracingService } from './interfaces/ITracingService';\nimport { trace, Span, SpanStatusCode, context } from '@opentelemetry/api';\nimport { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport { BatchSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { ZoneContextManager } from '@opentelemetry/context-zone';\nimport { W3CTraceContextPropagator } from '@opentelemetry/core';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch';\nimport { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request';\nimport { UserInteractionInstrumentation } from '@opentelemetry/instrumentation-user-interaction';\nimport { DocumentLoadInstrumentation } from '@opentelemetry/instrumentation-document-load';\nimport UAParser from 'ua-parser-js';\n\n// Semantic convention attribute names\nconst ATTR_SERVICE_NAME = 'service.name';\nconst ATTR_SERVICE_VERSION = 'service.version';\n\ninterface GeoLocation {\n country?: string;\n region?: string;\n city?: string;\n latitude?: number;\n longitude?: number;\n}\n\nexport interface TracingConfig {\n collectorUrl?: string;\n serviceName?: string;\n serviceVersion?: string;\n debug?: boolean;\n customerId?: string;\n tenantId?: string;\n environment?: string;\n propagateTraceHeaderCorsUrls?: (string | RegExp)[];\n enableAutoInstrumentation?: boolean;\n}\n\nexport class TracingService implements ITracingService {\n private provider: WebTracerProvider | null = null;\n private tracer: any = null;\n private sessionTraceId: string | null = null;\n private readonly collectorUrl: string;\n private readonly serviceName: string;\n private readonly serviceVersion: string;\n private readonly debug: boolean;\n private readonly customerId?: string;\n private readonly tenantId?: string;\n private readonly environment?: string;\n private readonly propagateTraceHeaderCorsUrls: (string | RegExp)[];\n private readonly enableAutoInstrumentation: boolean;\n private spanProcessor: BatchSpanProcessor | null = null;\n private parser: UAParser;\n private geoCache: GeoLocation | null = null;\n private geoCacheTimestamp: number = 0;\n private readonly GEO_CACHE_DURATION_MS = 60 * 60 * 1000; // 1 hour\n\n constructor(config: TracingConfig = {}) {\n this.collectorUrl = config.collectorUrl || 'https://collector.jaak.ai/v1/traces';\n this.serviceName = config.serviceName || 'jaak-stamps-webcomponent';\n this.serviceVersion = config.serviceVersion || '2.1.0';\n this.debug = config.debug || false;\n this.customerId = config.customerId;\n this.tenantId = config.tenantId;\n this.environment = config.environment || 'production';\n this.propagateTraceHeaderCorsUrls = config.propagateTraceHeaderCorsUrls || [];\n this.enableAutoInstrumentation = config.enableAutoInstrumentation ?? false; // Default to false\n this.parser = new UAParser();\n }\n\n initialize(): void {\n try {\n // Create OTLP exporter\n const exporter = new OTLPTraceExporter({\n url: this.collectorUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Create console exporter for debug mode\n const exporters: any[] = [exporter];\n if (this.debug) {\n exporters.push(new ConsoleSpanExporter());\n }\n\n // Create batch span processor for each exporter\n this.spanProcessor = new BatchSpanProcessor(exporter, {\n maxQueueSize: 100,\n maxExportBatchSize: 10,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: 30000,\n });\n\n // Create resource attributes\n const resourceAttributes: Record<string, string> = {\n [ATTR_SERVICE_NAME]: this.serviceName,\n [ATTR_SERVICE_VERSION]: this.serviceVersion,\n 'deployment.environment': this.environment,\n };\n\n if (this.customerId) {\n resourceAttributes['customer.id'] = this.customerId;\n }\n\n if (this.tenantId) {\n resourceAttributes['tenant.id'] = this.tenantId;\n }\n\n // Create tracer provider with resource\n this.provider = new WebTracerProvider({\n // Resource will be added via span attributes since Resource class is not available\n });\n\n // Add span processor\n (this.provider as any).addSpanProcessor?.(this.spanProcessor);\n\n // Configure context manager (Zone.js for async context propagation)\n const contextManager = new ZoneContextManager();\n\n // Configure propagators (W3C Trace Context + B3 for compatibility)\n const propagator = new W3CTraceContextPropagator();\n\n // Register the provider globally with context manager and propagator\n this.provider.register({\n contextManager: contextManager,\n propagator: propagator,\n });\n\n // Get tracer with service metadata\n this.tracer = trace.getTracer(this.serviceName, this.serviceVersion);\n\n // Initialize auto-instrumentation if enabled\n if (this.enableAutoInstrumentation) {\n this.initializeAutoInstrumentation(resourceAttributes);\n }\n\n if (this.debug) {\n console.log('[TracingService] Initialized successfully', {\n collectorUrl: this.collectorUrl,\n serviceName: this.serviceName,\n serviceVersion: this.serviceVersion,\n environment: this.environment,\n customerId: this.customerId,\n tenantId: this.tenantId,\n autoInstrumentation: this.enableAutoInstrumentation,\n propagateUrls: this.propagateTraceHeaderCorsUrls,\n });\n }\n } catch (error) {\n console.error('[TracingService] Failed to initialize:', error);\n // Don't throw - telemetry should fail silently in production\n }\n }\n\n private initializeAutoInstrumentation(resourceAttributes: Record<string, string>): void {\n try {\n // Auto-instrumentation is disabled by default to reduce noise\n // Enable via config.enableAutoInstrumentation = true if needed\n registerInstrumentations({\n instrumentations: [\n // Fetch API instrumentation\n new FetchInstrumentation({\n propagateTraceHeaderCorsUrls: this.propagateTraceHeaderCorsUrls,\n clearTimingResources: true,\n applyCustomAttributesOnSpan: (span: Span, _request: Request | RequestInit, response: Response | FetchError) => {\n // Add resource attributes to each span\n Object.entries(resourceAttributes).forEach(([key, value]) => {\n span.setAttribute(key, value);\n });\n\n // Add custom attributes\n if (response && 'status' in response) {\n span.setAttribute('http.response.status_code', response.status);\n }\n },\n }),\n\n // XMLHttpRequest instrumentation\n new XMLHttpRequestInstrumentation({\n propagateTraceHeaderCorsUrls: this.propagateTraceHeaderCorsUrls,\n applyCustomAttributesOnSpan: (span: Span) => {\n // Add resource attributes to each span\n Object.entries(resourceAttributes).forEach(([key, value]) => {\n span.setAttribute(key, value);\n });\n },\n }),\n\n // User interaction instrumentation (clicks, etc.)\n new UserInteractionInstrumentation({\n eventNames: ['click', 'submit'],\n shouldPreventSpanCreation: (_eventType: string, element: HTMLElement) => {\n // Don't create spans for every click, only important ones\n return element.tagName === 'BUTTON' || element.tagName === 'A' || element.tagName === 'FORM';\n },\n }),\n\n // Document load instrumentation\n new DocumentLoadInstrumentation(),\n ],\n });\n\n if (this.debug) {\n console.log('[TracingService] Auto-instrumentation enabled');\n }\n } catch (error) {\n console.error('[TracingService] Failed to initialize auto-instrumentation:', error);\n }\n }\n\n private getDeviceInfo() {\n const result = this.parser.getResult();\n return {\n type: result.device.type || 'desktop',\n vendor: result.device.vendor || 'unknown',\n model: result.device.model || 'unknown',\n };\n }\n\n private getBrowserInfo() {\n const result = this.parser.getResult();\n return {\n name: result.browser.name || 'unknown',\n version: result.browser.version || 'unknown',\n major: result.browser.major || 'unknown',\n };\n }\n\n private getOSInfo() {\n const result = this.parser.getResult();\n return {\n name: result.os.name || 'unknown',\n version: result.os.version || 'unknown',\n };\n }\n\n /**\n * Set the session trace ID from external source (license or component prop)\n * @param traceId - The trace ID to use for all spans (32 hex characters)\n */\n setSessionTraceId(traceId: string | null): void {\n if (traceId && traceId.length === 32 && /^[a-f0-9]{32}$/i.test(traceId)) {\n this.sessionTraceId = traceId.toLowerCase();\n if (this.debug) {\n console.log('[TracingService] Session trace ID set:', this.sessionTraceId);\n }\n } else if (traceId) {\n console.warn('[TracingService] Invalid trace ID format. Must be 32 hex characters:', traceId);\n }\n }\n\n /**\n * Get the current session trace ID\n */\n getSessionTraceId(): string | null {\n return this.sessionTraceId;\n }\n\n /**\n * Generate a random span ID (16 hex characters)\n */\n private generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map(byte => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n\n private async getGeoLocation(): Promise<GeoLocation> {\n const now = Date.now();\n\n // Return cached value if still valid\n if (this.geoCache && (now - this.geoCacheTimestamp) < this.GEO_CACHE_DURATION_MS) {\n return this.geoCache;\n }\n\n try {\n const response = await fetch('https://ipapi.co/json/', {\n signal: AbortSignal.timeout(5000), // 5 second timeout\n });\n\n if (!response.ok) {\n return {};\n }\n\n const data = await response.json();\n this.geoCache = {\n country: data.country_name,\n region: data.region,\n city: data.city,\n latitude: data.latitude,\n longitude: data.longitude,\n };\n this.geoCacheTimestamp = now;\n\n return this.geoCache;\n } catch (error) {\n console.warn('[TracingService] Failed to fetch geo location:', error);\n return this.geoCache || {};\n }\n }\n\n startSpan(name: string, attributes?: Record<string, any>): Span {\n if (!this.tracer) {\n // Return a no-op span if tracer is not initialized\n return trace.getTracer('noop').startSpan('noop');\n }\n\n try {\n let currentContext = context.active();\n\n // If we have a session trace ID, create a span context with it\n if (this.sessionTraceId) {\n const spanContext = {\n traceId: this.sessionTraceId,\n spanId: this.generateSpanId(),\n traceFlags: 0x01, // Sampled\n };\n currentContext = trace.setSpanContext(currentContext, spanContext);\n }\n\n // Get device info\n const deviceInfo = this.getDeviceInfo();\n const browserInfo = this.getBrowserInfo();\n const osInfo = this.getOSInfo();\n\n const span = this.tracer.startSpan(name, {\n attributes: {\n ...attributes,\n 'component': this.serviceName.includes('stamps') ? 'jaak-stamps' : 'jaak-visage',\n [ATTR_SERVICE_NAME]: this.serviceName,\n [ATTR_SERVICE_VERSION]: this.serviceVersion,\n 'deployment.environment': this.environment,\n\n // Add trace.id attribute for easy filtering\n 'trace.id': this.sessionTraceId || 'auto-generated',\n\n // Device info\n 'device.type': deviceInfo.type,\n 'device.vendor': deviceInfo.vendor,\n 'device.model': deviceInfo.model,\n\n // Browser info\n 'browser.name': browserInfo.name,\n 'browser.version': browserInfo.version,\n 'browser.major': browserInfo.major,\n\n // OS info\n 'os.name': osInfo.name,\n 'os.version': osInfo.version,\n\n // User agent\n 'user_agent': navigator.userAgent,\n\n ...(this.customerId && { 'customer.id': this.customerId }),\n ...(this.tenantId && { 'tenant.id': this.tenantId }),\n },\n }, currentContext);\n\n // Async add geo location (non-blocking)\n this.getGeoLocation().then(geo => {\n if (geo.country) span.setAttribute('geo.country', geo.country);\n if (geo.region) span.setAttribute('geo.region', geo.region);\n if (geo.city) span.setAttribute('geo.city', geo.city);\n }).catch(err => console.warn('Failed to add geo attributes:', err));\n\n if (this.debug) {\n console.log(`[TracingService] Started span: ${name}`, {\n traceId: span.spanContext().traceId,\n spanId: span.spanContext().spanId,\n sessionTraceId: this.sessionTraceId,\n attributes,\n });\n }\n\n return span;\n } catch (error) {\n console.error('[TracingService] Failed to start span:', error);\n return trace.getTracer('noop').startSpan('noop');\n }\n }\n\n endSpan(span: Span): void {\n if (!span) return;\n\n try {\n span.end();\n\n if (this.debug) {\n const spanContext = span.spanContext();\n console.log('[TracingService] Ended span', {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n });\n }\n } catch (error) {\n console.error('[TracingService] Failed to end span:', error);\n }\n }\n\n addSpanEvent(span: Span, name: string, attributes?: Record<string, any>): void {\n if (!span) return;\n\n try {\n span.addEvent(name, attributes);\n\n if (this.debug) {\n console.log(`[TracingService] Added event to span: ${name}`, attributes);\n }\n } catch (error) {\n console.error('[TracingService] Failed to add span event:', error);\n }\n }\n\n recordException(span: Span, error: Error): void {\n if (!span) return;\n\n try {\n span.recordException(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n\n if (this.debug) {\n console.log('[TracingService] Recorded exception:', error);\n }\n } catch (err) {\n console.error('[TracingService] Failed to record exception:', err);\n }\n }\n\n setSpanAttribute(span: Span, key: string, value: any): void {\n if (!span) return;\n\n try {\n span.setAttribute(key, value);\n\n if (this.debug) {\n console.log(`[TracingService] Set attribute: ${key} = ${value}`);\n }\n } catch (error) {\n console.error('[TracingService] Failed to set span attribute:', error);\n }\n }\n\n async trace<T>(name: string, fn: () => T | Promise<T>, attributes?: Record<string, any>): Promise<T> {\n const span = this.startSpan(name, attributes);\n\n try {\n // Run the function within the span context\n const result = await context.with(trace.setSpan(context.active(), span), async () => {\n return await fn();\n });\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n this.recordException(span, error as Error);\n throw error;\n } finally {\n this.endSpan(span);\n }\n }\n\n async cleanup(): Promise<void> {\n try {\n if (this.spanProcessor) {\n await this.spanProcessor.forceFlush();\n await this.spanProcessor.shutdown();\n }\n\n if (this.provider) {\n await this.provider.shutdown();\n }\n\n if (this.debug) {\n console.log('[TracingService] Cleaned up successfully');\n }\n } catch (error) {\n console.error('[TracingService] Failed to cleanup:', error);\n }\n }\n\n /**\n * Get the current trace ID (useful for logging correlation)\n */\n getCurrentTraceId(): string | undefined {\n try {\n const span = trace.getSpan(context.active());\n return span?.spanContext().traceId;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get the current span ID\n */\n getCurrentSpanId(): string | undefined {\n try {\n const span = trace.getSpan(context.active());\n return span?.spanContext().spanId;\n } catch {\n return undefined;\n }\n }\n}\n\n// Type for fetch errors\ninterface FetchError {\n message: string;\n name: string;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ILicenseValidationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ILicenseValidationService.js","sourceRoot":"","sources":["../../../src/services/interfaces/ILicenseValidationService.ts"],"names":[],"mappings":"","sourcesContent":["import { LicenseValidationResponse } from '../LicenseValidationService';\n\nexport interface ILicenseValidationService {\n validateLicense(license: string, traceId?: string, appId?: string, metadata?: any): Promise<LicenseValidationResponse>;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IMetricsService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IMetricsService.js","sourceRoot":"","sources":["../../../src/services/interfaces/IMetricsService.ts"],"names":[],"mappings":"","sourcesContent":["export interface IMetricsService {\n /**\n * Initializes the metrics service with the collector endpoint\n */\n initialize(): void;\n\n /**\n * Increments a counter metric\n * @param name - Name of the counter\n * @param value - Value to add (default: 1)\n * @param attributes - Optional attributes\n */\n incrementCounter(name: string, value?: number, attributes?: Record<string, any>): void;\n\n /**\n * Records a histogram value (for latencies, sizes, etc.)\n * @param name - Name of the histogram\n * @param value - Value to record\n * @param attributes - Optional attributes\n */\n recordHistogram(name: string, value: number, attributes?: Record<string, any>): void;\n\n /**\n * Sets a gauge value (for current state values)\n * @param name - Name of the gauge\n * @param value - Current value\n * @param attributes - Optional attributes\n */\n setGauge(name: string, value: number, attributes?: Record<string, any>): void;\n\n /**\n * Records operation duration automatically\n * @param name - Name of the operation\n * @param fn - Function to measure\n * @param attributes - Optional attributes\n */\n measureDuration<T>(name: string, fn: () => T | Promise<T>, attributes?: Record<string, any>): Promise<T>;\n\n /**\n * Forces flush of metrics\n */\n flush(): Promise<void>;\n\n /**\n * Cleans up resources\n */\n cleanup(): Promise<void>;\n\n // Helper methods for common business metrics\n\n /**\n * Record a successful capture\n */\n recordCapture(side: 'front' | 'back', mode: 'auto' | 'manual', durationMs: number): void;\n\n /**\n * Record an error\n */\n recordError(errorType: string, operation: string): void;\n\n /**\n * Record model load performance\n */\n recordModelLoad(modelType: 'detection' | 'classification', durationMs: number, cached: boolean): void;\n\n /**\n * Record detection performance\n */\n recordDetection(durationMs: number, detectionsFound: number): void;\n\n /**\n * Record image size\n */\n recordImageSize(side: 'front' | 'back', sizeBytes: number): void;\n\n /**\n * Update active sessions count\n */\n updateActiveSessions(count: number): void;\n\n /**\n * Record user interaction\n */\n recordUserInteraction(interactionType: string): void;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ITracingService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITracingService.js","sourceRoot":"","sources":["../../../src/services/interfaces/ITracingService.ts"],"names":[],"mappings":"","sourcesContent":["import { Span } from '@opentelemetry/api';\n\nexport interface ITracingService {\n /**\n * Initializes the tracing service with the collector endpoint\n */\n initialize(): void;\n\n /**\n * Starts a new span with the given name\n * @param name - Name of the span\n * @param attributes - Optional attributes to add to the span\n * @returns The created span\n */\n startSpan(name: string, attributes?: Record<string, any>): Span;\n\n /**\n * Ends a span\n * @param span - The span to end\n */\n endSpan(span: Span): void;\n\n /**\n * Adds an event to a span\n * @param span - The span to add the event to\n * @param name - Name of the event\n * @param attributes - Optional attributes for the event\n */\n addSpanEvent(span: Span, name: string, attributes?: Record<string, any>): void;\n\n /**\n * Records an exception in a span\n * @param span - The span to record the exception in\n * @param error - The error to record\n */\n recordException(span: Span, error: Error): void;\n\n /**\n * Sets an attribute on a span\n * @param span - The span to set the attribute on\n * @param key - Attribute key\n * @param value - Attribute value\n */\n setSpanAttribute(span: Span, key: string, value: any): void;\n\n /**\n * Wraps a function with automatic span creation\n * @param name - Name of the span\n * @param fn - Function to wrap\n * @param attributes - Optional attributes\n */\n trace<T>(name: string, fn: () => T | Promise<T>, attributes?: Record<string, any>): Promise<T>;\n\n /**\n * Cleans up resources\n */\n cleanup(): void;\n\n /**\n * Set the session trace ID from external source (license or component prop)\n * @param traceId - The trace ID to use for all spans (32 hex characters)\n */\n setSessionTraceId(traceId: string | null): void;\n\n /**\n * Get the current session trace ID\n */\n getSessionTraceId(): string | null;\n}\n"]}
@@ -10,6 +10,10 @@ var __export = (target, all) => {
10
10
  __defProp(target, name, { get: all[name], enumerable: true });
11
11
  };
12
12
 
13
+ // src/utils/constants.ts
14
+ var SVG_NS = "http://www.w3.org/2000/svg";
15
+ var HTML_NS = "http://www.w3.org/1999/xhtml";
16
+
13
17
  // src/utils/es2022-rewire-class-members.ts
14
18
  var reWireGetterSetter = (instance, hostRef) => {
15
19
  var _a;
@@ -506,7 +510,7 @@ var setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags, initialRen
506
510
  }
507
511
  } else {
508
512
  const isComplex = isComplexType(newValue);
509
- if ((isProp || isComplex && newValue !== null) && true) {
513
+ if ((isProp || isComplex && newValue !== null) && !isSvg) {
510
514
  try {
511
515
  if (!elm.tagName.includes("-")) {
512
516
  const n = newValue == null ? "" : newValue;
@@ -599,14 +603,21 @@ var createElm = (oldParentVNode, newParentVNode, childIndex) => {
599
603
  if (newVNode2.$text$ !== null) {
600
604
  elm = newVNode2.$elm$ = win.document.createTextNode(newVNode2.$text$);
601
605
  } else {
606
+ if (!isSvgMode) {
607
+ isSvgMode = newVNode2.$tag$ === "svg";
608
+ }
602
609
  if (!win.document) {
603
610
  throw new Error(
604
611
  "You are trying to render a Stencil component in an environment that doesn't support the DOM. Make sure to populate the [`window`](https://developer.mozilla.org/en-US/docs/Web/API/Window/window) object before rendering a component."
605
612
  );
606
613
  }
607
- elm = newVNode2.$elm$ = win.document.createElement(
614
+ elm = newVNode2.$elm$ = win.document.createElementNS(
615
+ isSvgMode ? SVG_NS : HTML_NS,
608
616
  newVNode2.$tag$
609
- );
617
+ ) ;
618
+ if (isSvgMode && newVNode2.$tag$ === "foreignObject") {
619
+ isSvgMode = false;
620
+ }
610
621
  {
611
622
  updateElement(null, newVNode2, isSvgMode);
612
623
  }
@@ -618,6 +629,13 @@ var createElm = (oldParentVNode, newParentVNode, childIndex) => {
618
629
  }
619
630
  }
620
631
  }
632
+ {
633
+ if (newVNode2.$tag$ === "svg") {
634
+ isSvgMode = false;
635
+ } else if (elm.tagName === "foreignObject") {
636
+ isSvgMode = true;
637
+ }
638
+ }
621
639
  }
622
640
  elm["s-hn"] = hostTagName;
623
641
  return elm;
@@ -750,8 +768,12 @@ var patch = (oldVNode, newVNode2, isInitialRender = false) => {
750
768
  const elm = newVNode2.$elm$ = oldVNode.$elm$;
751
769
  const oldChildren = oldVNode.$children$;
752
770
  const newChildren = newVNode2.$children$;
771
+ const tag = newVNode2.$tag$;
753
772
  const text = newVNode2.$text$;
754
773
  if (text === null) {
774
+ {
775
+ isSvgMode = tag === "svg" ? true : tag === "foreignObject" ? false : isSvgMode;
776
+ }
755
777
  {
756
778
  updateElement(oldVNode, newVNode2, isSvgMode);
757
779
  }
@@ -768,6 +790,9 @@ var patch = (oldVNode, newVNode2, isInitialRender = false) => {
768
790
  ) {
769
791
  removeVnodes(oldChildren, 0, oldChildren.length - 1);
770
792
  } else ;
793
+ if (isSvgMode && tag === "svg") {
794
+ isSvgMode = false;
795
+ }
771
796
  } else if (oldVNode.$text$ !== text) {
772
797
  elm.data = text;
773
798
  }