@thisbefine/analytics 0.1.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/LICENSE +21 -0
- package/README.md +403 -0
- package/dist/core/analytics.d.ts +123 -0
- package/dist/core/analytics.d.ts.map +1 -0
- package/dist/core/analytics.js +334 -0
- package/dist/core/analytics.js.map +1 -0
- package/dist/core/errors.d.ts +94 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +420 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +28 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +36 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/logging.d.ts +12 -0
- package/dist/core/logging.d.ts.map +1 -0
- package/dist/core/logging.js +33 -0
- package/dist/core/logging.js.map +1 -0
- package/dist/core/privacy.d.ts +53 -0
- package/dist/core/privacy.d.ts.map +1 -0
- package/dist/core/privacy.js +94 -0
- package/dist/core/privacy.js.map +1 -0
- package/dist/core/queue.d.ts +59 -0
- package/dist/core/queue.d.ts.map +1 -0
- package/dist/core/queue.js +263 -0
- package/dist/core/queue.js.map +1 -0
- package/dist/core/session.d.ts +90 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +246 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/storage.d.ts +64 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/storage.js +242 -0
- package/dist/core/storage.js.map +1 -0
- package/dist/core/types.d.ts +298 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +34 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validation.d.ts +11 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +82 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +4 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/next/analytics.d.ts +59 -0
- package/dist/next/analytics.d.ts.map +1 -0
- package/dist/next/analytics.js +87 -0
- package/dist/next/analytics.js.map +1 -0
- package/dist/next.d.ts +46 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +44 -0
- package/dist/next.js.map +1 -0
- package/dist/react/analytics.d.ts +51 -0
- package/dist/react/analytics.d.ts.map +1 -0
- package/dist/react/analytics.js +63 -0
- package/dist/react/analytics.js.map +1 -0
- package/dist/react/bug-report-widget.d.ts +21 -0
- package/dist/react/bug-report-widget.d.ts.map +1 -0
- package/dist/react/bug-report-widget.js +34 -0
- package/dist/react/bug-report-widget.js.map +1 -0
- package/dist/react/hooks.d.ts +141 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/hooks.js +186 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react.d.ts +42 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +39 -0
- package/dist/react.js.map +1 -0
- package/dist/widget/bug-report.d.ts +16 -0
- package/dist/widget/bug-report.d.ts.map +1 -0
- package/dist/widget/bug-report.js +416 -0
- package/dist/widget/bug-report.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { STORAGE_KEYS } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Privacy manager handles:
|
|
4
|
+
* - Do Not Track (DNT) detection
|
|
5
|
+
* - Global Privacy Control (GPC) detection
|
|
6
|
+
* - User opt-out/opt-in state
|
|
7
|
+
*/
|
|
8
|
+
export class Privacy {
|
|
9
|
+
constructor(storage, respectDNT, debug = false) {
|
|
10
|
+
this.storage = storage;
|
|
11
|
+
this.respectDNT = respectDNT;
|
|
12
|
+
this.debug = debug;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if Do Not Track is enabled in the browser
|
|
16
|
+
*/
|
|
17
|
+
isDNTEnabled() {
|
|
18
|
+
if (typeof navigator === "undefined")
|
|
19
|
+
return false;
|
|
20
|
+
const dnt = navigator.doNotTrack ||
|
|
21
|
+
window.doNotTrack ||
|
|
22
|
+
navigator.msDoNotTrack;
|
|
23
|
+
return dnt === "1" || dnt === "yes";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if Global Privacy Control is enabled
|
|
27
|
+
* GPC is a newer standard that's gaining adoption
|
|
28
|
+
*/
|
|
29
|
+
isGPCEnabled() {
|
|
30
|
+
if (typeof navigator === "undefined")
|
|
31
|
+
return false;
|
|
32
|
+
return (navigator
|
|
33
|
+
.globalPrivacyControl === true);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if the user has explicitly opted out
|
|
37
|
+
*/
|
|
38
|
+
isOptedOut() {
|
|
39
|
+
return this.storage.get(STORAGE_KEYS.OPT_OUT) === "true";
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Opt out of tracking
|
|
43
|
+
*/
|
|
44
|
+
optOut() {
|
|
45
|
+
this.storage.set(STORAGE_KEYS.OPT_OUT, "true");
|
|
46
|
+
this.log("User opted out of tracking");
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Opt back in to tracking
|
|
50
|
+
*/
|
|
51
|
+
optIn() {
|
|
52
|
+
this.storage.remove(STORAGE_KEYS.OPT_OUT);
|
|
53
|
+
this.log("User opted in to tracking");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if tracking should be allowed based on all privacy signals
|
|
57
|
+
*/
|
|
58
|
+
shouldTrack() {
|
|
59
|
+
if (this.isOptedOut()) {
|
|
60
|
+
this.log("Tracking blocked: user opted out");
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (this.respectDNT && this.isDNTEnabled()) {
|
|
64
|
+
this.log("Tracking blocked: DNT enabled");
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (this.respectDNT && this.isGPCEnabled()) {
|
|
68
|
+
this.log("Tracking blocked: GPC enabled");
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get a summary of privacy signals for debugging
|
|
75
|
+
*/
|
|
76
|
+
getPrivacyStatus() {
|
|
77
|
+
return {
|
|
78
|
+
dntEnabled: this.isDNTEnabled(),
|
|
79
|
+
gpcEnabled: this.isGPCEnabled(),
|
|
80
|
+
optedOut: this.isOptedOut(),
|
|
81
|
+
respectDNT: this.respectDNT,
|
|
82
|
+
trackingAllowed: this.shouldTrack(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Debug logger
|
|
87
|
+
*/
|
|
88
|
+
log(...args) {
|
|
89
|
+
if (this.debug && typeof console !== "undefined") {
|
|
90
|
+
console.log("[Thisbefine Privacy]", ...args);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=privacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/core/privacy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IAKnB,YAAY,OAAyB,EAAE,UAAmB,EAAE,KAAK,GAAG,KAAK;QACxE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,YAAY;QACX,IAAI,OAAO,SAAS,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAEnD,MAAM,GAAG,GACR,SAAS,CAAC,UAAU;YACnB,MAA6C,CAAC,UAAU;YACxD,SAAkD,CAAC,YAAY,CAAC;QAElE,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,YAAY;QACX,IAAI,OAAO,SAAS,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAEnD,OAAO,CACL,SAA2D;aAC1D,oBAAoB,KAAK,IAAI,CAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,MAAM;QACL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,WAAW;QACV,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAC7C,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;OAEG;IACH,gBAAgB;QAOf,OAAO;YACN,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE;YAC/B,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE;YAC/B,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE;SACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,GAAG,CAAC,GAAG,IAAe;QAC7B,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { AnalyticsEvent, ResolvedConfig } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Event queue with batching, automatic flushing, and retry logic
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Batches events up to flushAt threshold
|
|
7
|
+
* - Flushes automatically after flushInterval
|
|
8
|
+
* - Uses sendBeacon on page unload for reliability
|
|
9
|
+
* - Exponential backoff retry on failure
|
|
10
|
+
*/
|
|
11
|
+
export declare class Queue {
|
|
12
|
+
private items;
|
|
13
|
+
private timer;
|
|
14
|
+
private flushPromise;
|
|
15
|
+
private visibilityFlushPending;
|
|
16
|
+
private config;
|
|
17
|
+
private logger;
|
|
18
|
+
constructor(config: ResolvedConfig);
|
|
19
|
+
/**
|
|
20
|
+
* Set up handlers for page unload to ensure events are sent
|
|
21
|
+
*/
|
|
22
|
+
private setupUnloadHandlers;
|
|
23
|
+
/**
|
|
24
|
+
* Add an event to the queue
|
|
25
|
+
*/
|
|
26
|
+
push(event: AnalyticsEvent): void;
|
|
27
|
+
/**
|
|
28
|
+
* Flush the queue, sending all pending events
|
|
29
|
+
*
|
|
30
|
+
* @param useBeacon - Use sendBeacon for page unload scenarios
|
|
31
|
+
* @param depth - Internal recursion depth counter (prevents stack overflow)
|
|
32
|
+
*/
|
|
33
|
+
flush(useBeacon?: boolean, depth?: number): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Send events using sendBeacon (for page unload)
|
|
36
|
+
*/
|
|
37
|
+
private sendWithBeacon;
|
|
38
|
+
/**
|
|
39
|
+
* Send events using fetch with keepalive (for page unload fallback)
|
|
40
|
+
*/
|
|
41
|
+
private sendWithKeepalive;
|
|
42
|
+
/**
|
|
43
|
+
* Send events with exponential backoff retry
|
|
44
|
+
*/
|
|
45
|
+
private sendWithRetry;
|
|
46
|
+
/**
|
|
47
|
+
* Format events into batch payload for the API
|
|
48
|
+
*/
|
|
49
|
+
private formatBatchPayload;
|
|
50
|
+
/**
|
|
51
|
+
* Sleep helper for retry backoff
|
|
52
|
+
*/
|
|
53
|
+
private sleep;
|
|
54
|
+
/**
|
|
55
|
+
* Get the number of events in the queue
|
|
56
|
+
*/
|
|
57
|
+
get length(): number;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9D;;;;;;;;GAQG;AACH,qBAAa,KAAK;IACjB,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,cAAc;IAOlC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAmBjC;;;;;OAKG;IACG,KAAK,CAAC,SAAS,UAAQ,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DxD;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;YACW,aAAa;IA+C3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4D1B;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;CACD"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { createLogger } from "./logger";
|
|
2
|
+
/**
|
|
3
|
+
* Event queue with batching, automatic flushing, and retry logic
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Batches events up to flushAt threshold
|
|
7
|
+
* - Flushes automatically after flushInterval
|
|
8
|
+
* - Uses sendBeacon on page unload for reliability
|
|
9
|
+
* - Exponential backoff retry on failure
|
|
10
|
+
*/
|
|
11
|
+
export class Queue {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.items = [];
|
|
14
|
+
this.timer = null;
|
|
15
|
+
this.flushPromise = null;
|
|
16
|
+
this.visibilityFlushPending = false;
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.logger = createLogger("Queue", config.debug);
|
|
19
|
+
this.setupUnloadHandlers();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set up handlers for page unload to ensure events are sent
|
|
23
|
+
*/
|
|
24
|
+
setupUnloadHandlers() {
|
|
25
|
+
if (typeof window === "undefined")
|
|
26
|
+
return;
|
|
27
|
+
document.addEventListener("visibilitychange", () => {
|
|
28
|
+
if (document.visibilityState === "hidden") {
|
|
29
|
+
if (this.visibilityFlushPending)
|
|
30
|
+
return;
|
|
31
|
+
this.visibilityFlushPending = true;
|
|
32
|
+
this.flush(true);
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
this.visibilityFlushPending = false;
|
|
35
|
+
}, 1000);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
window.addEventListener("beforeunload", () => {
|
|
39
|
+
this.flush(true);
|
|
40
|
+
});
|
|
41
|
+
window.addEventListener("pagehide", () => {
|
|
42
|
+
this.flush(true);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Add an event to the queue
|
|
47
|
+
*/
|
|
48
|
+
push(event) {
|
|
49
|
+
this.items.push(event);
|
|
50
|
+
this.logger.log("Event queued:", event.type, "event" in event ? event.event : "");
|
|
51
|
+
if (this.items.length >= this.config.flushAt) {
|
|
52
|
+
this.logger.log("Batch size reached, flushing...");
|
|
53
|
+
this.flush();
|
|
54
|
+
}
|
|
55
|
+
else if (!this.timer) {
|
|
56
|
+
this.timer = setTimeout(() => {
|
|
57
|
+
this.logger.log("Flush interval reached, flushing...");
|
|
58
|
+
this.flush();
|
|
59
|
+
}, this.config.flushInterval);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Flush the queue, sending all pending events
|
|
64
|
+
*
|
|
65
|
+
* @param useBeacon - Use sendBeacon for page unload scenarios
|
|
66
|
+
* @param depth - Internal recursion depth counter (prevents stack overflow)
|
|
67
|
+
*/
|
|
68
|
+
async flush(useBeacon = false, depth = 0) {
|
|
69
|
+
const MAX_FLUSH_DEPTH = 3;
|
|
70
|
+
if (depth >= MAX_FLUSH_DEPTH) {
|
|
71
|
+
this.logger.warn(`Max flush depth (${MAX_FLUSH_DEPTH}) reached, ${this.items.length} events remain queued`);
|
|
72
|
+
if (this.items.length > 0 && !this.timer) {
|
|
73
|
+
this.timer = setTimeout(() => {
|
|
74
|
+
this.flush();
|
|
75
|
+
}, this.config.flushInterval);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (this.timer) {
|
|
80
|
+
clearTimeout(this.timer);
|
|
81
|
+
this.timer = null;
|
|
82
|
+
}
|
|
83
|
+
if (this.items.length === 0) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (this.flushPromise) {
|
|
87
|
+
this.logger.log("Flush in progress, waiting...");
|
|
88
|
+
await this.flushPromise;
|
|
89
|
+
if (this.items.length > 0) {
|
|
90
|
+
return this.flush(useBeacon, depth + 1);
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const batch = this.items.splice(0);
|
|
95
|
+
this.logger.log(`Flushing ${batch.length} events...`);
|
|
96
|
+
this.flushPromise = (async () => {
|
|
97
|
+
try {
|
|
98
|
+
if (useBeacon) {
|
|
99
|
+
this.sendWithBeacon(batch);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
await this.sendWithRetry(batch);
|
|
103
|
+
}
|
|
104
|
+
this.logger.log("Flush successful");
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.items.unshift(...batch);
|
|
108
|
+
this.logger.log("Flush failed, re-queued events:", error);
|
|
109
|
+
}
|
|
110
|
+
})();
|
|
111
|
+
try {
|
|
112
|
+
await this.flushPromise;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
this.flushPromise = null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Send events using sendBeacon (for page unload)
|
|
120
|
+
*/
|
|
121
|
+
sendWithBeacon(batch) {
|
|
122
|
+
if (typeof navigator === "undefined" || !navigator.sendBeacon) {
|
|
123
|
+
this.sendWithKeepalive(batch);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const url = `${this.config.host}/api/v1/track`;
|
|
127
|
+
const payload = this.formatBatchPayload(batch);
|
|
128
|
+
const blob = new Blob([JSON.stringify(payload)], {
|
|
129
|
+
type: "application/json",
|
|
130
|
+
});
|
|
131
|
+
const urlWithKey = `${url}?key=${encodeURIComponent(this.config.apiKey)}`;
|
|
132
|
+
const success = navigator.sendBeacon(urlWithKey, blob);
|
|
133
|
+
this.logger.log("sendBeacon result:", success);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Send events using fetch with keepalive (for page unload fallback)
|
|
137
|
+
*/
|
|
138
|
+
sendWithKeepalive(batch) {
|
|
139
|
+
if (typeof fetch === "undefined")
|
|
140
|
+
return;
|
|
141
|
+
const url = `${this.config.host}/api/v1/track`;
|
|
142
|
+
const payload = this.formatBatchPayload(batch);
|
|
143
|
+
fetch(url, {
|
|
144
|
+
method: "POST",
|
|
145
|
+
headers: {
|
|
146
|
+
"Content-Type": "application/json",
|
|
147
|
+
"X-API-Key": this.config.apiKey,
|
|
148
|
+
},
|
|
149
|
+
body: JSON.stringify(payload),
|
|
150
|
+
keepalive: true,
|
|
151
|
+
}).catch(() => { });
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Send events with exponential backoff retry
|
|
155
|
+
*/
|
|
156
|
+
async sendWithRetry(batch) {
|
|
157
|
+
const url = `${this.config.host}/api/v1/track`;
|
|
158
|
+
const payload = this.formatBatchPayload(batch);
|
|
159
|
+
for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
|
|
160
|
+
try {
|
|
161
|
+
const response = await fetch(url, {
|
|
162
|
+
method: "POST",
|
|
163
|
+
headers: {
|
|
164
|
+
"Content-Type": "application/json",
|
|
165
|
+
"X-API-Key": this.config.apiKey,
|
|
166
|
+
},
|
|
167
|
+
body: JSON.stringify(payload),
|
|
168
|
+
});
|
|
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
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (attempt === this.config.maxRetries) {
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const baseDelay = 2 ** attempt * 1000;
|
|
190
|
+
const jitter = Math.random() * 1000;
|
|
191
|
+
const delay = baseDelay + jitter;
|
|
192
|
+
this.logger.log(`Retry ${attempt + 1}/${this.config.maxRetries} in ${delay}ms`);
|
|
193
|
+
await this.sleep(delay);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Format events into batch payload for the API
|
|
198
|
+
*/
|
|
199
|
+
formatBatchPayload(batch) {
|
|
200
|
+
return {
|
|
201
|
+
sentAt: new Date().toISOString(),
|
|
202
|
+
batch: batch.map((event) => {
|
|
203
|
+
const base = {
|
|
204
|
+
timestamp: event.timestamp,
|
|
205
|
+
anonymousId: event.anonymousId,
|
|
206
|
+
userId: event.userId,
|
|
207
|
+
sessionId: event.sessionId,
|
|
208
|
+
accountId: event.accountId,
|
|
209
|
+
};
|
|
210
|
+
switch (event.type) {
|
|
211
|
+
case "track":
|
|
212
|
+
return {
|
|
213
|
+
...base,
|
|
214
|
+
event: event.event,
|
|
215
|
+
properties: event.properties,
|
|
216
|
+
url: event.context?.page?.url,
|
|
217
|
+
referrer: event.context?.page?.referrer,
|
|
218
|
+
};
|
|
219
|
+
case "page":
|
|
220
|
+
return {
|
|
221
|
+
...base,
|
|
222
|
+
event: "$pageview",
|
|
223
|
+
properties: {
|
|
224
|
+
...event.properties,
|
|
225
|
+
name: event.name,
|
|
226
|
+
title: event.context?.page?.title,
|
|
227
|
+
},
|
|
228
|
+
url: event.url,
|
|
229
|
+
referrer: event.referrer,
|
|
230
|
+
};
|
|
231
|
+
case "identify":
|
|
232
|
+
return {
|
|
233
|
+
...base,
|
|
234
|
+
event: "$identify",
|
|
235
|
+
properties: event.traits,
|
|
236
|
+
};
|
|
237
|
+
case "group":
|
|
238
|
+
return {
|
|
239
|
+
...base,
|
|
240
|
+
event: "$group",
|
|
241
|
+
accountId: event.accountId,
|
|
242
|
+
properties: event.traits,
|
|
243
|
+
};
|
|
244
|
+
default:
|
|
245
|
+
return base;
|
|
246
|
+
}
|
|
247
|
+
}),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Sleep helper for retry backoff
|
|
252
|
+
*/
|
|
253
|
+
sleep(ms) {
|
|
254
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get the number of events in the queue
|
|
258
|
+
*/
|
|
259
|
+
get length() {
|
|
260
|
+
return this.items.length;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAGrD;;;;;;;;GAQG;AACH,MAAM,OAAO,KAAK;IAQjB,YAAY,MAAsB;QAP1B,UAAK,GAAqB,EAAE,CAAC;QAC7B,UAAK,GAAyC,IAAI,CAAC;QACnD,iBAAY,GAAyB,IAAI,CAAC;QAC1C,2BAAsB,GAAG,KAAK,CAAC;QAKtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,mBAAmB;QAC1B,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAE1C,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAClD,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;gBAC3C,IAAI,IAAI,CAAC,sBAAsB;oBAAE,OAAO;gBACxC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;gBACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjB,UAAU,CAAC,GAAG,EAAE;oBACf,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;gBACrC,CAAC,EAAE,IAAI,CAAC,CAAC;YACV,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE;YAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,KAAqB;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CACd,eAAe,EACf,KAAK,CAAC,IAAI,EACV,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACd,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,EAAE,KAAK,GAAG,CAAC;QACvC,MAAM,eAAe,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CACf,oBAAoB,eAAe,cAAc,IAAI,CAAC,KAAK,CAAC,MAAM,uBAAuB,CACzF,CAAC;YAEF,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1C,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACd,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO;QACR,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;QACR,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,YAAY,CAAC;YACxB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,OAAO;QACR,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC;QAEtD,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/B,IAAI,CAAC;gBACJ,IAAI,SAAS,EAAE,CAAC;oBACf,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACP,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,YAAY,CAAC;QACzB,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAuB;QAC7C,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YAC/D,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO;QACR,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE;YAChD,IAAI,EAAE,kBAAkB;SACxB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,GAAG,GAAG,QAAQ,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAE1E,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAuB;QAChD,IAAI,OAAO,KAAK,KAAK,WAAW;YAAE,OAAO;QAEzC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE/C,KAAK,CAAC,GAAG,EAAE;YACV,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAC/B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,SAAS,EAAE,IAAI;SACf,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,KAAuB;QAClD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE/C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACpE,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBACjC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACR,cAAc,EAAE,kBAAkB;wBAClC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;qBAC/B;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;iBAC7B,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO;gBACR,CAAC;gBAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;oBAC9C,CAAC;yBAAM,CAAC;wBACP,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;oBACpE,CAAC;gBACF,CAAC;gBAED,IAAI,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACpE,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACxC,MAAM,KAAK,CAAC;gBACb,CAAC;YACF,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;YACpC,MAAM,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;YAEjC,IAAI,CAAC,MAAM,CAAC,GAAG,CACd,SAAS,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,OAAO,KAAK,IAAI,CAC9D,CAAC;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,KAAuB;QAIjD,OAAO;YACN,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAChC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC1B,MAAM,IAAI,GAAG;oBACZ,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC1B,CAAC;gBAEF,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpB,KAAK,OAAO;wBACX,OAAO;4BACN,GAAG,IAAI;4BACP,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG;4BAC7B,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ;yBACvC,CAAC;oBAEH,KAAK,MAAM;wBACV,OAAO;4BACN,GAAG,IAAI;4BACP,KAAK,EAAE,WAAW;4BAClB,UAAU,EAAE;gCACX,GAAG,KAAK,CAAC,UAAU;gCACnB,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK;6BACjC;4BACD,GAAG,EAAE,KAAK,CAAC,GAAG;4BACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;yBACxB,CAAC;oBAEH,KAAK,UAAU;wBACd,OAAO;4BACN,GAAG,IAAI;4BACP,KAAK,EAAE,WAAW;4BAClB,UAAU,EAAE,KAAK,CAAC,MAAM;yBACxB,CAAC;oBAEH,KAAK,OAAO;wBACX,OAAO;4BACN,GAAG,IAAI;4BACP,KAAK,EAAE,QAAQ;4BACf,SAAS,EAAE,KAAK,CAAC,SAAS;4BAC1B,UAAU,EAAE,KAAK,CAAC,MAAM;yBACxB,CAAC;oBAEH;wBACC,OAAO,IAAI,CAAC;gBACd,CAAC;YACF,CAAC,CAAC;SACF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,EAAU;QACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B,CAAC;CACD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { AccountTraits, StorageInterface, UserState, UserTraits } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Session manager handles:
|
|
4
|
+
* - Anonymous ID generation and persistence
|
|
5
|
+
* - User ID management
|
|
6
|
+
* - Session ID with timeout-based regeneration
|
|
7
|
+
* - User traits storage
|
|
8
|
+
* - Cross-tab synchronization via BroadcastChannel
|
|
9
|
+
*/
|
|
10
|
+
export declare class Session {
|
|
11
|
+
private storage;
|
|
12
|
+
private sessionTimeout;
|
|
13
|
+
private currentSessionId;
|
|
14
|
+
private logger;
|
|
15
|
+
private broadcastChannel;
|
|
16
|
+
constructor(storage: StorageInterface, sessionTimeout: number, debug?: boolean);
|
|
17
|
+
/**
|
|
18
|
+
* Set up cross-tab session synchronization using BroadcastChannel
|
|
19
|
+
*/
|
|
20
|
+
private setupCrossTabSync;
|
|
21
|
+
/**
|
|
22
|
+
* Handle messages from other tabs
|
|
23
|
+
*/
|
|
24
|
+
private handleBroadcastMessage;
|
|
25
|
+
/**
|
|
26
|
+
* Broadcast a message to other tabs
|
|
27
|
+
*/
|
|
28
|
+
private broadcastMessage;
|
|
29
|
+
/**
|
|
30
|
+
* Get the anonymous ID, generating one if it doesn't exist
|
|
31
|
+
*/
|
|
32
|
+
getAnonymousId(): string;
|
|
33
|
+
/**
|
|
34
|
+
* Get the current user ID (if identified)
|
|
35
|
+
*/
|
|
36
|
+
getUserId(): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Set the user ID (called during identify)
|
|
39
|
+
*/
|
|
40
|
+
setUserId(userId: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get user traits
|
|
43
|
+
*/
|
|
44
|
+
getUserTraits(): UserTraits | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Set user traits (merges with existing traits)
|
|
47
|
+
*/
|
|
48
|
+
setUserTraits(traits: UserTraits): void;
|
|
49
|
+
/**
|
|
50
|
+
* Get the current account ID (if grouped)
|
|
51
|
+
*/
|
|
52
|
+
getAccountId(): string | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Set the account ID (called during group)
|
|
55
|
+
*/
|
|
56
|
+
setAccountId(accountId: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Get account traits
|
|
59
|
+
*/
|
|
60
|
+
getAccountTraits(): AccountTraits | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Set account traits (merges with existing traits)
|
|
63
|
+
*/
|
|
64
|
+
setAccountTraits(traits: AccountTraits): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get the current session ID, creating a new one if the session has expired
|
|
67
|
+
*/
|
|
68
|
+
getSessionId(): string;
|
|
69
|
+
/**
|
|
70
|
+
* Check if the session has expired and create a new one if needed
|
|
71
|
+
*/
|
|
72
|
+
private ensureSession;
|
|
73
|
+
/**
|
|
74
|
+
* Update the last activity timestamp
|
|
75
|
+
*/
|
|
76
|
+
updateLastActivity(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Reset the session (clear user, account, and session data)
|
|
79
|
+
*/
|
|
80
|
+
reset(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Clean up resources (call when destroying the analytics instance)
|
|
83
|
+
*/
|
|
84
|
+
destroy(): void;
|
|
85
|
+
/**
|
|
86
|
+
* Get the full user state
|
|
87
|
+
*/
|
|
88
|
+
getUserState(): UserState;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +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;IAUd;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA6B9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,cAAc,IAAI,MAAM;IAYxB;;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;IAwBb;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,YAAY,IAAI,SAAS;CASzB"}
|