@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.
Files changed (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/browser/tracelog.js +4040 -0
  4. package/dist/browser/web-vitals-CCnqwnC8.mjs +198 -0
  5. package/dist/cjs/api.d.ts +46 -0
  6. package/dist/cjs/api.js +224 -0
  7. package/dist/cjs/app.constants.d.ts +1 -0
  8. package/dist/cjs/app.constants.js +5 -0
  9. package/dist/cjs/app.d.ts +59 -0
  10. package/dist/cjs/app.js +272 -0
  11. package/dist/cjs/app.types.d.ts +6 -0
  12. package/dist/cjs/app.types.js +22 -0
  13. package/dist/cjs/constants/api.constants.d.ts +4 -0
  14. package/dist/cjs/constants/api.constants.js +18 -0
  15. package/dist/cjs/constants/browser.constants.d.ts +3 -0
  16. package/dist/cjs/constants/browser.constants.js +41 -0
  17. package/dist/cjs/constants/index.d.ts +8 -0
  18. package/dist/cjs/constants/index.js +24 -0
  19. package/dist/cjs/constants/initialization.constants.d.ts +40 -0
  20. package/dist/cjs/constants/initialization.constants.js +48 -0
  21. package/dist/cjs/constants/limits.constants.d.ts +25 -0
  22. package/dist/cjs/constants/limits.constants.js +40 -0
  23. package/dist/cjs/constants/security.constants.d.ts +1 -0
  24. package/dist/cjs/constants/security.constants.js +12 -0
  25. package/dist/cjs/constants/storage.constants.d.ts +9 -0
  26. package/dist/cjs/constants/storage.constants.js +22 -0
  27. package/dist/cjs/constants/timing.constants.d.ts +22 -0
  28. package/dist/cjs/constants/timing.constants.js +34 -0
  29. package/dist/cjs/constants/validation.constants.d.ts +13 -0
  30. package/dist/cjs/constants/validation.constants.js +31 -0
  31. package/dist/cjs/handlers/click.handler.d.ts +17 -0
  32. package/dist/cjs/handlers/click.handler.js +199 -0
  33. package/dist/cjs/handlers/error.handler.d.ts +15 -0
  34. package/dist/cjs/handlers/error.handler.js +97 -0
  35. package/dist/cjs/handlers/network.handler.d.ts +16 -0
  36. package/dist/cjs/handlers/network.handler.js +136 -0
  37. package/dist/cjs/handlers/page-view.handler.d.ts +15 -0
  38. package/dist/cjs/handlers/page-view.handler.js +83 -0
  39. package/dist/cjs/handlers/performance.handler.d.ts +19 -0
  40. package/dist/cjs/handlers/performance.handler.js +255 -0
  41. package/dist/cjs/handlers/scroll.handler.d.ts +16 -0
  42. package/dist/cjs/handlers/scroll.handler.js +138 -0
  43. package/dist/cjs/handlers/session.handler.d.ts +29 -0
  44. package/dist/cjs/handlers/session.handler.js +357 -0
  45. package/dist/cjs/integrations/google-analytics.integration.d.ts +18 -0
  46. package/dist/cjs/integrations/google-analytics.integration.js +159 -0
  47. package/dist/cjs/listeners/activity-listener-manager.d.ts +8 -0
  48. package/dist/cjs/listeners/activity-listener-manager.js +32 -0
  49. package/dist/cjs/listeners/index.d.ts +6 -0
  50. package/dist/cjs/listeners/index.js +14 -0
  51. package/dist/cjs/listeners/input-listener-managers.d.ts +15 -0
  52. package/dist/cjs/listeners/input-listener-managers.js +58 -0
  53. package/dist/cjs/listeners/listeners.types.d.ts +4 -0
  54. package/dist/cjs/listeners/listeners.types.js +2 -0
  55. package/dist/cjs/listeners/touch-listener-manager.d.ts +10 -0
  56. package/dist/cjs/listeners/touch-listener-manager.js +56 -0
  57. package/dist/cjs/listeners/unload-listener-manager.d.ts +8 -0
  58. package/dist/cjs/listeners/unload-listener-manager.js +30 -0
  59. package/dist/cjs/listeners/visibility-listener-manager.d.ts +12 -0
  60. package/dist/cjs/listeners/visibility-listener-manager.js +83 -0
  61. package/dist/cjs/managers/api.manager.d.ts +3 -0
  62. package/dist/cjs/managers/api.manager.js +14 -0
  63. package/dist/cjs/managers/config.manager.d.ts +7 -0
  64. package/dist/cjs/managers/config.manager.js +94 -0
  65. package/dist/cjs/managers/cross-tab-session.manager.d.ts +170 -0
  66. package/dist/cjs/managers/cross-tab-session.manager.js +730 -0
  67. package/dist/cjs/managers/event.manager.d.ts +61 -0
  68. package/dist/cjs/managers/event.manager.js +508 -0
  69. package/dist/cjs/managers/sampling.manager.d.ts +8 -0
  70. package/dist/cjs/managers/sampling.manager.js +53 -0
  71. package/dist/cjs/managers/sender.manager.d.ts +46 -0
  72. package/dist/cjs/managers/sender.manager.js +304 -0
  73. package/dist/cjs/managers/session-recovery.manager.d.ts +65 -0
  74. package/dist/cjs/managers/session-recovery.manager.js +237 -0
  75. package/dist/cjs/managers/session.manager.d.ts +72 -0
  76. package/dist/cjs/managers/session.manager.js +587 -0
  77. package/dist/cjs/managers/state.manager.d.ts +5 -0
  78. package/dist/cjs/managers/state.manager.js +23 -0
  79. package/dist/cjs/managers/storage.manager.d.ts +10 -0
  80. package/dist/cjs/managers/storage.manager.js +81 -0
  81. package/dist/cjs/managers/tags.manager.d.ts +12 -0
  82. package/dist/cjs/managers/tags.manager.js +289 -0
  83. package/dist/cjs/managers/user.manager.d.ts +7 -0
  84. package/dist/cjs/managers/user.manager.js +22 -0
  85. package/dist/cjs/public-api.d.ts +1 -0
  86. package/dist/cjs/public-api.js +37 -0
  87. package/dist/cjs/types/api.types.d.ts +21 -0
  88. package/dist/cjs/types/api.types.js +25 -0
  89. package/dist/cjs/types/common.types.d.ts +1 -0
  90. package/dist/cjs/types/common.types.js +2 -0
  91. package/dist/cjs/types/config.types.d.ts +104 -0
  92. package/dist/cjs/types/config.types.js +2 -0
  93. package/dist/cjs/types/device.types.d.ts +6 -0
  94. package/dist/cjs/types/device.types.js +10 -0
  95. package/dist/cjs/types/event.types.d.ts +104 -0
  96. package/dist/cjs/types/event.types.js +25 -0
  97. package/dist/cjs/types/index.d.ts +13 -0
  98. package/dist/cjs/types/index.js +29 -0
  99. package/dist/cjs/types/log.types.d.ts +4 -0
  100. package/dist/cjs/types/log.types.js +2 -0
  101. package/dist/cjs/types/mode.types.d.ts +7 -0
  102. package/dist/cjs/types/mode.types.js +11 -0
  103. package/dist/cjs/types/queue.types.d.ts +23 -0
  104. package/dist/cjs/types/queue.types.js +2 -0
  105. package/dist/cjs/types/session.types.d.ts +65 -0
  106. package/dist/cjs/types/session.types.js +2 -0
  107. package/dist/cjs/types/state.types.d.ts +12 -0
  108. package/dist/cjs/types/state.types.js +2 -0
  109. package/dist/cjs/types/tag.types.d.ts +43 -0
  110. package/dist/cjs/types/tag.types.js +31 -0
  111. package/dist/cjs/types/validation-error.types.d.ts +42 -0
  112. package/dist/cjs/types/validation-error.types.js +68 -0
  113. package/dist/cjs/types/web-vitals.types.d.ts +6 -0
  114. package/dist/cjs/types/web-vitals.types.js +2 -0
  115. package/dist/cjs/types/window.types.d.ts +17 -0
  116. package/dist/cjs/types/window.types.js +2 -0
  117. package/dist/cjs/utils/browser/device-detector.utils.d.ts +6 -0
  118. package/dist/cjs/utils/browser/device-detector.utils.js +71 -0
  119. package/dist/cjs/utils/browser/index.d.ts +2 -0
  120. package/dist/cjs/utils/browser/index.js +18 -0
  121. package/dist/cjs/utils/browser/utm-params.utils.d.ts +6 -0
  122. package/dist/cjs/utils/browser/utm-params.utils.js +37 -0
  123. package/dist/cjs/utils/data/index.d.ts +1 -0
  124. package/dist/cjs/utils/data/index.js +17 -0
  125. package/dist/cjs/utils/data/uuid.utils.d.ts +5 -0
  126. package/dist/cjs/utils/data/uuid.utils.js +18 -0
  127. package/dist/cjs/utils/index.d.ts +6 -0
  128. package/dist/cjs/utils/index.js +22 -0
  129. package/dist/cjs/utils/logging/debug-logger.utils.d.ts +56 -0
  130. package/dist/cjs/utils/logging/debug-logger.utils.js +139 -0
  131. package/dist/cjs/utils/logging/index.d.ts +1 -0
  132. package/dist/cjs/utils/logging/index.js +5 -0
  133. package/dist/cjs/utils/network/index.d.ts +1 -0
  134. package/dist/cjs/utils/network/index.js +17 -0
  135. package/dist/cjs/utils/network/url.utils.d.ts +20 -0
  136. package/dist/cjs/utils/network/url.utils.js +172 -0
  137. package/dist/cjs/utils/security/index.d.ts +1 -0
  138. package/dist/cjs/utils/security/index.js +17 -0
  139. package/dist/cjs/utils/security/sanitize.utils.d.ts +32 -0
  140. package/dist/cjs/utils/security/sanitize.utils.js +319 -0
  141. package/dist/cjs/utils/validations/config-validations.utils.d.ts +42 -0
  142. package/dist/cjs/utils/validations/config-validations.utils.js +297 -0
  143. package/dist/cjs/utils/validations/event-validations.utils.d.ts +12 -0
  144. package/dist/cjs/utils/validations/event-validations.utils.js +30 -0
  145. package/dist/cjs/utils/validations/index.d.ts +5 -0
  146. package/dist/cjs/utils/validations/index.js +21 -0
  147. package/dist/cjs/utils/validations/metadata-validations.utils.d.ts +22 -0
  148. package/dist/cjs/utils/validations/metadata-validations.utils.js +115 -0
  149. package/dist/cjs/utils/validations/type-guards.utils.d.ts +6 -0
  150. package/dist/cjs/utils/validations/type-guards.utils.js +31 -0
  151. package/dist/cjs/utils/validations/url-validations.utils.d.ts +15 -0
  152. package/dist/cjs/utils/validations/url-validations.utils.js +47 -0
  153. package/dist/esm/api.d.ts +46 -0
  154. package/dist/esm/api.js +183 -0
  155. package/dist/esm/app.constants.d.ts +1 -0
  156. package/dist/esm/app.constants.js +1 -0
  157. package/dist/esm/app.d.ts +59 -0
  158. package/dist/esm/app.js +268 -0
  159. package/dist/esm/app.types.d.ts +6 -0
  160. package/dist/esm/app.types.js +6 -0
  161. package/dist/esm/constants/api.constants.d.ts +4 -0
  162. package/dist/esm/constants/api.constants.js +14 -0
  163. package/dist/esm/constants/browser.constants.d.ts +3 -0
  164. package/dist/esm/constants/browser.constants.js +38 -0
  165. package/dist/esm/constants/index.d.ts +8 -0
  166. package/dist/esm/constants/index.js +8 -0
  167. package/dist/esm/constants/initialization.constants.d.ts +40 -0
  168. package/dist/esm/constants/initialization.constants.js +45 -0
  169. package/dist/esm/constants/limits.constants.d.ts +25 -0
  170. package/dist/esm/constants/limits.constants.js +37 -0
  171. package/dist/esm/constants/security.constants.d.ts +1 -0
  172. package/dist/esm/constants/security.constants.js +9 -0
  173. package/dist/esm/constants/storage.constants.d.ts +9 -0
  174. package/dist/esm/constants/storage.constants.js +11 -0
  175. package/dist/esm/constants/timing.constants.d.ts +22 -0
  176. package/dist/esm/constants/timing.constants.js +31 -0
  177. package/dist/esm/constants/validation.constants.d.ts +13 -0
  178. package/dist/esm/constants/validation.constants.js +28 -0
  179. package/dist/esm/handlers/click.handler.d.ts +17 -0
  180. package/dist/esm/handlers/click.handler.js +195 -0
  181. package/dist/esm/handlers/error.handler.d.ts +15 -0
  182. package/dist/esm/handlers/error.handler.js +93 -0
  183. package/dist/esm/handlers/network.handler.d.ts +16 -0
  184. package/dist/esm/handlers/network.handler.js +132 -0
  185. package/dist/esm/handlers/page-view.handler.d.ts +15 -0
  186. package/dist/esm/handlers/page-view.handler.js +79 -0
  187. package/dist/esm/handlers/performance.handler.d.ts +19 -0
  188. package/dist/esm/handlers/performance.handler.js +218 -0
  189. package/dist/esm/handlers/scroll.handler.d.ts +16 -0
  190. package/dist/esm/handlers/scroll.handler.js +134 -0
  191. package/dist/esm/handlers/session.handler.d.ts +29 -0
  192. package/dist/esm/handlers/session.handler.js +353 -0
  193. package/dist/esm/integrations/google-analytics.integration.d.ts +18 -0
  194. package/dist/esm/integrations/google-analytics.integration.js +155 -0
  195. package/dist/esm/listeners/activity-listener-manager.d.ts +8 -0
  196. package/dist/esm/listeners/activity-listener-manager.js +28 -0
  197. package/dist/esm/listeners/index.d.ts +6 -0
  198. package/dist/esm/listeners/index.js +5 -0
  199. package/dist/esm/listeners/input-listener-managers.d.ts +15 -0
  200. package/dist/esm/listeners/input-listener-managers.js +53 -0
  201. package/dist/esm/listeners/listeners.types.d.ts +4 -0
  202. package/dist/esm/listeners/listeners.types.js +1 -0
  203. package/dist/esm/listeners/touch-listener-manager.d.ts +10 -0
  204. package/dist/esm/listeners/touch-listener-manager.js +52 -0
  205. package/dist/esm/listeners/unload-listener-manager.d.ts +8 -0
  206. package/dist/esm/listeners/unload-listener-manager.js +26 -0
  207. package/dist/esm/listeners/visibility-listener-manager.d.ts +12 -0
  208. package/dist/esm/listeners/visibility-listener-manager.js +79 -0
  209. package/dist/esm/managers/api.manager.d.ts +3 -0
  210. package/dist/esm/managers/api.manager.js +10 -0
  211. package/dist/esm/managers/config.manager.d.ts +7 -0
  212. package/dist/esm/managers/config.manager.js +90 -0
  213. package/dist/esm/managers/cross-tab-session.manager.d.ts +170 -0
  214. package/dist/esm/managers/cross-tab-session.manager.js +726 -0
  215. package/dist/esm/managers/event.manager.d.ts +61 -0
  216. package/dist/esm/managers/event.manager.js +504 -0
  217. package/dist/esm/managers/sampling.manager.d.ts +8 -0
  218. package/dist/esm/managers/sampling.manager.js +49 -0
  219. package/dist/esm/managers/sender.manager.d.ts +46 -0
  220. package/dist/esm/managers/sender.manager.js +300 -0
  221. package/dist/esm/managers/session-recovery.manager.d.ts +65 -0
  222. package/dist/esm/managers/session-recovery.manager.js +233 -0
  223. package/dist/esm/managers/session.manager.d.ts +72 -0
  224. package/dist/esm/managers/session.manager.js +583 -0
  225. package/dist/esm/managers/state.manager.d.ts +5 -0
  226. package/dist/esm/managers/state.manager.js +19 -0
  227. package/dist/esm/managers/storage.manager.d.ts +10 -0
  228. package/dist/esm/managers/storage.manager.js +77 -0
  229. package/dist/esm/managers/tags.manager.d.ts +12 -0
  230. package/dist/esm/managers/tags.manager.js +285 -0
  231. package/dist/esm/managers/user.manager.d.ts +7 -0
  232. package/dist/esm/managers/user.manager.js +18 -0
  233. package/dist/esm/public-api.d.ts +1 -0
  234. package/dist/esm/public-api.js +1 -0
  235. package/dist/esm/types/api.types.d.ts +21 -0
  236. package/dist/esm/types/api.types.js +22 -0
  237. package/dist/esm/types/common.types.d.ts +1 -0
  238. package/dist/esm/types/common.types.js +1 -0
  239. package/dist/esm/types/config.types.d.ts +104 -0
  240. package/dist/esm/types/config.types.js +1 -0
  241. package/dist/esm/types/device.types.d.ts +6 -0
  242. package/dist/esm/types/device.types.js +7 -0
  243. package/dist/esm/types/event.types.d.ts +104 -0
  244. package/dist/esm/types/event.types.js +22 -0
  245. package/dist/esm/types/index.d.ts +13 -0
  246. package/dist/esm/types/index.js +13 -0
  247. package/dist/esm/types/log.types.d.ts +4 -0
  248. package/dist/esm/types/log.types.js +1 -0
  249. package/dist/esm/types/mode.types.d.ts +7 -0
  250. package/dist/esm/types/mode.types.js +8 -0
  251. package/dist/esm/types/queue.types.d.ts +23 -0
  252. package/dist/esm/types/queue.types.js +1 -0
  253. package/dist/esm/types/session.types.d.ts +65 -0
  254. package/dist/esm/types/session.types.js +1 -0
  255. package/dist/esm/types/state.types.d.ts +12 -0
  256. package/dist/esm/types/state.types.js +1 -0
  257. package/dist/esm/types/tag.types.d.ts +43 -0
  258. package/dist/esm/types/tag.types.js +28 -0
  259. package/dist/esm/types/validation-error.types.d.ts +42 -0
  260. package/dist/esm/types/validation-error.types.js +59 -0
  261. package/dist/esm/types/web-vitals.types.d.ts +6 -0
  262. package/dist/esm/types/web-vitals.types.js +1 -0
  263. package/dist/esm/types/window.types.d.ts +17 -0
  264. package/dist/esm/types/window.types.js +1 -0
  265. package/dist/esm/utils/browser/device-detector.utils.d.ts +6 -0
  266. package/dist/esm/utils/browser/device-detector.utils.js +67 -0
  267. package/dist/esm/utils/browser/index.d.ts +2 -0
  268. package/dist/esm/utils/browser/index.js +2 -0
  269. package/dist/esm/utils/browser/utm-params.utils.d.ts +6 -0
  270. package/dist/esm/utils/browser/utm-params.utils.js +33 -0
  271. package/dist/esm/utils/data/index.d.ts +1 -0
  272. package/dist/esm/utils/data/index.js +1 -0
  273. package/dist/esm/utils/data/uuid.utils.d.ts +5 -0
  274. package/dist/esm/utils/data/uuid.utils.js +14 -0
  275. package/dist/esm/utils/index.d.ts +6 -0
  276. package/dist/esm/utils/index.js +6 -0
  277. package/dist/esm/utils/logging/debug-logger.utils.d.ts +56 -0
  278. package/dist/esm/utils/logging/debug-logger.utils.js +136 -0
  279. package/dist/esm/utils/logging/index.d.ts +1 -0
  280. package/dist/esm/utils/logging/index.js +1 -0
  281. package/dist/esm/utils/network/index.d.ts +1 -0
  282. package/dist/esm/utils/network/index.js +1 -0
  283. package/dist/esm/utils/network/url.utils.d.ts +20 -0
  284. package/dist/esm/utils/network/url.utils.js +166 -0
  285. package/dist/esm/utils/security/index.d.ts +1 -0
  286. package/dist/esm/utils/security/index.js +1 -0
  287. package/dist/esm/utils/security/sanitize.utils.d.ts +32 -0
  288. package/dist/esm/utils/security/sanitize.utils.js +311 -0
  289. package/dist/esm/utils/validations/config-validations.utils.d.ts +42 -0
  290. package/dist/esm/utils/validations/config-validations.utils.js +289 -0
  291. package/dist/esm/utils/validations/event-validations.utils.d.ts +12 -0
  292. package/dist/esm/utils/validations/event-validations.utils.js +26 -0
  293. package/dist/esm/utils/validations/index.d.ts +5 -0
  294. package/dist/esm/utils/validations/index.js +5 -0
  295. package/dist/esm/utils/validations/metadata-validations.utils.d.ts +22 -0
  296. package/dist/esm/utils/validations/metadata-validations.utils.js +110 -0
  297. package/dist/esm/utils/validations/type-guards.utils.d.ts +6 -0
  298. package/dist/esm/utils/validations/type-guards.utils.js +27 -0
  299. package/dist/esm/utils/validations/url-validations.utils.d.ts +15 -0
  300. package/dist/esm/utils/validations/url-validations.utils.js +42 -0
  301. package/package.json +80 -0
@@ -0,0 +1,4 @@
1
+ export interface EventListenerManager {
2
+ setup(): void;
3
+ cleanup(): void;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,3 @@
1
+ export declare class ApiManager {
2
+ getUrl(id: string, allowHttp?: boolean): string;
3
+ }
@@ -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,7 @@
1
+ import { AppConfig, Config } from '../types';
2
+ export declare class ConfigManager {
3
+ get(apiUrl: string, appConfig: AppConfig): Promise<Config>;
4
+ private load;
5
+ private getUrl;
6
+ private getDefaultConfig;
7
+ }
@@ -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
+ }