@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,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.App = void 0;
4
+ const api_manager_1 = require("./managers/api.manager");
5
+ const config_manager_1 = require("./managers/config.manager");
6
+ const event_manager_1 = require("./managers/event.manager");
7
+ const user_manager_1 = require("./managers/user.manager");
8
+ const state_manager_1 = require("./managers/state.manager");
9
+ const session_handler_1 = require("./handlers/session.handler");
10
+ const page_view_handler_1 = require("./handlers/page-view.handler");
11
+ const click_handler_1 = require("./handlers/click.handler");
12
+ const scroll_handler_1 = require("./handlers/scroll.handler");
13
+ const validations_1 = require("./utils/validations");
14
+ const event_types_1 = require("./types/event.types");
15
+ const google_analytics_integration_1 = require("./integrations/google-analytics.integration");
16
+ const utils_1 = require("./utils");
17
+ const storage_manager_1 = require("./managers/storage.manager");
18
+ const constants_1 = require("./constants");
19
+ const performance_handler_1 = require("./handlers/performance.handler");
20
+ const error_handler_1 = require("./handlers/error.handler");
21
+ const network_handler_1 = require("./handlers/network.handler");
22
+ const validation_error_types_1 = require("./types/validation-error.types");
23
+ const logging_1 = require("./utils/logging");
24
+ class App extends state_manager_1.StateManager {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.isInitialized = false;
28
+ this.googleAnalytics = null;
29
+ this.suppressNextScrollTimer = null;
30
+ }
31
+ /**
32
+ * Returns the initialization status of the app
33
+ * @returns true if the app is fully initialized, false otherwise
34
+ */
35
+ get initialized() {
36
+ return this.isInitialized;
37
+ }
38
+ async init(appConfig) {
39
+ if (this.isInitialized) {
40
+ logging_1.debugLog.debug('App', 'App already initialized, skipping re-initialization', { projectId: appConfig.id });
41
+ return;
42
+ }
43
+ logging_1.debugLog.info('App', 'App initialization started', { projectId: appConfig.id });
44
+ this.validateAppReadiness(appConfig);
45
+ try {
46
+ this.initStorage();
47
+ await this.setState(appConfig);
48
+ await this.setIntegrations();
49
+ this.setEventManager();
50
+ await this.initHandlers();
51
+ this.isInitialized = true;
52
+ logging_1.debugLog.info('App', 'App initialization completed successfully', {
53
+ projectId: appConfig.id,
54
+ });
55
+ }
56
+ catch (error) {
57
+ this.isInitialized = false;
58
+ logging_1.debugLog.error('App', 'App initialization failed', { projectId: appConfig.id, error });
59
+ throw error;
60
+ }
61
+ }
62
+ /**
63
+ * Validates that the app is ready to initialize with the provided config
64
+ * This is a lightweight runtime validation layer that ensures the app receives proper config
65
+ * @param appConfig - The validated and normalized configuration
66
+ * @throws {ProjectIdValidationError} If project ID is invalid at runtime
67
+ */
68
+ validateAppReadiness(appConfig) {
69
+ // Lightweight validation - config should already be validated and normalized by api.ts
70
+ if (!appConfig?.id) {
71
+ logging_1.debugLog.clientError('App', 'Configuration integrity check failed - missing project ID', {
72
+ hasConfig: !!appConfig,
73
+ hasId: !!appConfig?.id,
74
+ });
75
+ throw new validation_error_types_1.ProjectIdValidationError('Configuration integrity check failed', 'app');
76
+ }
77
+ }
78
+ sendCustomEvent(name, metadata) {
79
+ if (!this.eventManager) {
80
+ logging_1.debugLog.warn('App', 'Custom event attempted before eventManager initialization', { eventName: name });
81
+ return;
82
+ }
83
+ const { valid, error, sanitizedMetadata } = (0, validations_1.isEventValid)(name, metadata);
84
+ if (valid) {
85
+ logging_1.debugLog.debug('App', 'Custom event validated and queued', { eventName: name, hasMetadata: !!sanitizedMetadata });
86
+ this.eventManager.track({
87
+ type: event_types_1.EventType.CUSTOM,
88
+ custom_event: {
89
+ name,
90
+ ...(sanitizedMetadata && { metadata: sanitizedMetadata }),
91
+ },
92
+ });
93
+ }
94
+ else {
95
+ const currentMode = this.get('config')?.mode;
96
+ logging_1.debugLog.clientError('App', `Custom event validation failed: ${error ?? 'unknown error'}`, {
97
+ eventName: name,
98
+ validationError: error,
99
+ hasMetadata: !!metadata,
100
+ mode: currentMode,
101
+ });
102
+ if (currentMode === 'qa' || currentMode === 'debug') {
103
+ throw new Error(`custom event "${name}" validation failed (${error ?? 'unknown error'}). Please, review your event data and try again.`);
104
+ }
105
+ }
106
+ }
107
+ destroy() {
108
+ if (!this.isInitialized) {
109
+ logging_1.debugLog.warn('App', 'Destroy called but app was not initialized');
110
+ return;
111
+ }
112
+ logging_1.debugLog.info('App', 'App cleanup started');
113
+ if (this.googleAnalytics) {
114
+ this.googleAnalytics.cleanup();
115
+ }
116
+ if (this.sessionHandler) {
117
+ this.sessionHandler.stopTracking();
118
+ }
119
+ if (this.pageViewHandler) {
120
+ this.pageViewHandler.stopTracking();
121
+ }
122
+ if (this.clickHandler) {
123
+ this.clickHandler.stopTracking();
124
+ }
125
+ if (this.scrollHandler) {
126
+ this.scrollHandler.stopTracking();
127
+ }
128
+ if (this.performanceHandler) {
129
+ this.performanceHandler.stopTracking();
130
+ }
131
+ if (this.errorHandler) {
132
+ this.errorHandler.stopTracking();
133
+ }
134
+ if (this.networkHandler) {
135
+ this.networkHandler.stopTracking();
136
+ }
137
+ if (this.suppressNextScrollTimer) {
138
+ clearTimeout(this.suppressNextScrollTimer);
139
+ this.suppressNextScrollTimer = null;
140
+ }
141
+ if (this.eventManager) {
142
+ this.eventManager.stop();
143
+ }
144
+ this.set('hasStartSession', false);
145
+ this.set('suppressNextScroll', false);
146
+ this.set('sessionId', null);
147
+ this.isInitialized = false;
148
+ logging_1.debugLog.info('App', 'App cleanup completed successfully');
149
+ }
150
+ async setState(appConfig) {
151
+ this.setApiUrl(appConfig.id, appConfig.allowHttp);
152
+ await this.setConfig(appConfig);
153
+ this.setUserId();
154
+ this.setDevice();
155
+ this.setPageUrl();
156
+ }
157
+ setApiUrl(id, allowHttp = false) {
158
+ const apiManager = new api_manager_1.ApiManager();
159
+ this.set('apiUrl', apiManager.getUrl(id, allowHttp));
160
+ }
161
+ async setConfig(appConfig) {
162
+ const configManager = new config_manager_1.ConfigManager();
163
+ const config = await configManager.get(this.get('apiUrl'), appConfig);
164
+ this.set('config', config);
165
+ }
166
+ setUserId() {
167
+ const userManager = new user_manager_1.UserManager(this.storageManager);
168
+ const userId = userManager.getId();
169
+ this.set('userId', userId);
170
+ }
171
+ setDevice() {
172
+ const device = (0, utils_1.getDeviceType)();
173
+ this.set('device', device);
174
+ }
175
+ setPageUrl() {
176
+ const initialUrl = (0, utils_1.normalizeUrl)(window.location.href, this.get('config').sensitiveQueryParams);
177
+ this.set('pageUrl', initialUrl);
178
+ }
179
+ async setIntegrations() {
180
+ const isIPExcluded = this.get('config').ipExcluded;
181
+ const measurementId = this.get('config').integrations?.googleAnalytics?.measurementId;
182
+ if (!isIPExcluded && measurementId?.trim()) {
183
+ this.googleAnalytics = new google_analytics_integration_1.GoogleAnalyticsIntegration();
184
+ await this.googleAnalytics.initialize();
185
+ }
186
+ }
187
+ async initHandlers() {
188
+ if (!this.eventManager) {
189
+ throw new Error('EventManager must be initialized before handlers');
190
+ }
191
+ if (!this.storageManager) {
192
+ throw new Error('StorageManager must be initialized before handlers');
193
+ }
194
+ this.initSessionHandler();
195
+ this.initPageViewHandler();
196
+ this.initClickHandler();
197
+ this.initScrollHandler();
198
+ await this.initPerformanceHandler();
199
+ this.initErrorHandler();
200
+ this.initNetworkHandler();
201
+ }
202
+ initStorage() {
203
+ this.storageManager = new storage_manager_1.StorageManager();
204
+ }
205
+ setEventManager() {
206
+ if (!this.storageManager) {
207
+ throw new Error('StorageManager must be initialized before EventManager');
208
+ }
209
+ this.eventManager = new event_manager_1.EventManager(this.storageManager, this.googleAnalytics);
210
+ }
211
+ initSessionHandler() {
212
+ if (!this.storageManager || !this.eventManager) {
213
+ throw new Error('StorageManager and EventManager must be initialized before SessionHandler');
214
+ }
215
+ this.sessionHandler = new session_handler_1.SessionHandler(this.storageManager, this.eventManager);
216
+ this.sessionHandler.startTracking();
217
+ }
218
+ initPageViewHandler() {
219
+ if (!this.eventManager) {
220
+ throw new Error('EventManager must be initialized before PageViewHandler');
221
+ }
222
+ const onPageViewTrack = () => this.onPageViewTrack();
223
+ this.pageViewHandler = new page_view_handler_1.PageViewHandler(this.eventManager, onPageViewTrack);
224
+ this.pageViewHandler.startTracking();
225
+ }
226
+ onPageViewTrack() {
227
+ this.set('suppressNextScroll', true);
228
+ if (this.suppressNextScrollTimer) {
229
+ clearTimeout(this.suppressNextScrollTimer);
230
+ this.suppressNextScrollTimer = null;
231
+ }
232
+ this.suppressNextScrollTimer = window.setTimeout(() => {
233
+ this.set('suppressNextScroll', false);
234
+ }, constants_1.SCROLL_DEBOUNCE_TIME_MS * constants_1.SCROLL_SUPPRESSION_CONSTANTS.SUPPRESS_MULTIPLIER);
235
+ }
236
+ initClickHandler() {
237
+ if (!this.eventManager) {
238
+ throw new Error('EventManager must be initialized before ClickHandler');
239
+ }
240
+ this.clickHandler = new click_handler_1.ClickHandler(this.eventManager);
241
+ this.clickHandler.startTracking();
242
+ }
243
+ initScrollHandler() {
244
+ if (!this.eventManager) {
245
+ throw new Error('EventManager must be initialized before ScrollHandler');
246
+ }
247
+ this.scrollHandler = new scroll_handler_1.ScrollHandler(this.eventManager);
248
+ this.scrollHandler.startTracking();
249
+ }
250
+ async initPerformanceHandler() {
251
+ if (!this.eventManager) {
252
+ throw new Error('EventManager must be initialized before PerformanceHandler');
253
+ }
254
+ this.performanceHandler = new performance_handler_1.PerformanceHandler(this.eventManager);
255
+ await this.performanceHandler.startTracking();
256
+ }
257
+ initErrorHandler() {
258
+ if (!this.eventManager) {
259
+ throw new Error('EventManager must be initialized before ErrorHandler');
260
+ }
261
+ this.errorHandler = new error_handler_1.ErrorHandler(this.eventManager);
262
+ this.errorHandler.startTracking();
263
+ }
264
+ initNetworkHandler() {
265
+ if (!this.eventManager) {
266
+ throw new Error('EventManager must be initialized before NetworkHandler');
267
+ }
268
+ this.networkHandler = new network_handler_1.NetworkHandler(this.eventManager);
269
+ this.networkHandler.startTracking();
270
+ }
271
+ }
272
+ exports.App = App;
@@ -0,0 +1,6 @@
1
+ export * from './types/common.types';
2
+ export * from './types/config.types';
3
+ export * from './types/device.types';
4
+ export * from './types/event.types';
5
+ export * from './types/queue.types';
6
+ export * from './types/tag.types';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types/common.types"), exports);
18
+ __exportStar(require("./types/config.types"), exports);
19
+ __exportStar(require("./types/device.types"), exports);
20
+ __exportStar(require("./types/event.types"), exports);
21
+ __exportStar(require("./types/queue.types"), exports);
22
+ __exportStar(require("./types/tag.types"), exports);
@@ -0,0 +1,4 @@
1
+ import { ApiConfig, Config } from '../types';
2
+ export declare const API_BASE_URL = "https://api.tracelog.io";
3
+ export declare const DEFAULT_API_CONFIG: ApiConfig;
4
+ export declare const DEFAULT_CONFIG: (config: Config) => Config;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_CONFIG = exports.DEFAULT_API_CONFIG = exports.API_BASE_URL = void 0;
4
+ const limits_constants_1 = require("./limits.constants");
5
+ const timing_constants_1 = require("./timing.constants");
6
+ exports.API_BASE_URL = 'https://api.tracelog.io';
7
+ exports.DEFAULT_API_CONFIG = {
8
+ samplingRate: limits_constants_1.DEFAULT_SAMPLING_RATE,
9
+ tags: [],
10
+ excludedUrlPaths: [],
11
+ };
12
+ const DEFAULT_CONFIG = (config) => ({
13
+ ...exports.DEFAULT_API_CONFIG,
14
+ ...config,
15
+ sessionTimeout: timing_constants_1.DEFAULT_SESSION_TIMEOUT_MS,
16
+ allowHttp: false,
17
+ });
18
+ exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
@@ -0,0 +1,3 @@
1
+ export declare const HTML_DATA_ATTR_PREFIX = "data-tl";
2
+ export declare const INTERACTIVE_SELECTORS: readonly ["button", "a", "input[type=\"button\"]", "input[type=\"submit\"]", "input[type=\"reset\"]", "input[type=\"checkbox\"]", "input[type=\"radio\"]", "select", "textarea", "[role=\"button\"]", "[role=\"link\"]", "[role=\"tab\"]", "[role=\"menuitem\"]", "[role=\"option\"]", "[role=\"checkbox\"]", "[role=\"radio\"]", "[role=\"switch\"]", "[routerLink]", "[ng-click]", "[data-action]", "[data-click]", "[data-navigate]", "[data-toggle]", "[onclick]", ".btn", ".button", ".clickable", ".nav-link", ".menu-item", "[data-testid]", "[tabindex=\"0\"]"];
3
+ export declare const UTM_PARAMS: string[];
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UTM_PARAMS = exports.INTERACTIVE_SELECTORS = exports.HTML_DATA_ATTR_PREFIX = void 0;
4
+ // Click tracking constants
5
+ exports.HTML_DATA_ATTR_PREFIX = 'data-tl';
6
+ // Interactive element selectors for click tracking
7
+ exports.INTERACTIVE_SELECTORS = [
8
+ 'button',
9
+ 'a',
10
+ 'input[type="button"]',
11
+ 'input[type="submit"]',
12
+ 'input[type="reset"]',
13
+ 'input[type="checkbox"]',
14
+ 'input[type="radio"]',
15
+ 'select',
16
+ 'textarea',
17
+ '[role="button"]',
18
+ '[role="link"]',
19
+ '[role="tab"]',
20
+ '[role="menuitem"]',
21
+ '[role="option"]',
22
+ '[role="checkbox"]',
23
+ '[role="radio"]',
24
+ '[role="switch"]',
25
+ '[routerLink]',
26
+ '[ng-click]',
27
+ '[data-action]',
28
+ '[data-click]',
29
+ '[data-navigate]',
30
+ '[data-toggle]',
31
+ '[onclick]',
32
+ '.btn',
33
+ '.button',
34
+ '.clickable',
35
+ '.nav-link',
36
+ '.menu-item',
37
+ '[data-testid]',
38
+ '[tabindex="0"]',
39
+ ];
40
+ // UTM parameters for tracking
41
+ exports.UTM_PARAMS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
@@ -0,0 +1,8 @@
1
+ export * from './api.constants';
2
+ export * from './browser.constants';
3
+ export * from './initialization.constants';
4
+ export * from './limits.constants';
5
+ export * from './security.constants';
6
+ export * from './storage.constants';
7
+ export * from './timing.constants';
8
+ export * from './validation.constants';
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./api.constants"), exports);
18
+ __exportStar(require("./browser.constants"), exports);
19
+ __exportStar(require("./initialization.constants"), exports);
20
+ __exportStar(require("./limits.constants"), exports);
21
+ __exportStar(require("./security.constants"), exports);
22
+ __exportStar(require("./storage.constants"), exports);
23
+ __exportStar(require("./timing.constants"), exports);
24
+ __exportStar(require("./validation.constants"), exports);
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Constants for initialization and reliability patterns
3
+ * These values control initialization behavior, retry logic, and circuit breaker patterns
4
+ */
5
+ export declare const INITIALIZATION_CONSTANTS: {
6
+ /** Maximum number of retries when waiting for concurrent initialization */
7
+ readonly MAX_CONCURRENT_RETRIES: 20;
8
+ /** Delay between retries when waiting for concurrent initialization (ms) */
9
+ readonly CONCURRENT_RETRY_DELAY_MS: 50;
10
+ /** Timeout for overall initialization process (ms) */
11
+ readonly INITIALIZATION_TIMEOUT_MS: 10000;
12
+ };
13
+ export declare const CIRCUIT_BREAKER_CONSTANTS: {
14
+ /** Maximum number of consecutive failures before opening circuit */
15
+ readonly MAX_FAILURES: 10;
16
+ /** Initial backoff delay when circuit opens (ms) */
17
+ readonly INITIAL_BACKOFF_DELAY_MS: 1000;
18
+ /** Maximum backoff delay (ms) */
19
+ readonly MAX_BACKOFF_DELAY_MS: 30000;
20
+ /** Backoff multiplier for exponential backoff */
21
+ readonly BACKOFF_MULTIPLIER: 2;
22
+ /** Time-based recovery period for circuit breaker (ms) */
23
+ readonly RECOVERY_TIME_MS: 30000;
24
+ };
25
+ export declare const SESSION_SYNC_CONSTANTS: {
26
+ /** Timeout for session synchronization operations (ms) */
27
+ readonly SYNC_TIMEOUT_MS: 2000;
28
+ /** Maximum retry attempts for session operations */
29
+ readonly MAX_RETRY_ATTEMPTS: 3;
30
+ /** Delay before cleanup operations (ms) */
31
+ readonly CLEANUP_DELAY_MS: 100;
32
+ };
33
+ export declare const CROSS_TAB_CONSTANTS: {
34
+ /** Flag to prevent concurrent cross-tab manager initialization */
35
+ readonly INITIALIZATION_LOCK_TIMEOUT_MS: 5000;
36
+ };
37
+ export declare const SCROLL_SUPPRESSION_CONSTANTS: {
38
+ /** Multiplier for scroll debounce time when suppressing scroll events */
39
+ readonly SUPPRESS_MULTIPLIER: 2;
40
+ };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * Constants for initialization and reliability patterns
4
+ * These values control initialization behavior, retry logic, and circuit breaker patterns
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SCROLL_SUPPRESSION_CONSTANTS = exports.CROSS_TAB_CONSTANTS = exports.SESSION_SYNC_CONSTANTS = exports.CIRCUIT_BREAKER_CONSTANTS = exports.INITIALIZATION_CONSTANTS = void 0;
8
+ // Initialization retry constants
9
+ exports.INITIALIZATION_CONSTANTS = {
10
+ /** Maximum number of retries when waiting for concurrent initialization */
11
+ MAX_CONCURRENT_RETRIES: 20,
12
+ /** Delay between retries when waiting for concurrent initialization (ms) */
13
+ CONCURRENT_RETRY_DELAY_MS: 50,
14
+ /** Timeout for overall initialization process (ms) */
15
+ INITIALIZATION_TIMEOUT_MS: 10000,
16
+ };
17
+ // Circuit breaker constants
18
+ exports.CIRCUIT_BREAKER_CONSTANTS = {
19
+ /** Maximum number of consecutive failures before opening circuit */
20
+ MAX_FAILURES: 10,
21
+ /** Initial backoff delay when circuit opens (ms) */
22
+ INITIAL_BACKOFF_DELAY_MS: 1000,
23
+ /** Maximum backoff delay (ms) */
24
+ MAX_BACKOFF_DELAY_MS: 30000,
25
+ /** Backoff multiplier for exponential backoff */
26
+ BACKOFF_MULTIPLIER: 2,
27
+ /** Time-based recovery period for circuit breaker (ms) */
28
+ RECOVERY_TIME_MS: 30000, // 30 seconds
29
+ };
30
+ // Session management constants
31
+ exports.SESSION_SYNC_CONSTANTS = {
32
+ /** Timeout for session synchronization operations (ms) */
33
+ SYNC_TIMEOUT_MS: 2000,
34
+ /** Maximum retry attempts for session operations */
35
+ MAX_RETRY_ATTEMPTS: 3,
36
+ /** Delay before cleanup operations (ms) */
37
+ CLEANUP_DELAY_MS: 100,
38
+ };
39
+ // Cross-tab coordination constants
40
+ exports.CROSS_TAB_CONSTANTS = {
41
+ /** Flag to prevent concurrent cross-tab manager initialization */
42
+ INITIALIZATION_LOCK_TIMEOUT_MS: 5000,
43
+ };
44
+ // Scroll suppression constants
45
+ exports.SCROLL_SUPPRESSION_CONSTANTS = {
46
+ /** Multiplier for scroll debounce time when suppressing scroll events */
47
+ SUPPRESS_MULTIPLIER: 2,
48
+ };
@@ -0,0 +1,25 @@
1
+ export declare const DEFAULT_MOTION_THRESHOLD = 2;
2
+ export declare const SIGNIFICANT_SCROLL_DELTA = 10;
3
+ export declare const DEFAULT_SAMPLING_RATE = 1;
4
+ export declare const MIN_SAMPLING_RATE = 0;
5
+ export declare const MAX_SAMPLING_RATE = 1;
6
+ export declare const BATCH_SIZE_THRESHOLD = 50;
7
+ export declare const MAX_EVENTS_QUEUE_LENGTH = 500;
8
+ export declare const MIN_SESSION_TIMEOUT_MS = 30000;
9
+ export declare const MAX_SESSION_TIMEOUT_MS = 86400000;
10
+ export declare const MAX_CUSTOM_EVENT_NAME_LENGTH = 120;
11
+ export declare const MAX_CUSTOM_EVENT_STRING_SIZE: number;
12
+ export declare const MAX_CUSTOM_EVENT_KEYS = 10;
13
+ export declare const MAX_CUSTOM_EVENT_ARRAY_SIZE = 10;
14
+ export declare const MAX_TEXT_LENGTH = 255;
15
+ export declare const MAX_STRING_LENGTH = 1000;
16
+ export declare const MAX_ARRAY_LENGTH = 100;
17
+ export declare const MAX_OBJECT_DEPTH = 3;
18
+ export declare const PRECISION_TWO_DECIMALS: 2;
19
+ export declare const PRECISION_FOUR_DECIMALS: 4;
20
+ export declare const WEB_VITALS_SAMPLING: 0.75;
21
+ export declare const WEB_VITALS_LONG_TASK_SAMPLING: 0.2;
22
+ export declare const SYNC_XHR_TIMEOUT_MS = 2000;
23
+ export declare const MAX_FINGERPRINTS = 1000;
24
+ export declare const FINGERPRINT_CLEANUP_MULTIPLIER = 10;
25
+ export declare const CLICK_COORDINATE_PRECISION = 10;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLICK_COORDINATE_PRECISION = exports.FINGERPRINT_CLEANUP_MULTIPLIER = exports.MAX_FINGERPRINTS = exports.SYNC_XHR_TIMEOUT_MS = exports.WEB_VITALS_LONG_TASK_SAMPLING = exports.WEB_VITALS_SAMPLING = exports.PRECISION_FOUR_DECIMALS = exports.PRECISION_TWO_DECIMALS = exports.MAX_OBJECT_DEPTH = exports.MAX_ARRAY_LENGTH = exports.MAX_STRING_LENGTH = exports.MAX_TEXT_LENGTH = exports.MAX_CUSTOM_EVENT_ARRAY_SIZE = exports.MAX_CUSTOM_EVENT_KEYS = exports.MAX_CUSTOM_EVENT_STRING_SIZE = exports.MAX_CUSTOM_EVENT_NAME_LENGTH = exports.MAX_SESSION_TIMEOUT_MS = exports.MIN_SESSION_TIMEOUT_MS = exports.MAX_EVENTS_QUEUE_LENGTH = exports.BATCH_SIZE_THRESHOLD = exports.MAX_SAMPLING_RATE = exports.MIN_SAMPLING_RATE = exports.DEFAULT_SAMPLING_RATE = exports.SIGNIFICANT_SCROLL_DELTA = exports.DEFAULT_MOTION_THRESHOLD = void 0;
4
+ // Motion and interaction thresholds
5
+ exports.DEFAULT_MOTION_THRESHOLD = 2;
6
+ exports.SIGNIFICANT_SCROLL_DELTA = 10;
7
+ // Sampling and rate limits
8
+ exports.DEFAULT_SAMPLING_RATE = 1;
9
+ exports.MIN_SAMPLING_RATE = 0;
10
+ exports.MAX_SAMPLING_RATE = 1;
11
+ // Queue and batch limits
12
+ exports.BATCH_SIZE_THRESHOLD = 50;
13
+ exports.MAX_EVENTS_QUEUE_LENGTH = 500;
14
+ // Session timeout validation limits
15
+ exports.MIN_SESSION_TIMEOUT_MS = 30000; // 30 seconds minimum
16
+ exports.MAX_SESSION_TIMEOUT_MS = 86400000; // 24 hours maximum
17
+ // Custom event validation limits
18
+ exports.MAX_CUSTOM_EVENT_NAME_LENGTH = 120;
19
+ exports.MAX_CUSTOM_EVENT_STRING_SIZE = 8 * 1024; // 8KB
20
+ exports.MAX_CUSTOM_EVENT_KEYS = 10;
21
+ exports.MAX_CUSTOM_EVENT_ARRAY_SIZE = 10;
22
+ // Text content limits
23
+ exports.MAX_TEXT_LENGTH = 255; // For click tracking text content
24
+ // Data sanitization limits
25
+ exports.MAX_STRING_LENGTH = 1000;
26
+ exports.MAX_ARRAY_LENGTH = 100;
27
+ exports.MAX_OBJECT_DEPTH = 3;
28
+ // Precision for numeric metrics
29
+ exports.PRECISION_TWO_DECIMALS = 2;
30
+ exports.PRECISION_FOUR_DECIMALS = 4;
31
+ // Web vitals sampling
32
+ exports.WEB_VITALS_SAMPLING = 0.75;
33
+ exports.WEB_VITALS_LONG_TASK_SAMPLING = 0.2;
34
+ // Sync XHR timeout
35
+ exports.SYNC_XHR_TIMEOUT_MS = 2000; // 2 seconds
36
+ // Event fingerprint management
37
+ exports.MAX_FINGERPRINTS = 1000; // Maximum fingerprints stored before cleanup
38
+ exports.FINGERPRINT_CLEANUP_MULTIPLIER = 10; // Cleanup fingerprints older than 10x threshold
39
+ // Click coordinate precision
40
+ exports.CLICK_COORDINATE_PRECISION = 10; // Round click coordinates to nearest 10px
@@ -0,0 +1 @@
1
+ export declare const XSS_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XSS_PATTERNS = void 0;
4
+ // XSS protection patterns
5
+ exports.XSS_PATTERNS = [
6
+ /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
7
+ /javascript:/gi,
8
+ /on\w+\s*=/gi,
9
+ /<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,
10
+ /<embed\b[^>]*>/gi,
11
+ /<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,
12
+ ];
@@ -0,0 +1,9 @@
1
+ export declare const STORAGE_BASE_KEY = "tl";
2
+ export declare const USER_ID_KEY: (id: string) => string;
3
+ export declare const QUEUE_KEY: (id: string) => string;
4
+ export declare const SESSION_STORAGE_KEY: (id: string) => string;
5
+ export declare const CROSS_TAB_SESSION_KEY: (id: string) => string;
6
+ export declare const TAB_INFO_KEY: (id: string) => string;
7
+ export declare const TAB_SPECIFIC_INFO_KEY: (projectId: string, tabId: string) => string;
8
+ export declare const SESSION_RECOVERY_KEY: (id: string) => string;
9
+ export declare const BROADCAST_CHANNEL_NAME: (id: string) => string;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BROADCAST_CHANNEL_NAME = exports.SESSION_RECOVERY_KEY = exports.TAB_SPECIFIC_INFO_KEY = exports.TAB_INFO_KEY = exports.CROSS_TAB_SESSION_KEY = exports.SESSION_STORAGE_KEY = exports.QUEUE_KEY = exports.USER_ID_KEY = exports.STORAGE_BASE_KEY = void 0;
4
+ exports.STORAGE_BASE_KEY = 'tl';
5
+ const USER_ID_KEY = (id) => (id ? `${exports.STORAGE_BASE_KEY}:${id}:uid` : `${exports.STORAGE_BASE_KEY}:uid`);
6
+ exports.USER_ID_KEY = USER_ID_KEY;
7
+ const QUEUE_KEY = (id) => (id ? `${exports.STORAGE_BASE_KEY}:${id}:queue` : `${exports.STORAGE_BASE_KEY}:queue`);
8
+ exports.QUEUE_KEY = QUEUE_KEY;
9
+ const SESSION_STORAGE_KEY = (id) => id ? `${exports.STORAGE_BASE_KEY}:${id}:session` : `${exports.STORAGE_BASE_KEY}:session`;
10
+ exports.SESSION_STORAGE_KEY = SESSION_STORAGE_KEY;
11
+ // Cross-tab session management storage keys
12
+ const CROSS_TAB_SESSION_KEY = (id) => id ? `${exports.STORAGE_BASE_KEY}:${id}:cross_tab_session` : `${exports.STORAGE_BASE_KEY}:cross_tab_session`;
13
+ exports.CROSS_TAB_SESSION_KEY = CROSS_TAB_SESSION_KEY;
14
+ const TAB_INFO_KEY = (id) => id ? `${exports.STORAGE_BASE_KEY}:${id}:tab_info` : `${exports.STORAGE_BASE_KEY}:tab_info`;
15
+ exports.TAB_INFO_KEY = TAB_INFO_KEY;
16
+ const TAB_SPECIFIC_INFO_KEY = (projectId, tabId) => `${exports.STORAGE_BASE_KEY}:${projectId}:tab:${tabId}:info`;
17
+ exports.TAB_SPECIFIC_INFO_KEY = TAB_SPECIFIC_INFO_KEY;
18
+ const SESSION_RECOVERY_KEY = (id) => id ? `${exports.STORAGE_BASE_KEY}:${id}:recovery` : `${exports.STORAGE_BASE_KEY}:recovery`;
19
+ exports.SESSION_RECOVERY_KEY = SESSION_RECOVERY_KEY;
20
+ // BroadcastChannel name for cross-tab communication
21
+ const BROADCAST_CHANNEL_NAME = (id) => id ? `${exports.STORAGE_BASE_KEY}:${id}:broadcast` : `${exports.STORAGE_BASE_KEY}:broadcast`;
22
+ exports.BROADCAST_CHANNEL_NAME = BROADCAST_CHANNEL_NAME;
@@ -0,0 +1,22 @@
1
+ export declare const DEFAULT_SESSION_TIMEOUT_MS: number;
2
+ export declare const SESSION_HEARTBEAT_INTERVAL_MS = 30000;
3
+ export declare const DEFAULT_THROTTLE_DELAY_MS = 1000;
4
+ export declare const SCROLL_DEBOUNCE_TIME_MS = 250;
5
+ export declare const DEFAULT_VISIBILITY_TIMEOUT_MS = 2000;
6
+ export declare const DUPLICATE_EVENT_THRESHOLD_MS = 1000;
7
+ export declare const EVENT_SENT_INTERVAL_MS = 10000;
8
+ export declare const EVENT_SENT_INTERVAL_TEST_MS = 2500;
9
+ export declare const RETRY_BACKOFF_INITIAL = 1000;
10
+ export declare const RETRY_BACKOFF_MAX = 30000;
11
+ export declare const RATE_LIMIT_INTERVAL = 1000;
12
+ export declare const EVENT_EXPIRY_HOURS = 24;
13
+ export declare const EVENT_PERSISTENCE_MAX_AGE_MS: number;
14
+ export declare const LONG_TASK_THROTTLE_MS = 1000;
15
+ export declare const SESSION_END_PRIORITY_DELAY_MS = 100;
16
+ export declare const TAB_HEARTBEAT_INTERVAL_MS = 5000;
17
+ export declare const TAB_ELECTION_TIMEOUT_MS = 2000;
18
+ export declare const TAB_CLEANUP_DELAY_MS = 1000;
19
+ export declare const SESSION_RECOVERY_WINDOW_MULTIPLIER = 2;
20
+ export declare const MAX_SESSION_RECOVERY_ATTEMPTS = 3;
21
+ export declare const MAX_SESSION_RECOVERY_WINDOW_MS: number;
22
+ export declare const MIN_SESSION_RECOVERY_WINDOW_MS: number;