@grafana/faro-web-sdk 1.14.2 → 1.15.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 (163) hide show
  1. package/dist/bundle/faro-web-sdk.iife.js +1 -1
  2. package/dist/bundle/types/index.d.ts +2 -2
  3. package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
  4. package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
  5. package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
  6. package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
  7. package/dist/bundle/types/instrumentations/session/sessionManager/sessionManagerUtils.d.ts +1 -1
  8. package/dist/bundle/types/instrumentations/userActions/const.d.ts +0 -1
  9. package/dist/bundle/types/instrumentations/userActions/httpRequestMonitor.d.ts +2 -1
  10. package/dist/bundle/types/instrumentations/userActions/index.d.ts +1 -1
  11. package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
  12. package/dist/bundle/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -1
  13. package/dist/bundle/types/instrumentations/userActions/types.d.ts +10 -2
  14. package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
  15. package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  16. package/dist/bundle/types/instrumentations/webVitals/webVitalsBasic.d.ts +8 -10
  17. package/dist/bundle/types/instrumentations/webVitals/webVitalsWithAttribution.d.ts +2 -4
  18. package/dist/bundle/types/transports/console/transport.d.ts +1 -1
  19. package/dist/bundle/types/transports/fetch/transport.d.ts +3 -3
  20. package/dist/bundle/types/utils/index.d.ts +1 -1
  21. package/dist/bundle/types/utils/url.d.ts +8 -0
  22. package/dist/cjs/config/getWebInstrumentations.js +1 -2
  23. package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
  24. package/dist/cjs/config/makeCoreConfig.js +1 -2
  25. package/dist/cjs/config/makeCoreConfig.js.map +1 -1
  26. package/dist/cjs/index.js +5 -5
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/initialize.js +1 -2
  29. package/dist/cjs/initialize.js.map +1 -1
  30. package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
  31. package/dist/cjs/instrumentations/errors/getErrorDetails.js +3 -4
  32. package/dist/cjs/instrumentations/errors/getErrorDetails.js.map +1 -1
  33. package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js +1 -2
  34. package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js.map +1 -1
  35. package/dist/cjs/instrumentations/errors/instrumentation.js.map +1 -1
  36. package/dist/cjs/instrumentations/errors/registerOnerror.js +1 -2
  37. package/dist/cjs/instrumentations/errors/registerOnerror.js.map +1 -1
  38. package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +1 -2
  39. package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
  40. package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js +1 -2
  41. package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
  42. package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js +1 -2
  43. package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
  44. package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js +1 -2
  45. package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
  46. package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js +1 -2
  47. package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js.map +1 -1
  48. package/dist/cjs/instrumentations/performance/instrumentation.js +2 -2
  49. package/dist/cjs/instrumentations/performance/instrumentation.js.map +1 -1
  50. package/dist/cjs/instrumentations/performance/navigation.js +1 -2
  51. package/dist/cjs/instrumentations/performance/navigation.js.map +1 -1
  52. package/dist/cjs/instrumentations/performance/performanceUtils.js +7 -10
  53. package/dist/cjs/instrumentations/performance/performanceUtils.js.map +1 -1
  54. package/dist/cjs/instrumentations/performance/resource.js +1 -2
  55. package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
  56. package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
  57. package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
  58. package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
  59. package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js +1 -2
  60. package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js.map +1 -1
  61. package/dist/cjs/instrumentations/session/sessionManager/sampling.js +1 -2
  62. package/dist/cjs/instrumentations/session/sessionManager/sampling.js.map +1 -1
  63. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +5 -6
  64. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
  65. package/dist/cjs/instrumentations/userActions/const.js +1 -2
  66. package/dist/cjs/instrumentations/userActions/const.js.map +1 -1
  67. package/dist/cjs/instrumentations/userActions/domMutationMonitor.js +1 -2
  68. package/dist/cjs/instrumentations/userActions/domMutationMonitor.js.map +1 -1
  69. package/dist/cjs/instrumentations/userActions/httpRequestMonitor.js +56 -47
  70. package/dist/cjs/instrumentations/userActions/httpRequestMonitor.js.map +1 -1
  71. package/dist/cjs/instrumentations/userActions/index.js.map +1 -1
  72. package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
  73. package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js +1 -2
  74. package/dist/cjs/instrumentations/userActions/performanceEntriesMonitor.js.map +1 -1
  75. package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +104 -59
  76. package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
  77. package/dist/cjs/instrumentations/userActions/types.js.map +1 -1
  78. package/dist/cjs/instrumentations/userActions/util.js +1 -2
  79. package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
  80. package/dist/cjs/instrumentations/view/instrumentation.js.map +1 -1
  81. package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
  82. package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
  83. package/dist/cjs/metas/browser/meta.js.map +1 -1
  84. package/dist/cjs/metas/page/meta.js +1 -2
  85. package/dist/cjs/metas/page/meta.js.map +1 -1
  86. package/dist/cjs/metas/session/createSession.js +1 -2
  87. package/dist/cjs/metas/session/createSession.js.map +1 -1
  88. package/dist/cjs/transports/console/transport.js.map +1 -1
  89. package/dist/cjs/transports/fetch/transport.js +3 -4
  90. package/dist/cjs/transports/fetch/transport.js.map +1 -1
  91. package/dist/cjs/utils/index.js +2 -1
  92. package/dist/cjs/utils/index.js.map +1 -1
  93. package/dist/cjs/utils/throttle.js +1 -2
  94. package/dist/cjs/utils/throttle.js.map +1 -1
  95. package/dist/cjs/utils/url.js +22 -3
  96. package/dist/cjs/utils/url.js.map +1 -1
  97. package/dist/cjs/utils/webStorage.js +5 -5
  98. package/dist/cjs/utils/webStorage.js.map +1 -1
  99. package/dist/esm/config/getWebInstrumentations.js.map +1 -1
  100. package/dist/esm/config/makeCoreConfig.js.map +1 -1
  101. package/dist/esm/index.js +2 -2
  102. package/dist/esm/index.js.map +1 -1
  103. package/dist/esm/initialize.js.map +1 -1
  104. package/dist/esm/instrumentations/console/instrumentation.js.map +1 -1
  105. package/dist/esm/instrumentations/errors/getErrorDetails.js.map +1 -1
  106. package/dist/esm/instrumentations/errors/registerOnerror.js.map +1 -1
  107. package/dist/esm/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
  108. package/dist/esm/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
  109. package/dist/esm/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
  110. package/dist/esm/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
  111. package/dist/esm/instrumentations/performance/instrumentation.js.map +1 -1
  112. package/dist/esm/instrumentations/performance/navigation.js.map +1 -1
  113. package/dist/esm/instrumentations/performance/performanceUtils.js +1 -3
  114. package/dist/esm/instrumentations/performance/performanceUtils.js.map +1 -1
  115. package/dist/esm/instrumentations/performance/resource.js.map +1 -1
  116. package/dist/esm/instrumentations/session/instrumentation.js.map +1 -1
  117. package/dist/esm/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
  118. package/dist/esm/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
  119. package/dist/esm/instrumentations/session/sessionManager/sampling.js.map +1 -1
  120. package/dist/esm/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
  121. package/dist/esm/instrumentations/userActions/const.js +0 -1
  122. package/dist/esm/instrumentations/userActions/const.js.map +1 -1
  123. package/dist/esm/instrumentations/userActions/httpRequestMonitor.js +56 -48
  124. package/dist/esm/instrumentations/userActions/httpRequestMonitor.js.map +1 -1
  125. package/dist/esm/instrumentations/userActions/index.js.map +1 -1
  126. package/dist/esm/instrumentations/userActions/performanceEntriesMonitor.js.map +1 -1
  127. package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js +105 -59
  128. package/dist/esm/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
  129. package/dist/esm/instrumentations/userActions/types.js.map +1 -1
  130. package/dist/esm/instrumentations/view/instrumentation.js.map +1 -1
  131. package/dist/esm/instrumentations/webVitals/instrumentation.js.map +1 -1
  132. package/dist/esm/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
  133. package/dist/esm/metas/browser/meta.js.map +1 -1
  134. package/dist/esm/metas/page/meta.js.map +1 -1
  135. package/dist/esm/transports/fetch/transport.js +1 -1
  136. package/dist/esm/transports/fetch/transport.js.map +1 -1
  137. package/dist/esm/utils/index.js +1 -1
  138. package/dist/esm/utils/index.js.map +1 -1
  139. package/dist/esm/utils/throttle.js.map +1 -1
  140. package/dist/esm/utils/url.js +20 -1
  141. package/dist/esm/utils/url.js.map +1 -1
  142. package/dist/esm/utils/webStorage.js.map +1 -1
  143. package/dist/types/index.d.ts +2 -2
  144. package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
  145. package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
  146. package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
  147. package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
  148. package/dist/types/instrumentations/session/sessionManager/sessionManagerUtils.d.ts +1 -1
  149. package/dist/types/instrumentations/userActions/const.d.ts +0 -1
  150. package/dist/types/instrumentations/userActions/httpRequestMonitor.d.ts +2 -1
  151. package/dist/types/instrumentations/userActions/index.d.ts +1 -1
  152. package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
  153. package/dist/types/instrumentations/userActions/processUserActionEventHandler.d.ts +1 -1
  154. package/dist/types/instrumentations/userActions/types.d.ts +10 -2
  155. package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
  156. package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  157. package/dist/types/instrumentations/webVitals/webVitalsBasic.d.ts +8 -10
  158. package/dist/types/instrumentations/webVitals/webVitalsWithAttribution.d.ts +2 -4
  159. package/dist/types/transports/console/transport.d.ts +1 -1
  160. package/dist/types/transports/fetch/transport.d.ts +3 -3
  161. package/dist/types/utils/index.d.ts +1 -1
  162. package/dist/types/utils/url.d.ts +8 -0
  163. package/package.json +3 -3
