@phystack/analytics-publisher 4.3.40-dev

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 (69) hide show
  1. package/README.md +436 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/adapters/ITransportAdapter.d.ts +9 -0
  4. package/dist/adapters/ITransportAdapter.d.ts.map +1 -0
  5. package/dist/adapters/ITransportAdapter.js +3 -0
  6. package/dist/adapters/ITransportAdapter.js.map +1 -0
  7. package/dist/adapters/event-hub/EventHubAdapter.d.ts +33 -0
  8. package/dist/adapters/event-hub/EventHubAdapter.d.ts.map +1 -0
  9. package/dist/adapters/event-hub/EventHubAdapter.js +65 -0
  10. package/dist/adapters/event-hub/EventHubAdapter.js.map +1 -0
  11. package/dist/adapters/kafka/KafkaAdapter.d.ts +21 -0
  12. package/dist/adapters/kafka/KafkaAdapter.d.ts.map +1 -0
  13. package/dist/adapters/kafka/KafkaAdapter.js +163 -0
  14. package/dist/adapters/kafka/KafkaAdapter.js.map +1 -0
  15. package/dist/adapters/kafka/index.d.ts +3 -0
  16. package/dist/adapters/kafka/index.d.ts.map +1 -0
  17. package/dist/adapters/kafka/index.js +24 -0
  18. package/dist/adapters/kafka/index.js.map +1 -0
  19. package/dist/adapters/kafka/types.d.ts +29 -0
  20. package/dist/adapters/kafka/types.d.ts.map +1 -0
  21. package/dist/adapters/kafka/types.js +3 -0
  22. package/dist/adapters/kafka/types.js.map +1 -0
  23. package/dist/client/AnalyticsClient.d.ts +96 -0
  24. package/dist/client/AnalyticsClient.d.ts.map +1 -0
  25. package/dist/client/AnalyticsClient.js +489 -0
  26. package/dist/client/AnalyticsClient.js.map +1 -0
  27. package/dist/commands/PublishCommand.d.ts +22 -0
  28. package/dist/commands/PublishCommand.d.ts.map +1 -0
  29. package/dist/commands/PublishCommand.js +32 -0
  30. package/dist/commands/PublishCommand.js.map +1 -0
  31. package/dist/decorators/RetryDecorator.d.ts +11 -0
  32. package/dist/decorators/RetryDecorator.d.ts.map +1 -0
  33. package/dist/decorators/RetryDecorator.js +37 -0
  34. package/dist/decorators/RetryDecorator.js.map +1 -0
  35. package/dist/factories/AdapterFactory.d.ts +8 -0
  36. package/dist/factories/AdapterFactory.d.ts.map +1 -0
  37. package/dist/factories/AdapterFactory.js +25 -0
  38. package/dist/factories/AdapterFactory.js.map +1 -0
  39. package/dist/index.d.ts +16 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +29 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/observers/MetricsObserver.d.ts +11 -0
  44. package/dist/observers/MetricsObserver.d.ts.map +1 -0
  45. package/dist/observers/MetricsObserver.js +15 -0
  46. package/dist/observers/MetricsObserver.js.map +1 -0
  47. package/dist/publishers/BasePublisher.d.ts +15 -0
  48. package/dist/publishers/BasePublisher.d.ts.map +1 -0
  49. package/dist/publishers/BasePublisher.js +54 -0
  50. package/dist/publishers/BasePublisher.js.map +1 -0
  51. package/dist/publishers/ClientPublisher.d.ts +6 -0
  52. package/dist/publishers/ClientPublisher.d.ts.map +1 -0
  53. package/dist/publishers/ClientPublisher.js +27 -0
  54. package/dist/publishers/ClientPublisher.js.map +1 -0
  55. package/dist/publishers/EventPublisher.d.ts +6 -0
  56. package/dist/publishers/EventPublisher.d.ts.map +1 -0
  57. package/dist/publishers/EventPublisher.js +15 -0
  58. package/dist/publishers/EventPublisher.js.map +1 -0
  59. package/dist/publishers/SessionPublisher.d.ts +6 -0
  60. package/dist/publishers/SessionPublisher.d.ts.map +1 -0
  61. package/dist/publishers/SessionPublisher.js +15 -0
  62. package/dist/publishers/SessionPublisher.js.map +1 -0
  63. package/dist/types/index.d.ts +85 -0
  64. package/dist/types/index.d.ts.map +1 -0
  65. package/dist/types/index.js +16 -0
  66. package/dist/types/index.js.map +1 -0
  67. package/examples/eventhub.ts +188 -0
  68. package/examples/kafka.ts +189 -0
  69. package/package.json +68 -0
