@amplitude/analytics-core 2.24.0 → 2.25.0
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/lib/cjs/diagnostics/diagnostics-client.d.ts +156 -0
- package/lib/cjs/diagnostics/diagnostics-client.d.ts.map +1 -0
- package/lib/cjs/diagnostics/diagnostics-client.js +305 -0
- package/lib/cjs/diagnostics/diagnostics-client.js.map +1 -0
- package/lib/cjs/diagnostics/diagnostics-storage.d.ts +123 -0
- package/lib/cjs/diagnostics/diagnostics-storage.d.ts.map +1 -0
- package/lib/cjs/diagnostics/diagnostics-storage.js +492 -0
- package/lib/cjs/diagnostics/diagnostics-storage.js.map +1 -0
- package/lib/cjs/index.d.ts +1 -1
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +4 -2
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/utils/url-utils.d.ts +2 -0
- package/lib/cjs/utils/url-utils.d.ts.map +1 -1
- package/lib/cjs/utils/url-utils.js +13 -1
- package/lib/cjs/utils/url-utils.js.map +1 -1
- package/lib/esm/diagnostics/diagnostics-client.d.ts +156 -0
- package/lib/esm/diagnostics/diagnostics-client.d.ts.map +1 -0
- package/lib/esm/diagnostics/diagnostics-client.js +302 -0
- package/lib/esm/diagnostics/diagnostics-client.js.map +1 -0
- package/lib/esm/diagnostics/diagnostics-storage.d.ts +123 -0
- package/lib/esm/diagnostics/diagnostics-storage.d.ts.map +1 -0
- package/lib/esm/diagnostics/diagnostics-storage.js +489 -0
- package/lib/esm/diagnostics/diagnostics-storage.js.map +1 -0
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +2 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/utils/url-utils.d.ts +2 -0
- package/lib/esm/utils/url-utils.d.ts.map +1 -1
- package/lib/esm/utils/url-utils.js +11 -0
- package/lib/esm/utils/url-utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DiagnosticsStorage = exports.INTERNAL_KEYS = exports.TABLE_NAMES = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var global_scope_1 = require("../global-scope");
|
|
6
|
+
var MAX_PERSISTENT_STORAGE_EVENTS_COUNT = 10;
|
|
7
|
+
// Database configuration
|
|
8
|
+
var DB_VERSION = 1;
|
|
9
|
+
// Table names for different diagnostics types
|
|
10
|
+
exports.TABLE_NAMES = {
|
|
11
|
+
TAGS: 'tags',
|
|
12
|
+
COUNTERS: 'counters',
|
|
13
|
+
HISTOGRAMS: 'histograms',
|
|
14
|
+
EVENTS: 'events',
|
|
15
|
+
INTERNAL: 'internal', // New table for internal storage like flush timestamps
|
|
16
|
+
};
|
|
17
|
+
// Keys for internal storage table
|
|
18
|
+
exports.INTERNAL_KEYS = {
|
|
19
|
+
LAST_FLUSH_TIMESTAMP: 'last_flush_timestamp',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Purpose-specific IndexedDB storage for diagnostics data
|
|
23
|
+
* Provides optimized methods for each type of diagnostics data
|
|
24
|
+
*/
|
|
25
|
+
var DiagnosticsStorage = /** @class */ (function () {
|
|
26
|
+
function DiagnosticsStorage(apiKey, logger) {
|
|
27
|
+
this.dbPromise = null;
|
|
28
|
+
this.logger = logger;
|
|
29
|
+
this.dbName = "AMP_diagnostics_".concat(apiKey.substring(0, 10));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if IndexedDB is supported in the current environment
|
|
33
|
+
* @returns true if IndexedDB is available, false otherwise
|
|
34
|
+
*/
|
|
35
|
+
DiagnosticsStorage.isSupported = function () {
|
|
36
|
+
var _a;
|
|
37
|
+
return ((_a = (0, global_scope_1.getGlobalScope)()) === null || _a === void 0 ? void 0 : _a.indexedDB) !== undefined;
|
|
38
|
+
};
|
|
39
|
+
DiagnosticsStorage.prototype.getDB = function () {
|
|
40
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
41
|
+
return tslib_1.__generator(this, function (_a) {
|
|
42
|
+
if (!this.dbPromise) {
|
|
43
|
+
this.dbPromise = this.openDB();
|
|
44
|
+
}
|
|
45
|
+
return [2 /*return*/, this.dbPromise];
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
DiagnosticsStorage.prototype.openDB = function () {
|
|
50
|
+
var _this = this;
|
|
51
|
+
return new Promise(function (resolve, reject) {
|
|
52
|
+
var request = indexedDB.open(_this.dbName, DB_VERSION);
|
|
53
|
+
request.onerror = function () {
|
|
54
|
+
// Clear dbPromise when it rejects for the first time
|
|
55
|
+
_this.dbPromise = null;
|
|
56
|
+
reject(new Error('Failed to open IndexedDB'));
|
|
57
|
+
};
|
|
58
|
+
request.onsuccess = function () {
|
|
59
|
+
var db = request.result;
|
|
60
|
+
// Clear dbPromise when connection was on but went off later
|
|
61
|
+
db.onclose = function () {
|
|
62
|
+
_this.dbPromise = null;
|
|
63
|
+
_this.logger.debug('DiagnosticsStorage: DB connection closed.');
|
|
64
|
+
};
|
|
65
|
+
db.onerror = function (event) {
|
|
66
|
+
_this.logger.debug('DiagnosticsStorage: A global database error occurred.', event);
|
|
67
|
+
db.close();
|
|
68
|
+
};
|
|
69
|
+
resolve(db);
|
|
70
|
+
};
|
|
71
|
+
request.onupgradeneeded = function (event) {
|
|
72
|
+
var db = event.target.result;
|
|
73
|
+
_this.createTables(db);
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
DiagnosticsStorage.prototype.createTables = function (db) {
|
|
78
|
+
// Create tags table
|
|
79
|
+
if (!db.objectStoreNames.contains(exports.TABLE_NAMES.TAGS)) {
|
|
80
|
+
db.createObjectStore(exports.TABLE_NAMES.TAGS, { keyPath: 'key' });
|
|
81
|
+
}
|
|
82
|
+
// Create counters table
|
|
83
|
+
if (!db.objectStoreNames.contains(exports.TABLE_NAMES.COUNTERS)) {
|
|
84
|
+
db.createObjectStore(exports.TABLE_NAMES.COUNTERS, { keyPath: 'key' });
|
|
85
|
+
}
|
|
86
|
+
// Create histograms table for storing histogram stats (count, min, max, sum)
|
|
87
|
+
if (!db.objectStoreNames.contains(exports.TABLE_NAMES.HISTOGRAMS)) {
|
|
88
|
+
db.createObjectStore(exports.TABLE_NAMES.HISTOGRAMS, {
|
|
89
|
+
keyPath: 'key',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// Create events table
|
|
93
|
+
if (!db.objectStoreNames.contains(exports.TABLE_NAMES.EVENTS)) {
|
|
94
|
+
var eventsStore = db.createObjectStore(exports.TABLE_NAMES.EVENTS, {
|
|
95
|
+
keyPath: 'id',
|
|
96
|
+
autoIncrement: true,
|
|
97
|
+
});
|
|
98
|
+
// Create index on time for chronological queries
|
|
99
|
+
eventsStore.createIndex('time_idx', 'time', { unique: false });
|
|
100
|
+
}
|
|
101
|
+
// Create internal table for storing internal data like flush timestamps
|
|
102
|
+
if (!db.objectStoreNames.contains(exports.TABLE_NAMES.INTERNAL)) {
|
|
103
|
+
db.createObjectStore(exports.TABLE_NAMES.INTERNAL, { keyPath: 'key' });
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
DiagnosticsStorage.prototype.setTags = function (tags) {
|
|
107
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
108
|
+
var db, transaction_1, store_1, error_1;
|
|
109
|
+
var _this = this;
|
|
110
|
+
return tslib_1.__generator(this, function (_a) {
|
|
111
|
+
switch (_a.label) {
|
|
112
|
+
case 0:
|
|
113
|
+
_a.trys.push([0, 2, , 3]);
|
|
114
|
+
if (Object.entries(tags).length === 0) {
|
|
115
|
+
return [2 /*return*/];
|
|
116
|
+
}
|
|
117
|
+
return [4 /*yield*/, this.getDB()];
|
|
118
|
+
case 1:
|
|
119
|
+
db = _a.sent();
|
|
120
|
+
transaction_1 = db.transaction([exports.TABLE_NAMES.TAGS], 'readwrite');
|
|
121
|
+
store_1 = transaction_1.objectStore(exports.TABLE_NAMES.TAGS);
|
|
122
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
123
|
+
var entries = Object.entries(tags);
|
|
124
|
+
transaction_1.oncomplete = function () {
|
|
125
|
+
resolve();
|
|
126
|
+
};
|
|
127
|
+
transaction_1.onabort = function (event) {
|
|
128
|
+
_this.logger.debug('DiagnosticsStorage: Failed to set tags', event);
|
|
129
|
+
resolve();
|
|
130
|
+
};
|
|
131
|
+
entries.forEach(function (_a) {
|
|
132
|
+
var _b = tslib_1.__read(_a, 2), key = _b[0], value = _b[1];
|
|
133
|
+
var putRequest = store_1.put({ key: key, value: value });
|
|
134
|
+
putRequest.onerror = function (event) {
|
|
135
|
+
_this.logger.debug('DiagnosticsStorage: Failed to set tag', key, value, event);
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
})];
|
|
139
|
+
case 2:
|
|
140
|
+
error_1 = _a.sent();
|
|
141
|
+
this.logger.debug('DiagnosticsStorage: Failed to set tags', error_1);
|
|
142
|
+
return [3 /*break*/, 3];
|
|
143
|
+
case 3: return [2 /*return*/];
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
DiagnosticsStorage.prototype.incrementCounters = function (counters) {
|
|
149
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
150
|
+
var db, transaction_2, store_2, error_2;
|
|
151
|
+
var _this = this;
|
|
152
|
+
return tslib_1.__generator(this, function (_a) {
|
|
153
|
+
switch (_a.label) {
|
|
154
|
+
case 0:
|
|
155
|
+
_a.trys.push([0, 2, , 3]);
|
|
156
|
+
if (Object.entries(counters).length === 0) {
|
|
157
|
+
return [2 /*return*/];
|
|
158
|
+
}
|
|
159
|
+
return [4 /*yield*/, this.getDB()];
|
|
160
|
+
case 1:
|
|
161
|
+
db = _a.sent();
|
|
162
|
+
transaction_2 = db.transaction([exports.TABLE_NAMES.COUNTERS], 'readwrite');
|
|
163
|
+
store_2 = transaction_2.objectStore(exports.TABLE_NAMES.COUNTERS);
|
|
164
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
165
|
+
var entries = Object.entries(counters);
|
|
166
|
+
transaction_2.oncomplete = function () {
|
|
167
|
+
resolve();
|
|
168
|
+
};
|
|
169
|
+
transaction_2.onabort = function (event) {
|
|
170
|
+
_this.logger.debug('DiagnosticsStorage: Failed to increment counters', event);
|
|
171
|
+
resolve();
|
|
172
|
+
};
|
|
173
|
+
// Read existing values and update them
|
|
174
|
+
entries.forEach(function (_a) {
|
|
175
|
+
var _b = tslib_1.__read(_a, 2), key = _b[0], incrementValue = _b[1];
|
|
176
|
+
var getRequest = store_2.get(key);
|
|
177
|
+
getRequest.onsuccess = function () {
|
|
178
|
+
var existingRecord = getRequest.result;
|
|
179
|
+
/* istanbul ignore next */
|
|
180
|
+
var existingValue = existingRecord ? existingRecord.value : 0;
|
|
181
|
+
var putRequest = store_2.put({ key: key, value: existingValue + incrementValue });
|
|
182
|
+
putRequest.onerror = function (event) {
|
|
183
|
+
_this.logger.debug('DiagnosticsStorage: Failed to update counter', key, event);
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
getRequest.onerror = function (event) {
|
|
187
|
+
_this.logger.debug('DiagnosticsStorage: Failed to read existing counter', key, event);
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
})];
|
|
191
|
+
case 2:
|
|
192
|
+
error_2 = _a.sent();
|
|
193
|
+
this.logger.debug('DiagnosticsStorage: Failed to increment counters', error_2);
|
|
194
|
+
return [3 /*break*/, 3];
|
|
195
|
+
case 3: return [2 /*return*/];
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
DiagnosticsStorage.prototype.setHistogramStats = function (histogramStats) {
|
|
201
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
202
|
+
var db, transaction_3, store_3, error_3;
|
|
203
|
+
var _this = this;
|
|
204
|
+
return tslib_1.__generator(this, function (_a) {
|
|
205
|
+
switch (_a.label) {
|
|
206
|
+
case 0:
|
|
207
|
+
_a.trys.push([0, 2, , 3]);
|
|
208
|
+
if (Object.entries(histogramStats).length === 0) {
|
|
209
|
+
return [2 /*return*/];
|
|
210
|
+
}
|
|
211
|
+
return [4 /*yield*/, this.getDB()];
|
|
212
|
+
case 1:
|
|
213
|
+
db = _a.sent();
|
|
214
|
+
transaction_3 = db.transaction([exports.TABLE_NAMES.HISTOGRAMS], 'readwrite');
|
|
215
|
+
store_3 = transaction_3.objectStore(exports.TABLE_NAMES.HISTOGRAMS);
|
|
216
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
217
|
+
var entries = Object.entries(histogramStats);
|
|
218
|
+
transaction_3.oncomplete = function () {
|
|
219
|
+
resolve();
|
|
220
|
+
};
|
|
221
|
+
transaction_3.onabort = function (event) {
|
|
222
|
+
_this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', event);
|
|
223
|
+
resolve();
|
|
224
|
+
};
|
|
225
|
+
// Read existing values and update them
|
|
226
|
+
entries.forEach(function (_a) {
|
|
227
|
+
var _b = tslib_1.__read(_a, 2), key = _b[0], newStats = _b[1];
|
|
228
|
+
var getRequest = store_3.get(key);
|
|
229
|
+
getRequest.onsuccess = function () {
|
|
230
|
+
var existingRecord = getRequest.result;
|
|
231
|
+
var updatedStats;
|
|
232
|
+
/* istanbul ignore next */
|
|
233
|
+
if (existingRecord) {
|
|
234
|
+
// Accumulate with existing stats
|
|
235
|
+
updatedStats = {
|
|
236
|
+
key: key,
|
|
237
|
+
count: existingRecord.count + newStats.count,
|
|
238
|
+
min: Math.min(existingRecord.min, newStats.min),
|
|
239
|
+
max: Math.max(existingRecord.max, newStats.max),
|
|
240
|
+
sum: existingRecord.sum + newStats.sum,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// Create new stats
|
|
245
|
+
updatedStats = {
|
|
246
|
+
key: key,
|
|
247
|
+
count: newStats.count,
|
|
248
|
+
min: newStats.min,
|
|
249
|
+
max: newStats.max,
|
|
250
|
+
sum: newStats.sum,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
var putRequest = store_3.put(updatedStats);
|
|
254
|
+
putRequest.onerror = function (event) {
|
|
255
|
+
_this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', key, event);
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
getRequest.onerror = function (event) {
|
|
259
|
+
_this.logger.debug('DiagnosticsStorage: Failed to read existing histogram stats', key, event);
|
|
260
|
+
};
|
|
261
|
+
});
|
|
262
|
+
})];
|
|
263
|
+
case 2:
|
|
264
|
+
error_3 = _a.sent();
|
|
265
|
+
this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', error_3);
|
|
266
|
+
return [3 /*break*/, 3];
|
|
267
|
+
case 3: return [2 /*return*/];
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
DiagnosticsStorage.prototype.addEventRecords = function (events) {
|
|
273
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
274
|
+
var db, transaction_4, store_4, error_4;
|
|
275
|
+
var _this = this;
|
|
276
|
+
return tslib_1.__generator(this, function (_a) {
|
|
277
|
+
switch (_a.label) {
|
|
278
|
+
case 0:
|
|
279
|
+
_a.trys.push([0, 2, , 3]);
|
|
280
|
+
if (events.length === 0) {
|
|
281
|
+
return [2 /*return*/];
|
|
282
|
+
}
|
|
283
|
+
return [4 /*yield*/, this.getDB()];
|
|
284
|
+
case 1:
|
|
285
|
+
db = _a.sent();
|
|
286
|
+
transaction_4 = db.transaction([exports.TABLE_NAMES.EVENTS], 'readwrite');
|
|
287
|
+
store_4 = transaction_4.objectStore(exports.TABLE_NAMES.EVENTS);
|
|
288
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
289
|
+
transaction_4.oncomplete = function () {
|
|
290
|
+
resolve();
|
|
291
|
+
};
|
|
292
|
+
/* istanbul ignore next */
|
|
293
|
+
transaction_4.onabort = function (event) {
|
|
294
|
+
_this.logger.debug('DiagnosticsStorage: Failed to add event records', event);
|
|
295
|
+
resolve();
|
|
296
|
+
};
|
|
297
|
+
// First, check how many events are currently stored
|
|
298
|
+
var countRequest = store_4.count();
|
|
299
|
+
countRequest.onsuccess = function () {
|
|
300
|
+
var currentCount = countRequest.result;
|
|
301
|
+
// Calculate how many events we can add
|
|
302
|
+
var availableSlots = Math.max(0, MAX_PERSISTENT_STORAGE_EVENTS_COUNT - currentCount);
|
|
303
|
+
if (availableSlots < events.length) {
|
|
304
|
+
_this.logger.debug("DiagnosticsStorage: Only added ".concat(availableSlots, " of ").concat(events.length, " events due to storage limit"));
|
|
305
|
+
}
|
|
306
|
+
// Only add events up to the available slots (take the least recent ones)
|
|
307
|
+
events.slice(0, availableSlots).forEach(function (event) {
|
|
308
|
+
var request = store_4.add(event);
|
|
309
|
+
request.onerror = function (event) {
|
|
310
|
+
_this.logger.debug('DiagnosticsStorage: Failed to add event record', event);
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
};
|
|
314
|
+
countRequest.onerror = function (event) {
|
|
315
|
+
_this.logger.debug('DiagnosticsStorage: Failed to count existing events', event);
|
|
316
|
+
};
|
|
317
|
+
})];
|
|
318
|
+
case 2:
|
|
319
|
+
error_4 = _a.sent();
|
|
320
|
+
this.logger.debug('DiagnosticsStorage: Failed to add event records', error_4);
|
|
321
|
+
return [3 /*break*/, 3];
|
|
322
|
+
case 3: return [2 /*return*/];
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
};
|
|
327
|
+
DiagnosticsStorage.prototype.setInternal = function (key, value) {
|
|
328
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
329
|
+
var db, transaction_5, store_5, error_5;
|
|
330
|
+
return tslib_1.__generator(this, function (_a) {
|
|
331
|
+
switch (_a.label) {
|
|
332
|
+
case 0:
|
|
333
|
+
_a.trys.push([0, 2, , 3]);
|
|
334
|
+
return [4 /*yield*/, this.getDB()];
|
|
335
|
+
case 1:
|
|
336
|
+
db = _a.sent();
|
|
337
|
+
transaction_5 = db.transaction([exports.TABLE_NAMES.INTERNAL], 'readwrite');
|
|
338
|
+
store_5 = transaction_5.objectStore(exports.TABLE_NAMES.INTERNAL);
|
|
339
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
340
|
+
/* istanbul ignore next */
|
|
341
|
+
transaction_5.onabort = function () { return reject(new Error('Failed to set internal value')); };
|
|
342
|
+
var request = store_5.put({ key: key, value: value });
|
|
343
|
+
request.onsuccess = function () { return resolve(); };
|
|
344
|
+
/* istanbul ignore next */
|
|
345
|
+
request.onerror = function () { return reject(new Error('Failed to set internal value')); };
|
|
346
|
+
})];
|
|
347
|
+
case 2:
|
|
348
|
+
error_5 = _a.sent();
|
|
349
|
+
/* istanbul ignore next */
|
|
350
|
+
this.logger.debug('DiagnosticsStorage: Failed to set internal value', error_5);
|
|
351
|
+
return [3 /*break*/, 3];
|
|
352
|
+
case 3: return [2 /*return*/];
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
};
|
|
357
|
+
DiagnosticsStorage.prototype.getInternal = function (key) {
|
|
358
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
359
|
+
var db, transaction_6, store_6, error_6;
|
|
360
|
+
return tslib_1.__generator(this, function (_a) {
|
|
361
|
+
switch (_a.label) {
|
|
362
|
+
case 0:
|
|
363
|
+
_a.trys.push([0, 2, , 3]);
|
|
364
|
+
return [4 /*yield*/, this.getDB()];
|
|
365
|
+
case 1:
|
|
366
|
+
db = _a.sent();
|
|
367
|
+
transaction_6 = db.transaction([exports.TABLE_NAMES.INTERNAL], 'readonly');
|
|
368
|
+
store_6 = transaction_6.objectStore(exports.TABLE_NAMES.INTERNAL);
|
|
369
|
+
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
370
|
+
/* istanbul ignore next */
|
|
371
|
+
transaction_6.onabort = function () { return reject(new Error('Failed to get internal value')); };
|
|
372
|
+
var request = store_6.get(key);
|
|
373
|
+
request.onsuccess = function () { return resolve(request.result); };
|
|
374
|
+
/* istanbul ignore next */
|
|
375
|
+
request.onerror = function () { return reject(new Error('Failed to get internal value')); };
|
|
376
|
+
})];
|
|
377
|
+
case 2:
|
|
378
|
+
error_6 = _a.sent();
|
|
379
|
+
this.logger.debug('DiagnosticsStorage: Failed to get internal value', error_6);
|
|
380
|
+
return [2 /*return*/, undefined];
|
|
381
|
+
case 3: return [2 /*return*/];
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
};
|
|
386
|
+
DiagnosticsStorage.prototype.getLastFlushTimestamp = function () {
|
|
387
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
388
|
+
var record, error_7;
|
|
389
|
+
return tslib_1.__generator(this, function (_a) {
|
|
390
|
+
switch (_a.label) {
|
|
391
|
+
case 0:
|
|
392
|
+
_a.trys.push([0, 2, , 3]);
|
|
393
|
+
return [4 /*yield*/, this.getInternal(exports.INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP)];
|
|
394
|
+
case 1:
|
|
395
|
+
record = _a.sent();
|
|
396
|
+
return [2 /*return*/, record ? parseInt(record.value, 10) : undefined];
|
|
397
|
+
case 2:
|
|
398
|
+
error_7 = _a.sent();
|
|
399
|
+
/* istanbul ignore next */
|
|
400
|
+
this.logger.debug('DiagnosticsStorage: Failed to get last flush timestamp', error_7);
|
|
401
|
+
/* istanbul ignore next */
|
|
402
|
+
return [2 /*return*/, undefined];
|
|
403
|
+
case 3: return [2 /*return*/];
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
};
|
|
408
|
+
DiagnosticsStorage.prototype.setLastFlushTimestamp = function (timestamp) {
|
|
409
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
410
|
+
var error_8;
|
|
411
|
+
return tslib_1.__generator(this, function (_a) {
|
|
412
|
+
switch (_a.label) {
|
|
413
|
+
case 0:
|
|
414
|
+
_a.trys.push([0, 2, , 3]);
|
|
415
|
+
return [4 /*yield*/, this.setInternal(exports.INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP, timestamp.toString())];
|
|
416
|
+
case 1:
|
|
417
|
+
_a.sent();
|
|
418
|
+
return [3 /*break*/, 3];
|
|
419
|
+
case 2:
|
|
420
|
+
error_8 = _a.sent();
|
|
421
|
+
/* istanbul ignore next */
|
|
422
|
+
this.logger.debug('DiagnosticsStorage: Failed to set last flush timestamp', error_8);
|
|
423
|
+
return [3 /*break*/, 3];
|
|
424
|
+
case 3: return [2 /*return*/];
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
};
|
|
429
|
+
/* istanbul ignore next */
|
|
430
|
+
DiagnosticsStorage.prototype.clearTable = function (transaction, tableName) {
|
|
431
|
+
return new Promise(function (resolve, reject) {
|
|
432
|
+
var store = transaction.objectStore(tableName);
|
|
433
|
+
var request = store.clear();
|
|
434
|
+
request.onsuccess = function () { return resolve(); };
|
|
435
|
+
request.onerror = function () { return reject(new Error("Failed to clear table ".concat(tableName))); };
|
|
436
|
+
});
|
|
437
|
+
};
|
|
438
|
+
/* istanbul ignore next */
|
|
439
|
+
DiagnosticsStorage.prototype.getAllAndClear = function () {
|
|
440
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
441
|
+
var db, transaction, _a, tags, counters, histogramStats, events, error_9;
|
|
442
|
+
return tslib_1.__generator(this, function (_b) {
|
|
443
|
+
switch (_b.label) {
|
|
444
|
+
case 0:
|
|
445
|
+
_b.trys.push([0, 4, , 5]);
|
|
446
|
+
return [4 /*yield*/, this.getDB()];
|
|
447
|
+
case 1:
|
|
448
|
+
db = _b.sent();
|
|
449
|
+
transaction = db.transaction([exports.TABLE_NAMES.TAGS, exports.TABLE_NAMES.COUNTERS, exports.TABLE_NAMES.HISTOGRAMS, exports.TABLE_NAMES.EVENTS], 'readwrite');
|
|
450
|
+
return [4 /*yield*/, Promise.all([
|
|
451
|
+
this.getAllFromStore(transaction, exports.TABLE_NAMES.TAGS),
|
|
452
|
+
this.getAllFromStore(transaction, exports.TABLE_NAMES.COUNTERS),
|
|
453
|
+
this.getAllFromStore(transaction, exports.TABLE_NAMES.HISTOGRAMS),
|
|
454
|
+
this.getAllFromStore(transaction, exports.TABLE_NAMES.EVENTS),
|
|
455
|
+
])];
|
|
456
|
+
case 2:
|
|
457
|
+
_a = tslib_1.__read.apply(void 0, [_b.sent(), 4]), tags = _a[0], counters = _a[1], histogramStats = _a[2], events = _a[3];
|
|
458
|
+
// Clear all data in the same transaction
|
|
459
|
+
return [4 /*yield*/, Promise.all([
|
|
460
|
+
this.clearTable(transaction, exports.TABLE_NAMES.COUNTERS),
|
|
461
|
+
this.clearTable(transaction, exports.TABLE_NAMES.HISTOGRAMS),
|
|
462
|
+
this.clearTable(transaction, exports.TABLE_NAMES.EVENTS),
|
|
463
|
+
])];
|
|
464
|
+
case 3:
|
|
465
|
+
// Clear all data in the same transaction
|
|
466
|
+
_b.sent();
|
|
467
|
+
return [2 /*return*/, { tags: tags, counters: counters, histogramStats: histogramStats, events: events }];
|
|
468
|
+
case 4:
|
|
469
|
+
error_9 = _b.sent();
|
|
470
|
+
this.logger.debug('DiagnosticsStorage: Failed to get all and clear data', error_9);
|
|
471
|
+
return [2 /*return*/, { tags: [], counters: [], histogramStats: [], events: [] }];
|
|
472
|
+
case 5: return [2 /*return*/];
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
};
|
|
477
|
+
/**
|
|
478
|
+
* Helper method to get all records from a store within a transaction
|
|
479
|
+
*/
|
|
480
|
+
/* istanbul ignore next */
|
|
481
|
+
DiagnosticsStorage.prototype.getAllFromStore = function (transaction, tableName) {
|
|
482
|
+
return new Promise(function (resolve, reject) {
|
|
483
|
+
var store = transaction.objectStore(tableName);
|
|
484
|
+
var request = store.getAll();
|
|
485
|
+
request.onsuccess = function () { return resolve(request.result); };
|
|
486
|
+
request.onerror = function () { return reject(new Error("Failed to get all from ".concat(tableName))); };
|
|
487
|
+
});
|
|
488
|
+
};
|
|
489
|
+
return DiagnosticsStorage;
|
|
490
|
+
}());
|
|
491
|
+
exports.DiagnosticsStorage = DiagnosticsStorage;
|
|
492
|
+
//# sourceMappingURL=diagnostics-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics-storage.js","sourceRoot":"","sources":["../../../src/diagnostics/diagnostics-storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '../global-scope';\nimport { ILogger } from '../logger';\nimport { HistogramStats } from './diagnostics-client';\n\nconst MAX_PERSISTENT_STORAGE_EVENTS_COUNT = 10;\n\n// Database configuration\nconst DB_VERSION = 1;\n\n// Table names for different diagnostics types\nexport const TABLE_NAMES = {\n TAGS: 'tags',\n COUNTERS: 'counters',\n HISTOGRAMS: 'histograms',\n EVENTS: 'events',\n INTERNAL: 'internal', // New table for internal storage like flush timestamps\n} as const;\n\n// Keys for internal storage table\nexport const INTERNAL_KEYS = {\n LAST_FLUSH_TIMESTAMP: 'last_flush_timestamp',\n} as const;\n\n// Record interfaces for each table\nexport interface TagRecord {\n key: string;\n value: string;\n}\n\nexport interface CounterRecord {\n key: string;\n value: number;\n}\n\nexport interface HistogramRecord {\n key: string;\n count: number;\n min: number;\n max: number;\n sum: number;\n}\n\nexport interface EventRecord {\n id?: number; // Auto-increment primary key\n event_name: string;\n time: number;\n event_properties: Record<string, any>;\n}\n\nexport interface InternalRecord {\n key: string;\n value: string;\n}\n\nexport interface IDiagnosticsStorage {\n /**\n * Set multiple tags in a single transaction (batch operation)\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n setTags(tags: Record<string, string>): Promise<void>;\n /**\n * Increment multiple counters in a single transaction (batch operation)\n * Uses read-modify-write pattern to accumulate with existing values\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n incrementCounters(counters: Record<string, number>): Promise<void>;\n /**\n * Set multiple histogram stats in a single transaction (batch operation)\n * Uses read-modify-write pattern to accumulate count/sum and update min/max with existing values\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n setHistogramStats(\n histogramStats: Record<string, { count: number; min: number; max: number; sum: number }>,\n ): Promise<void>;\n /**\n * Add multiple event records in a single transaction (batch operation)\n * Promise never rejects - errors are logged and operation continues gracefully\n */\n addEventRecords(\n events: Array<{ event_name: string; time: number; event_properties: Record<string, any> }>,\n ): Promise<void>;\n\n setLastFlushTimestamp(timestamp: number): Promise<void>;\n\n getLastFlushTimestamp(): Promise<number | undefined>;\n\n /**\n * Get all data except internal data from storage and clear it\n */\n getAllAndClear(): Promise<{\n tags: TagRecord[];\n counters: CounterRecord[];\n histogramStats: HistogramRecord[];\n events: EventRecord[];\n }>;\n}\n\n/**\n * Purpose-specific IndexedDB storage for diagnostics data\n * Provides optimized methods for each type of diagnostics data\n */\nexport class DiagnosticsStorage implements IDiagnosticsStorage {\n dbPromise: Promise<IDBDatabase> | null = null;\n dbName: string;\n logger: ILogger;\n\n constructor(apiKey: string, logger: ILogger) {\n this.logger = logger;\n this.dbName = `AMP_diagnostics_${apiKey.substring(0, 10)}`;\n }\n\n /**\n * Check if IndexedDB is supported in the current environment\n * @returns true if IndexedDB is available, false otherwise\n */\n static isSupported(): boolean {\n return getGlobalScope()?.indexedDB !== undefined;\n }\n\n async getDB(): Promise<IDBDatabase> {\n if (!this.dbPromise) {\n this.dbPromise = this.openDB();\n }\n return this.dbPromise;\n }\n\n openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, DB_VERSION);\n\n request.onerror = () => {\n // Clear dbPromise when it rejects for the first time\n this.dbPromise = null;\n reject(new Error('Failed to open IndexedDB'));\n };\n\n request.onsuccess = () => {\n const db = request.result;\n // Clear dbPromise when connection was on but went off later\n db.onclose = () => {\n this.dbPromise = null;\n this.logger.debug('DiagnosticsStorage: DB connection closed.');\n };\n\n db.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: A global database error occurred.', event);\n db.close();\n };\n resolve(db);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n this.createTables(db);\n };\n });\n }\n\n createTables(db: IDBDatabase): void {\n // Create tags table\n if (!db.objectStoreNames.contains(TABLE_NAMES.TAGS)) {\n db.createObjectStore(TABLE_NAMES.TAGS, { keyPath: 'key' });\n }\n\n // Create counters table\n if (!db.objectStoreNames.contains(TABLE_NAMES.COUNTERS)) {\n db.createObjectStore(TABLE_NAMES.COUNTERS, { keyPath: 'key' });\n }\n\n // Create histograms table for storing histogram stats (count, min, max, sum)\n if (!db.objectStoreNames.contains(TABLE_NAMES.HISTOGRAMS)) {\n db.createObjectStore(TABLE_NAMES.HISTOGRAMS, {\n keyPath: 'key',\n });\n }\n\n // Create events table\n if (!db.objectStoreNames.contains(TABLE_NAMES.EVENTS)) {\n const eventsStore = db.createObjectStore(TABLE_NAMES.EVENTS, {\n keyPath: 'id',\n autoIncrement: true,\n });\n\n // Create index on time for chronological queries\n eventsStore.createIndex('time_idx', 'time', { unique: false });\n }\n\n // Create internal table for storing internal data like flush timestamps\n if (!db.objectStoreNames.contains(TABLE_NAMES.INTERNAL)) {\n db.createObjectStore(TABLE_NAMES.INTERNAL, { keyPath: 'key' });\n }\n }\n\n async setTags(tags: Record<string, string>): Promise<void> {\n try {\n if (Object.entries(tags).length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.TAGS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.TAGS);\n\n return new Promise((resolve) => {\n const entries = Object.entries(tags);\n\n transaction.oncomplete = () => {\n resolve();\n };\n\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set tags', event);\n resolve();\n };\n\n entries.forEach(([key, value]) => {\n const putRequest = store.put({ key, value });\n\n putRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set tag', key, value, event);\n };\n });\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to set tags', error);\n }\n }\n\n async incrementCounters(counters: Record<string, number>): Promise<void> {\n try {\n if (Object.entries(counters).length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.COUNTERS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.COUNTERS);\n\n return new Promise((resolve) => {\n const entries = Object.entries(counters);\n\n transaction.oncomplete = () => {\n resolve();\n };\n\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to increment counters', event);\n resolve();\n };\n\n // Read existing values and update them\n entries.forEach(([key, incrementValue]) => {\n const getRequest = store.get(key);\n\n getRequest.onsuccess = () => {\n const existingRecord = getRequest.result as CounterRecord | undefined;\n /* istanbul ignore next */\n const existingValue = existingRecord ? existingRecord.value : 0;\n const putRequest = store.put({ key, value: existingValue + incrementValue });\n\n putRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to update counter', key, event);\n };\n };\n\n getRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to read existing counter', key, event);\n };\n });\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to increment counters', error);\n }\n }\n\n async setHistogramStats(histogramStats: Record<string, HistogramStats>): Promise<void> {\n try {\n if (Object.entries(histogramStats).length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.HISTOGRAMS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.HISTOGRAMS);\n\n return new Promise((resolve) => {\n const entries = Object.entries(histogramStats);\n\n transaction.oncomplete = () => {\n resolve();\n };\n\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', event);\n resolve();\n };\n\n // Read existing values and update them\n entries.forEach(([key, newStats]) => {\n const getRequest = store.get(key);\n\n getRequest.onsuccess = () => {\n const existingRecord = getRequest.result as HistogramRecord | undefined;\n let updatedStats: HistogramRecord;\n\n /* istanbul ignore next */\n if (existingRecord) {\n // Accumulate with existing stats\n updatedStats = {\n key,\n count: existingRecord.count + newStats.count,\n min: Math.min(existingRecord.min, newStats.min),\n max: Math.max(existingRecord.max, newStats.max),\n sum: existingRecord.sum + newStats.sum,\n };\n } else {\n // Create new stats\n updatedStats = {\n key,\n count: newStats.count,\n min: newStats.min,\n max: newStats.max,\n sum: newStats.sum,\n };\n }\n\n const putRequest = store.put(updatedStats);\n\n putRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', key, event);\n };\n };\n\n getRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to read existing histogram stats', key, event);\n };\n });\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to set histogram stats', error);\n }\n }\n\n async addEventRecords(\n events: Array<{ event_name: string; time: number; event_properties: Record<string, any> }>,\n ): Promise<void> {\n try {\n if (events.length === 0) {\n return;\n }\n\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.EVENTS], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.EVENTS);\n\n return new Promise((resolve) => {\n transaction.oncomplete = () => {\n resolve();\n };\n\n /* istanbul ignore next */\n transaction.onabort = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to add event records', event);\n resolve();\n };\n\n // First, check how many events are currently stored\n const countRequest = store.count();\n\n countRequest.onsuccess = () => {\n const currentCount = countRequest.result;\n\n // Calculate how many events we can add\n const availableSlots = Math.max(0, MAX_PERSISTENT_STORAGE_EVENTS_COUNT - currentCount);\n\n if (availableSlots < events.length) {\n this.logger.debug(\n `DiagnosticsStorage: Only added ${availableSlots} of ${events.length} events due to storage limit`,\n );\n }\n\n // Only add events up to the available slots (take the least recent ones)\n events.slice(0, availableSlots).forEach((event) => {\n const request = store.add(event);\n\n request.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to add event record', event);\n };\n });\n };\n\n countRequest.onerror = (event) => {\n this.logger.debug('DiagnosticsStorage: Failed to count existing events', event);\n };\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to add event records', error);\n }\n }\n\n async setInternal(key: string, value: string): Promise<void> {\n try {\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.INTERNAL], 'readwrite');\n const store = transaction.objectStore(TABLE_NAMES.INTERNAL);\n\n return new Promise((resolve, reject) => {\n /* istanbul ignore next */\n transaction.onabort = () => reject(new Error('Failed to set internal value'));\n\n const request = store.put({ key, value });\n\n request.onsuccess = () => resolve();\n\n /* istanbul ignore next */\n request.onerror = () => reject(new Error('Failed to set internal value'));\n });\n } catch (error) {\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to set internal value', error);\n }\n }\n\n async getInternal(key: string): Promise<InternalRecord | undefined> {\n try {\n const db = await this.getDB();\n const transaction = db.transaction([TABLE_NAMES.INTERNAL], 'readonly');\n const store = transaction.objectStore(TABLE_NAMES.INTERNAL);\n\n return new Promise((resolve, reject) => {\n /* istanbul ignore next */\n transaction.onabort = () => reject(new Error('Failed to get internal value'));\n\n const request = store.get(key);\n\n request.onsuccess = () => resolve(request.result as InternalRecord | undefined);\n\n /* istanbul ignore next */\n request.onerror = () => reject(new Error('Failed to get internal value'));\n });\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to get internal value', error);\n return undefined;\n }\n }\n\n async getLastFlushTimestamp(): Promise<number | undefined> {\n try {\n const record = await this.getInternal(INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP);\n return record ? parseInt(record.value, 10) : undefined;\n } catch (error) {\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to get last flush timestamp', error);\n /* istanbul ignore next */\n return undefined;\n }\n }\n\n async setLastFlushTimestamp(timestamp: number): Promise<void> {\n try {\n await this.setInternal(INTERNAL_KEYS.LAST_FLUSH_TIMESTAMP, timestamp.toString());\n } catch (error) {\n /* istanbul ignore next */\n this.logger.debug('DiagnosticsStorage: Failed to set last flush timestamp', error);\n }\n }\n\n /* istanbul ignore next */\n clearTable(transaction: IDBTransaction, tableName: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const store = transaction.objectStore(tableName);\n const request = store.clear();\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(`Failed to clear table ${tableName}`));\n });\n }\n\n /* istanbul ignore next */\n async getAllAndClear(): Promise<{\n tags: TagRecord[];\n counters: CounterRecord[];\n histogramStats: HistogramRecord[];\n events: EventRecord[];\n }> {\n try {\n const db = await this.getDB();\n const transaction = db.transaction(\n [TABLE_NAMES.TAGS, TABLE_NAMES.COUNTERS, TABLE_NAMES.HISTOGRAMS, TABLE_NAMES.EVENTS],\n 'readwrite',\n );\n\n // Get all data first\n const [tags, counters, histogramStats, events] = await Promise.all([\n this.getAllFromStore<TagRecord>(transaction, TABLE_NAMES.TAGS),\n this.getAllFromStore<CounterRecord>(transaction, TABLE_NAMES.COUNTERS),\n this.getAllFromStore<HistogramRecord>(transaction, TABLE_NAMES.HISTOGRAMS),\n this.getAllFromStore<EventRecord>(transaction, TABLE_NAMES.EVENTS),\n ]);\n\n // Clear all data in the same transaction\n await Promise.all([\n this.clearTable(transaction, TABLE_NAMES.COUNTERS),\n this.clearTable(transaction, TABLE_NAMES.HISTOGRAMS),\n this.clearTable(transaction, TABLE_NAMES.EVENTS),\n ]);\n\n return { tags, counters, histogramStats, events };\n } catch (error) {\n this.logger.debug('DiagnosticsStorage: Failed to get all and clear data', error);\n return { tags: [], counters: [], histogramStats: [], events: [] };\n }\n }\n\n /**\n * Helper method to get all records from a store within a transaction\n */\n /* istanbul ignore next */\n private getAllFromStore<T>(transaction: IDBTransaction, tableName: string): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const store = transaction.objectStore(tableName);\n const request = store.getAll();\n\n request.onsuccess = () => resolve(request.result as T[]);\n request.onerror = () => reject(new Error(`Failed to get all from ${tableName}`));\n });\n }\n}\n"]}
|
package/lib/cjs/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export { returnWrapper, AmplitudeReturn } from './utils/return-wrapper';
|
|
|
19
19
|
export { debugWrapper, getClientLogConfig, getClientStates } from './utils/debug';
|
|
20
20
|
export { UUID } from './utils/uuid';
|
|
21
21
|
export { createIdentifyEvent } from './utils/event-builder';
|
|
22
|
-
export { isUrlMatchAllowlist } from './utils/url-utils';
|
|
22
|
+
export { isUrlMatchAllowlist, getDecodeURI } from './utils/url-utils';
|
|
23
23
|
export { MemoryStorage } from './storage/memory';
|
|
24
24
|
export { CookieStorage } from './storage/cookie';
|
|
25
25
|
export { getStorageKey } from './storage/helpers';
|
package/lib/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.CampaignParser = exports.MKTG = exports.BASE_CAMPAIGN = exports.EMPTY_VALUE = exports.FORBIDDEN_HEADERS = exports.SAFE_HEADERS = exports.NetworkRequestEvent = exports.networkObserver = exports.NetworkEventCallback = void 0;
|
|
3
|
+
exports.DEFAULT_DEAD_CLICK_WINDOW_MS = exports.DEFAULT_RAGE_CLICK_OUT_OF_BOUNDS_THRESHOLD = exports.DEFAULT_RAGE_CLICK_WINDOW_MS = exports.DEFAULT_RAGE_CLICK_THRESHOLD = exports.DEFAULT_RAGE_CLICK_ALLOWLIST = exports.DEFAULT_DEAD_CLICK_ALLOWLIST = exports.DEFAULT_ACTION_CLICK_ALLOWLIST = exports.DEFAULT_DATA_ATTRIBUTE_PREFIX = exports.DEFAULT_CSS_SELECTOR_ALLOWLIST = exports.OfflineDisabled = exports.ServerZone = exports.SpecialEventType = exports.IdentifyOperation = exports.STORAGE_PREFIX = exports.AMPLITUDE_PREFIX = exports.LogLevel = exports.RemoteConfigClient = exports.FetchTransport = exports.BaseTransport = exports.BrowserStorage = exports.getStorageKey = exports.CookieStorage = exports.MemoryStorage = exports.getDecodeURI = exports.isUrlMatchAllowlist = exports.createIdentifyEvent = exports.UUID = exports.getClientStates = exports.getClientLogConfig = exports.debugWrapper = exports.returnWrapper = exports.getQueryParams = exports.getLanguage = exports.getOldCookieName = exports.getCookieName = exports.isNewSession = exports.setConnectorUserId = exports.setConnectorDeviceId = exports.getAnalyticsConnector = exports.getGlobalScope = exports.Logger = exports.RequestMetadata = exports.Config = exports.IdentityEventSender = exports.Destination = exports.RevenueProperty = exports.Revenue = exports.Identify = exports.AmplitudeContext = exports.AmplitudeCore = void 0;
|
|
4
|
+
exports.CampaignParser = exports.MKTG = exports.BASE_CAMPAIGN = exports.EMPTY_VALUE = exports.FORBIDDEN_HEADERS = exports.SAFE_HEADERS = exports.NetworkRequestEvent = exports.networkObserver = exports.NetworkEventCallback = exports.Status = void 0;
|
|
5
5
|
var core_client_1 = require("./core-client");
|
|
6
6
|
Object.defineProperty(exports, "AmplitudeCore", { enumerable: true, get: function () { return core_client_1.AmplitudeCore; } });
|
|
7
7
|
var amplitude_context_1 = require("./types/amplitude-context");
|
|
@@ -47,6 +47,7 @@ var event_builder_1 = require("./utils/event-builder");
|
|
|
47
47
|
Object.defineProperty(exports, "createIdentifyEvent", { enumerable: true, get: function () { return event_builder_1.createIdentifyEvent; } });
|
|
48
48
|
var url_utils_1 = require("./utils/url-utils");
|
|
49
49
|
Object.defineProperty(exports, "isUrlMatchAllowlist", { enumerable: true, get: function () { return url_utils_1.isUrlMatchAllowlist; } });
|
|
50
|
+
Object.defineProperty(exports, "getDecodeURI", { enumerable: true, get: function () { return url_utils_1.getDecodeURI; } });
|
|
50
51
|
var memory_1 = require("./storage/memory");
|
|
51
52
|
Object.defineProperty(exports, "MemoryStorage", { enumerable: true, get: function () { return memory_1.MemoryStorage; } });
|
|
52
53
|
var cookie_1 = require("./storage/cookie");
|
|
@@ -55,6 +56,7 @@ var helpers_1 = require("./storage/helpers");
|
|
|
55
56
|
Object.defineProperty(exports, "getStorageKey", { enumerable: true, get: function () { return helpers_1.getStorageKey; } });
|
|
56
57
|
var browser_storage_1 = require("./storage/browser-storage");
|
|
57
58
|
Object.defineProperty(exports, "BrowserStorage", { enumerable: true, get: function () { return browser_storage_1.BrowserStorage; } });
|
|
59
|
+
// export { DiagnosticsClient, IDiagnosticsClient } from './diagnostics/diagnostics-client';
|
|
58
60
|
var base_1 = require("./transports/base");
|
|
59
61
|
Object.defineProperty(exports, "BaseTransport", { enumerable: true, get: function () { return base_1.BaseTransport; } });
|
|
60
62
|
var fetch_1 = require("./transports/fetch");
|