cdp-lite-sdk 0.1.0 → 0.1.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.
@@ -0,0 +1,401 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ class CdpLiteSdk {
6
+ constructor(config) {
7
+ this.config = {
8
+ apiKey: config.apiKey,
9
+ source: config.source || 'Web',
10
+ serviceName: config.serviceName || 'DefaultService',
11
+ baseUrl: config.baseUrl || 'https://stg-ingestlog.vietcredit.com.vn',
12
+ isTest: config.isTest !== undefined ? config.isTest : false,
13
+ debug: config.debug || false,
14
+ batchSize: config.batchSize || 10,
15
+ batchInterval: config.batchInterval || 5000, // 5 seconds
16
+ autoTrackDevice: config.autoTrackDevice !== undefined ? config.autoTrackDevice : true,
17
+ };
18
+
19
+ this.eventQueue = [];
20
+ this.userId = null;
21
+ this.anonymousId = this._getOrCreateAnonymousId();
22
+ this.userTraits = {};
23
+ this.deviceInfo = this.config.autoTrackDevice ? this._getDeviceInfo() : {};
24
+
25
+ // Start batch processor
26
+ if (this.config.batchSize > 1) {
27
+ this._startBatchProcessor();
28
+ }
29
+
30
+ this._log('CDP Lite SDK initialized', this.config);
31
+ }
32
+
33
+ // ============ Public Methods ============
34
+
35
+ /**
36
+ * Track an event
37
+ * @param {string} eventName - Name of the event
38
+ * @param {object} properties - Event properties
39
+ * @param {object} options - Additional options (device, campaign, context, etc.)
40
+ */
41
+ track(eventName, properties = {}, options = {}) {
42
+ const event = this._createEvent({
43
+ type: 'track',
44
+ event: eventName,
45
+ properties,
46
+ ...options
47
+ });
48
+
49
+ if (this.config.batchSize > 1) {
50
+ this._addToQueue(event);
51
+ } else {
52
+ return this._sendEvent(event);
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Identify a user
58
+ * @param {string} userId - User ID
59
+ * @param {object} traits - User traits/attributes
60
+ */
61
+ identify(userId, traits = {}) {
62
+ this.userId = userId;
63
+ this.userTraits = { ...this.userTraits, ...traits };
64
+
65
+ const event = this._createEvent({
66
+ type: 'identify',
67
+ event: 'user_identified',
68
+ traits,
69
+ });
70
+
71
+ this._log('User identified', { userId, traits });
72
+
73
+ if (this.config.batchSize > 1) {
74
+ this._addToQueue(event);
75
+ } else {
76
+ return this._sendEvent(event);
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Track a page view
82
+ * @param {string} pageName - Page name
83
+ * @param {object} properties - Page properties
84
+ */
85
+ page(pageName, properties = {}) {
86
+ return this.track('page_view', {
87
+ page_name: pageName,
88
+ ...properties
89
+ });
90
+ }
91
+
92
+ /**
93
+ * Track a screen view (for mobile apps)
94
+ * @param {string} screenName - Screen name
95
+ * @param {object} properties - Screen properties
96
+ */
97
+ screen(screenName, properties = {}) {
98
+ return this.track('screen_view', {
99
+ screen_name: screenName,
100
+ ...properties
101
+ });
102
+ }
103
+
104
+ /**
105
+ * Set user properties
106
+ * @param {object} traits - User traits
107
+ */
108
+ setUserAttributes(traits) {
109
+ this.userTraits = { ...this.userTraits, ...traits };
110
+ return this.identify(this.userId, traits);
111
+ }
112
+
113
+ /**
114
+ * Set device information
115
+ * @param {object} deviceInfo - Device information
116
+ */
117
+ setDeviceInfo(deviceInfo) {
118
+ this.deviceInfo = { ...this.deviceInfo, ...deviceInfo };
119
+ }
120
+
121
+ /**
122
+ * Manually flush the event queue
123
+ */
124
+ async flush() {
125
+ if (this.eventQueue.length === 0) {
126
+ return;
127
+ }
128
+
129
+ const events = [...this.eventQueue];
130
+ this.eventQueue = [];
131
+
132
+ return this._sendBatch(events);
133
+ }
134
+
135
+ /**
136
+ * Reset user data (logout)
137
+ */
138
+ reset() {
139
+ this.userId = null;
140
+ this.userTraits = {};
141
+ this.anonymousId = this._generateUUID();
142
+ this._saveAnonymousId(this.anonymousId);
143
+ this._log('User data reset');
144
+ }
145
+
146
+ // ============ Private Methods ============
147
+
148
+ _createEvent(data) {
149
+ const event = {
150
+ event_id: this._generateUUID(),
151
+ type: data.type || 'track',
152
+ event: data.event,
153
+ service_name: this.config.serviceName,
154
+ user_id: this.userId || '',
155
+ anonymous_id: this.anonymousId,
156
+ loan_code: data.loanCode || '',
157
+ properties: data.properties || {},
158
+ traits: data.traits || this.userTraits,
159
+ device: data.device || this.deviceInfo,
160
+ campaign: data.campaign || {},
161
+ context: data.context || {},
162
+ event_time: new Date().toISOString(),
163
+ };
164
+
165
+ return event;
166
+ }
167
+
168
+ async _sendEvent(event) {
169
+ const url = `${this.config.baseUrl}/api/v1/events/track`;
170
+ const headers = this._getHeaders();
171
+
172
+ try {
173
+ const response = await this._makeRequest(url, {
174
+ method: 'POST',
175
+ headers,
176
+ body: JSON.stringify(event),
177
+ });
178
+
179
+ this._log('Event tracked successfully', event);
180
+ return response;
181
+ } catch (error) {
182
+ this._logError('Failed to track event', error);
183
+ throw error;
184
+ }
185
+ }
186
+
187
+ async _sendBatch(events) {
188
+ if (events.length === 0) return;
189
+
190
+ const url = `${this.config.baseUrl}/api/v1/events/batch`;
191
+ const headers = this._getHeaders();
192
+
193
+ try {
194
+ const response = await this._makeRequest(url, {
195
+ method: 'POST',
196
+ headers,
197
+ body: JSON.stringify({ events }),
198
+ });
199
+
200
+ this._log(`Batch of ${events.length} events tracked successfully`);
201
+ return response;
202
+ } catch (error) {
203
+ this._logError('Failed to track batch', error);
204
+ // Re-queue failed events
205
+ this.eventQueue.unshift(...events);
206
+ throw error;
207
+ }
208
+ }
209
+
210
+ _addToQueue(event) {
211
+ this.eventQueue.push(event);
212
+ this._log('Event added to queue', { queueSize: this.eventQueue.length });
213
+
214
+ if (this.eventQueue.length >= this.config.batchSize) {
215
+ this.flush();
216
+ }
217
+ }
218
+
219
+ _startBatchProcessor() {
220
+ this.batchInterval = setInterval(() => {
221
+ if (this.eventQueue.length > 0) {
222
+ this.flush();
223
+ }
224
+ }, this.config.batchInterval);
225
+
226
+ // Clean up on page unload (browser only)
227
+ if (typeof window !== 'undefined') {
228
+ window.addEventListener('beforeunload', () => {
229
+ this.flush();
230
+ });
231
+ }
232
+ }
233
+
234
+ _getHeaders() {
235
+ const timestamp = Math.floor(Date.now() / 1000);
236
+
237
+ return {
238
+ 'X-Api-Key': this.config.apiKey,
239
+ 'X-Source': this.config.source,
240
+ 'X-Timestamp': timestamp.toString(),
241
+ 'X-Signatures': '', // Implement signature logic if needed
242
+ 'isTest': this.config.isTest.toString(),
243
+ 'Content-Type': 'application/json',
244
+ };
245
+ }
246
+
247
+ async _makeRequest(url, options) {
248
+ // Support both browser fetch and Node.js
249
+ if (typeof fetch !== 'undefined') {
250
+ const response = await fetch(url, options);
251
+ if (!response.ok) {
252
+ throw new Error(`HTTP error! status: ${response.status}`);
253
+ }
254
+ return response.json();
255
+ } else {
256
+ // For Node.js environment
257
+ const https = require('https');
258
+ const urlObj = new URL(url);
259
+
260
+ return new Promise((resolve, reject) => {
261
+ const req = https.request({
262
+ hostname: urlObj.hostname,
263
+ path: urlObj.pathname + urlObj.search,
264
+ method: options.method,
265
+ headers: options.headers,
266
+ }, (res) => {
267
+ let data = '';
268
+ res.on('data', chunk => data += chunk);
269
+ res.on('end', () => {
270
+ if (res.statusCode >= 200 && res.statusCode < 300) {
271
+ resolve(JSON.parse(data));
272
+ } else {
273
+ reject(new Error(`HTTP error! status: ${res.statusCode}`));
274
+ }
275
+ });
276
+ });
277
+
278
+ req.on('error', reject);
279
+ if (options.body) {
280
+ req.write(options.body);
281
+ }
282
+ req.end();
283
+ });
284
+ }
285
+ }
286
+
287
+ _getDeviceInfo() {
288
+ if (typeof window === 'undefined') {
289
+ // Node.js environment
290
+ return {
291
+ platform: process.platform,
292
+ brand: 'Server',
293
+ model: 'Node.js',
294
+ app_version: '',
295
+ os_version: process.version,
296
+ };
297
+ }
298
+
299
+ // Browser environment
300
+ const ua = navigator.userAgent;
301
+ const platform = this._detectPlatform(ua);
302
+
303
+ return {
304
+ platform,
305
+ brand: this._detectBrand(ua),
306
+ model: this._detectModel(ua),
307
+ app_version: '',
308
+ os_version: this._detectOSVersion(ua),
309
+ };
310
+ }
311
+
312
+ _detectPlatform(ua) {
313
+ if (/iPhone|iPad|iPod/.test(ua)) return 'ios';
314
+ if (/Android/.test(ua)) return 'android';
315
+ if (/Windows/.test(ua)) return 'windows';
316
+ if (/Mac/.test(ua)) return 'macos';
317
+ if (/Linux/.test(ua)) return 'linux';
318
+ return 'web';
319
+ }
320
+
321
+ _detectBrand(ua) {
322
+ if (/iPhone|iPad|iPod/.test(ua)) return 'Apple';
323
+ if (/Samsung/.test(ua)) return 'Samsung';
324
+ if (/Huawei/.test(ua)) return 'Huawei';
325
+ if (/Xiaomi/.test(ua)) return 'Xiaomi';
326
+ if (/Oppo/.test(ua)) return 'Oppo';
327
+ return 'Unknown';
328
+ }
329
+
330
+ _detectModel(ua) {
331
+ const match = ua.match(/\(([^)]+)\)/);
332
+ return match ? match[1].split(';')[0].trim() : 'Unknown';
333
+ }
334
+
335
+ _detectOSVersion(ua) {
336
+ const match = ua.match(/(?:Android|iPhone OS|CPU OS|Mac OS X|Windows NT) ([\d._]+)/);
337
+ return match ? match[1].replace(/_/g, '.') : 'Unknown';
338
+ }
339
+
340
+ _getOrCreateAnonymousId() {
341
+ if (typeof localStorage !== 'undefined') {
342
+ let id = localStorage.getItem('cdp_anonymous_id');
343
+ if (!id) {
344
+ id = this._generateUUID();
345
+ this._saveAnonymousId(id);
346
+ }
347
+ return id;
348
+ }
349
+ return this._generateUUID();
350
+ }
351
+
352
+ _saveAnonymousId(id) {
353
+ if (typeof localStorage !== 'undefined') {
354
+ localStorage.setItem('cdp_anonymous_id', id);
355
+ }
356
+ }
357
+
358
+ _generateUUID() {
359
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
360
+ const r = Math.random() * 16 | 0;
361
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
362
+ return v.toString(16);
363
+ });
364
+ }
365
+
366
+ _log(...args) {
367
+ if (this.config.debug) {
368
+ console.log('[CDP Lite SDK]', ...args);
369
+ }
370
+ }
371
+
372
+ _logError(...args) {
373
+ if (this.config.debug) {
374
+ console.error('[CDP Lite SDK]', ...args);
375
+ }
376
+ }
377
+
378
+ // Cleanup
379
+ destroy() {
380
+ if (this.batchInterval) {
381
+ clearInterval(this.batchInterval);
382
+ }
383
+ this.flush();
384
+ }
385
+ }
386
+
387
+ // CommonJS export (for Node.js require)
388
+ if (typeof module !== 'undefined' && module.exports) {
389
+ module.exports = CdpLiteSdk;
390
+ module.exports.default = CdpLiteSdk;
391
+ module.exports.CdpLiteSdk = CdpLiteSdk;
392
+ }
393
+
394
+ // Browser global
395
+ if (typeof window !== 'undefined') {
396
+ window.CdpLiteSdk = CdpLiteSdk;
397
+ }
398
+
399
+ exports.CdpLiteSdk = CdpLiteSdk;
400
+ exports.default = CdpLiteSdk;
401
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/cdp-lite-sdk.js"],"sourcesContent":["class CdpLiteSdk {\n constructor(config) {\n this.config = {\n apiKey: config.apiKey,\n source: config.source || 'Web',\n serviceName: config.serviceName || 'DefaultService',\n baseUrl: config.baseUrl || 'https://stg-ingestlog.vietcredit.com.vn',\n isTest: config.isTest !== undefined ? config.isTest : false,\n debug: config.debug || false,\n batchSize: config.batchSize || 10,\n batchInterval: config.batchInterval || 5000, // 5 seconds\n autoTrackDevice: config.autoTrackDevice !== undefined ? config.autoTrackDevice : true,\n };\n\n this.eventQueue = [];\n this.userId = null;\n this.anonymousId = this._getOrCreateAnonymousId();\n this.userTraits = {};\n this.deviceInfo = this.config.autoTrackDevice ? this._getDeviceInfo() : {};\n\n // Start batch processor\n if (this.config.batchSize > 1) {\n this._startBatchProcessor();\n }\n\n this._log('CDP Lite SDK initialized', this.config);\n }\n\n // ============ Public Methods ============\n\n /**\n * Track an event\n * @param {string} eventName - Name of the event\n * @param {object} properties - Event properties\n * @param {object} options - Additional options (device, campaign, context, etc.)\n */\n track(eventName, properties = {}, options = {}) {\n const event = this._createEvent({\n type: 'track',\n event: eventName,\n properties,\n ...options\n });\n\n if (this.config.batchSize > 1) {\n this._addToQueue(event);\n } else {\n return this._sendEvent(event);\n }\n }\n\n /**\n * Identify a user\n * @param {string} userId - User ID\n * @param {object} traits - User traits/attributes\n */\n identify(userId, traits = {}) {\n this.userId = userId;\n this.userTraits = { ...this.userTraits, ...traits };\n\n const event = this._createEvent({\n type: 'identify',\n event: 'user_identified',\n traits,\n });\n\n this._log('User identified', { userId, traits });\n\n if (this.config.batchSize > 1) {\n this._addToQueue(event);\n } else {\n return this._sendEvent(event);\n }\n }\n\n /**\n * Track a page view\n * @param {string} pageName - Page name\n * @param {object} properties - Page properties\n */\n page(pageName, properties = {}) {\n return this.track('page_view', {\n page_name: pageName,\n ...properties\n });\n }\n\n /**\n * Track a screen view (for mobile apps)\n * @param {string} screenName - Screen name\n * @param {object} properties - Screen properties\n */\n screen(screenName, properties = {}) {\n return this.track('screen_view', {\n screen_name: screenName,\n ...properties\n });\n }\n\n /**\n * Set user properties\n * @param {object} traits - User traits\n */\n setUserAttributes(traits) {\n this.userTraits = { ...this.userTraits, ...traits };\n return this.identify(this.userId, traits);\n }\n\n /**\n * Set device information\n * @param {object} deviceInfo - Device information\n */\n setDeviceInfo(deviceInfo) {\n this.deviceInfo = { ...this.deviceInfo, ...deviceInfo };\n }\n\n /**\n * Manually flush the event queue\n */\n async flush() {\n if (this.eventQueue.length === 0) {\n return;\n }\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n return this._sendBatch(events);\n }\n\n /**\n * Reset user data (logout)\n */\n reset() {\n this.userId = null;\n this.userTraits = {};\n this.anonymousId = this._generateUUID();\n this._saveAnonymousId(this.anonymousId);\n this._log('User data reset');\n }\n\n // ============ Private Methods ============\n\n _createEvent(data) {\n const event = {\n event_id: this._generateUUID(),\n type: data.type || 'track',\n event: data.event,\n service_name: this.config.serviceName,\n user_id: this.userId || '',\n anonymous_id: this.anonymousId,\n loan_code: data.loanCode || '',\n properties: data.properties || {},\n traits: data.traits || this.userTraits,\n device: data.device || this.deviceInfo,\n campaign: data.campaign || {},\n context: data.context || {},\n event_time: new Date().toISOString(),\n };\n\n return event;\n }\n\n async _sendEvent(event) {\n const url = `${this.config.baseUrl}/api/v1/events/track`;\n const headers = this._getHeaders();\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(event),\n });\n\n this._log('Event tracked successfully', event);\n return response;\n } catch (error) {\n this._logError('Failed to track event', error);\n throw error;\n }\n }\n\n async _sendBatch(events) {\n if (events.length === 0) return;\n\n const url = `${this.config.baseUrl}/api/v1/events/batch`;\n const headers = this._getHeaders();\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ events }),\n });\n\n this._log(`Batch of ${events.length} events tracked successfully`);\n return response;\n } catch (error) {\n this._logError('Failed to track batch', error);\n // Re-queue failed events\n this.eventQueue.unshift(...events);\n throw error;\n }\n }\n\n _addToQueue(event) {\n this.eventQueue.push(event);\n this._log('Event added to queue', { queueSize: this.eventQueue.length });\n\n if (this.eventQueue.length >= this.config.batchSize) {\n this.flush();\n }\n }\n\n _startBatchProcessor() {\n this.batchInterval = setInterval(() => {\n if (this.eventQueue.length > 0) {\n this.flush();\n }\n }, this.config.batchInterval);\n\n // Clean up on page unload (browser only)\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush();\n });\n }\n }\n\n _getHeaders() {\n const timestamp = Math.floor(Date.now() / 1000);\n\n return {\n 'X-Api-Key': this.config.apiKey,\n 'X-Source': this.config.source,\n 'X-Timestamp': timestamp.toString(),\n 'X-Signatures': '', // Implement signature logic if needed\n 'isTest': this.config.isTest.toString(),\n 'Content-Type': 'application/json',\n };\n }\n\n async _makeRequest(url, options) {\n // Support both browser fetch and Node.js\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url, options);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n } else {\n // For Node.js environment\n const https = require('https');\n const urlObj = new URL(url);\n\n return new Promise((resolve, reject) => {\n const req = https.request({\n hostname: urlObj.hostname,\n path: urlObj.pathname + urlObj.search,\n method: options.method,\n headers: options.headers,\n }, (res) => {\n let data = '';\n res.on('data', chunk => data += chunk);\n res.on('end', () => {\n if (res.statusCode >= 200 && res.statusCode < 300) {\n resolve(JSON.parse(data));\n } else {\n reject(new Error(`HTTP error! status: ${res.statusCode}`));\n }\n });\n });\n\n req.on('error', reject);\n if (options.body) {\n req.write(options.body);\n }\n req.end();\n });\n }\n }\n\n _getDeviceInfo() {\n if (typeof window === 'undefined') {\n // Node.js environment\n return {\n platform: process.platform,\n brand: 'Server',\n model: 'Node.js',\n app_version: '',\n os_version: process.version,\n };\n }\n\n // Browser environment\n const ua = navigator.userAgent;\n const platform = this._detectPlatform(ua);\n\n return {\n platform,\n brand: this._detectBrand(ua),\n model: this._detectModel(ua),\n app_version: '',\n os_version: this._detectOSVersion(ua),\n };\n }\n\n _detectPlatform(ua) {\n if (/iPhone|iPad|iPod/.test(ua)) return 'ios';\n if (/Android/.test(ua)) return 'android';\n if (/Windows/.test(ua)) return 'windows';\n if (/Mac/.test(ua)) return 'macos';\n if (/Linux/.test(ua)) return 'linux';\n return 'web';\n }\n\n _detectBrand(ua) {\n if (/iPhone|iPad|iPod/.test(ua)) return 'Apple';\n if (/Samsung/.test(ua)) return 'Samsung';\n if (/Huawei/.test(ua)) return 'Huawei';\n if (/Xiaomi/.test(ua)) return 'Xiaomi';\n if (/Oppo/.test(ua)) return 'Oppo';\n return 'Unknown';\n }\n\n _detectModel(ua) {\n const match = ua.match(/\\(([^)]+)\\)/);\n return match ? match[1].split(';')[0].trim() : 'Unknown';\n }\n\n _detectOSVersion(ua) {\n const match = ua.match(/(?:Android|iPhone OS|CPU OS|Mac OS X|Windows NT) ([\\d._]+)/);\n return match ? match[1].replace(/_/g, '.') : 'Unknown';\n }\n\n _getOrCreateAnonymousId() {\n if (typeof localStorage !== 'undefined') {\n let id = localStorage.getItem('cdp_anonymous_id');\n if (!id) {\n id = this._generateUUID();\n this._saveAnonymousId(id);\n }\n return id;\n }\n return this._generateUUID();\n }\n\n _saveAnonymousId(id) {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('cdp_anonymous_id', id);\n }\n }\n\n _generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n _log(...args) {\n if (this.config.debug) {\n console.log('[CDP Lite SDK]', ...args);\n }\n }\n\n _logError(...args) {\n if (this.config.debug) {\n console.error('[CDP Lite SDK]', ...args);\n }\n }\n\n // Cleanup\n destroy() {\n if (this.batchInterval) {\n clearInterval(this.batchInterval);\n }\n this.flush();\n }\n}\n\n// FIXED: Proper exports for both CommonJS and ES modules\n// This ensures compatibility with both import styles\n\n// Named export for flexibility\nexport { CdpLiteSdk };\n\n// ES Module export (default)\nexport default CdpLiteSdk;\n\n// CommonJS export (for Node.js require)\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = CdpLiteSdk;\n module.exports.default = CdpLiteSdk;\n module.exports.CdpLiteSdk = CdpLiteSdk;\n}\n\n// Browser global\nif (typeof window !== 'undefined') {\n window.CdpLiteSdk = CdpLiteSdk;\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,3 @@
1
- // cdp-lite-sdk.test.js
2
- // VConnect Analytics SDK - Track events and users
3
-
4
1
  class CdpLiteSdk {
5
2
  constructor(config) {
6
3
  this.config = {
@@ -26,7 +23,7 @@ class CdpLiteSdk {
26
23
  this._startBatchProcessor();
27
24
  }
28
25
 
29
- this._log('VConnect Analytics initialized', this.config);
26
+ this._log('CDP Lite SDK initialized', this.config);
30
27
  }
31
28
 
32
29
  // ============ Public Methods ============
@@ -338,7 +335,7 @@ class CdpLiteSdk {
338
335
 
339
336
  _getOrCreateAnonymousId() {
340
337
  if (typeof localStorage !== 'undefined') {
341
- let id = localStorage.getItem('vconnect_anonymous_id');
338
+ let id = localStorage.getItem('cdp_anonymous_id');
342
339
  if (!id) {
343
340
  id = this._generateUUID();
344
341
  this._saveAnonymousId(id);
@@ -350,7 +347,7 @@ class CdpLiteSdk {
350
347
 
351
348
  _saveAnonymousId(id) {
352
349
  if (typeof localStorage !== 'undefined') {
353
- localStorage.setItem('vconnect_anonymous_id', id);
350
+ localStorage.setItem('cdp_anonymous_id', id);
354
351
  }
355
352
  }
356
353
 
@@ -364,13 +361,13 @@ class CdpLiteSdk {
364
361
 
365
362
  _log(...args) {
366
363
  if (this.config.debug) {
367
- console.log('[VConnect Analytics]', ...args);
364
+ console.log('[CDP Lite SDK]', ...args);
368
365
  }
369
366
  }
370
367
 
371
368
  _logError(...args) {
372
369
  if (this.config.debug) {
373
- console.error('[VConnect Analytics]', ...args);
370
+ console.error('[CDP Lite SDK]', ...args);
374
371
  }
375
372
  }
376
373
 
@@ -383,11 +380,17 @@ class CdpLiteSdk {
383
380
  }
384
381
  }
385
382
 
386
- // Export for different module systems
383
+ // CommonJS export (for Node.js require)
387
384
  if (typeof module !== 'undefined' && module.exports) {
388
385
  module.exports = CdpLiteSdk;
386
+ module.exports.default = CdpLiteSdk;
387
+ module.exports.CdpLiteSdk = CdpLiteSdk;
389
388
  }
390
389
 
390
+ // Browser global
391
391
  if (typeof window !== 'undefined') {
392
392
  window.CdpLiteSdk = CdpLiteSdk;
393
393
  }
394
+
395
+ export { CdpLiteSdk, CdpLiteSdk as default };
396
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/cdp-lite-sdk.js"],"sourcesContent":["class CdpLiteSdk {\n constructor(config) {\n this.config = {\n apiKey: config.apiKey,\n source: config.source || 'Web',\n serviceName: config.serviceName || 'DefaultService',\n baseUrl: config.baseUrl || 'https://stg-ingestlog.vietcredit.com.vn',\n isTest: config.isTest !== undefined ? config.isTest : false,\n debug: config.debug || false,\n batchSize: config.batchSize || 10,\n batchInterval: config.batchInterval || 5000, // 5 seconds\n autoTrackDevice: config.autoTrackDevice !== undefined ? config.autoTrackDevice : true,\n };\n\n this.eventQueue = [];\n this.userId = null;\n this.anonymousId = this._getOrCreateAnonymousId();\n this.userTraits = {};\n this.deviceInfo = this.config.autoTrackDevice ? this._getDeviceInfo() : {};\n\n // Start batch processor\n if (this.config.batchSize > 1) {\n this._startBatchProcessor();\n }\n\n this._log('CDP Lite SDK initialized', this.config);\n }\n\n // ============ Public Methods ============\n\n /**\n * Track an event\n * @param {string} eventName - Name of the event\n * @param {object} properties - Event properties\n * @param {object} options - Additional options (device, campaign, context, etc.)\n */\n track(eventName, properties = {}, options = {}) {\n const event = this._createEvent({\n type: 'track',\n event: eventName,\n properties,\n ...options\n });\n\n if (this.config.batchSize > 1) {\n this._addToQueue(event);\n } else {\n return this._sendEvent(event);\n }\n }\n\n /**\n * Identify a user\n * @param {string} userId - User ID\n * @param {object} traits - User traits/attributes\n */\n identify(userId, traits = {}) {\n this.userId = userId;\n this.userTraits = { ...this.userTraits, ...traits };\n\n const event = this._createEvent({\n type: 'identify',\n event: 'user_identified',\n traits,\n });\n\n this._log('User identified', { userId, traits });\n\n if (this.config.batchSize > 1) {\n this._addToQueue(event);\n } else {\n return this._sendEvent(event);\n }\n }\n\n /**\n * Track a page view\n * @param {string} pageName - Page name\n * @param {object} properties - Page properties\n */\n page(pageName, properties = {}) {\n return this.track('page_view', {\n page_name: pageName,\n ...properties\n });\n }\n\n /**\n * Track a screen view (for mobile apps)\n * @param {string} screenName - Screen name\n * @param {object} properties - Screen properties\n */\n screen(screenName, properties = {}) {\n return this.track('screen_view', {\n screen_name: screenName,\n ...properties\n });\n }\n\n /**\n * Set user properties\n * @param {object} traits - User traits\n */\n setUserAttributes(traits) {\n this.userTraits = { ...this.userTraits, ...traits };\n return this.identify(this.userId, traits);\n }\n\n /**\n * Set device information\n * @param {object} deviceInfo - Device information\n */\n setDeviceInfo(deviceInfo) {\n this.deviceInfo = { ...this.deviceInfo, ...deviceInfo };\n }\n\n /**\n * Manually flush the event queue\n */\n async flush() {\n if (this.eventQueue.length === 0) {\n return;\n }\n\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n return this._sendBatch(events);\n }\n\n /**\n * Reset user data (logout)\n */\n reset() {\n this.userId = null;\n this.userTraits = {};\n this.anonymousId = this._generateUUID();\n this._saveAnonymousId(this.anonymousId);\n this._log('User data reset');\n }\n\n // ============ Private Methods ============\n\n _createEvent(data) {\n const event = {\n event_id: this._generateUUID(),\n type: data.type || 'track',\n event: data.event,\n service_name: this.config.serviceName,\n user_id: this.userId || '',\n anonymous_id: this.anonymousId,\n loan_code: data.loanCode || '',\n properties: data.properties || {},\n traits: data.traits || this.userTraits,\n device: data.device || this.deviceInfo,\n campaign: data.campaign || {},\n context: data.context || {},\n event_time: new Date().toISOString(),\n };\n\n return event;\n }\n\n async _sendEvent(event) {\n const url = `${this.config.baseUrl}/api/v1/events/track`;\n const headers = this._getHeaders();\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(event),\n });\n\n this._log('Event tracked successfully', event);\n return response;\n } catch (error) {\n this._logError('Failed to track event', error);\n throw error;\n }\n }\n\n async _sendBatch(events) {\n if (events.length === 0) return;\n\n const url = `${this.config.baseUrl}/api/v1/events/batch`;\n const headers = this._getHeaders();\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ events }),\n });\n\n this._log(`Batch of ${events.length} events tracked successfully`);\n return response;\n } catch (error) {\n this._logError('Failed to track batch', error);\n // Re-queue failed events\n this.eventQueue.unshift(...events);\n throw error;\n }\n }\n\n _addToQueue(event) {\n this.eventQueue.push(event);\n this._log('Event added to queue', { queueSize: this.eventQueue.length });\n\n if (this.eventQueue.length >= this.config.batchSize) {\n this.flush();\n }\n }\n\n _startBatchProcessor() {\n this.batchInterval = setInterval(() => {\n if (this.eventQueue.length > 0) {\n this.flush();\n }\n }, this.config.batchInterval);\n\n // Clean up on page unload (browser only)\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush();\n });\n }\n }\n\n _getHeaders() {\n const timestamp = Math.floor(Date.now() / 1000);\n\n return {\n 'X-Api-Key': this.config.apiKey,\n 'X-Source': this.config.source,\n 'X-Timestamp': timestamp.toString(),\n 'X-Signatures': '', // Implement signature logic if needed\n 'isTest': this.config.isTest.toString(),\n 'Content-Type': 'application/json',\n };\n }\n\n async _makeRequest(url, options) {\n // Support both browser fetch and Node.js\n if (typeof fetch !== 'undefined') {\n const response = await fetch(url, options);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n } else {\n // For Node.js environment\n const https = require('https');\n const urlObj = new URL(url);\n\n return new Promise((resolve, reject) => {\n const req = https.request({\n hostname: urlObj.hostname,\n path: urlObj.pathname + urlObj.search,\n method: options.method,\n headers: options.headers,\n }, (res) => {\n let data = '';\n res.on('data', chunk => data += chunk);\n res.on('end', () => {\n if (res.statusCode >= 200 && res.statusCode < 300) {\n resolve(JSON.parse(data));\n } else {\n reject(new Error(`HTTP error! status: ${res.statusCode}`));\n }\n });\n });\n\n req.on('error', reject);\n if (options.body) {\n req.write(options.body);\n }\n req.end();\n });\n }\n }\n\n _getDeviceInfo() {\n if (typeof window === 'undefined') {\n // Node.js environment\n return {\n platform: process.platform,\n brand: 'Server',\n model: 'Node.js',\n app_version: '',\n os_version: process.version,\n };\n }\n\n // Browser environment\n const ua = navigator.userAgent;\n const platform = this._detectPlatform(ua);\n\n return {\n platform,\n brand: this._detectBrand(ua),\n model: this._detectModel(ua),\n app_version: '',\n os_version: this._detectOSVersion(ua),\n };\n }\n\n _detectPlatform(ua) {\n if (/iPhone|iPad|iPod/.test(ua)) return 'ios';\n if (/Android/.test(ua)) return 'android';\n if (/Windows/.test(ua)) return 'windows';\n if (/Mac/.test(ua)) return 'macos';\n if (/Linux/.test(ua)) return 'linux';\n return 'web';\n }\n\n _detectBrand(ua) {\n if (/iPhone|iPad|iPod/.test(ua)) return 'Apple';\n if (/Samsung/.test(ua)) return 'Samsung';\n if (/Huawei/.test(ua)) return 'Huawei';\n if (/Xiaomi/.test(ua)) return 'Xiaomi';\n if (/Oppo/.test(ua)) return 'Oppo';\n return 'Unknown';\n }\n\n _detectModel(ua) {\n const match = ua.match(/\\(([^)]+)\\)/);\n return match ? match[1].split(';')[0].trim() : 'Unknown';\n }\n\n _detectOSVersion(ua) {\n const match = ua.match(/(?:Android|iPhone OS|CPU OS|Mac OS X|Windows NT) ([\\d._]+)/);\n return match ? match[1].replace(/_/g, '.') : 'Unknown';\n }\n\n _getOrCreateAnonymousId() {\n if (typeof localStorage !== 'undefined') {\n let id = localStorage.getItem('cdp_anonymous_id');\n if (!id) {\n id = this._generateUUID();\n this._saveAnonymousId(id);\n }\n return id;\n }\n return this._generateUUID();\n }\n\n _saveAnonymousId(id) {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('cdp_anonymous_id', id);\n }\n }\n\n _generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n _log(...args) {\n if (this.config.debug) {\n console.log('[CDP Lite SDK]', ...args);\n }\n }\n\n _logError(...args) {\n if (this.config.debug) {\n console.error('[CDP Lite SDK]', ...args);\n }\n }\n\n // Cleanup\n destroy() {\n if (this.batchInterval) {\n clearInterval(this.batchInterval);\n }\n this.flush();\n }\n}\n\n// FIXED: Proper exports for both CommonJS and ES modules\n// This ensures compatibility with both import styles\n\n// Named export for flexibility\nexport { CdpLiteSdk };\n\n// ES Module export (default)\nexport default CdpLiteSdk;\n\n// CommonJS export (for Node.js require)\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = CdpLiteSdk;\n module.exports.default = CdpLiteSdk;\n module.exports.CdpLiteSdk = CdpLiteSdk;\n}\n\n// Browser global\nif (typeof window !== 'undefined') {\n window.CdpLiteSdk = CdpLiteSdk;\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,19 +1,52 @@
1
1
  {
2
2
  "name": "cdp-lite-sdk",
3
- "version": "0.1.0",
4
- "description": "Lightweight JS SDK to push events and manage attributes (demo)",
5
- "main": "src/cdp-lite-sdk.js",
6
- "type": "module",
7
- "author": "Vi Nguyen",
8
- "license": "MIT",
3
+ "version": "0.1.1",
4
+ "description": "CDP Lite SDK for tracking events and users - Customer Data Platform",
5
+ "main": "dist/index.cjs.js",
6
+ "module": "dist/index.esm.js",
7
+ "browser": "dist/cdp-lite-sdk.min.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.esm.js",
12
+ "require": "./dist/index.cjs.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
9
21
  "scripts": {
10
- "test": "echo \"Error: no test specified\" && exit 1"
22
+ "build": "rollup -c",
23
+ "test": "jest",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "keywords": [
27
+ "cdp",
28
+ "analytics",
29
+ "tracking",
30
+ "events",
31
+ "customer-data-platform",
32
+ "user-tracking",
33
+ "event-tracking",
34
+ "cdp-lite"
35
+ ],
36
+ "author": "Your Name",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://gitlab.ovp.vn/dlc/vc-cdp-sdk"
11
41
  },
12
- "keywords": [],
13
42
  "devDependencies": {
14
- "@rollup/plugin-commonjs": "^29.0.0",
15
- "@rollup/plugin-node-resolve": "^16.0.3",
43
+ "@rollup/plugin-commonjs": "^25.0.8",
44
+ "@rollup/plugin-node-resolve": "^15.3.1",
16
45
  "@rollup/plugin-terser": "^0.4.4",
46
+ "jest": "^29.0.0",
17
47
  "rollup": "^4.54.0"
48
+ },
49
+ "engines": {
50
+ "node": ">=14.0.0"
18
51
  }
19
52
  }