package/README.md ADDED
@@ -0,0 +1,436 @@
1
+ # @phystack/analytics-publisher
2
+
3
+ Internal Phygrid client library for publishing and validating analytics events, sessions, and client data with support for batching, retry strategies, and observability. Designed for reliable event delivery and easy integration across services.
4
+
5
+ ## Features
6
+
7
+ - **Multi-transport support**: Kafka and Azure Event Hub adapters
8
+ - **Simplified architecture**: One Kafka client per region deployment
9
+ - **Multi-data-type support**: Events, Sessions, and Client data publishing
10
+ - **Automatic date conversion**: Handles Date objects and strings seamlessly
11
+ - **Batching**: Automatic message batching with configurable buffer sizes
12
+ - **Retry logic**: Configurable retry strategies with exponential backoff
13
+ - **Type safety**: Full TypeScript support with strict typing
14
+ - **Observability**: Built-in metrics and monitoring capabilities
15
+ - **Validation**: Automatic message validation before publishing
16
+ - **Backpressure handling**: Automatic throttling when buffer usage is high
17
+ - **Graceful shutdown**: Ensures all buffered messages are sent before closing
18
+
19
+ ## Installation
20
+
21
+ ```bash
22
+ npm install @phystack/analytics-publisher
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ ### Basic Usage
28
+
29
+ ```typescript
30
+ import { AnalyticsClient } from '@phystack/analytics-publisher';
31
+
32
+ // Initialize with simplified Kafka configuration
33
+ const analytics = new AnalyticsClient({
34
+ adapter: 'kafka',
35
+ adapterConfig: {
36
+ brokers: ['localhost:9092'], // Your Kafka broker
37
+ clientId: 'analytics-client',
38
+ connectionTimeout: 30000,
39
+ requestTimeout: 30000,
40
+ ssl: {
41
+ rejectUnauthorized: false,
42
+ },
43
+ sasl: {
44
+ mechanism: 'scram-sha-512',
45
+ username: 'kafka-user',
46
+ password: 'kafka-password',
47
+ },
48
+ },
49
+ bufferSize: 1000,
50
+ flushIntervalMs: 2000,
51
+ maxRetries: 3,
52
+ enableBackpressure: true,
53
+ backpressureThreshold: 0.8,
54
+ enableMetricsLogging: true,
55
+ });
56
+
57
+ await analytics.init();
58
+
59
+ // Define sample data payloads (package handles date conversion automatically)
60
+ const eventData = {
61
+ captureId: 'capture-123',
62
+ tenantId: 'company-x',
63
+ spaceId: 'space-123',
64
+ sessionId: 'session_789',
65
+ clientId: 'client-456',
66
+ eventType: 'button_click',
67
+ eventTime: new Date(), // Can pass Date object - package converts to ISO string
68
+ interaction: true,
69
+ ip: '192.168.1.100',
70
+ dataResidency: 'US', // This is just metadata for analytics tracking
71
+ str1: 'signup-btn',
72
+ str2: '/home',
73
+ };
74
+
75
+ const sessionData = {
76
+ sessionId: 'session_789',
77
+ tenantId: 'company-x',
78
+ sessionCreated: new Date().toISOString(),
79
+ environment: 'production',
80
+ dataResidency: 'US',
81
+ country: 'United States',
82
+ spaceId: 'space-123',
83
+ appId: 'web-app',
84
+ appVersion: '1.0.0',
85
+ installationVersion: '1.0.0',
86
+ installationId: 'install-456',
87
+ deviceId: 'device-789',
88
+ clientId: 'client-456',
89
+ ip: '192.168.1.100',
90
+ locationAccuracy: 10,
91
+ latitude: 40.7128,
92
+ longitude: -74.006,
93
+ captureId: 'capture-123',
94
+ };
95
+
96
+ const clientData = {
97
+ clientId: 'client-456',
98
+ tenantId: 'company-x',
99
+ clientCreated: new Date().toISOString(),
100
+ clientUserAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
101
+ clientScreenWidth: 1920,
102
+ clientScreenHeight: 1080,
103
+ clientScreenColorDepth: 24,
104
+ clientScreenPixelDepth: 24,
105
+ clientIp: '192.168.1.100',
106
+ dataResidency: 'US',
107
+ country: 'United States',
108
+ latitude: 40.7128,
109
+ longitude: -74.006,
110
+ locationAccuracy: 10,
111
+ captureId: 'capture-123',
112
+ clientDeviceVendor: 'Microsoft',
113
+ clientDeviceModel: 'Surface Pro',
114
+ clientDeviceType: 'desktop',
115
+ clientOsName: 'Windows',
116
+ clientOsVersion: '10.0',
117
+ clientBrowserName: 'Chrome',
118
+ clientBrowserVersion: '120.0.0.0',
119
+ clientBrowserMajor: '120',
120
+ clientBrowserEngine: 'Blink',
121
+ clientBrowserEngineVersion: '120.0.0.0',
122
+ clientCpuArchitecture: 'x64',
123
+ };
124
+
125
+ // Publish events
126
+ await analytics.publishEvent(eventData);
127
+
128
+ // Publish sessions
129
+ await analytics.publishSession(sessionData);
130
+
131
+ // Publish client data
132
+ await analytics.publishClient(clientData);
133
+
134
+ await analytics.close();
135
+ ```
136
+
137
+ ### Azure Event Hub
138
+
139
+ ```typescript
140
+ import { AnalyticsClient } from '@phystack/analytics-publisher';
141
+
142
+ // Initialize with Event Hub
143
+ const analytics = new AnalyticsClient({
144
+ adapter: 'eventHub',
145
+ adapterConfig: {
146
+ retryOptions: {
147
+ maxRetries: 4,
148
+ retryDelayInMs: 1000,
149
+ },
150
+ dataResidency: {
151
+ US: {
152
+ events: 'Endpoint=sb://us-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
153
+ sessions: 'Endpoint=sb://us-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
154
+ clients: 'Endpoint=sb://us-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
155
+ },
156
+ EU: {
157
+ events: 'Endpoint=sb://eu-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
158
+ sessions: 'Endpoint=sb://eu-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
159
+ clients: 'Endpoint=sb://eu-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
160
+ },
161
+ },
162
+ },
163
+ bufferSize: 1000,
164
+ flushIntervalMs: 2000,
165
+ maxRetries: 3,
166
+ enableBackpressure: true,
167
+ backpressureThreshold: 0.8,
168
+ enableMetricsLogging: true,
169
+ });
170
+
171
+ await analytics.init();
172
+
173
+ // Publish events, sessions, and clients using the same methods as Kafka
174
+ await analytics.publishEvent(eventData);
175
+ await analytics.publishSession(sessionData);
176
+ await analytics.publishClient(clientData);
177
+
178
+ await analytics.close();
179
+ ```
180
+
181
+ ## Configuration
182
+
183
+ ### AnalyticsClient Options
184
+
185
+ | Option | Type | Default | Description |
186
+ |--------|------|---------|-------------|
187
+ | `adapter` | `'kafka' \| 'eventHub'` | Required | Transport adapter type |
188
+ | `adapterConfig` | `object` | `{}` | Adapter-specific configuration |
189
+ | `bufferSize` | `number` | `1000` | Maximum messages to buffer before flushing |
190
+ | `flushIntervalMs` | `number` | `2000` | Automatic flush interval in milliseconds |
191
+ | `maxRetries` | `number` | `3` | Maximum retry attempts for failed messages |
192
+ | `enableBackpressure` | `boolean` | `true` | Enable backpressure handling |
193
+ | `backpressureThreshold` | `number` | `0.8` | Buffer usage threshold for backpressure (0-1) |
194
+ | `backpressureDelayMs` | `number` | `50` | Initial delay for backpressure in milliseconds |
195
+ | `maxBatchSize` | `number` | `100` | Maximum messages per batch |
196
+ | `parallelBatchLimit` | `number` | `5` | Maximum concurrent batches |
197
+ | `commandTimeoutMs` | `number` | `10000` | Timeout for individual commands |
198
+ | `enableMetricsLogging` | `boolean` | `true` | Enable metrics collection and logging |
199
+ | `metricsLogIntervalMs` | `number` | `10000` | Interval for metrics logging |
200
+ | `onPublishError` | `function` | `console.error` | Error handler for failed publishes |
201
+
202
+ ### Kafka Configuration
203
+
204
+ ```typescript
205
+ {
206
+ adapter: 'kafka',
207
+ adapterConfig: {
208
+ dataResidency: {
209
+ US: {
210
+ brokers: ['kafka-us.example.com:9092'],
211
+ ssl: {
212
+ rejectUnauthorized: false,
213
+ },
214
+ sasl: {
215
+ mechanism: 'scram-sha-512',
216
+ username: 'kafka-user',
217
+ password: 'kafka-password',
218
+ },
219
+ connectionTimeout: 30000,
220
+ requestTimeout: 30000,
221
+ },
222
+ EU: {
223
+ brokers: ['kafka-eu.example.com:9092'],
224
+ ssl: {
225
+ rejectUnauthorized: false,
226
+ },
227
+ sasl: {
228
+ mechanism: 'scram-sha-512',
229
+ username: 'kafka-user',
230
+ password: 'kafka-password',
231
+ },
232
+ },
233
+ },
234
+ }
235
+ }
236
+ ```
237
+
238
+ ### Event Hub Configuration
239
+
240
+ ```typescript
241
+ {
242
+ adapter: 'eventHub',
243
+ adapterConfig: {
244
+ retryOptions: {
245
+ maxRetries: 4,
246
+ retryDelayInMs: 1000,
247
+ },
248
+ dataResidency: {
249
+ US: {
250
+ events: 'Endpoint=sb://us-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
251
+ sessions: 'Endpoint=sb://us-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
252
+ clients: 'Endpoint=sb://us-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
253
+ },
254
+ EU: {
255
+ events: 'Endpoint=sb://eu-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
256
+ sessions: 'Endpoint=sb://eu-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
257
+ clients: 'Endpoint=sb://eu-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
258
+ },
259
+ UAE: {
260
+ events: 'Endpoint=sb://uae-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
261
+ sessions: 'Endpoint=sb://uae-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
262
+ clients: 'Endpoint=sb://uae-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
263
+ },
264
+ AU: {
265
+ events: 'Endpoint=sb://au-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
266
+ sessions: 'Endpoint=sb://au-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
267
+ clients: 'Endpoint=sb://au-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
268
+ },
269
+ IN: {
270
+ events: 'Endpoint=sb://in-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
271
+ sessions: 'Endpoint=sb://in-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
272
+ clients: 'Endpoint=sb://in-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
273
+ },
274
+ DEV: {
275
+ events: 'Endpoint=sb://dev-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
276
+ sessions: 'Endpoint=sb://dev-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
277
+ clients: 'Endpoint=sb://dev-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
278
+ },
279
+ QA: {
280
+ events: 'Endpoint=sb://qa-events.servicebus.windows.net/;SharedAccessKeyName=events;SharedAccessKey=key;EntityPath=events',
281
+ sessions: 'Endpoint=sb://qa-sessions.servicebus.windows.net/;SharedAccessKeyName=sessions;SharedAccessKey=key;EntityPath=sessions',
282
+ clients: 'Endpoint=sb://qa-clients.servicebus.windows.net/;SharedAccessKeyName=clients;SharedAccessKey=key;EntityPath=clients',
283
+ },
284
+ },
285
+ }
286
+ }
287
+ ```
288
+
289
+ ## Data Types
290
+
291
+ ### Event Interface
292
+
293
+ ```typescript
294
+ interface Event {
295
+ captureId: string;
296
+ tenantId: string;
297
+ spaceId: string;
298
+ sessionId: string;
299
+ clientId: string;
300
+ eventType: string;
301
+ eventTime: string;
302
+ interaction: boolean;
303
+ ip: string;
304
+ dataResidency: string;
305
+ productId?: string;
306
+ categoryId?: string;
307
+ int1?: number;
308
+ int2?: number;
309
+ int3?: number;
310
+ int4?: number;
311
+ int5?: number;
312
+ str1?: string;
313
+ str2?: string;
314
+ str3?: string;
315
+ str4?: string;
316
+ str5?: string;
317
+ }
318
+
319
+ ```
320
+
321
+ ### Session Interface
322
+
323
+ ```typescript
324
+ interface Session {
325
+ tenantId: string;
326
+ sessionId: string;
327
+ sessionCreated: string;
328
+ environment: string;
329
+ dataResidency: string;
330
+ country: string;
331
+ spaceId: string;
332
+ appId: string;
333
+ appVersion?: string;
334
+ installationVersion?: string;
335
+ installationId: string;
336
+ deviceId?: string;
337
+ clientId: string;
338
+ ip: string;
339
+ locationAccuracy: number;
340
+ latitude: number;
341
+ longitude: number;
342
+ captureId: string;
343
+ }
344
+ ```
345
+
346
+ ### Client Interface
347
+
348
+ ```typescript
349
+ interface Client {
350
+ captureId: string;
351
+ tenantId: string;
352
+ clientId: string;
353
+ clientCreated: string;
354
+ clientIp: string;
355
+ clientUserAgent: string;
356
+ dataResidency: string;
357
+ country: string;
358
+ locationAccuracy: number;
359
+ latitude: number;
360
+ longitude: number;
361
+ clientScreenWidth: number;
362
+ clientScreenHeight: number;
363
+ clientScreenColorDepth: number;
364
+ clientScreenPixelDepth: number;
365
+ clientDeviceVendor: string;
366
+ clientDeviceModel: string;
367
+ clientDeviceType: string;
368
+ clientOsName: string;
369
+ clientOsVersion: string;
370
+ clientBrowserName: string;
371
+ clientBrowserVersion: string;
372
+ clientBrowserMajor: string;
373
+ clientBrowserEngine: string;
374
+ clientBrowserEngineVersion: string;
375
+ clientCpuArchitecture: string;
376
+ }
377
+ ```
378
+
379
+
380
+ ### Metrics and Observability
381
+
382
+ ```typescript
383
+ import { MetricsObserver } from '@phystack/analytics-publisher';
384
+
385
+ const observer = new MetricsObserver();
386
+ publisher.addObserver(observer);
387
+
388
+ // Observer will track:
389
+ // - Successful publishes
390
+ // - Failed publishes
391
+ // - Batch full events
392
+ ```
393
+
394
+ ### Error Handling
395
+
396
+ ```typescript
397
+ try {
398
+ await analytics.publishEvent(eventData);
399
+ } catch (error) {
400
+ console.error('Failed to publish event:', error);
401
+ // Handle error appropriately
402
+ }
403
+ ```
404
+
405
+ ## Development
406
+
407
+ ### Building
408
+
409
+ ```bash
410
+ npm run build
411
+ ```
412
+
413
+ ### Testing
414
+
415
+ ```bash
416
+ npm test
417
+ npm run test:coverage
418
+ ```
419
+
420
+ ### Linting
421
+
422
+ ```bash
423
+ npm run lint
424
+ npm run lint:fix
425
+ ```
426
+
427
+ ## Examples
428
+
429
+ See the `examples/` directory for complete usage examples:
430
+
431
+ - `kafka.ts` - Kafka adapter usage with multiple data residencies
432
+ - `eventhub.ts` - Azure Event Hub adapter usage
433
+
434
+ ## License
435
+
436
+ MIT