@grafana/faro-web-sdk 2.3.1 → 2.5.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 (169) hide show
  1. package/README.md +1 -0
  2. package/dist/bundle/faro-web-sdk.iife.js +1 -1
  3. package/dist/bundle/types/index.d.ts +2 -2
  4. package/dist/bundle/types/instrumentations/console/instrumentation.d.ts +1 -1
  5. package/dist/bundle/types/instrumentations/csp/instrumentation.d.ts +1 -1
  6. package/dist/bundle/types/instrumentations/errors/instrumentation.d.ts +1 -1
  7. package/dist/bundle/types/instrumentations/navigation/instrumentation.d.ts +1 -1
  8. package/dist/bundle/types/instrumentations/performance/instrumentation.d.ts +1 -1
  9. package/dist/bundle/types/instrumentations/session/instrumentation.d.ts +1 -1
  10. package/dist/bundle/types/instrumentations/userActions/instrumentation.d.ts +1 -1
  11. package/dist/bundle/types/instrumentations/view/instrumentation.d.ts +1 -1
  12. package/dist/bundle/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  13. package/dist/bundle/types/metas/index.d.ts +1 -0
  14. package/dist/bundle/types/metas/os/index.d.ts +1 -0
  15. package/dist/bundle/types/metas/os/meta.d.ts +2 -0
  16. package/dist/bundle/types/metas/shared/index.d.ts +1 -0
  17. package/dist/bundle/types/metas/shared/uaParser.d.ts +4 -0
  18. package/dist/bundle/types/transports/console/transport.d.ts +1 -1
  19. package/dist/bundle/types/transports/fetch/transport.d.ts +1 -1
  20. package/dist/cjs/config/getWebInstrumentations.js +3 -4
  21. package/dist/cjs/config/getWebInstrumentations.js.map +1 -1
  22. package/dist/cjs/config/makeCoreConfig.js +49 -60
  23. package/dist/cjs/config/makeCoreConfig.js.map +1 -1
  24. package/dist/cjs/index.js +3 -2
  25. package/dist/cjs/index.js.map +1 -1
  26. package/dist/cjs/initialize.js +3 -3
  27. package/dist/cjs/initialize.js.map +1 -1
  28. package/dist/cjs/instrumentations/_internal/activityWindowTracker.js +52 -68
  29. package/dist/cjs/instrumentations/_internal/activityWindowTracker.js.map +1 -1
  30. package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js +11 -16
  31. package/dist/cjs/instrumentations/_internal/monitors/consoleMonitor.js.map +1 -1
  32. package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js +5 -5
  33. package/dist/cjs/instrumentations/_internal/monitors/domMutationMonitor.js.map +1 -1
  34. package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js +28 -30
  35. package/dist/cjs/instrumentations/_internal/monitors/httpRequestMonitor.js.map +1 -1
  36. package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js +7 -7
  37. package/dist/cjs/instrumentations/_internal/monitors/interactionMonitor.js.map +1 -1
  38. package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js +8 -8
  39. package/dist/cjs/instrumentations/_internal/monitors/performanceEntriesMonitor.js.map +1 -1
  40. package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js +24 -32
  41. package/dist/cjs/instrumentations/_internal/monitors/urlChangeMonitor.js.map +1 -1
  42. package/dist/cjs/instrumentations/console/instrumentation.js +29 -49
  43. package/dist/cjs/instrumentations/console/instrumentation.js.map +1 -1
  44. package/dist/cjs/instrumentations/csp/instrumentation.js +14 -32
  45. package/dist/cjs/instrumentations/csp/instrumentation.js.map +1 -1
  46. package/dist/cjs/instrumentations/errors/getErrorDetails.js +23 -23
  47. package/dist/cjs/instrumentations/errors/getErrorDetails.js.map +1 -1
  48. package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js +5 -5
  49. package/dist/cjs/instrumentations/errors/getValueAndTypeFromMessage.js.map +1 -1
  50. package/dist/cjs/instrumentations/errors/instrumentation.js +11 -29
  51. package/dist/cjs/instrumentations/errors/instrumentation.js.map +1 -1
  52. package/dist/cjs/instrumentations/errors/registerOnerror.js +6 -10
  53. package/dist/cjs/instrumentations/errors/registerOnerror.js.map +1 -1
  54. package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js +16 -17
  55. package/dist/cjs/instrumentations/errors/registerOnunhandledrejection.js.map +1 -1
  56. package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js +2 -2
  57. package/dist/cjs/instrumentations/errors/stackFrames/buildStackFrame.js.map +1 -1
  58. package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js +4 -4
  59. package/dist/cjs/instrumentations/errors/stackFrames/getDataFromSafariExtensions.js.map +1 -1
  60. package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js +16 -17
  61. package/dist/cjs/instrumentations/errors/stackFrames/getStackFramesFromError.js.map +1 -1
  62. package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js +1 -1
  63. package/dist/cjs/instrumentations/errors/stackFrames/parseStacktrace.js.map +1 -1
  64. package/dist/cjs/instrumentations/navigation/instrumentation.js +27 -45
  65. package/dist/cjs/instrumentations/navigation/instrumentation.js.map +1 -1
  66. package/dist/cjs/instrumentations/performance/instrumentation.js +19 -74
  67. package/dist/cjs/instrumentations/performance/instrumentation.js.map +1 -1
  68. package/dist/cjs/instrumentations/performance/navigation.js +15 -26
  69. package/dist/cjs/instrumentations/performance/navigation.js.map +1 -1
  70. package/dist/cjs/instrumentations/performance/performanceUtils.js +18 -33
  71. package/dist/cjs/instrumentations/performance/performanceUtils.js.map +1 -1
  72. package/dist/cjs/instrumentations/performance/resource.js +13 -25
  73. package/dist/cjs/instrumentations/performance/resource.js.map +1 -1
  74. package/dist/cjs/instrumentations/session/instrumentation.js +45 -74
  75. package/dist/cjs/instrumentations/session/instrumentation.js.map +1 -1
  76. package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js +21 -24
  77. package/dist/cjs/instrumentations/session/sessionManager/PersistentSessionsManager.js.map +1 -1
  78. package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js +21 -24
  79. package/dist/cjs/instrumentations/session/sessionManager/VolatileSessionManager.js.map +1 -1
  80. package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js +2 -2
  81. package/dist/cjs/instrumentations/session/sessionManager/getSessionManagerByConfig.js.map +1 -1
  82. package/dist/cjs/instrumentations/session/sessionManager/sampling.js +5 -5
  83. package/dist/cjs/instrumentations/session/sessionManager/sampling.js.map +1 -1
  84. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js +47 -65
  85. package/dist/cjs/instrumentations/session/sessionManager/sessionManagerUtils.js.map +1 -1
  86. package/dist/cjs/instrumentations/userActions/instrumentation.js +15 -34
  87. package/dist/cjs/instrumentations/userActions/instrumentation.js.map +1 -1
  88. package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js +11 -11
  89. package/dist/cjs/instrumentations/userActions/processUserActionEventHandler.js.map +1 -1
  90. package/dist/cjs/instrumentations/userActions/userActionController.js +49 -53
  91. package/dist/cjs/instrumentations/userActions/userActionController.js.map +1 -1
  92. package/dist/cjs/instrumentations/userActions/util.js +4 -4
  93. package/dist/cjs/instrumentations/userActions/util.js.map +1 -1
  94. package/dist/cjs/instrumentations/view/instrumentation.js +12 -30
  95. package/dist/cjs/instrumentations/view/instrumentation.js.map +1 -1
  96. package/dist/cjs/instrumentations/webVitals/instrumentation.js +11 -29
  97. package/dist/cjs/instrumentations/webVitals/instrumentation.js.map +1 -1
  98. package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js +87 -94
  99. package/dist/cjs/instrumentations/webVitals/webVitalsWithAttribution.js.map +1 -1
  100. package/dist/cjs/metas/browser/meta.js +13 -14
  101. package/dist/cjs/metas/browser/meta.js.map +1 -1
  102. package/dist/cjs/metas/index.js +3 -1
  103. package/dist/cjs/metas/index.js.map +1 -1
  104. package/dist/cjs/metas/k6/meta.js +3 -14
  105. package/dist/cjs/metas/k6/meta.js.map +1 -1
  106. package/dist/cjs/metas/os/index.js +6 -0
  107. package/dist/cjs/metas/os/index.js.map +1 -0
  108. package/dist/cjs/metas/os/meta.js +20 -0
  109. package/dist/cjs/metas/os/meta.js.map +1 -0
  110. package/dist/cjs/metas/page/meta.js +7 -19
  111. package/dist/cjs/metas/page/meta.js.map +1 -1
  112. package/dist/cjs/metas/sdk/meta.js +3 -3
  113. package/dist/cjs/metas/sdk/meta.js.map +1 -1
  114. package/dist/cjs/metas/session/createSession.js +2 -2
  115. package/dist/cjs/metas/session/createSession.js.map +1 -1
  116. package/dist/cjs/metas/shared/index.js +6 -0
  117. package/dist/cjs/metas/shared/index.js.map +1 -0
  118. package/dist/cjs/metas/shared/uaParser.js +18 -0
  119. package/dist/cjs/metas/shared/uaParser.js.map +1 -0
  120. package/dist/cjs/transports/console/transport.js +10 -29
  121. package/dist/cjs/transports/console/transport.js.map +1 -1
  122. package/dist/cjs/transports/fetch/transport.js +82 -176
  123. package/dist/cjs/transports/fetch/transport.js.map +1 -1
  124. package/dist/cjs/utils/throttle.js +6 -10
  125. package/dist/cjs/utils/throttle.js.map +1 -1
  126. package/dist/cjs/utils/url.js +4 -5
  127. package/dist/cjs/utils/url.js.map +1 -1
  128. package/dist/cjs/utils/webStorage.js +4 -4
  129. package/dist/cjs/utils/webStorage.js.map +1 -1
  130. package/dist/esm/config/makeCoreConfig.js +2 -1
  131. package/dist/esm/config/makeCoreConfig.js.map +1 -1
  132. package/dist/esm/index.js +1 -1
  133. package/dist/esm/index.js.map +1 -1
  134. package/dist/esm/instrumentations/_internal/activityWindowTracker.js +10 -5
  135. package/dist/esm/instrumentations/_internal/activityWindowTracker.js.map +1 -1
  136. package/dist/esm/instrumentations/errors/getErrorDetails.js +1 -0
  137. package/dist/esm/instrumentations/errors/getErrorDetails.js.map +1 -1
  138. package/dist/esm/metas/browser/meta.js +5 -6
  139. package/dist/esm/metas/browser/meta.js.map +1 -1
  140. package/dist/esm/metas/index.js +1 -0
  141. package/dist/esm/metas/index.js.map +1 -1
  142. package/dist/esm/metas/os/index.js +2 -0
  143. package/dist/esm/metas/os/index.js.map +1 -0
  144. package/dist/esm/metas/os/meta.js +16 -0
  145. package/dist/esm/metas/os/meta.js.map +1 -0
  146. package/dist/esm/metas/shared/index.js +2 -0
  147. package/dist/esm/metas/shared/index.js.map +1 -0
  148. package/dist/esm/metas/shared/uaParser.js +15 -0
  149. package/dist/esm/metas/shared/uaParser.js.map +1 -0
  150. package/dist/esm/transports/fetch/transport.js +1 -1
  151. package/dist/esm/transports/fetch/transport.js.map +1 -1
  152. package/dist/types/index.d.ts +2 -2
  153. package/dist/types/instrumentations/console/instrumentation.d.ts +1 -1
  154. package/dist/types/instrumentations/csp/instrumentation.d.ts +1 -1
  155. package/dist/types/instrumentations/errors/instrumentation.d.ts +1 -1
  156. package/dist/types/instrumentations/navigation/instrumentation.d.ts +1 -1
  157. package/dist/types/instrumentations/performance/instrumentation.d.ts +1 -1
  158. package/dist/types/instrumentations/session/instrumentation.d.ts +1 -1
  159. package/dist/types/instrumentations/userActions/instrumentation.d.ts +1 -1
  160. package/dist/types/instrumentations/view/instrumentation.d.ts +1 -1
  161. package/dist/types/instrumentations/webVitals/instrumentation.d.ts +1 -1
  162. package/dist/types/metas/index.d.ts +1 -0
  163. package/dist/types/metas/os/index.d.ts +1 -0
  164. package/dist/types/metas/os/meta.d.ts +2 -0
  165. package/dist/types/metas/shared/index.d.ts +1 -0
  166. package/dist/types/metas/shared/uaParser.d.ts +4 -0
  167. package/dist/types/transports/console/transport.d.ts +1 -1
  168. package/dist/types/transports/fetch/transport.d.ts +1 -1
  169. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":";;AAQA,sCAEC;AAQD,oCAEC;AASD,gDAcC;AA3CD,gDAAyE;AAGzE;;;;GAIG;AACH,SAAgB,aAAa;IAC3B,OAAO,gBAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,UAAC,SAAoB,IAAK,OAAA,SAAS,CAAC,aAAa,EAAE,EAAzB,CAAyB,CAAC,CAAC;AACjG,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,GAAQ;IAAR,oBAAA,EAAA,QAAQ;IACnC,OAAO,aAAa,EAAE,CAAC,IAAI,CAAC,UAAC,UAAU,IAAK,OAAA,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,EAApC,CAAoC,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,QAAa;IAC9C,IAAI,IAAA,oBAAQ,EAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,YAAY,GAAG,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,IAAI,IAAA,sBAAU,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import { faro, isEmpty, isFunction, isString } from '@grafana/faro-core';\nimport type { Patterns, Transport } from '@grafana/faro-core';\n\n/**\n * Retrieves a list of URLs to be ignored by aggregating the ignore URLs from all transports.\n *\n * @returns {string[]} An array of URLs to be ignored.\n */\nexport function getIgnoreUrls(): Patterns {\n return faro.transports.transports.flatMap((transport: Transport) => transport.getIgnoreUrls());\n}\n\n/**\n * Checks if the given URL should be ignored based on a list of ignored URLs.\n *\n * @param url - The URL to check.\n * @returns `true` if the URL is in the list of ignored URLs, `false` otherwise.\n */\nexport function isUrlIgnored(url = ''): boolean {\n return getIgnoreUrls().some((ignoredUrl) => url && url.match(ignoredUrl) != null);\n}\n\n/**\n * Extracts a URL string from the given resource.\n *\n * @param resource - The input resource which can be a string, a URL object, or an object with a `toString` method.\n * @returns The URL as a string if the resource is a valid URL-like object, or `undefined` if the resource is not valid.\n *\n */\nexport function getUrlFromResource(resource: any): string | undefined {\n if (isString(resource)) {\n return resource;\n }\n\n if (resource instanceof URL) {\n return resource.href;\n }\n\n if (!isEmpty(resource) && isFunction(resource?.toString)) {\n return resource.toString();\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":";;AAQA,sCAEC;AAQD,oCAEC;AASD,gDAcC;AA3CD,kDAAyE;AAGzE;;;;GAIG;AACH,SAAgB,aAAa;IAC3B,OAAO,gBAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;AACjG,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,GAAG,GAAG,EAAE;IACnC,OAAO,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,QAAa;IAC9C,IAAI,IAAA,oBAAQ,EAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,YAAY,GAAG,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,IAAI,IAAA,sBAAU,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import { faro, isEmpty, isFunction, isString } from '@grafana/faro-core';\nimport type { Patterns, Transport } from '@grafana/faro-core';\n\n/**\n * Retrieves a list of URLs to be ignored by aggregating the ignore URLs from all transports.\n *\n * @returns {string[]} An array of URLs to be ignored.\n */\nexport function getIgnoreUrls(): Patterns {\n return faro.transports.transports.flatMap((transport: Transport) => transport.getIgnoreUrls());\n}\n\n/**\n * Checks if the given URL should be ignored based on a list of ignored URLs.\n *\n * @param url - The URL to check.\n * @returns `true` if the URL is in the list of ignored URLs, `false` otherwise.\n */\nexport function isUrlIgnored(url = ''): boolean {\n return getIgnoreUrls().some((ignoredUrl) => url && url.match(ignoredUrl) != null);\n}\n\n/**\n * Extracts a URL string from the given resource.\n *\n * @param resource - The input resource which can be a string, a URL object, or an object with a `toString` method.\n * @returns The URL as a string if the resource is a valid URL-like object, or `undefined` if the resource is not valid.\n *\n */\nexport function getUrlFromResource(resource: any): string | undefined {\n if (isString(resource)) {\n return resource;\n }\n\n if (resource instanceof URL) {\n return resource.href;\n }\n\n if (!isEmpty(resource) && isFunction(resource?.toString)) {\n return resource.toString();\n }\n\n return undefined;\n}\n"]}
@@ -5,7 +5,7 @@ exports.isWebStorageAvailable = isWebStorageAvailable;
5
5
  exports.getItem = getItem;
6
6
  exports.setItem = setItem;
7
7
  exports.removeItem = removeItem;
8
- var faro_core_1 = require("@grafana/faro-core");
8
+ const faro_core_1 = require("@grafana/faro-core");
9
9
  exports.webStorageType = {
10
10
  session: 'sessionStorage',
11
11
  local: 'localStorage',
@@ -18,16 +18,16 @@ exports.webStorageType = {
18
18
  function isWebStorageAvailable(type) {
19
19
  var _a;
20
20
  try {
21
- var storage = void 0;
21
+ let storage;
22
22
  storage = window[type];
23
- var testItem = '__faro_storage_test__';
23
+ const testItem = '__faro_storage_test__';
24
24
  storage.setItem(testItem, testItem);
25
25
  storage.removeItem(testItem);
26
26
  return true;
27
27
  }
28
28
  catch (error) {
29
29
  // the above can throw
30
- (_a = faro_core_1.faro.internalLogger) === null || _a === void 0 ? void 0 : _a.info("Web storage of type ".concat(type, " is not available. Reason: ").concat(error));
30
+ (_a = faro_core_1.faro.internalLogger) === null || _a === void 0 ? void 0 : _a.info(`Web storage of type ${type} is not available. Reason: ${error}`);
31
31
  return false;
32
32
  }
33
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":";;;AAcA,sDAcC;AAOD,0BAMC;AAQD,0BAQC;AAOD,gCAIC;AApED,gDAA0C;AAE7B,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,cAAc;CACb,CAAC;AAIX;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,IAAsB;;IAC1D,IAAI,CAAC;QACH,IAAI,OAAO,SAAA,CAAC;QACZ,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB;QACtB,MAAA,gBAAI,CAAC,cAAc,0CAAE,IAAI,CAAC,8BAAuB,IAAI,wCAA8B,KAAK,CAAE,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,mBAAqC;IACxE,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,mBAAqC;IACvF,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,aAAa;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,GAAW,EAAE,mBAAqC;IAC3E,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAEY,QAAA,uBAAuB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,yBAAyB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,OAAO,CAAC,CAAC;AAEvF,SAAS,yBAAyB,CAAC,mBAAqC;IACtE,IAAI,mBAAmB,KAAK,sBAAc,CAAC,KAAK,EAAE,CAAC;QACjD,OAAO,+BAAuB,CAAC;IACjC,CAAC;IAED,IAAI,mBAAmB,KAAK,sBAAc,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,iCAAyB,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { faro } from '@grafana/faro-core';\n\nexport const webStorageType = {\n session: 'sessionStorage',\n local: 'localStorage',\n} as const;\n\ntype StorageMechanism = (typeof webStorageType)[keyof typeof webStorageType];\n\n/**\n * Check if selected web storage mechanism is available.\n * @param type storage mechanism to test availability for.\n * @returns\n */\nexport function isWebStorageAvailable(type: StorageMechanism): boolean {\n try {\n let storage;\n storage = window[type];\n\n const testItem = '__faro_storage_test__';\n storage.setItem(testItem, testItem);\n storage.removeItem(testItem);\n return true;\n } catch (error) {\n // the above can throw\n faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`);\n return false;\n }\n}\n\n/**\n * Get item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function getItem(key: string, webStorageMechanism: StorageMechanism): string | null {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n return window[webStorageMechanism].getItem(key);\n }\n\n return null;\n}\n\n/**\n * Store item in SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param value: the item data.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function setItem(key: string, value: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n try {\n window[webStorageMechanism].setItem(key, value);\n } catch (_error) {\n // do nothing\n }\n }\n}\n\n/**\n * Remove item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function removeItem(key: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n window[webStorageMechanism].removeItem(key);\n }\n}\n\nexport const isLocalStorageAvailable = isWebStorageAvailable(webStorageType.local);\nexport const isSessionStorageAvailable = isWebStorageAvailable(webStorageType.session);\n\nfunction isWebStorageTypeAvailable(webStorageMechanism: StorageMechanism) {\n if (webStorageMechanism === webStorageType.local) {\n return isLocalStorageAvailable;\n }\n\n if (webStorageMechanism === webStorageType.session) {\n return isSessionStorageAvailable;\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"file":"webStorage.js","sourceRoot":"","sources":["../../../src/utils/webStorage.ts"],"names":[],"mappings":";;;AAcA,sDAcC;AAOD,0BAMC;AAQD,0BAQC;AAOD,gCAIC;AApED,kDAA0C;AAE7B,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,cAAc;CACb,CAAC;AAIX;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,IAAsB;;IAC1D,IAAI,CAAC;QACH,IAAI,OAAO,CAAC;QACZ,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,QAAQ,GAAG,uBAAuB,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB;QACtB,MAAA,gBAAI,CAAC,cAAc,0CAAE,IAAI,CAAC,uBAAuB,IAAI,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,mBAAqC;IACxE,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,mBAAqC;IACvF,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,aAAa;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,GAAW,EAAE,mBAAqC;IAC3E,IAAI,yBAAyB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAEY,QAAA,uBAAuB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,yBAAyB,GAAG,qBAAqB,CAAC,sBAAc,CAAC,OAAO,CAAC,CAAC;AAEvF,SAAS,yBAAyB,CAAC,mBAAqC;IACtE,IAAI,mBAAmB,KAAK,sBAAc,CAAC,KAAK,EAAE,CAAC;QACjD,OAAO,+BAAuB,CAAC;IACjC,CAAC;IAED,IAAI,mBAAmB,KAAK,sBAAc,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,iCAAyB,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { faro } from '@grafana/faro-core';\n\nexport const webStorageType = {\n session: 'sessionStorage',\n local: 'localStorage',\n} as const;\n\ntype StorageMechanism = (typeof webStorageType)[keyof typeof webStorageType];\n\n/**\n * Check if selected web storage mechanism is available.\n * @param type storage mechanism to test availability for.\n * @returns\n */\nexport function isWebStorageAvailable(type: StorageMechanism): boolean {\n try {\n let storage;\n storage = window[type];\n\n const testItem = '__faro_storage_test__';\n storage.setItem(testItem, testItem);\n storage.removeItem(testItem);\n return true;\n } catch (error) {\n // the above can throw\n faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`);\n return false;\n }\n}\n\n/**\n * Get item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function getItem(key: string, webStorageMechanism: StorageMechanism): string | null {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n return window[webStorageMechanism].getItem(key);\n }\n\n return null;\n}\n\n/**\n * Store item in SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param value: the item data.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function setItem(key: string, value: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n try {\n window[webStorageMechanism].setItem(key, value);\n } catch (_error) {\n // do nothing\n }\n }\n}\n\n/**\n * Remove item from SessionStorage or LocalStorage.\n * @param key: the item key.\n * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage.\n */\nexport function removeItem(key: string, webStorageMechanism: StorageMechanism): void {\n if (isWebStorageTypeAvailable(webStorageMechanism)) {\n window[webStorageMechanism].removeItem(key);\n }\n}\n\nexport const isLocalStorageAvailable = isWebStorageAvailable(webStorageType.local);\nexport const isSessionStorageAvailable = isWebStorageAvailable(webStorageType.session);\n\nfunction isWebStorageTypeAvailable(webStorageMechanism: StorageMechanism) {\n if (webStorageMechanism === webStorageType.local) {\n return isLocalStorageAvailable;\n }\n\n if (webStorageMechanism === webStorageType.session) {\n return isSessionStorageAvailable;\n }\n\n return false;\n}\n"]}
@@ -14,7 +14,7 @@ import { defaultEventDomain } from '../consts';
14
14
  import { parseStacktrace } from '../instrumentations';
15
15
  import { defaultSessionTrackingConfig } from '../instrumentations/session';
16
16
  import { userActionDataAttribute } from '../instrumentations/userActions/const';
17
- import { browserMeta, sdkMeta } from '../metas';
17
+ import { browserMeta, osMeta, sdkMeta } from '../metas';
18
18
  import { k6Meta } from '../metas/k6';
19
19
  import { createPageMeta } from '../metas/page';
20
20
  import { FetchTransport } from '../transports';
@@ -87,6 +87,7 @@ function createDefaultMetas(browserConfig) {
87
87
  const { page, generatePageId } = (_a = browserConfig === null || browserConfig === void 0 ? void 0 : browserConfig.pageTracking) !== null && _a !== void 0 ? _a : {};
88
88
  const initialMetas = [
89
89
  browserMeta,
90
+ osMeta,
90
91
  createPageMeta({ generatePageId, initialPageMeta: page }),
91
92
  ...((_b = browserConfig.metas) !== null && _b !== void 0 ? _b : []),
92
93
  sdkMeta,
@@ -1 +1 @@
1
- {"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createInternalLogger,\n defaultBatchingConfig,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogArgsSerializer,\n defaultUnpatchedConsole,\n isBoolean,\n isEmpty,\n isObject,\n} from '@grafana/faro-core';\nimport type { Config, Instrumentation, MetaItem, MetaSession, Transport } from '@grafana/faro-core';\n\nimport { defaultEventDomain } from '../consts';\nimport { parseStacktrace } from '../instrumentations';\nimport { defaultSessionTrackingConfig } from '../instrumentations/session';\nimport { userActionDataAttribute } from '../instrumentations/userActions/const';\nimport { browserMeta, sdkMeta } from '../metas';\nimport { k6Meta } from '../metas/k6';\nimport { createPageMeta } from '../metas/page';\nimport { FetchTransport } from '../transports';\n\nimport { getWebInstrumentations } from './getWebInstrumentations';\nimport type { BrowserConfig } from './types';\n\nexport function makeCoreConfig(browserConfig: BrowserConfig): Config {\n const transports: Transport[] = [];\n\n const internalLogger = createInternalLogger(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);\n\n if (browserConfig.transports) {\n if (browserConfig.url || browserConfig.apiKey) {\n internalLogger.error('if \"transports\" is defined, \"url\" and \"apiKey\" should not be defined');\n }\n\n transports.push(...browserConfig.transports);\n } else if (browserConfig.url) {\n transports.push(\n new FetchTransport({\n url: browserConfig.url,\n apiKey: browserConfig.apiKey,\n })\n );\n } else {\n internalLogger.error('either \"url\" or \"transports\" must be defined');\n }\n\n const {\n // properties with default values\n dedupe = true,\n eventDomain = defaultEventDomain,\n globalObjectKey = defaultGlobalObjectKey,\n instrumentations = getWebInstrumentations(),\n internalLoggerLevel = defaultInternalLoggerLevel,\n isolate = false,\n logArgsSerializer = defaultLogArgsSerializer,\n metas = createDefaultMetas(browserConfig),\n paused = false,\n preventGlobalExposure = false,\n unpatchedConsole = defaultUnpatchedConsole,\n url: browserConfigUrl,\n experimental,\n // Properties without default values or which aren't used to create derived config\n ...restProperties\n }: BrowserConfig = browserConfig;\n\n // Extract experimental features with defaults\n const trackNavigation = experimental?.trackNavigation ?? false;\n\n // Extract user actions instrumentation with defaults\n const userActionsInstrumentation = {\n dataAttributeName: browserConfig.userActionsInstrumentation?.dataAttributeName ?? userActionDataAttribute,\n excludeItem: browserConfig.userActionsInstrumentation?.excludeItem,\n };\n\n return {\n ...restProperties,\n\n batching: {\n ...defaultBatchingConfig,\n ...browserConfig.batching,\n },\n dedupe: dedupe,\n globalObjectKey,\n instrumentations: getFilteredInstrumentations(instrumentations, browserConfig),\n internalLoggerLevel,\n isolate,\n logArgsSerializer,\n metas,\n parseStacktrace,\n paused,\n preventGlobalExposure,\n transports,\n unpatchedConsole,\n eventDomain,\n ignoreUrls: [\n ...(browserConfig.ignoreUrls ?? []),\n // ignore configured cloud collector url by default\n ...(browserConfigUrl ? [browserConfigUrl] : []),\n // Try our best to exclude collector URLs form other Faro instances. By default these are URLs ending with /collect or /collect/ followed by alphanumeric characters.\n /\\/collect(?:\\/[\\w]*)?$/,\n ],\n sessionTracking: {\n ...defaultSessionTrackingConfig,\n ...browserConfig.sessionTracking,\n ...crateSessionMeta({\n trackGeolocation: browserConfig.trackGeolocation,\n sessionTracking: browserConfig.sessionTracking,\n }),\n },\n userActionsInstrumentation,\n experimental: {\n trackNavigation,\n },\n };\n}\n\nfunction getFilteredInstrumentations(\n instrumentations: Instrumentation[],\n { experimental }: BrowserConfig\n): Instrumentation[] {\n const trackNavigation = experimental?.trackNavigation ?? false;\n\n return instrumentations.filter((instr) => {\n if (instr.name === '@grafana/faro-web-sdk:instrumentation-navigation' && !trackNavigation) {\n return false;\n }\n return true;\n });\n}\n\nfunction createDefaultMetas(browserConfig: BrowserConfig): MetaItem[] {\n const { page, generatePageId } = browserConfig?.pageTracking ?? {};\n\n const initialMetas: MetaItem[] = [\n browserMeta,\n createPageMeta({ generatePageId, initialPageMeta: page }),\n ...(browserConfig.metas ?? []),\n sdkMeta,\n ];\n\n const isK6BrowserSession = isObject((window as any)?.k6);\n if (isK6BrowserSession) {\n return [...initialMetas, k6Meta];\n }\n\n return initialMetas;\n}\n\nfunction crateSessionMeta({\n trackGeolocation,\n sessionTracking,\n}: Pick<BrowserConfig, 'trackGeolocation' | 'sessionTracking'>): { session: MetaSession } | {} {\n const overrides: MetaSession['overrides'] = {};\n\n if (isBoolean(trackGeolocation)) {\n overrides.geoLocationTrackingEnabled = trackGeolocation;\n }\n\n if (isEmpty(overrides)) {\n return {};\n }\n\n return {\n session: {\n ...(sessionTracking?.session ?? {}),\n overrides,\n },\n };\n}\n"]}
1
+ {"version":3,"file":"makeCoreConfig.js","sourceRoot":"","sources":["../../../src/config/makeCoreConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createInternalLogger,\n defaultBatchingConfig,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogArgsSerializer,\n defaultUnpatchedConsole,\n isBoolean,\n isEmpty,\n isObject,\n} from '@grafana/faro-core';\nimport type { Config, Instrumentation, MetaItem, MetaSession, Transport } from '@grafana/faro-core';\n\nimport { defaultEventDomain } from '../consts';\nimport { parseStacktrace } from '../instrumentations';\nimport { defaultSessionTrackingConfig } from '../instrumentations/session';\nimport { userActionDataAttribute } from '../instrumentations/userActions/const';\nimport { browserMeta, osMeta, sdkMeta } from '../metas';\nimport { k6Meta } from '../metas/k6';\nimport { createPageMeta } from '../metas/page';\nimport { FetchTransport } from '../transports';\n\nimport { getWebInstrumentations } from './getWebInstrumentations';\nimport type { BrowserConfig } from './types';\n\nexport function makeCoreConfig(browserConfig: BrowserConfig): Config {\n const transports: Transport[] = [];\n\n const internalLogger = createInternalLogger(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel);\n\n if (browserConfig.transports) {\n if (browserConfig.url || browserConfig.apiKey) {\n internalLogger.error('if \"transports\" is defined, \"url\" and \"apiKey\" should not be defined');\n }\n\n transports.push(...browserConfig.transports);\n } else if (browserConfig.url) {\n transports.push(\n new FetchTransport({\n url: browserConfig.url,\n apiKey: browserConfig.apiKey,\n })\n );\n } else {\n internalLogger.error('either \"url\" or \"transports\" must be defined');\n }\n\n const {\n // properties with default values\n dedupe = true,\n eventDomain = defaultEventDomain,\n globalObjectKey = defaultGlobalObjectKey,\n instrumentations = getWebInstrumentations(),\n internalLoggerLevel = defaultInternalLoggerLevel,\n isolate = false,\n logArgsSerializer = defaultLogArgsSerializer,\n metas = createDefaultMetas(browserConfig),\n paused = false,\n preventGlobalExposure = false,\n unpatchedConsole = defaultUnpatchedConsole,\n url: browserConfigUrl,\n experimental,\n // Properties without default values or which aren't used to create derived config\n ...restProperties\n }: BrowserConfig = browserConfig;\n\n // Extract experimental features with defaults\n const trackNavigation = experimental?.trackNavigation ?? false;\n\n // Extract user actions instrumentation with defaults\n const userActionsInstrumentation = {\n dataAttributeName: browserConfig.userActionsInstrumentation?.dataAttributeName ?? userActionDataAttribute,\n excludeItem: browserConfig.userActionsInstrumentation?.excludeItem,\n };\n\n return {\n ...restProperties,\n\n batching: {\n ...defaultBatchingConfig,\n ...browserConfig.batching,\n },\n dedupe: dedupe,\n globalObjectKey,\n instrumentations: getFilteredInstrumentations(instrumentations, browserConfig),\n internalLoggerLevel,\n isolate,\n logArgsSerializer,\n metas,\n parseStacktrace,\n paused,\n preventGlobalExposure,\n transports,\n unpatchedConsole,\n eventDomain,\n ignoreUrls: [\n ...(browserConfig.ignoreUrls ?? []),\n // ignore configured cloud collector url by default\n ...(browserConfigUrl ? [browserConfigUrl] : []),\n // Try our best to exclude collector URLs form other Faro instances. By default these are URLs ending with /collect or /collect/ followed by alphanumeric characters.\n /\\/collect(?:\\/[\\w]*)?$/,\n ],\n sessionTracking: {\n ...defaultSessionTrackingConfig,\n ...browserConfig.sessionTracking,\n ...crateSessionMeta({\n trackGeolocation: browserConfig.trackGeolocation,\n sessionTracking: browserConfig.sessionTracking,\n }),\n },\n userActionsInstrumentation,\n experimental: {\n trackNavigation,\n },\n };\n}\n\nfunction getFilteredInstrumentations(\n instrumentations: Instrumentation[],\n { experimental }: BrowserConfig\n): Instrumentation[] {\n const trackNavigation = experimental?.trackNavigation ?? false;\n\n return instrumentations.filter((instr) => {\n if (instr.name === '@grafana/faro-web-sdk:instrumentation-navigation' && !trackNavigation) {\n return false;\n }\n return true;\n });\n}\n\nfunction createDefaultMetas(browserConfig: BrowserConfig): MetaItem[] {\n const { page, generatePageId } = browserConfig?.pageTracking ?? {};\n\n const initialMetas: MetaItem[] = [\n browserMeta,\n osMeta,\n createPageMeta({ generatePageId, initialPageMeta: page }),\n ...(browserConfig.metas ?? []),\n sdkMeta,\n ];\n\n const isK6BrowserSession = isObject((window as any)?.k6);\n if (isK6BrowserSession) {\n return [...initialMetas, k6Meta];\n }\n\n return initialMetas;\n}\n\nfunction crateSessionMeta({\n trackGeolocation,\n sessionTracking,\n}: Pick<BrowserConfig, 'trackGeolocation' | 'sessionTracking'>): { session: MetaSession } | {} {\n const overrides: MetaSession['overrides'] = {};\n\n if (isBoolean(trackGeolocation)) {\n overrides.geoLocationTrackingEnabled = trackGeolocation;\n }\n\n if (isEmpty(overrides)) {\n return {};\n }\n\n return {\n session: {\n ...(sessionTracking?.session ?? {}),\n overrides,\n },\n };\n}\n"]}
package/dist/esm/index.js CHANGED
@@ -2,7 +2,7 @@ export { getWebInstrumentations, makeCoreConfig } from './config';
2
2
  export { defaultEventDomain } from './consts';
3
3
  export { initializeFaro } from './initialize';
4
4
  export { buildStackFrame, ConsoleInstrumentation, ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, PerformanceInstrumentation, CSPInstrumentation, UserActionInstrumentation, NavigationInstrumentation, } from './instrumentations';
5
- export { browserMeta, createSession, sdkMeta } from './metas';
5
+ export { browserMeta, createSession, osMeta, sdkMeta } from './metas';
6
6
  export { ConsoleTransport, FetchTransport } from './transports';
7
7
  export { faro, allLogLevels, BaseExtension, BaseInstrumentation, BaseTransport, createInternalLogger, createPromiseBuffer, deepEqual, defaultExceptionType, defaultGlobalObjectKey, defaultInternalLoggerLevel, defaultLogLevel, genShortID, getCurrentTimestamp, getInternalFaroFromGlobalObject, getTransportBody, globalObject, internalGlobalObjectKey, isArray, isBoolean, isDomError, isDomException, isElement, isElementDefined, isError, isErrorDefined, isErrorEvent, isEvent, isEventDefined, isFunction, isInstanceOf, isInt, isInternalFaroOnGlobalObject, isMap, isMapDefined, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isSymbol, isSyntheticEvent, isThenable, isToString, isTypeof, isUndefined, isEmpty, InternalLoggerLevel, LogLevel, noop, setInternalFaroOnGlobalObject, TransportItemType, transportItemTypeToBodyKey, VERSION, EVENT_CLICK, EVENT_NAVIGATION, EVENT_ROUTE_CHANGE, EVENT_SESSION_EXTEND, EVENT_SESSION_RESUME, EVENT_SESSION_START, EVENT_VIEW_CHANGED, Observable, unknownString, UserActionState, } from '@grafana/faro-core';
8
8
  export { PersistentSessionsManager, VolatileSessionsManager, MAX_SESSION_PERSISTENCE_TIME, SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME, STORAGE_KEY, } from './instrumentations/session';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQhE,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,EACZ,KAAK,EACL,4BAA4B,EAC5B,KAAK,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,6BAA6B,EAC7B,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,eAAe,GAEhB,MAAM,oBAAoB,CAAC;AAmE5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { getWebInstrumentations, makeCoreConfig } from './config';\nexport type { BrowserConfig } from './config';\n\nexport { defaultEventDomain } from './consts';\n\nexport { initializeFaro } from './initialize';\n\nexport {\n buildStackFrame,\n ConsoleInstrumentation,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n ViewInstrumentation,\n WebVitalsInstrumentation,\n SessionInstrumentation,\n PerformanceInstrumentation,\n CSPInstrumentation,\n UserActionInstrumentation,\n NavigationInstrumentation,\n} from './instrumentations';\nexport type { ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations';\n\nexport { browserMeta, createSession, sdkMeta } from './metas';\n\nexport { ConsoleTransport, FetchTransport } from './transports';\nexport type {\n ClockFn,\n ConsoleTransportOptions,\n FetchTransportOptions,\n FetchTransportRequestOptions,\n} from './transports';\n\nexport {\n faro,\n allLogLevels,\n BaseExtension,\n BaseInstrumentation,\n BaseTransport,\n createInternalLogger,\n createPromiseBuffer,\n deepEqual,\n defaultExceptionType,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogLevel,\n genShortID,\n getCurrentTimestamp,\n getInternalFaroFromGlobalObject,\n getTransportBody,\n globalObject,\n internalGlobalObjectKey,\n isArray,\n isBoolean,\n isDomError,\n isDomException,\n isElement,\n isElementDefined,\n isError,\n isErrorDefined,\n isErrorEvent,\n isEvent,\n isEventDefined,\n isFunction,\n isInstanceOf,\n isInt,\n isInternalFaroOnGlobalObject,\n isMap,\n isMapDefined,\n isNull,\n isNumber,\n isObject,\n isPrimitive,\n isRegExp,\n isString,\n isSymbol,\n isSyntheticEvent,\n isThenable,\n isToString,\n isTypeof,\n isUndefined,\n isEmpty,\n InternalLoggerLevel,\n LogLevel,\n noop,\n setInternalFaroOnGlobalObject,\n TransportItemType,\n transportItemTypeToBodyKey,\n VERSION,\n EVENT_CLICK,\n EVENT_NAVIGATION,\n EVENT_ROUTE_CHANGE,\n EVENT_SESSION_EXTEND,\n EVENT_SESSION_RESUME,\n EVENT_SESSION_START,\n EVENT_VIEW_CHANGED,\n Observable,\n unknownString,\n UserActionState,\n type UserActionInternalInterface,\n} from '@grafana/faro-core';\n\nexport type {\n Faro,\n API,\n APIEvent,\n BaseObject,\n BaseObjectKey,\n BaseObjectPrimitiveValue,\n BaseObjectValue,\n BeforeSendHook,\n BufferItem,\n Config,\n EventAttributes,\n EventEvent,\n EventsAPI,\n ExceptionEvent,\n ExceptionEventExtended,\n ExceptionStackFrame,\n ExceptionsAPI,\n ExtendedError,\n Extension,\n GlobalObject,\n Instrumentation,\n Instrumentations,\n InternalLogger,\n LogContext,\n LogEvent,\n LogsAPI,\n MeasurementEvent,\n MeasurementsAPI,\n Meta,\n MetaAPI,\n MetaApp,\n MetaAttributes,\n MetaBrowser,\n MetaGetter,\n MetaItem,\n MetaPage,\n Metas,\n MetaSDK,\n MetaSDKIntegration,\n MetaSession,\n MetaUser,\n MetaView,\n OTELApi,\n Patterns,\n PromiseBuffer,\n PromiseBufferOptions,\n PromiseProducer,\n PushErrorOptions,\n PushLogOptions,\n PushMeasurementOptions,\n Stacktrace,\n StacktraceParser,\n TraceContext,\n TraceEvent,\n TracesAPI,\n Transport,\n TransportBody,\n TransportItem,\n TransportItemPayload,\n Transports,\n UnpatchedConsole,\n UserActionImportance,\n} from '@grafana/faro-core';\n\nexport {\n PersistentSessionsManager,\n VolatileSessionsManager,\n MAX_SESSION_PERSISTENCE_TIME,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n} from './instrumentations/session';\n\nexport { getIgnoreUrls, getUrlFromResource } from './utils/url';\n\nexport { userActionDataAttribute } from './instrumentations/userActions';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQhE,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,UAAU,EACV,YAAY,EACZ,KAAK,EACL,4BAA4B,EAC5B,KAAK,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,QAAQ,EACR,IAAI,EACJ,6BAA6B,EAC7B,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,eAAe,GAEhB,MAAM,oBAAoB,CAAC;AAqE5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["export { getWebInstrumentations, makeCoreConfig } from './config';\nexport type { BrowserConfig } from './config';\n\nexport { defaultEventDomain } from './consts';\n\nexport { initializeFaro } from './initialize';\n\nexport {\n buildStackFrame,\n ConsoleInstrumentation,\n ErrorsInstrumentation,\n getDataFromSafariExtensions,\n getStackFramesFromError,\n parseStacktrace,\n ViewInstrumentation,\n WebVitalsInstrumentation,\n SessionInstrumentation,\n PerformanceInstrumentation,\n CSPInstrumentation,\n UserActionInstrumentation,\n NavigationInstrumentation,\n} from './instrumentations';\nexport type { ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations';\n\nexport { browserMeta, createSession, osMeta, sdkMeta } from './metas';\n\nexport { ConsoleTransport, FetchTransport } from './transports';\nexport type {\n ClockFn,\n ConsoleTransportOptions,\n FetchTransportOptions,\n FetchTransportRequestOptions,\n} from './transports';\n\nexport {\n faro,\n allLogLevels,\n BaseExtension,\n BaseInstrumentation,\n BaseTransport,\n createInternalLogger,\n createPromiseBuffer,\n deepEqual,\n defaultExceptionType,\n defaultGlobalObjectKey,\n defaultInternalLoggerLevel,\n defaultLogLevel,\n genShortID,\n getCurrentTimestamp,\n getInternalFaroFromGlobalObject,\n getTransportBody,\n globalObject,\n internalGlobalObjectKey,\n isArray,\n isBoolean,\n isDomError,\n isDomException,\n isElement,\n isElementDefined,\n isError,\n isErrorDefined,\n isErrorEvent,\n isEvent,\n isEventDefined,\n isFunction,\n isInstanceOf,\n isInt,\n isInternalFaroOnGlobalObject,\n isMap,\n isMapDefined,\n isNull,\n isNumber,\n isObject,\n isPrimitive,\n isRegExp,\n isString,\n isSymbol,\n isSyntheticEvent,\n isThenable,\n isToString,\n isTypeof,\n isUndefined,\n isEmpty,\n InternalLoggerLevel,\n LogLevel,\n noop,\n setInternalFaroOnGlobalObject,\n TransportItemType,\n transportItemTypeToBodyKey,\n VERSION,\n EVENT_CLICK,\n EVENT_NAVIGATION,\n EVENT_ROUTE_CHANGE,\n EVENT_SESSION_EXTEND,\n EVENT_SESSION_RESUME,\n EVENT_SESSION_START,\n EVENT_VIEW_CHANGED,\n Observable,\n unknownString,\n UserActionState,\n type UserActionInternalInterface,\n} from '@grafana/faro-core';\n\nexport type {\n Faro,\n API,\n APIEvent,\n BaseObject,\n BaseObjectKey,\n BaseObjectPrimitiveValue,\n BaseObjectValue,\n BeforeSendHook,\n BufferItem,\n Config,\n EventAttributes,\n EventEvent,\n EventsAPI,\n ExceptionEvent,\n ExceptionEventExtended,\n ExceptionStackFrame,\n ExceptionsAPI,\n ExtendedError,\n Extension,\n GlobalObject,\n Instrumentation,\n Instrumentations,\n InternalLogger,\n LogContext,\n LogEvent,\n LogsAPI,\n MeasurementEvent,\n MeasurementsAPI,\n Meta,\n MetaAPI,\n MetaApp,\n MetaAttributes,\n MetaBrowser,\n MetaDevice,\n MetaGetter,\n MetaItem,\n MetaOS,\n MetaPage,\n Metas,\n MetaSDK,\n MetaSDKIntegration,\n MetaSession,\n MetaUser,\n MetaView,\n OTELApi,\n Patterns,\n PromiseBuffer,\n PromiseBufferOptions,\n PromiseProducer,\n PushErrorOptions,\n PushLogOptions,\n PushMeasurementOptions,\n Stacktrace,\n StacktraceParser,\n TraceContext,\n TraceEvent,\n TracesAPI,\n Transport,\n TransportBody,\n TransportItem,\n TransportItemPayload,\n Transports,\n UnpatchedConsole,\n UserActionImportance,\n} from '@grafana/faro-core';\n\nexport {\n PersistentSessionsManager,\n VolatileSessionsManager,\n MAX_SESSION_PERSISTENCE_TIME,\n SESSION_EXPIRATION_TIME,\n SESSION_INACTIVITY_TIME,\n STORAGE_KEY,\n} from './instrumentations/session';\n\nexport { getIgnoreUrls, getUrlFromResource } from './utils/url';\n\nexport { userActionDataAttribute } from './instrumentations/userActions';\n"]}
@@ -1,4 +1,4 @@
1
- import { Observable } from '@grafana/faro-core';
1
+ import { monoNow, Observable } from '@grafana/faro-core';
2
2
  import { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './monitors/const';
3
3
  export function isRequestStartMessage(msg) {
4
4
  return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;
@@ -32,7 +32,9 @@ export class ActivityWindowTracker extends Observable {
32
32
  })
33
33
  .subscribe((event) => {
34
34
  var _a, _b, _c;
35
- this._lastEventTime = Date.now();
35
+ // Monotonic clock — used only for the duration delta in `stopTracking()`.
36
+ // Not exposed as an absolute timestamp anywhere.
37
+ this._lastEventTime = monoNow();
36
38
  (_a = this._currentEvents) === null || _a === void 0 ? void 0 : _a.push(event);
37
39
  const startKey = this._options.isOperationStart(event);
38
40
  if (startKey) {
@@ -50,8 +52,11 @@ export class ActivityWindowTracker extends Observable {
50
52
  return;
51
53
  }
52
54
  this._tracking = true;
53
- this._startTime = Date.now();
54
- this._lastEventTime = Date.now();
55
+ // Use a monotonic clock so the resulting `duration` (computed in `stopTracking()`)
56
+ // is immune to wall-clock adjustments (NTP step, manual change, DST) that may
57
+ // occur during the tracking window.
58
+ this._startTime = monoNow();
59
+ this._lastEventTime = this._startTime;
55
60
  this.notify({
56
61
  message: 'tracking-started',
57
62
  });
@@ -65,7 +70,7 @@ export class ActivityWindowTracker extends Observable {
65
70
  this._clearTimer(this._drainTid);
66
71
  let duration;
67
72
  if (this.hasActiveOperations()) {
68
- duration = Date.now() - this._startTime;
73
+ duration = monoNow() - this._startTime;
69
74
  }
70
75
  else {
71
76
  duration = this._lastEventTime ? this._lastEventTime - this._startTime : 0;
@@ -1 +1 @@
1
- {"version":3,"file":"activityWindowTracker.js","sourceRoot":"","sources":["../../../../src/instrumentations/_internal/activityWindowTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './monitors/const';\nimport type { HttpRequestEndMessage, HttpRequestStartMessage } from './monitors/types';\n\ntype OperationKey = string;\n\nexport function isRequestStartMessage(msg: any): msg is HttpRequestStartMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;\n}\n\nexport function isRequestEndMessage(msg: any): msg is HttpRequestEndMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;\n}\n\nexport interface ActivityWindowTrackerOptions<TMsg = any> {\n inactivityMs?: number;\n drainTimeoutMs?: number;\n isOperationStart?: (msg: TMsg) => OperationKey | undefined;\n isOperationEnd?: (msg: TMsg) => OperationKey | undefined;\n}\n\n/**\n * Tracks events in a time‑boxed activity window. When the window goes quiet for `inactivityMs`,\n * it enters a draining phase: new short events are ignored; only active operations are awaited\n * until they end or `drainTimeoutMs` elapses.\n */\nexport class ActivityWindowTracker extends Observable {\n eventsObservable: Observable;\n\n private _tracking = false;\n private _inactivityTid?: number;\n private _drainTid?: number;\n private _currentEvents?: any[];\n private _activeOperations?: Map<OperationKey, true>;\n private _startTime?: number;\n private _lastEventTime?: number;\n private _options: Required<ActivityWindowTrackerOptions>;\n\n constructor(eventsObservable: Observable, options?: ActivityWindowTrackerOptions) {\n super();\n this.eventsObservable = eventsObservable;\n this._options = {\n inactivityMs: options?.inactivityMs ?? 100,\n drainTimeoutMs: options?.drainTimeoutMs ?? 10 * 1000,\n isOperationStart: options?.isOperationStart ?? (() => undefined),\n isOperationEnd: options?.isOperationEnd ?? (() => undefined),\n } as Required<ActivityWindowTrackerOptions>;\n this._initialize();\n }\n\n private _initialize() {\n this.eventsObservable\n .filter(() => {\n return this._tracking;\n })\n .subscribe((event) => {\n this._lastEventTime = Date.now();\n this._currentEvents?.push(event);\n\n const startKey = this._options.isOperationStart(event as any);\n if (startKey) {\n this._activeOperations?.set(startKey, true);\n }\n\n const endKey = this._options.isOperationEnd(event as any);\n if (endKey) {\n this._activeOperations?.delete(endKey);\n }\n\n this._scheduleInactivityCheck();\n });\n }\n\n startTracking() {\n if (this._tracking) {\n return;\n }\n\n this._tracking = true;\n this._startTime = Date.now();\n this._lastEventTime = Date.now();\n\n this.notify({\n message: 'tracking-started',\n });\n\n this._currentEvents = [];\n this._activeOperations = new Map<OperationKey, true>();\n this._scheduleInactivityCheck();\n }\n\n stopTracking() {\n this._tracking = false;\n this._clearTimer(this._inactivityTid);\n this._clearTimer(this._drainTid);\n\n let duration;\n if (this.hasActiveOperations()) {\n duration = Date.now() - this._startTime!;\n } else {\n duration = this._lastEventTime ? this._lastEventTime - this._startTime! : 0;\n }\n\n this.notify({\n message: 'tracking-ended',\n events: this._currentEvents,\n duration: duration,\n });\n }\n\n private _scheduleInactivityCheck() {\n this._inactivityTid = startTimeout(\n this._inactivityTid,\n () => {\n if (this.hasActiveOperations()) {\n this._startDrainTimeout();\n } else {\n this.stopTracking();\n }\n },\n this._options.inactivityMs\n );\n }\n\n private _startDrainTimeout() {\n this._drainTid = startTimeout(\n this._drainTid,\n () => {\n this.stopTracking();\n },\n this._options.drainTimeoutMs\n );\n }\n\n private hasActiveOperations(): boolean {\n return !!this._activeOperations && this._activeOperations.size > 0;\n }\n\n private _clearTimer(id?: number) {\n if (id) {\n clearTimeout(id);\n }\n }\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"]}
1
+ {"version":3,"file":"activityWindowTracker.js","sourceRoot":"","sources":["../../../../src/instrumentations/_internal/activityWindowTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { monoNow, Observable } from '@grafana/faro-core';\n\nimport { MESSAGE_TYPE_HTTP_REQUEST_END, MESSAGE_TYPE_HTTP_REQUEST_START } from './monitors/const';\nimport type { HttpRequestEndMessage, HttpRequestStartMessage } from './monitors/types';\n\ntype OperationKey = string;\n\nexport function isRequestStartMessage(msg: any): msg is HttpRequestStartMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_START;\n}\n\nexport function isRequestEndMessage(msg: any): msg is HttpRequestEndMessage {\n return msg.type === MESSAGE_TYPE_HTTP_REQUEST_END;\n}\n\nexport interface ActivityWindowTrackerOptions<TMsg = any> {\n inactivityMs?: number;\n drainTimeoutMs?: number;\n isOperationStart?: (msg: TMsg) => OperationKey | undefined;\n isOperationEnd?: (msg: TMsg) => OperationKey | undefined;\n}\n\n/**\n * Tracks events in a time‑boxed activity window. When the window goes quiet for `inactivityMs`,\n * it enters a draining phase: new short events are ignored; only active operations are awaited\n * until they end or `drainTimeoutMs` elapses.\n */\nexport class ActivityWindowTracker extends Observable {\n eventsObservable: Observable;\n\n private _tracking = false;\n private _inactivityTid?: number;\n private _drainTid?: number;\n private _currentEvents?: any[];\n private _activeOperations?: Map<OperationKey, true>;\n private _startTime?: number;\n private _lastEventTime?: number;\n private _options: Required<ActivityWindowTrackerOptions>;\n\n constructor(eventsObservable: Observable, options?: ActivityWindowTrackerOptions) {\n super();\n this.eventsObservable = eventsObservable;\n this._options = {\n inactivityMs: options?.inactivityMs ?? 100,\n drainTimeoutMs: options?.drainTimeoutMs ?? 10 * 1000,\n isOperationStart: options?.isOperationStart ?? (() => undefined),\n isOperationEnd: options?.isOperationEnd ?? (() => undefined),\n } as Required<ActivityWindowTrackerOptions>;\n this._initialize();\n }\n\n private _initialize() {\n this.eventsObservable\n .filter(() => {\n return this._tracking;\n })\n .subscribe((event) => {\n // Monotonic clock — used only for the duration delta in `stopTracking()`.\n // Not exposed as an absolute timestamp anywhere.\n this._lastEventTime = monoNow();\n this._currentEvents?.push(event);\n\n const startKey = this._options.isOperationStart(event as any);\n if (startKey) {\n this._activeOperations?.set(startKey, true);\n }\n\n const endKey = this._options.isOperationEnd(event as any);\n if (endKey) {\n this._activeOperations?.delete(endKey);\n }\n\n this._scheduleInactivityCheck();\n });\n }\n\n startTracking() {\n if (this._tracking) {\n return;\n }\n\n this._tracking = true;\n // Use a monotonic clock so the resulting `duration` (computed in `stopTracking()`)\n // is immune to wall-clock adjustments (NTP step, manual change, DST) that may\n // occur during the tracking window.\n this._startTime = monoNow();\n this._lastEventTime = this._startTime;\n\n this.notify({\n message: 'tracking-started',\n });\n\n this._currentEvents = [];\n this._activeOperations = new Map<OperationKey, true>();\n this._scheduleInactivityCheck();\n }\n\n stopTracking() {\n this._tracking = false;\n this._clearTimer(this._inactivityTid);\n this._clearTimer(this._drainTid);\n\n let duration;\n if (this.hasActiveOperations()) {\n duration = monoNow() - this._startTime!;\n } else {\n duration = this._lastEventTime ? this._lastEventTime - this._startTime! : 0;\n }\n\n this.notify({\n message: 'tracking-ended',\n events: this._currentEvents,\n duration: duration,\n });\n }\n\n private _scheduleInactivityCheck() {\n this._inactivityTid = startTimeout(\n this._inactivityTid,\n () => {\n if (this.hasActiveOperations()) {\n this._startDrainTimeout();\n } else {\n this.stopTracking();\n }\n },\n this._options.inactivityMs\n );\n }\n\n private _startDrainTimeout() {\n this._drainTid = startTimeout(\n this._drainTid,\n () => {\n this.stopTracking();\n },\n this._options.drainTimeoutMs\n );\n }\n\n private hasActiveOperations(): boolean {\n return !!this._activeOperations && this._activeOperations.size > 0;\n }\n\n private _clearTimer(id?: number) {\n if (id) {\n clearTimeout(id);\n }\n }\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"]}
@@ -19,6 +19,7 @@ export function getErrorDetails(evt) {
19
19
  value = message ? `${type}: ${message}` : type;
20
20
  }
21
21
  else if (isError(evt)) {
22
+ type = evt.name;
22
23
  value = evt.message;
23
24
  stackFrames = getStackFramesFromError(evt);
24
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getErrorDetails.js","sourceRoot":"","sources":["../../../../src/instrumentations/errors/getErrorDetails.ts"],"names":[],"mappings":"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","sourcesContent":["import { isDomError, isDomException, isError, isErrorEvent, isEvent, isObject, isString } from '@grafana/faro-core';\nimport type { ExceptionStackFrame, LogArgsSerializer } from '@grafana/faro-core';\n\nimport { domErrorType, domExceptionType, objectEventValue, unknownSymbolString } from './const';\nimport { getValueAndTypeFromMessage } from './getValueAndTypeFromMessage';\nimport { buildStackFrame, getStackFramesFromError } from './stackFrames';\nimport type { ErrorEvent } from './types';\n\nexport function getErrorDetails(evt: ErrorEvent): [string | undefined, string | undefined, ExceptionStackFrame[]] {\n let value: string | undefined;\n let type: string | undefined;\n let stackFrames: ExceptionStackFrame[] = [];\n let isDomErrorRes: boolean | undefined;\n let isEventRes: boolean | undefined;\n\n if (isErrorEvent(evt) && evt.error) {\n value = evt.error.message;\n type = evt.error.name;\n stackFrames = getStackFramesFromError(evt.error);\n } else if ((isDomErrorRes = isDomError(evt)) || isDomException(evt)) {\n const { name, message } = evt;\n\n type = name ?? (isDomErrorRes ? domErrorType : domExceptionType);\n value = message ? `${type}: ${message}` : type;\n } else if (isError(evt)) {\n value = evt.message;\n stackFrames = getStackFramesFromError(evt);\n } else if (isObject(evt) || (isEventRes = isEvent(evt))) {\n type = isEventRes ? evt.constructor.name : undefined;\n value = `${objectEventValue} ${Object.keys(evt)}`;\n }\n\n return [value, type, stackFrames];\n}\n\nexport interface ErrorDetails {\n value?: string;\n type?: string;\n stackFrames?: ExceptionStackFrame[];\n}\n\nexport function getDetailsFromErrorArgs(args: [any?, ...any[]]): ErrorDetails {\n const [evt, source, lineno, colno, error] = args;\n\n let value: string | undefined;\n let type: string | undefined;\n let stackFrames: ExceptionStackFrame[] = [];\n const eventIsString = isString(evt);\n const initialStackFrame = buildStackFrame(source, unknownSymbolString, lineno, colno);\n\n if (error || !eventIsString) {\n [value, type, stackFrames] = getErrorDetails((error ?? evt) as Error | Event);\n\n if (stackFrames.length === 0) {\n stackFrames = [initialStackFrame];\n }\n } else if (eventIsString) {\n [value, type] = getValueAndTypeFromMessage(evt);\n stackFrames = [initialStackFrame];\n }\n\n return { value, type, stackFrames };\n}\n\nexport function getDetailsFromConsoleErrorArgs(args: [any?, ...any[]], serializer: LogArgsSerializer): ErrorDetails {\n if (isError(args[0])) {\n return getDetailsFromErrorArgs(args);\n } else {\n return { value: serializer(args) };\n }\n}\n"]}
1
+ {"version":3,"file":"getErrorDetails.js","sourceRoot":"","sources":["../../../../src/instrumentations/errors/getErrorDetails.ts"],"names":[],"mappings":"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","sourcesContent":["import { isDomError, isDomException, isError, isErrorEvent, isEvent, isObject, isString } from '@grafana/faro-core';\nimport type { ExceptionStackFrame, LogArgsSerializer } from '@grafana/faro-core';\n\nimport { domErrorType, domExceptionType, objectEventValue, unknownSymbolString } from './const';\nimport { getValueAndTypeFromMessage } from './getValueAndTypeFromMessage';\nimport { buildStackFrame, getStackFramesFromError } from './stackFrames';\nimport type { ErrorEvent } from './types';\n\nexport function getErrorDetails(evt: ErrorEvent): [string | undefined, string | undefined, ExceptionStackFrame[]] {\n let value: string | undefined;\n let type: string | undefined;\n let stackFrames: ExceptionStackFrame[] = [];\n let isDomErrorRes: boolean | undefined;\n let isEventRes: boolean | undefined;\n\n if (isErrorEvent(evt) && evt.error) {\n value = evt.error.message;\n type = evt.error.name;\n stackFrames = getStackFramesFromError(evt.error);\n } else if ((isDomErrorRes = isDomError(evt)) || isDomException(evt)) {\n const { name, message } = evt;\n\n type = name ?? (isDomErrorRes ? domErrorType : domExceptionType);\n value = message ? `${type}: ${message}` : type;\n } else if (isError(evt)) {\n type = evt.name;\n value = evt.message;\n stackFrames = getStackFramesFromError(evt);\n } else if (isObject(evt) || (isEventRes = isEvent(evt))) {\n type = isEventRes ? evt.constructor.name : undefined;\n value = `${objectEventValue} ${Object.keys(evt)}`;\n }\n\n return [value, type, stackFrames];\n}\n\nexport interface ErrorDetails {\n value?: string;\n type?: string;\n stackFrames?: ExceptionStackFrame[];\n}\n\nexport function getDetailsFromErrorArgs(args: [any?, ...any[]]): ErrorDetails {\n const [evt, source, lineno, colno, error] = args;\n\n let value: string | undefined;\n let type: string | undefined;\n let stackFrames: ExceptionStackFrame[] = [];\n const eventIsString = isString(evt);\n const initialStackFrame = buildStackFrame(source, unknownSymbolString, lineno, colno);\n\n if (error || !eventIsString) {\n [value, type, stackFrames] = getErrorDetails((error ?? evt) as Error | Event);\n\n if (stackFrames.length === 0) {\n stackFrames = [initialStackFrame];\n }\n } else if (eventIsString) {\n [value, type] = getValueAndTypeFromMessage(evt);\n stackFrames = [initialStackFrame];\n }\n\n return { value, type, stackFrames };\n}\n\nexport function getDetailsFromConsoleErrorArgs(args: [any?, ...any[]], serializer: LogArgsSerializer): ErrorDetails {\n if (isError(args[0])) {\n return getDetailsFromErrorArgs(args);\n } else {\n return { value: serializer(args) };\n }\n}\n"]}
@@ -1,12 +1,11 @@
1
- import { UAParser } from 'ua-parser-js';
2
1
  import { unknownString } from '@grafana/faro-core';
2
+ import { getUAResult } from '../shared';
3
3
  export const browserMeta = () => {
4
- const parser = new UAParser();
5
- const { name, version } = parser.getBrowser();
6
- const { name: osName, version: osVersion } = parser.getOS();
7
- const userAgent = parser.getUA();
4
+ const { browser, os, ua: userAgent } = getUAResult();
5
+ const { name, version } = browser;
6
+ const { name: osName, version: osVersion } = os;
8
7
  const language = navigator.language;
9
- const mobile = navigator.userAgent.includes('Mobi');
8
+ const mobile = userAgent.includes('Mobi');
10
9
  const brands = getBrands();
11
10
  return {
12
11
  browser: {
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/browser/meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,CAAC,MAAM,WAAW,GAAoC,GAAG,EAAE;IAC/D,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAC9C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,aAAa;YAC3B,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,aAAa;YACjC,EAAE,EAAE,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,aAAa,IAAI,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,aAAa,EAAE;YAC9D,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,aAAa;YACrC,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,aAAa;YACnC,MAAM;YACN,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,aAAa;YAC/B,aAAa,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE;YACrC,cAAc,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE;SACxC;KACF,CAAC;IAEF,SAAS,SAAS;QAChB,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,eAAe,IAAI,SAAS,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC5D,iHAAiH;YACjH,OAAQ,SAAiB,CAAC,aAAa,CAAC,MAAM,CAAC;QACjD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { UAParser } from 'ua-parser-js';\n\nimport { unknownString } from '@grafana/faro-core';\nimport type { Meta, MetaBrowser, MetaItem } from '@grafana/faro-core';\n\nexport const browserMeta: MetaItem<Pick<Meta, 'browser'>> = () => {\n const parser = new UAParser();\n const { name, version } = parser.getBrowser();\n const { name: osName, version: osVersion } = parser.getOS();\n const userAgent = parser.getUA();\n const language = navigator.language;\n const mobile = navigator.userAgent.includes('Mobi');\n const brands = getBrands();\n\n return {\n browser: {\n name: name ?? unknownString,\n version: version ?? unknownString,\n os: `${osName ?? unknownString} ${osVersion ?? unknownString}`,\n userAgent: userAgent ?? unknownString,\n language: language ?? unknownString,\n mobile,\n brands: brands ?? unknownString,\n viewportWidth: `${window.innerWidth}`,\n viewportHeight: `${window.innerHeight}`,\n },\n };\n\n function getBrands(): MetaBrowser['brands'] | undefined {\n if (!name || !version) {\n return undefined;\n }\n\n if ('userAgentData' in navigator && navigator.userAgentData) {\n // userAgentData in experimental (only Chrome supports it) thus TS does not ship the respective type declarations\n return (navigator as any).userAgentData.brands;\n }\n\n return undefined;\n }\n};\n"]}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/browser/meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GAAoC,GAAG,EAAE;IAC/D,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,WAAW,EAAE,CAAC;IACrD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,aAAa;YAC3B,OAAO,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,aAAa;YACjC,EAAE,EAAE,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,aAAa,IAAI,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,aAAa,EAAE;YAC9D,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,aAAa;YACrC,QAAQ,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,aAAa;YACnC,MAAM;YACN,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,aAAa;YAC/B,aAAa,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE;YACrC,cAAc,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE;SACxC;KACF,CAAC;IAEF,SAAS,SAAS;QAChB,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,eAAe,IAAI,SAAS,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC5D,iHAAiH;YACjH,OAAQ,SAAiB,CAAC,aAAa,CAAC,MAAM,CAAC;QACjD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { unknownString } from '@grafana/faro-core';\nimport type { Meta, MetaBrowser, MetaItem } from '@grafana/faro-core';\n\nimport { getUAResult } from '../shared';\n\nexport const browserMeta: MetaItem<Pick<Meta, 'browser'>> = () => {\n const { browser, os, ua: userAgent } = getUAResult();\n const { name, version } = browser;\n const { name: osName, version: osVersion } = os;\n const language = navigator.language;\n const mobile = userAgent.includes('Mobi');\n const brands = getBrands();\n\n return {\n browser: {\n name: name ?? unknownString,\n version: version ?? unknownString,\n os: `${osName ?? unknownString} ${osVersion ?? unknownString}`,\n userAgent: userAgent ?? unknownString,\n language: language ?? unknownString,\n mobile,\n brands: brands ?? unknownString,\n viewportWidth: `${window.innerWidth}`,\n viewportHeight: `${window.innerHeight}`,\n },\n };\n\n function getBrands(): MetaBrowser['brands'] | undefined {\n if (!name || !version) {\n return undefined;\n }\n\n if ('userAgentData' in navigator && navigator.userAgentData) {\n // userAgentData in experimental (only Chrome supports it) thus TS does not ship the respective type declarations\n return (navigator as any).userAgentData.brands;\n }\n\n return undefined;\n }\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  export { browserMeta } from './browser';
2
+ export { osMeta } from './os';
2
3
  export { createSession } from './session';
3
4
  export { sdkMeta } from './sdk';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export { browserMeta } from './browser';\n\nexport { createSession } from './session';\n\nexport { sdkMeta } from './sdk';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC","sourcesContent":["export { browserMeta } from './browser';\n\nexport { osMeta } from './os';\n\nexport { createSession } from './session';\n\nexport { sdkMeta } from './sdk';\n"]}
@@ -0,0 +1,2 @@
1
+ export { osMeta } from './meta';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/metas/os/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC","sourcesContent":["export { osMeta } from './meta';\n"]}
@@ -0,0 +1,16 @@
1
+ import { getUAResult } from '../shared';
2
+ export const osMeta = () => {
3
+ const { name, version } = getUAResult().os;
4
+ if (!name && !version) {
5
+ return {};
6
+ }
7
+ const os = {};
8
+ if (name) {
9
+ os.name = name;
10
+ }
11
+ if (version) {
12
+ os.version = version;
13
+ }
14
+ return { os };
15
+ };
16
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/os/meta.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,CAAC,MAAM,MAAM,GAAiC,GAAG,EAAE;IACvD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC;IAE3C,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,EAAE,GAAW,EAAE,CAAC;IAEtB,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,EAAE,CAAC,OAAO,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import type { Meta, MetaGetter, MetaOS } from '@grafana/faro-core';\n\nimport { getUAResult } from '../shared';\n\nexport const osMeta: MetaGetter<Pick<Meta, 'os'>> = () => {\n const { name, version } = getUAResult().os;\n\n if (!name && !version) {\n return {};\n }\n\n const os: MetaOS = {};\n\n if (name) {\n os.name = name;\n }\n\n if (version) {\n os.version = version;\n }\n\n return { os };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { getUAResult } from './uaParser';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/metas/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { getUAResult } from './uaParser';\n"]}
@@ -0,0 +1,15 @@
1
+ import { UAParser } from 'ua-parser-js';
2
+ let cachedUA;
3
+ let cachedResult;
4
+ // Browser and OS meta providers both need to parse navigator.userAgent.
5
+ // Cache keyed on the UA string so we parse at most once per unique UA
6
+ // (test mutations of navigator.userAgent invalidate naturally).
7
+ export function getUAResult() {
8
+ const currentUA = typeof navigator !== 'undefined' ? navigator.userAgent : '';
9
+ if (cachedUA !== currentUA || !cachedResult) {
10
+ cachedResult = new UAParser(currentUA).getResult();
11
+ cachedUA = currentUA;
12
+ }
13
+ return cachedResult;
14
+ }
15
+ //# sourceMappingURL=uaParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uaParser.js","sourceRoot":"","sources":["../../../../src/metas/shared/uaParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAIxC,IAAI,QAA4B,CAAC;AACjC,IAAI,YAAkC,CAAC;AAEvC,wEAAwE;AACxE,sEAAsE;AACtE,gEAAgE;AAChE,MAAM,UAAU,WAAW;IACzB,MAAM,SAAS,GAAG,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,YAAY,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC;QACnD,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { UAParser } from 'ua-parser-js';\n\ntype UAResult = ReturnType<InstanceType<typeof UAParser>['getResult']>;\n\nlet cachedUA: string | undefined;\nlet cachedResult: UAResult | undefined;\n\n// Browser and OS meta providers both need to parse navigator.userAgent.\n// Cache keyed on the UA string so we parse at most once per unique UA\n// (test mutations of navigator.userAgent invalidate naturally).\nexport function getUAResult(): UAResult {\n const currentUA = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n if (cachedUA !== currentUA || !cachedResult) {\n cachedResult = new UAParser(currentUA).getResult();\n cachedUA = currentUA;\n }\n\n return cachedResult;\n}\n"]}
@@ -34,7 +34,7 @@ export class FetchTransport extends BaseTransport {
34
34
  this.options = options;
35
35
  this.name = '@grafana/faro-web-sdk:transport-fetch';
36
36
  this.version = VERSION;
37
- this.disabledUntil = new Date();
37
+ this.disabledUntil = new Date(0);
38
38
  this.rateLimitBackoffMs = (_a = options.defaultRateLimitBackoffMs) !== null && _a !== void 0 ? _a : DEFAULT_RATE_LIMIT_BACKOFF_MS;
39
39
  this.getNow = (_b = options.getNow) !== null && _b !== void 0 ? _b : (() => Date.now());
40
40
  this.promiseBuffer = createPromiseBuffer({
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseExtension, BaseTransport, createPromiseBuffer, getTransportBody, noop, VERSION } from '@grafana/faro-core';\nimport type { Config, Patterns, PromiseBuffer, TransportItem } from '@grafana/faro-core';\n\nimport { getSessionManagerByConfig } from '../../instrumentations/session/sessionManager';\nimport { getUserSessionUpdater } from '../../instrumentations/session/sessionManager/sessionManagerUtils';\n\nimport type { FetchTransportOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 30;\nconst DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17\nconst DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;\n\nconst BEACON_BODY_SIZE_LIMIT = 60000;\nconst TOO_MANY_REQUESTS = 429;\nconst ACCEPTED = 202;\n\nexport class FetchTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-fetch';\n readonly version = VERSION;\n\n promiseBuffer: PromiseBuffer<Response | void>;\n\n private readonly rateLimitBackoffMs: number;\n private readonly getNow: () => number;\n private disabledUntil: Date = new Date();\n\n constructor(private options: FetchTransportOptions) {\n super();\n\n this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;\n this.getNow = options.getNow ?? (() => Date.now());\n\n this.promiseBuffer = createPromiseBuffer({\n size: options.bufferSize ?? DEFAULT_BUFFER_SIZE,\n concurrency: options.concurrency ?? DEFAULT_CONCURRENCY,\n });\n }\n\n async send(items: TransportItem[]): Promise<void> {\n try {\n if (this.disabledUntil > new Date(this.getNow())) {\n this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`);\n\n return Promise.resolve();\n }\n\n await this.promiseBuffer.add(async () => {\n const body = JSON.stringify(getTransportBody(items));\n\n const { url, requestOptions, apiKey } = this.options;\n\n const { headers = {}, ...restOfRequestOptions } = requestOptions ?? {};\n\n let sessionId;\n const sessionMeta = this.metas.value.session;\n if (sessionMeta != null) {\n sessionId = sessionMeta.id;\n }\n\n const resolvedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n resolvedHeaders[key] = typeof value === 'function' ? await Promise.resolve(value()) : value;\n }\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...resolvedHeaders,\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n ...(sessionId ? { 'x-faro-session-id': sessionId } : {}),\n },\n body,\n keepalive: body.length <= BEACON_BODY_SIZE_LIMIT,\n ...(restOfRequestOptions ?? {}),\n })\n .then(async (response) => {\n if (response.status === ACCEPTED) {\n const sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid';\n\n if (sessionExpired) {\n this.extendFaroSession(this.config, this.logDebug);\n }\n }\n\n if (response.status === TOO_MANY_REQUESTS) {\n this.disabledUntil = this.getRetryAfterDate(response);\n this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);\n }\n\n // read the body so the connection can be closed\n response.text().catch(noop);\n return response;\n })\n .catch((err) => {\n this.logError('Failed sending payload to the receiver\\n', JSON.parse(body), err);\n });\n });\n } catch (err) {\n this.logError(err);\n }\n }\n\n override getIgnoreUrls(): Patterns {\n return ([this.options.url] as Patterns).concat(this.config.ignoreUrls ?? []);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n private getRetryAfterDate(response: Response): Date {\n const now = this.getNow();\n const retryAfterHeader = response.headers.get('Retry-After');\n\n if (retryAfterHeader) {\n const delay = Number(retryAfterHeader);\n\n if (!isNaN(delay)) {\n return new Date(delay * 1000 + now);\n }\n\n const date = Date.parse(retryAfterHeader);\n\n if (!isNaN(date)) {\n return new Date(date);\n }\n }\n\n return new Date(now + this.rateLimitBackoffMs);\n }\n\n private extendFaroSession(config: Config, logDebug: BaseExtension['logDebug']) {\n const SessionExpiredString = `Session expired`;\n\n const sessionTrackingConfig = config.sessionTracking;\n\n if (sessionTrackingConfig?.enabled) {\n const { fetchUserSession, storeUserSession } = getSessionManagerByConfig(sessionTrackingConfig);\n\n getUserSessionUpdater({ fetchUserSession, storeUserSession })({ forceSessionExtend: true });\n\n logDebug(`${SessionExpiredString} created new session.`);\n } else {\n logDebug(`${SessionExpiredString}.`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/fetch/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseExtension, BaseTransport, createPromiseBuffer, getTransportBody, noop, VERSION } from '@grafana/faro-core';\nimport type { Config, Patterns, PromiseBuffer, TransportItem } from '@grafana/faro-core';\n\nimport { getSessionManagerByConfig } from '../../instrumentations/session/sessionManager';\nimport { getUserSessionUpdater } from '../../instrumentations/session/sessionManager/sessionManagerUtils';\n\nimport type { FetchTransportOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 30;\nconst DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17\nconst DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;\n\nconst BEACON_BODY_SIZE_LIMIT = 60000;\nconst TOO_MANY_REQUESTS = 429;\nconst ACCEPTED = 202;\n\nexport class FetchTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-fetch';\n readonly version = VERSION;\n\n promiseBuffer: PromiseBuffer<Response | void>;\n\n private readonly rateLimitBackoffMs: number;\n private readonly getNow: () => number;\n private disabledUntil: Date = new Date(0);\n\n constructor(private options: FetchTransportOptions) {\n super();\n\n this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;\n this.getNow = options.getNow ?? (() => Date.now());\n\n this.promiseBuffer = createPromiseBuffer({\n size: options.bufferSize ?? DEFAULT_BUFFER_SIZE,\n concurrency: options.concurrency ?? DEFAULT_CONCURRENCY,\n });\n }\n\n async send(items: TransportItem[]): Promise<void> {\n try {\n if (this.disabledUntil > new Date(this.getNow())) {\n this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`);\n\n return Promise.resolve();\n }\n\n await this.promiseBuffer.add(async () => {\n const body = JSON.stringify(getTransportBody(items));\n\n const { url, requestOptions, apiKey } = this.options;\n\n const { headers = {}, ...restOfRequestOptions } = requestOptions ?? {};\n\n let sessionId;\n const sessionMeta = this.metas.value.session;\n if (sessionMeta != null) {\n sessionId = sessionMeta.id;\n }\n\n const resolvedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n resolvedHeaders[key] = typeof value === 'function' ? await Promise.resolve(value()) : value;\n }\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...resolvedHeaders,\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n ...(sessionId ? { 'x-faro-session-id': sessionId } : {}),\n },\n body,\n keepalive: body.length <= BEACON_BODY_SIZE_LIMIT,\n ...(restOfRequestOptions ?? {}),\n })\n .then(async (response) => {\n if (response.status === ACCEPTED) {\n const sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid';\n\n if (sessionExpired) {\n this.extendFaroSession(this.config, this.logDebug);\n }\n }\n\n if (response.status === TOO_MANY_REQUESTS) {\n this.disabledUntil = this.getRetryAfterDate(response);\n this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);\n }\n\n // read the body so the connection can be closed\n response.text().catch(noop);\n return response;\n })\n .catch((err) => {\n this.logError('Failed sending payload to the receiver\\n', JSON.parse(body), err);\n });\n });\n } catch (err) {\n this.logError(err);\n }\n }\n\n override getIgnoreUrls(): Patterns {\n return ([this.options.url] as Patterns).concat(this.config.ignoreUrls ?? []);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n private getRetryAfterDate(response: Response): Date {\n const now = this.getNow();\n const retryAfterHeader = response.headers.get('Retry-After');\n\n if (retryAfterHeader) {\n const delay = Number(retryAfterHeader);\n\n if (!isNaN(delay)) {\n return new Date(delay * 1000 + now);\n }\n\n const date = Date.parse(retryAfterHeader);\n\n if (!isNaN(date)) {\n return new Date(date);\n }\n }\n\n return new Date(now + this.rateLimitBackoffMs);\n }\n\n private extendFaroSession(config: Config, logDebug: BaseExtension['logDebug']) {\n const SessionExpiredString = `Session expired`;\n\n const sessionTrackingConfig = config.sessionTracking;\n\n if (sessionTrackingConfig?.enabled) {\n const { fetchUserSession, storeUserSession } = getSessionManagerByConfig(sessionTrackingConfig);\n\n getUserSessionUpdater({ fetchUserSession, storeUserSession })({ forceSessionExtend: true });\n\n logDebug(`${SessionExpiredString} created new session.`);\n } else {\n logDebug(`${SessionExpiredString}.`);\n }\n }\n}\n"]}
@@ -4,11 +4,11 @@ export { defaultEventDomain } from './consts';
4
4
  export { initializeFaro } from './initialize';
5
5
  export { buildStackFrame, ConsoleInstrumentation, ErrorsInstrumentation, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace, ViewInstrumentation, WebVitalsInstrumentation, SessionInstrumentation, PerformanceInstrumentation, CSPInstrumentation, UserActionInstrumentation, NavigationInstrumentation, } from './instrumentations';
6
6
  export type { ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations';
7
- export { browserMeta, createSession, sdkMeta } from './metas';
7
+ export { browserMeta, createSession, osMeta, sdkMeta } from './metas';
8
8
  export { ConsoleTransport, FetchTransport } from './transports';
9
9
  export type { ClockFn, ConsoleTransportOptions, FetchTransportOptions, FetchTransportRequestOptions, } from './transports';
10
10
  export { faro, allLogLevels, BaseExtension, BaseInstrumentation, BaseTransport, createInternalLogger, createPromiseBuffer, deepEqual, defaultExceptionType, defaultGlobalObjectKey, defaultInternalLoggerLevel, defaultLogLevel, genShortID, getCurrentTimestamp, getInternalFaroFromGlobalObject, getTransportBody, globalObject, internalGlobalObjectKey, isArray, isBoolean, isDomError, isDomException, isElement, isElementDefined, isError, isErrorDefined, isErrorEvent, isEvent, isEventDefined, isFunction, isInstanceOf, isInt, isInternalFaroOnGlobalObject, isMap, isMapDefined, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isSymbol, isSyntheticEvent, isThenable, isToString, isTypeof, isUndefined, isEmpty, InternalLoggerLevel, LogLevel, noop, setInternalFaroOnGlobalObject, TransportItemType, transportItemTypeToBodyKey, VERSION, EVENT_CLICK, EVENT_NAVIGATION, EVENT_ROUTE_CHANGE, EVENT_SESSION_EXTEND, EVENT_SESSION_RESUME, EVENT_SESSION_START, EVENT_VIEW_CHANGED, Observable, unknownString, UserActionState, type UserActionInternalInterface, } from '@grafana/faro-core';
11
- export type { Faro, API, APIEvent, BaseObject, BaseObjectKey, BaseObjectPrimitiveValue, BaseObjectValue, BeforeSendHook, BufferItem, Config, EventAttributes, EventEvent, EventsAPI, ExceptionEvent, ExceptionEventExtended, ExceptionStackFrame, ExceptionsAPI, ExtendedError, Extension, GlobalObject, Instrumentation, Instrumentations, InternalLogger, LogContext, LogEvent, LogsAPI, MeasurementEvent, MeasurementsAPI, Meta, MetaAPI, MetaApp, MetaAttributes, MetaBrowser, MetaGetter, MetaItem, MetaPage, Metas, MetaSDK, MetaSDKIntegration, MetaSession, MetaUser, MetaView, OTELApi, Patterns, PromiseBuffer, PromiseBufferOptions, PromiseProducer, PushErrorOptions, PushLogOptions, PushMeasurementOptions, Stacktrace, StacktraceParser, TraceContext, TraceEvent, TracesAPI, Transport, TransportBody, TransportItem, TransportItemPayload, Transports, UnpatchedConsole, UserActionImportance, } from '@grafana/faro-core';
11
+ export type { Faro, API, APIEvent, BaseObject, BaseObjectKey, BaseObjectPrimitiveValue, BaseObjectValue, BeforeSendHook, BufferItem, Config, EventAttributes, EventEvent, EventsAPI, ExceptionEvent, ExceptionEventExtended, ExceptionStackFrame, ExceptionsAPI, ExtendedError, Extension, GlobalObject, Instrumentation, Instrumentations, InternalLogger, LogContext, LogEvent, LogsAPI, MeasurementEvent, MeasurementsAPI, Meta, MetaAPI, MetaApp, MetaAttributes, MetaBrowser, MetaDevice, MetaGetter, MetaItem, MetaOS, MetaPage, Metas, MetaSDK, MetaSDKIntegration, MetaSession, MetaUser, MetaView, OTELApi, Patterns, PromiseBuffer, PromiseBufferOptions, PromiseProducer, PushErrorOptions, PushLogOptions, PushMeasurementOptions, Stacktrace, StacktraceParser, TraceContext, TraceEvent, TracesAPI, Transport, TransportBody, TransportItem, TransportItemPayload, Transports, UnpatchedConsole, UserActionImportance, } from '@grafana/faro-core';
12
12
  export { PersistentSessionsManager, VolatileSessionsManager, MAX_SESSION_PERSISTENCE_TIME, SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME, STORAGE_KEY, } from './instrumentations/session';
13
13
  export { getIgnoreUrls, getUrlFromResource } from './utils/url';
14
14
  export { userActionDataAttribute } from './instrumentations/userActions';
@@ -1,7 +1,7 @@
1
1
  import { BaseInstrumentation, LogLevel } from '@grafana/faro-core';
2
2
  export declare class ConsoleInstrumentation extends BaseInstrumentation {
3
3
  readonly name = "@grafana/faro-web-sdk:instrumentation-console";
4
- readonly version = "2.3.1";
4
+ readonly version = "2.5.0";
5
5
  static defaultDisabledLevels: LogLevel[];
6
6
  static consoleErrorPrefix: string;
7
7
  private errorSerializer;
@@ -2,7 +2,7 @@ import { BaseInstrumentation } from '@grafana/faro-core';
2
2
  import type { Instrumentation } from '@grafana/faro-core';
3
3
  export declare class CSPInstrumentation extends BaseInstrumentation implements Instrumentation {
4
4
  readonly name = "@grafana/faro-web-sdk:instrumentation-csp";
5
- readonly version = "2.3.1";
5
+ readonly version = "2.5.0";
6
6
  constructor();
7
7
  initialize(): void;
8
8
  destroy(): void;
@@ -1,6 +1,6 @@
1
1
  import { BaseInstrumentation } from '@grafana/faro-core';
2
2
  export declare class ErrorsInstrumentation extends BaseInstrumentation {
3
3
  readonly name = "@grafana/faro-web-sdk:instrumentation-errors";
4
- readonly version = "2.3.1";
4
+ readonly version = "2.5.0";
5
5
  initialize(): void;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { BaseInstrumentation } from '@grafana/faro-core';
2
2
  export declare class NavigationInstrumentation extends BaseInstrumentation {
3
3
  readonly name = "@grafana/faro-web-sdk:instrumentation-navigation";
4
- readonly version = "2.3.1";
4
+ readonly version = "2.5.0";
5
5
  initialize(): void;
6
6
  }
@@ -3,6 +3,6 @@ import type { ResourceEntryMessage } from './types';
3
3
  export declare const performanceEntriesSubscription: Observable<ResourceEntryMessage>;
4
4
  export declare class PerformanceInstrumentation extends BaseInstrumentation {
5
5
  readonly name = "@grafana/faro-web-sdk:instrumentation-performance";
6
- readonly version = "2.3.1";
6
+ readonly version = "2.5.0";
7
7
  initialize(): void;
8
8
  }
@@ -1,7 +1,7 @@
1
1
  import { BaseInstrumentation } from '@grafana/faro-core';
2
2
  export declare class SessionInstrumentation extends BaseInstrumentation {
3
3
  readonly name = "@grafana/faro-web-sdk:instrumentation-session";
4
- readonly version = "2.3.1";
4
+ readonly version = "2.5.0";
5
5
  private notifiedSession;
6
6
  private sendSessionStartEvent;
7
7
  private createInitialSession;
@@ -1,7 +1,7 @@
1
1
  import { BaseInstrumentation } from '@grafana/faro-core';
2
2
  export declare class UserActionInstrumentation extends BaseInstrumentation {
3
3
  readonly name = "@grafana/faro-web-sdk:instrumentation-user-action";
4
- readonly version = "2.3.1";
4
+ readonly version = "2.5.0";
5
5
  private _userActionSub?;
6
6
  initialize(): void;
7
7
  destroy(): void;
@@ -1,7 +1,7 @@
1
1
  import { BaseInstrumentation } from '@grafana/faro-core';
2
2
  export declare class ViewInstrumentation extends BaseInstrumentation {
3
3
  readonly name = "@grafana/faro-web-sdk:instrumentation-view";
4
- readonly version = "2.3.1";
4
+ readonly version = "2.5.0";
5
5
  private notifiedView;
6
6
  private sendViewChangedEvent;
7
7
  initialize(): void;
@@ -1,6 +1,6 @@
1
1
  import { BaseInstrumentation } from '@grafana/faro-core';
2
2
  export declare class WebVitalsInstrumentation extends BaseInstrumentation {
3
3
  readonly name = "@grafana/faro-web-sdk:instrumentation-web-vitals";
4
- readonly version = "2.3.1";
4
+ readonly version = "2.5.0";
5
5
  initialize(): void;
6
6
  }
@@ -1,3 +1,4 @@
1
1
  export { browserMeta } from './browser';
2
+ export { osMeta } from './os';
2
3
  export { createSession } from './session';
3
4
  export { sdkMeta } from './sdk';
@@ -0,0 +1 @@
1
+ export { osMeta } from './meta';
@@ -0,0 +1,2 @@
1
+ import type { Meta, MetaGetter } from '@grafana/faro-core';
2
+ export declare const osMeta: MetaGetter<Pick<Meta, 'os'>>;
@@ -0,0 +1 @@
1
+ export { getUAResult } from './uaParser';