@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.
- package/README.md +436 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/adapters/ITransportAdapter.d.ts +9 -0
- package/dist/adapters/ITransportAdapter.d.ts.map +1 -0
- package/dist/adapters/ITransportAdapter.js +3 -0
- package/dist/adapters/ITransportAdapter.js.map +1 -0
- package/dist/adapters/event-hub/EventHubAdapter.d.ts +33 -0
- package/dist/adapters/event-hub/EventHubAdapter.d.ts.map +1 -0
- package/dist/adapters/event-hub/EventHubAdapter.js +65 -0
- package/dist/adapters/event-hub/EventHubAdapter.js.map +1 -0
- package/dist/adapters/kafka/KafkaAdapter.d.ts +21 -0
- package/dist/adapters/kafka/KafkaAdapter.d.ts.map +1 -0
- package/dist/adapters/kafka/KafkaAdapter.js +163 -0
- package/dist/adapters/kafka/KafkaAdapter.js.map +1 -0
- package/dist/adapters/kafka/index.d.ts +3 -0
- package/dist/adapters/kafka/index.d.ts.map +1 -0
- package/dist/adapters/kafka/index.js +24 -0
- package/dist/adapters/kafka/index.js.map +1 -0
- package/dist/adapters/kafka/types.d.ts +29 -0
- package/dist/adapters/kafka/types.d.ts.map +1 -0
- package/dist/adapters/kafka/types.js +3 -0
- package/dist/adapters/kafka/types.js.map +1 -0
- package/dist/client/AnalyticsClient.d.ts +96 -0
- package/dist/client/AnalyticsClient.d.ts.map +1 -0
- package/dist/client/AnalyticsClient.js +489 -0
- package/dist/client/AnalyticsClient.js.map +1 -0
- package/dist/commands/PublishCommand.d.ts +22 -0
- package/dist/commands/PublishCommand.d.ts.map +1 -0
- package/dist/commands/PublishCommand.js +32 -0
- package/dist/commands/PublishCommand.js.map +1 -0
- package/dist/decorators/RetryDecorator.d.ts +11 -0
- package/dist/decorators/RetryDecorator.d.ts.map +1 -0
- package/dist/decorators/RetryDecorator.js +37 -0
- package/dist/decorators/RetryDecorator.js.map +1 -0
- package/dist/factories/AdapterFactory.d.ts +8 -0
- package/dist/factories/AdapterFactory.d.ts.map +1 -0
- package/dist/factories/AdapterFactory.js +25 -0
- package/dist/factories/AdapterFactory.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/observers/MetricsObserver.d.ts +11 -0
- package/dist/observers/MetricsObserver.d.ts.map +1 -0
- package/dist/observers/MetricsObserver.js +15 -0
- package/dist/observers/MetricsObserver.js.map +1 -0
- package/dist/publishers/BasePublisher.d.ts +15 -0
- package/dist/publishers/BasePublisher.d.ts.map +1 -0
- package/dist/publishers/BasePublisher.js +54 -0
- package/dist/publishers/BasePublisher.js.map +1 -0
- package/dist/publishers/ClientPublisher.d.ts +6 -0
- package/dist/publishers/ClientPublisher.d.ts.map +1 -0
- package/dist/publishers/ClientPublisher.js +27 -0
- package/dist/publishers/ClientPublisher.js.map +1 -0
- package/dist/publishers/EventPublisher.d.ts +6 -0
- package/dist/publishers/EventPublisher.d.ts.map +1 -0
- package/dist/publishers/EventPublisher.js +15 -0
- package/dist/publishers/EventPublisher.js.map +1 -0
- package/dist/publishers/SessionPublisher.d.ts +6 -0
- package/dist/publishers/SessionPublisher.d.ts.map +1 -0
- package/dist/publishers/SessionPublisher.js +15 -0
- package/dist/publishers/SessionPublisher.js.map +1 -0
- package/dist/types/index.d.ts +85 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/examples/eventhub.ts +188 -0
- package/examples/kafka.ts +189 -0
- 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
|