@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
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { MIN_SESSION_TIMEOUT_MS, MAX_SESSION_TIMEOUT_MS, MIN_SAMPLING_RATE, MAX_SAMPLING_RATE, } from './limits.constants';
|
|
2
|
-
// Allowed API config keys for runtime validation
|
|
3
|
-
export const ALLOWED_API_CONFIG_KEYS = new Set([
|
|
4
|
-
'mode',
|
|
5
|
-
'tags',
|
|
6
|
-
'samplingRate',
|
|
7
|
-
'excludedUrlPaths',
|
|
8
|
-
'ipExcluded',
|
|
9
|
-
]);
|
|
10
|
-
// Validation error messages - standardized across all layers
|
|
11
|
-
export const VALIDATION_MESSAGES = {
|
|
12
|
-
// Project ID validation - consistent message across all layers
|
|
13
|
-
MISSING_PROJECT_ID: 'Project ID is required',
|
|
14
|
-
PROJECT_ID_EMPTY_AFTER_TRIM: 'Project ID is required',
|
|
15
|
-
// Session timeout validation
|
|
16
|
-
INVALID_SESSION_TIMEOUT: `Session timeout must be between ${MIN_SESSION_TIMEOUT_MS}ms (30 seconds) and ${MAX_SESSION_TIMEOUT_MS}ms (24 hours)`,
|
|
17
|
-
// Sampling rate validation
|
|
18
|
-
INVALID_SAMPLING_RATE: `Sampling rate must be between ${MIN_SAMPLING_RATE} and ${MAX_SAMPLING_RATE}`,
|
|
19
|
-
INVALID_ERROR_SAMPLING_RATE: 'Error sampling must be between 0 and 1',
|
|
20
|
-
// Integration validation
|
|
21
|
-
INVALID_GOOGLE_ANALYTICS_ID: 'Google Analytics measurement ID is required when integration is enabled',
|
|
22
|
-
// UI validation
|
|
23
|
-
INVALID_SCROLL_CONTAINER_SELECTORS: 'Scroll container selectors must be valid CSS selectors',
|
|
24
|
-
// Global metadata validation
|
|
25
|
-
INVALID_GLOBAL_METADATA: 'Global metadata must be an object',
|
|
26
|
-
// Array validation
|
|
27
|
-
INVALID_SENSITIVE_QUERY_PARAMS: 'Sensitive query params must be an array of strings',
|
|
28
|
-
};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { EventManager } from '../managers/event.manager';
|
|
2
|
-
import { StateManager } from '../managers/state.manager';
|
|
3
|
-
export declare class NetworkHandler extends StateManager {
|
|
4
|
-
private readonly eventManager;
|
|
5
|
-
private readonly originalFetch;
|
|
6
|
-
private readonly originalXHROpen;
|
|
7
|
-
private readonly originalXHRSend;
|
|
8
|
-
constructor(eventManager: EventManager);
|
|
9
|
-
startTracking(): void;
|
|
10
|
-
stopTracking(): void;
|
|
11
|
-
private interceptFetch;
|
|
12
|
-
private interceptXHR;
|
|
13
|
-
private trackNetworkError;
|
|
14
|
-
private normalizeUrlForTracking;
|
|
15
|
-
private shouldSample;
|
|
16
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { StateManager } from '../managers/state.manager';
|
|
2
|
-
import { ErrorType, EventType } from '../types';
|
|
3
|
-
import { normalizeUrl } from '../utils';
|
|
4
|
-
import { debugLog } from '../utils/logging';
|
|
5
|
-
export class NetworkHandler extends StateManager {
|
|
6
|
-
constructor(eventManager) {
|
|
7
|
-
super();
|
|
8
|
-
this.eventManager = eventManager;
|
|
9
|
-
this.originalFetch = window.fetch;
|
|
10
|
-
this.originalXHROpen = XMLHttpRequest.prototype.open;
|
|
11
|
-
this.originalXHRSend = XMLHttpRequest.prototype.send;
|
|
12
|
-
}
|
|
13
|
-
startTracking() {
|
|
14
|
-
debugLog.debug('NetworkHandler', 'Starting network error tracking');
|
|
15
|
-
this.interceptFetch();
|
|
16
|
-
this.interceptXHR();
|
|
17
|
-
}
|
|
18
|
-
stopTracking() {
|
|
19
|
-
debugLog.debug('NetworkHandler', 'Stopping network error tracking');
|
|
20
|
-
window.fetch = this.originalFetch;
|
|
21
|
-
XMLHttpRequest.prototype.open = this.originalXHROpen;
|
|
22
|
-
XMLHttpRequest.prototype.send = this.originalXHRSend;
|
|
23
|
-
}
|
|
24
|
-
interceptFetch() {
|
|
25
|
-
window.fetch = async (input, init) => {
|
|
26
|
-
const startTime = Date.now();
|
|
27
|
-
const url = typeof input === 'string' ? input : input.toString();
|
|
28
|
-
const method = init?.method ?? 'GET';
|
|
29
|
-
try {
|
|
30
|
-
const response = await this.originalFetch(input, init);
|
|
31
|
-
const duration = Date.now() - startTime;
|
|
32
|
-
if (!response.ok) {
|
|
33
|
-
debugLog.debug('NetworkHandler', 'Fetch error detected', {
|
|
34
|
-
method,
|
|
35
|
-
url: this.normalizeUrlForTracking(url),
|
|
36
|
-
status: response.status,
|
|
37
|
-
statusText: response.statusText,
|
|
38
|
-
});
|
|
39
|
-
this.trackNetworkError(method.toUpperCase(), this.normalizeUrlForTracking(url), response.status, response.statusText, duration);
|
|
40
|
-
}
|
|
41
|
-
return response;
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
const duration = Date.now() - startTime;
|
|
45
|
-
const errorMessage = error instanceof Error ? error.message : 'Network Error';
|
|
46
|
-
debugLog.debug('NetworkHandler', 'Fetch exception caught', {
|
|
47
|
-
method,
|
|
48
|
-
url: this.normalizeUrlForTracking(url),
|
|
49
|
-
error: errorMessage,
|
|
50
|
-
});
|
|
51
|
-
this.trackNetworkError(method.toUpperCase(), this.normalizeUrlForTracking(url), undefined, errorMessage, duration);
|
|
52
|
-
throw error;
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
interceptXHR() {
|
|
57
|
-
const trackNetworkError = this.trackNetworkError.bind(this);
|
|
58
|
-
const normalizeUrlForTracking = this.normalizeUrlForTracking.bind(this);
|
|
59
|
-
const originalXHROpen = this.originalXHROpen;
|
|
60
|
-
const originalXHRSend = this.originalXHRSend;
|
|
61
|
-
XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
|
|
62
|
-
const asyncMode = async ?? true;
|
|
63
|
-
const extendedThis = this;
|
|
64
|
-
extendedThis._tracelogStartTime = Date.now();
|
|
65
|
-
extendedThis._tracelogMethod = method.toUpperCase();
|
|
66
|
-
extendedThis._tracelogUrl = url.toString();
|
|
67
|
-
return originalXHROpen.call(this, method, url, asyncMode, user, password);
|
|
68
|
-
};
|
|
69
|
-
XMLHttpRequest.prototype.send = function (body) {
|
|
70
|
-
const xhr = this;
|
|
71
|
-
const startTime = xhr._tracelogStartTime ?? Date.now();
|
|
72
|
-
const method = xhr._tracelogMethod ?? 'GET';
|
|
73
|
-
const url = xhr._tracelogUrl ?? '';
|
|
74
|
-
const originalOnReadyStateChange = xhr.onreadystatechange;
|
|
75
|
-
xhr.onreadystatechange = (ev) => {
|
|
76
|
-
if (xhr.readyState === XMLHttpRequest.DONE) {
|
|
77
|
-
const duration = Date.now() - startTime;
|
|
78
|
-
if (xhr.status === 0 || xhr.status >= 400) {
|
|
79
|
-
const statusText = xhr.statusText || 'Request Failed';
|
|
80
|
-
debugLog.debug('NetworkHandler', 'XHR error detected', {
|
|
81
|
-
method,
|
|
82
|
-
url: normalizeUrlForTracking(url),
|
|
83
|
-
status: xhr.status,
|
|
84
|
-
statusText,
|
|
85
|
-
});
|
|
86
|
-
trackNetworkError(method, normalizeUrlForTracking(url), xhr.status, statusText, duration);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (originalOnReadyStateChange) {
|
|
90
|
-
return originalOnReadyStateChange.call(xhr, ev);
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
return originalXHRSend.call(this, body);
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
trackNetworkError(method, url, status, statusText, duration) {
|
|
97
|
-
const config = this.get('config');
|
|
98
|
-
if (!this.shouldSample(config?.errorSampling ?? 0.1)) {
|
|
99
|
-
debugLog.debug('NetworkHandler', `Network error not sampled, skipping (errorSampling: ${config?.errorSampling}, method: ${method}, url: ${url})`, {
|
|
100
|
-
errorSampling: config?.errorSampling,
|
|
101
|
-
method,
|
|
102
|
-
url,
|
|
103
|
-
});
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
debugLog.warn('NetworkHandler', `Network error tracked: ${method} ${url} (status: ${status}, statusText: ${statusText}, duration: ${duration}ms)`, { method, url, status, statusText, duration });
|
|
107
|
-
this.eventManager.track({
|
|
108
|
-
type: EventType.ERROR,
|
|
109
|
-
error_data: {
|
|
110
|
-
type: ErrorType.NETWORK_ERROR,
|
|
111
|
-
message: statusText,
|
|
112
|
-
method,
|
|
113
|
-
url,
|
|
114
|
-
status,
|
|
115
|
-
statusText,
|
|
116
|
-
duration,
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
normalizeUrlForTracking(url) {
|
|
121
|
-
try {
|
|
122
|
-
const config = this.get('config');
|
|
123
|
-
return normalizeUrl(url, config?.sensitiveQueryParams);
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
return url;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
shouldSample(rate) {
|
|
130
|
-
return Math.random() < rate;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { CrossTabSessionConfig, SessionEndReason } from '../types/session.types';
|
|
2
|
-
import { StateManager } from './state.manager';
|
|
3
|
-
import { StorageManager } from './storage.manager';
|
|
4
|
-
export declare class CrossTabSessionManager extends StateManager {
|
|
5
|
-
private readonly callbacks?;
|
|
6
|
-
private readonly config;
|
|
7
|
-
private readonly storageManager;
|
|
8
|
-
private readonly broadcastChannel;
|
|
9
|
-
private readonly tabId;
|
|
10
|
-
private readonly tabInfo;
|
|
11
|
-
private readonly projectId;
|
|
12
|
-
private leaderTabId;
|
|
13
|
-
private isTabLeader;
|
|
14
|
-
private heartbeatInterval;
|
|
15
|
-
private electionTimeout;
|
|
16
|
-
private cleanupTimeout;
|
|
17
|
-
private sessionEnded;
|
|
18
|
-
private fallbackLeadershipTimeout;
|
|
19
|
-
private electionDelayTimeout;
|
|
20
|
-
private tabInfoCleanupTimeout;
|
|
21
|
-
private closingAnnouncementTimeout;
|
|
22
|
-
private leaderHealthCheckInterval;
|
|
23
|
-
private lastHeartbeatSent;
|
|
24
|
-
constructor(storageManager: StorageManager, projectId: string, config?: Partial<CrossTabSessionConfig>, callbacks?: {
|
|
25
|
-
onSessionStart?: (sessionId: string) => void;
|
|
26
|
-
onSessionEnd?: (reason: SessionEndReason) => void;
|
|
27
|
-
onTabActivity?: () => void;
|
|
28
|
-
onCrossTabConflict?: () => void;
|
|
29
|
-
} | undefined);
|
|
30
|
-
/**
|
|
31
|
-
* Initialize BroadcastChannel if supported
|
|
32
|
-
*/
|
|
33
|
-
private initializeBroadcastChannel;
|
|
34
|
-
/**
|
|
35
|
-
* Initialize the cross-tab session manager
|
|
36
|
-
*/
|
|
37
|
-
private initialize;
|
|
38
|
-
/**
|
|
39
|
-
* Check if this tab should be the session leader
|
|
40
|
-
*/
|
|
41
|
-
private tryJoinExistingSession;
|
|
42
|
-
/**
|
|
43
|
-
* Request leadership status from other tabs
|
|
44
|
-
*/
|
|
45
|
-
private requestLeadershipStatus;
|
|
46
|
-
/**
|
|
47
|
-
* Start leader election process with debouncing to prevent excessive elections
|
|
48
|
-
*/
|
|
49
|
-
private startLeaderElection;
|
|
50
|
-
/**
|
|
51
|
-
* Become the session leader
|
|
52
|
-
*/
|
|
53
|
-
private becomeLeader;
|
|
54
|
-
/**
|
|
55
|
-
* Announce session start to other tabs
|
|
56
|
-
*/
|
|
57
|
-
private announceSessionStart;
|
|
58
|
-
/**
|
|
59
|
-
* Announce leadership to other tabs
|
|
60
|
-
*/
|
|
61
|
-
private announceLeadership;
|
|
62
|
-
/**
|
|
63
|
-
* Setup fallback mechanism to ensure a leader is always elected
|
|
64
|
-
*/
|
|
65
|
-
private setupLeadershipFallback;
|
|
66
|
-
/**
|
|
67
|
-
* Setup BroadcastChannel event listeners
|
|
68
|
-
*/
|
|
69
|
-
private setupBroadcastListeners;
|
|
70
|
-
/**
|
|
71
|
-
* Handle cross-tab messages
|
|
72
|
-
*/
|
|
73
|
-
private handleCrossTabMessage;
|
|
74
|
-
/**
|
|
75
|
-
* Handle heartbeat message from another tab
|
|
76
|
-
*/
|
|
77
|
-
private handleHeartbeatMessage;
|
|
78
|
-
/**
|
|
79
|
-
* Handle session start message from another tab
|
|
80
|
-
*/
|
|
81
|
-
private handleSessionStartMessage;
|
|
82
|
-
/**
|
|
83
|
-
* Handle session end message from another tab
|
|
84
|
-
*/
|
|
85
|
-
private handleSessionEndMessage;
|
|
86
|
-
/**
|
|
87
|
-
* Handle tab closing message from another tab
|
|
88
|
-
*/
|
|
89
|
-
private handleTabClosingMessage;
|
|
90
|
-
/**
|
|
91
|
-
* Handle election request from another tab
|
|
92
|
-
*/
|
|
93
|
-
private handleElectionRequest;
|
|
94
|
-
/**
|
|
95
|
-
* Handle election response from another tab
|
|
96
|
-
*/
|
|
97
|
-
private handleElectionResponse;
|
|
98
|
-
/**
|
|
99
|
-
* Start heartbeat to keep session active
|
|
100
|
-
*/
|
|
101
|
-
private startHeartbeat;
|
|
102
|
-
/**
|
|
103
|
-
* Send heartbeat to other tabs with rate limiting to prevent flooding
|
|
104
|
-
*/
|
|
105
|
-
private sendHeartbeat;
|
|
106
|
-
/**
|
|
107
|
-
* Update tab info with current timestamp
|
|
108
|
-
*/
|
|
109
|
-
private updateTabInfo;
|
|
110
|
-
/**
|
|
111
|
-
* End session and notify other tabs
|
|
112
|
-
*/
|
|
113
|
-
endSession(reason: SessionEndReason): void;
|
|
114
|
-
/**
|
|
115
|
-
* Announce tab is closing to other tabs
|
|
116
|
-
*/
|
|
117
|
-
private announceTabClosing;
|
|
118
|
-
/**
|
|
119
|
-
* Announce session end to other tabs
|
|
120
|
-
*/
|
|
121
|
-
private announceSessionEnd;
|
|
122
|
-
/**
|
|
123
|
-
* Get current session ID
|
|
124
|
-
*/
|
|
125
|
-
getSessionId(): string;
|
|
126
|
-
/**
|
|
127
|
-
* Get current tab ID
|
|
128
|
-
*/
|
|
129
|
-
getTabId(): string;
|
|
130
|
-
/**
|
|
131
|
-
* Check if this tab is the session leader
|
|
132
|
-
*/
|
|
133
|
-
isLeader(): boolean;
|
|
134
|
-
/**
|
|
135
|
-
* Get current session context from storage
|
|
136
|
-
*/
|
|
137
|
-
private getStoredSessionContext;
|
|
138
|
-
/**
|
|
139
|
-
* Store session context to localStorage
|
|
140
|
-
*/
|
|
141
|
-
private storeSessionContext;
|
|
142
|
-
/**
|
|
143
|
-
* Clear stored session context
|
|
144
|
-
*/
|
|
145
|
-
private clearStoredSessionContext;
|
|
146
|
-
/**
|
|
147
|
-
* Store tab info to localStorage
|
|
148
|
-
*/
|
|
149
|
-
private storeTabInfo;
|
|
150
|
-
/**
|
|
151
|
-
* Clear tab info from localStorage
|
|
152
|
-
*/
|
|
153
|
-
private clearTabInfo;
|
|
154
|
-
/**
|
|
155
|
-
* Check if BroadcastChannel is supported
|
|
156
|
-
*/
|
|
157
|
-
private isBroadcastChannelSupported;
|
|
158
|
-
/**
|
|
159
|
-
* Get session timeout considering cross-tab activity
|
|
160
|
-
*/
|
|
161
|
-
getEffectiveSessionTimeout(): number;
|
|
162
|
-
/**
|
|
163
|
-
* Update session activity from any tab
|
|
164
|
-
*/
|
|
165
|
-
updateSessionActivity(): void;
|
|
166
|
-
/**
|
|
167
|
-
* Cleanup resources
|
|
168
|
-
*/
|
|
169
|
-
destroy(): void;
|
|
170
|
-
}
|