@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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kafka Usage Example
|
|
3
|
+
*
|
|
4
|
+
* This example demonstrates how to use the AnalyticsClient with simplified Kafka adapter.
|
|
5
|
+
* One Kafka client per region deployment - loosely coupled from data residency.
|
|
6
|
+
* Run this with: npm run example:kafka
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { AnalyticsClient } from '../src/client/AnalyticsClient';
|
|
10
|
+
|
|
11
|
+
async function main() {
|
|
12
|
+
console.log('š Starting Kafka Analytics Client Example...');
|
|
13
|
+
// Simple Kafka adapter configuration - one client per region
|
|
14
|
+
const kafkaAnalytics = new AnalyticsClient({
|
|
15
|
+
adapter: 'kafka',
|
|
16
|
+
adapterConfig: {
|
|
17
|
+
brokers: ['localhost:9092'], // Your Kafka broker
|
|
18
|
+
clientId: 'analytics-client',
|
|
19
|
+
connectionTimeout: 10000,
|
|
20
|
+
requestTimeout: 30000,
|
|
21
|
+
ssl: {
|
|
22
|
+
rejectUnauthorized: false,
|
|
23
|
+
},
|
|
24
|
+
sasl: {
|
|
25
|
+
mechanism: 'scram-sha-512',
|
|
26
|
+
username: 'kafka-user',
|
|
27
|
+
password: 'kafka-password',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
bufferSize: 50,
|
|
31
|
+
flushIntervalMs: 1000,
|
|
32
|
+
maxRetries: 3,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
console.log('š§ Initializing Kafka analytics client...');
|
|
37
|
+
await kafkaAnalytics.init();
|
|
38
|
+
console.log('ā
Kafka analytics client initialized');
|
|
39
|
+
|
|
40
|
+
console.log('š Publishing sample events to Kafka...');
|
|
41
|
+
|
|
42
|
+
// Publish Event (package handles date conversion automatically)
|
|
43
|
+
await kafkaAnalytics.publishEvent({
|
|
44
|
+
captureId: 'capture-123',
|
|
45
|
+
tenantId: 'company-x',
|
|
46
|
+
spaceId: 'space-123',
|
|
47
|
+
sessionId: 'session_789',
|
|
48
|
+
clientId: 'client-456',
|
|
49
|
+
eventType: 'button_click',
|
|
50
|
+
eventTime: new Date(), // Can pass Date object - package converts to ISO string
|
|
51
|
+
interaction: true,
|
|
52
|
+
ip: '192.168.1.100',
|
|
53
|
+
dataResidency: 'US',
|
|
54
|
+
str1: 'signup-btn',
|
|
55
|
+
str2: '/home',
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
console.log('ā
Event published to Kafka successfully');
|
|
59
|
+
|
|
60
|
+
// Publish Session (package handles date conversion automatically)
|
|
61
|
+
await kafkaAnalytics.publishSession({
|
|
62
|
+
sessionId: 'session_789',
|
|
63
|
+
tenantId: 'company-x',
|
|
64
|
+
sessionCreated: new Date(), // Can pass Date object - package converts to ISO string
|
|
65
|
+
environment: 'production',
|
|
66
|
+
dataResidency: 'US',
|
|
67
|
+
country: 'United States',
|
|
68
|
+
spaceId: 'space-123',
|
|
69
|
+
appId: 'web-app',
|
|
70
|
+
appVersion: '1.0.0',
|
|
71
|
+
installationVersion: '1.0.0',
|
|
72
|
+
installationId: 'install-456',
|
|
73
|
+
deviceId: 'device-789',
|
|
74
|
+
clientId: 'client-456',
|
|
75
|
+
ip: '192.168.1.100',
|
|
76
|
+
locationAccuracy: 10,
|
|
77
|
+
latitude: 40.7128,
|
|
78
|
+
longitude: -74.006,
|
|
79
|
+
captureId: 'capture-123',
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
console.log('ā
Session published to Kafka successfully');
|
|
83
|
+
|
|
84
|
+
// Publish Client (package handles date conversion automatically)
|
|
85
|
+
await kafkaAnalytics.publishClient({
|
|
86
|
+
clientId: 'client-kafka-123',
|
|
87
|
+
tenantId: 'company-x',
|
|
88
|
+
clientCreated: new Date(), // Can pass Date object - package converts to ISO string
|
|
89
|
+
clientUserAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
|
|
90
|
+
clientScreenWidth: 1440,
|
|
91
|
+
clientScreenHeight: 900,
|
|
92
|
+
clientScreenColorDepth: 24,
|
|
93
|
+
clientScreenPixelDepth: 24,
|
|
94
|
+
clientIp: '192.168.1.150',
|
|
95
|
+
dataResidency: 'US',
|
|
96
|
+
country: 'United States',
|
|
97
|
+
latitude: 37.7749,
|
|
98
|
+
longitude: -122.4194,
|
|
99
|
+
locationAccuracy: 10,
|
|
100
|
+
captureId: 'capture-kafka-123',
|
|
101
|
+
clientDeviceVendor: 'Apple',
|
|
102
|
+
clientDeviceModel: 'MacBook Pro',
|
|
103
|
+
clientDeviceType: 'desktop',
|
|
104
|
+
clientOsName: 'macOS',
|
|
105
|
+
clientOsVersion: '14.0',
|
|
106
|
+
clientBrowserName: 'Safari',
|
|
107
|
+
clientBrowserVersion: '17.0',
|
|
108
|
+
clientBrowserMajor: '17',
|
|
109
|
+
clientBrowserEngine: 'WebKit',
|
|
110
|
+
clientBrowserEngineVersion: '605.1.15',
|
|
111
|
+
clientCpuArchitecture: 'arm64',
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
console.log('ā
Client published to Kafka successfully');
|
|
115
|
+
|
|
116
|
+
// Batch publishing example (package handles date conversion automatically)
|
|
117
|
+
const events = [
|
|
118
|
+
{
|
|
119
|
+
captureId: 'capture-123',
|
|
120
|
+
tenantId: 'company-x',
|
|
121
|
+
spaceId: 'space-123',
|
|
122
|
+
sessionId: 'session_789',
|
|
123
|
+
clientId: 'client-456',
|
|
124
|
+
eventType: 'page_view',
|
|
125
|
+
eventTime: new Date(), // Can pass Date object - package converts to ISO string
|
|
126
|
+
interaction: false,
|
|
127
|
+
ip: '192.168.1.100',
|
|
128
|
+
dataResidency: 'US',
|
|
129
|
+
str1: '/products',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
captureId: 'capture-123',
|
|
133
|
+
tenantId: 'company-x',
|
|
134
|
+
spaceId: 'space-123',
|
|
135
|
+
sessionId: 'session_789',
|
|
136
|
+
clientId: 'client-456',
|
|
137
|
+
eventType: 'product_view',
|
|
138
|
+
eventTime: new Date(), // Can pass Date object - package converts to ISO string
|
|
139
|
+
interaction: true,
|
|
140
|
+
ip: '192.168.1.100',
|
|
141
|
+
dataResidency: 'US',
|
|
142
|
+
productId: 'product-123',
|
|
143
|
+
str1: 'electronics',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
captureId: 'capture-123',
|
|
147
|
+
tenantId: 'company-x',
|
|
148
|
+
spaceId: 'space-123',
|
|
149
|
+
sessionId: 'session_789',
|
|
150
|
+
clientId: 'client-456',
|
|
151
|
+
eventType: 'add_to_cart',
|
|
152
|
+
eventTime: new Date(), // Can pass Date object - package converts to ISO string
|
|
153
|
+
interaction: true,
|
|
154
|
+
ip: '192.168.1.100',
|
|
155
|
+
dataResidency: 'US',
|
|
156
|
+
productId: 'product-123',
|
|
157
|
+
int1: 1,
|
|
158
|
+
str1: 'electronics',
|
|
159
|
+
},
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
console.log('š¦ Publishing batch events to Kafka...');
|
|
163
|
+
for (const event of events) {
|
|
164
|
+
await kafkaAnalytics.publishEvent(event);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
console.log('ā
Multiple events published to Kafka (batched)');
|
|
168
|
+
|
|
169
|
+
console.log('ā³ Waiting for batch flush...');
|
|
170
|
+
await new Promise(resolve => setTimeout(resolve, 4000));
|
|
171
|
+
|
|
172
|
+
console.log('\nš Simplified Package Features:');
|
|
173
|
+
console.log('⢠Simple configuration: One Kafka client per region deployment');
|
|
174
|
+
console.log(
|
|
175
|
+
'⢠Automatic date conversion: Pass Date objects or strings - package handles ISO conversion'
|
|
176
|
+
);
|
|
177
|
+
console.log('⢠Loosely coupled: No complex multi-region logic in KafkaAdapter');
|
|
178
|
+
console.log('⢠Easy to maintain: Clean, simple codebase');
|
|
179
|
+
console.log('⢠Backward compatibility: Existing string dates continue to work');
|
|
180
|
+
} catch (error) {
|
|
181
|
+
console.error('ā Error publishing analytics:', error);
|
|
182
|
+
} finally {
|
|
183
|
+
console.log('š Closing Kafka analytics client...');
|
|
184
|
+
await kafkaAnalytics.close();
|
|
185
|
+
console.log('ā
Kafka analytics client closed');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
main().catch(console.error);
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@phystack/analytics-publisher",
|
|
3
|
+
"version": "4.3.40-dev",
|
|
4
|
+
"description": "Internal Phygrid library for publishing and validating analytics events, with support for batching, retry strategies, and observability. Designed for reliable event delivery and easy integration across services.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"author": "https://build.phygrid.com/",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist/**/*",
|
|
10
|
+
"examples/**/*",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "rimraf dist && tsc",
|
|
15
|
+
"build:watch": "tsc --watch",
|
|
16
|
+
"dev": "ts-node src/index.ts",
|
|
17
|
+
"example:kafka": "ts-node examples/kafka.ts",
|
|
18
|
+
"example:eventhub": "ts-node examples/eventhub.ts",
|
|
19
|
+
"stress-test": "ts-node examples/stress-test.ts",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"lint": "eslint src/**/*.ts",
|
|
22
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
23
|
+
"test": "jest",
|
|
24
|
+
"test:watch": "jest --watch",
|
|
25
|
+
"test:coverage": "jest --coverage",
|
|
26
|
+
"format": "prettier --write \"src/**/*.{ts,js,json,md}\"",
|
|
27
|
+
"format:check": "prettier --check \"src/**/*.{ts,js,json,md}\"",
|
|
28
|
+
"typecheck": "tsc --noEmit"
|
|
29
|
+
},
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"keywords": [
|
|
32
|
+
"phygrid",
|
|
33
|
+
"analytics",
|
|
34
|
+
"events",
|
|
35
|
+
"client",
|
|
36
|
+
"typescript",
|
|
37
|
+
"internal"
|
|
38
|
+
],
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/jest": "^29.0.0",
|
|
41
|
+
"@types/node": "^20.0.0",
|
|
42
|
+
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
43
|
+
"@typescript-eslint/parser": "^6.21.0",
|
|
44
|
+
"eslint": "^8.0.0",
|
|
45
|
+
"eslint-config-prettier": "^9.0.0",
|
|
46
|
+
"eslint-plugin-prettier": "^5.0.0",
|
|
47
|
+
"jest": "^29.0.0",
|
|
48
|
+
"prettier": "^3.0.0",
|
|
49
|
+
"rimraf": "^5.0.0",
|
|
50
|
+
"ts-jest": "^29.0.0",
|
|
51
|
+
"ts-node": "^10.9.0",
|
|
52
|
+
"typescript": "^5.0.0"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"typescript": ">=4.9.0"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@azure/event-hubs": "^6.0.0",
|
|
59
|
+
"kafkajs": "^2.2.4"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=20.0.0"
|
|
63
|
+
},
|
|
64
|
+
"publishConfig": {
|
|
65
|
+
"access": "public"
|
|
66
|
+
},
|
|
67
|
+
"gitHead": "53c505b3ecad47ebd4f38819c07b0ec1227214a6"
|
|
68
|
+
}
|