@tracelog/lib 0.5.4 → 0.6.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/README.md +157 -180
- package/dist/browser/tracelog.esm.js +1007 -1357
- package/dist/browser/tracelog.js +2 -2
- package/dist/cjs/api.d.ts +12 -2
- package/dist/cjs/api.js +63 -27
- package/dist/cjs/app.d.ts +2 -2
- package/dist/cjs/app.js +26 -32
- package/dist/cjs/constants/config.constants.d.ts +4 -2
- package/dist/cjs/constants/config.constants.js +6 -18
- package/dist/cjs/constants/index.d.ts +0 -1
- package/dist/cjs/constants/index.js +0 -1
- package/dist/cjs/constants/storage.constants.d.ts +3 -2
- package/dist/cjs/constants/storage.constants.js +4 -4
- package/dist/cjs/handlers/click.handler.js +3 -6
- package/dist/cjs/handlers/error.handler.js +1 -11
- package/dist/cjs/handlers/page-view.handler.js +0 -4
- package/dist/cjs/handlers/performance.handler.js +14 -29
- package/dist/cjs/handlers/scroll.handler.js +7 -6
- package/dist/cjs/handlers/session.handler.js +7 -6
- package/dist/cjs/integrations/google-analytics.integration.js +2 -6
- package/dist/cjs/listeners/activity-listener-manager.js +3 -3
- package/dist/cjs/listeners/input-listener-managers.js +3 -3
- package/dist/cjs/listeners/touch-listener-manager.js +3 -3
- package/dist/cjs/listeners/unload-listener-manager.js +3 -3
- package/dist/cjs/listeners/visibility-listener-manager.js +3 -3
- package/dist/cjs/managers/event.manager.d.ts +2 -1
- package/dist/cjs/managers/event.manager.js +60 -38
- package/dist/cjs/managers/sender.manager.js +29 -36
- package/dist/cjs/managers/session.manager.js +5 -13
- package/dist/cjs/managers/state.manager.d.ts +0 -3
- package/dist/cjs/managers/state.manager.js +1 -43
- package/dist/cjs/managers/storage.manager.d.ts +16 -2
- package/dist/cjs/managers/storage.manager.js +73 -19
- package/dist/cjs/managers/user.manager.d.ts +1 -1
- package/dist/cjs/managers/user.manager.js +2 -2
- package/dist/cjs/public-api.d.ts +3 -3
- package/dist/cjs/public-api.js +1 -1
- package/dist/cjs/test-bridge.d.ts +1 -0
- package/dist/cjs/test-bridge.js +37 -2
- package/dist/cjs/types/config.types.d.ts +15 -18
- package/dist/cjs/types/config.types.js +6 -0
- package/dist/cjs/types/event.types.d.ts +1 -13
- package/dist/cjs/types/index.d.ts +0 -2
- package/dist/cjs/types/index.js +0 -2
- package/dist/cjs/types/mode.types.d.ts +1 -2
- package/dist/cjs/types/mode.types.js +0 -1
- package/dist/cjs/types/queue.types.d.ts +0 -6
- package/dist/cjs/types/state.types.d.ts +2 -0
- package/dist/cjs/types/test-bridge.types.d.ts +2 -2
- package/dist/cjs/types/validation-error.types.d.ts +0 -6
- package/dist/cjs/types/validation-error.types.js +1 -10
- package/dist/cjs/utils/browser/device-detector.utils.js +2 -24
- package/dist/cjs/utils/browser/index.d.ts +1 -0
- package/dist/cjs/utils/browser/index.js +1 -0
- package/dist/cjs/utils/browser/qa-mode.utils.d.ts +13 -0
- package/dist/cjs/utils/browser/qa-mode.utils.js +43 -0
- package/dist/cjs/utils/browser/utm-params.utils.js +0 -15
- package/dist/cjs/utils/data/uuid.utils.d.ts +13 -0
- package/dist/cjs/utils/data/uuid.utils.js +37 -1
- package/dist/cjs/utils/index.d.ts +1 -1
- package/dist/cjs/utils/index.js +1 -1
- package/dist/cjs/utils/logging.utils.d.ts +6 -0
- package/dist/cjs/utils/logging.utils.js +25 -0
- package/dist/cjs/utils/network/index.d.ts +0 -1
- package/dist/cjs/utils/network/index.js +0 -1
- package/dist/cjs/utils/network/url.utils.d.ts +2 -8
- package/dist/cjs/utils/network/url.utils.js +46 -90
- package/dist/cjs/utils/security/sanitize.utils.d.ts +1 -13
- package/dist/cjs/utils/security/sanitize.utils.js +15 -178
- package/dist/cjs/utils/validations/config-validations.utils.d.ts +3 -9
- package/dist/cjs/utils/validations/config-validations.utils.js +48 -94
- package/dist/cjs/utils/validations/event-validations.utils.js +11 -5
- package/dist/cjs/utils/validations/index.d.ts +0 -1
- package/dist/cjs/utils/validations/index.js +0 -1
- package/dist/cjs/utils/validations/metadata-validations.utils.js +0 -1
- package/dist/cjs/utils/validations/type-guards.utils.d.ts +2 -2
- package/dist/cjs/utils/validations/type-guards.utils.js +50 -4
- package/dist/esm/api.d.ts +12 -2
- package/dist/esm/api.js +62 -27
- package/dist/esm/app.d.ts +2 -2
- package/dist/esm/app.js +28 -34
- package/dist/esm/constants/config.constants.d.ts +4 -2
- package/dist/esm/constants/config.constants.js +4 -16
- package/dist/esm/constants/index.d.ts +0 -1
- package/dist/esm/constants/index.js +0 -1
- package/dist/esm/constants/storage.constants.d.ts +3 -2
- package/dist/esm/constants/storage.constants.js +3 -2
- package/dist/esm/handlers/click.handler.js +3 -6
- package/dist/esm/handlers/error.handler.js +1 -11
- package/dist/esm/handlers/page-view.handler.js +0 -4
- package/dist/esm/handlers/performance.handler.js +14 -29
- package/dist/esm/handlers/scroll.handler.js +7 -6
- package/dist/esm/handlers/session.handler.js +7 -6
- package/dist/esm/integrations/google-analytics.integration.js +3 -7
- package/dist/esm/listeners/activity-listener-manager.js +3 -3
- package/dist/esm/listeners/input-listener-managers.js +3 -3
- package/dist/esm/listeners/touch-listener-manager.js +3 -3
- package/dist/esm/listeners/unload-listener-manager.js +3 -3
- package/dist/esm/listeners/visibility-listener-manager.js +3 -3
- package/dist/esm/managers/event.manager.d.ts +2 -1
- package/dist/esm/managers/event.manager.js +62 -40
- package/dist/esm/managers/sender.manager.js +31 -38
- package/dist/esm/managers/session.manager.js +5 -13
- package/dist/esm/managers/state.manager.d.ts +0 -3
- package/dist/esm/managers/state.manager.js +1 -43
- package/dist/esm/managers/storage.manager.d.ts +16 -2
- package/dist/esm/managers/storage.manager.js +73 -19
- package/dist/esm/managers/user.manager.d.ts +1 -1
- package/dist/esm/managers/user.manager.js +2 -2
- package/dist/esm/public-api.d.ts +3 -3
- package/dist/esm/public-api.js +1 -1
- package/dist/esm/test-bridge.d.ts +1 -0
- package/dist/esm/test-bridge.js +37 -2
- package/dist/esm/types/config.types.d.ts +15 -18
- package/dist/esm/types/config.types.js +5 -1
- package/dist/esm/types/event.types.d.ts +1 -13
- package/dist/esm/types/index.d.ts +0 -2
- package/dist/esm/types/index.js +0 -2
- package/dist/esm/types/mode.types.d.ts +1 -2
- package/dist/esm/types/mode.types.js +0 -1
- package/dist/esm/types/queue.types.d.ts +0 -6
- package/dist/esm/types/state.types.d.ts +2 -0
- package/dist/esm/types/test-bridge.types.d.ts +2 -2
- package/dist/esm/types/validation-error.types.d.ts +0 -6
- package/dist/esm/types/validation-error.types.js +0 -8
- package/dist/esm/utils/browser/device-detector.utils.js +2 -24
- package/dist/esm/utils/browser/index.d.ts +1 -0
- package/dist/esm/utils/browser/index.js +1 -0
- package/dist/esm/utils/browser/qa-mode.utils.d.ts +13 -0
- package/dist/esm/utils/browser/qa-mode.utils.js +39 -0
- package/dist/esm/utils/browser/utm-params.utils.js +0 -15
- package/dist/esm/utils/data/uuid.utils.d.ts +13 -0
- package/dist/esm/utils/data/uuid.utils.js +35 -0
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/logging.utils.d.ts +6 -0
- package/dist/esm/utils/logging.utils.js +20 -0
- package/dist/esm/utils/network/index.d.ts +0 -1
- package/dist/esm/utils/network/index.js +0 -1
- package/dist/esm/utils/network/url.utils.d.ts +2 -8
- package/dist/esm/utils/network/url.utils.js +45 -88
- package/dist/esm/utils/security/sanitize.utils.d.ts +1 -13
- package/dist/esm/utils/security/sanitize.utils.js +15 -176
- package/dist/esm/utils/validations/config-validations.utils.d.ts +3 -9
- package/dist/esm/utils/validations/config-validations.utils.js +49 -94
- package/dist/esm/utils/validations/event-validations.utils.js +11 -5
- package/dist/esm/utils/validations/index.d.ts +0 -1
- package/dist/esm/utils/validations/index.js +0 -1
- package/dist/esm/utils/validations/metadata-validations.utils.js +0 -1
- package/dist/esm/utils/validations/type-guards.utils.d.ts +2 -2
- package/dist/esm/utils/validations/type-guards.utils.js +50 -4
- package/package.json +1 -1
- package/dist/cjs/app.types.d.ts +0 -2
- package/dist/cjs/app.types.js +0 -12
- package/dist/cjs/constants/api.constants.d.ts +0 -6
- package/dist/cjs/constants/api.constants.js +0 -14
- package/dist/cjs/managers/api.manager.d.ts +0 -13
- package/dist/cjs/managers/api.manager.js +0 -44
- package/dist/cjs/managers/config.builder.d.ts +0 -33
- package/dist/cjs/managers/config.builder.js +0 -116
- package/dist/cjs/managers/config.manager.d.ts +0 -56
- package/dist/cjs/managers/config.manager.js +0 -157
- package/dist/cjs/managers/tags.manager.d.ts +0 -36
- package/dist/cjs/managers/tags.manager.js +0 -171
- package/dist/cjs/types/api.types.d.ts +0 -52
- package/dist/cjs/types/api.types.js +0 -56
- package/dist/cjs/types/tag.types.d.ts +0 -43
- package/dist/cjs/types/tag.types.js +0 -31
- package/dist/cjs/utils/logging/debug-logger.utils.d.ts +0 -14
- package/dist/cjs/utils/logging/debug-logger.utils.js +0 -47
- package/dist/cjs/utils/logging/index.d.ts +0 -1
- package/dist/cjs/utils/logging/index.js +0 -5
- package/dist/cjs/utils/network/fetch-with-timeout.utils.d.ts +0 -4
- package/dist/cjs/utils/network/fetch-with-timeout.utils.js +0 -25
- package/dist/cjs/utils/validations/url-validations.utils.d.ts +0 -15
- package/dist/cjs/utils/validations/url-validations.utils.js +0 -47
- package/dist/esm/app.types.d.ts +0 -2
- package/dist/esm/app.types.js +0 -1
- package/dist/esm/constants/api.constants.d.ts +0 -6
- package/dist/esm/constants/api.constants.js +0 -11
- package/dist/esm/managers/api.manager.d.ts +0 -13
- package/dist/esm/managers/api.manager.js +0 -41
- package/dist/esm/managers/config.builder.d.ts +0 -33
- package/dist/esm/managers/config.builder.js +0 -112
- package/dist/esm/managers/config.manager.d.ts +0 -56
- package/dist/esm/managers/config.manager.js +0 -153
- package/dist/esm/managers/tags.manager.d.ts +0 -36
- package/dist/esm/managers/tags.manager.js +0 -167
- package/dist/esm/types/api.types.d.ts +0 -52
- package/dist/esm/types/api.types.js +0 -53
- package/dist/esm/types/tag.types.d.ts +0 -43
- package/dist/esm/types/tag.types.js +0 -28
- package/dist/esm/utils/logging/debug-logger.utils.d.ts +0 -14
- package/dist/esm/utils/logging/debug-logger.utils.js +0 -44
- package/dist/esm/utils/logging/index.d.ts +0 -1
- package/dist/esm/utils/logging/index.js +0 -1
- package/dist/esm/utils/network/fetch-with-timeout.utils.d.ts +0 -4
- package/dist/esm/utils/network/fetch-with-timeout.utils.js +0 -22
- package/dist/esm/utils/validations/url-validations.utils.d.ts +0 -15
- package/dist/esm/utils/validations/url-validations.utils.js +0 -42
package/dist/cjs/app.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.App = void 0;
|
|
4
|
-
const api_manager_1 = require("./managers/api.manager");
|
|
5
|
-
const config_manager_1 = require("./managers/config.manager");
|
|
6
4
|
const event_manager_1 = require("./managers/event.manager");
|
|
7
5
|
const user_manager_1 = require("./managers/user.manager");
|
|
8
6
|
const state_manager_1 = require("./managers/state.manager");
|
|
@@ -30,27 +28,25 @@ class App extends state_manager_1.StateManager {
|
|
|
30
28
|
get initialized() {
|
|
31
29
|
return this.isInitialized;
|
|
32
30
|
}
|
|
33
|
-
async init(
|
|
31
|
+
async init(config) {
|
|
34
32
|
if (this.isInitialized) {
|
|
35
33
|
return;
|
|
36
34
|
}
|
|
37
|
-
if (!appConfig.id?.trim()) {
|
|
38
|
-
throw new Error('Project ID is required');
|
|
39
|
-
}
|
|
40
35
|
this.managers.storage = new storage_manager_1.StorageManager();
|
|
41
36
|
try {
|
|
42
|
-
|
|
37
|
+
this.setupState(config);
|
|
43
38
|
await this.setupIntegrations();
|
|
44
39
|
this.managers.event = new event_manager_1.EventManager(this.managers.storage, this.integrations.googleAnalytics, this.emitter);
|
|
45
|
-
this.initializeHandlers();
|
|
46
|
-
await this.managers.event.recoverPersistedEvents().catch(() => {
|
|
47
|
-
utils_1.
|
|
40
|
+
await this.initializeHandlers();
|
|
41
|
+
await this.managers.event.recoverPersistedEvents().catch((error) => {
|
|
42
|
+
(0, utils_1.log)('warn', 'Failed to recover persisted events', { error });
|
|
48
43
|
});
|
|
49
44
|
this.isInitialized = true;
|
|
50
45
|
}
|
|
51
46
|
catch (error) {
|
|
52
47
|
await this.destroy(true);
|
|
53
|
-
|
|
48
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
49
|
+
throw new Error(`[TraceLog] TraceLog initialization failed: ${errorMessage}`);
|
|
54
50
|
}
|
|
55
51
|
}
|
|
56
52
|
sendCustomEvent(name, metadata) {
|
|
@@ -59,9 +55,8 @@ class App extends state_manager_1.StateManager {
|
|
|
59
55
|
}
|
|
60
56
|
const { valid, error, sanitizedMetadata } = (0, utils_1.isEventValid)(name, metadata);
|
|
61
57
|
if (!valid) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
throw new Error(`Custom event "${name}" validation failed: ${error}`);
|
|
58
|
+
if (this.get('mode') === types_1.Mode.QA) {
|
|
59
|
+
throw new Error(`[TraceLog] Custom event "${name}" validation failed: ${error}`);
|
|
65
60
|
}
|
|
66
61
|
return;
|
|
67
62
|
}
|
|
@@ -90,8 +85,8 @@ class App extends state_manager_1.StateManager {
|
|
|
90
85
|
try {
|
|
91
86
|
await handler.stopTracking();
|
|
92
87
|
}
|
|
93
|
-
catch {
|
|
94
|
-
utils_1.
|
|
88
|
+
catch (error) {
|
|
89
|
+
(0, utils_1.log)('warn', 'Failed to stop tracking', { error });
|
|
95
90
|
}
|
|
96
91
|
});
|
|
97
92
|
await Promise.allSettled(handlerCleanups);
|
|
@@ -108,22 +103,25 @@ class App extends state_manager_1.StateManager {
|
|
|
108
103
|
this.isInitialized = false;
|
|
109
104
|
this.handlers = {};
|
|
110
105
|
}
|
|
111
|
-
|
|
112
|
-
const apiUrl = (0, api_manager_1.getApiUrlForProject)(appConfig.id, appConfig.allowHttp);
|
|
113
|
-
this.set('apiUrl', apiUrl);
|
|
114
|
-
const configManager = new config_manager_1.ConfigManager();
|
|
115
|
-
const config = await configManager.get(apiUrl, appConfig);
|
|
106
|
+
setupState(config) {
|
|
116
107
|
this.set('config', config);
|
|
117
|
-
const userId = user_manager_1.UserManager.getId(this.managers.storage
|
|
108
|
+
const userId = user_manager_1.UserManager.getId(this.managers.storage);
|
|
118
109
|
this.set('userId', userId);
|
|
119
|
-
|
|
110
|
+
const apiUrl = (0, utils_1.getApiUrl)(config);
|
|
111
|
+
this.set('apiUrl', apiUrl);
|
|
112
|
+
const device = (0, utils_1.getDeviceType)();
|
|
113
|
+
this.set('device', device);
|
|
120
114
|
const pageUrl = (0, utils_1.normalizeUrl)(window.location.href, config.sensitiveQueryParams);
|
|
121
115
|
this.set('pageUrl', pageUrl);
|
|
116
|
+
const mode = (0, utils_1.detectQaMode)() ? types_1.Mode.QA : undefined;
|
|
117
|
+
if (mode) {
|
|
118
|
+
this.set('mode', mode);
|
|
119
|
+
}
|
|
122
120
|
}
|
|
123
121
|
async setupIntegrations() {
|
|
124
122
|
const config = this.get('config');
|
|
125
123
|
const measurementId = config.integrations?.googleAnalytics?.measurementId;
|
|
126
|
-
if (
|
|
124
|
+
if (measurementId?.trim()) {
|
|
127
125
|
try {
|
|
128
126
|
this.integrations.googleAnalytics = new google_analytics_integration_1.GoogleAnalyticsIntegration();
|
|
129
127
|
await this.integrations.googleAnalytics.initialize();
|
|
@@ -133,13 +131,9 @@ class App extends state_manager_1.StateManager {
|
|
|
133
131
|
}
|
|
134
132
|
}
|
|
135
133
|
}
|
|
136
|
-
initializeHandlers() {
|
|
134
|
+
async initializeHandlers() {
|
|
137
135
|
this.handlers.session = new session_handler_1.SessionHandler(this.managers.storage, this.managers.event);
|
|
138
|
-
this.handlers.session.startTracking()
|
|
139
|
-
utils_1.debugLog.error('App', 'Session handler failed to start', {
|
|
140
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
141
|
-
});
|
|
142
|
-
});
|
|
136
|
+
await this.handlers.session.startTracking();
|
|
143
137
|
const onPageView = () => {
|
|
144
138
|
this.set('suppressNextScroll', true);
|
|
145
139
|
if (this.suppressNextScrollTimer) {
|
|
@@ -156,8 +150,8 @@ class App extends state_manager_1.StateManager {
|
|
|
156
150
|
this.handlers.scroll = new scroll_handler_1.ScrollHandler(this.managers.event);
|
|
157
151
|
this.handlers.scroll.startTracking();
|
|
158
152
|
this.handlers.performance = new performance_handler_1.PerformanceHandler(this.managers.event);
|
|
159
|
-
this.handlers.performance.startTracking().catch(() => {
|
|
160
|
-
utils_1.
|
|
153
|
+
this.handlers.performance.startTracking().catch((error) => {
|
|
154
|
+
(0, utils_1.log)('warn', 'Failed to start performance tracking', { error });
|
|
161
155
|
});
|
|
162
156
|
this.handlers.error = new error_handler_1.ErrorHandler(this.managers.event);
|
|
163
157
|
this.handlers.error.startTracking();
|
|
@@ -29,6 +29,7 @@ export declare const MAX_CUSTOM_EVENT_NAME_LENGTH = 120;
|
|
|
29
29
|
export declare const MAX_CUSTOM_EVENT_STRING_SIZE: number;
|
|
30
30
|
export declare const MAX_CUSTOM_EVENT_KEYS = 10;
|
|
31
31
|
export declare const MAX_CUSTOM_EVENT_ARRAY_SIZE = 10;
|
|
32
|
+
export declare const MAX_NESTED_OBJECT_KEYS = 20;
|
|
32
33
|
export declare const MAX_TEXT_LENGTH = 255;
|
|
33
34
|
export declare const MAX_STRING_LENGTH = 1000;
|
|
34
35
|
export declare const MAX_ARRAY_LENGTH = 100;
|
|
@@ -38,7 +39,7 @@ export declare const SYNC_XHR_TIMEOUT_MS = 2000;
|
|
|
38
39
|
export declare const MAX_FINGERPRINTS = 1000;
|
|
39
40
|
export declare const FINGERPRINT_CLEANUP_MULTIPLIER = 10;
|
|
40
41
|
export declare const MAX_FINGERPRINTS_HARD_LIMIT = 2000;
|
|
41
|
-
export declare const HTML_DATA_ATTR_PREFIX = "data-
|
|
42
|
+
export declare const HTML_DATA_ATTR_PREFIX = "data-tlog";
|
|
42
43
|
export declare const INTERACTIVE_SELECTORS: readonly ["button", "a", "input[type=\"button\"]", "input[type=\"submit\"]", "input[type=\"reset\"]", "input[type=\"checkbox\"]", "input[type=\"radio\"]", "select", "textarea", "[role=\"button\"]", "[role=\"link\"]", "[role=\"tab\"]", "[role=\"menuitem\"]", "[role=\"option\"]", "[role=\"checkbox\"]", "[role=\"radio\"]", "[role=\"switch\"]", "[routerLink]", "[ng-click]", "[data-action]", "[data-click]", "[data-navigate]", "[data-toggle]", "[onclick]", ".btn", ".button", ".clickable", ".nav-link", ".menu-item", "[data-testid]", "[tabindex=\"0\"]"];
|
|
43
44
|
export declare const UTM_PARAMS: string[];
|
|
44
45
|
export declare const INITIALIZATION_MAX_CONCURRENT_RETRIES = 20;
|
|
@@ -60,13 +61,14 @@ export declare const RETRY_BACKOFF_INITIAL = 1000;
|
|
|
60
61
|
export declare const RETRY_BACKOFF_MAX = 30000;
|
|
61
62
|
export declare const RATE_LIMIT_INTERVAL = 1000;
|
|
62
63
|
export declare const MAX_RETRY_ATTEMPTS = 10;
|
|
63
|
-
export declare const ALLOWED_API_CONFIG_KEYS: Set<"mode" | "samplingRate" | "excludedUrlPaths" | keyof import("../types").ExclusiveApiConfig>;
|
|
64
64
|
export declare const VALIDATION_MESSAGES: {
|
|
65
65
|
readonly MISSING_PROJECT_ID: "Project ID is required";
|
|
66
66
|
readonly PROJECT_ID_EMPTY_AFTER_TRIM: "Project ID is required";
|
|
67
67
|
readonly INVALID_SESSION_TIMEOUT: "Session timeout must be between 30000ms (30 seconds) and 86400000ms (24 hours)";
|
|
68
68
|
readonly INVALID_SAMPLING_RATE: "Sampling rate must be between 0 and 1";
|
|
69
69
|
readonly INVALID_ERROR_SAMPLING_RATE: "Error sampling must be between 0 and 1";
|
|
70
|
+
readonly INVALID_TRACELOG_PROJECT_ID: "TraceLog project ID is required when integration is enabled";
|
|
71
|
+
readonly INVALID_CUSTOM_API_URL: "Custom API URL is required when integration is enabled";
|
|
70
72
|
readonly INVALID_GOOGLE_ANALYTICS_ID: "Google Analytics measurement ID is required when integration is enabled";
|
|
71
73
|
readonly INVALID_SCROLL_CONTAINER_SELECTORS: "Scroll container selectors must be valid CSS selectors";
|
|
72
74
|
readonly INVALID_GLOBAL_METADATA: "Global metadata must be an object";
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* This file centralizes all timing, limits, browser, and initialization constants
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.XSS_PATTERNS = exports.VALIDATION_MESSAGES = exports.
|
|
7
|
+
exports.TAB_CLEANUP_DELAY_MS = exports.TAB_ELECTION_TIMEOUT_MS = exports.TAB_HEARTBEAT_INTERVAL_MS = exports.CROSS_TAB_INITIALIZATION_LOCK_TIMEOUT_MS = exports.SESSION_CLEANUP_DELAY_MS = exports.SESSION_MAX_RETRY_ATTEMPTS = exports.SESSION_SYNC_TIMEOUT_MS = exports.INITIALIZATION_TIMEOUT_MS = exports.INITIALIZATION_CONCURRENT_RETRY_DELAY_MS = exports.INITIALIZATION_MAX_CONCURRENT_RETRIES = exports.UTM_PARAMS = exports.INTERACTIVE_SELECTORS = exports.HTML_DATA_ATTR_PREFIX = exports.MAX_FINGERPRINTS_HARD_LIMIT = exports.FINGERPRINT_CLEANUP_MULTIPLIER = exports.MAX_FINGERPRINTS = exports.SYNC_XHR_TIMEOUT_MS = exports.PRECISION_TWO_DECIMALS = exports.MAX_OBJECT_DEPTH = exports.MAX_ARRAY_LENGTH = exports.MAX_STRING_LENGTH = exports.MAX_TEXT_LENGTH = exports.MAX_NESTED_OBJECT_KEYS = exports.MAX_CUSTOM_EVENT_ARRAY_SIZE = exports.MAX_CUSTOM_EVENT_KEYS = exports.MAX_CUSTOM_EVENT_STRING_SIZE = exports.MAX_CUSTOM_EVENT_NAME_LENGTH = exports.MAX_SESSION_TIMEOUT_MS = exports.MIN_SESSION_TIMEOUT_MS = exports.BATCH_SIZE_THRESHOLD = exports.MAX_SAMPLING_RATE = exports.MIN_SAMPLING_RATE = exports.DEFAULT_SAMPLING_RATE = exports.MAX_SCROLL_EVENTS_PER_SESSION = exports.SCROLL_MIN_EVENT_INTERVAL_MS = exports.MIN_SCROLL_DEPTH_CHANGE = exports.SIGNIFICANT_SCROLL_DELTA = exports.DEFAULT_MOTION_THRESHOLD = exports.MAX_METADATA_SIZE = exports.REQUEST_TIMEOUT_MS = exports.RETRY_DELAY_MS = exports.MAX_RETRIES = exports.MAX_EVENTS_QUEUE_LENGTH = exports.EVENT_PERSISTENCE_MAX_AGE_MS = exports.EVENT_EXPIRY_HOURS = exports.DEFAULT_VISIBILITY_TIMEOUT_MS = exports.SCROLL_DEBOUNCE_TIME_MS = exports.EVENT_SENT_INTERVAL_MS = exports.DUPLICATE_EVENT_THRESHOLD_MS = exports.DEFAULT_SESSION_TIMEOUT = void 0;
|
|
8
|
+
exports.XSS_PATTERNS = exports.VALIDATION_MESSAGES = exports.MAX_RETRY_ATTEMPTS = exports.RATE_LIMIT_INTERVAL = exports.RETRY_BACKOFF_MAX = exports.RETRY_BACKOFF_INITIAL = exports.SCROLL_SUPPRESS_MULTIPLIER = exports.MIN_SESSION_RECOVERY_WINDOW_MS = exports.MAX_SESSION_RECOVERY_WINDOW_MS = exports.MAX_SESSION_RECOVERY_ATTEMPTS = exports.SESSION_RECOVERY_WINDOW_MULTIPLIER = void 0;
|
|
9
9
|
// ============================================================================
|
|
10
10
|
// SESSION & TIMING
|
|
11
11
|
// ============================================================================
|
|
@@ -46,6 +46,7 @@ exports.MAX_CUSTOM_EVENT_NAME_LENGTH = 120;
|
|
|
46
46
|
exports.MAX_CUSTOM_EVENT_STRING_SIZE = 8 * 1024; // 8KB
|
|
47
47
|
exports.MAX_CUSTOM_EVENT_KEYS = 10;
|
|
48
48
|
exports.MAX_CUSTOM_EVENT_ARRAY_SIZE = 10;
|
|
49
|
+
exports.MAX_NESTED_OBJECT_KEYS = 20; // Maximum keys in nested objects within arrays
|
|
49
50
|
// Text content limits
|
|
50
51
|
exports.MAX_TEXT_LENGTH = 255; // For click tracking text content
|
|
51
52
|
// Data sanitization limits
|
|
@@ -63,7 +64,7 @@ exports.MAX_FINGERPRINTS_HARD_LIMIT = 2000; // Hard limit for aggressive cleanup
|
|
|
63
64
|
// ============================================================================
|
|
64
65
|
// BROWSER & HTML
|
|
65
66
|
// ============================================================================
|
|
66
|
-
exports.HTML_DATA_ATTR_PREFIX = 'data-
|
|
67
|
+
exports.HTML_DATA_ATTR_PREFIX = 'data-tlog';
|
|
67
68
|
// Interactive element selectors for click tracking
|
|
68
69
|
exports.INTERACTIVE_SELECTORS = [
|
|
69
70
|
'button',
|
|
@@ -137,31 +138,18 @@ exports.MAX_RETRY_ATTEMPTS = 10;
|
|
|
137
138
|
// ============================================================================
|
|
138
139
|
// VALIDATION
|
|
139
140
|
// ============================================================================
|
|
140
|
-
// Allowed API config keys for runtime validation
|
|
141
|
-
exports.ALLOWED_API_CONFIG_KEYS = new Set([
|
|
142
|
-
'mode',
|
|
143
|
-
'tags',
|
|
144
|
-
'samplingRate',
|
|
145
|
-
'excludedUrlPaths',
|
|
146
|
-
'ipExcluded',
|
|
147
|
-
]);
|
|
148
141
|
// Validation error messages - standardized across all layers
|
|
149
142
|
exports.VALIDATION_MESSAGES = {
|
|
150
|
-
// Project ID validation - consistent message across all layers
|
|
151
143
|
MISSING_PROJECT_ID: 'Project ID is required',
|
|
152
144
|
PROJECT_ID_EMPTY_AFTER_TRIM: 'Project ID is required',
|
|
153
|
-
// Session timeout validation
|
|
154
145
|
INVALID_SESSION_TIMEOUT: `Session timeout must be between ${exports.MIN_SESSION_TIMEOUT_MS}ms (30 seconds) and ${exports.MAX_SESSION_TIMEOUT_MS}ms (24 hours)`,
|
|
155
|
-
// Sampling rate validation
|
|
156
146
|
INVALID_SAMPLING_RATE: 'Sampling rate must be between 0 and 1',
|
|
157
147
|
INVALID_ERROR_SAMPLING_RATE: 'Error sampling must be between 0 and 1',
|
|
158
|
-
|
|
148
|
+
INVALID_TRACELOG_PROJECT_ID: 'TraceLog project ID is required when integration is enabled',
|
|
149
|
+
INVALID_CUSTOM_API_URL: 'Custom API URL is required when integration is enabled',
|
|
159
150
|
INVALID_GOOGLE_ANALYTICS_ID: 'Google Analytics measurement ID is required when integration is enabled',
|
|
160
|
-
// UI validation
|
|
161
151
|
INVALID_SCROLL_CONTAINER_SELECTORS: 'Scroll container selectors must be valid CSS selectors',
|
|
162
|
-
// Global metadata validation
|
|
163
152
|
INVALID_GLOBAL_METADATA: 'Global metadata must be an object',
|
|
164
|
-
// Array validation
|
|
165
153
|
INVALID_SENSITIVE_QUERY_PARAMS: 'Sensitive query params must be an array of strings',
|
|
166
154
|
};
|
|
167
155
|
// ============================================================================
|
|
@@ -14,7 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./api.constants"), exports);
|
|
18
17
|
__exportStar(require("./config.constants"), exports);
|
|
19
18
|
__exportStar(require("./storage.constants"), exports);
|
|
20
19
|
__exportStar(require("./performance.constants"), exports);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export declare const STORAGE_BASE_KEY = "
|
|
2
|
-
export declare const
|
|
1
|
+
export declare const STORAGE_BASE_KEY = "tlog";
|
|
2
|
+
export declare const QA_MODE_KEY = "tlog:qa_mode";
|
|
3
|
+
export declare const USER_ID_KEY = "tlog:uid";
|
|
3
4
|
export declare const QUEUE_KEY: (id: string) => string;
|
|
4
5
|
export declare const SESSION_STORAGE_KEY: (id: string) => string;
|
|
5
6
|
export declare const CROSS_TAB_SESSION_KEY: (id: string) => string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BROADCAST_CHANNEL_NAME = exports.SESSION_RECOVERY_KEY = exports.TAB_SPECIFIC_INFO_KEY = exports.TAB_INFO_KEY = exports.CROSS_TAB_SESSION_KEY = exports.SESSION_STORAGE_KEY = exports.QUEUE_KEY = exports.USER_ID_KEY = exports.STORAGE_BASE_KEY = void 0;
|
|
4
|
-
exports.STORAGE_BASE_KEY = '
|
|
5
|
-
|
|
6
|
-
exports.USER_ID_KEY =
|
|
3
|
+
exports.BROADCAST_CHANNEL_NAME = exports.SESSION_RECOVERY_KEY = exports.TAB_SPECIFIC_INFO_KEY = exports.TAB_INFO_KEY = exports.CROSS_TAB_SESSION_KEY = exports.SESSION_STORAGE_KEY = exports.QUEUE_KEY = exports.USER_ID_KEY = exports.QA_MODE_KEY = exports.STORAGE_BASE_KEY = void 0;
|
|
4
|
+
exports.STORAGE_BASE_KEY = 'tlog';
|
|
5
|
+
exports.QA_MODE_KEY = `${exports.STORAGE_BASE_KEY}:qa_mode`;
|
|
6
|
+
exports.USER_ID_KEY = `${exports.STORAGE_BASE_KEY}:uid`;
|
|
7
7
|
const QUEUE_KEY = (id) => (id ? `${exports.STORAGE_BASE_KEY}:${id}:queue` : `${exports.STORAGE_BASE_KEY}:queue`);
|
|
8
8
|
exports.QUEUE_KEY = QUEUE_KEY;
|
|
9
9
|
const SESSION_STORAGE_KEY = (id) => id ? `${exports.STORAGE_BASE_KEY}:${id}:session` : `${exports.STORAGE_BASE_KEY}:session`;
|
|
@@ -4,7 +4,7 @@ exports.ClickHandler = void 0;
|
|
|
4
4
|
const constants_1 = require("../constants");
|
|
5
5
|
const types_1 = require("../types");
|
|
6
6
|
const state_manager_1 = require("../managers/state.manager");
|
|
7
|
-
const
|
|
7
|
+
const utils_1 = require("@/utils");
|
|
8
8
|
class ClickHandler extends state_manager_1.StateManager {
|
|
9
9
|
constructor(eventManager) {
|
|
10
10
|
super();
|
|
@@ -23,7 +23,7 @@ class ClickHandler extends state_manager_1.StateManager {
|
|
|
23
23
|
? target.parentElement
|
|
24
24
|
: null;
|
|
25
25
|
if (!clickedElement) {
|
|
26
|
-
|
|
26
|
+
(0, utils_1.log)('warn', 'Click target not found or not an element');
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
29
|
const trackingElement = this.findTrackingElement(clickedElement);
|
|
@@ -75,10 +75,7 @@ class ClickHandler extends state_manager_1.StateManager {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
catch (error) {
|
|
78
|
-
|
|
79
|
-
selector,
|
|
80
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
81
|
-
});
|
|
78
|
+
(0, utils_1.log)('warn', 'Invalid selector in element search', { error, data: { selector } });
|
|
82
79
|
continue;
|
|
83
80
|
}
|
|
84
81
|
}
|
|
@@ -4,7 +4,6 @@ exports.ErrorHandler = void 0;
|
|
|
4
4
|
const state_manager_1 = require("../managers/state.manager");
|
|
5
5
|
const types_1 = require("../types");
|
|
6
6
|
const error_constants_1 = require("../constants/error.constants");
|
|
7
|
-
const logging_1 = require("../utils/logging");
|
|
8
7
|
/**
|
|
9
8
|
* Simplified error handler for tracking JavaScript errors and unhandled promise rejections
|
|
10
9
|
* Includes PII sanitization and sampling support
|
|
@@ -21,11 +20,6 @@ class ErrorHandler extends state_manager_1.StateManager {
|
|
|
21
20
|
if (this.shouldSuppressError(types_1.ErrorType.JS_ERROR, sanitizedMessage)) {
|
|
22
21
|
return;
|
|
23
22
|
}
|
|
24
|
-
logging_1.debugLog.warn('ErrorHandler', 'JS error captured', {
|
|
25
|
-
message: sanitizedMessage,
|
|
26
|
-
filename: event.filename,
|
|
27
|
-
line: event.lineno,
|
|
28
|
-
});
|
|
29
23
|
this.eventManager.track({
|
|
30
24
|
type: types_1.EventType.ERROR,
|
|
31
25
|
error_data: {
|
|
@@ -46,7 +40,6 @@ class ErrorHandler extends state_manager_1.StateManager {
|
|
|
46
40
|
if (this.shouldSuppressError(types_1.ErrorType.PROMISE_REJECTION, sanitizedMessage)) {
|
|
47
41
|
return;
|
|
48
42
|
}
|
|
49
|
-
logging_1.debugLog.warn('ErrorHandler', 'Promise rejection captured', { message: sanitizedMessage });
|
|
50
43
|
this.eventManager.track({
|
|
51
44
|
type: types_1.EventType.ERROR,
|
|
52
45
|
error_data: {
|
|
@@ -110,10 +103,7 @@ class ErrorHandler extends state_manager_1.StateManager {
|
|
|
110
103
|
}
|
|
111
104
|
this.recentErrors.set(key, now);
|
|
112
105
|
if (this.recentErrors.size > error_constants_1.MAX_TRACKED_ERRORS_HARD_LIMIT) {
|
|
113
|
-
|
|
114
|
-
size: this.recentErrors.size,
|
|
115
|
-
limit: error_constants_1.MAX_TRACKED_ERRORS_HARD_LIMIT,
|
|
116
|
-
});
|
|
106
|
+
// Hard limit exceeded, clearing all tracked errors
|
|
117
107
|
this.recentErrors.clear();
|
|
118
108
|
this.recentErrors.set(key, now);
|
|
119
109
|
return false;
|
|
@@ -4,7 +4,6 @@ exports.PageViewHandler = void 0;
|
|
|
4
4
|
const types_1 = require("../types");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
6
|
const state_manager_1 = require("../managers/state.manager");
|
|
7
|
-
const logging_1 = require("../utils/logging");
|
|
8
7
|
class PageViewHandler extends state_manager_1.StateManager {
|
|
9
8
|
constructor(eventManager, onTrack) {
|
|
10
9
|
super();
|
|
@@ -16,7 +15,6 @@ class PageViewHandler extends state_manager_1.StateManager {
|
|
|
16
15
|
}
|
|
17
16
|
this.onTrack();
|
|
18
17
|
const fromUrl = this.get('pageUrl');
|
|
19
|
-
logging_1.debugLog.debug('PageViewHandler', 'Page navigation detected', { from: fromUrl, to: normalizedUrl });
|
|
20
18
|
this.set('pageUrl', normalizedUrl);
|
|
21
19
|
const pageViewData = this.extractPageViewData();
|
|
22
20
|
this.eventManager.track({
|
|
@@ -30,7 +28,6 @@ class PageViewHandler extends state_manager_1.StateManager {
|
|
|
30
28
|
this.onTrack = onTrack;
|
|
31
29
|
}
|
|
32
30
|
startTracking() {
|
|
33
|
-
logging_1.debugLog.debug('PageViewHandler', 'Starting page view tracking');
|
|
34
31
|
this.trackInitialPageView();
|
|
35
32
|
window.addEventListener('popstate', this.trackCurrentPage, true);
|
|
36
33
|
window.addEventListener('hashchange', this.trackCurrentPage, true);
|
|
@@ -38,7 +35,6 @@ class PageViewHandler extends state_manager_1.StateManager {
|
|
|
38
35
|
this.patchHistory('replaceState');
|
|
39
36
|
}
|
|
40
37
|
stopTracking() {
|
|
41
|
-
logging_1.debugLog.debug('PageViewHandler', 'Stopping page view tracking');
|
|
42
38
|
window.removeEventListener('popstate', this.trackCurrentPage, true);
|
|
43
39
|
window.removeEventListener('hashchange', this.trackCurrentPage, true);
|
|
44
40
|
if (this.originalPushState) {
|
|
@@ -37,15 +37,14 @@ exports.PerformanceHandler = void 0;
|
|
|
37
37
|
const state_manager_1 = require("../managers/state.manager");
|
|
38
38
|
const types_1 = require("../types");
|
|
39
39
|
const constants_1 = require("../constants");
|
|
40
|
-
const
|
|
41
|
-
const logging_1 = require("../utils/logging");
|
|
40
|
+
const utils_1 = require("@/utils");
|
|
42
41
|
class PerformanceHandler extends state_manager_1.StateManager {
|
|
43
42
|
constructor(eventManager) {
|
|
44
43
|
super();
|
|
45
44
|
this.reportedByNav = new Map();
|
|
46
45
|
this.observers = [];
|
|
47
46
|
this.lastLongTaskSentAt = 0;
|
|
48
|
-
this.vitalThresholds =
|
|
47
|
+
this.vitalThresholds = constants_1.WEB_VITALS_THRESHOLDS;
|
|
49
48
|
this.eventManager = eventManager;
|
|
50
49
|
}
|
|
51
50
|
async startTracking() {
|
|
@@ -58,10 +57,7 @@ class PerformanceHandler extends state_manager_1.StateManager {
|
|
|
58
57
|
obs.disconnect();
|
|
59
58
|
}
|
|
60
59
|
catch (error) {
|
|
61
|
-
|
|
62
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
63
|
-
observerIndex: index,
|
|
64
|
-
});
|
|
60
|
+
(0, utils_1.log)('warn', 'Failed to disconnect performance observer', { error, data: { observerIndex: index } });
|
|
65
61
|
}
|
|
66
62
|
});
|
|
67
63
|
this.observers.length = 0;
|
|
@@ -134,9 +130,7 @@ class PerformanceHandler extends state_manager_1.StateManager {
|
|
|
134
130
|
onINP(report('INP'));
|
|
135
131
|
}
|
|
136
132
|
catch (error) {
|
|
137
|
-
|
|
138
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
139
|
-
});
|
|
133
|
+
(0, utils_1.log)('warn', 'Failed to load web-vitals library, using fallback', { error });
|
|
140
134
|
this.observeWebVitalsFallback();
|
|
141
135
|
}
|
|
142
136
|
}
|
|
@@ -157,9 +151,7 @@ class PerformanceHandler extends state_manager_1.StateManager {
|
|
|
157
151
|
}
|
|
158
152
|
}
|
|
159
153
|
catch (error) {
|
|
160
|
-
|
|
161
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
162
|
-
});
|
|
154
|
+
(0, utils_1.log)('warn', 'Failed to report TTFB', { error });
|
|
163
155
|
}
|
|
164
156
|
}
|
|
165
157
|
observeLongTasks() {
|
|
@@ -201,7 +193,7 @@ class PerformanceHandler extends state_manager_1.StateManager {
|
|
|
201
193
|
}
|
|
202
194
|
trackWebVital(type, value) {
|
|
203
195
|
if (!Number.isFinite(value)) {
|
|
204
|
-
|
|
196
|
+
(0, utils_1.log)('warn', 'Invalid web vital value', { data: { type, value } });
|
|
205
197
|
return;
|
|
206
198
|
}
|
|
207
199
|
this.eventManager.track({
|
|
@@ -224,9 +216,7 @@ class PerformanceHandler extends state_manager_1.StateManager {
|
|
|
224
216
|
return `${timestamp.toFixed(2)}_${window.location.pathname}_${random}`;
|
|
225
217
|
}
|
|
226
218
|
catch (error) {
|
|
227
|
-
|
|
228
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
229
|
-
});
|
|
219
|
+
(0, utils_1.log)('warn', 'Failed to get navigation ID', { error });
|
|
230
220
|
return null;
|
|
231
221
|
}
|
|
232
222
|
}
|
|
@@ -246,9 +236,9 @@ class PerformanceHandler extends state_manager_1.StateManager {
|
|
|
246
236
|
cb(list, observer);
|
|
247
237
|
}
|
|
248
238
|
catch (callbackError) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
239
|
+
(0, utils_1.log)('warn', 'Observer callback failed', {
|
|
240
|
+
error: callbackError,
|
|
241
|
+
data: { type },
|
|
252
242
|
});
|
|
253
243
|
}
|
|
254
244
|
if (once) {
|
|
@@ -267,25 +257,20 @@ class PerformanceHandler extends state_manager_1.StateManager {
|
|
|
267
257
|
return true;
|
|
268
258
|
}
|
|
269
259
|
catch (error) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
260
|
+
(0, utils_1.log)('warn', 'Failed to create performance observer', {
|
|
261
|
+
error,
|
|
262
|
+
data: { type },
|
|
273
263
|
});
|
|
274
264
|
return false;
|
|
275
265
|
}
|
|
276
266
|
}
|
|
277
267
|
shouldSendVital(type, value) {
|
|
278
268
|
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
279
|
-
|
|
269
|
+
(0, utils_1.log)('warn', 'Invalid web vital value', { data: { type, value } });
|
|
280
270
|
return false;
|
|
281
271
|
}
|
|
282
272
|
const threshold = this.vitalThresholds[type];
|
|
283
273
|
if (typeof threshold === 'number' && value <= threshold) {
|
|
284
|
-
logging_1.debugLog.debug('PerformanceHandler', 'Web vital below threshold, skipping', {
|
|
285
|
-
type,
|
|
286
|
-
value,
|
|
287
|
-
threshold,
|
|
288
|
-
});
|
|
289
274
|
return false;
|
|
290
275
|
}
|
|
291
276
|
return true;
|
|
@@ -4,7 +4,7 @@ exports.ScrollHandler = void 0;
|
|
|
4
4
|
const constants_1 = require("../constants");
|
|
5
5
|
const types_1 = require("../types");
|
|
6
6
|
const state_manager_1 = require("../managers/state.manager");
|
|
7
|
-
const
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
8
|
class ScrollHandler extends state_manager_1.StateManager {
|
|
9
9
|
constructor(eventManager) {
|
|
10
10
|
super();
|
|
@@ -144,8 +144,8 @@ class ScrollHandler extends state_manager_1.StateManager {
|
|
|
144
144
|
return;
|
|
145
145
|
}
|
|
146
146
|
this.limitWarningLogged = true;
|
|
147
|
-
|
|
148
|
-
limit: this.maxEventsPerSession,
|
|
147
|
+
(0, utils_1.log)('warn', 'Max scroll events per session reached', {
|
|
148
|
+
data: { limit: this.maxEventsPerSession },
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
151
|
applyConfigOverrides() {
|
|
@@ -214,9 +214,10 @@ class ScrollHandler extends state_manager_1.StateManager {
|
|
|
214
214
|
return document.querySelector(selector);
|
|
215
215
|
}
|
|
216
216
|
catch (error) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
217
|
+
(0, utils_1.log)('warn', 'Invalid CSS selector', {
|
|
218
|
+
error,
|
|
219
|
+
data: { selector },
|
|
220
|
+
showToClient: true,
|
|
220
221
|
});
|
|
221
222
|
return null;
|
|
222
223
|
}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SessionHandler = void 0;
|
|
4
4
|
const session_manager_1 = require("../managers/session.manager");
|
|
5
5
|
const state_manager_1 = require("../managers/state.manager");
|
|
6
|
-
const
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
7
|
class SessionHandler extends state_manager_1.StateManager {
|
|
8
8
|
constructor(storageManager, eventManager) {
|
|
9
9
|
super();
|
|
@@ -17,16 +17,19 @@ class SessionHandler extends state_manager_1.StateManager {
|
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
19
|
if (this.destroyed) {
|
|
20
|
-
|
|
20
|
+
(0, utils_1.log)('warn', 'Cannot start tracking on destroyed handler');
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
|
-
const
|
|
23
|
+
const config = this.get('config');
|
|
24
|
+
const projectId = config?.integrations?.tracelog?.projectId ?? config?.integrations?.custom?.apiUrl ?? 'default';
|
|
24
25
|
if (!projectId) {
|
|
25
26
|
throw new Error('Cannot start session tracking: config not available');
|
|
26
27
|
}
|
|
27
28
|
try {
|
|
28
29
|
this.sessionManager = new session_manager_1.SessionManager(this.storageManager, this.eventManager, projectId);
|
|
29
30
|
await this.sessionManager.startTracking();
|
|
31
|
+
// Flush any events that were buffered during initialization
|
|
32
|
+
this.eventManager.flushPendingEvents();
|
|
30
33
|
}
|
|
31
34
|
catch (error) {
|
|
32
35
|
if (this.sessionManager) {
|
|
@@ -38,9 +41,7 @@ class SessionHandler extends state_manager_1.StateManager {
|
|
|
38
41
|
}
|
|
39
42
|
this.sessionManager = null;
|
|
40
43
|
}
|
|
41
|
-
|
|
42
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
43
|
-
});
|
|
44
|
+
(0, utils_1.log)('error', 'Failed to start session tracking', { error });
|
|
44
45
|
throw error;
|
|
45
46
|
}
|
|
46
47
|
}
|
|
@@ -27,9 +27,7 @@ class GoogleAnalyticsIntegration extends state_manager_1.StateManager {
|
|
|
27
27
|
this.isInitialized = true;
|
|
28
28
|
}
|
|
29
29
|
catch (error) {
|
|
30
|
-
utils_1.
|
|
31
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
32
|
-
});
|
|
30
|
+
(0, utils_1.log)('error', 'Google Analytics initialization failed', { error });
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
33
|
trackEvent(eventName, metadata) {
|
|
@@ -41,9 +39,7 @@ class GoogleAnalyticsIntegration extends state_manager_1.StateManager {
|
|
|
41
39
|
window.gtag('event', eventName, normalizedMetadata);
|
|
42
40
|
}
|
|
43
41
|
catch (error) {
|
|
44
|
-
utils_1.
|
|
45
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
46
|
-
});
|
|
42
|
+
(0, utils_1.log)('error', 'Google Analytics event tracking failed', { error });
|
|
47
43
|
}
|
|
48
44
|
}
|
|
49
45
|
cleanup() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ActivityListenerManager = void 0;
|
|
4
|
-
const
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
5
|
class ActivityListenerManager {
|
|
6
6
|
constructor(onActivity) {
|
|
7
7
|
this.options = { passive: true };
|
|
@@ -14,7 +14,7 @@ class ActivityListenerManager {
|
|
|
14
14
|
window.addEventListener('focus', this.onActivity, this.options);
|
|
15
15
|
}
|
|
16
16
|
catch (error) {
|
|
17
|
-
|
|
17
|
+
(0, utils_1.log)('error', 'Failed to setup activity listeners', { error });
|
|
18
18
|
throw error;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -25,7 +25,7 @@ class ActivityListenerManager {
|
|
|
25
25
|
window.removeEventListener('focus', this.onActivity);
|
|
26
26
|
}
|
|
27
27
|
catch (error) {
|
|
28
|
-
|
|
28
|
+
(0, utils_1.log)('warn', 'Error during activity listeners cleanup', { error });
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KeyboardListenerManager = exports.MouseListenerManager = void 0;
|
|
4
|
-
const
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
5
|
/**
|
|
6
6
|
* Base class for input listener managers to reduce code duplication
|
|
7
7
|
*/
|
|
@@ -17,7 +17,7 @@ class BaseInputListenerManager {
|
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
catch (error) {
|
|
20
|
-
|
|
20
|
+
(0, utils_1.log)('error', `Failed to setup ${this.logPrefix.toLowerCase()} listeners`, { error });
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
cleanup() {
|
|
@@ -27,7 +27,7 @@ class BaseInputListenerManager {
|
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
catch (error) {
|
|
30
|
-
|
|
30
|
+
(0, utils_1.log)('warn', `Error during ${this.logPrefix.toLowerCase()} listeners cleanup`, { error });
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
}
|