@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,420 @@
|
|
|
1
|
+
import { createLogger } from "./logger";
|
|
2
|
+
/**
|
|
3
|
+
* Cyrb53 hash - a fast, high-quality 53-bit hash function.
|
|
4
|
+
* Better distribution than FNV-1a, and we call it twice with
|
|
5
|
+
* different seeds to get a 106-bit hash for lower collision probability.
|
|
6
|
+
*/
|
|
7
|
+
const cyrb53 = (str, seed = 0) => {
|
|
8
|
+
let h1 = 0xdeadbeef ^ seed;
|
|
9
|
+
let h2 = 0x41c6ce57 ^ seed;
|
|
10
|
+
for (let i = 0; i < str.length; i++) {
|
|
11
|
+
const ch = str.charCodeAt(i);
|
|
12
|
+
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
13
|
+
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
14
|
+
}
|
|
15
|
+
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
|
|
16
|
+
h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
|
|
17
|
+
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
|
|
18
|
+
h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);
|
|
19
|
+
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Generate a 128-bit hash by running cyrb53 with two different seeds
|
|
23
|
+
*/
|
|
24
|
+
const hashString = (str) => {
|
|
25
|
+
const h1 = cyrb53(str, 0);
|
|
26
|
+
const h2 = cyrb53(str, 1);
|
|
27
|
+
return h1.toString(16).padStart(14, "0") + h2.toString(16).padStart(14, "0");
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Extract the top stack frame from a stack trace string
|
|
31
|
+
*/
|
|
32
|
+
const extractTopFrame = (stack) => {
|
|
33
|
+
if (!stack)
|
|
34
|
+
return "";
|
|
35
|
+
const lines = stack.split("\n").filter((l) => l.trim().startsWith("at "));
|
|
36
|
+
return lines[0]?.trim() ?? "";
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Normalize error message for fingerprinting.
|
|
40
|
+
* Removes dynamic values like IDs, timestamps, etc.
|
|
41
|
+
*/
|
|
42
|
+
const normalizeMessage = (message) => {
|
|
43
|
+
return message
|
|
44
|
+
.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, "<uuid>")
|
|
45
|
+
.replace(/\b\d{5,}\b/g, "<id>")
|
|
46
|
+
.replace(/"[^"]*\d+[^"]*"/g, '"<dynamic>"')
|
|
47
|
+
.replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/g, "<timestamp>")
|
|
48
|
+
.replace(/\s+/g, " ")
|
|
49
|
+
.trim();
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Generate a fingerprint for error grouping
|
|
53
|
+
*/
|
|
54
|
+
const generateFingerprint = (type, message, stack) => {
|
|
55
|
+
const topFrame = extractTopFrame(stack);
|
|
56
|
+
const normalizedMessage = normalizeMessage(message);
|
|
57
|
+
const input = `${type ?? "Error"}:${normalizedMessage}:${topFrame}`;
|
|
58
|
+
return hashString(input);
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Truncate a string to a maximum length without allocating if not needed
|
|
62
|
+
*/
|
|
63
|
+
const truncate = (str, maxLen) => str.length > maxLen ? str.slice(0, maxLen) : str;
|
|
64
|
+
/**
|
|
65
|
+
* Extract meaningful text from an element efficiently.
|
|
66
|
+
* Avoids getting huge textContent from container elements.
|
|
67
|
+
*/
|
|
68
|
+
const getElementText = (el, maxLen) => {
|
|
69
|
+
if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
|
|
70
|
+
return truncate(el.value || el.placeholder || "", maxLen);
|
|
71
|
+
}
|
|
72
|
+
const ariaLabel = el.getAttribute("aria-label");
|
|
73
|
+
if (ariaLabel) {
|
|
74
|
+
return truncate(ariaLabel.trim(), maxLen);
|
|
75
|
+
}
|
|
76
|
+
if (el.childNodes.length <= 3) {
|
|
77
|
+
let text = "";
|
|
78
|
+
for (const node of el.childNodes) {
|
|
79
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
80
|
+
text += node.textContent || "";
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
text = text.trim();
|
|
84
|
+
if (text) {
|
|
85
|
+
return truncate(text, maxLen);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (el.tagName === "BUTTON" ||
|
|
89
|
+
el.tagName === "A" ||
|
|
90
|
+
el.getAttribute("role") === "button") {
|
|
91
|
+
const firstLine = el.innerText?.split("\n")[0]?.trim() ?? "";
|
|
92
|
+
return truncate(firstLine, maxLen);
|
|
93
|
+
}
|
|
94
|
+
return "";
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Error capture module for the analytics SDK.
|
|
98
|
+
*
|
|
99
|
+
* Captures unhandled exceptions, unhandled promise rejections,
|
|
100
|
+
* and records breadcrumbs (clicks, navigation, console, network).
|
|
101
|
+
*/
|
|
102
|
+
export class ErrorCapture {
|
|
103
|
+
constructor(config, session, errorConfig) {
|
|
104
|
+
this.breadcrumbs = [];
|
|
105
|
+
this.installed = false;
|
|
106
|
+
this.originalOnError = null;
|
|
107
|
+
this.originalConsoleError = null;
|
|
108
|
+
this.originalFetch = null;
|
|
109
|
+
this.unhandledRejectionHandler = null;
|
|
110
|
+
this.clickHandler = null;
|
|
111
|
+
this.lastClickTarget = null;
|
|
112
|
+
this.lastClickTime = 0;
|
|
113
|
+
this.originalPushState = null;
|
|
114
|
+
this.originalReplaceState = null;
|
|
115
|
+
this.popstateHandler = null;
|
|
116
|
+
this.config = config;
|
|
117
|
+
this.session = session;
|
|
118
|
+
this.logger = createLogger("Errors", config.debug);
|
|
119
|
+
this.errorConfig = {
|
|
120
|
+
enabled: errorConfig?.enabled ?? true,
|
|
121
|
+
captureConsoleErrors: errorConfig?.captureConsoleErrors ?? false,
|
|
122
|
+
captureNetworkErrors: errorConfig?.captureNetworkErrors ?? false,
|
|
123
|
+
maxBreadcrumbs: errorConfig?.maxBreadcrumbs ?? 25,
|
|
124
|
+
beforeSend: errorConfig?.beforeSend,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Install global error handlers and breadcrumb collectors
|
|
129
|
+
*/
|
|
130
|
+
install() {
|
|
131
|
+
if (this.installed || typeof window === "undefined")
|
|
132
|
+
return;
|
|
133
|
+
if (!this.errorConfig.enabled)
|
|
134
|
+
return;
|
|
135
|
+
this.installErrorHandler();
|
|
136
|
+
this.installUnhandledRejectionHandler();
|
|
137
|
+
this.installClickBreadcrumbs();
|
|
138
|
+
this.installNavigationBreadcrumbs();
|
|
139
|
+
if (this.errorConfig.captureConsoleErrors) {
|
|
140
|
+
this.installConsoleBreadcrumbs();
|
|
141
|
+
}
|
|
142
|
+
if (this.errorConfig.captureNetworkErrors) {
|
|
143
|
+
this.installNetworkBreadcrumbs();
|
|
144
|
+
}
|
|
145
|
+
this.installed = true;
|
|
146
|
+
this.logger.log("Error capture installed");
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Remove all handlers and restore originals
|
|
150
|
+
*/
|
|
151
|
+
uninstall() {
|
|
152
|
+
if (!this.installed || typeof window === "undefined")
|
|
153
|
+
return;
|
|
154
|
+
window.onerror = this.originalOnError;
|
|
155
|
+
this.originalOnError = null;
|
|
156
|
+
if (this.unhandledRejectionHandler) {
|
|
157
|
+
window.removeEventListener("unhandledrejection", this.unhandledRejectionHandler);
|
|
158
|
+
this.unhandledRejectionHandler = null;
|
|
159
|
+
}
|
|
160
|
+
if (this.clickHandler) {
|
|
161
|
+
document.removeEventListener("click", this.clickHandler, true);
|
|
162
|
+
this.clickHandler = null;
|
|
163
|
+
}
|
|
164
|
+
if (this.originalPushState) {
|
|
165
|
+
history.pushState = this.originalPushState;
|
|
166
|
+
this.originalPushState = null;
|
|
167
|
+
}
|
|
168
|
+
if (this.originalReplaceState) {
|
|
169
|
+
history.replaceState = this.originalReplaceState;
|
|
170
|
+
this.originalReplaceState = null;
|
|
171
|
+
}
|
|
172
|
+
if (this.popstateHandler) {
|
|
173
|
+
window.removeEventListener("popstate", this.popstateHandler);
|
|
174
|
+
this.popstateHandler = null;
|
|
175
|
+
}
|
|
176
|
+
if (this.originalConsoleError) {
|
|
177
|
+
console.error = this.originalConsoleError;
|
|
178
|
+
this.originalConsoleError = null;
|
|
179
|
+
}
|
|
180
|
+
if (this.originalFetch) {
|
|
181
|
+
window.fetch = this.originalFetch;
|
|
182
|
+
this.originalFetch = null;
|
|
183
|
+
}
|
|
184
|
+
this.installed = false;
|
|
185
|
+
this.logger.log("Error capture uninstalled");
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Add a breadcrumb manually
|
|
189
|
+
*/
|
|
190
|
+
addBreadcrumb(breadcrumb) {
|
|
191
|
+
this.pushBreadcrumb({
|
|
192
|
+
...breadcrumb,
|
|
193
|
+
timestamp: new Date().toISOString(),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Clear all breadcrumbs
|
|
198
|
+
*/
|
|
199
|
+
clearBreadcrumbs() {
|
|
200
|
+
this.breadcrumbs = [];
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Capture an exception and send it to the API
|
|
204
|
+
*/
|
|
205
|
+
captureException(error, context) {
|
|
206
|
+
const message = error.message || String(error);
|
|
207
|
+
const stack = error.stack;
|
|
208
|
+
const type = error.name || "Error";
|
|
209
|
+
const fingerprint = generateFingerprint(type, message, stack);
|
|
210
|
+
this.sendError({
|
|
211
|
+
message,
|
|
212
|
+
stack,
|
|
213
|
+
type,
|
|
214
|
+
level: "error",
|
|
215
|
+
fingerprint,
|
|
216
|
+
context,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Capture a message as an error event
|
|
221
|
+
*/
|
|
222
|
+
captureMessage(message, level = "error", context) {
|
|
223
|
+
const fingerprint = generateFingerprint(undefined, message, undefined);
|
|
224
|
+
this.sendError({
|
|
225
|
+
message,
|
|
226
|
+
level,
|
|
227
|
+
fingerprint,
|
|
228
|
+
context,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
installErrorHandler() {
|
|
232
|
+
this.originalOnError = window.onerror;
|
|
233
|
+
window.onerror = (message, source, lineno, colno, error) => {
|
|
234
|
+
if (error) {
|
|
235
|
+
this.captureException(error);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
const msg = typeof message === "string" ? message : "Unknown error";
|
|
239
|
+
this.captureMessage(msg);
|
|
240
|
+
}
|
|
241
|
+
if (typeof this.originalOnError === "function") {
|
|
242
|
+
return this.originalOnError.call(window, message, source, lineno, colno, error);
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
installUnhandledRejectionHandler() {
|
|
248
|
+
this.unhandledRejectionHandler = (event) => {
|
|
249
|
+
const reason = event.reason;
|
|
250
|
+
if (reason instanceof Error) {
|
|
251
|
+
this.captureException(reason);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
const message = typeof reason === "string" ? reason : "Unhandled promise rejection";
|
|
255
|
+
this.captureMessage(message);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
window.addEventListener("unhandledrejection", this.unhandledRejectionHandler);
|
|
259
|
+
}
|
|
260
|
+
installClickBreadcrumbs() {
|
|
261
|
+
this.clickHandler = (event) => {
|
|
262
|
+
const target = event.target;
|
|
263
|
+
if (!target)
|
|
264
|
+
return;
|
|
265
|
+
const now = Date.now();
|
|
266
|
+
if (target === this.lastClickTarget && now - this.lastClickTime < 100) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
this.lastClickTarget = target;
|
|
270
|
+
this.lastClickTime = now;
|
|
271
|
+
const tag = target.tagName?.toLowerCase() ?? "unknown";
|
|
272
|
+
const id = target.id ? `#${target.id}` : "";
|
|
273
|
+
const text = getElementText(target, 50);
|
|
274
|
+
const message = `${tag}${id}${text ? ` "${text}"` : ""}`;
|
|
275
|
+
this.pushBreadcrumb({
|
|
276
|
+
type: "click",
|
|
277
|
+
message,
|
|
278
|
+
timestamp: new Date().toISOString(),
|
|
279
|
+
data: {
|
|
280
|
+
tagName: tag,
|
|
281
|
+
id: target.id || undefined,
|
|
282
|
+
className: typeof target.className === "string"
|
|
283
|
+
? truncate(target.className, 100)
|
|
284
|
+
: undefined,
|
|
285
|
+
},
|
|
286
|
+
});
|
|
287
|
+
};
|
|
288
|
+
document.addEventListener("click", this.clickHandler, true);
|
|
289
|
+
}
|
|
290
|
+
installNavigationBreadcrumbs() {
|
|
291
|
+
const addNavBreadcrumb = (url) => {
|
|
292
|
+
this.pushBreadcrumb({
|
|
293
|
+
type: "navigation",
|
|
294
|
+
message: url,
|
|
295
|
+
timestamp: new Date().toISOString(),
|
|
296
|
+
});
|
|
297
|
+
};
|
|
298
|
+
this.originalPushState = history.pushState.bind(history);
|
|
299
|
+
history.pushState = (...args) => {
|
|
300
|
+
this.originalPushState?.(...args);
|
|
301
|
+
addNavBreadcrumb(window.location.href);
|
|
302
|
+
};
|
|
303
|
+
this.originalReplaceState = history.replaceState.bind(history);
|
|
304
|
+
history.replaceState = (...args) => {
|
|
305
|
+
this.originalReplaceState?.(...args);
|
|
306
|
+
addNavBreadcrumb(window.location.href);
|
|
307
|
+
};
|
|
308
|
+
this.popstateHandler = () => {
|
|
309
|
+
addNavBreadcrumb(window.location.href);
|
|
310
|
+
};
|
|
311
|
+
window.addEventListener("popstate", this.popstateHandler);
|
|
312
|
+
}
|
|
313
|
+
installConsoleBreadcrumbs() {
|
|
314
|
+
this.originalConsoleError = console.error.bind(console);
|
|
315
|
+
console.error = (...args) => {
|
|
316
|
+
this.pushBreadcrumb({
|
|
317
|
+
type: "console",
|
|
318
|
+
message: args.map((a) => String(a)).join(" "),
|
|
319
|
+
timestamp: new Date().toISOString(),
|
|
320
|
+
});
|
|
321
|
+
this.originalConsoleError?.(...args);
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
installNetworkBreadcrumbs() {
|
|
325
|
+
this.originalFetch = window.fetch.bind(window);
|
|
326
|
+
window.fetch = async (input, init) => {
|
|
327
|
+
const url = typeof input === "string"
|
|
328
|
+
? input
|
|
329
|
+
: input instanceof URL
|
|
330
|
+
? input.toString()
|
|
331
|
+
: input.url;
|
|
332
|
+
const method = init?.method ?? "GET";
|
|
333
|
+
try {
|
|
334
|
+
if (!this.originalFetch) {
|
|
335
|
+
throw new Error("originalFetch is not available");
|
|
336
|
+
}
|
|
337
|
+
const response = await this.originalFetch(input, init);
|
|
338
|
+
if (!response.ok) {
|
|
339
|
+
this.pushBreadcrumb({
|
|
340
|
+
type: "network",
|
|
341
|
+
message: `${method} ${url} → ${response.status}`,
|
|
342
|
+
timestamp: new Date().toISOString(),
|
|
343
|
+
data: { method, url, status: response.status },
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
return response;
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
this.pushBreadcrumb({
|
|
350
|
+
type: "network",
|
|
351
|
+
message: `${method} ${url} → failed`,
|
|
352
|
+
timestamp: new Date().toISOString(),
|
|
353
|
+
data: {
|
|
354
|
+
method,
|
|
355
|
+
url,
|
|
356
|
+
error: error instanceof Error ? error.message : "Unknown",
|
|
357
|
+
},
|
|
358
|
+
});
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
pushBreadcrumb(breadcrumb) {
|
|
364
|
+
this.breadcrumbs.push(breadcrumb);
|
|
365
|
+
if (this.breadcrumbs.length > this.errorConfig.maxBreadcrumbs) {
|
|
366
|
+
this.breadcrumbs.shift();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
sendError(partial) {
|
|
370
|
+
const payload = {
|
|
371
|
+
...partial,
|
|
372
|
+
url: typeof window !== "undefined" ? window.location.href : undefined,
|
|
373
|
+
breadcrumbs: [...this.breadcrumbs],
|
|
374
|
+
anonymousId: this.session.getAnonymousId(),
|
|
375
|
+
userId: this.session.getUserId(),
|
|
376
|
+
sessionId: this.session.getSessionId(),
|
|
377
|
+
timestamp: new Date().toISOString(),
|
|
378
|
+
};
|
|
379
|
+
const finalPayload = this.errorConfig.beforeSend
|
|
380
|
+
? this.errorConfig.beforeSend(payload)
|
|
381
|
+
: payload;
|
|
382
|
+
if (!finalPayload) {
|
|
383
|
+
this.logger.log("Error discarded by beforeSend");
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
this.postError(finalPayload);
|
|
387
|
+
}
|
|
388
|
+
async postError(payload) {
|
|
389
|
+
const url = `${this.config.host}/api/v1/error`;
|
|
390
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
391
|
+
try {
|
|
392
|
+
const response = await fetch(url, {
|
|
393
|
+
method: "POST",
|
|
394
|
+
headers: {
|
|
395
|
+
"Content-Type": "application/json",
|
|
396
|
+
"X-API-Key": this.config.apiKey,
|
|
397
|
+
},
|
|
398
|
+
body: JSON.stringify(payload),
|
|
399
|
+
});
|
|
400
|
+
if (response.ok) {
|
|
401
|
+
this.logger.log("Error sent:", payload.message);
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
if (response.status >= 400 &&
|
|
405
|
+
response.status < 500 &&
|
|
406
|
+
response.status !== 429) {
|
|
407
|
+
this.logger.log("Error rejected (client error):", response.status);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
this.logger.log("Error send failed, attempt", attempt + 1);
|
|
413
|
+
}
|
|
414
|
+
if (attempt === 0) {
|
|
415
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared debug logger factory for SDK modules
|
|
3
|
+
*
|
|
4
|
+
* Creates a consistent logging interface across all SDK components.
|
|
5
|
+
* Logs are only output when debug mode is enabled.
|
|
6
|
+
*/
|
|
7
|
+
export interface Logger {
|
|
8
|
+
log: (...args: unknown[]) => void;
|
|
9
|
+
warn: (...args: unknown[]) => void;
|
|
10
|
+
error: (...args: unknown[]) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a namespaced debug logger
|
|
14
|
+
*
|
|
15
|
+
* @param prefix - Module name (e.g., "Queue", "Session", "Errors")
|
|
16
|
+
* @param debug - Whether debug mode is enabled
|
|
17
|
+
* @returns Logger interface with log, warn, and error methods
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const logger = createLogger("Queue", this.config.debug);
|
|
22
|
+
* logger.log("Event queued:", event.type);
|
|
23
|
+
* logger.warn("Queue is full, dropping oldest event");
|
|
24
|
+
* logger.error("Failed to send batch:", error);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const createLogger: (prefix: string, debug: boolean) => Logger;
|
|
28
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACtB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,OAAO,OAAO,KAAG,MAoB7D,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a namespaced debug logger
|
|
3
|
+
*
|
|
4
|
+
* @param prefix - Module name (e.g., "Queue", "Session", "Errors")
|
|
5
|
+
* @param debug - Whether debug mode is enabled
|
|
6
|
+
* @returns Logger interface with log, warn, and error methods
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const logger = createLogger("Queue", this.config.debug);
|
|
11
|
+
* logger.log("Event queued:", event.type);
|
|
12
|
+
* logger.warn("Queue is full, dropping oldest event");
|
|
13
|
+
* logger.error("Failed to send batch:", error);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export const createLogger = (prefix, debug) => {
|
|
17
|
+
const shouldLog = debug && typeof console !== "undefined";
|
|
18
|
+
return {
|
|
19
|
+
log: (...args) => {
|
|
20
|
+
if (shouldLog) {
|
|
21
|
+
console.log(`[Thisbefine ${prefix}]`, ...args);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
warn: (...args) => {
|
|
25
|
+
if (shouldLog) {
|
|
26
|
+
console.warn(`[Thisbefine ${prefix}]`, ...args);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
error: (...args) => {
|
|
30
|
+
if (typeof console !== "undefined") {
|
|
31
|
+
console.error(`[Thisbefine ${prefix}]`, ...args);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,KAAc,EAAU,EAAE;IACtE,MAAM,SAAS,GAAG,KAAK,IAAI,OAAO,OAAO,KAAK,WAAW,CAAC;IAE1D,OAAO;QACN,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC3B,IAAI,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,eAAe,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACjD,CAAC;QACF,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC7B,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Analytics } from "./types";
|
|
2
|
+
export type LogLevel = "debug" | "info" | "warn" | "error" | "fatal";
|
|
3
|
+
/**
|
|
4
|
+
* Send a structured log event through the analytics track pipeline.
|
|
5
|
+
* Logs are stored as track events with name "$log".
|
|
6
|
+
*
|
|
7
|
+
* Note: The event timestamp is set by track() - no need to duplicate it.
|
|
8
|
+
* Metadata keys "message" and "level" are reserved and will be prefixed
|
|
9
|
+
* with "meta_" to avoid conflicts.
|
|
10
|
+
*/
|
|
11
|
+
export declare const log: (analytics: Analytics, message: string, level: LogLevel, metadata?: Record<string, unknown>) => void;
|
|
12
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAQrE;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,GACf,WAAW,SAAS,EACpB,SAAS,MAAM,EACf,OAAO,QAAQ,EACf,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAChC,IAmBF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reserved property names that cannot be used in log metadata.
|
|
3
|
+
* These are used by the logging system itself.
|
|
4
|
+
*/
|
|
5
|
+
const RESERVED_KEYS = ["message", "level"];
|
|
6
|
+
/**
|
|
7
|
+
* Send a structured log event through the analytics track pipeline.
|
|
8
|
+
* Logs are stored as track events with name "$log".
|
|
9
|
+
*
|
|
10
|
+
* Note: The event timestamp is set by track() - no need to duplicate it.
|
|
11
|
+
* Metadata keys "message" and "level" are reserved and will be prefixed
|
|
12
|
+
* with "meta_" to avoid conflicts.
|
|
13
|
+
*/
|
|
14
|
+
export const log = (analytics, message, level, metadata) => {
|
|
15
|
+
let sanitizedMetadata;
|
|
16
|
+
if (metadata) {
|
|
17
|
+
sanitizedMetadata = {};
|
|
18
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
19
|
+
if (RESERVED_KEYS.includes(key)) {
|
|
20
|
+
sanitizedMetadata[`meta_${key}`] = value;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
sanitizedMetadata[key] = value;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
analytics.track("$log", {
|
|
28
|
+
message,
|
|
29
|
+
level,
|
|
30
|
+
...sanitizedMetadata,
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/core/logging.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAClB,SAAoB,EACpB,OAAe,EACf,KAAe,EACf,QAAkC,EAC3B,EAAE;IACT,IAAI,iBAAsD,CAAC;IAE3D,IAAI,QAAQ,EAAE,CAAC;QACd,iBAAiB,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAqC,CAAC,EAAE,CAAC;gBACnE,iBAAiB,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACP,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAChC,CAAC;QACF,CAAC;IACF,CAAC;IAED,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE;QACvB,OAAO;QACP,KAAK;QACL,GAAG,iBAAiB;KACpB,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { StorageInterface } 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 declare class Privacy {
|
|
9
|
+
private storage;
|
|
10
|
+
private respectDNT;
|
|
11
|
+
private debug;
|
|
12
|
+
constructor(storage: StorageInterface, respectDNT: boolean, debug?: boolean);
|
|
13
|
+
/**
|
|
14
|
+
* Check if Do Not Track is enabled in the browser
|
|
15
|
+
*/
|
|
16
|
+
isDNTEnabled(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Check if Global Privacy Control is enabled
|
|
19
|
+
* GPC is a newer standard that's gaining adoption
|
|
20
|
+
*/
|
|
21
|
+
isGPCEnabled(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Check if the user has explicitly opted out
|
|
24
|
+
*/
|
|
25
|
+
isOptedOut(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Opt out of tracking
|
|
28
|
+
*/
|
|
29
|
+
optOut(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Opt back in to tracking
|
|
32
|
+
*/
|
|
33
|
+
optIn(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Check if tracking should be allowed based on all privacy signals
|
|
36
|
+
*/
|
|
37
|
+
shouldTrack(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get a summary of privacy signals for debugging
|
|
40
|
+
*/
|
|
41
|
+
getPrivacyStatus(): {
|
|
42
|
+
dntEnabled: boolean;
|
|
43
|
+
gpcEnabled: boolean;
|
|
44
|
+
optedOut: boolean;
|
|
45
|
+
respectDNT: boolean;
|
|
46
|
+
trackingAllowed: boolean;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Debug logger
|
|
50
|
+
*/
|
|
51
|
+
private log;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=privacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/core/privacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGhD;;;;;GAKG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,KAAK,CAAU;gBAEX,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,UAAQ;IAMzE;;OAEG;IACH,YAAY,IAAI,OAAO;IAWvB;;;OAGG;IACH,YAAY,IAAI,OAAO;IASvB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,WAAW,IAAI,OAAO;IAmBtB;;OAEG;IACH,gBAAgB,IAAI;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;KACzB;IAUD;;OAEG;IACH,OAAO,CAAC,GAAG;CAKX"}
|