@tracelog/lib 0.0.8 → 0.2.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 +58 -24
- package/dist/browser/tracelog.js +1934 -3226
- package/dist/cjs/api.d.ts +33 -19
- package/dist/cjs/api.js +111 -156
- package/dist/cjs/app.constants.d.ts +80 -1
- package/dist/cjs/app.constants.js +90 -3
- package/dist/cjs/app.d.ts +29 -44
- package/dist/cjs/app.js +114 -212
- package/dist/cjs/app.types.d.ts +2 -7
- package/dist/cjs/app.types.js +10 -21
- package/dist/cjs/constants/api.constants.js +11 -5
- package/dist/cjs/constants/config.constants.d.ts +75 -0
- package/dist/cjs/constants/config.constants.js +178 -0
- package/dist/cjs/constants/error.constants.d.ts +29 -0
- package/dist/cjs/constants/error.constants.js +50 -0
- package/dist/cjs/constants/index.d.ts +3 -6
- package/dist/cjs/constants/index.js +3 -6
- package/dist/cjs/constants/performance.constants.d.ts +28 -0
- package/dist/cjs/constants/performance.constants.js +43 -0
- package/dist/cjs/handlers/click.handler.d.ts +1 -0
- package/dist/cjs/handlers/click.handler.js +30 -49
- package/dist/cjs/handlers/error.handler.d.ts +11 -6
- package/dist/cjs/handlers/error.handler.js +91 -51
- package/dist/cjs/handlers/page-view.handler.js +38 -29
- package/dist/cjs/handlers/performance.handler.d.ts +3 -0
- package/dist/cjs/handlers/performance.handler.js +76 -37
- package/dist/cjs/handlers/scroll.handler.d.ts +15 -0
- package/dist/cjs/handlers/scroll.handler.js +105 -31
- package/dist/cjs/handlers/session.handler.d.ts +6 -20
- package/dist/cjs/handlers/session.handler.js +38 -326
- package/dist/cjs/integrations/google-analytics.integration.d.ts +0 -1
- package/dist/cjs/integrations/google-analytics.integration.js +27 -98
- package/dist/cjs/listeners/input-listener-managers.d.ts +18 -9
- package/dist/cjs/listeners/input-listener-managers.js +24 -33
- package/dist/cjs/listeners/touch-listener-manager.d.ts +1 -3
- package/dist/cjs/listeners/touch-listener-manager.js +1 -23
- package/dist/cjs/listeners/visibility-listener-manager.d.ts +1 -4
- package/dist/cjs/listeners/visibility-listener-manager.js +6 -42
- package/dist/cjs/managers/api.manager.d.ts +13 -3
- package/dist/cjs/managers/api.manager.js +35 -5
- package/dist/cjs/managers/config.manager.d.ts +53 -3
- package/dist/cjs/managers/config.manager.js +131 -62
- package/dist/cjs/managers/event.manager.d.ts +57 -36
- package/dist/cjs/managers/event.manager.js +266 -417
- package/dist/cjs/managers/sender.manager.d.ts +40 -22
- package/dist/cjs/managers/sender.manager.js +200 -198
- package/dist/cjs/managers/session.manager.d.ts +80 -66
- package/dist/cjs/managers/session.manager.js +267 -522
- package/dist/cjs/managers/state.manager.d.ts +33 -0
- package/dist/cjs/managers/state.manager.js +79 -6
- package/dist/cjs/managers/storage.manager.d.ts +26 -2
- package/dist/cjs/managers/storage.manager.js +67 -34
- package/dist/cjs/managers/tags.manager.d.ts +31 -7
- package/dist/cjs/managers/tags.manager.js +123 -241
- package/dist/cjs/managers/user.manager.d.ts +14 -5
- package/dist/cjs/managers/user.manager.js +17 -9
- package/dist/cjs/public-api.d.ts +10 -1
- package/dist/cjs/public-api.js +18 -24
- package/dist/cjs/test-bridge.d.ts +48 -0
- package/dist/cjs/test-bridge.js +110 -0
- package/dist/cjs/types/api.types.d.ts +21 -6
- package/dist/cjs/types/api.types.js +21 -6
- package/dist/cjs/types/config.types.d.ts +22 -84
- package/dist/cjs/types/emitter.types.d.ts +11 -0
- package/dist/cjs/types/emitter.types.js +8 -0
- package/dist/cjs/types/event.types.d.ts +8 -11
- package/dist/cjs/types/index.d.ts +3 -1
- package/dist/cjs/types/index.js +3 -1
- package/dist/cjs/types/queue.types.d.ts +1 -0
- package/dist/cjs/types/session.types.d.ts +0 -64
- package/dist/cjs/types/state.types.d.ts +1 -0
- package/dist/cjs/types/test-bridge.types.d.ts +38 -0
- package/dist/cjs/types/validation-error.types.d.ts +7 -0
- package/dist/cjs/types/validation-error.types.js +11 -1
- package/dist/cjs/types/window.types.d.ts +1 -8
- package/dist/cjs/utils/data/uuid.utils.d.ts +1 -1
- package/dist/cjs/utils/data/uuid.utils.js +7 -5
- package/dist/cjs/utils/emitter.utils.d.ts +8 -0
- package/dist/cjs/utils/emitter.utils.js +33 -0
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/cjs/utils/index.js +1 -0
- package/dist/cjs/utils/logging/debug-logger.utils.d.ts +10 -51
- package/dist/cjs/utils/logging/debug-logger.utils.js +36 -127
- package/dist/cjs/utils/network/fetch-with-timeout.utils.d.ts +4 -0
- package/dist/cjs/utils/network/fetch-with-timeout.utils.js +25 -0
- package/dist/cjs/utils/network/index.d.ts +1 -0
- package/dist/cjs/utils/network/index.js +1 -0
- package/dist/cjs/utils/network/url.utils.js +2 -42
- package/dist/cjs/utils/security/sanitize.utils.d.ts +1 -8
- package/dist/cjs/utils/security/sanitize.utils.js +7 -41
- package/dist/cjs/utils/validations/config-validations.utils.d.ts +7 -0
- package/dist/cjs/utils/validations/config-validations.utils.js +77 -22
- package/dist/esm/api.d.ts +33 -19
- package/dist/esm/api.js +105 -118
- package/dist/esm/app.constants.d.ts +80 -1
- package/dist/esm/app.constants.js +89 -1
- package/dist/esm/app.d.ts +29 -44
- package/dist/esm/app.js +115 -213
- package/dist/esm/app.types.d.ts +2 -7
- package/dist/esm/app.types.js +1 -7
- package/dist/esm/constants/api.constants.js +10 -4
- package/dist/esm/constants/config.constants.d.ts +75 -0
- package/dist/esm/constants/config.constants.js +174 -0
- package/dist/esm/constants/error.constants.d.ts +29 -0
- package/dist/esm/constants/error.constants.js +47 -0
- package/dist/esm/constants/index.d.ts +3 -6
- package/dist/esm/constants/index.js +3 -6
- package/dist/esm/constants/performance.constants.d.ts +28 -0
- package/dist/esm/constants/performance.constants.js +40 -0
- package/dist/esm/handlers/click.handler.d.ts +1 -0
- package/dist/esm/handlers/click.handler.js +30 -49
- package/dist/esm/handlers/error.handler.d.ts +11 -6
- package/dist/esm/handlers/error.handler.js +91 -51
- package/dist/esm/handlers/page-view.handler.js +38 -29
- package/dist/esm/handlers/performance.handler.d.ts +3 -0
- package/dist/esm/handlers/performance.handler.js +71 -32
- package/dist/esm/handlers/scroll.handler.d.ts +15 -0
- package/dist/esm/handlers/scroll.handler.js +106 -32
- package/dist/esm/handlers/session.handler.d.ts +6 -20
- package/dist/esm/handlers/session.handler.js +38 -326
- package/dist/esm/integrations/google-analytics.integration.d.ts +0 -1
- package/dist/esm/integrations/google-analytics.integration.js +27 -98
- package/dist/esm/listeners/input-listener-managers.d.ts +18 -9
- package/dist/esm/listeners/input-listener-managers.js +23 -32
- package/dist/esm/listeners/touch-listener-manager.d.ts +1 -3
- package/dist/esm/listeners/touch-listener-manager.js +1 -23
- package/dist/esm/listeners/visibility-listener-manager.d.ts +1 -4
- package/dist/esm/listeners/visibility-listener-manager.js +6 -42
- package/dist/esm/managers/api.manager.d.ts +13 -3
- package/dist/esm/managers/api.manager.js +34 -3
- package/dist/esm/managers/config.manager.d.ts +53 -3
- package/dist/esm/managers/config.manager.js +133 -64
- package/dist/esm/managers/event.manager.d.ts +57 -36
- package/dist/esm/managers/event.manager.js +268 -419
- package/dist/esm/managers/sender.manager.d.ts +40 -22
- package/dist/esm/managers/sender.manager.js +201 -199
- package/dist/esm/managers/session.manager.d.ts +80 -66
- package/dist/esm/managers/session.manager.js +269 -524
- package/dist/esm/managers/state.manager.d.ts +33 -0
- package/dist/esm/managers/state.manager.js +78 -6
- package/dist/esm/managers/storage.manager.d.ts +26 -2
- package/dist/esm/managers/storage.manager.js +66 -33
- package/dist/esm/managers/tags.manager.d.ts +31 -7
- package/dist/esm/managers/tags.manager.js +124 -242
- package/dist/esm/managers/user.manager.d.ts +14 -5
- package/dist/esm/managers/user.manager.js +17 -9
- package/dist/esm/public-api.d.ts +10 -1
- package/dist/esm/public-api.js +14 -1
- package/dist/esm/test-bridge.d.ts +48 -0
- package/dist/esm/test-bridge.js +106 -0
- package/dist/esm/types/api.types.d.ts +21 -6
- package/dist/esm/types/api.types.js +21 -6
- package/dist/esm/types/config.types.d.ts +22 -84
- package/dist/esm/types/emitter.types.d.ts +11 -0
- package/dist/esm/types/emitter.types.js +5 -0
- package/dist/esm/types/event.types.d.ts +8 -11
- package/dist/esm/types/index.d.ts +3 -1
- package/dist/esm/types/index.js +3 -1
- package/dist/esm/types/queue.types.d.ts +1 -0
- package/dist/esm/types/session.types.d.ts +0 -64
- package/dist/esm/types/state.types.d.ts +1 -0
- package/dist/esm/types/test-bridge.types.d.ts +38 -0
- package/dist/esm/types/validation-error.types.d.ts +7 -0
- package/dist/esm/types/validation-error.types.js +9 -0
- package/dist/esm/types/window.types.d.ts +1 -8
- package/dist/esm/utils/data/uuid.utils.d.ts +1 -1
- package/dist/esm/utils/data/uuid.utils.js +7 -5
- package/dist/esm/utils/emitter.utils.d.ts +8 -0
- package/dist/esm/utils/emitter.utils.js +29 -0
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/logging/debug-logger.utils.d.ts +10 -51
- package/dist/esm/utils/logging/debug-logger.utils.js +36 -127
- package/dist/esm/utils/network/fetch-with-timeout.utils.d.ts +4 -0
- package/dist/esm/utils/network/fetch-with-timeout.utils.js +22 -0
- package/dist/esm/utils/network/index.d.ts +1 -0
- package/dist/esm/utils/network/index.js +1 -0
- package/dist/esm/utils/network/url.utils.js +2 -42
- package/dist/esm/utils/security/sanitize.utils.d.ts +1 -8
- package/dist/esm/utils/security/sanitize.utils.js +6 -39
- package/dist/esm/utils/validations/config-validations.utils.d.ts +7 -0
- package/dist/esm/utils/validations/config-validations.utils.js +76 -22
- package/package.json +23 -16
- package/dist/browser/web-vitals-CCnqwnC8.mjs +0 -198
- package/dist/cjs/constants/browser.constants.d.ts +0 -3
- package/dist/cjs/constants/browser.constants.js +0 -41
- package/dist/cjs/constants/initialization.constants.d.ts +0 -40
- package/dist/cjs/constants/initialization.constants.js +0 -48
- package/dist/cjs/constants/limits.constants.d.ts +0 -25
- package/dist/cjs/constants/limits.constants.js +0 -40
- package/dist/cjs/constants/security.constants.d.ts +0 -1
- package/dist/cjs/constants/security.constants.js +0 -12
- package/dist/cjs/constants/timing.constants.d.ts +0 -22
- package/dist/cjs/constants/timing.constants.js +0 -34
- package/dist/cjs/constants/validation.constants.d.ts +0 -13
- package/dist/cjs/constants/validation.constants.js +0 -31
- package/dist/cjs/handlers/network.handler.d.ts +0 -16
- package/dist/cjs/handlers/network.handler.js +0 -136
- package/dist/cjs/managers/cross-tab-session.manager.d.ts +0 -170
- package/dist/cjs/managers/cross-tab-session.manager.js +0 -730
- package/dist/cjs/managers/sampling.manager.d.ts +0 -8
- package/dist/cjs/managers/sampling.manager.js +0 -53
- package/dist/cjs/managers/session-recovery.manager.d.ts +0 -65
- package/dist/cjs/managers/session-recovery.manager.js +0 -237
- package/dist/cjs/types/web-vitals.types.d.ts +0 -6
- package/dist/esm/constants/browser.constants.d.ts +0 -3
- package/dist/esm/constants/browser.constants.js +0 -38
- package/dist/esm/constants/initialization.constants.d.ts +0 -40
- package/dist/esm/constants/initialization.constants.js +0 -45
- package/dist/esm/constants/limits.constants.d.ts +0 -25
- package/dist/esm/constants/limits.constants.js +0 -37
- package/dist/esm/constants/security.constants.d.ts +0 -1
- package/dist/esm/constants/security.constants.js +0 -9
- package/dist/esm/constants/timing.constants.d.ts +0 -22
- package/dist/esm/constants/timing.constants.js +0 -31
- package/dist/esm/constants/validation.constants.d.ts +0 -13
- package/dist/esm/constants/validation.constants.js +0 -28
- package/dist/esm/handlers/network.handler.d.ts +0 -16
- package/dist/esm/handlers/network.handler.js +0 -132
- package/dist/esm/managers/cross-tab-session.manager.d.ts +0 -170
- package/dist/esm/managers/cross-tab-session.manager.js +0 -726
- package/dist/esm/managers/sampling.manager.d.ts +0 -8
- package/dist/esm/managers/sampling.manager.js +0 -49
- package/dist/esm/managers/session-recovery.manager.d.ts +0 -65
- package/dist/esm/managers/session-recovery.manager.js +0 -233
- package/dist/esm/types/web-vitals.types.d.ts +0 -6
- /package/dist/cjs/types/{web-vitals.types.js → test-bridge.types.js} +0 -0
- /package/dist/esm/types/{web-vitals.types.js → test-bridge.types.js} +0 -0
|
@@ -5,90 +5,159 @@ const constants_1 = require("../constants");
|
|
|
5
5
|
const types_1 = require("../types");
|
|
6
6
|
const utils_1 = require("../utils");
|
|
7
7
|
const logging_1 = require("../utils/logging");
|
|
8
|
+
/**
|
|
9
|
+
* Configuration manager responsible for loading and merging application configuration.
|
|
10
|
+
*
|
|
11
|
+
* Handles three configuration sources:
|
|
12
|
+
* 1. Default configuration (fallback values)
|
|
13
|
+
* 2. API configuration (server-side settings)
|
|
14
|
+
* 3. App configuration (client initialization settings)
|
|
15
|
+
*
|
|
16
|
+
* Supports special project IDs for development and testing:
|
|
17
|
+
* - 'skip': Bypasses all network calls, uses defaults
|
|
18
|
+
* - 'localhost:PORT': Loads config from local development server
|
|
19
|
+
*/
|
|
8
20
|
class ConfigManager {
|
|
21
|
+
/**
|
|
22
|
+
* Gets complete configuration by merging default, API, and app configurations.
|
|
23
|
+
*
|
|
24
|
+
* @param apiUrl - Base URL for the configuration API
|
|
25
|
+
* @param appConfig - Client-side configuration from init()
|
|
26
|
+
* @returns Promise<Config> - Merged configuration object
|
|
27
|
+
*/
|
|
9
28
|
async get(apiUrl, appConfig) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return this.
|
|
29
|
+
// Handle skip mode - no network calls
|
|
30
|
+
if (appConfig.id === types_1.SpecialProjectId.Skip) {
|
|
31
|
+
return this.createDefaultConfig(appConfig);
|
|
13
32
|
}
|
|
14
|
-
|
|
15
|
-
const config =
|
|
16
|
-
logging_1.debugLog.info('ConfigManager', '
|
|
33
|
+
const config = await this.loadFromApi(apiUrl, appConfig);
|
|
34
|
+
const { config: normalizedConfig } = (0, utils_1.normalizeConfig)(config);
|
|
35
|
+
logging_1.debugLog.info('ConfigManager', 'Configuration loaded', {
|
|
17
36
|
projectId: appConfig.id,
|
|
18
|
-
mode:
|
|
19
|
-
|
|
20
|
-
|
|
37
|
+
mode: normalizedConfig.mode,
|
|
38
|
+
hasTags: !!normalizedConfig.tags?.length,
|
|
39
|
+
hasExclusions: !!normalizedConfig.excludedUrlPaths?.length,
|
|
21
40
|
});
|
|
22
|
-
return
|
|
41
|
+
return normalizedConfig;
|
|
23
42
|
}
|
|
24
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Loads configuration from API and merges with app config.
|
|
45
|
+
*/
|
|
46
|
+
async loadFromApi(apiUrl, appConfig) {
|
|
25
47
|
try {
|
|
26
|
-
const configUrl =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
const response = await fetch(configUrl, {
|
|
48
|
+
const configUrl = this.buildConfigUrl(apiUrl, appConfig);
|
|
49
|
+
const headers = this.buildHeaders(appConfig);
|
|
50
|
+
const response = await (0, utils_1.fetchWithTimeout)(configUrl, {
|
|
31
51
|
method: 'GET',
|
|
32
|
-
headers
|
|
52
|
+
headers,
|
|
53
|
+
timeout: constants_1.REQUEST_TIMEOUT_MS,
|
|
33
54
|
});
|
|
34
55
|
if (!response.ok) {
|
|
35
|
-
|
|
36
|
-
logging_1.debugLog.error('ConfigManager', 'Config API request failed', {
|
|
37
|
-
status: response.status,
|
|
38
|
-
statusText: response.statusText,
|
|
39
|
-
configUrl,
|
|
40
|
-
});
|
|
41
|
-
throw new Error(error);
|
|
42
|
-
}
|
|
43
|
-
const rawData = await response.json();
|
|
44
|
-
if (rawData === undefined || rawData === null || typeof rawData !== 'object' || Array.isArray(rawData)) {
|
|
45
|
-
logging_1.debugLog.error('ConfigManager', 'Invalid config API response format', {
|
|
46
|
-
responseType: typeof rawData,
|
|
47
|
-
isArray: Array.isArray(rawData),
|
|
48
|
-
});
|
|
49
|
-
throw new Error('Invalid config API response: expected object');
|
|
50
|
-
}
|
|
51
|
-
const safeApiConfig = (0, utils_1.sanitizeApiConfig)(rawData);
|
|
52
|
-
const apiConfig = { ...constants_1.DEFAULT_API_CONFIG, ...safeApiConfig };
|
|
53
|
-
const mergedConfig = { ...apiConfig, ...appConfig };
|
|
54
|
-
// Check if qaMode=true is in URL and automatically set mode to 'qa'
|
|
55
|
-
const urlParameters = new URLSearchParams(window.location.search);
|
|
56
|
-
const isQaMode = urlParameters.get('qaMode') === 'true';
|
|
57
|
-
if (isQaMode && !mergedConfig.mode) {
|
|
58
|
-
mergedConfig.mode = types_1.Mode.QA;
|
|
59
|
-
logging_1.debugLog.info('ConfigManager', 'QA mode enabled via URL parameter');
|
|
56
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
60
57
|
}
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
: (mergedConfig.errorSampling ?? 0.1);
|
|
64
|
-
const finalConfig = { ...mergedConfig, errorSampling };
|
|
65
|
-
return finalConfig;
|
|
58
|
+
const rawData = await this.parseJsonResponse(response);
|
|
59
|
+
return this.mergeConfigurations(rawData, appConfig);
|
|
66
60
|
}
|
|
67
61
|
catch (error) {
|
|
68
62
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
69
|
-
logging_1.debugLog.error('ConfigManager', 'Failed to load
|
|
70
|
-
|
|
63
|
+
logging_1.debugLog.error('ConfigManager', 'Failed to load configuration', {
|
|
64
|
+
error: errorMessage,
|
|
65
|
+
apiUrl,
|
|
66
|
+
projectId: appConfig.id,
|
|
67
|
+
});
|
|
68
|
+
throw new Error(`Configuration load failed: ${errorMessage}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Builds the configuration URL based on project type and QA mode.
|
|
73
|
+
*/
|
|
74
|
+
buildConfigUrl(apiUrl, appConfig) {
|
|
75
|
+
const isLocalhost = appConfig.id.startsWith(types_1.SpecialProjectId.Localhost);
|
|
76
|
+
if (isLocalhost) {
|
|
77
|
+
this.validateLocalhostProjectId(appConfig.id);
|
|
78
|
+
return `http://${appConfig.id}/config`;
|
|
79
|
+
}
|
|
80
|
+
const baseUrl = `${apiUrl}/config`;
|
|
81
|
+
const isQaMode = this.isQaModeEnabled();
|
|
82
|
+
return isQaMode ? `${baseUrl}?qaMode=true` : baseUrl;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Builds request headers based on project configuration.
|
|
86
|
+
*/
|
|
87
|
+
buildHeaders(appConfig) {
|
|
88
|
+
const headers = {
|
|
89
|
+
'Content-Type': 'application/json',
|
|
90
|
+
};
|
|
91
|
+
if (appConfig.id.startsWith(types_1.SpecialProjectId.Localhost)) {
|
|
92
|
+
headers['X-TraceLog-Project'] = appConfig.id;
|
|
93
|
+
}
|
|
94
|
+
return headers;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Parses and validates JSON response from config API.
|
|
98
|
+
*/
|
|
99
|
+
async parseJsonResponse(response) {
|
|
100
|
+
const contentType = response.headers.get('content-type');
|
|
101
|
+
if (!contentType?.includes('application/json')) {
|
|
102
|
+
throw new Error('Invalid response content-type, expected JSON');
|
|
103
|
+
}
|
|
104
|
+
const rawData = await response.json();
|
|
105
|
+
if (!rawData || typeof rawData !== 'object' || Array.isArray(rawData)) {
|
|
106
|
+
throw new Error('Invalid response format, expected object');
|
|
71
107
|
}
|
|
108
|
+
return rawData;
|
|
72
109
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (
|
|
78
|
-
|
|
110
|
+
/**
|
|
111
|
+
* Validates localhost project ID format and port range.
|
|
112
|
+
*/
|
|
113
|
+
validateLocalhostProjectId(projectId) {
|
|
114
|
+
if (!ConfigManager.LOCALHOST_PATTERN.test(projectId)) {
|
|
115
|
+
throw new Error(`Invalid localhost format. Expected 'localhost:PORT', got '${projectId}'`);
|
|
79
116
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
throw new Error(
|
|
117
|
+
const port = parseInt(projectId.split(':')[1], 10);
|
|
118
|
+
if (port < 1 || port > 65535) {
|
|
119
|
+
throw new Error(`Port must be between 1 and 65535, got ${port}`);
|
|
83
120
|
}
|
|
84
|
-
return configUrl;
|
|
85
121
|
}
|
|
86
|
-
|
|
87
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Checks if QA mode is enabled via URL parameter.
|
|
124
|
+
*/
|
|
125
|
+
isQaModeEnabled() {
|
|
126
|
+
const params = new URLSearchParams(window.location.search);
|
|
127
|
+
return params.get('qaMode') === 'true';
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Merges API configuration with app configuration and applies mode-specific settings.
|
|
131
|
+
*/
|
|
132
|
+
mergeConfigurations(rawApiConfig, appConfig) {
|
|
133
|
+
const safeApiConfig = (0, utils_1.sanitizeApiConfig)(rawApiConfig);
|
|
134
|
+
const apiConfig = { ...constants_1.DEFAULT_API_CONFIG, ...safeApiConfig };
|
|
135
|
+
const mergedConfig = (0, constants_1.DEFAULT_CONFIG)({ ...appConfig, ...apiConfig });
|
|
136
|
+
const { config: normalizedConfig } = (0, utils_1.normalizeConfig)(mergedConfig);
|
|
137
|
+
// Apply QA mode if enabled via URL parameter
|
|
138
|
+
if (this.isQaModeEnabled() && !normalizedConfig.mode) {
|
|
139
|
+
normalizedConfig.mode = types_1.Mode.QA;
|
|
140
|
+
logging_1.debugLog.info('ConfigManager', 'QA mode enabled via URL parameter');
|
|
141
|
+
}
|
|
142
|
+
// Set error sampling based on mode
|
|
143
|
+
const errorSampling = Object.values(types_1.Mode).includes(normalizedConfig.mode)
|
|
144
|
+
? 1 // Full sampling for debug/qa modes
|
|
145
|
+
: (normalizedConfig.errorSampling ?? 0.1); // Default sampling for production
|
|
146
|
+
return { ...normalizedConfig, errorSampling };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Creates default configuration for skip mode and fallback scenarios.
|
|
150
|
+
*/
|
|
151
|
+
createDefaultConfig(appConfig) {
|
|
152
|
+
const defaultConfig = (0, constants_1.DEFAULT_CONFIG)({
|
|
88
153
|
...appConfig,
|
|
89
154
|
errorSampling: 1,
|
|
90
|
-
...(
|
|
155
|
+
...(appConfig.id === types_1.SpecialProjectId.Skip && { mode: types_1.Mode.DEBUG }),
|
|
91
156
|
});
|
|
157
|
+
const { config } = (0, utils_1.normalizeConfig)(defaultConfig);
|
|
158
|
+
return config;
|
|
92
159
|
}
|
|
93
160
|
}
|
|
94
161
|
exports.ConfigManager = ConfigManager;
|
|
162
|
+
ConfigManager.LOCALHOST_PATTERN = /^localhost:\d{1,5}$/;
|
|
163
|
+
ConfigManager.PRODUCTION_DOMAINS = [/^https:\/\/.*\.tracelog\.app$/, /^https:\/\/.*\.tracelog\.dev$/];
|
|
@@ -1,61 +1,82 @@
|
|
|
1
1
|
import { EventData } from '../types';
|
|
2
|
+
import { Emitter } from '../utils';
|
|
2
3
|
import { StateManager } from './state.manager';
|
|
3
4
|
import { StorageManager } from './storage.manager';
|
|
4
5
|
import { GoogleAnalyticsIntegration } from '../integrations/google-analytics.integration';
|
|
6
|
+
/**
|
|
7
|
+
* EventManager - Core event tracking and queue management
|
|
8
|
+
*
|
|
9
|
+
* Responsibilities:
|
|
10
|
+
* - Track user events (clicks, scrolls, page views, custom events)
|
|
11
|
+
* - Queue events and batch send them to the analytics API
|
|
12
|
+
* - Handle deduplication of similar events
|
|
13
|
+
* - Manage event sending intervals and retry logic
|
|
14
|
+
* - Integrate with Google Analytics when configured
|
|
15
|
+
*/
|
|
5
16
|
export declare class EventManager extends StateManager {
|
|
6
17
|
private readonly googleAnalytics;
|
|
7
|
-
private readonly samplingManager;
|
|
8
|
-
private readonly tagsManager;
|
|
9
18
|
private readonly dataSender;
|
|
10
|
-
private readonly
|
|
19
|
+
private readonly emitter;
|
|
11
20
|
private eventsQueue;
|
|
12
|
-
private
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
track({ type, page_url, from_page_url, scroll_data, click_data, custom_event, web_vitals, session_end_reason, session_start_recovered, }: Partial<EventData>): void;
|
|
21
|
+
private lastEventFingerprint;
|
|
22
|
+
private lastEventTime;
|
|
23
|
+
private sendIntervalId;
|
|
24
|
+
constructor(storeManager: StorageManager, googleAnalytics?: GoogleAnalyticsIntegration | null, emitter?: Emitter | null);
|
|
25
|
+
/**
|
|
26
|
+
* Recovers persisted events from localStorage
|
|
27
|
+
* Should be called after initialization to recover any events that failed to send
|
|
28
|
+
*/
|
|
29
|
+
recoverPersistedEvents(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Track user events with automatic deduplication and queueing
|
|
32
|
+
*/
|
|
33
|
+
track({ type, page_url, from_page_url, scroll_data, click_data, custom_event, web_vitals, error_data, session_end_reason, session_start_recovered, }: Partial<EventData>): void;
|
|
25
34
|
stop(): void;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Flush all queued events immediately (async)
|
|
37
|
+
*/
|
|
29
38
|
flushImmediately(): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Flush all queued events immediately (sync)
|
|
41
|
+
*/
|
|
30
42
|
flushImmediatelySync(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Queue management and sending intervals
|
|
45
|
+
*/
|
|
31
46
|
getQueueLength(): number;
|
|
32
|
-
private
|
|
33
|
-
private buildEventsPayload;
|
|
34
|
-
private clearQueueInterval;
|
|
35
|
-
private getEventFingerprint;
|
|
36
|
-
private isDuplicatedEvent;
|
|
47
|
+
private clearSendInterval;
|
|
37
48
|
/**
|
|
38
|
-
*
|
|
49
|
+
* Shared flush implementation for both sync and async modes
|
|
39
50
|
*/
|
|
40
|
-
private
|
|
51
|
+
private flushEvents;
|
|
41
52
|
/**
|
|
42
|
-
*
|
|
53
|
+
* Send queued events to the API
|
|
43
54
|
*/
|
|
44
|
-
private
|
|
55
|
+
private sendEventsQueue;
|
|
45
56
|
/**
|
|
46
|
-
*
|
|
57
|
+
* Build the payload for sending events to the API
|
|
58
|
+
* Includes basic deduplication and sorting
|
|
47
59
|
*/
|
|
48
|
-
private
|
|
60
|
+
private buildEventsPayload;
|
|
49
61
|
/**
|
|
50
|
-
*
|
|
62
|
+
* Helper methods for event processing
|
|
51
63
|
*/
|
|
52
|
-
private
|
|
64
|
+
private buildEventPayload;
|
|
65
|
+
private isEventExcluded;
|
|
66
|
+
private isDuplicateEvent;
|
|
67
|
+
private createEventFingerprint;
|
|
68
|
+
private createEventSignature;
|
|
69
|
+
private addToQueue;
|
|
70
|
+
private startSendInterval;
|
|
71
|
+
private handleGoogleAnalyticsIntegration;
|
|
72
|
+
private shouldSample;
|
|
73
|
+
private removeProcessedEvents;
|
|
53
74
|
/**
|
|
54
|
-
*
|
|
75
|
+
* Emit event for external listeners
|
|
55
76
|
*/
|
|
56
|
-
private
|
|
77
|
+
private emitEvent;
|
|
57
78
|
/**
|
|
58
|
-
*
|
|
79
|
+
* Emit events queue for external listeners
|
|
59
80
|
*/
|
|
60
|
-
private
|
|
81
|
+
private emitEventsQueue;
|
|
61
82
|
}
|