@@ -1,88 +1,97 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.monitorHttpRequests = void 0;
3
+ exports.monitorHttpRequests = monitorHttpRequests;
4
4
  var faro_core_1 = require("@grafana/faro-core");
5
5
  var url_1 = require("../../utils/url");
6
6
  var const_1 = require("./const");
7
+ var apiTypeFetch = 'fetch';
8
+ var apiTypeXhr = 'xhr';
7
9
  /**
8
10
  * Monitors if any http requests are in progress.
9
11
  */
10
12
  function monitorHttpRequests() {
11
13
  var observable = new faro_core_1.Observable();
12
- var pendingXhrRequests = 0;
13
- var pendingFetchRequests = 0;
14
- function emitStartMessage() {
15
- observable.notify({ type: const_1.MESSAGE_TYPE_HTTP_REQUEST_START, pending: pendingXhrRequests + pendingFetchRequests });
14
+ function emitStartMessage(requestProps) {
15
+ observable.notify({
16
+ type: const_1.MESSAGE_TYPE_HTTP_REQUEST_START,
17
+ request: requestProps,
18
+ });
16
19
  }
17
- function emitEndMessage() {
18
- observable.notify({ type: const_1.MESSAGE_TYPE_HTTP_REQUEST_END, pending: pendingXhrRequests + pendingFetchRequests });
20
+ function emitEndMessage(requestProps) {
21
+ observable.notify({
22
+ type: const_1.MESSAGE_TYPE_HTTP_REQUEST_END,
23
+ request: requestProps,
24
+ });
19
25
  }
20
- monitorFetch(function () {
21
- pendingFetchRequests++;
22
- emitStartMessage();
23
- }, function () {
24
- pendingFetchRequests--;
25
- emitEndMessage();
26
+ monitorFetch({
27
+ onRequestStart: emitStartMessage,
28
+ onRequestEnd: emitEndMessage,
26
29
  });
27
- monitorXhr(function () {
28
- pendingXhrRequests++;
29
- emitStartMessage();
30
- }, function () {
31
- pendingXhrRequests--;
32
- emitEndMessage();
30
+ monitorXhr({
31
+ onRequestStart: emitStartMessage,
32
+ onRequestEnd: emitEndMessage,
33
33
  });
34
34
  return observable;
35
35
  }
36
- exports.monitorHttpRequests = monitorHttpRequests;
37
- function monitorXhr(onRequestStart, onRequestEnd) {
36
+ function monitorXhr(_a) {
37
+ var onRequestStart = _a.onRequestStart, onRequestEnd = _a.onRequestEnd;
38
38
  var originalOpen = XMLHttpRequest.prototype.open;
39
- var originalSend = XMLHttpRequest.prototype.send;
40
39
  XMLHttpRequest.prototype.open = function () {
41
40
  var url = arguments[1];
42
41
  var isIgnoredUrl = (0, url_1.isUrlIgnored)(url);
42
+ var method = arguments[0];
43
+ var requestId = (0, faro_core_1.genShortID)();
44
+ // request has started to load data.
43
45
  this.addEventListener('loadstart', function () {
44
46
  if (!isIgnoredUrl) {
45
- onRequestStart();
47
+ onRequestStart({ url: url, method: method, requestId: requestId, apiType: apiTypeXhr });
46
48
  }
47
49
  });
48
- this.addEventListener('loadend', function () {
50
+ // transaction completes successfully.
51
+ this.addEventListener('load', function () {
49
52
  if (!isIgnoredUrl) {
50
- onRequestEnd();
53
+ onRequestEnd({ url: url, method: method, requestId: requestId, apiType: apiTypeXhr });
54
+ }
55
+ });
56
+ this.addEventListener('error', function () {
57
+ if (!isIgnoredUrl) {
58
+ onRequestEnd({ url: url, method: method, requestId: requestId, apiType: apiTypeXhr });
59
+ }
60
+ });
61
+ this.addEventListener('abort', function () {
62
+ if (!isIgnoredUrl) {
63
+ onRequestEnd({ url: url, method: method, requestId: requestId, apiType: apiTypeXhr });
51
64
  }
52
65
  });
53
66
  originalOpen.apply(this, arguments);
54
67
  };
55
- XMLHttpRequest.prototype.send = function () {
56
- originalSend.apply(this, arguments);
57
- };
58
68
  }
59
- function monitorFetch(onRequestsStart, onRequestEnd) {
69
+ function monitorFetch(_a) {
70
+ var onRequestEnd = _a.onRequestEnd, onRequestStart = _a.onRequestStart;
60
71
  var originalFetch = window.fetch;
61
72
  window.fetch = function () {
62
- var url = getUrlFromResource(arguments[0]);
73
+ var _a, _b;
74
+ var url = (_a = (0, url_1.getUrlFromResource)(arguments[0])) !== null && _a !== void 0 ? _a : '';
63
75
  var isIgnoredUrl = (0, url_1.isUrlIgnored)(url);
64
- // fetch started
76
+ var method = ((_b = arguments[1]) !== null && _b !== void 0 ? _b : {}).method;
77
+ var requestId = (0, faro_core_1.genShortID)();
65
78
  if (!isIgnoredUrl) {
66
- onRequestsStart();
79
+ onRequestStart({ url: url, method: method, requestId: requestId, apiType: apiTypeFetch });
67
80
  }
68
- return originalFetch.apply(this, arguments).finally(function () {
69
- // fetch ended
81
+ return originalFetch
82
+ .apply(this, arguments)
83
+ .then(function (response) {
84
+ if (!isIgnoredUrl) {
85
+ onRequestEnd({ url: url, method: method, requestId: requestId, apiType: apiTypeFetch });
86
+ }
87
+ return response;
88
+ })
89
+ .catch(function (error) {
70
90
  if (!isIgnoredUrl) {
71
- onRequestEnd();
91
+ onRequestEnd({ url: url, method: method, requestId: requestId, apiType: apiTypeFetch });
72
92
  }
93
+ throw error;
73
94
  });
74
95
  };
75
96
  }
76
- function getUrlFromResource(resource) {
77
- if ((0, faro_core_1.isString)(resource)) {
78
- return resource;
79
- }
80
- else if (resource instanceof URL) {
81
- return resource.href;
82
- }
83
- else if ((0, faro_core_1.isFunction)(resource === null || resource === void 0 ? void 0 : resource.toString)) {
84
- return resource.toString();
85
- }
86
- return undefined;
87
- }
88
97
  //# sourceMappingURL=httpRequestMonitor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"httpRequestMonitor.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/httpRequestMonitor.ts"],"names":[],"mappings":"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","sourcesContent":["import { isFunction, isString, Observable } from '@grafana/faro-core';\n\nimport { isUrlIgnored } from '../../utils/url';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';\nimport type { HttpRequestEndMessage, HttpRequestStartMessage } from './types';\n\n/**\n * Monitors if any http requests are in progress.\n */\nexport function monitorHttpRequests(): Observable {\n const observable = new Observable<HttpRequestStartMessage | HttpRequestEndMessage>();\n\n let pendingXhrRequests = 0;\n let pendingFetchRequests = 0;\n\n function emitStartMessage() {\n observable.notify({ type: MESSAGE_TYPE_HTTP_REQUEST_START, pending: pendingXhrRequests + pendingFetchRequests });\n }\n\n function emitEndMessage() {\n observable.notify({ type: MESSAGE_TYPE_HTTP_REQUEST_END, pending: pendingXhrRequests + pendingFetchRequests });\n }\n\n monitorFetch(\n () => {\n pendingFetchRequests++;\n emitStartMessage();\n },\n () => {\n pendingFetchRequests--;\n emitEndMessage();\n }\n );\n\n monitorXhr(\n () => {\n pendingXhrRequests++;\n emitStartMessage();\n },\n () => {\n pendingXhrRequests--;\n emitEndMessage();\n }\n );\n\n return observable;\n}\n\nfunction monitorXhr(onRequestStart: () => void, onRequestEnd: () => void) {\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function () {\n const url = arguments[1];\n const isIgnoredUrl = isUrlIgnored(url);\n\n this.addEventListener('loadstart', () => {\n if (!isIgnoredUrl) {\n onRequestStart();\n }\n });\n\n this.addEventListener('loadend', () => {\n if (!isIgnoredUrl) {\n onRequestEnd();\n }\n });\n\n originalOpen.apply(this, arguments as any);\n };\n\n XMLHttpRequest.prototype.send = function () {\n originalSend.apply(this, arguments as any);\n };\n}\n\nfunction monitorFetch(onRequestsStart: () => void, onRequestEnd: () => void) {\n const originalFetch = window.fetch;\n\n window.fetch = function () {\n const url = getUrlFromResource(arguments[0]);\n const isIgnoredUrl = isUrlIgnored(url);\n\n // fetch started\n if (!isIgnoredUrl) {\n onRequestsStart();\n }\n\n return originalFetch.apply(this, arguments as any).finally(() => {\n // fetch ended\n if (!isIgnoredUrl) {\n onRequestEnd();\n }\n });\n };\n}\n\nfunction getUrlFromResource(resource: any): string | undefined {\n if (isString(resource)) {\n return resource;\n } else if (resource instanceof URL) {\n return resource.href;\n } else if (isFunction(resource?.toString)) {\n return resource.toString();\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"httpRequestMonitor.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/httpRequestMonitor.ts"],"names":[],"mappings":"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","sourcesContent":["import { genShortID, Observable } from '@grafana/faro-core';\n\nimport { getUrlFromResource, isUrlIgnored } from '../../utils/url';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './const';\nimport type { HttpRequestEndMessage, HttpRequestMessagePayload, HttpRequestStartMessage } from './types';\n\ntype RequestProps = HttpRequestMessagePayload;\n\nconst apiTypeFetch = 'fetch';\nconst apiTypeXhr = 'xhr';\n\n/**\n * Monitors if any http requests are in progress.\n */\nexport function monitorHttpRequests(): Observable<HttpRequestStartMessage | HttpRequestEndMessage> {\n const observable = new Observable<HttpRequestStartMessage | HttpRequestEndMessage>();\n\n function emitStartMessage(requestProps: RequestProps) {\n observable.notify({\n type: MESSAGE_TYPE_HTTP_REQUEST_START,\n request: requestProps,\n });\n }\n\n function emitEndMessage(requestProps: RequestProps) {\n observable.notify({\n type: MESSAGE_TYPE_HTTP_REQUEST_END,\n request: requestProps,\n });\n }\n\n monitorFetch({\n onRequestStart: emitStartMessage,\n onRequestEnd: emitEndMessage,\n });\n\n monitorXhr({\n onRequestStart: emitStartMessage,\n onRequestEnd: emitEndMessage,\n });\n\n return observable;\n}\n\nfunction monitorXhr({\n onRequestStart,\n onRequestEnd,\n}: {\n onRequestStart: (props: RequestProps) => void;\n onRequestEnd: (props: RequestProps) => void;\n}) {\n const originalOpen = XMLHttpRequest.prototype.open;\n\n XMLHttpRequest.prototype.open = function () {\n const url = arguments[1];\n const isIgnoredUrl = isUrlIgnored(url);\n const method = arguments[0];\n\n const requestId = genShortID();\n\n // request has started to load data.\n this.addEventListener('loadstart', function () {\n if (!isIgnoredUrl) {\n onRequestStart({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n // transaction completes successfully.\n this.addEventListener('load', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n this.addEventListener('error', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n this.addEventListener('abort', function () {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeXhr });\n }\n });\n\n originalOpen.apply(this, arguments as any);\n };\n}\n\nfunction monitorFetch({\n onRequestEnd,\n onRequestStart,\n}: {\n onRequestStart: (props: RequestProps) => void;\n onRequestEnd: (props: RequestProps) => void;\n}) {\n const originalFetch = window.fetch;\n\n window.fetch = function () {\n const url = getUrlFromResource(arguments[0]) ?? '';\n const isIgnoredUrl = isUrlIgnored(url);\n const method = (arguments[1] ?? {}).method;\n\n const requestId = genShortID();\n\n if (!isIgnoredUrl) {\n onRequestStart({ url, method, requestId, apiType: apiTypeFetch });\n }\n\n return originalFetch\n .apply(this, arguments as any)\n .then((response) => {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeFetch });\n }\n return response;\n })\n .catch((error) => {\n if (!isIgnoredUrl) {\n onRequestEnd({ url, method, requestId, apiType: apiTypeFetch });\n }\n throw error;\n });\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/index.ts"],"names":[],"mappings":";;;AAAA,qDAA8D;AAArD,4HAAA,yBAAyB,OAAA;AAElC,iCAKiB;AAJf,kHAAA,yBAAyB,OAAA;AACzB,sHAAA,6BAA6B,OAAA;AAC7B,wHAAA,+BAA+B,OAAA;AAC/B,gHAAA,uBAAuB,OAAA","sourcesContent":["export { UserActionInstrumentation } from './instrumentation';\nexport type { DomMutationMessage, HttpRequestEndMessage, HttpRequestStartMessage } from './types';\nexport {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n userActionDataAttribute,\n} from './const';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/index.ts"],"names":[],"mappings":";;;AAAA,qDAA8D;AAArD,4HAAA,yBAAyB,OAAA;AAOlC,iCAKiB;AAJf,kHAAA,yBAAyB,OAAA;AACzB,sHAAA,6BAA6B,OAAA;AAC7B,wHAAA,+BAA+B,OAAA;AAC/B,gHAAA,uBAAuB,OAAA","sourcesContent":["export { UserActionInstrumentation } from './instrumentation';\nexport type {\n DomMutationMessage,\n HttpRequestEndMessage,\n HttpRequestStartMessage,\n HttpRequestMessagePayload,\n} from './types';\nexport {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n userActionDataAttribute,\n} from './const';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAwE;AAExE,iFAAsE;AAEtE;IAA+C,6CAAmB;IAAlE;QAAA,qEASC;QARU,UAAI,GAAG,mDAAmD,CAAC;QAC3D,aAAO,GAAG,mBAAO,CAAC;;IAO7B,CAAC;IALC,8CAAU,GAAV;QACE,IAAM,uBAAuB,GAAG,IAAA,mDAAmB,EAAC,gBAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;QAChE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC9D,CAAC;IACH,gCAAC;AAAD,CAAC,AATD,CAA+C,+BAAmB,GASjE;AATY,8DAAyB","sourcesContent":["import { BaseInstrumentation, faro, 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 initialize(): void {\n const processUserEventHandler = getUserEventHandler(faro);\n window.addEventListener('pointerdown', processUserEventHandler);\n window.addEventListener('keydown', processUserEventHandler);\n }\n}\n"]}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAwE;AAExE,iFAAsE;AAEtE;IAA+C,6CAAmB;IAAlE;;QACW,UAAI,GAAG,mDAAmD,CAAC;QAC3D,aAAO,GAAG,mBAAO,CAAC;;IAO7B,CAAC;IALC,8CAAU,GAAV;QACE,IAAM,uBAAuB,GAAG,IAAA,mDAAmB,EAAC,gBAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;QAChE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC9D,CAAC;IACH,gCAAC;AAAD,CAAC,AATD,CAA+C,+BAAmB,GASjE;AATY,8DAAyB","sourcesContent":["import { BaseInstrumentation, faro, 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 initialize(): void {\n const processUserEventHandler = getUserEventHandler(faro);\n window.addEventListener('pointerdown', processUserEventHandler);\n window.addEventListener('keydown', processUserEventHandler);\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.monitorPerformanceEntries = void 0;
3
+ exports.monitorPerformanceEntries = monitorPerformanceEntries;
4
4
  var faro_core_1 = require("@grafana/faro-core");
5
5
  var instrumentation_1 = require("../performance/instrumentation");
6
6
  var performanceConstants_1 = require("../performance/performanceConstants");
@@ -14,5 +14,4 @@ function monitorPerformanceEntries() {
14
14
  });
15
15
  return observable;
16
16
  }
17
- exports.monitorPerformanceEntries = monitorPerformanceEntries;
18
17
  //# sourceMappingURL=performanceEntriesMonitor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"performanceEntriesMonitor.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/performanceEntriesMonitor.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAEhD,kEAAgF;AAChF,4EAAqE;AAErE,iCAAsD;AAEtD,SAAgB,yBAAyB;IACvC,IAAM,UAAU,GAAG,IAAI,sBAAU,EAAE,CAAC;IAEpC,gDAA8B,CAAC,SAAS,CAAC,UAAC,IAAI;QAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,qCAAc,EAAE;YAChC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,mCAA2B,EAAE,CAAC,CAAC;SAC1D;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC;AAVD,8DAUC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { performanceEntriesSubscription } from '../performance/instrumentation';\nimport { RESOURCE_ENTRY } from '../performance/performanceConstants';\n\nimport { MESSAGE_TYPE_RESOURCE_ENTRY } from './const';\n\nexport function monitorPerformanceEntries(): Observable {\n const observable = new Observable();\n\n performanceEntriesSubscription.subscribe((data) => {\n if (data.type === RESOURCE_ENTRY) {\n observable.notify({ type: MESSAGE_TYPE_RESOURCE_ENTRY });\n }\n });\n\n return observable;\n}\n"]}
1
+ {"version":3,"file":"performanceEntriesMonitor.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/performanceEntriesMonitor.ts"],"names":[],"mappings":";;AAOA,8DAUC;AAjBD,gDAAgD;AAEhD,kEAAgF;AAChF,4EAAqE;AAErE,iCAAsD;AAEtD,SAAgB,yBAAyB;IACvC,IAAM,UAAU,GAAG,IAAI,sBAAU,EAAE,CAAC;IAEpC,gDAA8B,CAAC,SAAS,CAAC,UAAC,IAAI;QAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,qCAAc,EAAE,CAAC;YACjC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,mCAA2B,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { performanceEntriesSubscription } from '../performance/instrumentation';\nimport { RESOURCE_ENTRY } from '../performance/performanceConstants';\n\nimport { MESSAGE_TYPE_RESOURCE_ENTRY } from './const';\n\nexport function monitorPerformanceEntries(): Observable {\n const observable = new Observable();\n\n performanceEntriesSubscription.subscribe((data) => {\n if (data.type === RESOURCE_ENTRY) {\n observable.notify({ type: MESSAGE_TYPE_RESOURCE_ENTRY });\n }\n });\n\n return observable;\n}\n"]}
@@ -1,19 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getUserEventHandler = void 0;
3
+ exports.getUserEventHandler = getUserEventHandler;
4
4
  var faro_core_1 = require("@grafana/faro-core");
5
5
  var const_1 = require("./const");
6
6
  var domMutationMonitor_1 = require("./domMutationMonitor");
7
7
  var httpRequestMonitor_1 = require("./httpRequestMonitor");
8
8
  var performanceEntriesMonitor_1 = require("./performanceEntriesMonitor");
9
9
  var util_1 = require("./util");
10
+ var maxFollowUpActionTimeRange = 100;
10
11
  function getUserEventHandler(faro) {
11
12
  var api = faro.api, config = faro.config;
12
13
  var httpMonitor = (0, httpRequestMonitor_1.monitorHttpRequests)();
13
14
  var domMutationsMonitor = (0, domMutationMonitor_1.monitorDomMutations)();
14
15
  var performanceEntriesMonitor = (0, performanceEntriesMonitor_1.monitorPerformanceEntries)();
15
- var allMonitorsSub;
16
- var allMonitorsObserver;
17
16
  var timeoutId;
18
17
  var actionRunning = false;
19
18
  function processUserEvent(event) {
@@ -27,7 +26,7 @@ function getUserEventHandler(faro) {
27
26
  var endTime;
28
27
  var actionId = (0, faro_core_1.genShortID)();
29
28
  faro_core_1.apiMessageBus.notify({
30
- type: faro_core_1.USER_ACTION_START_MESSAGE_TYPE,
29
+ type: faro_core_1.USER_ACTION_START,
31
30
  name: userActionName,
32
31
  startTime: startTime,
33
32
  parentId: actionId,
@@ -38,54 +37,104 @@ function getUserEventHandler(faro) {
38
37
  // Listening for follow up activities stops once action is cancelled (set to false)
39
38
  actionRunning = false;
40
39
  sendUserActionCancelMessage(userActionName, actionId);
41
- });
42
- allMonitorsObserver = (0, faro_core_1.merge)(httpMonitor, domMutationsMonitor, performanceEntriesMonitor);
43
- allMonitorsSub = allMonitorsObserver
40
+ }, maxFollowUpActionTimeRange);
41
+ var runningRequests = new Map();
42
+ var isHalted = false;
43
+ var pendingActionTimeoutId;
44
+ var allMonitorsSub = new faro_core_1.Observable()
45
+ .merge(httpMonitor, domMutationsMonitor, performanceEntriesMonitor)
44
46
  .takeWhile(function () { return actionRunning; })
45
- .subscribe(function () {
47
+ .filter(function (msg) {
48
+ // If the user action is in halt state, we only keep listening to ended http requests
49
+ if (isHalted && !(isRequestEndMessage(msg) && runningRequests.has(msg.request.requestId))) {
50
+ return false;
51
+ }
52
+ return true;
53
+ })
54
+ .subscribe(function (msg) {
55
+ if (isRequestStartMessage(msg)) {
56
+ // An action is on halt if it has pending items, like pending HTTP requests.
57
+ // In this case we start a separate timeout to wait for the requests to finish
58
+ // If in the halt state, we stop adding Faro signals to the action's buffer (see userActionLifecycleHandler.ts)
59
+ // But we are still subscribed to
60
+ runningRequests.set(msg.request.requestId, msg.request);
61
+ }
62
+ if (isRequestEndMessage(msg)) {
63
+ // console.log('request end msg :>> ', msg);
64
+ runningRequests.delete(msg.request.requestId);
65
+ }
46
66
  // A http request, a DOM mutation or a performance entry happened so we have a follow up activity and start the timeout again
47
67
  // If timeout is triggered the user action is done and we send respective messages and events
48
68
  timeoutId = startTimeout(timeoutId, function () {
49
69
  endTime = (0, faro_core_1.dateNow)();
50
- var duration = endTime - startTime;
51
- var eventType = event.type;
52
- // order matters, first emit the user-action-end event and then push the event
53
- faro_core_1.apiMessageBus.notify({
54
- type: faro_core_1.USER_ACTION_END_MESSAGE_TYPE,
55
- name: userActionName,
56
- id: actionId,
57
- startTime: startTime,
58
- endTime: endTime,
59
- duration: duration,
60
- eventType: eventType,
61
- });
62
- // Send the final action parent event
63
- api.pushEvent(userActionName, {
64
- userActionStartTime: startTime.toString(),
65
- userActionEndTime: endTime.toString(),
66
- userActionDuration: duration.toString(),
67
- userActionEventType: eventType,
68
- }, undefined, {
69
- timestampOverwriteMs: startTime,
70
- customPayloadTransformer: function (payload) {
71
- payload.action = {
72
- id: actionId,
73
- name: userActionName,
74
- };
75
- return payload;
76
- },
77
- });
78
- // Ensure action is blocked until it is fully processed.
79
- actionRunning = false;
80
- allMonitorsSub === null || allMonitorsSub === void 0 ? void 0 : allMonitorsSub.unsubscribe();
81
- allMonitorsObserver === null || allMonitorsObserver === void 0 ? void 0 : allMonitorsObserver.unsubscribeAll();
82
- });
70
+ var userActionParentEventProps = { api: api, userActionName: userActionName, startTime: startTime, endTime: endTime, actionId: actionId, event: event };
71
+ var hasPendingRequests = runningRequests.size > 0;
72
+ var isAllPendingRequestsResolved = isHalted && !hasPendingRequests;
73
+ if (isAllPendingRequestsResolved) {
74
+ clearTimeout(pendingActionTimeoutId);
75
+ isHalted = false;
76
+ }
77
+ if (hasPendingRequests) {
78
+ isHalted = true;
79
+ faro_core_1.apiMessageBus.notify({
80
+ type: faro_core_1.USER_ACTION_HALT,
81
+ name: userActionName,
82
+ parentId: actionId,
83
+ reason: 'pending-requests',
84
+ haltTime: (0, faro_core_1.dateNow)(),
85
+ });
86
+ pendingActionTimeoutId = startTimeout(undefined, function () {
87
+ unsubscribeAllMonitors(allMonitorsSub);
88
+ endUserAction(userActionParentEventProps);
89
+ actionRunning = false;
90
+ isHalted = false;
91
+ }, 1000 * 10);
92
+ }
93
+ else {
94
+ unsubscribeAllMonitors(allMonitorsSub);
95
+ endUserAction(userActionParentEventProps);
96
+ actionRunning = false;
97
+ isHalted = false;
98
+ }
99
+ }, maxFollowUpActionTimeRange);
83
100
  });
84
101
  }
85
- registerVisibilityChangeHandler(allMonitorsSub, allMonitorsObserver);
86
102
  return processUserEvent;
87
103
  }
88
- exports.getUserEventHandler = getUserEventHandler;
104
+ /**
105
+ * User action was successfully completed and we send the final event(s)
106
+ */
107
+ function endUserAction(props) {
108
+ var api = props.api, userActionName = props.userActionName, startTime = props.startTime, endTime = props.endTime, actionId = props.actionId, event = props.event;
109
+ var duration = endTime - startTime;
110
+ var eventType = event.type;
111
+ // order matters, first emit the user-action-end event and afterwards push the parent event
112
+ faro_core_1.apiMessageBus.notify({
113
+ type: faro_core_1.USER_ACTION_END,
114
+ name: userActionName,
115
+ id: actionId,
116
+ startTime: startTime,
117
+ endTime: endTime,
118
+ duration: duration,
119
+ eventType: eventType,
120
+ });
121
+ // Send the final action parent event
122
+ api.pushEvent(userActionName, {
123
+ userActionStartTime: startTime.toString(),
124
+ userActionEndTime: endTime.toString(),
125
+ userActionDuration: duration.toString(),
126
+ userActionEventType: eventType,
127
+ }, undefined, {
128
+ timestampOverwriteMs: startTime,
129
+ customPayloadTransformer: function (payload) {
130
+ payload.action = {
131
+ id: actionId,
132
+ name: userActionName,
133
+ };
134
+ return payload;
135
+ },
136
+ });
137
+ }
89
138
  function getUserActionName(element, dataAttributeName) {
90
139
  var parsedDataAttributeName = (0, util_1.convertDataAttributeName)(dataAttributeName);
91
140
  var dataset = element.dataset;
@@ -96,35 +145,31 @@ function getUserActionName(element, dataAttributeName) {
96
145
  }
97
146
  return undefined;
98
147
  }
99
- function startTimeout(timeoutId, cb) {
100
- var maxTimeSpanTillUserActionEnd = 100;
148
+ function startTimeout(timeoutId, cb, delay) {
101
149
  if (timeoutId) {
102
150
  clearTimeout(timeoutId);
103
151
  }
104
152
  //@ts-expect-error for some reason vscode is using the node types
105
153
  timeoutId = setTimeout(function () {
106
154
  cb();
107
- }, maxTimeSpanTillUserActionEnd);
155
+ }, delay);
108
156
  return timeoutId;
109
157
  }
110
158
  function sendUserActionCancelMessage(userActionName, actionId) {
111
159
  faro_core_1.apiMessageBus.notify({
112
- type: faro_core_1.USER_ACTION_CANCEL_MESSAGE_TYPE,
160
+ type: faro_core_1.USER_ACTION_CANCEL,
113
161
  name: userActionName,
114
162
  parentId: actionId,
115
163
  });
116
164
  }
117
- function registerVisibilityChangeHandler(allMonitorsSub, allMonitorsObserver) {
118
- // stop monitoring in background tabs
119
- document.addEventListener('visibilitychange', function () {
120
- if (document.visibilityState === 'hidden') {
121
- // Unsubscribe from all monitors when the tab goes into the background to free up resources (merge.unsubscribe() also unsubscribes from all inner observables)
122
- // Monitors will be re-subscribed in the processEvent function when the first user action is detected
123
- allMonitorsSub === null || allMonitorsSub === void 0 ? void 0 : allMonitorsSub.unsubscribe();
124
- allMonitorsSub = undefined;
125
- allMonitorsObserver === null || allMonitorsObserver === void 0 ? void 0 : allMonitorsObserver.unsubscribeAll();
126
- allMonitorsObserver = undefined;
127
- }
128
- });
165
+ function unsubscribeAllMonitors(allMonitorsSub) {
166
+ allMonitorsSub === null || allMonitorsSub === void 0 ? void 0 : allMonitorsSub.unsubscribe();
167
+ allMonitorsSub = undefined;
168
+ }
169
+ function isRequestStartMessage(msg) {
170
+ return msg.type === const_1.MESSAGE_TYPE_HTTP_REQUEST_START;
171
+ }
172
+ function isRequestEndMessage(msg) {
173
+ return msg.type === const_1.MESSAGE_TYPE_HTTP_REQUEST_END;
129
174
  }
130
175
  //# sourceMappingURL=processUserActionEventHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n apiMessageBus,\n dateNow,\n Faro,\n genShortID,\n merge,\n Observable,\n Subscription,\n USER_ACTION_CANCEL_MESSAGE_TYPE,\n USER_ACTION_END_MESSAGE_TYPE,\n USER_ACTION_START_MESSAGE_TYPE,\n} from '@grafana/faro-core';\n\nimport { userActionDataAttributeParsed as userActionDataAttribute } from './const';\nimport { monitorDomMutations } from './domMutationMonitor';\nimport { monitorHttpRequests } from './httpRequestMonitor';\nimport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nimport { convertDataAttributeName } from './util';\n\nexport function getUserEventHandler(faro: Faro) {\n const { api, config } = faro;\n\n const httpMonitor = monitorHttpRequests();\n const domMutationsMonitor = monitorDomMutations();\n const performanceEntriesMonitor = monitorPerformanceEntries();\n\n let allMonitorsSub: Subscription | undefined;\n let allMonitorsObserver: Observable | undefined;\n\n let timeoutId: number | undefined;\n let actionRunning = false;\n\n function processUserEvent(event: PointerEvent | KeyboardEvent) {\n const userActionName = getUserActionName(\n event.target as HTMLElement,\n config.trackUserActionsDataAttributeName ?? userActionDataAttribute\n );\n\n if (actionRunning || userActionName == null) {\n return;\n }\n\n actionRunning = true;\n\n const startTime = dateNow();\n let endTime: number | undefined;\n\n const actionId = genShortID();\n\n apiMessageBus.notify({\n type: USER_ACTION_START_MESSAGE_TYPE,\n name: userActionName,\n startTime: startTime,\n parentId: actionId,\n });\n\n // Triggers if no initial action happened within the first 100ms\n timeoutId = startTimeout(timeoutId, () => {\n endTime = dateNow();\n\n // Listening for follow up activities stops once action is cancelled (set to false)\n actionRunning = false;\n sendUserActionCancelMessage(userActionName, actionId);\n });\n\n allMonitorsObserver = merge(httpMonitor, domMutationsMonitor, performanceEntriesMonitor);\n\n allMonitorsSub = allMonitorsObserver\n .takeWhile(() => actionRunning)\n .subscribe(() => {\n // A http request, a DOM mutation or a performance entry happened so we have a follow up activity and start the timeout again\n // If timeout is triggered the user action is done and we send respective messages and events\n timeoutId = startTimeout(timeoutId, () => {\n endTime = dateNow();\n\n const duration = endTime - startTime;\n const eventType = event.type;\n\n // order matters, first emit the user-action-end event and then push the event\n apiMessageBus.notify({\n type: USER_ACTION_END_MESSAGE_TYPE,\n name: userActionName,\n id: actionId,\n startTime,\n endTime,\n duration,\n eventType,\n });\n\n // Send the final action parent event\n api.pushEvent(\n userActionName,\n {\n userActionStartTime: startTime.toString(),\n userActionEndTime: endTime.toString(),\n userActionDuration: duration.toString(),\n userActionEventType: eventType,\n },\n undefined,\n {\n timestampOverwriteMs: startTime,\n customPayloadTransformer: (payload) => {\n payload.action = {\n id: actionId,\n name: userActionName,\n };\n\n return payload;\n },\n }\n );\n\n // Ensure action is blocked until it is fully processed.\n actionRunning = false;\n allMonitorsSub?.unsubscribe();\n allMonitorsObserver?.unsubscribeAll();\n });\n });\n }\n\n registerVisibilityChangeHandler(allMonitorsSub, allMonitorsObserver);\n\n return processUserEvent;\n}\n\nfunction getUserActionName(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\nfunction startTimeout(timeoutId: number | undefined, cb: () => void) {\n const maxTimeSpanTillUserActionEnd = 100;\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n //@ts-expect-error for some reason vscode is using the node types\n timeoutId = setTimeout(() => {\n cb();\n }, maxTimeSpanTillUserActionEnd);\n\n return timeoutId;\n}\n\nfunction sendUserActionCancelMessage(userActionName: string, actionId: string) {\n apiMessageBus.notify({\n type: USER_ACTION_CANCEL_MESSAGE_TYPE,\n name: userActionName,\n parentId: actionId,\n });\n}\n\nfunction registerVisibilityChangeHandler(\n allMonitorsSub: Subscription | undefined,\n allMonitorsObserver: Observable | undefined\n) {\n // stop monitoring in background tabs\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n // Unsubscribe from all monitors when the tab goes into the background to free up resources (merge.unsubscribe() also unsubscribes from all inner observables)\n // Monitors will be re-subscribed in the processEvent function when the first user action is detected\n allMonitorsSub?.unsubscribe();\n allMonitorsSub = undefined;\n\n allMonitorsObserver?.unsubscribeAll();\n allMonitorsObserver = undefined;\n }\n });\n}\n"]}
1
+ {"version":3,"file":"processUserActionEventHandler.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/processUserActionEventHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n apiMessageBus,\n dateNow,\n genShortID,\n Observable,\n USER_ACTION_CANCEL,\n USER_ACTION_END,\n USER_ACTION_HALT,\n USER_ACTION_START,\n} from '@grafana/faro-core';\nimport type { Faro, Subscription } from '@grafana/faro-core';\n\nimport {\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n userActionDataAttributeParsed as userActionDataAttribute,\n} from './const';\nimport { monitorDomMutations } from './domMutationMonitor';\nimport { monitorHttpRequests } from './httpRequestMonitor';\nimport { monitorPerformanceEntries } from './performanceEntriesMonitor';\nimport type { HttpRequestEndMessage, HttpRequestMessagePayload, HttpRequestStartMessage } from './types';\nimport { convertDataAttributeName } from './util';\n\nconst maxFollowUpActionTimeRange = 100;\n\nexport function getUserEventHandler(faro: Faro) {\n const { api, config } = faro;\n\n const httpMonitor = monitorHttpRequests();\n const domMutationsMonitor = monitorDomMutations();\n const performanceEntriesMonitor = monitorPerformanceEntries();\n\n let timeoutId: number | undefined;\n let actionRunning = false;\n\n function processUserEvent(event: PointerEvent | KeyboardEvent) {\n const userActionName = getUserActionName(\n event.target as HTMLElement,\n config.trackUserActionsDataAttributeName ?? userActionDataAttribute\n );\n\n if (actionRunning || userActionName == null) {\n return;\n }\n\n actionRunning = true;\n\n const startTime = dateNow();\n let endTime: number | undefined;\n\n const actionId = genShortID();\n\n apiMessageBus.notify({\n type: USER_ACTION_START,\n name: userActionName,\n startTime: startTime,\n parentId: actionId,\n });\n\n // Triggers if no initial action happened within the first 100ms\n timeoutId = startTimeout(\n timeoutId,\n () => {\n endTime = dateNow();\n\n // Listening for follow up activities stops once action is cancelled (set to false)\n actionRunning = false;\n sendUserActionCancelMessage(userActionName, actionId);\n },\n maxFollowUpActionTimeRange\n );\n\n const runningRequests = new Map<string, HttpRequestMessagePayload>();\n let isHalted = false;\n let pendingActionTimeoutId: number | undefined;\n\n const allMonitorsSub = new Observable()\n .merge(httpMonitor, domMutationsMonitor, performanceEntriesMonitor)\n .takeWhile(() => actionRunning)\n .filter((msg) => {\n // If the user action is in halt state, we only keep listening to ended http requests\n if (isHalted && !(isRequestEndMessage(msg) && runningRequests.has(msg.request.requestId))) {\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 runningRequests.set(msg.request.requestId, msg.request);\n }\n if (isRequestEndMessage(msg)) {\n // console.log('request end msg :>> ', msg);\n runningRequests.delete(msg.request.requestId);\n }\n\n // A http request, a DOM mutation or a performance entry happened so we have a follow up activity and start the timeout again\n // If timeout is triggered the user action is done and we send respective messages and events\n timeoutId = startTimeout(\n timeoutId,\n () => {\n endTime = dateNow();\n\n const userActionParentEventProps = { api, userActionName, startTime, endTime: endTime!, actionId, event };\n\n const hasPendingRequests = runningRequests.size > 0;\n const isAllPendingRequestsResolved = isHalted && !hasPendingRequests;\n\n if (isAllPendingRequestsResolved) {\n clearTimeout(pendingActionTimeoutId);\n isHalted = false;\n }\n\n if (hasPendingRequests) {\n isHalted = true;\n\n apiMessageBus.notify({\n type: USER_ACTION_HALT,\n name: userActionName,\n parentId: actionId,\n reason: 'pending-requests',\n haltTime: dateNow(),\n });\n\n pendingActionTimeoutId = startTimeout(\n undefined,\n () => {\n unsubscribeAllMonitors(allMonitorsSub);\n endUserAction(userActionParentEventProps);\n actionRunning = false;\n isHalted = false;\n },\n 1000 * 10\n );\n } else {\n unsubscribeAllMonitors(allMonitorsSub);\n endUserAction(userActionParentEventProps);\n actionRunning = false;\n isHalted = false;\n }\n },\n maxFollowUpActionTimeRange\n );\n });\n }\n\n return processUserEvent;\n}\n\n/**\n * User action was successfully completed and we send the final event(s)\n */\nfunction endUserAction(props: {\n api: Faro['api'];\n userActionName: string;\n startTime: number;\n endTime: number;\n actionId: string;\n event: PointerEvent | KeyboardEvent;\n}) {\n const { api, userActionName, startTime, endTime, actionId, event } = props;\n const duration = endTime - startTime;\n const eventType = event.type;\n\n // order matters, first emit the user-action-end event and afterwards push the parent event\n apiMessageBus.notify({\n type: USER_ACTION_END,\n name: userActionName,\n id: actionId,\n startTime,\n endTime,\n duration,\n eventType,\n });\n\n // Send the final action parent event\n api.pushEvent(\n userActionName,\n {\n userActionStartTime: startTime.toString(),\n userActionEndTime: endTime.toString(),\n userActionDuration: duration.toString(),\n userActionEventType: eventType,\n },\n undefined,\n {\n timestampOverwriteMs: startTime,\n customPayloadTransformer: (payload) => {\n payload.action = {\n id: actionId,\n name: userActionName,\n };\n\n return payload;\n },\n }\n );\n}\n\nfunction getUserActionName(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\nfunction startTimeout(timeoutId: number | undefined, cb: () => void, delay: number) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n //@ts-expect-error for some reason vscode is using the node types\n timeoutId = setTimeout(() => {\n cb();\n }, delay);\n\n return timeoutId;\n}\n\nfunction sendUserActionCancelMessage(userActionName: string, actionId: string) {\n apiMessageBus.notify({\n type: USER_ACTION_CANCEL,\n name: userActionName,\n parentId: actionId,\n });\n}\n\nfunction unsubscribeAllMonitors(allMonitorsSub: Subscription | undefined) {\n allMonitorsSub?.unsubscribe();\n allMonitorsSub = undefined;\n}\n\nfunction isRequestStartMessage(msg: any): msg is HttpRequestStartMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;\n}\n\nfunction isRequestEndMessage(msg: any): msg is HttpRequestEndMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n pending: number;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n pending: number;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n MESSAGE_TYPE_DOM_MUTATION,\n MESSAGE_TYPE_HTTP_REQUEST_END,\n MESSAGE_TYPE_HTTP_REQUEST_START,\n} from './const';\n\nexport type DomMutationMessage = {\n type: typeof MESSAGE_TYPE_DOM_MUTATION;\n};\n\ntype RequestApiType = 'xhr' | 'fetch';\n\nexport type HttpRequestMessagePayload = {\n requestId: string;\n url: string;\n method: string;\n apiType: RequestApiType;\n};\n\nexport type HttpRequestStartMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_START;\n request: HttpRequestMessagePayload;\n};\n\nexport type HttpRequestEndMessage = {\n type: typeof MESSAGE_TYPE_HTTP_REQUEST_END;\n request: HttpRequestMessagePayload;\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.convertDataAttributeName = void 0;
3
+ exports.convertDataAttributeName = convertDataAttributeName;
4
4
  /**
5
5
  * Parses the action attribute name by removing the 'data-' prefix and converting
6
6
  * the remaining string to camelCase.
@@ -13,5 +13,4 @@ function convertDataAttributeName(userActionDataAttribute) {
13
13
  var withUpperCase = withoutData === null || withoutData === void 0 ? void 0 : withoutData.replace(/-(.)/g, function (_, char) { return char.toUpperCase(); });
14
14
  return withUpperCase === null || withUpperCase === void 0 ? void 0 : withUpperCase.replace(/-/g, '');
15
15
  }
16
- exports.convertDataAttributeName = convertDataAttributeName;
17
16
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/util.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,SAAgB,wBAAwB,CAAC,uBAA+B;IACtE,IAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAM,aAAa,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,OAAO,EAAE,UAAC,CAAC,EAAE,IAAI,IAAK,OAAA,IAAI,CAAC,WAAW,EAAE,EAAlB,CAAkB,CAAC,CAAC;IACrF,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAJD,4DAIC","sourcesContent":["/**\n * Parses the action attribute name by removing the 'data-' prefix and converting\n * the remaining string to camelCase.\n *\n * This is needed because the browser will remove the 'data-' prefix and the dashes from\n * data attributes and make then camelCase.\n */\nexport function convertDataAttributeName(userActionDataAttribute: string) {\n const withoutData = userActionDataAttribute.split('data-')[1];\n const withUpperCase = withoutData?.replace(/-(.)/g, (_, char) => char.toUpperCase());\n return withUpperCase?.replace(/-/g, '');\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/instrumentations/userActions/util.ts"],"names":[],"mappings":";;AAOA,4DAIC;AAXD;;;;;;GAMG;AACH,SAAgB,wBAAwB,CAAC,uBAA+B;IACtE,IAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAM,aAAa,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,OAAO,EAAE,UAAC,CAAC,EAAE,IAAI,IAAK,OAAA,IAAI,CAAC,WAAW,EAAE,EAAlB,CAAkB,CAAC,CAAC;IACrF,OAAO,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/**\n * Parses the action attribute name by removing the 'data-' prefix and converting\n * the remaining string to camelCase.\n *\n * This is needed because the browser will remove the 'data-' prefix and the dashes from\n * data attributes and make then camelCase.\n */\nexport function convertDataAttributeName(userActionDataAttribute: string) {\n const withoutData = userActionDataAttribute.split('data-')[1];\n const withUpperCase = withoutData?.replace(/-(.)/g, (_, char) => char.toUpperCase());\n return withUpperCase?.replace(/-/g, '');\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/view/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAqH;AAErH,2CAA2C;AAC3C;IAAyC,uCAAmB;IAA5D;QAAA,qEA6BC;QA5BU,UAAI,GAAG,4CAA4C,CAAC;QACpD,aAAO,GAAG,mBAAO,CAAC;;IA2B7B,CAAC;IArBS,kDAAoB,GAA5B,UAA6B,IAAU;;QACrC,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAK,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI,CAAA,EAAE;YACjD,IAAI,CAAC,GAAG,CAAC,SAAS,CAChB,8BAAkB,EAClB;gBACE,QAAQ,EAAE,MAAA,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI,mCAAI,yBAAa;gBAClD,MAAM,EAAE,MAAA,IAAI,CAAC,IAAI,mCAAI,yBAAa;aACnC,EACD,SAAS,EACT,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;YAEF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;SAC1B;IACH,CAAC;IAED,wCAAU,GAAV;QACE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IACH,0BAAC;AAAD,CAAC,AA7BD,CAAyC,+BAAmB,GA6B3D;AA7BY,kDAAmB","sourcesContent":["import { BaseInstrumentation, EVENT_VIEW_CHANGED, Meta, MetaView, unknownString, VERSION } from '@grafana/faro-core';\n\n// all this does is send VIEW_CHANGED event\nexport class ViewInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-view';\n readonly version = VERSION;\n\n // previously notified view, to ensure we don't send view changed\n // event twice for the same view\n private notifiedView: MetaView | undefined;\n\n private sendViewChangedEvent(meta: Meta): void {\n const view = meta.view;\n\n if (view && view.name !== this.notifiedView?.name) {\n this.api.pushEvent(\n EVENT_VIEW_CHANGED,\n {\n fromView: this.notifiedView?.name ?? unknownString,\n toView: view.name ?? unknownString,\n },\n undefined,\n { skipDedupe: true }\n );\n\n this.notifiedView = view;\n }\n }\n\n initialize() {\n this.metas.addListener(this.sendViewChangedEvent.bind(this));\n }\n}\n"]}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/view/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAqG;AAGrG,2CAA2C;AAC3C;IAAyC,uCAAmB;IAA5D;;QACW,UAAI,GAAG,4CAA4C,CAAC;QACpD,aAAO,GAAG,mBAAO,CAAC;;IA2B7B,CAAC;IArBS,kDAAoB,GAA5B,UAA6B,IAAU;;QACrC,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAK,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI,CAAA,EAAE,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,SAAS,CAChB,8BAAkB,EAClB;gBACE,QAAQ,EAAE,MAAA,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI,mCAAI,yBAAa;gBAClD,MAAM,EAAE,MAAA,IAAI,CAAC,IAAI,mCAAI,yBAAa;aACnC,EACD,SAAS,EACT,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;YAEF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,wCAAU,GAAV;QACE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IACH,0BAAC;AAAD,CAAC,AA7BD,CAAyC,+BAAmB,GA6B3D;AA7BY,kDAAmB","sourcesContent":["import { BaseInstrumentation, EVENT_VIEW_CHANGED, unknownString, VERSION } from '@grafana/faro-core';\nimport type { Meta, MetaView } from '@grafana/faro-core';\n\n// all this does is send VIEW_CHANGED event\nexport class ViewInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-view';\n readonly version = VERSION;\n\n // previously notified view, to ensure we don't send view changed\n // event twice for the same view\n private notifiedView: MetaView | undefined;\n\n private sendViewChangedEvent(meta: Meta): void {\n const view = meta.view;\n\n if (view && view.name !== this.notifiedView?.name) {\n this.api.pushEvent(\n EVENT_VIEW_CHANGED,\n {\n fromView: this.notifiedView?.name ?? unknownString,\n toView: view.name ?? unknownString,\n },\n undefined,\n { skipDedupe: true }\n );\n\n this.notifiedView = view;\n }\n }\n\n initialize() {\n this.metas.addListener(this.sendViewChangedEvent.bind(this));\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAkE;AAElE,mDAAkD;AAClD,uEAAsE;AAEtE;IAA8C,4CAAmB;IAAjE;QAAA,qEAgBC;QAfU,UAAI,GAAG,kDAAkD,CAAC;QAC1D,aAAO,GAAG,mBAAO,CAAC;;IAc7B,CAAC;IAZC,6CAAU,GAAV;QACE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9B,IAAM,SAAS,GAAG,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAC3D,SAAS,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;IAEO,oEAAiC,GAAzC;;QACE,IAAI,MAAA,IAAI,CAAC,MAAM,0CAAE,yBAAyB,EAAE;YAC1C,OAAO,IAAI,mDAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;SACrG;QACD,OAAO,IAAI,+BAAc,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC5F,CAAC;IACH,+BAAC;AAAD,CAAC,AAhBD,CAA8C,+BAAmB,GAgBhE;AAhBY,4DAAwB","sourcesContent":["import { BaseInstrumentation, VERSION } from '@grafana/faro-core';\n\nimport { WebVitalsBasic } from './webVitalsBasic';\nimport { WebVitalsWithAttribution } from './webVitalsWithAttribution';\n\nexport class WebVitalsInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-web-vitals';\n readonly version = VERSION;\n\n initialize(): void {\n this.logDebug('Initializing');\n const webVitals = this.intializeWebVitalsInstrumentation();\n webVitals.initialize();\n }\n\n private intializeWebVitalsInstrumentation() {\n if (this.config?.trackWebVitalsAttribution) {\n return new WebVitalsWithAttribution(this.api.pushMeasurement, this.config.webVitalsInstrumentation);\n }\n return new WebVitalsBasic(this.api.pushMeasurement, this.config.webVitalsInstrumentation);\n }\n}\n"]}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../../src/instrumentations/webVitals/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAkE;AAElE,mDAAkD;AAClD,uEAAsE;AAEtE;IAA8C,4CAAmB;IAAjE;;QACW,UAAI,GAAG,kDAAkD,CAAC;QAC1D,aAAO,GAAG,mBAAO,CAAC;;IAc7B,CAAC;IAZC,6CAAU,GAAV;QACE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9B,IAAM,SAAS,GAAG,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAC3D,SAAS,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;IAEO,oEAAiC,GAAzC;;QACE,IAAI,MAAA,IAAI,CAAC,MAAM,0CAAE,yBAAyB,EAAE,CAAC;YAC3C,OAAO,IAAI,mDAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,IAAI,+BAAc,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC5F,CAAC;IACH,+BAAC;AAAD,CAAC,AAhBD,CAA8C,+BAAmB,GAgBhE;AAhBY,4DAAwB","sourcesContent":["import { BaseInstrumentation, VERSION } from '@grafana/faro-core';\n\nimport { WebVitalsBasic } from './webVitalsBasic';\nimport { WebVitalsWithAttribution } from './webVitalsWithAttribution';\n\nexport class WebVitalsInstrumentation extends BaseInstrumentation {\n readonly name = '@grafana/faro-web-sdk:instrumentation-web-vitals';\n readonly version = VERSION;\n\n initialize(): void {\n this.logDebug('Initializing');\n const webVitals = this.intializeWebVitalsInstrumentation();\n webVitals.initialize();\n }\n\n private intializeWebVitalsInstrumentation() {\n if (this.config?.trackWebVitalsAttribution) {\n return new WebVitalsWithAttribution(this.api.pushMeasurement, this.config.webVitalsInstrumentation);\n }\n return new WebVitalsBasic(this.api.pushMeasurement, this.config.webVitalsInstrumentation);\n }\n}\n"]}