@grafana/faro-web-sdk 2.3.0 → 2.4.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 (130) hide show
  1. package/dist/bundle/faro-web-sdk.iife.js +1 -1
  2. package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
  3. package/dist/bundle/types/instrumentations/csp/instrumentation.d.ts +1 -1
  4. package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
  5. package/dist/bundle/types/instrumentations/navigation/instrumentation.d.ts +1 -1
  6. package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
  7. package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
  8. package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
  9. package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
  10. package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  11. package/dist/bundle/types/transports/console/transport.d.ts +1 -1
  12. package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
  13. package/dist/cjs/config/getWebInstrumentations.js +3 -4
  14. package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
  15. package/dist/cjs/config/makeCoreConfig.js +48 -60
  16. package/dist/cjs/config/makeCoreConfig.js.map +1 -1
  17. package/dist/cjs/initialize.js +3 -3
  18. package/dist/cjs/initialize.js.map +1 -1
  19. package/dist/cjs/instrumentations/_internal/activityWindowTracker.js +44 -65
  20. package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -1
  21. package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +11 -17
  22. package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
  23. package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js +5 -5
  24. package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -1
  25. package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js +28 -30
  26. package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -1
  27. package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js +7 -7
  28. package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -1
  29. package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js +8 -8
  30. package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -1
  31. package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js +24 -32
  32. package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -1
  33. package/dist/cjs/instrumentations/console/instrumentation.js +29 -49
  34. package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
  35. package/dist/cjs/instrumentations/csp/instrumentation.js +14 -32
  36. package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -1
  37. package/dist/cjs/instrumentations/errors/getErrorDetails.js +23 -23
  38. package/dist/cjs/instrumentations/errors/getErrorDetails.js.map +1 -1
  39. package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js +5 -5
  40. package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js.map +1 -1
  41. package/dist/cjs/instrumentations/errors/instrumentation.js +11 -29
  42. package/dist/cjs/instrumentations/errors/instrumentation.js.map +1 -1
  43. package/dist/cjs/instrumentations/errors/registerOnerror.js +6 -10
  44. package/dist/cjs/instrumentations/errors/registerOnerror.js.map +1 -1
  45. package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +16 -17
  46. package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
  47. package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js +2 -2
  48. package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
  49. package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js +4 -4
  50. package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
  51. package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js +16 -17
  52. package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
  53. package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js +1 -1
  54. package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js.map +1 -1
  55. package/dist/cjs/instrumentations/navigation/instrumentation.js +27 -45
  56. package/dist/cjs/instrumentations/navigation/instrumentation.js.map +1 -1
  57. package/dist/cjs/instrumentations/performance/instrumentation.js +19 -74
  58. package/dist/cjs/instrumentations/performance/instrumentation.js.map +1 -1
  59. package/dist/cjs/instrumentations/performance/navigation.js +15 -26
  60. package/dist/cjs/instrumentations/performance/navigation.js.map +1 -1
  61. package/dist/cjs/instrumentations/performance/performanceUtils.js +18 -33
  62. package/dist/cjs/instrumentations/performance/performanceUtils.js.map +1 -1
  63. package/dist/cjs/instrumentations/performance/resource.js +13 -25
  64. package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
  65. package/dist/cjs/instrumentations/session/instrumentation.js +45 -74
  66. package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
  67. package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js +21 -24
  68. package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
  69. package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js +21 -24
  70. package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
  71. package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js +2 -2
  72. package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js.map +1 -1
  73. package/dist/cjs/instrumentations/session/sessionManager/sampling.js +5 -5
  74. package/dist/cjs/instrumentations/session/sessionManager/sampling.js.map +1 -1
  75. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +64 -61
  76. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
  77. package/dist/cjs/instrumentations/userActions/instrumentation.js +15 -34
  78. package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
  79. package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +11 -11
  80. package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
  81. package/dist/cjs/instrumentations/userActions/userActionController.js +49 -53
  82. package/dist/cjs/instrumentations/userActions/userActionController.js.map +1 -1
  83. package/dist/cjs/instrumentations/userActions/util.js +4 -4
  84. package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
  85. package/dist/cjs/instrumentations/view/instrumentation.js +12 -30
  86. package/dist/cjs/instrumentations/view/instrumentation.js.map +1 -1
  87. package/dist/cjs/instrumentations/webVitals/instrumentation.js +11 -29
  88. package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
  89. package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js +87 -94
  90. package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
  91. package/dist/cjs/metas/browser/meta.js +14 -14
  92. package/dist/cjs/metas/browser/meta.js.map +1 -1
  93. package/dist/cjs/metas/k6/meta.js +3 -14
  94. package/dist/cjs/metas/k6/meta.js.map +1 -1
  95. package/dist/cjs/metas/page/meta.js +7 -19
  96. package/dist/cjs/metas/page/meta.js.map +1 -1
  97. package/dist/cjs/metas/sdk/meta.js +3 -3
  98. package/dist/cjs/metas/sdk/meta.js.map +1 -1
  99. package/dist/cjs/metas/session/createSession.js +2 -2
  100. package/dist/cjs/metas/session/createSession.js.map +1 -1
  101. package/dist/cjs/transports/console/transport.js +10 -29
  102. package/dist/cjs/transports/console/transport.js.map +1 -1
  103. package/dist/cjs/transports/fetch/transport.js +82 -176
  104. package/dist/cjs/transports/fetch/transport.js.map +1 -1
  105. package/dist/cjs/utils/throttle.js +6 -10
  106. package/dist/cjs/utils/throttle.js.map +1 -1
  107. package/dist/cjs/utils/url.js +4 -5
  108. package/dist/cjs/utils/url.js.map +1 -1
  109. package/dist/cjs/utils/webStorage.js +4 -4
  110. package/dist/cjs/utils/webStorage.js.map +1 -1
  111. package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js +0 -1
  112. package/dist/esm/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
  113. package/dist/esm/instrumentations/errors/getErrorDetails.js +1 -0
  114. package/dist/esm/instrumentations/errors/getErrorDetails.js.map +1 -1
  115. package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js +22 -2
  116. package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
  117. package/dist/esm/transports/fetch/transport.js +1 -1
  118. package/dist/esm/transports/fetch/transport.js.map +1 -1
  119. package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
  120. package/dist/types/instrumentations/csp/instrumentation.d.ts +1 -1
  121. package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
  122. package/dist/types/instrumentations/navigation/instrumentation.d.ts +1 -1
  123. package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
  124. package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
  125. package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
  126. package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
  127. package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  128. package/dist/types/transports/console/transport.d.ts +1 -1
  129. package/dist/types/transports/fetch/transport.d.ts +1 -1
  130. package/package.json +9 -6
@@ -1,35 +1,23 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
2
  Object.defineProperty(exports, "__esModule", { value: true });
14
3
  exports.createUserSessionObject = createUserSessionObject;
15
4
  exports.isUserSessionValid = isUserSessionValid;
16
5
  exports.getUserSessionUpdater = getUserSessionUpdater;
17
6
  exports.addSessionMetadataToNextSession = addSessionMetadataToNextSession;
18
7
  exports.getSessionMetaUpdateHandler = getSessionMetaUpdateHandler;
