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