cdp-lite-sdk 0.1.9 → 0.2.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.
package/README.md CHANGED
@@ -12,6 +12,7 @@
12
12
  - [Quick Start](#quick-start)
13
13
  - [Configuration](#configuration)
14
14
  - [Security Features](#security-features)
15
+ - [ID Management](#id-management)
15
16
  - [User Tracking](#user-tracking)
16
17
  - [Core Methods](#core-methods)
17
18
  - [Advanced Usage](#advanced-usage)
@@ -221,6 +222,72 @@ const cdp = new CdpLiteSdk({
221
222
 
222
223
  **📖 See [SECURITY.md](https://gitlab.ovp.vn/dlc/vc-cdp-sdk/blob/master/sdk-js/SECURITY.md) for complete security documentation.**
223
224
 
225
+ ---
226
+
227
+ <h2 id="id-management">🆔 ID Management</h2>
228
+
229
+ CDP Lite SDK manages **5 types of IDs** for comprehensive user tracking:
230
+
231
+ ### ID Types
232
+
233
+ | ID | Description | Persistence | Usage |
234
+ |----|-------------|-------------|-------|
235
+ | **user_id** | User identifier | Persistent | Set on login |
236
+ | **profile_id** | CDP profile ID | Persistent | From API response |
237
+ | **anonymous_id** | Anonymous visitor | Persistent | Auto-generated |
238
+ | **device_id** | Device identifier | Persistent | Cross-session tracking |
239
+ | **session_id** | Session identifier | Per session | Single visit |
240
+
241
+ ### Profile ID Flow
242
+
243
+ ```javascript
244
+ // 1. User logs in
245
+ await cdp.identifyUser('user_123', {
246
+ email: 'user@example.com'
247
+ });
248
+
249
+ // 2. SDK calls /v1/profiles/track
250
+ // Response: { profile_id: 137455779753893888 }
251
+
252
+ // 3. Profile ID stored automatically
253
+ console.log(cdp.getProfileId()); // 137455779753893888
254
+
255
+ // 4. All events include profile_id
256
+ cdp.track('purchase', { amount: 100 });
257
+ // Event includes: profile_id, device_id, session_id
258
+ ```
259
+
260
+ ### Get All IDs
261
+
262
+ ```javascript
263
+ const ids = cdp.getUserIdentities();
264
+ console.log(ids);
265
+ // {
266
+ // user_id: 'user_123',
267
+ // profile_id: 137455779753893888,
268
+ // anonymous_id: '550e8400-...',
269
+ // device_id: '7a6f8b2e-...',
270
+ // session_id: 'abc12345-...'
271
+ // }
272
+ ```
273
+
274
+ ### ID Methods
275
+
276
+ ```javascript
277
+ // Get specific IDs
278
+ cdp.getUserId() // User ID
279
+ cdp.getProfileId() // Profile ID (from API)
280
+ cdp.getDeviceId() // Device ID (persistent)
281
+ cdp.getSessionId() // Session ID (per session)
282
+ cdp.anonymousId // Anonymous ID
283
+
284
+ // Get all identities
285
+ cdp.getUserIdentities() // All IDs in one object
286
+ ```
287
+
288
+ **📖 Complete Guide:** [IDS.md](IDS.md)
289
+
290
+
224
291
  ---
225
292
 
226
293
  <h2 id="user-tracking">👤 User Tracking</h2>
@@ -973,6 +1040,10 @@ MIT License - see LICENSE file for details
973
1040
  ---
974
1041
 
975
1042
  ## 🤝 Support
1043
+ - 📖 [Full Documentation](README.md)
1044
+ - 🆔 [ID Management Guide](IDS.md)
1045
+ - 👤 [User Tracking Guide](USER_TRACKING.md)
1046
+ - 🔒 [Security Guide](SECURITY.md)
976
1047
  - 📧 Email: vinv@vega.com.vn
977
1048
  ---
978
1049
 
@@ -38,7 +38,10 @@
38
38
 
39
39
  this.eventQueue = [];
40
40
  this.userId = null;
41
+ this.profileId = this._getStoredProfileId(); // Profile ID from /v1/profiles/track response
41
42
  this.anonymousId = this._getOrCreateAnonymousId();
43
+ this.deviceId = this._getOrCreateDeviceId(); // Persistent device ID
44
+ this.sessionId = this._getOrCreateSessionId(); // Session ID
42
45
  this.userTraits = {};
43
46
  this.userIdentities = {};
44
47
  this.deviceInfo = this.config.autoTrackDevice ? this._getDeviceInfo() : {};
@@ -53,6 +56,11 @@
53
56
  }
54
57
 
55
58
  this._log('CDP Lite SDK initialized', this.config);
59
+ this._log('CDP Lite SDK initialized', {
60
+ anonymousId: this.anonymousId,
61
+ deviceId: this.deviceId,
62
+ sessionId: this.sessionId
63
+ });
56
64
  }
57
65
 
58
66
  // ============ MoEngage-like User Methods ============
@@ -82,9 +90,21 @@
82
90
  this.userTraits = { ...this.userTraits, ...traits };
83
91
 
84
92
  // Track profile with type: login
85
- await this._trackProfile('login', this.userTraits);
93
+ const response = await this._trackProfile('login', this.userTraits);
94
+
95
+ // Store profile_id from response
96
+ if (response && response.profile_id) {
97
+ this.profileId = response.profile_id;
98
+ this._saveProfileId(response.profile_id);
99
+ this._log('Profile ID received:', response.profile_id);
100
+ }
86
101
 
87
102
  this._log('User identified', { userId: this.userId, traits });
103
+ this._log('User identified', {
104
+ userId: this.userId,
105
+ profileId: this.profileId,
106
+ transactionId: response?.transaction_id
107
+ });
88
108
  return this;
89
109
  }
90
110
 
@@ -94,7 +114,10 @@
94
114
  getUserIdentities() {
95
115
  return {
96
116
  user_id: this.userId,
117
+ profile_id: this.profileId,
97
118
  anonymous_id: this.anonymousId,
119
+ device_id: this.deviceId,
120
+ session_id: this.sessionId,
98
121
  ...this.userIdentities
99
122
  };
100
123
  }
@@ -106,6 +129,27 @@
106
129
  return this.userTraits[attributeName] || null;
107
130
  }
108
131
 
132
+ /**
133
+ * Get profile ID
134
+ */
135
+ getProfileId() {
136
+ return this.profileId;
137
+ }
138
+
139
+ /**
140
+ * Get device ID
141
+ */
142
+ getDeviceId() {
143
+ return this.deviceId;
144
+ }
145
+
146
+ /**
147
+ * Get session ID
148
+ */
149
+ getSessionId() {
150
+ return this.sessionId;
151
+ }
152
+
109
153
  /**
110
154
  * Add first name
111
155
  */
@@ -257,6 +301,7 @@
257
301
 
258
302
  // Clear user data
259
303
  this.userId = null;
304
+ this.profileId = null;
260
305
  this.userTraits = {};
261
306
  this.userIdentities = {};
262
307
  this.campaign = {};
@@ -265,6 +310,12 @@
265
310
  this.anonymousId = this._generateUUID();
266
311
  this._saveAnonymousId(this.anonymousId);
267
312
 
313
+ this.sessionId = this._generateUUID();
314
+ this._saveSessionId(this.sessionId);
315
+
316
+ // Clear stored profile ID
317
+ this._clearProfileId();
318
+
268
319
  this._log('Session destroyed (logged out)');
269
320
  return this;
270
321
  }
@@ -280,10 +331,16 @@
280
331
  type: type, // login, update, logout
281
332
  party_type: 'PERSON',
282
333
  traits: traits,
334
+ // profile_id: this.profileId,
283
335
  platforms: this.platforms || this._convertDeviceInfoToPlatforms(),
284
336
  campaign: this.campaign,
285
- metadata: this.metadata
337
+ metadata: this.metadata,
338
+ device_id: this.deviceId, // Add device_id
339
+ session_id: this.sessionId, // Add session_id
286
340
  };
341
+ if (this.profileId) {
342
+ payload.profile_id = this.profileId;
343
+ }
287
344
 
288
345
  const headers = await this._getHeaders(payload);
289
346
 
@@ -294,7 +351,12 @@
294
351
  body: JSON.stringify(payload)
295
352
  });
296
353
 
297
- this._log('Profile tracked', { type, userId: this.userId });
354
+ this._log('Profile tracked', {
355
+ type,
356
+ userId: this.userId,
357
+ profileId: response?.profile_id,
358
+ transactionId: response?.transaction_id
359
+ });
298
360
  return response;
299
361
  } catch (error) {
300
362
  this._logError('Failed to track profile', error);
@@ -470,7 +532,10 @@
470
532
  event_name: data.event,
471
533
  service_name: this.config.serviceName,
472
534
  user_id: this.userId || '',
535
+ profile_id: this.profileId || null, // Add profile_id
473
536
  anonymous_id: this.anonymousId,
537
+ device_id: this.deviceId, // Add device_id
538
+ session_id: this.sessionId, // Add session_id
474
539
  loan_code: data.loanCode || '',
475
540
  properties: data.properties || {
476
541
  "hasFake": true
@@ -592,7 +657,11 @@
592
657
  res.on('data', chunk => data += chunk);
593
658
  res.on('end', () => {
594
659
  if (res.statusCode >= 200 && res.statusCode < 300) {
595
- resolve(JSON.parse(data));
660
+ try {
661
+ resolve(JSON.parse(data));
662
+ } catch (e) {
663
+ resolve(data);
664
+ }
596
665
  } else {
597
666
  reject(new Error(`HTTP error! status: ${res.statusCode}`));
598
667
  }
@@ -677,6 +746,63 @@
677
746
  }
678
747
  }
679
748
 
749
+ _getOrCreateDeviceId() {
750
+ if (typeof localStorage !== 'undefined') {
751
+ let id = localStorage.getItem('cdp_device_id');
752
+ if (!id) {
753
+ id = this._generateUUID();
754
+ this._saveDeviceId(id);
755
+ }
756
+ return id;
757
+ }
758
+ return this._generateUUID();
759
+ }
760
+
761
+ _saveDeviceId(id) {
762
+ if (typeof localStorage !== 'undefined') {
763
+ localStorage.setItem('cdp_device_id', id);
764
+ }
765
+ }
766
+
767
+ _getOrCreateSessionId() {
768
+ if (typeof sessionStorage !== 'undefined') {
769
+ let id = sessionStorage.getItem('cdp_session_id');
770
+ if (!id) {
771
+ id = this._generateUUID();
772
+ this._saveSessionId(id);
773
+ }
774
+ return id;
775
+ }
776
+ return this._generateUUID();
777
+ }
778
+
779
+ _saveSessionId(id) {
780
+ if (typeof sessionStorage !== 'undefined') {
781
+ sessionStorage.setItem('cdp_session_id', id);
782
+ }
783
+ }
784
+
785
+ _getStoredProfileId() {
786
+ if (typeof localStorage !== 'undefined') {
787
+ return localStorage.getItem('cdp_profile_id');
788
+ }
789
+ return null;
790
+ }
791
+
792
+ _saveProfileId(id) {
793
+ this.profileId = id;
794
+ if (typeof localStorage !== 'undefined') {
795
+ localStorage.setItem('cdp_profile_id', id.toString());
796
+ }
797
+ }
798
+
799
+ _clearProfileId() {
800
+ this.profileId = null;
801
+ if (typeof localStorage !== 'undefined') {
802
+ localStorage.removeItem('cdp_profile_id');
803
+ }
804
+ }
805
+
680
806
  _generateUUID() {
681
807
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
682
808
  const r = Math.random() * 16 | 0;
@@ -1 +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 secretKey: config.secretKey,\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 enableEncryption: config.enableEncryption !== undefined ? config.enableEncryption : true,\n };\n console.log(config);\n\n if (!this.config.secretKey && this.config.enableEncryption) {\n this._logError('Warning: secretKey is required for encryption and signatures');\n }\n\n this.eventQueue = [];\n this.userId = null;\n this.anonymousId = this._getOrCreateAnonymousId();\n this.userTraits = {};\n this.userIdentities = {};\n this.deviceInfo = this.config.autoTrackDevice ? this._getDeviceInfo() : {};\n this.platforms = {};\n this.campaign = {};\n this.metadata = { schema_version: '1.0' };\n this.crypto = this._initCrypto();\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 // ============ MoEngage-like User Methods ============\n\n /**\n * Identify user (Login)\n * @param {string|object} userIdOrIdentities - User ID or identity object\n * @param {object} traits - User traits (optional)\n */\n async identifyUser(userIdOrIdentities, traits = {}) {\n if (typeof userIdOrIdentities === 'string') {\n // Simple user ID\n this.userId = userIdOrIdentities;\n } else if (typeof userIdOrIdentities === 'object') {\n // Identity object like { u_em: 'email@example.com' }\n this.userIdentities = { ...this.userIdentities, ...userIdOrIdentities };\n\n // Extract user ID from identities\n if (userIdOrIdentities.user_id) {\n this.userId = userIdOrIdentities.user_id;\n } else if (userIdOrIdentities.u_em) {\n this.userId = userIdOrIdentities.u_em; // Use email as ID if no user_id\n }\n }\n\n // Merge traits\n this.userTraits = { ...this.userTraits, ...traits };\n\n // Track profile with type: login\n await this._trackProfile('login', this.userTraits);\n\n this._log('User identified', { userId: this.userId, traits });\n return this;\n }\n\n /**\n * Get user identities\n */\n getUserIdentities() {\n return {\n user_id: this.userId,\n anonymous_id: this.anonymousId,\n ...this.userIdentities\n };\n }\n\n /**\n * Get specific user attribute\n */\n getUserAttribute(attributeName) {\n return this.userTraits[attributeName] || null;\n }\n\n /**\n * Add first name\n */\n add_first_name(firstName) {\n this.userTraits.first_name = firstName;\n this._trackProfile('update', { first_name: firstName });\n return this;\n }\n\n /**\n * Add last name\n */\n add_last_name(lastName) {\n this.userTraits.last_name = lastName;\n this._trackProfile('update', { last_name: lastName });\n return this;\n }\n\n /**\n * Add email\n */\n add_email(email) {\n this.userTraits.email = email;\n this.userIdentities.u_em = email;\n this._trackProfile('update', { email });\n return this;\n }\n\n /**\n * Add mobile/phone\n */\n add_mobile(phone) {\n this.userTraits.phone = phone;\n this._trackProfile('update', { phone });\n return this;\n }\n\n /**\n * Add user name (full name)\n */\n add_user_name(fullName) {\n this.userTraits.full_name = fullName;\n this._trackProfile('update', { full_name: fullName });\n return this;\n }\n\n /**\n * Add gender\n */\n add_gender(gender) {\n this.userTraits.gender = gender;\n this._trackProfile('update', { gender });\n return this;\n }\n\n /**\n * Add birthday\n */\n add_birthday(birthday) {\n // Convert Date to YYYY-MM-DD format\n let dobString;\n if (birthday instanceof Date) {\n dobString = birthday.toISOString().split('T')[0];\n } else {\n dobString = birthday;\n }\n\n this.userTraits.dob = dobString;\n this._trackProfile('update', { dob: dobString });\n return this;\n }\n\n /**\n * Add ID card\n */\n add_idcard(idcard) {\n this.userTraits.idcard = idcard;\n this._trackProfile('update', { idcard });\n return this;\n }\n\n /**\n * Add old ID card\n */\n add_old_idcard(oldIdcard) {\n this.userTraits.old_idcard = oldIdcard;\n this._trackProfile('update', { old_idcard: oldIdcard });\n return this;\n }\n\n /**\n * Add address\n */\n add_address(address) {\n this.userTraits.address = address;\n this._trackProfile('update', { address });\n return this;\n }\n\n /**\n * Add religion\n */\n add_religion(religion) {\n this.userTraits.religion = religion;\n this._trackProfile('update', { religion });\n return this;\n }\n\n /**\n * Add custom user attribute\n */\n add_user_attribute(attributeName, value) {\n this.userTraits[attributeName] = value;\n this._trackProfile('update', { [attributeName]: value });\n return this;\n }\n\n /**\n * Add multiple user attributes\n */\n add_user_attributes(attributes) {\n this.userTraits = { ...this.userTraits, ...attributes };\n this._trackProfile('update', attributes);\n return this;\n }\n\n /**\n * Set platform info\n */\n setPlatform(platformInfo) {\n this.platforms = { ...this.platforms, ...platformInfo };\n return this;\n }\n\n /**\n * Set campaign info\n */\n setCampaign(campaignInfo) {\n this.campaign = { ...this.campaign, ...campaignInfo };\n return this;\n }\n\n /**\n * Destroy session (Logout)\n */\n async destroy_session() {\n // Track logout\n await this._trackProfile('logout', {});\n\n // Clear user data\n this.userId = null;\n this.userTraits = {};\n this.userIdentities = {};\n this.campaign = {};\n\n // Generate new anonymous ID\n this.anonymousId = this._generateUUID();\n this._saveAnonymousId(this.anonymousId);\n\n this._log('Session destroyed (logged out)');\n return this;\n }\n\n /**\n * Track user profile to /v1/profiles/track endpoint\n */\n async _trackProfile(type, traits) {\n const url = `${this.config.baseUrl}/v1/profiles/track`;\n\n const payload = {\n user_id: this.userId || this.anonymousId,\n type: type, // login, update, logout\n party_type: 'PERSON',\n traits: traits,\n platforms: this.platforms || this._convertDeviceInfoToPlatforms(),\n campaign: this.campaign,\n metadata: this.metadata\n };\n\n const headers = await this._getHeaders(payload);\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload)\n });\n\n this._log('Profile tracked', { type, userId: this.userId });\n return response;\n } catch (error) {\n this._logError('Failed to track profile', error);\n throw error;\n }\n }\n\n /**\n * Convert device info to platforms format\n */\n _convertDeviceInfoToPlatforms() {\n if (!this.deviceInfo || Object.keys(this.deviceInfo).length === 0) {\n return {};\n }\n\n return {\n device_type: this._detectDeviceType(),\n brand: this.deviceInfo.brand || 'Unknown',\n model: this.deviceInfo.model || 'Unknown',\n app_version: this.deviceInfo.app_version || '',\n os_name: this.deviceInfo.platform || 'Unknown',\n os_version: this.deviceInfo.os_version || 'Unknown'\n };\n }\n\n _detectDeviceType() {\n if (typeof window === 'undefined') return 'server';\n\n const ua = navigator.userAgent;\n if (/Mobile|Android|iPhone|iPad|iPod/.test(ua)) return 'mobile';\n if (/Tablet|iPad/.test(ua)) return 'tablet';\n return 'desktop';\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 async identify(userId, traits = {}) {\n return this.identifyUser(userId, traits);\n // this.userId = userId;\n // this.userTraits = { ...this.userTraits, ...traits };\n //\n // // Encrypt sensitive traits\n // const encryptedTraits = await this._encryptTraits(traits);\n //\n // const event = this._createEvent({\n // type: 'identify',\n // event: 'user_identified',\n // traits: encryptedTraits,\n // _rawTraits: traits // Store raw for internal use, won't be sent\n // });\n //\n // // Remove raw traits before sending\n // delete event._rawTraits;\n //\n // this._log('User identified', { userId, traitsEncrypted: !!encryptedTraits });\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 return this.add_user_attributes(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 return this.destroy_session();\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 // Cleanup\n async destroy() {\n if (this.batchInterval) {\n clearInterval(this.batchInterval);\n }\n await this.flush();\n }\n\n // ============ Private Methods ============\n\n _createEvent(data) {\n return {\n event_id: this._generateUUID(),\n trace_id: this._generateUUID(),\n type: data.type || 'track',\n event_name: 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 \"hasFake\": true\n },\n traits: data.traits || '',\n device: data.device || this.deviceInfo,\n campaign: data.campaign || {},\n context: data.context || {},\n event_time: new Date().toISOString(),\n };\n }\n\n async _sendEvent(event) {\n const url = `${this.config.baseUrl}/v1/events/track`;\n const headers = await this._getHeaders(event);\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.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}/v1/events/batch`;\n const payload = { events };\n const headers = await this._getHeaders(payload);\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\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 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 if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush();\n });\n }\n }\n\n async _getHeaders(payload) {\n const timestamp = Math.floor(Date.now() / 1000);\n const payloadString = typeof payload === 'string' ? payload : JSON.stringify(payload);\n\n // Generate signature if secret key is provided\n const signature = await this._generateSignature(\n this.config.source,\n timestamp.toString(),\n payloadString\n );\n\n return {\n 'X-Api-Key': this.config.apiKey,\n 'X-Source': this.config.source,\n 'X-Timestamp': timestamp.toString(),\n 'X-Signatures': signature,\n 'X-Trace-Id': this._generateUUID(),\n 'isTest': this.config.isTest.toString(),\n 'Content-Type': 'application/json',\n };\n }\n\n async _makeRequest(url, options) {\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 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 return {\n platform: process.platform,\n brand: 'Server',\n model: 'Node.js',\n app_version: '',\n os_version: process.version,\n };\n }\n\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 // ============ Security Methods ============\n\n /**\n * Initialize crypto library\n */\n _initCrypto() {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.subtle) {\n return window.crypto;\n }\n if (typeof require !== 'undefined') {\n try {\n return require('crypto');\n } catch (e) {\n this._logError('Crypto module not available');\n return null;\n }\n }\n return null;\n }\n\n /**\n * Encrypt traits using AES\n * AES Key = SHA256(SecretKey + X-Timestamp)\n */\n async _encryptTraits(traits) {\n if (!this.config.enableEncryption || !this.config.secretKey) {\n return typeof traits === 'string' ? traits : JSON.stringify(traits);\n }\n\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const sensitiveTraits = this._extractSensitiveTraits(traits);\n\n if (Object.keys(sensitiveTraits).length === 0) {\n return '';\n }\n\n const traitsString = JSON.stringify(sensitiveTraits);\n\n // Browser environment\n if (typeof window !== 'undefined' && this.crypto && this.crypto.subtle) {\n return await this._encryptAESBrowser(traitsString, timestamp);\n }\n\n // Node.js environment\n if (typeof require !== 'undefined') {\n return this._encryptAESNode(traitsString, timestamp);\n }\n\n this._logError('Encryption not supported in this environment');\n return '';\n } catch (error) {\n this._logError('Failed to encrypt traits:', error);\n return '';\n }\n }\n\n /**\n * Extract only sensitive traits that need encryption\n */\n _extractSensitiveTraits(traits) {\n const sensitiveFields = [\n 'full_name', 'first_name', 'last_name',\n 'idcard', 'old_idcard', 'phone', 'email',\n 'gender', 'dob', 'address', 'religion'\n ];\n\n const sensitive = {};\n for (const field of sensitiveFields) {\n if (traits[field] !== undefined && traits[field] !== null && traits[field] !== '') {\n sensitive[field] = traits[field];\n }\n }\n return sensitive;\n }\n\n /**\n * AES encryption for browser using Web Crypto API\n */\n async _encryptAESBrowser(text, timestamp) {\n try {\n // Generate key: SHA256(SecretKey + Timestamp)\n const keyMaterial = this.config.secretKey + timestamp;\n const keyBuffer = new TextEncoder().encode(keyMaterial);\n\n const hashBuffer = await this.crypto.subtle.digest('SHA-256', keyBuffer);\n\n const key = await this.crypto.subtle.importKey(\n 'raw',\n hashBuffer,\n { name: 'AES-CBC', length: 256 },\n false,\n ['encrypt']\n );\n\n // Generate random IV\n const iv = this.crypto.getRandomValues(new Uint8Array(16));\n\n // Encrypt\n const encryptedBuffer = await this.crypto.subtle.encrypt(\n { name: 'AES-CBC', iv },\n key,\n new TextEncoder().encode(text)\n );\n\n // Combine IV + encrypted data\n const combined = new Uint8Array(iv.length + encryptedBuffer.byteLength);\n combined.set(iv, 0);\n combined.set(new Uint8Array(encryptedBuffer), iv.length);\n\n // Return Base64\n return this._arrayBufferToBase64(combined);\n } catch (error) {\n this._logError('Browser encryption failed:', error);\n return '';\n }\n }\n\n /**\n * AES encryption for Node.js\n */\n _encryptAESNode(text, timestamp) {\n try {\n const crypto = require('crypto');\n\n // Generate key: SHA256(SecretKey + Timestamp)\n const keyMaterial = this.config.secretKey + timestamp;\n const key = crypto.createHash('sha256').update(keyMaterial).digest();\n\n // Generate random IV\n const iv = crypto.randomBytes(16);\n\n // Encrypt\n const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);\n let encrypted = cipher.update(text, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n // Combine IV + encrypted data\n const combined = Buffer.concat([iv, Buffer.from(encrypted, 'hex')]);\n\n // Return Base64\n return combined.toString('base64');\n } catch (error) {\n this._logError('Node.js encryption failed:', error);\n return '';\n }\n }\n\n /**\n * Generate HMAC signature\n * X-Signatures = Base64(HMAC-SHA256(X-Source + \"|\" + X-Timestamp + \"|\" + Payload))\n */\n async _generateSignature(source, timestamp, payload) {\n if (!this.config.secretKey) {\n return '';\n }\n\n try {\n const message = `${source}|${timestamp}|${payload}`;\n\n // Browser environment\n if (typeof window !== 'undefined' && this.crypto && this.crypto.subtle) {\n return await this._hmacBrowser(message);\n }\n\n // Node.js environment\n if (typeof require !== 'undefined') {\n return this._hmacNode(message);\n }\n\n return '';\n } catch (error) {\n this._logError('Failed to generate signature:', error);\n return '';\n }\n }\n\n /**\n * HMAC for browser\n */\n async _hmacBrowser(message) {\n try {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(this.config.secretKey);\n\n const key = await this.crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await this.crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(message)\n );\n\n return this._arrayBufferToBase64(signature);\n } catch (error) {\n this._logError('Browser HMAC failed:', error);\n return '';\n }\n }\n\n /**\n * HMAC for Node.js\n */\n _hmacNode(message) {\n try {\n const crypto = require('crypto');\n const hmac = crypto.createHmac('sha256', this.config.secretKey);\n hmac.update(message);\n return hmac.digest('base64');\n } catch (error) {\n this._logError('Node.js HMAC failed:', error);\n return '';\n }\n }\n\n /**\n * Convert ArrayBuffer to Base64\n */\n _arrayBufferToBase64(buffer) {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\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\n// export { CdpLiteSdk };\n\n// ES Module export (default)\n// export 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":["require"],"mappings":"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"}
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 secretKey: config.secretKey,\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 enableEncryption: config.enableEncryption !== undefined ? config.enableEncryption : true,\n };\n console.log(config);\n\n if (!this.config.secretKey && this.config.enableEncryption) {\n this._logError('Warning: secretKey is required for encryption and signatures');\n }\n\n this.eventQueue = [];\n this.userId = null;\n this.profileId = this._getStoredProfileId(); // Profile ID from /v1/profiles/track response\n this.anonymousId = this._getOrCreateAnonymousId();\n this.deviceId = this._getOrCreateDeviceId(); // Persistent device ID\n this.sessionId = this._getOrCreateSessionId(); // Session ID\n this.userTraits = {};\n this.userIdentities = {};\n this.deviceInfo = this.config.autoTrackDevice ? this._getDeviceInfo() : {};\n this.platforms = {};\n this.campaign = {};\n this.metadata = { schema_version: '1.0' };\n this.crypto = this._initCrypto();\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 this._log('CDP Lite SDK initialized', {\n anonymousId: this.anonymousId,\n deviceId: this.deviceId,\n sessionId: this.sessionId\n });\n }\n\n // ============ MoEngage-like User Methods ============\n\n /**\n * Identify user (Login)\n * @param {string|object} userIdOrIdentities - User ID or identity object\n * @param {object} traits - User traits (optional)\n */\n async identifyUser(userIdOrIdentities, traits = {}) {\n if (typeof userIdOrIdentities === 'string') {\n // Simple user ID\n this.userId = userIdOrIdentities;\n } else if (typeof userIdOrIdentities === 'object') {\n // Identity object like { u_em: 'email@example.com' }\n this.userIdentities = { ...this.userIdentities, ...userIdOrIdentities };\n\n // Extract user ID from identities\n if (userIdOrIdentities.user_id) {\n this.userId = userIdOrIdentities.user_id;\n } else if (userIdOrIdentities.u_em) {\n this.userId = userIdOrIdentities.u_em; // Use email as ID if no user_id\n }\n }\n\n // Merge traits\n this.userTraits = { ...this.userTraits, ...traits };\n\n // Track profile with type: login\n const response = await this._trackProfile('login', this.userTraits);\n\n // Store profile_id from response\n if (response && response.profile_id) {\n this.profileId = response.profile_id;\n this._saveProfileId(response.profile_id);\n this._log('Profile ID received:', response.profile_id);\n }\n\n this._log('User identified', { userId: this.userId, traits });\n this._log('User identified', {\n userId: this.userId,\n profileId: this.profileId,\n transactionId: response?.transaction_id\n });\n return this;\n }\n\n /**\n * Get user identities\n */\n getUserIdentities() {\n return {\n user_id: this.userId,\n profile_id: this.profileId,\n anonymous_id: this.anonymousId,\n device_id: this.deviceId,\n session_id: this.sessionId,\n ...this.userIdentities\n };\n }\n\n /**\n * Get specific user attribute\n */\n getUserAttribute(attributeName) {\n return this.userTraits[attributeName] || null;\n }\n\n /**\n * Get profile ID\n */\n getProfileId() {\n return this.profileId;\n }\n\n /**\n * Get device ID\n */\n getDeviceId() {\n return this.deviceId;\n }\n\n /**\n * Get session ID\n */\n getSessionId() {\n return this.sessionId;\n }\n\n /**\n * Add first name\n */\n add_first_name(firstName) {\n this.userTraits.first_name = firstName;\n this._trackProfile('update', { first_name: firstName });\n return this;\n }\n\n /**\n * Add last name\n */\n add_last_name(lastName) {\n this.userTraits.last_name = lastName;\n this._trackProfile('update', { last_name: lastName });\n return this;\n }\n\n /**\n * Add email\n */\n add_email(email) {\n this.userTraits.email = email;\n this.userIdentities.u_em = email;\n this._trackProfile('update', { email });\n return this;\n }\n\n /**\n * Add mobile/phone\n */\n add_mobile(phone) {\n this.userTraits.phone = phone;\n this._trackProfile('update', { phone });\n return this;\n }\n\n /**\n * Add user name (full name)\n */\n add_user_name(fullName) {\n this.userTraits.full_name = fullName;\n this._trackProfile('update', { full_name: fullName });\n return this;\n }\n\n /**\n * Add gender\n */\n add_gender(gender) {\n this.userTraits.gender = gender;\n this._trackProfile('update', { gender });\n return this;\n }\n\n /**\n * Add birthday\n */\n add_birthday(birthday) {\n // Convert Date to YYYY-MM-DD format\n let dobString;\n if (birthday instanceof Date) {\n dobString = birthday.toISOString().split('T')[0];\n } else {\n dobString = birthday;\n }\n\n this.userTraits.dob = dobString;\n this._trackProfile('update', { dob: dobString });\n return this;\n }\n\n /**\n * Add ID card\n */\n add_idcard(idcard) {\n this.userTraits.idcard = idcard;\n this._trackProfile('update', { idcard });\n return this;\n }\n\n /**\n * Add old ID card\n */\n add_old_idcard(oldIdcard) {\n this.userTraits.old_idcard = oldIdcard;\n this._trackProfile('update', { old_idcard: oldIdcard });\n return this;\n }\n\n /**\n * Add address\n */\n add_address(address) {\n this.userTraits.address = address;\n this._trackProfile('update', { address });\n return this;\n }\n\n /**\n * Add religion\n */\n add_religion(religion) {\n this.userTraits.religion = religion;\n this._trackProfile('update', { religion });\n return this;\n }\n\n /**\n * Add custom user attribute\n */\n add_user_attribute(attributeName, value) {\n this.userTraits[attributeName] = value;\n this._trackProfile('update', { [attributeName]: value });\n return this;\n }\n\n /**\n * Add multiple user attributes\n */\n add_user_attributes(attributes) {\n this.userTraits = { ...this.userTraits, ...attributes };\n this._trackProfile('update', attributes);\n return this;\n }\n\n /**\n * Set platform info\n */\n setPlatform(platformInfo) {\n this.platforms = { ...this.platforms, ...platformInfo };\n return this;\n }\n\n /**\n * Set campaign info\n */\n setCampaign(campaignInfo) {\n this.campaign = { ...this.campaign, ...campaignInfo };\n return this;\n }\n\n /**\n * Destroy session (Logout)\n */\n async destroy_session() {\n // Track logout\n await this._trackProfile('logout', {});\n\n // Clear user data\n this.userId = null;\n this.profileId = null;\n this.userTraits = {};\n this.userIdentities = {};\n this.campaign = {};\n\n // Generate new anonymous ID\n this.anonymousId = this._generateUUID();\n this._saveAnonymousId(this.anonymousId);\n\n this.sessionId = this._generateUUID();\n this._saveSessionId(this.sessionId);\n\n // Clear stored profile ID\n this._clearProfileId();\n\n this._log('Session destroyed (logged out)');\n return this;\n }\n\n /**\n * Track user profile to /v1/profiles/track endpoint\n */\n async _trackProfile(type, traits) {\n const url = `${this.config.baseUrl}/v1/profiles/track`;\n\n const payload = {\n user_id: this.userId || this.anonymousId,\n type: type, // login, update, logout\n party_type: 'PERSON',\n traits: traits,\n // profile_id: this.profileId,\n platforms: this.platforms || this._convertDeviceInfoToPlatforms(),\n campaign: this.campaign,\n metadata: this.metadata,\n device_id: this.deviceId, // Add device_id\n session_id: this.sessionId, // Add session_id\n };\n if (this.profileId) {\n payload.profile_id = this.profileId;\n }\n\n const headers = await this._getHeaders(payload);\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload)\n });\n\n this._log('Profile tracked', {\n type,\n userId: this.userId,\n profileId: response?.profile_id,\n transactionId: response?.transaction_id\n });\n return response;\n } catch (error) {\n this._logError('Failed to track profile', error);\n throw error;\n }\n }\n\n /**\n * Convert device info to platforms format\n */\n _convertDeviceInfoToPlatforms() {\n if (!this.deviceInfo || Object.keys(this.deviceInfo).length === 0) {\n return {};\n }\n\n return {\n device_type: this._detectDeviceType(),\n brand: this.deviceInfo.brand || 'Unknown',\n model: this.deviceInfo.model || 'Unknown',\n app_version: this.deviceInfo.app_version || '',\n os_name: this.deviceInfo.platform || 'Unknown',\n os_version: this.deviceInfo.os_version || 'Unknown'\n };\n }\n\n _detectDeviceType() {\n if (typeof window === 'undefined') return 'server';\n\n const ua = navigator.userAgent;\n if (/Mobile|Android|iPhone|iPad|iPod/.test(ua)) return 'mobile';\n if (/Tablet|iPad/.test(ua)) return 'tablet';\n return 'desktop';\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 async identify(userId, traits = {}) {\n return this.identifyUser(userId, traits);\n // this.userId = userId;\n // this.userTraits = { ...this.userTraits, ...traits };\n //\n // // Encrypt sensitive traits\n // const encryptedTraits = await this._encryptTraits(traits);\n //\n // const event = this._createEvent({\n // type: 'identify',\n // event: 'user_identified',\n // traits: encryptedTraits,\n // _rawTraits: traits // Store raw for internal use, won't be sent\n // });\n //\n // // Remove raw traits before sending\n // delete event._rawTraits;\n //\n // this._log('User identified', { userId, traitsEncrypted: !!encryptedTraits });\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 return this.add_user_attributes(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 return this.destroy_session();\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 // Cleanup\n async destroy() {\n if (this.batchInterval) {\n clearInterval(this.batchInterval);\n }\n await this.flush();\n }\n\n // ============ Private Methods ============\n\n _createEvent(data) {\n return {\n event_id: this._generateUUID(),\n trace_id: this._generateUUID(),\n type: data.type || 'track',\n event_name: data.event,\n service_name: this.config.serviceName,\n user_id: this.userId || '',\n profile_id: this.profileId || null, // Add profile_id\n anonymous_id: this.anonymousId,\n device_id: this.deviceId, // Add device_id\n session_id: this.sessionId, // Add session_id\n loan_code: data.loanCode || '',\n properties: data.properties || {\n \"hasFake\": true\n },\n traits: data.traits || '',\n device: data.device || this.deviceInfo,\n campaign: data.campaign || {},\n context: data.context || {},\n event_time: new Date().toISOString(),\n };\n }\n\n async _sendEvent(event) {\n const url = `${this.config.baseUrl}/v1/events/track`;\n const headers = await this._getHeaders(event);\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.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}/v1/events/batch`;\n const payload = { events };\n const headers = await this._getHeaders(payload);\n\n try {\n const response = await this._makeRequest(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\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 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 if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', () => {\n this.flush();\n });\n }\n }\n\n async _getHeaders(payload) {\n const timestamp = Math.floor(Date.now() / 1000);\n const payloadString = typeof payload === 'string' ? payload : JSON.stringify(payload);\n\n // Generate signature if secret key is provided\n const signature = await this._generateSignature(\n this.config.source,\n timestamp.toString(),\n payloadString\n );\n\n return {\n 'X-Api-Key': this.config.apiKey,\n 'X-Source': this.config.source,\n 'X-Timestamp': timestamp.toString(),\n 'X-Signatures': signature,\n 'X-Trace-Id': this._generateUUID(),\n 'isTest': this.config.isTest.toString(),\n 'Content-Type': 'application/json',\n };\n }\n\n async _makeRequest(url, options) {\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 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 try {\n resolve(JSON.parse(data));\n } catch (e) {\n resolve(data);\n }\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 return {\n platform: process.platform,\n brand: 'Server',\n model: 'Node.js',\n app_version: '',\n os_version: process.version,\n };\n }\n\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 _getOrCreateDeviceId() {\n if (typeof localStorage !== 'undefined') {\n let id = localStorage.getItem('cdp_device_id');\n if (!id) {\n id = this._generateUUID();\n this._saveDeviceId(id);\n }\n return id;\n }\n return this._generateUUID();\n }\n\n _saveDeviceId(id) {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('cdp_device_id', id);\n }\n }\n\n _getOrCreateSessionId() {\n if (typeof sessionStorage !== 'undefined') {\n let id = sessionStorage.getItem('cdp_session_id');\n if (!id) {\n id = this._generateUUID();\n this._saveSessionId(id);\n }\n return id;\n }\n return this._generateUUID();\n }\n\n _saveSessionId(id) {\n if (typeof sessionStorage !== 'undefined') {\n sessionStorage.setItem('cdp_session_id', id);\n }\n }\n\n _getStoredProfileId() {\n if (typeof localStorage !== 'undefined') {\n return localStorage.getItem('cdp_profile_id');\n }\n return null;\n }\n\n _saveProfileId(id) {\n this.profileId = id;\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('cdp_profile_id', id.toString());\n }\n }\n\n _clearProfileId() {\n this.profileId = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem('cdp_profile_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 // ============ Security Methods ============\n\n /**\n * Initialize crypto library\n */\n _initCrypto() {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.subtle) {\n return window.crypto;\n }\n if (typeof require !== 'undefined') {\n try {\n return require('crypto');\n } catch (e) {\n this._logError('Crypto module not available');\n return null;\n }\n }\n return null;\n }\n\n /**\n * Encrypt traits using AES\n * AES Key = SHA256(SecretKey + X-Timestamp)\n */\n async _encryptTraits(traits) {\n if (!this.config.enableEncryption || !this.config.secretKey) {\n return typeof traits === 'string' ? traits : JSON.stringify(traits);\n }\n\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const sensitiveTraits = this._extractSensitiveTraits(traits);\n\n if (Object.keys(sensitiveTraits).length === 0) {\n return '';\n }\n\n const traitsString = JSON.stringify(sensitiveTraits);\n\n // Browser environment\n if (typeof window !== 'undefined' && this.crypto && this.crypto.subtle) {\n return await this._encryptAESBrowser(traitsString, timestamp);\n }\n\n // Node.js environment\n if (typeof require !== 'undefined') {\n return this._encryptAESNode(traitsString, timestamp);\n }\n\n this._logError('Encryption not supported in this environment');\n return '';\n } catch (error) {\n this._logError('Failed to encrypt traits:', error);\n return '';\n }\n }\n\n /**\n * Extract only sensitive traits that need encryption\n */\n _extractSensitiveTraits(traits) {\n const sensitiveFields = [\n 'full_name', 'first_name', 'last_name',\n 'idcard', 'old_idcard', 'phone', 'email',\n 'gender', 'dob', 'address', 'religion'\n ];\n\n const sensitive = {};\n for (const field of sensitiveFields) {\n if (traits[field] !== undefined && traits[field] !== null && traits[field] !== '') {\n sensitive[field] = traits[field];\n }\n }\n return sensitive;\n }\n\n /**\n * AES encryption for browser using Web Crypto API\n */\n async _encryptAESBrowser(text, timestamp) {\n try {\n // Generate key: SHA256(SecretKey + Timestamp)\n const keyMaterial = this.config.secretKey + timestamp;\n const keyBuffer = new TextEncoder().encode(keyMaterial);\n\n const hashBuffer = await this.crypto.subtle.digest('SHA-256', keyBuffer);\n\n const key = await this.crypto.subtle.importKey(\n 'raw',\n hashBuffer,\n { name: 'AES-CBC', length: 256 },\n false,\n ['encrypt']\n );\n\n // Generate random IV\n const iv = this.crypto.getRandomValues(new Uint8Array(16));\n\n // Encrypt\n const encryptedBuffer = await this.crypto.subtle.encrypt(\n { name: 'AES-CBC', iv },\n key,\n new TextEncoder().encode(text)\n );\n\n // Combine IV + encrypted data\n const combined = new Uint8Array(iv.length + encryptedBuffer.byteLength);\n combined.set(iv, 0);\n combined.set(new Uint8Array(encryptedBuffer), iv.length);\n\n // Return Base64\n return this._arrayBufferToBase64(combined);\n } catch (error) {\n this._logError('Browser encryption failed:', error);\n return '';\n }\n }\n\n /**\n * AES encryption for Node.js\n */\n _encryptAESNode(text, timestamp) {\n try {\n const crypto = require('crypto');\n\n // Generate key: SHA256(SecretKey + Timestamp)\n const keyMaterial = this.config.secretKey + timestamp;\n const key = crypto.createHash('sha256').update(keyMaterial).digest();\n\n // Generate random IV\n const iv = crypto.randomBytes(16);\n\n // Encrypt\n const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);\n let encrypted = cipher.update(text, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n // Combine IV + encrypted data\n const combined = Buffer.concat([iv, Buffer.from(encrypted, 'hex')]);\n\n // Return Base64\n return combined.toString('base64');\n } catch (error) {\n this._logError('Node.js encryption failed:', error);\n return '';\n }\n }\n\n /**\n * Generate HMAC signature\n * X-Signatures = Base64(HMAC-SHA256(X-Source + \"|\" + X-Timestamp + \"|\" + Payload))\n */\n async _generateSignature(source, timestamp, payload) {\n if (!this.config.secretKey) {\n return '';\n }\n\n try {\n const message = `${source}|${timestamp}|${payload}`;\n\n // Browser environment\n if (typeof window !== 'undefined' && this.crypto && this.crypto.subtle) {\n return await this._hmacBrowser(message);\n }\n\n // Node.js environment\n if (typeof require !== 'undefined') {\n return this._hmacNode(message);\n }\n\n return '';\n } catch (error) {\n this._logError('Failed to generate signature:', error);\n return '';\n }\n }\n\n /**\n * HMAC for browser\n */\n async _hmacBrowser(message) {\n try {\n const encoder = new TextEncoder();\n const keyData = encoder.encode(this.config.secretKey);\n\n const key = await this.crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await this.crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(message)\n );\n\n return this._arrayBufferToBase64(signature);\n } catch (error) {\n this._logError('Browser HMAC failed:', error);\n return '';\n }\n }\n\n /**\n * HMAC for Node.js\n */\n _hmacNode(message) {\n try {\n const crypto = require('crypto');\n const hmac = crypto.createHmac('sha256', this.config.secretKey);\n hmac.update(message);\n return hmac.digest('base64');\n } catch (error) {\n this._logError('Node.js HMAC failed:', error);\n return '';\n }\n }\n\n /**\n * Convert ArrayBuffer to Base64\n */\n _arrayBufferToBase64(buffer) {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\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\n// export { CdpLiteSdk };\n\n// ES Module export (default)\n// export 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":["require"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("https")):"function"==typeof define&&define.amd?define(["https"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).CdpLiteSdk=t(e.require$$0)}(this,function(e){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function r(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var i={exports:{}};return function(t){class i{constructor(e){this.config={apiKey:e.apiKey,secretKey:e.secretKey,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,enableEncryption:void 0===e.enableEncryption||e.enableEncryption},!this.config.secretKey&&this.config.enableEncryption&&this._logError("Warning: secretKey is required for encryption and signatures"),this.eventQueue=[],this.userId=null,this.anonymousId=this._getOrCreateAnonymousId(),this.userTraits={},this.userIdentities={},this.deviceInfo=this.config.autoTrackDevice?this._getDeviceInfo():{},this.platforms={},this.campaign={},this.metadata={schema_version:"1.0"},this.crypto=this._initCrypto(),this.config.batchSize>1&&this._startBatchProcessor(),this._log("CDP Lite SDK initialized",this.config)}async identifyUser(e,t={}){return"string"==typeof e?this.userId=e:"object"==typeof e&&(this.userIdentities={...this.userIdentities,...e},e.user_id?this.userId=e.user_id:e.u_em&&(this.userId=e.u_em)),this.userTraits={...this.userTraits,...t},await this._trackProfile("login",this.userTraits),this._log("User identified",{userId:this.userId,traits:t}),this}getUserIdentities(){return{user_id:this.userId,anonymous_id:this.anonymousId,...this.userIdentities}}getUserAttribute(e){return this.userTraits[e]||null}add_first_name(e){return this.userTraits.first_name=e,this._trackProfile("update",{first_name:e}),this}add_last_name(e){return this.userTraits.last_name=e,this._trackProfile("update",{last_name:e}),this}add_email(e){return this.userTraits.email=e,this.userIdentities.u_em=e,this._trackProfile("update",{email:e}),this}add_mobile(e){return this.userTraits.phone=e,this._trackProfile("update",{phone:e}),this}add_user_name(e){return this.userTraits.full_name=e,this._trackProfile("update",{full_name:e}),this}add_gender(e){return this.userTraits.gender=e,this._trackProfile("update",{gender:e}),this}add_birthday(e){let t;return t=e instanceof Date?e.toISOString().split("T")[0]:e,this.userTraits.dob=t,this._trackProfile("update",{dob:t}),this}add_idcard(e){return this.userTraits.idcard=e,this._trackProfile("update",{idcard:e}),this}add_old_idcard(e){return this.userTraits.old_idcard=e,this._trackProfile("update",{old_idcard:e}),this}add_address(e){return this.userTraits.address=e,this._trackProfile("update",{address:e}),this}add_religion(e){return this.userTraits.religion=e,this._trackProfile("update",{religion:e}),this}add_user_attribute(e,t){return this.userTraits[e]=t,this._trackProfile("update",{[e]:t}),this}add_user_attributes(e){return this.userTraits={...this.userTraits,...e},this._trackProfile("update",e),this}setPlatform(e){return this.platforms={...this.platforms,...e},this}setCampaign(e){return this.campaign={...this.campaign,...e},this}async destroy_session(){return await this._trackProfile("logout",{}),this.userId=null,this.userTraits={},this.userIdentities={},this.campaign={},this.anonymousId=this._generateUUID(),this._saveAnonymousId(this.anonymousId),this._log("Session destroyed (logged out)"),this}async _trackProfile(e,t){const r=`${this.config.baseUrl}/v1/profiles/track`,i={user_id:this.userId||this.anonymousId,type:e,party_type:"PERSON",traits:t,platforms:this.platforms||this._convertDeviceInfoToPlatforms(),campaign:this.campaign,metadata:this.metadata},s=await this._getHeaders(i);try{const t=await this._makeRequest(r,{method:"POST",headers:s,body:JSON.stringify(i)});return this._log("Profile tracked",{type:e,userId:this.userId}),t}catch(e){throw this._logError("Failed to track profile",e),e}}_convertDeviceInfoToPlatforms(){return this.deviceInfo&&0!==Object.keys(this.deviceInfo).length?{device_type:this._detectDeviceType(),brand:this.deviceInfo.brand||"Unknown",model:this.deviceInfo.model||"Unknown",app_version:this.deviceInfo.app_version||"",os_name:this.deviceInfo.platform||"Unknown",os_version:this.deviceInfo.os_version||"Unknown"}:{}}_detectDeviceType(){if("undefined"==typeof window)return"server";const e=navigator.userAgent;return/Mobile|Android|iPhone|iPad|iPod/.test(e)?"mobile":/Tablet|iPad/.test(e)?"tablet":"desktop"}track(e,t={},r={}){const i=this._createEvent({type:"track",event:e,properties:t,...r});if(!(this.config.batchSize>1))return this._sendEvent(i);this._addToQueue(i)}async identify(e,t={}){return this.identifyUser(e,t)}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.add_user_attributes(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(){return this.destroy_session()}async destroy(){this.batchInterval&&clearInterval(this.batchInterval),await this.flush()}_createEvent(e){return{event_id:this._generateUUID(),trace_id:this._generateUUID(),type:e.type||"track",event_name:e.event,service_name:this.config.serviceName,user_id:this.userId||"",anonymous_id:this.anonymousId,loan_code:e.loanCode||"",properties:e.properties||{hasFake:!0},traits:e.traits||"",device:e.device||this.deviceInfo,campaign:e.campaign||{},context:e.context||{},event_time:(new Date).toISOString()}}async _sendEvent(e){const t=`${this.config.baseUrl}/v1/events/track`,r=await this._getHeaders(e);try{const i=await this._makeRequest(t,{method:"POST",headers:r,body:JSON.stringify(e)});return this._log("Event tracked successfully",e.event),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}/v1/events/batch`,r={events:e},i=await this._getHeaders(r);try{const s=await this._makeRequest(t,{method:"POST",headers:i,body:JSON.stringify(r)});return this._log(`Batch of ${e.length} events tracked successfully`),s}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()})}async _getHeaders(e){const t=Math.floor(Date.now()/1e3),r="string"==typeof e?e:JSON.stringify(e),i=await this._generateSignature(this.config.source,t.toString(),r);return{"X-Api-Key":this.config.apiKey,"X-Source":this.config.source,"X-Timestamp":t.toString(),"X-Signatures":i,"X-Trace-Id":this._generateUUID(),isTest:this.config.isTest.toString(),"Content-Type":"application/json"}}async _makeRequest(t,r){if("undefined"!=typeof fetch){const e=await fetch(t,r);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.json()}{const i=e,s=new URL(t);return new Promise((e,t)=>{const n=i.request({hostname:s.hostname,path:s.pathname+s.search,method:r.method,headers:r.headers},r=>{let i="";r.on("data",e=>i+=e),r.on("end",()=>{r.statusCode>=200&&r.statusCode<300?e(JSON.parse(i)):t(new Error(`HTTP error! status: ${r.statusCode}`))})});n.on("error",t),r.body&&n.write(r.body),n.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}_initCrypto(){if("undefined"!=typeof window&&window.crypto&&window.crypto.subtle)return window.crypto;if(void 0!==r)try{return require("crypto")}catch(e){return this._logError("Crypto module not available"),null}return null}async _encryptTraits(e){if(!this.config.enableEncryption||!this.config.secretKey)return"string"==typeof e?e:JSON.stringify(e);try{const t=Math.floor(Date.now()/1e3).toString(),i=this._extractSensitiveTraits(e);if(0===Object.keys(i).length)return"";const s=JSON.stringify(i);return"undefined"!=typeof window&&this.crypto&&this.crypto.subtle?await this._encryptAESBrowser(s,t):void 0!==r?this._encryptAESNode(s,t):(this._logError("Encryption not supported in this environment"),"")}catch(e){return this._logError("Failed to encrypt traits:",e),""}}_extractSensitiveTraits(e){const t=["full_name","first_name","last_name","idcard","old_idcard","phone","email","gender","dob","address","religion"],r={};for(const i of t)void 0!==e[i]&&null!==e[i]&&""!==e[i]&&(r[i]=e[i]);return r}async _encryptAESBrowser(e,t){try{const r=this.config.secretKey+t,i=(new TextEncoder).encode(r),s=await this.crypto.subtle.digest("SHA-256",i),n=await this.crypto.subtle.importKey("raw",s,{name:"AES-CBC",length:256},!1,["encrypt"]),o=this.crypto.getRandomValues(new Uint8Array(16)),a=await this.crypto.subtle.encrypt({name:"AES-CBC",iv:o},n,(new TextEncoder).encode(e)),d=new Uint8Array(o.length+a.byteLength);return d.set(o,0),d.set(new Uint8Array(a),o.length),this._arrayBufferToBase64(d)}catch(e){return this._logError("Browser encryption failed:",e),""}}_encryptAESNode(e,t){try{const r=require("crypto"),i=this.config.secretKey+t,s=r.createHash("sha256").update(i).digest(),n=r.randomBytes(16),o=r.createCipheriv("aes-256-cbc",s,n);let a=o.update(e,"utf8","hex");a+=o.final("hex");return Buffer.concat([n,Buffer.from(a,"hex")]).toString("base64")}catch(e){return this._logError("Node.js encryption failed:",e),""}}async _generateSignature(e,t,i){if(!this.config.secretKey)return"";try{const s=`${e}|${t}|${i}`;return"undefined"!=typeof window&&this.crypto&&this.crypto.subtle?await this._hmacBrowser(s):void 0!==r?this._hmacNode(s):""}catch(e){return this._logError("Failed to generate signature:",e),""}}async _hmacBrowser(e){try{const t=new TextEncoder,r=t.encode(this.config.secretKey),i=await this.crypto.subtle.importKey("raw",r,{name:"HMAC",hash:"SHA-256"},!1,["sign"]),s=await this.crypto.subtle.sign("HMAC",i,t.encode(e));return this._arrayBufferToBase64(s)}catch(e){return this._logError("Browser HMAC failed:",e),""}}_hmacNode(e){try{const t=require("crypto").createHmac("sha256",this.config.secretKey);return t.update(e),t.digest("base64")}catch(e){return this._logError("Node.js HMAC failed:",e),""}}_arrayBufferToBase64(e){const t=new Uint8Array(e);let r="";for(let e=0;e<t.length;e++)r+=String.fromCharCode(t[e]);return btoa(r)}}t.exports&&(t.exports=i,t.exports.default=i,t.exports.CdpLiteSdk=i),"undefined"!=typeof window&&(window.CdpLiteSdk=i)}(i),t(i.exports)});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("https")):"function"==typeof define&&define.amd?define(["https"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).CdpLiteSdk=t(e.require$$0)}(this,function(e){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function i(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var r={exports:{}};return function(t){class r{constructor(e){this.config={apiKey:e.apiKey,secretKey:e.secretKey,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,enableEncryption:void 0===e.enableEncryption||e.enableEncryption},!this.config.secretKey&&this.config.enableEncryption&&this._logError("Warning: secretKey is required for encryption and signatures"),this.eventQueue=[],this.userId=null,this.profileId=this._getStoredProfileId(),this.anonymousId=this._getOrCreateAnonymousId(),this.deviceId=this._getOrCreateDeviceId(),this.sessionId=this._getOrCreateSessionId(),this.userTraits={},this.userIdentities={},this.deviceInfo=this.config.autoTrackDevice?this._getDeviceInfo():{},this.platforms={},this.campaign={},this.metadata={schema_version:"1.0"},this.crypto=this._initCrypto(),this.config.batchSize>1&&this._startBatchProcessor(),this._log("CDP Lite SDK initialized",this.config),this._log("CDP Lite SDK initialized",{anonymousId:this.anonymousId,deviceId:this.deviceId,sessionId:this.sessionId})}async identifyUser(e,t={}){"string"==typeof e?this.userId=e:"object"==typeof e&&(this.userIdentities={...this.userIdentities,...e},e.user_id?this.userId=e.user_id:e.u_em&&(this.userId=e.u_em)),this.userTraits={...this.userTraits,...t};const i=await this._trackProfile("login",this.userTraits);return i&&i.profile_id&&(this.profileId=i.profile_id,this._saveProfileId(i.profile_id),this._log("Profile ID received:",i.profile_id)),this._log("User identified",{userId:this.userId,traits:t}),this._log("User identified",{userId:this.userId,profileId:this.profileId,transactionId:i?.transaction_id}),this}getUserIdentities(){return{user_id:this.userId,profile_id:this.profileId,anonymous_id:this.anonymousId,device_id:this.deviceId,session_id:this.sessionId,...this.userIdentities}}getUserAttribute(e){return this.userTraits[e]||null}getProfileId(){return this.profileId}getDeviceId(){return this.deviceId}getSessionId(){return this.sessionId}add_first_name(e){return this.userTraits.first_name=e,this._trackProfile("update",{first_name:e}),this}add_last_name(e){return this.userTraits.last_name=e,this._trackProfile("update",{last_name:e}),this}add_email(e){return this.userTraits.email=e,this.userIdentities.u_em=e,this._trackProfile("update",{email:e}),this}add_mobile(e){return this.userTraits.phone=e,this._trackProfile("update",{phone:e}),this}add_user_name(e){return this.userTraits.full_name=e,this._trackProfile("update",{full_name:e}),this}add_gender(e){return this.userTraits.gender=e,this._trackProfile("update",{gender:e}),this}add_birthday(e){let t;return t=e instanceof Date?e.toISOString().split("T")[0]:e,this.userTraits.dob=t,this._trackProfile("update",{dob:t}),this}add_idcard(e){return this.userTraits.idcard=e,this._trackProfile("update",{idcard:e}),this}add_old_idcard(e){return this.userTraits.old_idcard=e,this._trackProfile("update",{old_idcard:e}),this}add_address(e){return this.userTraits.address=e,this._trackProfile("update",{address:e}),this}add_religion(e){return this.userTraits.religion=e,this._trackProfile("update",{religion:e}),this}add_user_attribute(e,t){return this.userTraits[e]=t,this._trackProfile("update",{[e]:t}),this}add_user_attributes(e){return this.userTraits={...this.userTraits,...e},this._trackProfile("update",e),this}setPlatform(e){return this.platforms={...this.platforms,...e},this}setCampaign(e){return this.campaign={...this.campaign,...e},this}async destroy_session(){return await this._trackProfile("logout",{}),this.userId=null,this.profileId=null,this.userTraits={},this.userIdentities={},this.campaign={},this.anonymousId=this._generateUUID(),this._saveAnonymousId(this.anonymousId),this.sessionId=this._generateUUID(),this._saveSessionId(this.sessionId),this._clearProfileId(),this._log("Session destroyed (logged out)"),this}async _trackProfile(e,t){const i=`${this.config.baseUrl}/v1/profiles/track`,r={user_id:this.userId||this.anonymousId,type:e,party_type:"PERSON",traits:t,platforms:this.platforms||this._convertDeviceInfoToPlatforms(),campaign:this.campaign,metadata:this.metadata,device_id:this.deviceId,session_id:this.sessionId};this.profileId&&(r.profile_id=this.profileId);const s=await this._getHeaders(r);try{const t=await this._makeRequest(i,{method:"POST",headers:s,body:JSON.stringify(r)});return this._log("Profile tracked",{type:e,userId:this.userId,profileId:t?.profile_id,transactionId:t?.transaction_id}),t}catch(e){throw this._logError("Failed to track profile",e),e}}_convertDeviceInfoToPlatforms(){return this.deviceInfo&&0!==Object.keys(this.deviceInfo).length?{device_type:this._detectDeviceType(),brand:this.deviceInfo.brand||"Unknown",model:this.deviceInfo.model||"Unknown",app_version:this.deviceInfo.app_version||"",os_name:this.deviceInfo.platform||"Unknown",os_version:this.deviceInfo.os_version||"Unknown"}:{}}_detectDeviceType(){if("undefined"==typeof window)return"server";const e=navigator.userAgent;return/Mobile|Android|iPhone|iPad|iPod/.test(e)?"mobile":/Tablet|iPad/.test(e)?"tablet":"desktop"}track(e,t={},i={}){const r=this._createEvent({type:"track",event:e,properties:t,...i});if(!(this.config.batchSize>1))return this._sendEvent(r);this._addToQueue(r)}async identify(e,t={}){return this.identifyUser(e,t)}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.add_user_attributes(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(){return this.destroy_session()}async destroy(){this.batchInterval&&clearInterval(this.batchInterval),await this.flush()}_createEvent(e){return{event_id:this._generateUUID(),trace_id:this._generateUUID(),type:e.type||"track",event_name:e.event,service_name:this.config.serviceName,user_id:this.userId||"",profile_id:this.profileId||null,anonymous_id:this.anonymousId,device_id:this.deviceId,session_id:this.sessionId,loan_code:e.loanCode||"",properties:e.properties||{hasFake:!0},traits:e.traits||"",device:e.device||this.deviceInfo,campaign:e.campaign||{},context:e.context||{},event_time:(new Date).toISOString()}}async _sendEvent(e){const t=`${this.config.baseUrl}/v1/events/track`,i=await this._getHeaders(e);try{const r=await this._makeRequest(t,{method:"POST",headers:i,body:JSON.stringify(e)});return this._log("Event tracked successfully",e.event),r}catch(e){throw this._logError("Failed to track event",e),e}}async _sendBatch(e){if(0===e.length)return;const t=`${this.config.baseUrl}/v1/events/batch`,i={events:e},r=await this._getHeaders(i);try{const s=await this._makeRequest(t,{method:"POST",headers:r,body:JSON.stringify(i)});return this._log(`Batch of ${e.length} events tracked successfully`),s}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()})}async _getHeaders(e){const t=Math.floor(Date.now()/1e3),i="string"==typeof e?e:JSON.stringify(e),r=await this._generateSignature(this.config.source,t.toString(),i);return{"X-Api-Key":this.config.apiKey,"X-Source":this.config.source,"X-Timestamp":t.toString(),"X-Signatures":r,"X-Trace-Id":this._generateUUID(),isTest:this.config.isTest.toString(),"Content-Type":"application/json"}}async _makeRequest(t,i){if("undefined"!=typeof fetch){const e=await fetch(t,i);if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.json()}{const r=e,s=new URL(t);return new Promise((e,t)=>{const n=r.request({hostname:s.hostname,path:s.pathname+s.search,method:i.method,headers:i.headers},i=>{let r="";i.on("data",e=>r+=e),i.on("end",()=>{if(i.statusCode>=200&&i.statusCode<300)try{e(JSON.parse(r))}catch(t){e(r)}else t(new Error(`HTTP error! status: ${i.statusCode}`))})});n.on("error",t),i.body&&n.write(i.body),n.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)}_getOrCreateDeviceId(){if("undefined"!=typeof localStorage){let e=localStorage.getItem("cdp_device_id");return e||(e=this._generateUUID(),this._saveDeviceId(e)),e}return this._generateUUID()}_saveDeviceId(e){"undefined"!=typeof localStorage&&localStorage.setItem("cdp_device_id",e)}_getOrCreateSessionId(){if("undefined"!=typeof sessionStorage){let e=sessionStorage.getItem("cdp_session_id");return e||(e=this._generateUUID(),this._saveSessionId(e)),e}return this._generateUUID()}_saveSessionId(e){"undefined"!=typeof sessionStorage&&sessionStorage.setItem("cdp_session_id",e)}_getStoredProfileId(){return"undefined"!=typeof localStorage?localStorage.getItem("cdp_profile_id"):null}_saveProfileId(e){this.profileId=e,"undefined"!=typeof localStorage&&localStorage.setItem("cdp_profile_id",e.toString())}_clearProfileId(){this.profileId=null,"undefined"!=typeof localStorage&&localStorage.removeItem("cdp_profile_id")}_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}_initCrypto(){if("undefined"!=typeof window&&window.crypto&&window.crypto.subtle)return window.crypto;if(void 0!==i)try{return require("crypto")}catch(e){return this._logError("Crypto module not available"),null}return null}async _encryptTraits(e){if(!this.config.enableEncryption||!this.config.secretKey)return"string"==typeof e?e:JSON.stringify(e);try{const t=Math.floor(Date.now()/1e3).toString(),r=this._extractSensitiveTraits(e);if(0===Object.keys(r).length)return"";const s=JSON.stringify(r);return"undefined"!=typeof window&&this.crypto&&this.crypto.subtle?await this._encryptAESBrowser(s,t):void 0!==i?this._encryptAESNode(s,t):(this._logError("Encryption not supported in this environment"),"")}catch(e){return this._logError("Failed to encrypt traits:",e),""}}_extractSensitiveTraits(e){const t=["full_name","first_name","last_name","idcard","old_idcard","phone","email","gender","dob","address","religion"],i={};for(const r of t)void 0!==e[r]&&null!==e[r]&&""!==e[r]&&(i[r]=e[r]);return i}async _encryptAESBrowser(e,t){try{const i=this.config.secretKey+t,r=(new TextEncoder).encode(i),s=await this.crypto.subtle.digest("SHA-256",r),n=await this.crypto.subtle.importKey("raw",s,{name:"AES-CBC",length:256},!1,["encrypt"]),o=this.crypto.getRandomValues(new Uint8Array(16)),a=await this.crypto.subtle.encrypt({name:"AES-CBC",iv:o},n,(new TextEncoder).encode(e)),d=new Uint8Array(o.length+a.byteLength);return d.set(o,0),d.set(new Uint8Array(a),o.length),this._arrayBufferToBase64(d)}catch(e){return this._logError("Browser encryption failed:",e),""}}_encryptAESNode(e,t){try{const i=require("crypto"),r=this.config.secretKey+t,s=i.createHash("sha256").update(r).digest(),n=i.randomBytes(16),o=i.createCipheriv("aes-256-cbc",s,n);let a=o.update(e,"utf8","hex");a+=o.final("hex");return Buffer.concat([n,Buffer.from(a,"hex")]).toString("base64")}catch(e){return this._logError("Node.js encryption failed:",e),""}}async _generateSignature(e,t,r){if(!this.config.secretKey)return"";try{const s=`${e}|${t}|${r}`;return"undefined"!=typeof window&&this.crypto&&this.crypto.subtle?await this._hmacBrowser(s):void 0!==i?this._hmacNode(s):""}catch(e){return this._logError("Failed to generate signature:",e),""}}async _hmacBrowser(e){try{const t=new TextEncoder,i=t.encode(this.config.secretKey),r=await this.crypto.subtle.importKey("raw",i,{name:"HMAC",hash:"SHA-256"},!1,["sign"]),s=await this.crypto.subtle.sign("HMAC",r,t.encode(e));return this._arrayBufferToBase64(s)}catch(e){return this._logError("Browser HMAC failed:",e),""}}_hmacNode(e){try{const t=require("crypto").createHmac("sha256",this.config.secretKey);return t.update(e),t.digest("base64")}catch(e){return this._logError("Node.js HMAC failed:",e),""}}_arrayBufferToBase64(e){const t=new Uint8Array(e);let i="";for(let e=0;e<t.length;e++)i+=String.fromCharCode(t[e]);return btoa(i)}}t.exports&&(t.exports=r,t.exports.default=r,t.exports.CdpLiteSdk=r),"undefined"!=typeof window&&(window.CdpLiteSdk=r)}(r),t(r.exports)});
2
2
  //# sourceMappingURL=cdp-lite-sdk.umd.min.js.map