19
- var faro_core_1 = require("@grafana/faro-core");
20
- var utils_1 = require("../../../utils");
21
- var sampling_1 = require("./sampling");
22
- var sessionConstants_1 = require("./sessionConstants");
23
- function createUserSessionObject(_a) {
24
- var _b, _c;
25
- var _d = _a === void 0 ? {} : _a, sessionId = _d.sessionId, started = _d.started, lastActivity = _d.lastActivity, _e = _d.isSampled, isSampled = _e === void 0 ? true : _e;
26
- var now = (0, faro_core_1.dateNow)();
27
- var generateSessionId = (_c = (_b = faro_core_1.faro.config) === null || _b === void 0 ? void 0 : _b.sessionTracking) === null || _c === void 0 ? void 0 : _c.generateSessionId;
8
+ const faro_core_1 = require("@grafana/faro-core");
9
+ const utils_1 = require("../../../utils");
10
+ const sampling_1 = require("./sampling");
11
+ const sessionConstants_1 = require("./sessionConstants");
12
+ function createUserSessionObject({ sessionId, started, lastActivity, isSampled = true, } = {}) {
13
+ var _a, _b;
14
+ const now = (0, faro_core_1.dateNow)();
15
+ const generateSessionId = (_b = (_a = faro_core_1.faro.config) === null || _a === void 0 ? void 0 : _a.sessionTracking) === null || _b === void 0 ? void 0 : _b.generateSessionId;
28
16
  if (sessionId == null) {
29
17
  sessionId = typeof generateSessionId === 'function' ? generateSessionId() : (0, faro_core_1.genShortID)();
30
18
  }
31
19
  return {
32
- sessionId: sessionId,
20
+ sessionId,
33
21
  lastActivity: lastActivity !== null && lastActivity !== void 0 ? lastActivity : now,
34
22
  started: started !== null && started !== void 0 ? started : now,
35
23
  isSampled: isSampled,
@@ -39,89 +27,104 @@ function isUserSessionValid(session) {
39
27
  if (session == null) {
40
28
  return false;
41
29
  }
42
- var now = (0, faro_core_1.dateNow)();
43
- var lifetimeValid = now - session.started < sessionConstants_1.SESSION_EXPIRATION_TIME;
30
+ const now = (0, faro_core_1.dateNow)();
31
+ const lifetimeValid = now - session.started < sessionConstants_1.SESSION_EXPIRATION_TIME;
44
32
  if (!lifetimeValid) {
45
33
  return false;
46
34
  }
47
- var inactivityPeriodValid = now - session.lastActivity < sessionConstants_1.SESSION_INACTIVITY_TIME;
35
+ const inactivityPeriodValid = now - session.lastActivity < sessionConstants_1.SESSION_INACTIVITY_TIME;
48
36
  return inactivityPeriodValid;
49
37
  }
50
- function getUserSessionUpdater(_a) {
51
- var fetchUserSession = _a.fetchUserSession, storeUserSession = _a.storeUserSession;
52
- return function updateSession(_a) {
53
- var _b, _c, _d;
54
- var _e = _a === void 0 ? { forceSessionExtend: false } : _a, forceSessionExtend = _e.forceSessionExtend;
38
+ function getUserSessionUpdater({ fetchUserSession, storeUserSession, }) {
39
+ return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }) {
40
+ var _a, _b, _c;
55
41
  if (!fetchUserSession || !storeUserSession) {
56
42
  return;
57
43
  }
58
- var sessionTrackingConfig = faro_core_1.faro.config.sessionTracking;
59
- var isPersistentSessions = sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.persistent;
44
+ const sessionTrackingConfig = faro_core_1.faro.config.sessionTracking;
45
+ const isPersistentSessions = sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.persistent;
60
46
  if ((isPersistentSessions && !utils_1.isLocalStorageAvailable) || (!isPersistentSessions && !utils_1.isSessionStorageAvailable)) {
61
47
  return;
62
48
  }
63
- var sessionFromStorage = fetchUserSession();
49
+ const sessionFromStorage = fetchUserSession();
64
50
  if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) {
65
- storeUserSession(__assign(__assign({}, sessionFromStorage), { lastActivity: (0, faro_core_1.dateNow)() }));
51
+ storeUserSession(Object.assign(Object.assign({}, sessionFromStorage), { lastActivity: (0, faro_core_1.dateNow)() }));
66
52
  }
67
53
  else {
68
- var newSession = addSessionMetadataToNextSession(createUserSessionObject({ isSampled: (0, sampling_1.isSampled)() }), sessionFromStorage);
54
+ let newSession = addSessionMetadataToNextSession(createUserSessionObject({ isSampled: (0, sampling_1.isSampled)() }), sessionFromStorage);
69
55
  storeUserSession(newSession);
70
- (_b = faro_core_1.faro.api) === null || _b === void 0 ? void 0 : _b.setSession(newSession.sessionMeta);
71
- (_c = sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.onSessionChange) === null || _c === void 0 ? void 0 : _c.call(sessionTrackingConfig, (_d = sessionFromStorage === null || sessionFromStorage === void 0 ? void 0 : sessionFromStorage.sessionMeta) !== null && _d !== void 0 ? _d : null, newSession.sessionMeta);
56
+ (_a = faro_core_1.faro.api) === null || _a === void 0 ? void 0 : _a.setSession(newSession.sessionMeta);
57
+ (_b = sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.onSessionChange) === null || _b === void 0 ? void 0 : _b.call(sessionTrackingConfig, (_c = sessionFromStorage === null || sessionFromStorage === void 0 ? void 0 : sessionFromStorage.sessionMeta) !== null && _c !== void 0 ? _c : null, newSession.sessionMeta);
72
58
  }
73
59
  };
74
60
  }
75
61
  function addSessionMetadataToNextSession(newSession, previousSession) {
76
62
  var _a, _b, _c, _d, _e, _f, _g;
77
- var sessionWithMeta = __assign(__assign({}, newSession), { sessionMeta: {
63
+ const sessionWithMeta = Object.assign(Object.assign({}, newSession), { sessionMeta: {
78
64
  id: newSession.sessionId,
79
- attributes: __assign(__assign(__assign({}, (_b = (_a = faro_core_1.faro.config.sessionTracking) === null || _a === void 0 ? void 0 : _a.session) === null || _b === void 0 ? void 0 : _b.attributes), ((_d = (_c = faro_core_1.faro.metas.value.session) === null || _c === void 0 ? void 0 : _c.attributes) !== null && _d !== void 0 ? _d : {})), { isSampled: newSession.isSampled.toString() }),
65
+ attributes: removeUndefinedValues(Object.assign(Object.assign(Object.assign({}, (_b = (_a = faro_core_1.faro.config.sessionTracking) === null || _a === void 0 ? void 0 : _a.session) === null || _b === void 0 ? void 0 : _b.attributes), ((_d = (_c = faro_core_1.faro.metas.value.session) === null || _c === void 0 ? void 0 : _c.attributes) !== null && _d !== void 0 ? _d : {})), { isSampled: newSession.isSampled.toString() })),
80
66
  } });
81
- var overrides = (_f = (_e = faro_core_1.faro.metas.value.session) === null || _e === void 0 ? void 0 : _e.overrides) !== null && _f !== void 0 ? _f : (_g = previousSession === null || previousSession === void 0 ? void 0 : previousSession.sessionMeta) === null || _g === void 0 ? void 0 : _g.overrides;
67
+ const overrides = (_f = (_e = faro_core_1.faro.metas.value.session) === null || _e === void 0 ? void 0 : _e.overrides) !== null && _f !== void 0 ? _f : (_g = previousSession === null || previousSession === void 0 ? void 0 : previousSession.sessionMeta) === null || _g === void 0 ? void 0 : _g.overrides;
82
68
  if (!(0, faro_core_1.isEmpty)(overrides)) {
83
69
  sessionWithMeta.sessionMeta.overrides = overrides;
84
70
  }
85
- var previousSessionId = previousSession === null || previousSession === void 0 ? void 0 : previousSession.sessionId;
71
+ const previousSessionId = previousSession === null || previousSession === void 0 ? void 0 : previousSession.sessionId;
86
72
  if (previousSessionId != null) {
87
73
  sessionWithMeta.sessionMeta.attributes['previousSession'] = previousSessionId;
88
74
  }
89
75
  return sessionWithMeta;
90
76
  }
91
- function getSessionMetaUpdateHandler(_a) {
92
- var fetchUserSession = _a.fetchUserSession, storeUserSession = _a.storeUserSession;
77
+ function getSessionMetaUpdateHandler({ fetchUserSession, storeUserSession, }) {
78
+ let isSyncing = false;
93
79
  return function syncSessionIfChangedExternally(meta) {
94
- var session = meta.session;
95
- var sessionFromSessionStorage = fetchUserSession();
96
- var sessionId = session === null || session === void 0 ? void 0 : session.id;
97
- var sessionAttributes = session === null || session === void 0 ? void 0 : session.attributes;
98
- var sessionOverrides = session === null || session === void 0 ? void 0 : session.overrides;
99
- var storedSessionMeta = sessionFromSessionStorage === null || sessionFromSessionStorage === void 0 ? void 0 : sessionFromSessionStorage.sessionMeta;
100
- var storedSessionMetaOverrides = storedSessionMeta === null || storedSessionMeta === void 0 ? void 0 : storedSessionMeta.overrides;
101
- var hasSessionOverridesChanged = !!sessionOverrides && !(0, faro_core_1.deepEqual)(sessionOverrides, storedSessionMetaOverrides);
102
- var hasAttributesChanged = !!sessionAttributes && !(0, faro_core_1.deepEqual)(sessionAttributes, storedSessionMeta === null || storedSessionMeta === void 0 ? void 0 : storedSessionMeta.attributes);
103
- var hasSessionIdChanged = !!session && sessionId !== (sessionFromSessionStorage === null || sessionFromSessionStorage === void 0 ? void 0 : sessionFromSessionStorage.sessionId);
80
+ if (isSyncing) {
81
+ return;
82
+ }
83
+ const session = meta.session;
84
+ const sessionFromSessionStorage = fetchUserSession();
85
+ let sessionId = session === null || session === void 0 ? void 0 : session.id;
86
+ const sessionAttributes = session === null || session === void 0 ? void 0 : session.attributes;
87
+ const sessionOverrides = session === null || session === void 0 ? void 0 : session.overrides;
88
+ const storedSessionMeta = sessionFromSessionStorage === null || sessionFromSessionStorage === void 0 ? void 0 : sessionFromSessionStorage.sessionMeta;
89
+ const storedSessionMetaOverrides = storedSessionMeta === null || storedSessionMeta === void 0 ? void 0 : storedSessionMeta.overrides;
90
+ const hasSessionOverridesChanged = !!sessionOverrides && !(0, faro_core_1.deepEqual)(sessionOverrides, storedSessionMetaOverrides);
91
+ const hasAttributesChanged = !!sessionAttributes && !(0, faro_core_1.deepEqual)(sessionAttributes, storedSessionMeta === null || storedSessionMeta === void 0 ? void 0 : storedSessionMeta.attributes);
92
+ const hasSessionIdChanged = !!session && sessionId !== (sessionFromSessionStorage === null || sessionFromSessionStorage === void 0 ? void 0 : sessionFromSessionStorage.sessionId);
104
93
  if (hasSessionIdChanged || hasAttributesChanged || hasSessionOverridesChanged) {
105
- var userSession = addSessionMetadataToNextSession(createUserSessionObject({ sessionId: sessionId, isSampled: (0, sampling_1.isSampled)() }), sessionFromSessionStorage);
94
+ const userSession = addSessionMetadataToNextSession(createUserSessionObject({ sessionId, isSampled: (0, sampling_1.isSampled)() }), sessionFromSessionStorage);
106
95
  storeUserSession(userSession);
107
96
  sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionMetaOverrides);
108
- faro_core_1.faro.api.setSession(userSession.sessionMeta);
97
+ isSyncing = true;
98
+ try {
99
+ faro_core_1.faro.api.setSession(userSession.sessionMeta);
100
+ }
101
+ finally {
102
+ isSyncing = false;
103
+ }
109
104
  }
110
105
  };
111
106
  }
112
- function sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionOverrides) {
107
+ function removeUndefinedValues(obj) {
108
+ const result = {};
109
+ for (const key of Object.keys(obj)) {
110
+ const value = obj[key];
111
+ if (value !== undefined) {
112
+ result[key] = value;
113
+ }
114
+ }
115
+ return result;
116
+ }
117
+ function sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides = {}, storedSessionOverrides = {}) {
113
118
  var _a, _b, _c;
114
- if (sessionOverrides === void 0) { sessionOverrides = {}; }
115
- if (storedSessionOverrides === void 0) { storedSessionOverrides = {}; }
116
119
  if (!hasSessionOverridesChanged) {
117
120
  return;
118
121
  }
119
- var serviceName = sessionOverrides.serviceName;
120
- var previousServiceName = (_c = (_a = storedSessionOverrides.serviceName) !== null && _a !== void 0 ? _a : (_b = faro_core_1.faro.metas.value.app) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '';
122
+ const serviceName = sessionOverrides.serviceName;
123
+ const previousServiceName = (_c = (_a = storedSessionOverrides.serviceName) !== null && _a !== void 0 ? _a : (_b = faro_core_1.faro.metas.value.app) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '';
121
124
  if (serviceName && serviceName !== previousServiceName) {
122
125
  faro_core_1.faro.api.pushEvent(faro_core_1.EVENT_OVERRIDES_SERVICE_NAME, {
123
- serviceName: serviceName,
124
- previousServiceName: previousServiceName,
126
+ serviceName,
127
+ previousServiceName,
125
128
  });
126
129
  }
127
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sessionManagerUtils.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sessionManagerUtils.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAgBA,0DAoBC;AAED,gDAcC;AASD,sDAgCC;AAED,0EAwBC;AAOD,kEA8BC;AA5JD,gDAAiH;AAGjH,wCAAoF;AAEpF,uCAAuC;AACvC,uDAAsF;AAUtF,SAAgB,uBAAuB,CAAC,EAKH;;QALG,qBAKL,EAAE,KAAA,EAJnC,SAAS,eAAA,EACT,OAAO,aAAA,EACP,YAAY,kBAAA,EACZ,iBAAgB,EAAhB,SAAS,mBAAG,IAAI,KAAA;IAEhB,IAAM,GAAG,GAAG,IAAA,mBAAO,GAAE,CAAC;IAEtB,IAAM,iBAAiB,GAAG,MAAA,MAAA,gBAAI,CAAC,MAAM,0CAAE,eAAe,0CAAE,iBAAiB,CAAC;IAE1E,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,SAAS,GAAG,OAAO,iBAAiB,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAA,sBAAU,GAAE,CAAC;IAC3F,CAAC;IAED,OAAO;QACL,SAAS,WAAA;QACT,YAAY,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,GAAG;QACjC,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,GAAG;QACvB,SAAS,EAAE,SAAS;KACrB,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAA+B;IAChE,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAM,GAAG,GAAG,IAAA,mBAAO,GAAE,CAAC;IACtB,IAAM,aAAa,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,GAAG,0CAAuB,CAAC;IAEtE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAM,qBAAqB,GAAG,GAAG,GAAG,OAAO,CAAC,YAAY,GAAG,0CAAuB,CAAC;IACnF,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AASD,SAAgB,qBAAqB,CAAC,EAGR;QAF5B,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAEhB,OAAO,SAAS,aAAa,CAAC,EAAsD;;YAAtD,qBAAyB,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAA,EAApD,kBAAkB,wBAAA;QAChD,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAM,qBAAqB,GAAG,gBAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QAC1D,IAAM,oBAAoB,GAAG,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,UAAU,CAAC;QAE/D,IAAI,CAAC,oBAAoB,IAAI,CAAC,+BAAuB,CAAC,IAAI,CAAC,CAAC,oBAAoB,IAAI,CAAC,iCAAyB,CAAC,EAAE,CAAC;YAChH,OAAO;QACT,CAAC;QAED,IAAM,kBAAkB,GAAG,gBAAgB,EAAE,CAAC;QAE9C,IAAI,kBAAkB,KAAK,KAAK,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3E,gBAAgB,uBAAM,kBAAmB,KAAE,YAAY,EAAE,IAAA,mBAAO,GAAE,IAAG,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,IAAI,UAAU,GAAG,+BAA+B,CAC9C,uBAAuB,CAAC,EAAE,SAAS,EAAE,IAAA,oBAAS,GAAE,EAAE,CAAC,EACnD,kBAAkB,CACnB,CAAC;YAEF,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAE7B,MAAA,gBAAI,CAAC,GAAG,0CAAE,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,eAAe,sEAAG,MAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,WAAW,mCAAI,IAAI,EAAE,UAAU,CAAC,WAAY,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,+BAA+B,CAAC,UAA2B,EAAE,eAAuC;;IAClH,IAAM,eAAe,yBAChB,UAAU,KACb,WAAW,EAAE;YACX,EAAE,EAAE,UAAU,CAAC,SAAS;YACxB,UAAU,iCACL,MAAA,MAAA,gBAAI,CAAC,MAAM,CAAC,eAAe,0CAAE,OAAO,0CAAE,UAAU,GAChD,CAAC,MAAA,MAAA,gBAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,0CAAE,UAAU,mCAAI,EAAE,CAAC,KAC/C,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,GAC3C;SACF,GACF,CAAC;IAEF,IAAM,SAAS,GAAG,MAAA,MAAA,gBAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,0CAAE,SAAS,mCAAI,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,WAAW,0CAAE,SAAS,CAAC;IACjG,IAAI,CAAC,IAAA,mBAAO,EAAC,SAAS,CAAC,EAAE,CAAC;QACxB,eAAe,CAAC,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;IACpD,CAAC;IAED,IAAM,iBAAiB,GAAG,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,SAAS,CAAC;IACrD,IAAI,iBAAiB,IAAI,IAAI,EAAE,CAAC;QAC9B,eAAe,CAAC,WAAW,CAAC,UAAW,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;IACjF,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAOD,SAAgB,2BAA2B,CAAC,EAGJ;QAFtC,gBAAgB,sBAAA,EAChB,gBAAgB,sBAAA;IAEhB,OAAO,SAAS,8BAA8B,CAAC,IAAU;QACvD,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAM,yBAAyB,GAAG,gBAAgB,EAAE,CAAC;QAErD,IAAI,SAAS,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,CAAC;QAC5B,IAAM,iBAAiB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC;QAC9C,IAAM,gBAAgB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,CAAC;QAE5C,IAAM,iBAAiB,GAAG,yBAAyB,aAAzB,yBAAyB,uBAAzB,yBAAyB,CAAE,WAAW,CAAC;QACjE,IAAM,0BAA0B,GAAG,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,SAAS,CAAC;QAEhE,IAAM,0BAA0B,GAAG,CAAC,CAAC,gBAAgB,IAAI,CAAC,IAAA,qBAAS,EAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;QAClH,IAAM,oBAAoB,GAAG,CAAC,CAAC,iBAAiB,IAAI,CAAC,IAAA,qBAAS,EAAC,iBAAiB,EAAE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,UAAU,CAAC,CAAC;QACjH,IAAM,mBAAmB,GAAG,CAAC,CAAC,OAAO,IAAI,SAAS,MAAK,yBAAyB,aAAzB,yBAAyB,uBAAzB,yBAAyB,CAAE,SAAS,CAAA,CAAC;QAE5F,IAAI,mBAAmB,IAAI,oBAAoB,IAAI,0BAA0B,EAAE,CAAC;YAC9E,IAAM,WAAW,GAAG,+BAA+B,CACjD,uBAAuB,CAAC,EAAE,SAAS,WAAA,EAAE,SAAS,EAAE,IAAA,oBAAS,GAAE,EAAE,CAAC,EAC9D,yBAAyB,CAC1B,CAAC;YAEF,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC9B,iBAAiB,CAAC,0BAA0B,EAAE,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;YAC5F,gBAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,0BAAmC,EACnC,gBAAoC,EACpC,sBAA0C;;IAD1C,iCAAA,EAAA,qBAAoC;IACpC,uCAAA,EAAA,2BAA0C;IAE1C,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC;IACjD,IAAM,mBAAmB,GAAG,MAAA,MAAA,sBAAsB,CAAC,WAAW,mCAAI,MAAA,gBAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,0CAAE,IAAI,mCAAI,EAAE,CAAC;IAEnG,IAAI,WAAW,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;QACvD,gBAAI,CAAC,GAAG,CAAC,SAAS,CAAC,wCAA4B,EAAE;YAC/C,WAAW,aAAA;YACX,mBAAmB,qBAAA;SACpB,CAAC,CAAC;IACL,CAAC;AACH,CAAC","sourcesContent":["import { dateNow, deepEqual, EVENT_OVERRIDES_SERVICE_NAME, faro, genShortID, isEmpty } from '@grafana/faro-core';\nimport type { Meta, MetaOverrides } from '@grafana/faro-core';\n\nimport { isLocalStorageAvailable, isSessionStorageAvailable } from '../../../utils';\n\nimport { isSampled } from './sampling';\nimport { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME } from './sessionConstants';\nimport type { FaroUserSession } from './types';\n\ntype CreateUserSessionObjectParams = {\n sessionId?: string;\n started?: number;\n lastActivity?: number;\n isSampled?: boolean;\n};\n\nexport function createUserSessionObject({\n sessionId,\n started,\n lastActivity,\n isSampled = true,\n}: CreateUserSessionObjectParams = {}): FaroUserSession {\n const now = dateNow();\n\n const generateSessionId = faro.config?.sessionTracking?.generateSessionId;\n\n if (sessionId == null) {\n sessionId = typeof generateSessionId === 'function' ? generateSessionId() : genShortID();\n }\n\n return {\n sessionId,\n lastActivity: lastActivity ?? now,\n started: started ?? now,\n isSampled: isSampled,\n };\n}\n\nexport function isUserSessionValid(session: FaroUserSession | null): boolean {\n if (session == null) {\n return false;\n }\n\n const now = dateNow();\n const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME;\n\n if (!lifetimeValid) {\n return false;\n }\n\n const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME;\n return inactivityPeriodValid;\n}\n\ntype GetUserSessionUpdaterParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\ntype UpdateSessionParams = { forceSessionExtend: boolean };\n\nexport function getUserSessionUpdater({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionUpdaterParams): (options?: UpdateSessionParams) => void {\n return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }): void {\n if (!fetchUserSession || !storeUserSession) {\n return;\n }\n\n const sessionTrackingConfig = faro.config.sessionTracking;\n const isPersistentSessions = sessionTrackingConfig?.persistent;\n\n if ((isPersistentSessions && !isLocalStorageAvailable) || (!isPersistentSessions && !isSessionStorageAvailable)) {\n return;\n }\n\n const sessionFromStorage = fetchUserSession();\n\n if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) {\n storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() });\n } else {\n let newSession = addSessionMetadataToNextSession(\n createUserSessionObject({ isSampled: isSampled() }),\n sessionFromStorage\n );\n\n storeUserSession(newSession);\n\n faro.api?.setSession(newSession.sessionMeta);\n sessionTrackingConfig?.onSessionChange?.(sessionFromStorage?.sessionMeta ?? null, newSession.sessionMeta!);\n }\n };\n}\n\nexport function addSessionMetadataToNextSession(newSession: FaroUserSession, previousSession: FaroUserSession | null) {\n const sessionWithMeta: Required<FaroUserSession> = {\n ...newSession,\n sessionMeta: {\n id: newSession.sessionId,\n attributes: {\n ...faro.config.sessionTracking?.session?.attributes,\n ...(faro.metas.value.session?.attributes ?? {}),\n isSampled: newSession.isSampled.toString(),\n },\n },\n };\n\n const overrides = faro.metas.value.session?.overrides ?? previousSession?.sessionMeta?.overrides;\n if (!isEmpty(overrides)) {\n sessionWithMeta.sessionMeta.overrides = overrides;\n }\n\n const previousSessionId = previousSession?.sessionId;\n if (previousSessionId != null) {\n sessionWithMeta.sessionMeta.attributes!['previousSession'] = previousSessionId;\n }\n\n return sessionWithMeta;\n}\n\ntype GetUserSessionMetaUpdateHandlerParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\nexport function getSessionMetaUpdateHandler({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionMetaUpdateHandlerParams) {\n return function syncSessionIfChangedExternally(meta: Meta) {\n const session = meta.session;\n const sessionFromSessionStorage = fetchUserSession();\n\n let sessionId = session?.id;\n const sessionAttributes = session?.attributes;\n const sessionOverrides = session?.overrides;\n\n const storedSessionMeta = sessionFromSessionStorage?.sessionMeta;\n const storedSessionMetaOverrides = storedSessionMeta?.overrides;\n\n const hasSessionOverridesChanged = !!sessionOverrides && !deepEqual(sessionOverrides, storedSessionMetaOverrides);\n const hasAttributesChanged = !!sessionAttributes && !deepEqual(sessionAttributes, storedSessionMeta?.attributes);\n const hasSessionIdChanged = !!session && sessionId !== sessionFromSessionStorage?.sessionId;\n\n if (hasSessionIdChanged || hasAttributesChanged || hasSessionOverridesChanged) {\n const userSession = addSessionMetadataToNextSession(\n createUserSessionObject({ sessionId, isSampled: isSampled() }),\n sessionFromSessionStorage\n );\n\n storeUserSession(userSession);\n sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionMetaOverrides);\n faro.api.setSession(userSession.sessionMeta);\n }\n };\n}\n\nfunction sendOverrideEvent(\n hasSessionOverridesChanged: boolean,\n sessionOverrides: MetaOverrides = {},\n storedSessionOverrides: MetaOverrides = {}\n) {\n if (!hasSessionOverridesChanged) {\n return;\n }\n\n const serviceName = sessionOverrides.serviceName;\n const previousServiceName = storedSessionOverrides.serviceName ?? faro.metas.value.app?.name ?? '';\n\n if (serviceName && serviceName !== previousServiceName) {\n faro.api.pushEvent(EVENT_OVERRIDES_SERVICE_NAME, {\n serviceName,\n previousServiceName,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"sessionManagerUtils.js","sourceRoot":"","sources":["../../../../../src/instrumentations/session/sessionManager/sessionManagerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { dateNow, deepEqual, EVENT_OVERRIDES_SERVICE_NAME, faro, genShortID, isEmpty } from '@grafana/faro-core';\nimport type { Meta, MetaOverrides } from '@grafana/faro-core';\n\nimport { isLocalStorageAvailable, isSessionStorageAvailable } from '../../../utils';\n\nimport { isSampled } from './sampling';\nimport { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME } from './sessionConstants';\nimport type { FaroUserSession } from './types';\n\ntype CreateUserSessionObjectParams = {\n sessionId?: string;\n started?: number;\n lastActivity?: number;\n isSampled?: boolean;\n};\n\nexport function createUserSessionObject({\n sessionId,\n started,\n lastActivity,\n isSampled = true,\n}: CreateUserSessionObjectParams = {}): FaroUserSession {\n const now = dateNow();\n\n const generateSessionId = faro.config?.sessionTracking?.generateSessionId;\n\n if (sessionId == null) {\n sessionId = typeof generateSessionId === 'function' ? generateSessionId() : genShortID();\n }\n\n return {\n sessionId,\n lastActivity: lastActivity ?? now,\n started: started ?? now,\n isSampled: isSampled,\n };\n}\n\nexport function isUserSessionValid(session: FaroUserSession | null): boolean {\n if (session == null) {\n return false;\n }\n\n const now = dateNow();\n const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME;\n\n if (!lifetimeValid) {\n return false;\n }\n\n const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME;\n return inactivityPeriodValid;\n}\n\ntype GetUserSessionUpdaterParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\ntype UpdateSessionParams = { forceSessionExtend: boolean };\n\nexport function getUserSessionUpdater({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionUpdaterParams): (options?: UpdateSessionParams) => void {\n return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }): void {\n if (!fetchUserSession || !storeUserSession) {\n return;\n }\n\n const sessionTrackingConfig = faro.config.sessionTracking;\n const isPersistentSessions = sessionTrackingConfig?.persistent;\n\n if ((isPersistentSessions && !isLocalStorageAvailable) || (!isPersistentSessions && !isSessionStorageAvailable)) {\n return;\n }\n\n const sessionFromStorage = fetchUserSession();\n\n if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) {\n storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() });\n } else {\n let newSession = addSessionMetadataToNextSession(\n createUserSessionObject({ isSampled: isSampled() }),\n sessionFromStorage\n );\n\n storeUserSession(newSession);\n\n faro.api?.setSession(newSession.sessionMeta);\n sessionTrackingConfig?.onSessionChange?.(sessionFromStorage?.sessionMeta ?? null, newSession.sessionMeta!);\n }\n };\n}\n\nexport function addSessionMetadataToNextSession(newSession: FaroUserSession, previousSession: FaroUserSession | null) {\n const sessionWithMeta: Required<FaroUserSession> = {\n ...newSession,\n sessionMeta: {\n id: newSession.sessionId,\n attributes: removeUndefinedValues({\n ...faro.config.sessionTracking?.session?.attributes,\n ...(faro.metas.value.session?.attributes ?? {}),\n isSampled: newSession.isSampled.toString(),\n }),\n },\n };\n\n const overrides = faro.metas.value.session?.overrides ?? previousSession?.sessionMeta?.overrides;\n if (!isEmpty(overrides)) {\n sessionWithMeta.sessionMeta.overrides = overrides;\n }\n\n const previousSessionId = previousSession?.sessionId;\n if (previousSessionId != null) {\n sessionWithMeta.sessionMeta.attributes!['previousSession'] = previousSessionId;\n }\n\n return sessionWithMeta;\n}\n\ntype GetUserSessionMetaUpdateHandlerParams = {\n storeUserSession: (session: FaroUserSession) => void;\n fetchUserSession: () => FaroUserSession | null;\n};\n\nexport function getSessionMetaUpdateHandler({\n fetchUserSession,\n storeUserSession,\n}: GetUserSessionMetaUpdateHandlerParams) {\n let isSyncing = false;\n\n return function syncSessionIfChangedExternally(meta: Meta) {\n if (isSyncing) {\n return;\n }\n const session = meta.session;\n const sessionFromSessionStorage = fetchUserSession();\n\n let sessionId = session?.id;\n const sessionAttributes = session?.attributes;\n const sessionOverrides = session?.overrides;\n\n const storedSessionMeta = sessionFromSessionStorage?.sessionMeta;\n const storedSessionMetaOverrides = storedSessionMeta?.overrides;\n\n const hasSessionOverridesChanged = !!sessionOverrides && !deepEqual(sessionOverrides, storedSessionMetaOverrides);\n const hasAttributesChanged = !!sessionAttributes && !deepEqual(sessionAttributes, storedSessionMeta?.attributes);\n const hasSessionIdChanged = !!session && sessionId !== sessionFromSessionStorage?.sessionId;\n\n if (hasSessionIdChanged || hasAttributesChanged || hasSessionOverridesChanged) {\n const userSession = addSessionMetadataToNextSession(\n createUserSessionObject({ sessionId, isSampled: isSampled() }),\n sessionFromSessionStorage\n );\n\n storeUserSession(userSession);\n sendOverrideEvent(hasSessionOverridesChanged, sessionOverrides, storedSessionMetaOverrides);\n\n isSyncing = true;\n try {\n faro.api.setSession(userSession.sessionMeta);\n } finally {\n isSyncing = false;\n }\n }\n };\n}\n\nfunction removeUndefinedValues(obj: Record<string, string | undefined>): Record<string, string> {\n const result: Record<string, string> = {};\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction sendOverrideEvent(\n hasSessionOverridesChanged: boolean,\n sessionOverrides: MetaOverrides = {},\n storedSessionOverrides: MetaOverrides = {}\n) {\n if (!hasSessionOverridesChanged) {\n return;\n }\n\n const serviceName = sessionOverrides.serviceName;\n const previousServiceName = storedSessionOverrides.serviceName ?? faro.metas.value.app?.name ?? '';\n\n if (serviceName && serviceName !== previousServiceName) {\n faro.api.pushEvent(EVENT_OVERRIDES_SERVICE_NAME, {\n serviceName,\n previousServiceName,\n });\n }\n}\n"]}
@@ -1,51 +1,32 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
2
  Object.defineProperty(exports, "__esModule", { value: true });
18
3
  exports.UserActionInstrumentation = void 0;
19
- var faro_core_1 = require("@grafana/faro-core");
20
- var processUserActionEventHandler_1 = require("./processUserActionEventHandler");
21
- var UserActionInstrumentation = /** @class */ (function (_super) {
22
- __extends(UserActionInstrumentation, _super);
23
- function UserActionInstrumentation() {
24
- var _this = _super !== null && _super.apply(this, arguments) || this;
25
- _this.name = '@grafana/faro-web-sdk:instrumentation-user-action';
26
- _this.version = faro_core_1.VERSION;
27
- return _this;
4
+ const faro_core_1 = require("@grafana/faro-core");
5
+ const processUserActionEventHandler_1 = require("./processUserActionEventHandler");
6
+ class UserActionInstrumentation extends faro_core_1.BaseInstrumentation {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.name = '@grafana/faro-web-sdk:instrumentation-user-action';
10
+ this.version = faro_core_1.VERSION;
28
11
  }
29
- UserActionInstrumentation.prototype.initialize = function () {
30
- var _a = (0, processUserActionEventHandler_1.getUserEventHandler)(faro_core_1.faro), processUserEvent = _a.processUserEvent, processUserActionStarted = _a.processUserActionStarted;
12
+ initialize() {
13
+ const { processUserEvent, processUserActionStarted } = (0, processUserActionEventHandler_1.getUserEventHandler)(faro_core_1.faro);
31
14
  window.addEventListener('pointerdown', processUserEvent);
32
- window.addEventListener('keydown', function (ev) {
15
+ window.addEventListener('keydown', (ev) => {
33
16
  if ([' ', 'Enter'].includes(ev.key)) {
34
17
  processUserEvent(ev);
35
18
  }
36
19
  });
37
- this._userActionSub = faro_core_1.userActionsMessageBus.subscribe(function (_a) {
38
- var type = _a.type, userAction = _a.userAction;
20
+ this._userActionSub = faro_core_1.userActionsMessageBus.subscribe(({ type, userAction }) => {
39
21
  if (type === 'user_action_start') {
40
22
  processUserActionStarted(userAction);
41
23
  }
42
24
  });
43
- };
44
- UserActionInstrumentation.prototype.destroy = function () {
25
+ }
26
+ destroy() {
45
27
  var _a;
46
28
  (_a = this._userActionSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
47
- };
48
- return UserActionInstrumentation;
49
- }(faro_core_1.BaseInstrumentation));
29
+ }
30
+ }
50
31
  exports.UserActionInstrumentation = UserActionInstrumentation;
51
32
  //# sourceMappingURL=instrumentation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAkH;AAElH,iFAAsE;AAEtE;IAA+C,6CAAmB;IAAlE;;QACW,UAAI,GAAG,mDAAmD,CAAC;QAC3D,aAAO,GAAG,mBAAO,CAAC;;IAuB7B,CAAC;IAnBC,8CAAU,GAAV;QACQ,IAAA,KAAiD,IAAA,mDAAmB,EAAC,gBAAI,CAAC,EAAxE,gBAAgB,sBAAA,EAAE,wBAAwB,8BAA8B,CAAC;QACjF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAC,EAAiB;YACnD,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,iCAAqB,CAAC,SAAS,CAAC,UAAC,EAAoB;gBAAlB,IAAI,UAAA,EAAE,UAAU,gBAAA;YACvE,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACjC,wBAAwB,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2CAAO,GAAP;;QACE,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,EAAE,CAAC;IACrC,CAAC;IACH,gCAAC;AAAD,CAAC,AAzBD,CAA+C,+BAAmB,GAyBjE;AAzBY,8DAAyB","sourcesContent":["import { BaseInstrumentation, faro, type Subscription, userActionsMessageBus, VERSION } from '@grafana/faro-core';\n\nimport { getUserEventHandler } from './processUserActionEventHandler';\n\nexport class UserActionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-user-action';\n readonly version = VERSION;\n\n private _userActionSub?: Subscription;\n\n initialize(): void {\n const { processUserEvent, processUserActionStarted } = getUserEventHandler(faro);\n window.addEventListener('pointerdown', processUserEvent);\n window.addEventListener('keydown', (ev: KeyboardEvent) => {\n if ([' ', 'Enter'].includes(ev.key)) {\n processUserEvent(ev);\n }\n });\n\n this._userActionSub = userActionsMessageBus.subscribe(({ type, userAction }) => {\n if (type === 'user_action_start') {\n processUserActionStarted(userAction);\n }\n });\n }\n\n destroy() {\n this._userActionSub?.unsubscribe();\n }\n}\n"]}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":";;;AAAA,kDAAkH;AAElH,mFAAsE;AAEtE,MAAa,yBAA0B,SAAQ,+BAAmB;IAAlE;;QACW,SAAI,GAAG,mDAAmD,CAAC;QAC3D,YAAO,GAAG,mBAAO,CAAC;IAuB7B,CAAC;IAnBC,UAAU;QACR,MAAM,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,GAAG,IAAA,mDAAmB,EAAC,gBAAI,CAAC,CAAC;QACjF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAiB,EAAE,EAAE;YACvD,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,iCAAqB,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;YAC7E,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACjC,wBAAwB,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;;QACL,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,EAAE,CAAC;IACrC,CAAC;CACF;AAzBD,8DAyBC","sourcesContent":["import { BaseInstrumentation, faro, type Subscription, userActionsMessageBus, VERSION } from '@grafana/faro-core';\n\nimport { getUserEventHandler } from './processUserActionEventHandler';\n\nexport class UserActionInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-user-action';\n readonly version = VERSION;\n\n private _userActionSub?: Subscription;\n\n initialize(): void {\n const { processUserEvent, processUserActionStarted } = getUserEventHandler(faro);\n window.addEventListener('pointerdown', processUserEvent);\n window.addEventListener('keydown', (ev: KeyboardEvent) => {\n if ([' ', 'Enter'].includes(ev.key)) {\n processUserEvent(ev);\n }\n });\n\n this._userActionSub = userActionsMessageBus.subscribe(({ type, userAction }) => {\n if (type === 'user_action_start') {\n processUserActionStarted(userAction);\n }\n });\n }\n\n destroy() {\n this._userActionSub?.unsubscribe();\n }\n}\n"]}
@@ -3,33 +3,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getUserEventHandler = getUserEventHandler;
4
4
  exports.getUserActionNameFromElement = getUserActionNameFromElement;
5
5
  exports.unsubscribeAllMonitors = unsubscribeAllMonitors;
6
- var const_1 = require("./const");
7
- var userActionController_1 = require("./userActionController");
8
- var util_1 = require("./util");
6
+ const const_1 = require("./const");
7
+ const userActionController_1 = require("./userActionController");
8
+ const util_1 = require("./util");
9
9
  function getUserEventHandler(faro) {
10
- var api = faro.api, config = faro.config;
10
+ const { api, config } = faro;
11
11
  function processUserEvent(event) {
12
12
  var _a, _b;
13
- var userActionName = getUserActionNameFromElement(event.target, (_b = (_a = config.userActionsInstrumentation) === null || _a === void 0 ? void 0 : _a.dataAttributeName) !== null && _b !== void 0 ? _b : const_1.userActionDataAttributeParsed);
13
+ const userActionName = getUserActionNameFromElement(event.target, (_b = (_a = config.userActionsInstrumentation) === null || _a === void 0 ? void 0 : _a.dataAttributeName) !== null && _b !== void 0 ? _b : const_1.userActionDataAttributeParsed);
14
14
  // We don't have a data attribute
15
15
  if (!userActionName) {
16
16
  return;
17
17
  }
18
- var userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });
18
+ const userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });
19
19
  if (userAction) {
20
20
  processUserActionStarted(userAction);
21
21
  }
22
22
  }
23
23
  function processUserActionStarted(userAction) {
24
- var internalUserAction = userAction;
24
+ const internalUserAction = userAction;
25
25
  new userActionController_1.UserActionController(internalUserAction).attach();
26
26
  }
27
- return { processUserEvent: processUserEvent, processUserActionStarted: processUserActionStarted };
27
+ return { processUserEvent, processUserActionStarted };
28
28
  }
29
29
  function getUserActionNameFromElement(element, dataAttributeName) {
30
- var parsedDataAttributeName = (0, util_1.convertDataAttributeName)(dataAttributeName);
31
- var dataset = element.dataset;
32
- for (var key in dataset) {
30
+ const parsedDataAttributeName = (0, util_1.convertDataAttributeName)(dataAttributeName);
31
+ const dataset = element.dataset;
32
+ for (const key in dataset) {
33
33
  if (key === parsedDataAttributeName) {
34
34
  return dataset[key];
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":";;AAMA,kDA0BC;AAED,oEAWC;AAED,wDAEC;AA/CD,iCAAmF;AACnF,+DAA8D;AAC9D,+BAAkD;AAElD,SAAgB,mBAAmB,CAAC,IAAU;IACpC,IAAA,GAAG,GAAa,IAAI,IAAjB,EAAE,MAAM,GAAK,IAAI,OAAT,CAAU;IAE7B,SAAS,gBAAgB,CAAC,KAAmC;;QAC3D,IAAM,cAAc,GAAG,4BAA4B,CACjD,KAAK,CAAC,MAAqB,EAC3B,MAAA,MAAA,MAAM,CAAC,0BAA0B,0CAAE,iBAAiB,mCAAI,qCAAuB,CAChF,CAAC;QAEF,iCAAiC;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACxF,IAAI,UAAU,EAAE,CAAC;YACf,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,SAAS,wBAAwB,CAAC,UAA+B;QAC/D,IAAM,kBAAkB,GAAG,UAAoD,CAAC;QAChF,IAAI,2CAAoB,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,gBAAgB,kBAAA,EAAE,wBAAwB,0BAAA,EAAE,CAAC;AACxD,CAAC;AAED,SAAgB,4BAA4B,CAAC,OAAoB,EAAE,iBAAyB;IAC1F,IAAM,uBAAuB,GAAG,IAAA,+BAAwB,EAAC,iBAAiB,CAAC,CAAC;IAC5E,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,KAAK,IAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,sBAAsB,CAAC,cAAwC;IAC7E,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,EAAE,CAAC;AAChC,CAAC","sourcesContent":["import type { Faro, Subscription, UserActionInterface, UserActionInternalInterface } from '@grafana/faro-core';\n\nimport { userActionDataAttributeParsed as userActionDataAttribute } from './const';\nimport { UserActionController } from './userActionController';\nimport { convertDataAttributeName } from './util';\n\nexport function getUserEventHandler(faro: Faro) {\n const { api, config } = faro;\n\n function processUserEvent(event: PointerEvent | KeyboardEvent) {\n const userActionName = getUserActionNameFromElement(\n event.target as HTMLElement,\n config.userActionsInstrumentation?.dataAttributeName ?? userActionDataAttribute\n );\n\n // We don't have a data attribute\n if (!userActionName) {\n return;\n }\n\n const userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });\n if (userAction) {\n processUserActionStarted(userAction);\n }\n }\n\n function processUserActionStarted(userAction: UserActionInterface) {\n const internalUserAction = userAction as unknown as UserActionInternalInterface;\n new UserActionController(internalUserAction).attach();\n }\n\n return { processUserEvent, processUserActionStarted };\n}\n\nexport function getUserActionNameFromElement(element: HTMLElement, dataAttributeName: string): string | undefined {\n const parsedDataAttributeName = convertDataAttributeName(dataAttributeName);\n const dataset = element.dataset;\n\n for (const key in dataset) {\n if (key === parsedDataAttributeName) {\n return dataset[key];\n }\n }\n\n return undefined;\n}\n\nexport function unsubscribeAllMonitors(allMonitorsSub: Subscription | undefined) {\n allMonitorsSub?.unsubscribe();\n}\n"]}
1
+ {"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":";;AAMA,kDA0BC;AAED,oEAWC;AAED,wDAEC;AA/CD,mCAAmF;AACnF,iEAA8D;AAC9D,iCAAkD;AAElD,SAAgB,mBAAmB,CAAC,IAAU;IAC5C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,SAAS,gBAAgB,CAAC,KAAmC;;QAC3D,MAAM,cAAc,GAAG,4BAA4B,CACjD,KAAK,CAAC,MAAqB,EAC3B,MAAA,MAAA,MAAM,CAAC,0BAA0B,0CAAE,iBAAiB,mCAAI,qCAAuB,CAChF,CAAC;QAEF,iCAAiC;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACxF,IAAI,UAAU,EAAE,CAAC;YACf,wBAAwB,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,SAAS,wBAAwB,CAAC,UAA+B;QAC/D,MAAM,kBAAkB,GAAG,UAAoD,CAAC;QAChF,IAAI,2CAAoB,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;AACxD,CAAC;AAED,SAAgB,4BAA4B,CAAC,OAAoB,EAAE,iBAAyB;IAC1F,MAAM,uBAAuB,GAAG,IAAA,+BAAwB,EAAC,iBAAiB,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,sBAAsB,CAAC,cAAwC;IAC7E,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,EAAE,CAAC;AAChC,CAAC","sourcesContent":["import type { Faro, Subscription, UserActionInterface, UserActionInternalInterface } from '@grafana/faro-core';\n\nimport { userActionDataAttributeParsed as userActionDataAttribute } from './const';\nimport { UserActionController } from './userActionController';\nimport { convertDataAttributeName } from './util';\n\nexport function getUserEventHandler(faro: Faro) {\n const { api, config } = faro;\n\n function processUserEvent(event: PointerEvent | KeyboardEvent) {\n const userActionName = getUserActionNameFromElement(\n event.target as HTMLElement,\n config.userActionsInstrumentation?.dataAttributeName ?? userActionDataAttribute\n );\n\n // We don't have a data attribute\n if (!userActionName) {\n return;\n }\n\n const userAction = api.startUserAction(userActionName, {}, { triggerName: event.type });\n if (userAction) {\n processUserActionStarted(userAction);\n }\n }\n\n function processUserActionStarted(userAction: UserActionInterface) {\n const internalUserAction = userAction as unknown as UserActionInternalInterface;\n new UserActionController(internalUserAction).attach();\n }\n\n return { processUserEvent, processUserActionStarted };\n}\n\nexport function getUserActionNameFromElement(element: HTMLElement, dataAttributeName: string): string | undefined {\n const parsedDataAttributeName = convertDataAttributeName(dataAttributeName);\n const dataset = element.dataset;\n\n for (const key in dataset) {\n if (key === parsedDataAttributeName) {\n return dataset[key];\n }\n }\n\n return undefined;\n}\n\nexport function unsubscribeAllMonitors(allMonitorsSub: Subscription | undefined) {\n allMonitorsSub?.unsubscribe();\n}\n"]}
@@ -2,15 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UserActionController = void 0;
4
4
  // packages/web-sdk/src/instrumentations/userActions/userActionController.ts
5
- var faro_core_1 = require("@grafana/faro-core");
6
- var domMutationMonitor_1 = require("../_internal/monitors/domMutationMonitor");
7
- var httpRequestMonitor_1 = require("../_internal/monitors/httpRequestMonitor");
8
- var performanceEntriesMonitor_1 = require("../_internal/monitors/performanceEntriesMonitor");
9
- var util_1 = require("./util");
10
- var defaultFollowUpActionTimeRange = 100;
11
- var defaultHaltTimeout = 10 * 1000;
12
- var UserActionController = /** @class */ (function () {
13
- function UserActionController(userAction) {
5
+ const faro_core_1 = require("@grafana/faro-core");
6
+ const domMutationMonitor_1 = require("../_internal/monitors/domMutationMonitor");
7
+ const httpRequestMonitor_1 = require("../_internal/monitors/httpRequestMonitor");
8
+ const performanceEntriesMonitor_1 = require("../_internal/monitors/performanceEntriesMonitor");
9
+ const util_1 = require("./util");
10
+ const defaultFollowUpActionTimeRange = 100;
11
+ const defaultHaltTimeout = 10 * 1000;
12
+ class UserActionController {
13
+ constructor(userAction) {
14
14
  this.userAction = userAction;
15
15
  this.http = (0, httpRequestMonitor_1.monitorHttpRequests)();
16
16
  this.dom = (0, domMutationMonitor_1.monitorDomMutations)();
@@ -18,93 +18,90 @@ var UserActionController = /** @class */ (function () {
18
18
  this.isValid = false;
19
19
  this.runningRequests = new Map();
20
20
  }
21
- UserActionController.prototype.attach = function () {
22
- var _this = this;
21
+ attach() {
23
22
  // Subscribe to monitors while action is active/halting
24
23
  this.allMonitorsSub = new faro_core_1.Observable()
25
24
  .merge(this.http, this.dom, this.perf)
26
- .takeWhile(function () { return [faro_core_1.UserActionState.Started, faro_core_1.UserActionState.Halted].includes(_this.userAction.getState()); })
27
- .filter(function (msg) {
25
+ .takeWhile(() => [faro_core_1.UserActionState.Started, faro_core_1.UserActionState.Halted].includes(this.userAction.getState()))
26
+ .filter((msg) => {
28
27
  // If the user action is in halt state, we only keep listening to ended http requests
29
- if (_this.userAction.getState() === faro_core_1.UserActionState.Halted &&
30
- !((0, util_1.isRequestEndMessage)(msg) && _this.runningRequests.has(msg.request.requestId))) {
28
+ if (this.userAction.getState() === faro_core_1.UserActionState.Halted &&
29
+ !((0, util_1.isRequestEndMessage)(msg) && this.runningRequests.has(msg.request.requestId))) {
31
30
  return false;
32
31
  }
33
32
  return true;
34
33
  })
35
- .subscribe(function (msg) {
34
+ .subscribe((msg) => {
36
35
  if ((0, util_1.isRequestStartMessage)(msg)) {
37
36
  // An action is on halt if it has pending items, like pending HTTP requests.
38
37
  // In this case we start a separate timeout to wait for the requests to finish
39
38
  // If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)
40
39
  // But we are still subscribed to
41
- _this.runningRequests.set(msg.request.requestId, msg.request);
40
+ this.runningRequests.set(msg.request.requestId, msg.request);
42
41
  }
43
42
  if ((0, util_1.isRequestEndMessage)(msg)) {
44
- _this.runningRequests.delete(msg.request.requestId);
43
+ this.runningRequests.delete(msg.request.requestId);
45
44
  }
46
45
  if (!(0, util_1.isRequestEndMessage)(msg)) {
47
- if (!_this.isValid) {
48
- _this.isValid = true;
46
+ if (!this.isValid) {
47
+ this.isValid = true;
49
48
  }
50
- _this.scheduleFollowUp();
49
+ this.scheduleFollowUp();
51
50
  }
52
- else if (_this.userAction.getState() === faro_core_1.UserActionState.Halted && _this.runningRequests.size === 0) {
53
- _this.endAction();
51
+ else if (this.userAction.getState() === faro_core_1.UserActionState.Halted && this.runningRequests.size === 0) {
52
+ this.endAction();
54
53
  }
55
54
  });
56
55
  // When UA ends or cancels, cleanup timers/subscriptions
57
56
  this.stateSub = this.userAction
58
- .filter(function (s) { return [faro_core_1.UserActionState.Ended, faro_core_1.UserActionState.Cancelled].includes(s); })
57
+ .filter((s) => [faro_core_1.UserActionState.Ended, faro_core_1.UserActionState.Cancelled].includes(s))
59
58
  .first()
60
- .subscribe(function () { return _this.cleanup(); });
59
+ .subscribe(() => this.cleanup());
61
60
  // initial follow-up window in case nothing else happens
62
61
  this.scheduleFollowUp();
63
- };
64
- UserActionController.prototype.scheduleFollowUp = function () {
65
- var _this = this;
62
+ }
63
+ scheduleFollowUp() {
66
64
  this.clearTimer(this.followUpTid);
67
- this.followUpTid = setTimeout(function () {
65
+ this.followUpTid = setTimeout(() => {
68
66
  // If action just started and there's pending work, go to halted
69
- if (_this.userAction.getState() === faro_core_1.UserActionState.Started && _this.runningRequests.size > 0) {
70
- _this.haltAction();
67
+ if (this.userAction.getState() === faro_core_1.UserActionState.Started && this.runningRequests.size > 0) {
68
+ this.haltAction();
71
69
  return;
72
70
  }
73
71
  // If we saw any relevant activity in the window, finish as ended
74
- if (_this.isValid) {
75
- _this.endAction();
72
+ if (this.isValid) {
73
+ this.endAction();
76
74
  return;
77
75
  }
78
76
  // Otherwise, no signals => cancel
79
- _this.cancelAction();
77
+ this.cancelAction();
80
78
  }, defaultFollowUpActionTimeRange);
81
- };
82
- UserActionController.prototype.haltAction = function () {
79
+ }
80
+ haltAction() {
83
81
  if (this.userAction.getState() !== faro_core_1.UserActionState.Started) {
84
82
  return;
85
83
  }
86
84
  this.userAction.halt();
87
85
  this.startHaltTimeout();
88
- };
89
- UserActionController.prototype.startHaltTimeout = function () {
90
- var _this = this;
86
+ }
87
+ startHaltTimeout() {
91
88
  this.clearTimer(this.haltTid);
92
- this.haltTid = (0, util_1.startTimeout)(this.haltTid, function () {
89
+ this.haltTid = (0, util_1.startTimeout)(this.haltTid, () => {
93
90
  // If still halted after timeout, end
94
- if (_this.userAction.getState() === faro_core_1.UserActionState.Halted) {
95
- _this.endAction();
91
+ if (this.userAction.getState() === faro_core_1.UserActionState.Halted) {
92
+ this.endAction();
96
93
  }
97
94
  }, defaultHaltTimeout);
98
- };
99
- UserActionController.prototype.endAction = function () {
95
+ }
96
+ endAction() {
100
97
  this.userAction.end();
101
98
  this.cleanup();
102
- };
103
- UserActionController.prototype.cancelAction = function () {
99
+ }
100
+ cancelAction() {
104
101
  this.userAction.cancel();
105
102
  this.cleanup();
106
- };
107
- UserActionController.prototype.cleanup = function () {
103
+ }
104
+ cleanup() {
108
105
  var _a, _b;
109
106
  this.clearTimer(this.followUpTid);
110
107
  this.clearTimer(this.haltTid);
@@ -113,13 +110,12 @@ var UserActionController = /** @class */ (function () {
113
110
  this.allMonitorsSub = undefined;
114
111
  this.stateSub = undefined;
115
112
  this.runningRequests.clear();
116
- };
117
- UserActionController.prototype.clearTimer = function (id) {
113
+ }
114
+ clearTimer(id) {
118
115
  if (id) {
119
116
  clearTimeout(id);
120
117
  }
121
- };
122
- return UserActionController;
123
- }());
118
+ }
119
+ }
124
120
  exports.UserActionController = UserActionController;
125
121
  //# sourceMappingURL=userActionController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"userActionController.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/userActionController.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/web-sdk/src/instrumentations/userActions/userActionController.ts\nimport { Observable, UserActionState } from '@grafana/faro-core';\nimport type { Subscription, UserActionInternalInterface } from '@grafana/faro-core';\n\nimport { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';\nimport { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';\nimport { monitorPerformanceEntries } from '../_internal/monitors/performanceEntriesMonitor';\nimport type { HttpRequestMessagePayload } from '../_internal/monitors/types';\n\nimport { isRequestEndMessage, isRequestStartMessage, startTimeout } from './util';\n\nconst defaultFollowUpActionTimeRange = 100;\nconst defaultHaltTimeout = 10 * 1000;\n\nexport class UserActionController {\n private readonly http = monitorHttpRequests();\n private readonly dom = monitorDomMutations();\n private readonly perf = monitorPerformanceEntries();\n\n private allMonitorsSub?: Subscription;\n private stateSub?: Subscription;\n private followUpTid?: number;\n private haltTid?: number;\n\n private isValid = false;\n private runningRequests = new Map<string, HttpRequestMessagePayload>();\n\n constructor(private userAction: UserActionInternalInterface) {}\n\n attach(): void {\n // Subscribe to monitors while action is active/halting\n this.allMonitorsSub = new Observable()\n .merge(this.http, this.dom, this.perf)\n .takeWhile(() => [UserActionState.Started, UserActionState.Halted].includes(this.userAction.getState()))\n .filter((msg) => {\n // If the user action is in halt state, we only keep listening to ended http requests\n if (\n this.userAction.getState() === UserActionState.Halted &&\n !(isRequestEndMessage(msg) && this.runningRequests.has(msg.request.requestId))\n ) {\n return false;\n }\n\n return true;\n })\n .subscribe((msg) => {\n if (isRequestStartMessage(msg)) {\n // An action is on halt if it has pending items, like pending HTTP requests.\n // In this case we start a separate timeout to wait for the requests to finish\n // If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)\n // But we are still subscribed to\n this.runningRequests.set(msg.request.requestId, msg.request);\n }\n\n if (isRequestEndMessage(msg)) {\n this.runningRequests.delete(msg.request.requestId);\n }\n\n if (!isRequestEndMessage(msg)) {\n if (!this.isValid) {\n this.isValid = true;\n }\n this.scheduleFollowUp();\n } else if (this.userAction.getState() === UserActionState.Halted && this.runningRequests.size === 0) {\n this.endAction();\n }\n });\n\n // When UA ends or cancels, cleanup timers/subscriptions\n this.stateSub = (this.userAction as unknown as Observable)\n .filter((s: UserActionState) => [UserActionState.Ended, UserActionState.Cancelled].includes(s))\n .first()\n .subscribe(() => this.cleanup());\n\n // initial follow-up window in case nothing else happens\n this.scheduleFollowUp();\n }\n\n private scheduleFollowUp() {\n this.clearTimer(this.followUpTid);\n this.followUpTid = setTimeout(() => {\n // If action just started and there's pending work, go to halted\n if (this.userAction.getState() === UserActionState.Started && this.runningRequests.size > 0) {\n this.haltAction();\n return;\n }\n\n // If we saw any relevant activity in the window, finish as ended\n if (this.isValid) {\n this.endAction();\n return;\n }\n\n // Otherwise, no signals => cancel\n this.cancelAction();\n }, defaultFollowUpActionTimeRange) as any;\n }\n\n private haltAction() {\n if (this.userAction.getState() !== UserActionState.Started) {\n return;\n }\n this.userAction.halt();\n this.startHaltTimeout();\n }\n\n private startHaltTimeout() {\n this.clearTimer(this.haltTid);\n this.haltTid = startTimeout(\n this.haltTid,\n () => {\n // If still halted after timeout, end\n if (this.userAction.getState() === UserActionState.Halted) {\n this.endAction();\n }\n },\n defaultHaltTimeout\n ) as any;\n }\n\n private endAction() {\n this.userAction.end();\n this.cleanup();\n }\n\n private cancelAction() {\n this.userAction.cancel();\n this.cleanup();\n }\n\n private cleanup() {\n this.clearTimer(this.followUpTid);\n this.clearTimer(this.haltTid);\n this.allMonitorsSub?.unsubscribe();\n this.stateSub?.unsubscribe();\n this.allMonitorsSub = undefined;\n this.stateSub = undefined;\n this.runningRequests.clear();\n }\n\n private clearTimer(id?: number) {\n if (id) {\n clearTimeout(id);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"userActionController.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/userActionController.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/web-sdk/src/instrumentations/userActions/userActionController.ts\nimport { Observable, UserActionState } from '@grafana/faro-core';\nimport type { Subscription, UserActionInternalInterface } from '@grafana/faro-core';\n\nimport { monitorDomMutations } from '../_internal/monitors/domMutationMonitor';\nimport { monitorHttpRequests } from '../_internal/monitors/httpRequestMonitor';\nimport { monitorPerformanceEntries } from '../_internal/monitors/performanceEntriesMonitor';\nimport type { HttpRequestMessagePayload } from '../_internal/monitors/types';\n\nimport { isRequestEndMessage, isRequestStartMessage, startTimeout } from './util';\n\nconst defaultFollowUpActionTimeRange = 100;\nconst defaultHaltTimeout = 10 * 1000;\n\nexport class UserActionController {\n private readonly http = monitorHttpRequests();\n private readonly dom = monitorDomMutations();\n private readonly perf = monitorPerformanceEntries();\n\n private allMonitorsSub?: Subscription;\n private stateSub?: Subscription;\n private followUpTid?: number;\n private haltTid?: number;\n\n private isValid = false;\n private runningRequests = new Map<string, HttpRequestMessagePayload>();\n\n constructor(private userAction: UserActionInternalInterface) {}\n\n attach(): void {\n // Subscribe to monitors while action is active/halting\n this.allMonitorsSub = new Observable()\n .merge(this.http, this.dom, this.perf)\n .takeWhile(() => [UserActionState.Started, UserActionState.Halted].includes(this.userAction.getState()))\n .filter((msg) => {\n // If the user action is in halt state, we only keep listening to ended http requests\n if (\n this.userAction.getState() === UserActionState.Halted &&\n !(isRequestEndMessage(msg) && this.runningRequests.has(msg.request.requestId))\n ) {\n return false;\n }\n\n return true;\n })\n .subscribe((msg) => {\n if (isRequestStartMessage(msg)) {\n // An action is on halt if it has pending items, like pending HTTP requests.\n // In this case we start a separate timeout to wait for the requests to finish\n // If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)\n // But we are still subscribed to\n this.runningRequests.set(msg.request.requestId, msg.request);\n }\n\n if (isRequestEndMessage(msg)) {\n this.runningRequests.delete(msg.request.requestId);\n }\n\n if (!isRequestEndMessage(msg)) {\n if (!this.isValid) {\n this.isValid = true;\n }\n this.scheduleFollowUp();\n } else if (this.userAction.getState() === UserActionState.Halted && this.runningRequests.size === 0) {\n this.endAction();\n }\n });\n\n // When UA ends or cancels, cleanup timers/subscriptions\n this.stateSub = (this.userAction as unknown as Observable)\n .filter((s: UserActionState) => [UserActionState.Ended, UserActionState.Cancelled].includes(s))\n .first()\n .subscribe(() => this.cleanup());\n\n // initial follow-up window in case nothing else happens\n this.scheduleFollowUp();\n }\n\n private scheduleFollowUp() {\n this.clearTimer(this.followUpTid);\n this.followUpTid = setTimeout(() => {\n // If action just started and there's pending work, go to halted\n if (this.userAction.getState() === UserActionState.Started && this.runningRequests.size > 0) {\n this.haltAction();\n return;\n }\n\n // If we saw any relevant activity in the window, finish as ended\n if (this.isValid) {\n this.endAction();\n return;\n }\n\n // Otherwise, no signals => cancel\n this.cancelAction();\n }, defaultFollowUpActionTimeRange) as any;\n }\n\n private haltAction() {\n if (this.userAction.getState() !== UserActionState.Started) {\n return;\n }\n this.userAction.halt();\n this.startHaltTimeout();\n }\n\n private startHaltTimeout() {\n this.clearTimer(this.haltTid);\n this.haltTid = startTimeout(\n this.haltTid,\n () => {\n // If still halted after timeout, end\n if (this.userAction.getState() === UserActionState.Halted) {\n this.endAction();\n }\n },\n defaultHaltTimeout\n ) as any;\n }\n\n private endAction() {\n this.userAction.end();\n this.cleanup();\n }\n\n private cancelAction() {\n this.userAction.cancel();\n this.cleanup();\n }\n\n private cleanup() {\n this.clearTimer(this.followUpTid);\n this.clearTimer(this.haltTid);\n this.allMonitorsSub?.unsubscribe();\n this.stateSub?.unsubscribe();\n this.allMonitorsSub = undefined;\n this.stateSub = undefined;\n this.runningRequests.clear();\n }\n\n private clearTimer(id?: number) {\n if (id) {\n clearTimeout(id);\n }\n }\n}\n"]}