@tracelog/lib 0.0.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/README.md +58 -24
  2. package/dist/browser/tracelog.js +1934 -3226
  3. package/dist/cjs/api.d.ts +33 -19
  4. package/dist/cjs/api.js +111 -156
  5. package/dist/cjs/app.constants.d.ts +80 -1
  6. package/dist/cjs/app.constants.js +90 -3
  7. package/dist/cjs/app.d.ts +29 -44
  8. package/dist/cjs/app.js +114 -212
  9. package/dist/cjs/app.types.d.ts +2 -7
  10. package/dist/cjs/app.types.js +10 -21
  11. package/dist/cjs/constants/api.constants.js +11 -5
  12. package/dist/cjs/constants/config.constants.d.ts +75 -0
  13. package/dist/cjs/constants/config.constants.js +178 -0
  14. package/dist/cjs/constants/error.constants.d.ts +29 -0
  15. package/dist/cjs/constants/error.constants.js +50 -0
  16. package/dist/cjs/constants/index.d.ts +3 -6
  17. package/dist/cjs/constants/index.js +3 -6
  18. package/dist/cjs/constants/performance.constants.d.ts +28 -0
  19. package/dist/cjs/constants/performance.constants.js +43 -0
  20. package/dist/cjs/handlers/click.handler.d.ts +1 -0
  21. package/dist/cjs/handlers/click.handler.js +30 -49
  22. package/dist/cjs/handlers/error.handler.d.ts +11 -6
  23. package/dist/cjs/handlers/error.handler.js +91 -51
  24. package/dist/cjs/handlers/page-view.handler.js +38 -29
  25. package/dist/cjs/handlers/performance.handler.d.ts +3 -0
  26. package/dist/cjs/handlers/performance.handler.js +76 -37
  27. package/dist/cjs/handlers/scroll.handler.d.ts +15 -0
  28. package/dist/cjs/handlers/scroll.handler.js +105 -31
  29. package/dist/cjs/handlers/session.handler.d.ts +6 -20
  30. package/dist/cjs/handlers/session.handler.js +38 -326
  31. package/dist/cjs/integrations/google-analytics.integration.d.ts +0 -1
  32. package/dist/cjs/integrations/google-analytics.integration.js +27 -98
  33. package/dist/cjs/listeners/input-listener-managers.d.ts +18 -9
  34. package/dist/cjs/listeners/input-listener-managers.js +24 -33
  35. package/dist/cjs/listeners/touch-listener-manager.d.ts +1 -3
  36. package/dist/cjs/listeners/touch-listener-manager.js +1 -23
  37. package/dist/cjs/listeners/visibility-listener-manager.d.ts +1 -4
  38. package/dist/cjs/listeners/visibility-listener-manager.js +6 -42
  39. package/dist/cjs/managers/api.manager.d.ts +13 -3
  40. package/dist/cjs/managers/api.manager.js +35 -5
  41. package/dist/cjs/managers/config.manager.d.ts +53 -3
  42. package/dist/cjs/managers/config.manager.js +131 -62
  43. package/dist/cjs/managers/event.manager.d.ts +57 -36
  44. package/dist/cjs/managers/event.manager.js +266 -417
  45. package/dist/cjs/managers/sender.manager.d.ts +40 -22
  46. package/dist/cjs/managers/sender.manager.js +200 -198
  47. package/dist/cjs/managers/session.manager.d.ts +80 -66
  48. package/dist/cjs/managers/session.manager.js +267 -522
  49. package/dist/cjs/managers/state.manager.d.ts +33 -0
  50. package/dist/cjs/managers/state.manager.js +79 -6
  51. package/dist/cjs/managers/storage.manager.d.ts +26 -2
  52. package/dist/cjs/managers/storage.manager.js +67 -34
  53. package/dist/cjs/managers/tags.manager.d.ts +31 -7
  54. package/dist/cjs/managers/tags.manager.js +123 -241
  55. package/dist/cjs/managers/user.manager.d.ts +14 -5
  56. package/dist/cjs/managers/user.manager.js +17 -9
  57. package/dist/cjs/public-api.d.ts +10 -1
  58. package/dist/cjs/public-api.js +18 -24
  59. package/dist/cjs/test-bridge.d.ts +48 -0
  60. package/dist/cjs/test-bridge.js +110 -0
  61. package/dist/cjs/types/api.types.d.ts +21 -6
  62. package/dist/cjs/types/api.types.js +21 -6
  63. package/dist/cjs/types/config.types.d.ts +22 -84
  64. package/dist/cjs/types/emitter.types.d.ts +11 -0
  65. package/dist/cjs/types/emitter.types.js +8 -0
  66. package/dist/cjs/types/event.types.d.ts +8 -11
  67. package/dist/cjs/types/index.d.ts +3 -1
  68. package/dist/cjs/types/index.js +3 -1
  69. package/dist/cjs/types/queue.types.d.ts +1 -0
  70. package/dist/cjs/types/session.types.d.ts +0 -64
  71. package/dist/cjs/types/state.types.d.ts +1 -0
  72. package/dist/cjs/types/test-bridge.types.d.ts +38 -0
  73. package/dist/cjs/types/validation-error.types.d.ts +7 -0
  74. package/dist/cjs/types/validation-error.types.js +11 -1
  75. package/dist/cjs/types/window.types.d.ts +1 -8
  76. package/dist/cjs/utils/data/uuid.utils.d.ts +1 -1
  77. package/dist/cjs/utils/data/uuid.utils.js +7 -5
  78. package/dist/cjs/utils/emitter.utils.d.ts +8 -0
  79. package/dist/cjs/utils/emitter.utils.js +33 -0
  80. package/dist/cjs/utils/index.d.ts +1 -0
  81. package/dist/cjs/utils/index.js +1 -0
  82. package/dist/cjs/utils/logging/debug-logger.utils.d.ts +10 -51
  83. package/dist/cjs/utils/logging/debug-logger.utils.js +36 -127
  84. package/dist/cjs/utils/network/fetch-with-timeout.utils.d.ts +4 -0
  85. package/dist/cjs/utils/network/fetch-with-timeout.utils.js +25 -0
  86. package/dist/cjs/utils/network/index.d.ts +1 -0
  87. package/dist/cjs/utils/network/index.js +1 -0
  88. package/dist/cjs/utils/network/url.utils.js +2 -42
  89. package/dist/cjs/utils/security/sanitize.utils.d.ts +1 -8
  90. package/dist/cjs/utils/security/sanitize.utils.js +7 -41
  91. package/dist/cjs/utils/validations/config-validations.utils.d.ts +7 -0
  92. package/dist/cjs/utils/validations/config-validations.utils.js +77 -22
  93. package/dist/esm/api.d.ts +33 -19
  94. package/dist/esm/api.js +105 -118
  95. package/dist/esm/app.constants.d.ts +80 -1
  96. package/dist/esm/app.constants.js +89 -1
  97. package/dist/esm/app.d.ts +29 -44
  98. package/dist/esm/app.js +115 -213
  99. package/dist/esm/app.types.d.ts +2 -7
  100. package/dist/esm/app.types.js +1 -7
  101. package/dist/esm/constants/api.constants.js +10 -4
  102. package/dist/esm/constants/config.constants.d.ts +75 -0
  103. package/dist/esm/constants/config.constants.js +174 -0
  104. package/dist/esm/constants/error.constants.d.ts +29 -0
  105. package/dist/esm/constants/error.constants.js +47 -0
  106. package/dist/esm/constants/index.d.ts +3 -6
  107. package/dist/esm/constants/index.js +3 -6
  108. package/dist/esm/constants/performance.constants.d.ts +28 -0
  109. package/dist/esm/constants/performance.constants.js +40 -0
  110. package/dist/esm/handlers/click.handler.d.ts +1 -0
  111. package/dist/esm/handlers/click.handler.js +30 -49
  112. package/dist/esm/handlers/error.handler.d.ts +11 -6
  113. package/dist/esm/handlers/error.handler.js +91 -51
  114. package/dist/esm/handlers/page-view.handler.js +38 -29
  115. package/dist/esm/handlers/performance.handler.d.ts +3 -0
  116. package/dist/esm/handlers/performance.handler.js +71 -32
  117. package/dist/esm/handlers/scroll.handler.d.ts +15 -0
  118. package/dist/esm/handlers/scroll.handler.js +106 -32
  119. package/dist/esm/handlers/session.handler.d.ts +6 -20
  120. package/dist/esm/handlers/session.handler.js +38 -326
  121. package/dist/esm/integrations/google-analytics.integration.d.ts +0 -1
  122. package/dist/esm/integrations/google-analytics.integration.js +27 -98
  123. package/dist/esm/listeners/input-listener-managers.d.ts +18 -9
  124. package/dist/esm/listeners/input-listener-managers.js +23 -32
  125. package/dist/esm/listeners/touch-listener-manager.d.ts +1 -3
  126. package/dist/esm/listeners/touch-listener-manager.js +1 -23
  127. package/dist/esm/listeners/visibility-listener-manager.d.ts +1 -4
  128. package/dist/esm/listeners/visibility-listener-manager.js +6 -42
  129. package/dist/esm/managers/api.manager.d.ts +13 -3
  130. package/dist/esm/managers/api.manager.js +34 -3
  131. package/dist/esm/managers/config.manager.d.ts +53 -3
  132. package/dist/esm/managers/config.manager.js +133 -64
  133. package/dist/esm/managers/event.manager.d.ts +57 -36
  134. package/dist/esm/managers/event.manager.js +268 -419
  135. package/dist/esm/managers/sender.manager.d.ts +40 -22
  136. package/dist/esm/managers/sender.manager.js +201 -199
  137. package/dist/esm/managers/session.manager.d.ts +80 -66
  138. package/dist/esm/managers/session.manager.js +269 -524
  139. package/dist/esm/managers/state.manager.d.ts +33 -0
  140. package/dist/esm/managers/state.manager.js +78 -6
  141. package/dist/esm/managers/storage.manager.d.ts +26 -2
  142. package/dist/esm/managers/storage.manager.js +66 -33
  143. package/dist/esm/managers/tags.manager.d.ts +31 -7
  144. package/dist/esm/managers/tags.manager.js +124 -242
  145. package/dist/esm/managers/user.manager.d.ts +14 -5
  146. package/dist/esm/managers/user.manager.js +17 -9
  147. package/dist/esm/public-api.d.ts +10 -1
  148. package/dist/esm/public-api.js +14 -1
  149. package/dist/esm/test-bridge.d.ts +48 -0
  150. package/dist/esm/test-bridge.js +106 -0
  151. package/dist/esm/types/api.types.d.ts +21 -6
  152. package/dist/esm/types/api.types.js +21 -6
  153. package/dist/esm/types/config.types.d.ts +22 -84
  154. package/dist/esm/types/emitter.types.d.ts +11 -0
  155. package/dist/esm/types/emitter.types.js +5 -0
  156. package/dist/esm/types/event.types.d.ts +8 -11
  157. package/dist/esm/types/index.d.ts +3 -1
  158. package/dist/esm/types/index.js +3 -1
  159. package/dist/esm/types/queue.types.d.ts +1 -0
  160. package/dist/esm/types/session.types.d.ts +0 -64
  161. package/dist/esm/types/state.types.d.ts +1 -0
  162. package/dist/esm/types/test-bridge.types.d.ts +38 -0
  163. package/dist/esm/types/validation-error.types.d.ts +7 -0
  164. package/dist/esm/types/validation-error.types.js +9 -0
  165. package/dist/esm/types/window.types.d.ts +1 -8
  166. package/dist/esm/utils/data/uuid.utils.d.ts +1 -1
  167. package/dist/esm/utils/data/uuid.utils.js +7 -5
  168. package/dist/esm/utils/emitter.utils.d.ts +8 -0
  169. package/dist/esm/utils/emitter.utils.js +29 -0
  170. package/dist/esm/utils/index.d.ts +1 -0
  171. package/dist/esm/utils/index.js +1 -0
  172. package/dist/esm/utils/logging/debug-logger.utils.d.ts +10 -51
  173. package/dist/esm/utils/logging/debug-logger.utils.js +36 -127
  174. package/dist/esm/utils/network/fetch-with-timeout.utils.d.ts +4 -0
  175. package/dist/esm/utils/network/fetch-with-timeout.utils.js +22 -0
  176. package/dist/esm/utils/network/index.d.ts +1 -0
  177. package/dist/esm/utils/network/index.js +1 -0
  178. package/dist/esm/utils/network/url.utils.js +2 -42
  179. package/dist/esm/utils/security/sanitize.utils.d.ts +1 -8
  180. package/dist/esm/utils/security/sanitize.utils.js +6 -39
  181. package/dist/esm/utils/validations/config-validations.utils.d.ts +7 -0
  182. package/dist/esm/utils/validations/config-validations.utils.js +76 -22
  183. package/package.json +23 -16
  184. package/dist/browser/web-vitals-CCnqwnC8.mjs +0 -198
  185. package/dist/cjs/constants/browser.constants.d.ts +0 -3
  186. package/dist/cjs/constants/browser.constants.js +0 -41
  187. package/dist/cjs/constants/initialization.constants.d.ts +0 -40
  188. package/dist/cjs/constants/initialization.constants.js +0 -48
  189. package/dist/cjs/constants/limits.constants.d.ts +0 -25
  190. package/dist/cjs/constants/limits.constants.js +0 -40
  191. package/dist/cjs/constants/security.constants.d.ts +0 -1
  192. package/dist/cjs/constants/security.constants.js +0 -12
  193. package/dist/cjs/constants/timing.constants.d.ts +0 -22
  194. package/dist/cjs/constants/timing.constants.js +0 -34
  195. package/dist/cjs/constants/validation.constants.d.ts +0 -13
  196. package/dist/cjs/constants/validation.constants.js +0 -31
  197. package/dist/cjs/handlers/network.handler.d.ts +0 -16
  198. package/dist/cjs/handlers/network.handler.js +0 -136
  199. package/dist/cjs/managers/cross-tab-session.manager.d.ts +0 -170
  200. package/dist/cjs/managers/cross-tab-session.manager.js +0 -730
  201. package/dist/cjs/managers/sampling.manager.d.ts +0 -8
  202. package/dist/cjs/managers/sampling.manager.js +0 -53
  203. package/dist/cjs/managers/session-recovery.manager.d.ts +0 -65
  204. package/dist/cjs/managers/session-recovery.manager.js +0 -237
  205. package/dist/cjs/types/web-vitals.types.d.ts +0 -6
  206. package/dist/esm/constants/browser.constants.d.ts +0 -3
  207. package/dist/esm/constants/browser.constants.js +0 -38
  208. package/dist/esm/constants/initialization.constants.d.ts +0 -40
  209. package/dist/esm/constants/initialization.constants.js +0 -45
  210. package/dist/esm/constants/limits.constants.d.ts +0 -25
  211. package/dist/esm/constants/limits.constants.js +0 -37
  212. package/dist/esm/constants/security.constants.d.ts +0 -1
  213. package/dist/esm/constants/security.constants.js +0 -9
  214. package/dist/esm/constants/timing.constants.d.ts +0 -22
  215. package/dist/esm/constants/timing.constants.js +0 -31
  216. package/dist/esm/constants/validation.constants.d.ts +0 -13
  217. package/dist/esm/constants/validation.constants.js +0 -28
  218. package/dist/esm/handlers/network.handler.d.ts +0 -16
  219. package/dist/esm/handlers/network.handler.js +0 -132
  220. package/dist/esm/managers/cross-tab-session.manager.d.ts +0 -170
  221. package/dist/esm/managers/cross-tab-session.manager.js +0 -726
  222. package/dist/esm/managers/sampling.manager.d.ts +0 -8
  223. package/dist/esm/managers/sampling.manager.js +0 -49
  224. package/dist/esm/managers/session-recovery.manager.d.ts +0 -65
  225. package/dist/esm/managers/session-recovery.manager.js +0 -233
  226. package/dist/esm/types/web-vitals.types.d.ts +0 -6
  227. /package/dist/cjs/types/{web-vitals.types.js → test-bridge.types.js} +0 -0
  228. /package/dist/esm/types/{web-vitals.types.js → test-bridge.types.js} +0 -0
