@thisbefine/analytics 0.2.1 → 0.3.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 +161 -3
- package/dist/core/analytics.d.ts +44 -2
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/analytics.js +154 -17
- package/dist/core/analytics.js.map +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +3 -2
- package/dist/core/errors.js.map +1 -1
- package/dist/core/logger.d.ts +2 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +53 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/privacy.d.ts +50 -2
- package/dist/core/privacy.d.ts.map +1 -1
- package/dist/core/privacy.js +118 -1
- package/dist/core/privacy.js.map +1 -1
- package/dist/core/queue.d.ts +76 -3
- package/dist/core/queue.d.ts.map +1 -1
- package/dist/core/queue.js +353 -40
- package/dist/core/queue.js.map +1 -1
- package/dist/core/session.d.ts +5 -3
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +20 -5
- package/dist/core/session.js.map +1 -1
- package/dist/core/types.d.ts +150 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/next.d.ts +2 -0
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +2 -3
- package/dist/next.js.map +1 -1
- package/dist/react/context.d.ts +95 -0
- package/dist/react/context.d.ts.map +1 -0
- package/dist/react/context.js +120 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/hooks.js +38 -34
- package/dist/react/hooks.js.map +1 -1
- package/dist/react.d.ts +2 -0
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +1 -0
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/dist/core/queue.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { createLogger } from "./logger";
|
|
2
|
+
import { STORAGE_KEYS } from "./types";
|
|
2
3
|
/**
|
|
3
|
-
* Event queue with batching, automatic flushing,
|
|
4
|
+
* Event queue with batching, automatic flushing, retry logic, offline detection,
|
|
5
|
+
* persistent storage for crash recovery, and circuit breaker pattern.
|
|
4
6
|
*
|
|
5
7
|
* Features:
|
|
6
8
|
* - Batches events up to flushAt threshold
|
|
7
9
|
* - Flushes automatically after flushInterval
|
|
8
10
|
* - Uses sendBeacon on page unload for reliability
|
|
9
11
|
* - Exponential backoff retry on failure
|
|
12
|
+
* - Pauses when offline, resumes when online
|
|
13
|
+
* - Persists queue to localStorage for crash recovery
|
|
14
|
+
* - Calls onFlushError callback on failures
|
|
15
|
+
* - Circuit breaker to stop hammering failed servers
|
|
10
16
|
*/
|
|
11
17
|
export class Queue {
|
|
12
18
|
constructor(config) {
|
|
@@ -14,9 +20,25 @@ export class Queue {
|
|
|
14
20
|
this.timer = null;
|
|
15
21
|
this.flushPromise = null;
|
|
16
22
|
this.visibilityFlushPending = false;
|
|
23
|
+
this.destroyed = false;
|
|
24
|
+
this.isOnline = true;
|
|
25
|
+
this.circuitState = "closed";
|
|
26
|
+
this.consecutiveFailures = 0;
|
|
27
|
+
this.circuitOpenedAt = null;
|
|
28
|
+
this.clockOffset = 0;
|
|
29
|
+
this.boundVisibilityHandler = null;
|
|
30
|
+
this.boundBeforeUnloadHandler = null;
|
|
31
|
+
this.boundPageHideHandler = null;
|
|
32
|
+
this.boundOnlineHandler = null;
|
|
33
|
+
this.boundOfflineHandler = null;
|
|
17
34
|
this.config = config;
|
|
18
|
-
this.logger = createLogger("Queue", config.debug);
|
|
35
|
+
this.logger = createLogger("Queue", config.debug, config.structuredLogging);
|
|
36
|
+
if (typeof navigator !== "undefined") {
|
|
37
|
+
this.isOnline = navigator.onLine;
|
|
38
|
+
}
|
|
39
|
+
this.restoreFromStorage();
|
|
19
40
|
this.setupUnloadHandlers();
|
|
41
|
+
this.setupOnlineHandlers();
|
|
20
42
|
}
|
|
21
43
|
/**
|
|
22
44
|
* Set up handlers for page unload to ensure events are sent
|
|
@@ -24,7 +46,7 @@ export class Queue {
|
|
|
24
46
|
setupUnloadHandlers() {
|
|
25
47
|
if (typeof window === "undefined")
|
|
26
48
|
return;
|
|
27
|
-
|
|
49
|
+
this.boundVisibilityHandler = () => {
|
|
28
50
|
if (document.visibilityState === "hidden") {
|
|
29
51
|
if (this.visibilityFlushPending)
|
|
30
52
|
return;
|
|
@@ -34,20 +56,92 @@ export class Queue {
|
|
|
34
56
|
this.visibilityFlushPending = false;
|
|
35
57
|
}, 1000);
|
|
36
58
|
}
|
|
37
|
-
}
|
|
38
|
-
|
|
59
|
+
};
|
|
60
|
+
this.boundBeforeUnloadHandler = () => {
|
|
39
61
|
this.flush(true);
|
|
40
|
-
}
|
|
41
|
-
|
|
62
|
+
};
|
|
63
|
+
this.boundPageHideHandler = () => {
|
|
42
64
|
this.flush(true);
|
|
43
|
-
}
|
|
65
|
+
};
|
|
66
|
+
document.addEventListener("visibilitychange", this.boundVisibilityHandler);
|
|
67
|
+
window.addEventListener("beforeunload", this.boundBeforeUnloadHandler);
|
|
68
|
+
window.addEventListener("pagehide", this.boundPageHideHandler);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Set up handlers for online/offline detection
|
|
72
|
+
*/
|
|
73
|
+
setupOnlineHandlers() {
|
|
74
|
+
if (typeof window === "undefined")
|
|
75
|
+
return;
|
|
76
|
+
this.boundOnlineHandler = () => {
|
|
77
|
+
this.logger.log("Network online, resuming queue");
|
|
78
|
+
this.isOnline = true;
|
|
79
|
+
if (this.items.length > 0) {
|
|
80
|
+
this.flush();
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
this.boundOfflineHandler = () => {
|
|
84
|
+
this.logger.log("Network offline, pausing queue");
|
|
85
|
+
this.isOnline = false;
|
|
86
|
+
};
|
|
87
|
+
window.addEventListener("online", this.boundOnlineHandler);
|
|
88
|
+
window.addEventListener("offline", this.boundOfflineHandler);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Restore queue from persistent storage (crash recovery)
|
|
92
|
+
*/
|
|
93
|
+
restoreFromStorage() {
|
|
94
|
+
if (!this.config.persistQueue)
|
|
95
|
+
return;
|
|
96
|
+
if (typeof localStorage === "undefined")
|
|
97
|
+
return;
|
|
98
|
+
try {
|
|
99
|
+
const stored = localStorage.getItem(STORAGE_KEYS.QUEUE);
|
|
100
|
+
if (stored) {
|
|
101
|
+
const parsed = JSON.parse(stored);
|
|
102
|
+
if (Array.isArray(parsed) && parsed.length > 0) {
|
|
103
|
+
this.items = parsed;
|
|
104
|
+
this.logger.log(`Restored ${parsed.length} events from storage`);
|
|
105
|
+
localStorage.removeItem(STORAGE_KEYS.QUEUE);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.logger.log("Failed to restore queue from storage:", error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Persist queue to storage for crash recovery
|
|
115
|
+
*/
|
|
116
|
+
persistToStorage() {
|
|
117
|
+
if (!this.config.persistQueue)
|
|
118
|
+
return;
|
|
119
|
+
if (typeof localStorage === "undefined")
|
|
120
|
+
return;
|
|
121
|
+
try {
|
|
122
|
+
if (this.items.length === 0) {
|
|
123
|
+
localStorage.removeItem(STORAGE_KEYS.QUEUE);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const toStore = this.items.slice(0, this.config.maxPersistedEvents);
|
|
127
|
+
localStorage.setItem(STORAGE_KEYS.QUEUE, JSON.stringify(toStore));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.logger.log("Failed to persist queue to storage:", error);
|
|
132
|
+
}
|
|
44
133
|
}
|
|
45
134
|
/**
|
|
46
135
|
* Add an event to the queue
|
|
47
136
|
*/
|
|
48
137
|
push(event) {
|
|
138
|
+
if (this.destroyed) {
|
|
139
|
+
this.logger.warn("Cannot push to destroyed queue");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
49
142
|
this.items.push(event);
|
|
50
143
|
this.logger.log("Event queued:", event.type, "event" in event ? event.event : "");
|
|
144
|
+
this.persistToStorage();
|
|
51
145
|
if (this.items.length >= this.config.flushAt) {
|
|
52
146
|
this.logger.log("Batch size reached, flushing...");
|
|
53
147
|
this.flush();
|
|
@@ -64,6 +158,7 @@ export class Queue {
|
|
|
64
158
|
*
|
|
65
159
|
* @param useBeacon - Use sendBeacon for page unload scenarios
|
|
66
160
|
* @param depth - Internal recursion depth counter (prevents stack overflow)
|
|
161
|
+
* @returns FlushResult with success status and any errors
|
|
67
162
|
*/
|
|
68
163
|
async flush(useBeacon = false, depth = 0) {
|
|
69
164
|
const MAX_FLUSH_DEPTH = 3;
|
|
@@ -74,63 +169,207 @@ export class Queue {
|
|
|
74
169
|
this.flush();
|
|
75
170
|
}, this.config.flushInterval);
|
|
76
171
|
}
|
|
77
|
-
return
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
eventCount: 0,
|
|
175
|
+
errors: [new Error("Max flush depth reached")],
|
|
176
|
+
};
|
|
78
177
|
}
|
|
79
178
|
if (this.timer) {
|
|
80
179
|
clearTimeout(this.timer);
|
|
81
180
|
this.timer = null;
|
|
82
181
|
}
|
|
83
182
|
if (this.items.length === 0) {
|
|
84
|
-
return;
|
|
183
|
+
return { success: true, eventCount: 0 };
|
|
184
|
+
}
|
|
185
|
+
if (!this.isOnline && !useBeacon) {
|
|
186
|
+
this.logger.log("Offline, skipping flush (events remain queued)");
|
|
187
|
+
if (!this.timer) {
|
|
188
|
+
this.timer = setTimeout(() => {
|
|
189
|
+
if (this.isOnline) {
|
|
190
|
+
this.flush();
|
|
191
|
+
}
|
|
192
|
+
}, this.config.flushInterval);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
success: false,
|
|
196
|
+
eventCount: 0,
|
|
197
|
+
errors: [new Error("Network offline")],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
if (!useBeacon && !this.canAttemptRequest()) {
|
|
201
|
+
this.logger.log("Circuit breaker open, skipping flush (events remain queued)");
|
|
202
|
+
if (!this.timer) {
|
|
203
|
+
this.timer = setTimeout(() => {
|
|
204
|
+
this.flush();
|
|
205
|
+
}, this.config.circuitBreakerResetTimeout);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
success: false,
|
|
209
|
+
eventCount: 0,
|
|
210
|
+
errors: [new Error("Circuit breaker open")],
|
|
211
|
+
};
|
|
85
212
|
}
|
|
86
213
|
if (this.flushPromise) {
|
|
87
214
|
this.logger.log("Flush in progress, waiting...");
|
|
88
|
-
await this.flushPromise;
|
|
215
|
+
const result = await this.flushPromise;
|
|
89
216
|
if (this.items.length > 0) {
|
|
90
217
|
return this.flush(useBeacon, depth + 1);
|
|
91
218
|
}
|
|
92
|
-
return;
|
|
219
|
+
return result;
|
|
93
220
|
}
|
|
94
221
|
const batch = this.items.splice(0);
|
|
95
|
-
|
|
222
|
+
const batchCount = batch.length;
|
|
223
|
+
this.logger.log(`Flushing ${batchCount} events...`);
|
|
224
|
+
this.persistToStorage();
|
|
225
|
+
let result;
|
|
96
226
|
this.flushPromise = (async () => {
|
|
97
227
|
try {
|
|
98
228
|
if (useBeacon) {
|
|
99
|
-
this.sendWithBeacon(batch);
|
|
229
|
+
const success = this.sendWithBeacon(batch);
|
|
230
|
+
if (!success) {
|
|
231
|
+
this.items.unshift(...batch);
|
|
232
|
+
this.persistToStorage();
|
|
233
|
+
const error = new Error("sendBeacon returned false");
|
|
234
|
+
this.recordFailure();
|
|
235
|
+
this.notifyError(error, batch);
|
|
236
|
+
return { success: false, eventCount: batchCount, errors: [error] };
|
|
237
|
+
}
|
|
238
|
+
this.recordSuccess();
|
|
239
|
+
return { success: true, eventCount: batchCount };
|
|
100
240
|
}
|
|
101
241
|
else {
|
|
102
242
|
await this.sendWithRetry(batch);
|
|
243
|
+
this.logger.log("Flush successful");
|
|
244
|
+
this.recordSuccess();
|
|
245
|
+
return { success: true, eventCount: batchCount };
|
|
103
246
|
}
|
|
104
|
-
this.logger.log("Flush successful");
|
|
105
247
|
}
|
|
106
248
|
catch (error) {
|
|
107
249
|
this.items.unshift(...batch);
|
|
108
|
-
this.
|
|
250
|
+
this.persistToStorage();
|
|
251
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
252
|
+
this.logger.log("Flush failed, re-queued events:", err.message);
|
|
253
|
+
this.recordFailure();
|
|
254
|
+
this.notifyError(err, batch);
|
|
255
|
+
return { success: false, eventCount: batchCount, errors: [err] };
|
|
109
256
|
}
|
|
110
257
|
})();
|
|
111
258
|
try {
|
|
112
|
-
await this.flushPromise;
|
|
259
|
+
result = await this.flushPromise;
|
|
113
260
|
}
|
|
114
261
|
finally {
|
|
115
262
|
this.flushPromise = null;
|
|
116
263
|
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Notify error callback of flush failure
|
|
268
|
+
*/
|
|
269
|
+
notifyError(error, failedEvents) {
|
|
270
|
+
if (this.config.onFlushError) {
|
|
271
|
+
try {
|
|
272
|
+
this.config.onFlushError(error, failedEvents);
|
|
273
|
+
}
|
|
274
|
+
catch (callbackError) {
|
|
275
|
+
this.logger.warn("onFlushError callback threw:", callbackError);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Check if we can attempt a request based on circuit breaker state
|
|
281
|
+
*/
|
|
282
|
+
canAttemptRequest() {
|
|
283
|
+
if (this.circuitState === "closed") {
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
if (this.circuitState === "open" && this.circuitOpenedAt !== null) {
|
|
287
|
+
const elapsed = Date.now() - this.circuitOpenedAt;
|
|
288
|
+
if (elapsed >= this.config.circuitBreakerResetTimeout) {
|
|
289
|
+
this.circuitState = "half-open";
|
|
290
|
+
this.logger.log("Circuit breaker half-open, attempting test request");
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
return this.circuitState === "half-open";
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Record a successful request, closing the circuit
|
|
299
|
+
*/
|
|
300
|
+
recordSuccess() {
|
|
301
|
+
if (this.circuitState !== "closed") {
|
|
302
|
+
this.logger.log("Circuit breaker closed after successful request");
|
|
303
|
+
}
|
|
304
|
+
this.consecutiveFailures = 0;
|
|
305
|
+
this.circuitState = "closed";
|
|
306
|
+
this.circuitOpenedAt = null;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Record a failed request, potentially opening the circuit
|
|
310
|
+
*/
|
|
311
|
+
recordFailure() {
|
|
312
|
+
this.consecutiveFailures++;
|
|
313
|
+
this.logger.log(`Consecutive failures: ${this.consecutiveFailures}/${this.config.circuitBreakerThreshold}`);
|
|
314
|
+
if (this.consecutiveFailures >= this.config.circuitBreakerThreshold) {
|
|
315
|
+
this.circuitState = "open";
|
|
316
|
+
this.circuitOpenedAt = Date.now();
|
|
317
|
+
this.logger.log("Circuit breaker opened after consecutive failures");
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get the current circuit breaker state (for testing/debugging)
|
|
322
|
+
*/
|
|
323
|
+
get circuitBreakerState() {
|
|
324
|
+
return this.circuitState;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Update clock offset from server response
|
|
328
|
+
* Uses the Date header to calculate the difference between client and server time
|
|
329
|
+
*/
|
|
330
|
+
updateClockOffset(response, requestTime) {
|
|
331
|
+
const dateHeader = response.headers.get("Date");
|
|
332
|
+
if (!dateHeader)
|
|
333
|
+
return;
|
|
334
|
+
try {
|
|
335
|
+
const serverTime = new Date(dateHeader).getTime();
|
|
336
|
+
if (Number.isNaN(serverTime))
|
|
337
|
+
return;
|
|
338
|
+
const responseTime = Date.now();
|
|
339
|
+
const roundTripTime = responseTime - requestTime;
|
|
340
|
+
const estimatedServerTime = serverTime + roundTripTime / 2;
|
|
341
|
+
const clientTime = requestTime + roundTripTime / 2;
|
|
342
|
+
const newOffset = clientTime - estimatedServerTime;
|
|
343
|
+
if (Math.abs(newOffset) > 1000) {
|
|
344
|
+
this.clockOffset = this.clockOffset * 0.7 + newOffset * 0.3;
|
|
345
|
+
this.logger.log(`Clock offset updated: ${Math.round(this.clockOffset)}ms`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch { }
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get the current clock offset (for testing/debugging)
|
|
352
|
+
*/
|
|
353
|
+
getClockOffset() {
|
|
354
|
+
return this.clockOffset;
|
|
117
355
|
}
|
|
118
356
|
/**
|
|
119
357
|
* Send events using sendBeacon (for page unload)
|
|
358
|
+
* @returns true if sendBeacon succeeded, false otherwise
|
|
120
359
|
*/
|
|
121
360
|
sendWithBeacon(batch) {
|
|
122
361
|
if (typeof navigator === "undefined" || !navigator.sendBeacon) {
|
|
123
362
|
this.sendWithKeepalive(batch);
|
|
124
|
-
return;
|
|
363
|
+
return true;
|
|
125
364
|
}
|
|
126
365
|
const url = `${this.config.host}/api/v1/track`;
|
|
127
|
-
const payload = this.formatBatchPayload(batch);
|
|
366
|
+
const payload = this.formatBatchPayload(batch, true);
|
|
128
367
|
const blob = new Blob([JSON.stringify(payload)], {
|
|
129
368
|
type: "application/json",
|
|
130
369
|
});
|
|
131
|
-
const
|
|
132
|
-
const success = navigator.sendBeacon(urlWithKey, blob);
|
|
370
|
+
const success = navigator.sendBeacon(url, blob);
|
|
133
371
|
this.logger.log("sendBeacon result:", success);
|
|
372
|
+
return success;
|
|
134
373
|
}
|
|
135
374
|
/**
|
|
136
375
|
* Send events using fetch with keepalive (for page unload fallback)
|
|
@@ -148,7 +387,10 @@ export class Queue {
|
|
|
148
387
|
},
|
|
149
388
|
body: JSON.stringify(payload),
|
|
150
389
|
keepalive: true,
|
|
151
|
-
}).catch(() => {
|
|
390
|
+
}).catch((error) => {
|
|
391
|
+
this.logger.log("Keepalive fetch failed:", error);
|
|
392
|
+
this.notifyError(error instanceof Error ? error : new Error(String(error)), batch);
|
|
393
|
+
});
|
|
152
394
|
}
|
|
153
395
|
/**
|
|
154
396
|
* Send events with exponential backoff retry
|
|
@@ -157,8 +399,14 @@ export class Queue {
|
|
|
157
399
|
const url = `${this.config.host}/api/v1/track`;
|
|
158
400
|
const payload = this.formatBatchPayload(batch);
|
|
159
401
|
for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
|
|
402
|
+
if (!this.isOnline) {
|
|
403
|
+
throw new Error("Network went offline during retry");
|
|
404
|
+
}
|
|
405
|
+
let response;
|
|
406
|
+
let requestTime;
|
|
160
407
|
try {
|
|
161
|
-
|
|
408
|
+
requestTime = Date.now();
|
|
409
|
+
response = await fetch(url, {
|
|
162
410
|
method: "POST",
|
|
163
411
|
headers: {
|
|
164
412
|
"Content-Type": "application/json",
|
|
@@ -166,41 +414,53 @@ export class Queue {
|
|
|
166
414
|
},
|
|
167
415
|
body: JSON.stringify(payload),
|
|
168
416
|
});
|
|
169
|
-
if (response.ok) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
if (response.status >= 400 && response.status < 500) {
|
|
173
|
-
if (response.status === 429) {
|
|
174
|
-
this.logger.log("Rate limited, retrying...");
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
if (attempt === this.config.maxRetries) {
|
|
181
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
182
|
-
}
|
|
183
417
|
}
|
|
184
418
|
catch (error) {
|
|
185
419
|
if (attempt === this.config.maxRetries) {
|
|
186
420
|
throw error;
|
|
187
421
|
}
|
|
422
|
+
const baseDelay = 2 ** attempt * 1000;
|
|
423
|
+
const jitter = Math.random() * baseDelay * 0.5;
|
|
424
|
+
const delay = baseDelay + jitter;
|
|
425
|
+
this.logger.log(`Network error, retry ${attempt + 1}/${this.config.maxRetries} in ${Math.round(delay)}ms`);
|
|
426
|
+
await this.sleep(delay);
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
if (response.ok) {
|
|
430
|
+
this.updateClockOffset(response, requestTime);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
if (response.status >= 400 &&
|
|
434
|
+
response.status < 500 &&
|
|
435
|
+
response.status !== 429) {
|
|
436
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
437
|
+
}
|
|
438
|
+
if (response.status === 429) {
|
|
439
|
+
this.logger.log("Rate limited, retrying...");
|
|
440
|
+
}
|
|
441
|
+
if (attempt === this.config.maxRetries) {
|
|
442
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
188
443
|
}
|
|
189
444
|
const baseDelay = 2 ** attempt * 1000;
|
|
190
|
-
const jitter = Math.random() *
|
|
445
|
+
const jitter = Math.random() * baseDelay * 0.5;
|
|
191
446
|
const delay = baseDelay + jitter;
|
|
192
|
-
this.logger.log(`Retry ${attempt + 1}/${this.config.maxRetries} in ${delay}ms`);
|
|
447
|
+
this.logger.log(`Retry ${attempt + 1}/${this.config.maxRetries} in ${Math.round(delay)}ms`);
|
|
193
448
|
await this.sleep(delay);
|
|
194
449
|
}
|
|
195
450
|
}
|
|
196
451
|
/**
|
|
197
452
|
* Format events into batch payload for the API
|
|
198
453
|
*/
|
|
199
|
-
formatBatchPayload(batch) {
|
|
454
|
+
formatBatchPayload(batch, includeApiKey = false) {
|
|
200
455
|
return {
|
|
201
456
|
sentAt: new Date().toISOString(),
|
|
457
|
+
...(Math.abs(this.clockOffset) > 1000 && {
|
|
458
|
+
clockOffset: Math.round(this.clockOffset),
|
|
459
|
+
}),
|
|
460
|
+
...(includeApiKey && { apiKey: this.config.apiKey }),
|
|
202
461
|
batch: batch.map((event) => {
|
|
203
462
|
const base = {
|
|
463
|
+
messageId: event.messageId,
|
|
204
464
|
timestamp: event.timestamp,
|
|
205
465
|
anonymousId: event.anonymousId,
|
|
206
466
|
userId: event.userId,
|
|
@@ -259,5 +519,58 @@ export class Queue {
|
|
|
259
519
|
get length() {
|
|
260
520
|
return this.items.length;
|
|
261
521
|
}
|
|
522
|
+
/**
|
|
523
|
+
* Check if the queue is currently online
|
|
524
|
+
*/
|
|
525
|
+
get online() {
|
|
526
|
+
return this.isOnline;
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Destroy the queue, removing all event listeners and clearing timers.
|
|
530
|
+
* Attempts to flush remaining events before cleanup.
|
|
531
|
+
*/
|
|
532
|
+
async destroy() {
|
|
533
|
+
if (this.destroyed)
|
|
534
|
+
return;
|
|
535
|
+
this.destroyed = true;
|
|
536
|
+
this.logger.log("Destroying queue...");
|
|
537
|
+
if (this.timer) {
|
|
538
|
+
clearTimeout(this.timer);
|
|
539
|
+
this.timer = null;
|
|
540
|
+
}
|
|
541
|
+
if (this.items.length > 0) {
|
|
542
|
+
this.sendWithBeacon(this.items);
|
|
543
|
+
this.items = [];
|
|
544
|
+
}
|
|
545
|
+
if (this.config.persistQueue && typeof localStorage !== "undefined") {
|
|
546
|
+
try {
|
|
547
|
+
localStorage.removeItem(STORAGE_KEYS.QUEUE);
|
|
548
|
+
}
|
|
549
|
+
catch { }
|
|
550
|
+
}
|
|
551
|
+
if (typeof window !== "undefined") {
|
|
552
|
+
if (this.boundVisibilityHandler) {
|
|
553
|
+
document.removeEventListener("visibilitychange", this.boundVisibilityHandler);
|
|
554
|
+
this.boundVisibilityHandler = null;
|
|
555
|
+
}
|
|
556
|
+
if (this.boundBeforeUnloadHandler) {
|
|
557
|
+
window.removeEventListener("beforeunload", this.boundBeforeUnloadHandler);
|
|
558
|
+
this.boundBeforeUnloadHandler = null;
|
|
559
|
+
}
|
|
560
|
+
if (this.boundPageHideHandler) {
|
|
561
|
+
window.removeEventListener("pagehide", this.boundPageHideHandler);
|
|
562
|
+
this.boundPageHideHandler = null;
|
|
563
|
+
}
|
|
564
|
+
if (this.boundOnlineHandler) {
|
|
565
|
+
window.removeEventListener("online", this.boundOnlineHandler);
|
|
566
|
+
this.boundOnlineHandler = null;
|
|
567
|
+
}
|
|
568
|
+
if (this.boundOfflineHandler) {
|
|
569
|
+
window.removeEventListener("offline", this.boundOfflineHandler);
|
|
570
|
+
this.boundOfflineHandler = null;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
this.logger.log("Queue destroyed");
|
|
574
|
+
}
|
|
262
575
|
}
|
|
263
576
|
//# sourceMappingURL=queue.js.map
|
package/dist/core/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"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"}
|
package/dist/core/session.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AccountTraits, StorageInterface, UserState, UserTraits } from "./types";
|
|
2
2
|
/**
|
|
3
3
|
* Session manager handles:
|
|
4
|
-
* - Anonymous ID generation and persistence
|
|
4
|
+
* - Anonymous ID generation and persistence (with optional rotation)
|
|
5
5
|
* - User ID management
|
|
6
6
|
* - Session ID with timeout-based regeneration
|
|
7
7
|
* - User traits storage
|
|
@@ -10,10 +10,11 @@ import type { AccountTraits, StorageInterface, UserState, UserTraits } from "./t
|
|
|
10
10
|
export declare class Session {
|
|
11
11
|
private storage;
|
|
12
12
|
private sessionTimeout;
|
|
13
|
+
private anonymousIdMaxAge;
|
|
13
14
|
private currentSessionId;
|
|
14
15
|
private logger;
|
|
15
16
|
private broadcastChannel;
|
|
16
|
-
constructor(storage: StorageInterface, sessionTimeout: number, debug?: boolean);
|
|
17
|
+
constructor(storage: StorageInterface, sessionTimeout: number, debug?: boolean, anonymousIdMaxAge?: number);
|
|
17
18
|
/**
|
|
18
19
|
* Set up cross-tab session synchronization using BroadcastChannel
|
|
19
20
|
*/
|
|
@@ -27,7 +28,8 @@ export declare class Session {
|
|
|
27
28
|
*/
|
|
28
29
|
private broadcastMessage;
|
|
29
30
|
/**
|
|
30
|
-
* Get the anonymous ID, generating one if it doesn't exist
|
|
31
|
+
* Get the anonymous ID, generating one if it doesn't exist or has expired.
|
|
32
|
+
* If anonymousIdMaxAge is set, the ID will be rotated after that duration.
|
|
31
33
|
*/
|
|
32
34
|
getAnonymousId(): string;
|
|
33
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,MAAM,SAAS,CAAC;AAYjB;;;;;;;GAOG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAiC;gBAGxD,OAAO,EAAE,gBAAgB,EACzB,cAAc,EAAE,MAAM,EACtB,KAAK,UAAQ;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,MAAM,SAAS,CAAC;AAYjB;;;;;;;GAOG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAiC;gBAGxD,OAAO,EAAE,gBAAgB,EACzB,cAAc,EAAE,MAAM,EACtB,KAAK,UAAQ,EACb,iBAAiB,SAAI;IAWtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6B9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;OAGG;IACH,cAAc,IAAI,MAAM;IA4BxB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM/B;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,SAAS;IAWvC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAOvC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKrC;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,SAAS;IAW7C;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAO7C;;OAEG;IACH,YAAY,IAAI,MAAM;IAUtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAyBb;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,YAAY,IAAI,SAAS;CASzB"}
|