@tracelog/lib 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/browser/tracelog.js +4040 -0
- package/dist/browser/web-vitals-CCnqwnC8.mjs +198 -0
- package/dist/cjs/api.d.ts +46 -0
- package/dist/cjs/api.js +224 -0
- package/dist/cjs/app.constants.d.ts +1 -0
- package/dist/cjs/app.constants.js +5 -0
- package/dist/cjs/app.d.ts +59 -0
- package/dist/cjs/app.js +272 -0
- package/dist/cjs/app.types.d.ts +6 -0
- package/dist/cjs/app.types.js +22 -0
- package/dist/cjs/constants/api.constants.d.ts +4 -0
- package/dist/cjs/constants/api.constants.js +18 -0
- package/dist/cjs/constants/browser.constants.d.ts +3 -0
- package/dist/cjs/constants/browser.constants.js +41 -0
- package/dist/cjs/constants/index.d.ts +8 -0
- package/dist/cjs/constants/index.js +24 -0
- package/dist/cjs/constants/initialization.constants.d.ts +40 -0
- package/dist/cjs/constants/initialization.constants.js +48 -0
- package/dist/cjs/constants/limits.constants.d.ts +25 -0
- package/dist/cjs/constants/limits.constants.js +40 -0
- package/dist/cjs/constants/security.constants.d.ts +1 -0
- package/dist/cjs/constants/security.constants.js +12 -0
- package/dist/cjs/constants/storage.constants.d.ts +9 -0
- package/dist/cjs/constants/storage.constants.js +22 -0
- package/dist/cjs/constants/timing.constants.d.ts +22 -0
- package/dist/cjs/constants/timing.constants.js +34 -0
- package/dist/cjs/constants/validation.constants.d.ts +13 -0
- package/dist/cjs/constants/validation.constants.js +31 -0
- package/dist/cjs/handlers/click.handler.d.ts +17 -0
- package/dist/cjs/handlers/click.handler.js +199 -0
- package/dist/cjs/handlers/error.handler.d.ts +15 -0
- package/dist/cjs/handlers/error.handler.js +97 -0
- package/dist/cjs/handlers/network.handler.d.ts +16 -0
- package/dist/cjs/handlers/network.handler.js +136 -0
- package/dist/cjs/handlers/page-view.handler.d.ts +15 -0
- package/dist/cjs/handlers/page-view.handler.js +83 -0
- package/dist/cjs/handlers/performance.handler.d.ts +19 -0
- package/dist/cjs/handlers/performance.handler.js +255 -0
- package/dist/cjs/handlers/scroll.handler.d.ts +16 -0
- package/dist/cjs/handlers/scroll.handler.js +138 -0
- package/dist/cjs/handlers/session.handler.d.ts +29 -0
- package/dist/cjs/handlers/session.handler.js +357 -0
- package/dist/cjs/integrations/google-analytics.integration.d.ts +18 -0
- package/dist/cjs/integrations/google-analytics.integration.js +159 -0
- package/dist/cjs/listeners/activity-listener-manager.d.ts +8 -0
- package/dist/cjs/listeners/activity-listener-manager.js +32 -0
- package/dist/cjs/listeners/index.d.ts +6 -0
- package/dist/cjs/listeners/index.js +14 -0
- package/dist/cjs/listeners/input-listener-managers.d.ts +15 -0
- package/dist/cjs/listeners/input-listener-managers.js +58 -0
- package/dist/cjs/listeners/listeners.types.d.ts +4 -0
- package/dist/cjs/listeners/listeners.types.js +2 -0
- package/dist/cjs/listeners/touch-listener-manager.d.ts +10 -0
- package/dist/cjs/listeners/touch-listener-manager.js +56 -0
- package/dist/cjs/listeners/unload-listener-manager.d.ts +8 -0
- package/dist/cjs/listeners/unload-listener-manager.js +30 -0
- package/dist/cjs/listeners/visibility-listener-manager.d.ts +12 -0
- package/dist/cjs/listeners/visibility-listener-manager.js +83 -0
- package/dist/cjs/managers/api.manager.d.ts +3 -0
- package/dist/cjs/managers/api.manager.js +14 -0
- package/dist/cjs/managers/config.manager.d.ts +7 -0
- package/dist/cjs/managers/config.manager.js +94 -0
- package/dist/cjs/managers/cross-tab-session.manager.d.ts +170 -0
- package/dist/cjs/managers/cross-tab-session.manager.js +730 -0
- package/dist/cjs/managers/event.manager.d.ts +61 -0
- package/dist/cjs/managers/event.manager.js +508 -0
- package/dist/cjs/managers/sampling.manager.d.ts +8 -0
- package/dist/cjs/managers/sampling.manager.js +53 -0
- package/dist/cjs/managers/sender.manager.d.ts +46 -0
- package/dist/cjs/managers/sender.manager.js +304 -0
- package/dist/cjs/managers/session-recovery.manager.d.ts +65 -0
- package/dist/cjs/managers/session-recovery.manager.js +237 -0
- package/dist/cjs/managers/session.manager.d.ts +72 -0
- package/dist/cjs/managers/session.manager.js +587 -0
- package/dist/cjs/managers/state.manager.d.ts +5 -0
- package/dist/cjs/managers/state.manager.js +23 -0
- package/dist/cjs/managers/storage.manager.d.ts +10 -0
- package/dist/cjs/managers/storage.manager.js +81 -0
- package/dist/cjs/managers/tags.manager.d.ts +12 -0
- package/dist/cjs/managers/tags.manager.js +289 -0
- package/dist/cjs/managers/user.manager.d.ts +7 -0
- package/dist/cjs/managers/user.manager.js +22 -0
- package/dist/cjs/public-api.d.ts +1 -0
- package/dist/cjs/public-api.js +37 -0
- package/dist/cjs/types/api.types.d.ts +21 -0
- package/dist/cjs/types/api.types.js +25 -0
- package/dist/cjs/types/common.types.d.ts +1 -0
- package/dist/cjs/types/common.types.js +2 -0
- package/dist/cjs/types/config.types.d.ts +104 -0
- package/dist/cjs/types/config.types.js +2 -0
- package/dist/cjs/types/device.types.d.ts +6 -0
- package/dist/cjs/types/device.types.js +10 -0
- package/dist/cjs/types/event.types.d.ts +104 -0
- package/dist/cjs/types/event.types.js +25 -0
- package/dist/cjs/types/index.d.ts +13 -0
- package/dist/cjs/types/index.js +29 -0
- package/dist/cjs/types/log.types.d.ts +4 -0
- package/dist/cjs/types/log.types.js +2 -0
- package/dist/cjs/types/mode.types.d.ts +7 -0
- package/dist/cjs/types/mode.types.js +11 -0
- package/dist/cjs/types/queue.types.d.ts +23 -0
- package/dist/cjs/types/queue.types.js +2 -0
- package/dist/cjs/types/session.types.d.ts +65 -0
- package/dist/cjs/types/session.types.js +2 -0
- package/dist/cjs/types/state.types.d.ts +12 -0
- package/dist/cjs/types/state.types.js +2 -0
- package/dist/cjs/types/tag.types.d.ts +43 -0
- package/dist/cjs/types/tag.types.js +31 -0
- package/dist/cjs/types/validation-error.types.d.ts +42 -0
- package/dist/cjs/types/validation-error.types.js +68 -0
- package/dist/cjs/types/web-vitals.types.d.ts +6 -0
- package/dist/cjs/types/web-vitals.types.js +2 -0
- package/dist/cjs/types/window.types.d.ts +17 -0
- package/dist/cjs/types/window.types.js +2 -0
- package/dist/cjs/utils/browser/device-detector.utils.d.ts +6 -0
- package/dist/cjs/utils/browser/device-detector.utils.js +71 -0
- package/dist/cjs/utils/browser/index.d.ts +2 -0
- package/dist/cjs/utils/browser/index.js +18 -0
- package/dist/cjs/utils/browser/utm-params.utils.d.ts +6 -0
- package/dist/cjs/utils/browser/utm-params.utils.js +37 -0
- package/dist/cjs/utils/data/index.d.ts +1 -0
- package/dist/cjs/utils/data/index.js +17 -0
- package/dist/cjs/utils/data/uuid.utils.d.ts +5 -0
- package/dist/cjs/utils/data/uuid.utils.js +18 -0
- package/dist/cjs/utils/index.d.ts +6 -0
- package/dist/cjs/utils/index.js +22 -0
- package/dist/cjs/utils/logging/debug-logger.utils.d.ts +56 -0
- package/dist/cjs/utils/logging/debug-logger.utils.js +139 -0
- package/dist/cjs/utils/logging/index.d.ts +1 -0
- package/dist/cjs/utils/logging/index.js +5 -0
- package/dist/cjs/utils/network/index.d.ts +1 -0
- package/dist/cjs/utils/network/index.js +17 -0
- package/dist/cjs/utils/network/url.utils.d.ts +20 -0
- package/dist/cjs/utils/network/url.utils.js +172 -0
- package/dist/cjs/utils/security/index.d.ts +1 -0
- package/dist/cjs/utils/security/index.js +17 -0
- package/dist/cjs/utils/security/sanitize.utils.d.ts +32 -0
- package/dist/cjs/utils/security/sanitize.utils.js +319 -0
- package/dist/cjs/utils/validations/config-validations.utils.d.ts +42 -0
- package/dist/cjs/utils/validations/config-validations.utils.js +297 -0
- package/dist/cjs/utils/validations/event-validations.utils.d.ts +12 -0
- package/dist/cjs/utils/validations/event-validations.utils.js +30 -0
- package/dist/cjs/utils/validations/index.d.ts +5 -0
- package/dist/cjs/utils/validations/index.js +21 -0
- package/dist/cjs/utils/validations/metadata-validations.utils.d.ts +22 -0
- package/dist/cjs/utils/validations/metadata-validations.utils.js +115 -0
- package/dist/cjs/utils/validations/type-guards.utils.d.ts +6 -0
- package/dist/cjs/utils/validations/type-guards.utils.js +31 -0
- package/dist/cjs/utils/validations/url-validations.utils.d.ts +15 -0
- package/dist/cjs/utils/validations/url-validations.utils.js +47 -0
- package/dist/esm/api.d.ts +46 -0
- package/dist/esm/api.js +183 -0
- package/dist/esm/app.constants.d.ts +1 -0
- package/dist/esm/app.constants.js +1 -0
- package/dist/esm/app.d.ts +59 -0
- package/dist/esm/app.js +268 -0
- package/dist/esm/app.types.d.ts +6 -0
- package/dist/esm/app.types.js +6 -0
- package/dist/esm/constants/api.constants.d.ts +4 -0
- package/dist/esm/constants/api.constants.js +14 -0
- package/dist/esm/constants/browser.constants.d.ts +3 -0
- package/dist/esm/constants/browser.constants.js +38 -0
- package/dist/esm/constants/index.d.ts +8 -0
- package/dist/esm/constants/index.js +8 -0
- package/dist/esm/constants/initialization.constants.d.ts +40 -0
- package/dist/esm/constants/initialization.constants.js +45 -0
- package/dist/esm/constants/limits.constants.d.ts +25 -0
- package/dist/esm/constants/limits.constants.js +37 -0
- package/dist/esm/constants/security.constants.d.ts +1 -0
- package/dist/esm/constants/security.constants.js +9 -0
- package/dist/esm/constants/storage.constants.d.ts +9 -0
- package/dist/esm/constants/storage.constants.js +11 -0
- package/dist/esm/constants/timing.constants.d.ts +22 -0
- package/dist/esm/constants/timing.constants.js +31 -0
- package/dist/esm/constants/validation.constants.d.ts +13 -0
- package/dist/esm/constants/validation.constants.js +28 -0
- package/dist/esm/handlers/click.handler.d.ts +17 -0
- package/dist/esm/handlers/click.handler.js +195 -0
- package/dist/esm/handlers/error.handler.d.ts +15 -0
- package/dist/esm/handlers/error.handler.js +93 -0
- package/dist/esm/handlers/network.handler.d.ts +16 -0
- package/dist/esm/handlers/network.handler.js +132 -0
- package/dist/esm/handlers/page-view.handler.d.ts +15 -0
- package/dist/esm/handlers/page-view.handler.js +79 -0
- package/dist/esm/handlers/performance.handler.d.ts +19 -0
- package/dist/esm/handlers/performance.handler.js +218 -0
- package/dist/esm/handlers/scroll.handler.d.ts +16 -0
- package/dist/esm/handlers/scroll.handler.js +134 -0
- package/dist/esm/handlers/session.handler.d.ts +29 -0
- package/dist/esm/handlers/session.handler.js +353 -0
- package/dist/esm/integrations/google-analytics.integration.d.ts +18 -0
- package/dist/esm/integrations/google-analytics.integration.js +155 -0
- package/dist/esm/listeners/activity-listener-manager.d.ts +8 -0
- package/dist/esm/listeners/activity-listener-manager.js +28 -0
- package/dist/esm/listeners/index.d.ts +6 -0
- package/dist/esm/listeners/index.js +5 -0
- package/dist/esm/listeners/input-listener-managers.d.ts +15 -0
- package/dist/esm/listeners/input-listener-managers.js +53 -0
- package/dist/esm/listeners/listeners.types.d.ts +4 -0
- package/dist/esm/listeners/listeners.types.js +1 -0
- package/dist/esm/listeners/touch-listener-manager.d.ts +10 -0
- package/dist/esm/listeners/touch-listener-manager.js +52 -0
- package/dist/esm/listeners/unload-listener-manager.d.ts +8 -0
- package/dist/esm/listeners/unload-listener-manager.js +26 -0
- package/dist/esm/listeners/visibility-listener-manager.d.ts +12 -0
- package/dist/esm/listeners/visibility-listener-manager.js +79 -0
- package/dist/esm/managers/api.manager.d.ts +3 -0
- package/dist/esm/managers/api.manager.js +10 -0
- package/dist/esm/managers/config.manager.d.ts +7 -0
- package/dist/esm/managers/config.manager.js +90 -0
- package/dist/esm/managers/cross-tab-session.manager.d.ts +170 -0
- package/dist/esm/managers/cross-tab-session.manager.js +726 -0
- package/dist/esm/managers/event.manager.d.ts +61 -0
- package/dist/esm/managers/event.manager.js +504 -0
- package/dist/esm/managers/sampling.manager.d.ts +8 -0
- package/dist/esm/managers/sampling.manager.js +49 -0
- package/dist/esm/managers/sender.manager.d.ts +46 -0
- package/dist/esm/managers/sender.manager.js +300 -0
- package/dist/esm/managers/session-recovery.manager.d.ts +65 -0
- package/dist/esm/managers/session-recovery.manager.js +233 -0
- package/dist/esm/managers/session.manager.d.ts +72 -0
- package/dist/esm/managers/session.manager.js +583 -0
- package/dist/esm/managers/state.manager.d.ts +5 -0
- package/dist/esm/managers/state.manager.js +19 -0
- package/dist/esm/managers/storage.manager.d.ts +10 -0
- package/dist/esm/managers/storage.manager.js +77 -0
- package/dist/esm/managers/tags.manager.d.ts +12 -0
- package/dist/esm/managers/tags.manager.js +285 -0
- package/dist/esm/managers/user.manager.d.ts +7 -0
- package/dist/esm/managers/user.manager.js +18 -0
- package/dist/esm/public-api.d.ts +1 -0
- package/dist/esm/public-api.js +1 -0
- package/dist/esm/types/api.types.d.ts +21 -0
- package/dist/esm/types/api.types.js +22 -0
- package/dist/esm/types/common.types.d.ts +1 -0
- package/dist/esm/types/common.types.js +1 -0
- package/dist/esm/types/config.types.d.ts +104 -0
- package/dist/esm/types/config.types.js +1 -0
- package/dist/esm/types/device.types.d.ts +6 -0
- package/dist/esm/types/device.types.js +7 -0
- package/dist/esm/types/event.types.d.ts +104 -0
- package/dist/esm/types/event.types.js +22 -0
- package/dist/esm/types/index.d.ts +13 -0
- package/dist/esm/types/index.js +13 -0
- package/dist/esm/types/log.types.d.ts +4 -0
- package/dist/esm/types/log.types.js +1 -0
- package/dist/esm/types/mode.types.d.ts +7 -0
- package/dist/esm/types/mode.types.js +8 -0
- package/dist/esm/types/queue.types.d.ts +23 -0
- package/dist/esm/types/queue.types.js +1 -0
- package/dist/esm/types/session.types.d.ts +65 -0
- package/dist/esm/types/session.types.js +1 -0
- package/dist/esm/types/state.types.d.ts +12 -0
- package/dist/esm/types/state.types.js +1 -0
- package/dist/esm/types/tag.types.d.ts +43 -0
- package/dist/esm/types/tag.types.js +28 -0
- package/dist/esm/types/validation-error.types.d.ts +42 -0
- package/dist/esm/types/validation-error.types.js +59 -0
- package/dist/esm/types/web-vitals.types.d.ts +6 -0
- package/dist/esm/types/web-vitals.types.js +1 -0
- package/dist/esm/types/window.types.d.ts +17 -0
- package/dist/esm/types/window.types.js +1 -0
- package/dist/esm/utils/browser/device-detector.utils.d.ts +6 -0
- package/dist/esm/utils/browser/device-detector.utils.js +67 -0
- package/dist/esm/utils/browser/index.d.ts +2 -0
- package/dist/esm/utils/browser/index.js +2 -0
- package/dist/esm/utils/browser/utm-params.utils.d.ts +6 -0
- package/dist/esm/utils/browser/utm-params.utils.js +33 -0
- package/dist/esm/utils/data/index.d.ts +1 -0
- package/dist/esm/utils/data/index.js +1 -0
- package/dist/esm/utils/data/uuid.utils.d.ts +5 -0
- package/dist/esm/utils/data/uuid.utils.js +14 -0
- package/dist/esm/utils/index.d.ts +6 -0
- package/dist/esm/utils/index.js +6 -0
- package/dist/esm/utils/logging/debug-logger.utils.d.ts +56 -0
- package/dist/esm/utils/logging/debug-logger.utils.js +136 -0
- package/dist/esm/utils/logging/index.d.ts +1 -0
- package/dist/esm/utils/logging/index.js +1 -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.d.ts +20 -0
- package/dist/esm/utils/network/url.utils.js +166 -0
- package/dist/esm/utils/security/index.d.ts +1 -0
- package/dist/esm/utils/security/index.js +1 -0
- package/dist/esm/utils/security/sanitize.utils.d.ts +32 -0
- package/dist/esm/utils/security/sanitize.utils.js +311 -0
- package/dist/esm/utils/validations/config-validations.utils.d.ts +42 -0
- package/dist/esm/utils/validations/config-validations.utils.js +289 -0
- package/dist/esm/utils/validations/event-validations.utils.d.ts +12 -0
- package/dist/esm/utils/validations/event-validations.utils.js +26 -0
- package/dist/esm/utils/validations/index.d.ts +5 -0
- package/dist/esm/utils/validations/index.js +5 -0
- package/dist/esm/utils/validations/metadata-validations.utils.d.ts +22 -0
- package/dist/esm/utils/validations/metadata-validations.utils.js +110 -0
- package/dist/esm/utils/validations/type-guards.utils.d.ts +6 -0
- package/dist/esm/utils/validations/type-guards.utils.js +27 -0
- package/dist/esm/utils/validations/url-validations.utils.d.ts +15 -0
- package/dist/esm/utils/validations/url-validations.utils.js +42 -0
- package/package.json +80 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EventListenerManager } from './listeners.types';
|
|
2
|
+
export declare class TouchListenerManager implements EventListenerManager {
|
|
3
|
+
private readonly onActivity;
|
|
4
|
+
private readonly options;
|
|
5
|
+
private readonly motionThreshold;
|
|
6
|
+
constructor(onActivity: () => void, motionThreshold: number);
|
|
7
|
+
setup(): void;
|
|
8
|
+
cleanup(): void;
|
|
9
|
+
private readonly handleDeviceMotion;
|
|
10
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TouchListenerManager = void 0;
|
|
4
|
+
const logging_1 = require("../utils/logging");
|
|
5
|
+
class TouchListenerManager {
|
|
6
|
+
constructor(onActivity, motionThreshold) {
|
|
7
|
+
this.options = { passive: true };
|
|
8
|
+
this.handleDeviceMotion = (event) => {
|
|
9
|
+
try {
|
|
10
|
+
const acceleration = event.acceleration;
|
|
11
|
+
if (acceleration) {
|
|
12
|
+
const totalAcceleration = Math.abs(acceleration.x ?? 0) + Math.abs(acceleration.y ?? 0) + Math.abs(acceleration.z ?? 0);
|
|
13
|
+
if (totalAcceleration > this.motionThreshold) {
|
|
14
|
+
this.onActivity();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
logging_1.debugLog.warn('TouchListenerManager', 'Error handling device motion event', { error });
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
this.onActivity = onActivity;
|
|
23
|
+
this.motionThreshold = motionThreshold;
|
|
24
|
+
}
|
|
25
|
+
setup() {
|
|
26
|
+
try {
|
|
27
|
+
window.addEventListener('touchstart', this.onActivity, this.options);
|
|
28
|
+
window.addEventListener('touchmove', this.onActivity, this.options);
|
|
29
|
+
window.addEventListener('touchend', this.onActivity, this.options);
|
|
30
|
+
window.addEventListener('orientationchange', this.onActivity, this.options);
|
|
31
|
+
const hasDeviceMotion = 'DeviceMotionEvent' in window;
|
|
32
|
+
if (hasDeviceMotion) {
|
|
33
|
+
window.addEventListener('devicemotion', this.handleDeviceMotion, this.options);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
logging_1.debugLog.error('TouchListenerManager', 'Failed to setup touch listeners', { error });
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
cleanup() {
|
|
42
|
+
try {
|
|
43
|
+
window.removeEventListener('touchstart', this.onActivity);
|
|
44
|
+
window.removeEventListener('touchmove', this.onActivity);
|
|
45
|
+
window.removeEventListener('touchend', this.onActivity);
|
|
46
|
+
window.removeEventListener('orientationchange', this.onActivity);
|
|
47
|
+
if ('DeviceMotionEvent' in window) {
|
|
48
|
+
window.removeEventListener('devicemotion', this.handleDeviceMotion);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logging_1.debugLog.warn('TouchListenerManager', 'Error during touch listeners cleanup', { error });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.TouchListenerManager = TouchListenerManager;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EventListenerManager } from './listeners.types';
|
|
2
|
+
export declare class UnloadListenerManager implements EventListenerManager {
|
|
3
|
+
private readonly onInactivity;
|
|
4
|
+
private readonly options;
|
|
5
|
+
constructor(onInactivity: () => void);
|
|
6
|
+
setup(): void;
|
|
7
|
+
cleanup(): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnloadListenerManager = void 0;
|
|
4
|
+
const logging_1 = require("../utils/logging");
|
|
5
|
+
class UnloadListenerManager {
|
|
6
|
+
constructor(onInactivity) {
|
|
7
|
+
this.options = { passive: true };
|
|
8
|
+
this.onInactivity = onInactivity;
|
|
9
|
+
}
|
|
10
|
+
setup() {
|
|
11
|
+
try {
|
|
12
|
+
window.addEventListener('beforeunload', this.onInactivity, this.options);
|
|
13
|
+
window.addEventListener('pagehide', this.onInactivity, this.options);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
logging_1.debugLog.error('UnloadListenerManager', 'Failed to setup unload listeners', { error });
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
cleanup() {
|
|
21
|
+
try {
|
|
22
|
+
window.removeEventListener('beforeunload', this.onInactivity);
|
|
23
|
+
window.removeEventListener('pagehide', this.onInactivity);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
logging_1.debugLog.warn('UnloadListenerManager', 'Error during unload listeners cleanup', { error });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.UnloadListenerManager = UnloadListenerManager;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EventListenerManager } from './listeners.types';
|
|
2
|
+
export declare class VisibilityListenerManager implements EventListenerManager {
|
|
3
|
+
private readonly onActivity;
|
|
4
|
+
private readonly onVisibilityChange;
|
|
5
|
+
private readonly isMobile;
|
|
6
|
+
private readonly options;
|
|
7
|
+
constructor(onActivity: () => void, onVisibilityChange: () => void, isMobile: boolean);
|
|
8
|
+
setup(): void;
|
|
9
|
+
cleanup(): void;
|
|
10
|
+
private setupMobileEvents;
|
|
11
|
+
private cleanupMobileEvents;
|
|
12
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VisibilityListenerManager = void 0;
|
|
4
|
+
const logging_1 = require("../utils/logging");
|
|
5
|
+
class VisibilityListenerManager {
|
|
6
|
+
constructor(onActivity, onVisibilityChange, isMobile) {
|
|
7
|
+
this.options = { passive: true };
|
|
8
|
+
this.onActivity = onActivity;
|
|
9
|
+
this.onVisibilityChange = onVisibilityChange;
|
|
10
|
+
this.isMobile = isMobile;
|
|
11
|
+
}
|
|
12
|
+
setup() {
|
|
13
|
+
try {
|
|
14
|
+
const hasVisibilityAPI = 'visibilityState' in document;
|
|
15
|
+
if (hasVisibilityAPI) {
|
|
16
|
+
document.addEventListener('visibilitychange', this.onVisibilityChange, this.options);
|
|
17
|
+
}
|
|
18
|
+
window.addEventListener('blur', this.onVisibilityChange, this.options);
|
|
19
|
+
window.addEventListener('focus', this.onActivity, this.options);
|
|
20
|
+
const hasNetworkAPI = 'onLine' in navigator;
|
|
21
|
+
if (hasNetworkAPI) {
|
|
22
|
+
window.addEventListener('online', this.onActivity, this.options);
|
|
23
|
+
window.addEventListener('offline', this.onVisibilityChange, this.options);
|
|
24
|
+
}
|
|
25
|
+
if (this.isMobile) {
|
|
26
|
+
this.setupMobileEvents();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logging_1.debugLog.error('VisibilityListenerManager', 'Failed to setup visibility listeners', { error });
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
cleanup() {
|
|
35
|
+
try {
|
|
36
|
+
if ('visibilityState' in document) {
|
|
37
|
+
document.removeEventListener('visibilitychange', this.onVisibilityChange);
|
|
38
|
+
}
|
|
39
|
+
window.removeEventListener('blur', this.onVisibilityChange);
|
|
40
|
+
window.removeEventListener('focus', this.onActivity);
|
|
41
|
+
if ('onLine' in navigator) {
|
|
42
|
+
window.removeEventListener('online', this.onActivity);
|
|
43
|
+
window.removeEventListener('offline', this.onVisibilityChange);
|
|
44
|
+
}
|
|
45
|
+
if (this.isMobile) {
|
|
46
|
+
this.cleanupMobileEvents();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logging_1.debugLog.warn('VisibilityListenerManager', 'Error during visibility listeners cleanup', { error });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
setupMobileEvents() {
|
|
54
|
+
try {
|
|
55
|
+
document.addEventListener('pause', this.onVisibilityChange, this.options);
|
|
56
|
+
document.addEventListener('resume', this.onActivity, this.options);
|
|
57
|
+
const hasOrientationAPI = 'orientation' in screen;
|
|
58
|
+
if (hasOrientationAPI) {
|
|
59
|
+
screen.orientation.addEventListener('change', this.onActivity, this.options);
|
|
60
|
+
}
|
|
61
|
+
window.addEventListener('pageshow', this.onActivity, this.options);
|
|
62
|
+
window.addEventListener('pagehide', this.onActivity, this.options);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logging_1.debugLog.warn('VisibilityListenerManager', 'Failed to setup mobile listeners', { error });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
cleanupMobileEvents() {
|
|
69
|
+
try {
|
|
70
|
+
document.removeEventListener('pause', this.onVisibilityChange);
|
|
71
|
+
document.removeEventListener('resume', this.onActivity);
|
|
72
|
+
if ('orientation' in screen) {
|
|
73
|
+
screen.orientation.removeEventListener('change', this.onActivity);
|
|
74
|
+
}
|
|
75
|
+
window.removeEventListener('pageshow', this.onActivity);
|
|
76
|
+
window.removeEventListener('pagehide', this.onActivity);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
logging_1.debugLog.warn('VisibilityListenerManager', 'Error during mobile listeners cleanup', { error });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.VisibilityListenerManager = VisibilityListenerManager;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiManager = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
class ApiManager {
|
|
6
|
+
getUrl(id, allowHttp = false) {
|
|
7
|
+
const url = (0, utils_1.getApiUrl)(id, allowHttp);
|
|
8
|
+
if (!(0, utils_1.isValidUrl)(url, allowHttp)) {
|
|
9
|
+
throw new Error('Invalid URL');
|
|
10
|
+
}
|
|
11
|
+
return url;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ApiManager = ApiManager;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigManager = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const logging_1 = require("../utils/logging");
|
|
8
|
+
class ConfigManager {
|
|
9
|
+
async get(apiUrl, appConfig) {
|
|
10
|
+
if (appConfig.id === types_1.SpecialProjectId.HttpSkip) {
|
|
11
|
+
logging_1.debugLog.debug('ConfigManager', 'Using special project id');
|
|
12
|
+
return this.getDefaultConfig(appConfig);
|
|
13
|
+
}
|
|
14
|
+
logging_1.debugLog.debug('ConfigManager', 'Loading config from API', { apiUrl, projectId: appConfig.id });
|
|
15
|
+
const config = await this.load(apiUrl, appConfig, appConfig.id === types_1.SpecialProjectId.HttpLocal);
|
|
16
|
+
logging_1.debugLog.info('ConfigManager', 'Config loaded successfully', {
|
|
17
|
+
projectId: appConfig.id,
|
|
18
|
+
mode: config.mode,
|
|
19
|
+
hasExcludedPaths: !!config.excludedUrlPaths?.length,
|
|
20
|
+
hasGlobalMetadata: !!config.globalMetadata,
|
|
21
|
+
});
|
|
22
|
+
return config;
|
|
23
|
+
}
|
|
24
|
+
async load(apiUrl, appConfig, useLocalServer) {
|
|
25
|
+
try {
|
|
26
|
+
const configUrl = useLocalServer ? `${window.location.origin}/config` : this.getUrl(apiUrl);
|
|
27
|
+
if (!configUrl) {
|
|
28
|
+
throw new Error('Config URL is not valid or not allowed');
|
|
29
|
+
}
|
|
30
|
+
const response = await fetch(configUrl, {
|
|
31
|
+
method: 'GET',
|
|
32
|
+
headers: { 'Content-Type': 'application/json' },
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
const error = `HTTP ${response.status}: ${response.statusText}`;
|
|
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');
|
|
60
|
+
}
|
|
61
|
+
const errorSampling = Object.values(types_1.Mode).includes(mergedConfig.mode)
|
|
62
|
+
? 1
|
|
63
|
+
: (mergedConfig.errorSampling ?? 0.1);
|
|
64
|
+
const finalConfig = { ...mergedConfig, errorSampling };
|
|
65
|
+
return finalConfig;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
69
|
+
logging_1.debugLog.error('ConfigManager', 'Failed to load config', { error: errorMessage, apiUrl });
|
|
70
|
+
throw new Error(`Failed to load config: ${errorMessage}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
getUrl(apiUrl) {
|
|
74
|
+
const urlParameters = new URLSearchParams(window.location.search);
|
|
75
|
+
const isQaMode = urlParameters.get('qaMode') === 'true';
|
|
76
|
+
let configUrl = `${apiUrl}/config`;
|
|
77
|
+
if (isQaMode) {
|
|
78
|
+
configUrl += '?qaMode=true';
|
|
79
|
+
}
|
|
80
|
+
if (!(0, utils_1.isValidUrl)(configUrl)) {
|
|
81
|
+
logging_1.debugLog.clientError('ConfigManager', 'Invalid config URL provided', { configUrl });
|
|
82
|
+
throw new Error('Config URL is not valid or not allowed');
|
|
83
|
+
}
|
|
84
|
+
return configUrl;
|
|
85
|
+
}
|
|
86
|
+
getDefaultConfig(appConfig) {
|
|
87
|
+
return (0, constants_1.DEFAULT_CONFIG)({
|
|
88
|
+
...appConfig,
|
|
89
|
+
errorSampling: 1,
|
|
90
|
+
...(Object.values(types_1.SpecialProjectId).includes(appConfig.id) && { mode: types_1.Mode.DEBUG }),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.ConfigManager = ConfigManager;
|
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
}
|