@@ -1,28 +0,0 @@
1
- import { MIN_SESSION_TIMEOUT_MS, MAX_SESSION_TIMEOUT_MS, MIN_SAMPLING_RATE, MAX_SAMPLING_RATE, } from './limits.constants';
2
- // Allowed API config keys for runtime validation
3
- export const ALLOWED_API_CONFIG_KEYS = new Set([
4
- 'mode',
5
- 'tags',
6
- 'samplingRate',
7
- 'excludedUrlPaths',
8
- 'ipExcluded',
9
- ]);
10
- // Validation error messages - standardized across all layers
11
- export const VALIDATION_MESSAGES = {
12
- // Project ID validation - consistent message across all layers
13
- MISSING_PROJECT_ID: 'Project ID is required',
14
- PROJECT_ID_EMPTY_AFTER_TRIM: 'Project ID is required',
15
- // Session timeout validation
16
- INVALID_SESSION_TIMEOUT: `Session timeout must be between ${MIN_SESSION_TIMEOUT_MS}ms (30 seconds) and ${MAX_SESSION_TIMEOUT_MS}ms (24 hours)`,
17
- // Sampling rate validation
18
- INVALID_SAMPLING_RATE: `Sampling rate must be between ${MIN_SAMPLING_RATE} and ${MAX_SAMPLING_RATE}`,
19
- INVALID_ERROR_SAMPLING_RATE: 'Error sampling must be between 0 and 1',
20
- // Integration validation
21
- INVALID_GOOGLE_ANALYTICS_ID: 'Google Analytics measurement ID is required when integration is enabled',
22
- // UI validation
23
- INVALID_SCROLL_CONTAINER_SELECTORS: 'Scroll container selectors must be valid CSS selectors',
24
- // Global metadata validation
25
- INVALID_GLOBAL_METADATA: 'Global metadata must be an object',
26
- // Array validation
27
- INVALID_SENSITIVE_QUERY_PARAMS: 'Sensitive query params must be an array of strings',
28
- };
@@ -1,16 +0,0 @@
1
- import { EventManager } from '../managers/event.manager';
2
- import { StateManager } from '../managers/state.manager';
3
- export declare class NetworkHandler extends StateManager {
4
- private readonly eventManager;
5
- private readonly originalFetch;
6
- private readonly originalXHROpen;
7
- private readonly originalXHRSend;
8
- constructor(eventManager: EventManager);
9
- startTracking(): void;
10
- stopTracking(): void;
11
- private interceptFetch;
12
- private interceptXHR;
13
- private trackNetworkError;
14
- private normalizeUrlForTracking;
15
- private shouldSample;
16
- }
@@ -1,132 +0,0 @@
1
- import { StateManager } from '../managers/state.manager';
2
- import { ErrorType, EventType } from '../types';
3
- import { normalizeUrl } from '../utils';
4
- import { debugLog } from '../utils/logging';
5
- export class NetworkHandler extends StateManager {
6
- constructor(eventManager) {
7
- super();
8
- this.eventManager = eventManager;
9
- this.originalFetch = window.fetch;
10
- this.originalXHROpen = XMLHttpRequest.prototype.open;
11
- this.originalXHRSend = XMLHttpRequest.prototype.send;
12
- }
13
- startTracking() {
14
- debugLog.debug('NetworkHandler', 'Starting network error tracking');
15
- this.interceptFetch();
16
- this.interceptXHR();
17
- }
18
- stopTracking() {
19
- debugLog.debug('NetworkHandler', 'Stopping network error tracking');
20
- window.fetch = this.originalFetch;
21
- XMLHttpRequest.prototype.open = this.originalXHROpen;
22
- XMLHttpRequest.prototype.send = this.originalXHRSend;
23
- }
24
- interceptFetch() {
25
- window.fetch = async (input, init) => {
26
- const startTime = Date.now();
27
- const url = typeof input === 'string' ? input : input.toString();
28
- const method = init?.method ?? 'GET';
29
- try {
30
- const response = await this.originalFetch(input, init);
31
- const duration = Date.now() - startTime;
32
- if (!response.ok) {
33
- debugLog.debug('NetworkHandler', 'Fetch error detected', {
34
- method,
35
- url: this.normalizeUrlForTracking(url),
36
- status: response.status,
37
- statusText: response.statusText,
38
- });
39
- this.trackNetworkError(method.toUpperCase(), this.normalizeUrlForTracking(url), response.status, response.statusText, duration);
40
- }
41
- return response;
42
- }
43
- catch (error) {
44
- const duration = Date.now() - startTime;
45
- const errorMessage = error instanceof Error ? error.message : 'Network Error';
46
- debugLog.debug('NetworkHandler', 'Fetch exception caught', {
47
- method,
48
- url: this.normalizeUrlForTracking(url),
49
- error: errorMessage,
50
- });
51
- this.trackNetworkError(method.toUpperCase(), this.normalizeUrlForTracking(url), undefined, errorMessage, duration);
52
- throw error;
53
- }
54
- };
55
- }
56
- interceptXHR() {
57
- const trackNetworkError = this.trackNetworkError.bind(this);
58
- const normalizeUrlForTracking = this.normalizeUrlForTracking.bind(this);
59
- const originalXHROpen = this.originalXHROpen;
60
- const originalXHRSend = this.originalXHRSend;
61
- XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
62
- const asyncMode = async ?? true;
63
- const extendedThis = this;
64
- extendedThis._tracelogStartTime = Date.now();
65
- extendedThis._tracelogMethod = method.toUpperCase();
66
- extendedThis._tracelogUrl = url.toString();
67
- return originalXHROpen.call(this, method, url, asyncMode, user, password);
68
- };
69
- XMLHttpRequest.prototype.send = function (body) {
70
- const xhr = this;
71
- const startTime = xhr._tracelogStartTime ?? Date.now();
72
- const method = xhr._tracelogMethod ?? 'GET';
73
- const url = xhr._tracelogUrl ?? '';
74
- const originalOnReadyStateChange = xhr.onreadystatechange;
75
- xhr.onreadystatechange = (ev) => {
76
- if (xhr.readyState === XMLHttpRequest.DONE) {
77
- const duration = Date.now() - startTime;
78
- if (xhr.status === 0 || xhr.status >= 400) {
79
- const statusText = xhr.statusText || 'Request Failed';
80
- debugLog.debug('NetworkHandler', 'XHR error detected', {
81
- method,
82
- url: normalizeUrlForTracking(url),
83
- status: xhr.status,
84
- statusText,
85
- });
86
- trackNetworkError(method, normalizeUrlForTracking(url), xhr.status, statusText, duration);
87
- }
88
- }
89
- if (originalOnReadyStateChange) {
90
- return originalOnReadyStateChange.call(xhr, ev);
91
- }
92
- };
93
- return originalXHRSend.call(this, body);
94
- };
95
- }
96
- trackNetworkError(method, url, status, statusText, duration) {
97
- const config = this.get('config');
98
- if (!this.shouldSample(config?.errorSampling ?? 0.1)) {
99
- debugLog.debug('NetworkHandler', `Network error not sampled, skipping (errorSampling: ${config?.errorSampling}, method: ${method}, url: ${url})`, {
100
- errorSampling: config?.errorSampling,
101
- method,
102
- url,
103
- });
104
- return;
105
- }
106
- debugLog.warn('NetworkHandler', `Network error tracked: ${method} ${url} (status: ${status}, statusText: ${statusText}, duration: ${duration}ms)`, { method, url, status, statusText, duration });
107
- this.eventManager.track({
108
- type: EventType.ERROR,
109
- error_data: {
110
- type: ErrorType.NETWORK_ERROR,
111
- message: statusText,
112
- method,
113
- url,
114
- status,
115
- statusText,
116
- duration,
117
- },
118
- });
119
- }
120
- normalizeUrlForTracking(url) {
121
- try {
122
- const config = this.get('config');
123
- return normalizeUrl(url, config?.sensitiveQueryParams);
124
- }
125
- catch {
126
- return url;
127
- }
128
- }
129
- shouldSample(rate) {
130
- return Math.random() < rate;
131
- }
132
- }
@@ -1,170 +0,0 @@
1
- import { CrossTabSessionConfig, SessionEndReason } from '../types/session.types';
2
- import { StateManager } from './state.manager';
3
- import { StorageManager } from './storage.manager';
4
- export declare class CrossTabSessionManager extends StateManager {
5
- private readonly callbacks?;
6
- private readonly config;
7
- private readonly storageManager;
8
- private readonly broadcastChannel;
9
- private readonly tabId;
10
- private readonly tabInfo;
11
- private readonly projectId;
12
- private leaderTabId;
13
- private isTabLeader;
14
- private heartbeatInterval;
15
- private electionTimeout;
16
- private cleanupTimeout;
17
- private sessionEnded;
18
- private fallbackLeadershipTimeout;
19
- private electionDelayTimeout;
20
- private tabInfoCleanupTimeout;
21
- private closingAnnouncementTimeout;
22
- private leaderHealthCheckInterval;
23
- private lastHeartbeatSent;
24
- constructor(storageManager: StorageManager, projectId: string, config?: Partial<CrossTabSessionConfig>, callbacks?: {
25
- onSessionStart?: (sessionId: string) => void;
26
- onSessionEnd?: (reason: SessionEndReason) => void;
27
- onTabActivity?: () => void;
28
- onCrossTabConflict?: () => void;
29
- } | undefined);
30
- /**
31
- * Initialize BroadcastChannel if supported
32
- */
33
- private initializeBroadcastChannel;
34
- /**
35
- * Initialize the cross-tab session manager
36
- */
37
- private initialize;
38
- /**
39
- * Check if this tab should be the session leader
40
- */
41
- private tryJoinExistingSession;
42
- /**
43
- * Request leadership status from other tabs
44
- */
45
- private requestLeadershipStatus;
46
- /**
47
- * Start leader election process with debouncing to prevent excessive elections
48
- */
49
- private startLeaderElection;
50
- /**
51
- * Become the session leader
52
- */
53
- private becomeLeader;
54
- /**
55
- * Announce session start to other tabs
56
- */
57
- private announceSessionStart;
58
- /**
59
- * Announce leadership to other tabs
60
- */
61
- private announceLeadership;
62
- /**
63
- * Setup fallback mechanism to ensure a leader is always elected
64
- */
65
- private setupLeadershipFallback;
66
- /**
67
- * Setup BroadcastChannel event listeners
68
- */
69
- private setupBroadcastListeners;
70
- /**
71
- * Handle cross-tab messages
72
- */
73
- private handleCrossTabMessage;
74
- /**
75
- * Handle heartbeat message from another tab
76
- */
77
- private handleHeartbeatMessage;
78
- /**
79
- * Handle session start message from another tab
80
- */
81
- private handleSessionStartMessage;
82
- /**
83
- * Handle session end message from another tab
84
- */
85
- private handleSessionEndMessage;
86
- /**
87
- * Handle tab closing message from another tab
88
- */
89
- private handleTabClosingMessage;
90
- /**
91
- * Handle election request from another tab
92
- */
93
- private handleElectionRequest;
94
- /**
95
- * Handle election response from another tab
96
- */
97
- private handleElectionResponse;
98
- /**
99
- * Start heartbeat to keep session active
100
- */
101
- private startHeartbeat;
102
- /**
103
- * Send heartbeat to other tabs with rate limiting to prevent flooding
104
- */
105
- private sendHeartbeat;
106
- /**
107
- * Update tab info with current timestamp
108
- */
109
- private updateTabInfo;
110
- /**
111
- * End session and notify other tabs
112
- */
113
- endSession(reason: SessionEndReason): void;
114
- /**
115
- * Announce tab is closing to other tabs
116
- */
117
- private announceTabClosing;
118
- /**
119
- * Announce session end to other tabs
120
- */
121
- private announceSessionEnd;
122
- /**
123
- * Get current session ID
124
- */
125
- getSessionId(): string;
126
- /**
127
- * Get current tab ID
128
- */
129
- getTabId(): string;
130
- /**
131
- * Check if this tab is the session leader
132
- */
133
- isLeader(): boolean;
134
- /**
135
- * Get current session context from storage
136
- */
137
- private getStoredSessionContext;
138
- /**
139
- * Store session context to localStorage
140
- */
141
- private storeSessionContext;
142
- /**
143
- * Clear stored session context
144
- */
145
- private clearStoredSessionContext;
146
- /**
147
- * Store tab info to localStorage
148
- */
149
- private storeTabInfo;
150
- /**
151
- * Clear tab info from localStorage
152
- */
153
- private clearTabInfo;
154
- /**
155
- * Check if BroadcastChannel is supported
156
- */
157
- private isBroadcastChannelSupported;
158
- /**
159
- * Get session timeout considering cross-tab activity
160
- */
161
- getEffectiveSessionTimeout(): number;
162
- /**
163
- * Update session activity from any tab
164
- */
165
- updateSessionActivity(): void;
166
- /**
167
- * Cleanup resources
168
- */
169
- destroy(): void;
170
- }