@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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +403 -0
  3. package/dist/core/analytics.d.ts +123 -0
  4. package/dist/core/analytics.d.ts.map +1 -0
  5. package/dist/core/analytics.js +334 -0
  6. package/dist/core/analytics.js.map +1 -0
  7. package/dist/core/errors.d.ts +94 -0
  8. package/dist/core/errors.d.ts.map +1 -0
  9. package/dist/core/errors.js +420 -0
  10. package/dist/core/errors.js.map +1 -0
  11. package/dist/core/logger.d.ts +28 -0
  12. package/dist/core/logger.d.ts.map +1 -0
  13. package/dist/core/logger.js +36 -0
  14. package/dist/core/logger.js.map +1 -0
  15. package/dist/core/logging.d.ts +12 -0
  16. package/dist/core/logging.d.ts.map +1 -0
  17. package/dist/core/logging.js +33 -0
  18. package/dist/core/logging.js.map +1 -0
  19. package/dist/core/privacy.d.ts +53 -0
  20. package/dist/core/privacy.d.ts.map +1 -0
  21. package/dist/core/privacy.js +94 -0
  22. package/dist/core/privacy.js.map +1 -0
  23. package/dist/core/queue.d.ts +59 -0
  24. package/dist/core/queue.d.ts.map +1 -0
  25. package/dist/core/queue.js +263 -0
  26. package/dist/core/queue.js.map +1 -0
  27. package/dist/core/session.d.ts +90 -0
  28. package/dist/core/session.d.ts.map +1 -0
  29. package/dist/core/session.js +246 -0
  30. package/dist/core/session.js.map +1 -0
  31. package/dist/core/storage.d.ts +64 -0
  32. package/dist/core/storage.d.ts.map +1 -0
  33. package/dist/core/storage.js +242 -0
  34. package/dist/core/storage.js.map +1 -0
  35. package/dist/core/types.d.ts +298 -0
  36. package/dist/core/types.d.ts.map +1 -0
  37. package/dist/core/types.js +34 -0
  38. package/dist/core/types.js.map +1 -0
  39. package/dist/core/validation.d.ts +11 -0
  40. package/dist/core/validation.d.ts.map +1 -0
  41. package/dist/core/validation.js +82 -0
  42. package/dist/core/validation.js.map +1 -0
  43. package/dist/core/version.d.ts +2 -0
  44. package/dist/core/version.d.ts.map +1 -0
  45. package/dist/core/version.js +4 -0
  46. package/dist/core/version.js.map +1 -0
  47. package/dist/index.d.ts +45 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +41 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/next/analytics.d.ts +59 -0
  52. package/dist/next/analytics.d.ts.map +1 -0
  53. package/dist/next/analytics.js +87 -0
  54. package/dist/next/analytics.js.map +1 -0
  55. package/dist/next.d.ts +46 -0
  56. package/dist/next.d.ts.map +1 -0
  57. package/dist/next.js +44 -0
  58. package/dist/next.js.map +1 -0
  59. package/dist/react/analytics.d.ts +51 -0
  60. package/dist/react/analytics.d.ts.map +1 -0
  61. package/dist/react/analytics.js +63 -0
  62. package/dist/react/analytics.js.map +1 -0
  63. package/dist/react/bug-report-widget.d.ts +21 -0
  64. package/dist/react/bug-report-widget.d.ts.map +1 -0
  65. package/dist/react/bug-report-widget.js +34 -0
  66. package/dist/react/bug-report-widget.js.map +1 -0
  67. package/dist/react/hooks.d.ts +141 -0
  68. package/dist/react/hooks.d.ts.map +1 -0
  69. package/dist/react/hooks.js +186 -0
  70. package/dist/react/hooks.js.map +1 -0
  71. package/dist/react.d.ts +42 -0
  72. package/dist/react.d.ts.map +1 -0
  73. package/dist/react.js +39 -0
  74. package/dist/react.js.map +1 -0
  75. package/dist/widget/bug-report.d.ts +16 -0
  76. package/dist/widget/bug-report.d.ts.map +1 -0
  77. package/dist/widget/bug-report.js +416 -0
  78. package/dist/widget/bug-report.js.map +1 -0
  79. 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":"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"}
@@ -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"}