@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,246 @@
|
|
|
1
|
+
import { createLogger } from "./logger";
|
|
2
|
+
import { generateId } from "./storage";
|
|
3
|
+
import { STORAGE_KEYS } from "./types";
|
|
4
|
+
const BROADCAST_CHANNEL_NAME = "thisbefine_session";
|
|
5
|
+
/**
|
|
6
|
+
* Session manager handles:
|
|
7
|
+
* - Anonymous ID generation and persistence
|
|
8
|
+
* - User ID management
|
|
9
|
+
* - Session ID with timeout-based regeneration
|
|
10
|
+
* - User traits storage
|
|
11
|
+
* - Cross-tab synchronization via BroadcastChannel
|
|
12
|
+
*/
|
|
13
|
+
export class Session {
|
|
14
|
+
constructor(storage, sessionTimeout, debug = false) {
|
|
15
|
+
this.currentSessionId = null;
|
|
16
|
+
this.broadcastChannel = null;
|
|
17
|
+
this.storage = storage;
|
|
18
|
+
this.sessionTimeout = sessionTimeout;
|
|
19
|
+
this.logger = createLogger("Session", debug);
|
|
20
|
+
this.ensureSession();
|
|
21
|
+
this.setupCrossTabSync();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Set up cross-tab session synchronization using BroadcastChannel
|
|
25
|
+
*/
|
|
26
|
+
setupCrossTabSync() {
|
|
27
|
+
if (typeof BroadcastChannel === "undefined") {
|
|
28
|
+
this.logger.log("BroadcastChannel not available, cross-tab sync disabled");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
this.broadcastChannel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);
|
|
33
|
+
this.broadcastChannel.onmessage = (event) => {
|
|
34
|
+
this.handleBroadcastMessage(event.data);
|
|
35
|
+
};
|
|
36
|
+
this.logger.log("Cross-tab sync enabled");
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
this.logger.log("Failed to create BroadcastChannel");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Handle messages from other tabs
|
|
44
|
+
*/
|
|
45
|
+
handleBroadcastMessage(message) {
|
|
46
|
+
switch (message.type) {
|
|
47
|
+
case "reset":
|
|
48
|
+
this.currentSessionId = this.storage.get(STORAGE_KEYS.SESSION_ID);
|
|
49
|
+
this.logger.log("Session synced from another tab (reset)");
|
|
50
|
+
break;
|
|
51
|
+
case "identify":
|
|
52
|
+
this.logger.log("User identified in another tab:", message.userId);
|
|
53
|
+
break;
|
|
54
|
+
case "sync_request":
|
|
55
|
+
this.broadcastMessage({
|
|
56
|
+
type: "sync_response",
|
|
57
|
+
sessionId: this.currentSessionId ?? undefined,
|
|
58
|
+
anonymousId: this.storage.get(STORAGE_KEYS.ANONYMOUS_ID) ?? undefined,
|
|
59
|
+
userId: this.storage.get(STORAGE_KEYS.USER_ID) ?? undefined,
|
|
60
|
+
});
|
|
61
|
+
break;
|
|
62
|
+
case "sync_response":
|
|
63
|
+
if (message.sessionId && message.sessionId !== this.currentSessionId) {
|
|
64
|
+
this.currentSessionId = message.sessionId;
|
|
65
|
+
this.logger.log("Session synced from another tab");
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Broadcast a message to other tabs
|
|
72
|
+
*/
|
|
73
|
+
broadcastMessage(message) {
|
|
74
|
+
try {
|
|
75
|
+
this.broadcastChannel?.postMessage(message);
|
|
76
|
+
}
|
|
77
|
+
catch { }
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the anonymous ID, generating one if it doesn't exist
|
|
81
|
+
*/
|
|
82
|
+
getAnonymousId() {
|
|
83
|
+
let anonymousId = this.storage.get(STORAGE_KEYS.ANONYMOUS_ID);
|
|
84
|
+
if (!anonymousId) {
|
|
85
|
+
anonymousId = generateId();
|
|
86
|
+
this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, anonymousId);
|
|
87
|
+
this.logger.log("Generated new anonymous ID:", anonymousId);
|
|
88
|
+
}
|
|
89
|
+
return anonymousId;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the current user ID (if identified)
|
|
93
|
+
*/
|
|
94
|
+
getUserId() {
|
|
95
|
+
return this.storage.get(STORAGE_KEYS.USER_ID) ?? undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Set the user ID (called during identify)
|
|
99
|
+
*/
|
|
100
|
+
setUserId(userId) {
|
|
101
|
+
this.storage.set(STORAGE_KEYS.USER_ID, userId);
|
|
102
|
+
this.logger.log("User ID set:", userId);
|
|
103
|
+
this.broadcastMessage({ type: "identify", userId });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get user traits
|
|
107
|
+
*/
|
|
108
|
+
getUserTraits() {
|
|
109
|
+
const traitsJson = this.storage.get(STORAGE_KEYS.USER_TRAITS);
|
|
110
|
+
if (!traitsJson)
|
|
111
|
+
return undefined;
|
|
112
|
+
try {
|
|
113
|
+
return JSON.parse(traitsJson);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Set user traits (merges with existing traits)
|
|
121
|
+
*/
|
|
122
|
+
setUserTraits(traits) {
|
|
123
|
+
const existingTraits = this.getUserTraits() ?? {};
|
|
124
|
+
const mergedTraits = { ...existingTraits, ...traits };
|
|
125
|
+
this.storage.set(STORAGE_KEYS.USER_TRAITS, JSON.stringify(mergedTraits));
|
|
126
|
+
this.logger.log("User traits updated:", mergedTraits);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get the current account ID (if grouped)
|
|
130
|
+
*/
|
|
131
|
+
getAccountId() {
|
|
132
|
+
return this.storage.get(STORAGE_KEYS.ACCOUNT_ID) ?? undefined;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Set the account ID (called during group)
|
|
136
|
+
*/
|
|
137
|
+
setAccountId(accountId) {
|
|
138
|
+
this.storage.set(STORAGE_KEYS.ACCOUNT_ID, accountId);
|
|
139
|
+
this.logger.log("Account ID set:", accountId);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get account traits
|
|
143
|
+
*/
|
|
144
|
+
getAccountTraits() {
|
|
145
|
+
const traitsJson = this.storage.get(STORAGE_KEYS.ACCOUNT_TRAITS);
|
|
146
|
+
if (!traitsJson)
|
|
147
|
+
return undefined;
|
|
148
|
+
try {
|
|
149
|
+
return JSON.parse(traitsJson);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Set account traits (merges with existing traits)
|
|
157
|
+
*/
|
|
158
|
+
setAccountTraits(traits) {
|
|
159
|
+
const existingTraits = this.getAccountTraits() ?? {};
|
|
160
|
+
const mergedTraits = { ...existingTraits, ...traits };
|
|
161
|
+
this.storage.set(STORAGE_KEYS.ACCOUNT_TRAITS, JSON.stringify(mergedTraits));
|
|
162
|
+
this.logger.log("Account traits updated:", mergedTraits);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get the current session ID, creating a new one if the session has expired
|
|
166
|
+
*/
|
|
167
|
+
getSessionId() {
|
|
168
|
+
this.ensureSession();
|
|
169
|
+
if (!this.currentSessionId) {
|
|
170
|
+
this.currentSessionId = generateId();
|
|
171
|
+
this.storage.set(STORAGE_KEYS.SESSION_ID, this.currentSessionId);
|
|
172
|
+
}
|
|
173
|
+
return this.currentSessionId;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if the session has expired and create a new one if needed
|
|
177
|
+
*/
|
|
178
|
+
ensureSession() {
|
|
179
|
+
const storedSessionId = this.storage.get(STORAGE_KEYS.SESSION_ID);
|
|
180
|
+
const lastActivityStr = this.storage.get(STORAGE_KEYS.LAST_ACTIVITY);
|
|
181
|
+
const lastActivity = lastActivityStr ? parseInt(lastActivityStr, 10) : 0;
|
|
182
|
+
const now = Date.now();
|
|
183
|
+
const sessionExpired = now - lastActivity > this.sessionTimeout;
|
|
184
|
+
if (!storedSessionId || sessionExpired) {
|
|
185
|
+
this.currentSessionId = generateId();
|
|
186
|
+
this.storage.set(STORAGE_KEYS.SESSION_ID, this.currentSessionId);
|
|
187
|
+
this.logger.log(sessionExpired
|
|
188
|
+
? "Session expired, created new:"
|
|
189
|
+
: "Created new session:", this.currentSessionId);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.currentSessionId = storedSessionId;
|
|
193
|
+
}
|
|
194
|
+
this.updateLastActivity();
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Update the last activity timestamp
|
|
198
|
+
*/
|
|
199
|
+
updateLastActivity() {
|
|
200
|
+
this.storage.set(STORAGE_KEYS.LAST_ACTIVITY, Date.now().toString());
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Reset the session (clear user, account, and session data)
|
|
204
|
+
*/
|
|
205
|
+
reset() {
|
|
206
|
+
this.storage.remove(STORAGE_KEYS.USER_ID);
|
|
207
|
+
this.storage.remove(STORAGE_KEYS.USER_TRAITS);
|
|
208
|
+
this.storage.remove(STORAGE_KEYS.ACCOUNT_ID);
|
|
209
|
+
this.storage.remove(STORAGE_KEYS.ACCOUNT_TRAITS);
|
|
210
|
+
const newAnonymousId = generateId();
|
|
211
|
+
this.storage.set(STORAGE_KEYS.ANONYMOUS_ID, newAnonymousId);
|
|
212
|
+
const newSessionId = generateId();
|
|
213
|
+
this.currentSessionId = newSessionId;
|
|
214
|
+
this.storage.set(STORAGE_KEYS.SESSION_ID, newSessionId);
|
|
215
|
+
this.updateLastActivity();
|
|
216
|
+
this.broadcastMessage({
|
|
217
|
+
type: "reset",
|
|
218
|
+
sessionId: newSessionId,
|
|
219
|
+
anonymousId: newAnonymousId,
|
|
220
|
+
});
|
|
221
|
+
this.logger.log("Session reset. New anonymous ID:", newAnonymousId);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Clean up resources (call when destroying the analytics instance)
|
|
225
|
+
*/
|
|
226
|
+
destroy() {
|
|
227
|
+
try {
|
|
228
|
+
this.broadcastChannel?.close();
|
|
229
|
+
this.broadcastChannel = null;
|
|
230
|
+
}
|
|
231
|
+
catch { }
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get the full user state
|
|
235
|
+
*/
|
|
236
|
+
getUserState() {
|
|
237
|
+
return {
|
|
238
|
+
anonymousId: this.getAnonymousId(),
|
|
239
|
+
userId: this.getUserId(),
|
|
240
|
+
traits: this.getUserTraits(),
|
|
241
|
+
accountId: this.getAccountId(),
|
|
242
|
+
accountTraits: this.getAccountTraits(),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { StorageInterface } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Storage implementation with fallback chain:
|
|
4
|
+
* 1. localStorage (persists across sessions)
|
|
5
|
+
* 2. sessionStorage (per-tab)
|
|
6
|
+
* 3. Cookie (cross-subdomain support, 365 day expiry)
|
|
7
|
+
* 4. Memory (final fallback, lost on refresh)
|
|
8
|
+
*/
|
|
9
|
+
export declare class Storage implements StorageInterface {
|
|
10
|
+
private memoryStorage;
|
|
11
|
+
private storageType;
|
|
12
|
+
private cookieDomain?;
|
|
13
|
+
constructor(cookieDomain?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Detect the best available storage mechanism
|
|
16
|
+
*/
|
|
17
|
+
private detectStorageType;
|
|
18
|
+
/**
|
|
19
|
+
* Check if localStorage is available
|
|
20
|
+
*/
|
|
21
|
+
private isLocalStorageAvailable;
|
|
22
|
+
/**
|
|
23
|
+
* Check if sessionStorage is available
|
|
24
|
+
*/
|
|
25
|
+
private isSessionStorageAvailable;
|
|
26
|
+
/**
|
|
27
|
+
* Check if cookies are available and can be set with expiry
|
|
28
|
+
*/
|
|
29
|
+
private areCookiesAvailable;
|
|
30
|
+
/**
|
|
31
|
+
* Get a value from storage
|
|
32
|
+
*/
|
|
33
|
+
get(key: string): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Set a value in storage
|
|
36
|
+
*/
|
|
37
|
+
set(key: string, value: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Clear old analytics data to free up quota
|
|
40
|
+
*/
|
|
41
|
+
private clearOldData;
|
|
42
|
+
/**
|
|
43
|
+
* Remove a value from storage
|
|
44
|
+
*/
|
|
45
|
+
remove(key: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Get a cookie value
|
|
48
|
+
*/
|
|
49
|
+
private getCookie;
|
|
50
|
+
/**
|
|
51
|
+
* Set a cookie value (365 day expiry)
|
|
52
|
+
*/
|
|
53
|
+
private setCookie;
|
|
54
|
+
/**
|
|
55
|
+
* Delete a cookie
|
|
56
|
+
*/
|
|
57
|
+
private deleteCookie;
|
|
58
|
+
/**
|
|
59
|
+
* Get the current storage type being used
|
|
60
|
+
*/
|
|
61
|
+
getStorageType(): string;
|
|
62
|
+
}
|
|
63
|
+
export declare const generateId: () => string;
|
|
64
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;;;;GAMG;AACH,qBAAa,OAAQ,YAAW,gBAAgB;IAC/C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,WAAW,CAA0D;IAC7E,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,YAAY,CAAC,EAAE,MAAM;IAKjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoB/B;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IA2CrC;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAuBzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,cAAc,IAAI,MAAM;CAGxB;AAED,eAAO,MAAM,UAAU,QAAO,MAAkB,CAAC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { v7 as uuidv7 } from "uuid";
|
|
2
|
+
/**
|
|
3
|
+
* Storage implementation with fallback chain:
|
|
4
|
+
* 1. localStorage (persists across sessions)
|
|
5
|
+
* 2. sessionStorage (per-tab)
|
|
6
|
+
* 3. Cookie (cross-subdomain support, 365 day expiry)
|
|
7
|
+
* 4. Memory (final fallback, lost on refresh)
|
|
8
|
+
*/
|
|
9
|
+
export class Storage {
|
|
10
|
+
constructor(cookieDomain) {
|
|
11
|
+
this.memoryStorage = new Map();
|
|
12
|
+
this.cookieDomain = cookieDomain;
|
|
13
|
+
this.storageType = this.detectStorageType();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect the best available storage mechanism
|
|
17
|
+
*/
|
|
18
|
+
detectStorageType() {
|
|
19
|
+
if (this.isLocalStorageAvailable()) {
|
|
20
|
+
return "localStorage";
|
|
21
|
+
}
|
|
22
|
+
if (this.isSessionStorageAvailable()) {
|
|
23
|
+
return "sessionStorage";
|
|
24
|
+
}
|
|
25
|
+
if (this.areCookiesAvailable()) {
|
|
26
|
+
return "cookie";
|
|
27
|
+
}
|
|
28
|
+
return "memory";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if localStorage is available
|
|
32
|
+
*/
|
|
33
|
+
isLocalStorageAvailable() {
|
|
34
|
+
if (typeof window === "undefined")
|
|
35
|
+
return false;
|
|
36
|
+
try {
|
|
37
|
+
const testKey = "__tif_storage_test__";
|
|
38
|
+
window.localStorage.setItem(testKey, testKey);
|
|
39
|
+
window.localStorage.removeItem(testKey);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if sessionStorage is available
|
|
48
|
+
*/
|
|
49
|
+
isSessionStorageAvailable() {
|
|
50
|
+
if (typeof window === "undefined")
|
|
51
|
+
return false;
|
|
52
|
+
try {
|
|
53
|
+
const testKey = "__tif_storage_test__";
|
|
54
|
+
window.sessionStorage.setItem(testKey, testKey);
|
|
55
|
+
window.sessionStorage.removeItem(testKey);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if cookies are available and can be set with expiry
|
|
64
|
+
*/
|
|
65
|
+
areCookiesAvailable() {
|
|
66
|
+
if (typeof document === "undefined")
|
|
67
|
+
return false;
|
|
68
|
+
if (typeof navigator !== "undefined" && !navigator.cookieEnabled) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const testKey = "__tif_cookie_test__";
|
|
73
|
+
const testValue = "1";
|
|
74
|
+
const expires = new Date(Date.now() + 60000).toUTCString();
|
|
75
|
+
// biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
|
|
76
|
+
document.cookie = `${testKey}=${testValue}; expires=${expires}; path=/; SameSite=Lax`;
|
|
77
|
+
const result = document.cookie.includes(`${testKey}=${testValue}`);
|
|
78
|
+
// biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
|
|
79
|
+
document.cookie = `${testKey}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get a value from storage
|
|
88
|
+
*/
|
|
89
|
+
get(key) {
|
|
90
|
+
try {
|
|
91
|
+
switch (this.storageType) {
|
|
92
|
+
case "localStorage":
|
|
93
|
+
return window.localStorage.getItem(key);
|
|
94
|
+
case "sessionStorage":
|
|
95
|
+
return window.sessionStorage.getItem(key);
|
|
96
|
+
case "cookie":
|
|
97
|
+
return this.getCookie(key);
|
|
98
|
+
case "memory":
|
|
99
|
+
return this.memoryStorage.get(key) ?? null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return this.memoryStorage.get(key) ?? null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Set a value in storage
|
|
108
|
+
*/
|
|
109
|
+
set(key, value) {
|
|
110
|
+
try {
|
|
111
|
+
switch (this.storageType) {
|
|
112
|
+
case "localStorage":
|
|
113
|
+
window.localStorage.setItem(key, value);
|
|
114
|
+
break;
|
|
115
|
+
case "sessionStorage":
|
|
116
|
+
window.sessionStorage.setItem(key, value);
|
|
117
|
+
break;
|
|
118
|
+
case "cookie":
|
|
119
|
+
this.setCookie(key, value);
|
|
120
|
+
break;
|
|
121
|
+
case "memory":
|
|
122
|
+
this.memoryStorage.set(key, value);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof Error &&
|
|
128
|
+
(error.name === "QuotaExceededError" ||
|
|
129
|
+
error.name === "NS_ERROR_DOM_QUOTA_REACHED" ||
|
|
130
|
+
error.message.includes("quota"))) {
|
|
131
|
+
this.clearOldData();
|
|
132
|
+
try {
|
|
133
|
+
switch (this.storageType) {
|
|
134
|
+
case "localStorage":
|
|
135
|
+
window.localStorage.setItem(key, value);
|
|
136
|
+
return;
|
|
137
|
+
case "sessionStorage":
|
|
138
|
+
window.sessionStorage.setItem(key, value);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch { }
|
|
143
|
+
}
|
|
144
|
+
this.memoryStorage.set(key, value);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Clear old analytics data to free up quota
|
|
149
|
+
*/
|
|
150
|
+
clearOldData() {
|
|
151
|
+
const storage = this.storageType === "localStorage"
|
|
152
|
+
? window.localStorage
|
|
153
|
+
: this.storageType === "sessionStorage"
|
|
154
|
+
? window.sessionStorage
|
|
155
|
+
: null;
|
|
156
|
+
if (!storage)
|
|
157
|
+
return;
|
|
158
|
+
const keysToCheck = ["tif_user_traits", "tif_account_traits"];
|
|
159
|
+
for (const key of keysToCheck) {
|
|
160
|
+
try {
|
|
161
|
+
const value = storage.getItem(key);
|
|
162
|
+
if (value && value.length > 10000) {
|
|
163
|
+
storage.removeItem(key);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch { }
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Remove a value from storage
|
|
171
|
+
*/
|
|
172
|
+
remove(key) {
|
|
173
|
+
this.memoryStorage.delete(key);
|
|
174
|
+
try {
|
|
175
|
+
switch (this.storageType) {
|
|
176
|
+
case "localStorage":
|
|
177
|
+
window.localStorage.removeItem(key);
|
|
178
|
+
break;
|
|
179
|
+
case "sessionStorage":
|
|
180
|
+
window.sessionStorage.removeItem(key);
|
|
181
|
+
break;
|
|
182
|
+
case "cookie":
|
|
183
|
+
this.deleteCookie(key);
|
|
184
|
+
break;
|
|
185
|
+
case "memory":
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch { }
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Get a cookie value
|
|
193
|
+
*/
|
|
194
|
+
getCookie(name) {
|
|
195
|
+
if (typeof document === "undefined")
|
|
196
|
+
return null;
|
|
197
|
+
const cookies = document.cookie.split(";");
|
|
198
|
+
for (const cookie of cookies) {
|
|
199
|
+
const [cookieName, cookieValue] = cookie.split("=").map((c) => c.trim());
|
|
200
|
+
if (cookieName === name) {
|
|
201
|
+
return decodeURIComponent(cookieValue);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Set a cookie value (365 day expiry)
|
|
208
|
+
*/
|
|
209
|
+
setCookie(name, value) {
|
|
210
|
+
if (typeof document === "undefined")
|
|
211
|
+
return;
|
|
212
|
+
const expires = new Date();
|
|
213
|
+
expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);
|
|
214
|
+
let cookie = `${name}=${encodeURIComponent(value)}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`;
|
|
215
|
+
if (this.cookieDomain) {
|
|
216
|
+
cookie += `; domain=${this.cookieDomain}`;
|
|
217
|
+
}
|
|
218
|
+
// biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
|
|
219
|
+
document.cookie = cookie;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Delete a cookie
|
|
223
|
+
*/
|
|
224
|
+
deleteCookie(name) {
|
|
225
|
+
if (typeof document === "undefined")
|
|
226
|
+
return;
|
|
227
|
+
let cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/`;
|
|
228
|
+
if (this.cookieDomain) {
|
|
229
|
+
cookie += `; domain=${this.cookieDomain}`;
|
|
230
|
+
}
|
|
231
|
+
// biome-ignore lint/suspicious/noDocumentCookie: Cookie storage requires direct cookie access
|
|
232
|
+
document.cookie = cookie;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get the current storage type being used
|
|
236
|
+
*/
|
|
237
|
+
getStorageType() {
|
|
238
|
+
return this.storageType;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
export const generateId = () => uuidv7();
|
|
242
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"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"}
|