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.
- package/README.md +846 -0
- package/dist/cdp-lite-sdk.umd.js +407 -0
- package/dist/cdp-lite-sdk.umd.js.map +1 -0
- package/dist/cdp-lite-sdk.umd.min.js +2 -0
- package/dist/cdp-lite-sdk.umd.min.js.map +1 -0
- package/dist/index.cjs.js +401 -0
- package/dist/index.cjs.js.map +1 -0
- package/{src/cdp-lite-sdk.js → dist/index.esm.js} +12 -9
- package/dist/index.esm.js.map +1 -0
- package/package.json +43 -10
|
@@ -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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"}
|