@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,30 +1,18 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
2
  Object.defineProperty(exports, "__esModule", { value: true });
14
3
  exports.createPageMeta = createPageMeta;
15
- var faro_core_1 = require("@grafana/faro-core");
16
- var currentHref;
17
- var pageId;
18
- function createPageMeta(_a) {
19
- var _b = _a === void 0 ? {} : _a, generatePageId = _b.generatePageId, initialPageMeta = _b.initialPageMeta;
20
- var pageMeta = function () {
21
- var locationHref = location.href;
4
+ const faro_core_1 = require("@grafana/faro-core");
5
+ let currentHref;
6
+ let pageId;
7
+ function createPageMeta({ generatePageId, initialPageMeta } = {}) {
8
+ const pageMeta = () => {
9
+ const locationHref = location.href;
22
10
  if ((0, faro_core_1.isFunction)(generatePageId) && currentHref !== locationHref) {
23
11
  currentHref = locationHref;
24
12
  pageId = generatePageId(location);
25
13
  }
26
14
  return {
27
- page: __assign(__assign({ url: locationHref }, (pageId ? { id: pageId } : {})), initialPageMeta),
15
+ page: Object.assign(Object.assign({ url: locationHref }, (pageId ? { id: pageId } : {})), initialPageMeta),
28
16
  };
29
17
  };
30
18
  return pageMeta;
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/page/meta.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAUA,wCAqBC;AA/BD,gDAA0E;AAE1E,IAAI,WAA+B,CAAC;AACpC,IAAI,MAA0B,CAAC;AAO/B,SAAgB,cAAc,CAAC,EAA6D;QAA7D,qBAA2D,EAAE,KAAA,EAA3D,cAAc,oBAAA,EAAE,eAAe,qBAAA;IAG9D,IAAM,QAAQ,GAAiC;QAC7C,IAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;QAEnC,IAAI,IAAA,sBAAU,EAAC,cAAc,CAAC,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;YAC/D,WAAW,GAAG,YAAY,CAAC;YAC3B,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO;YACL,IAAI,sBACF,GAAG,EAAE,YAAY,IACd,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC9B,eAAe,CACnB;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { isFunction, type Meta, type MetaItem } from '@grafana/faro-core';\n\nlet currentHref: string | undefined;\nlet pageId: string | undefined;\n\ntype createPageMetaProps = {\n generatePageId?: (location: Location) => string;\n initialPageMeta?: Meta['page'];\n};\n\nexport function createPageMeta({ generatePageId, initialPageMeta }: createPageMetaProps = {}): MetaItem<\n Pick<Meta, 'page'>\n> {\n const pageMeta: MetaItem<Pick<Meta, 'page'>> = () => {\n const locationHref = location.href;\n\n if (isFunction(generatePageId) && currentHref !== locationHref) {\n currentHref = locationHref;\n pageId = generatePageId(location);\n }\n\n return {\n page: {\n url: locationHref,\n ...(pageId ? { id: pageId } : {}),\n ...initialPageMeta,\n },\n };\n };\n\n return pageMeta;\n}\n"]}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/page/meta.ts"],"names":[],"mappings":";;AAUA,wCAqBC;AA/BD,kDAA0E;AAE1E,IAAI,WAA+B,CAAC;AACpC,IAAI,MAA0B,CAAC;AAO/B,SAAgB,cAAc,CAAC,EAAE,cAAc,EAAE,eAAe,KAA0B,EAAE;IAG1F,MAAM,QAAQ,GAAiC,GAAG,EAAE;QAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;QAEnC,IAAI,IAAA,sBAAU,EAAC,cAAc,CAAC,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;YAC/D,WAAW,GAAG,YAAY,CAAC;YAC3B,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO;YACL,IAAI,gCACF,GAAG,EAAE,YAAY,IACd,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC9B,eAAe,CACnB;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import { isFunction, type Meta, type MetaItem } from '@grafana/faro-core';\n\nlet currentHref: string | undefined;\nlet pageId: string | undefined;\n\ntype createPageMetaProps = {\n generatePageId?: (location: Location) => string;\n initialPageMeta?: Meta['page'];\n};\n\nexport function createPageMeta({ generatePageId, initialPageMeta }: createPageMetaProps = {}): MetaItem<\n Pick<Meta, 'page'>\n> {\n const pageMeta: MetaItem<Pick<Meta, 'page'>> = () => {\n const locationHref = location.href;\n\n if (isFunction(generatePageId) && currentHref !== locationHref) {\n currentHref = locationHref;\n pageId = generatePageId(location);\n }\n\n return {\n page: {\n url: locationHref,\n ...(pageId ? { id: pageId } : {}),\n ...initialPageMeta,\n },\n };\n };\n\n return pageMeta;\n}\n"]}
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sdkMeta = void 0;
4
- var faro_core_1 = require("@grafana/faro-core");
5
- var sdkMeta = function () { return ({
4
+ const faro_core_1 = require("@grafana/faro-core");
5
+ const sdkMeta = () => ({
6
6
  sdk: {
7
7
  name: 'faro-web',
8
8
  version: faro_core_1.VERSION,
9
9
  },
10
- }); };
10
+ });
11
11
  exports.sdkMeta = sdkMeta;
12
12
  //# sourceMappingURL=meta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/sdk/meta.ts"],"names":[],"mappings":";;;AAAA,gDAA6C;AAGtC,IAAM,OAAO,GAAgC,cAAM,OAAA,CAAC;IACzD,GAAG,EAAE;QACH,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,mBAAO;KACjB;CACF,CAAC,EALwD,CAKxD,CAAC;AALU,QAAA,OAAO,WAKjB","sourcesContent":["import { VERSION } from '@grafana/faro-core';\nimport type { Meta, MetaItem } from '@grafana/faro-core';\n\nexport const sdkMeta: MetaItem<Pick<Meta, 'sdk'>> = () => ({\n sdk: {\n name: 'faro-web',\n version: VERSION,\n },\n});\n"]}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../../src/metas/sdk/meta.ts"],"names":[],"mappings":";;;AAAA,kDAA6C;AAGtC,MAAM,OAAO,GAAgC,GAAG,EAAE,CAAC,CAAC;IACzD,GAAG,EAAE;QACH,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,mBAAO;KACjB;CACF,CAAC,CAAC;AALU,QAAA,OAAO,WAKjB","sourcesContent":["import { VERSION } from '@grafana/faro-core';\nimport type { Meta, MetaItem } from '@grafana/faro-core';\n\nexport const sdkMeta: MetaItem<Pick<Meta, 'sdk'>> = () => ({\n sdk: {\n name: 'faro-web',\n version: VERSION,\n },\n});\n"]}
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSession = createSession;
4
- var faro_core_1 = require("@grafana/faro-core");
4
+ const faro_core_1 = require("@grafana/faro-core");
5
5
  function createSession(attributes) {
6
6
  var _a, _b, _c, _d;
7
7
  return {
8
8
  id: (_d = (_c = (_b = (_a = faro_core_1.faro.config) === null || _a === void 0 ? void 0 : _a.sessionTracking) === null || _b === void 0 ? void 0 : _b.generateSessionId) === null || _c === void 0 ? void 0 : _c.call(_b)) !== null && _d !== void 0 ? _d : (0, faro_core_1.genShortID)(),
9
- attributes: attributes,
9
+ attributes,
10
10
  };
11
11
  }
12
12
  //# sourceMappingURL=createSession.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSession.js","sourceRoot":"","sources":["../../../../src/metas/session/createSession.ts"],"names":[],"mappings":";;AAGA,sCAKC;AARD,gDAAsD;AAGtD,SAAgB,aAAa,CAAC,UAAsC;;IAClE,OAAO;QACL,EAAE,EAAE,MAAA,MAAA,MAAA,MAAA,gBAAI,CAAC,MAAM,0CAAE,eAAe,0CAAE,iBAAiB,kDAAI,mCAAI,IAAA,sBAAU,GAAE;QACvE,UAAU,YAAA;KACX,CAAC;AACJ,CAAC","sourcesContent":["import { faro, genShortID } from '@grafana/faro-core';\nimport type { MetaSession } from '@grafana/faro-core';\n\nexport function createSession(attributes?: MetaSession['attributes']): MetaSession {\n return {\n id: faro.config?.sessionTracking?.generateSessionId?.() ?? genShortID(),\n attributes,\n };\n}\n"]}
1
+ {"version":3,"file":"createSession.js","sourceRoot":"","sources":["../../../../src/metas/session/createSession.ts"],"names":[],"mappings":";;AAGA,sCAKC;AARD,kDAAsD;AAGtD,SAAgB,aAAa,CAAC,UAAsC;;IAClE,OAAO;QACL,EAAE,EAAE,MAAA,MAAA,MAAA,MAAA,gBAAI,CAAC,MAAM,0CAAE,eAAe,0CAAE,iBAAiB,kDAAI,mCAAI,IAAA,sBAAU,GAAE;QACvE,UAAU;KACX,CAAC;AACJ,CAAC","sourcesContent":["import { faro, genShortID } from '@grafana/faro-core';\nimport type { MetaSession } from '@grafana/faro-core';\n\nexport function createSession(attributes?: MetaSession['attributes']): MetaSession {\n return {\n id: faro.config?.sessionTracking?.generateSessionId?.() ?? genShortID(),\n attributes,\n };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUAResult = void 0;
4
+ var uaParser_1 = require("./uaParser");
5
+ Object.defineProperty(exports, "getUAResult", { enumerable: true, get: function () { return uaParser_1.getUAResult; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/metas/shared/index.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AAAhC,uGAAA,WAAW,OAAA","sourcesContent":["export { getUAResult } from './uaParser';\n"]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUAResult = getUAResult;
4
+ const ua_parser_js_1 = require("ua-parser-js");
5
+ let cachedUA;
6
+ let cachedResult;
7
+ // Browser and OS meta providers both need to parse navigator.userAgent.
8
+ // Cache keyed on the UA string so we parse at most once per unique UA
9
+ // (test mutations of navigator.userAgent invalidate naturally).
10
+ function getUAResult() {
11
+ const currentUA = typeof navigator !== 'undefined' ? navigator.userAgent : '';
12
+ if (cachedUA !== currentUA || !cachedResult) {
13
+ cachedResult = new ua_parser_js_1.UAParser(currentUA).getResult();
14
+ cachedUA = currentUA;
15
+ }
16
+ return cachedResult;
17
+ }
18
+ //# sourceMappingURL=uaParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uaParser.js","sourceRoot":"","sources":["../../../../src/metas/shared/uaParser.ts"],"names":[],"mappings":";;AAUA,kCASC;AAnBD,+CAAwC;AAIxC,IAAI,QAA4B,CAAC;AACjC,IAAI,YAAkC,CAAC;AAEvC,wEAAwE;AACxE,sEAAsE;AACtE,gEAAgE;AAChE,SAAgB,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,uBAAQ,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"]}
@@ -1,37 +1,18 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
2
  Object.defineProperty(exports, "__esModule", { value: true });
18
3
  exports.ConsoleTransport = void 0;
19
- var faro_core_1 = require("@grafana/faro-core");
20
- var ConsoleTransport = /** @class */ (function (_super) {
21
- __extends(ConsoleTransport, _super);
22
- function ConsoleTransport(options) {
23
- if (options === void 0) { options = {}; }
24
- var _this = _super.call(this) || this;
25
- _this.options = options;
26
- _this.name = '@grafana/faro-web-sdk:transport-console';
27
- _this.version = faro_core_1.VERSION;
28
- return _this;
4
+ const faro_core_1 = require("@grafana/faro-core");
5
+ class ConsoleTransport extends faro_core_1.BaseTransport {
6
+ constructor(options = {}) {
7
+ super();
8
+ this.options = options;
9
+ this.name = '@grafana/faro-web-sdk:transport-console';
10
+ this.version = faro_core_1.VERSION;
29
11
  }
30
- ConsoleTransport.prototype.send = function (item) {
12
+ send(item) {
31
13
  var _a;
32
14
  return this.unpatchedConsole[(_a = this.options.level) !== null && _a !== void 0 ? _a : faro_core_1.LogLevel.DEBUG]('New event', (0, faro_core_1.getTransportBody)([item]));
33
- };
34
- return ConsoleTransport;
35
- }(faro_core_1.BaseTransport));
15
+ }
16
+ }
36
17
  exports.ConsoleTransport = ConsoleTransport;
37
18
  //# sourceMappingURL=transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/console/transport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,gDAAwF;AAKxF;IAAsC,oCAAa;IAIjD,0BAAoB,OAAqC;QAArC,wBAAA,EAAA,YAAqC;QACvD,YAAA,MAAK,WAAE,SAAC;QADU,aAAO,GAAP,OAAO,CAA8B;QAHhD,UAAI,GAAG,yCAAyC,CAAC;QACjD,aAAO,GAAG,mBAAO,CAAC;;IAI3B,CAAC;IAED,+BAAI,GAAJ,UAAK,IAAmB;;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,KAAK,mCAAI,oBAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,IAAA,4BAAgB,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5G,CAAC;IACH,uBAAC;AAAD,CAAC,AAXD,CAAsC,yBAAa,GAWlD;AAXY,4CAAgB","sourcesContent":["import { BaseTransport, getTransportBody, LogLevel, VERSION } from '@grafana/faro-core';\nimport type { TransportItem } from '@grafana/faro-core';\n\nimport type { ConsoleTransportOptions } from './types';\n\nexport class ConsoleTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-console';\n readonly version = VERSION;\n\n constructor(private options: ConsoleTransportOptions = {}) {\n super();\n }\n\n send(item: TransportItem): void {\n return this.unpatchedConsole[this.options.level ?? LogLevel.DEBUG]('New event', getTransportBody([item]));\n }\n}\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transports/console/transport.ts"],"names":[],"mappings":";;;AAAA,kDAAwF;AAKxF,MAAa,gBAAiB,SAAQ,yBAAa;IAIjD,YAAoB,UAAmC,EAAE;QACvD,KAAK,EAAE,CAAC;QADU,YAAO,GAAP,OAAO,CAA8B;QAHhD,SAAI,GAAG,yCAAyC,CAAC;QACjD,YAAO,GAAG,mBAAO,CAAC;IAI3B,CAAC;IAED,IAAI,CAAC,IAAmB;;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAA,IAAI,CAAC,OAAO,CAAC,KAAK,mCAAI,oBAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,IAAA,4BAAgB,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5G,CAAC;CACF;AAXD,4CAWC","sourcesContent":["import { BaseTransport, getTransportBody, LogLevel, VERSION } from '@grafana/faro-core';\nimport type { TransportItem } from '@grafana/faro-core';\n\nimport type { ConsoleTransportOptions } from './types';\n\nexport class ConsoleTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-console';\n readonly version = VERSION;\n\n constructor(private options: ConsoleTransportOptions = {}) {\n super();\n }\n\n send(item: TransportItem): void {\n return this.unpatchedConsole[this.options.level ?? LogLevel.DEBUG]('New event', getTransportBody([item]));\n }\n}\n"]}
@@ -1,30 +1,4 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __assign = (this && this.__assign) || function () {
18
- __assign = Object.assign || function(t) {
19
- for (var s, i = 1, n = arguments.length; i < n; i++) {
20
- s = arguments[i];
21
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
- t[p] = s[p];
23
- }
24
- return t;
25
- };
26
- return __assign.apply(this, arguments);
27
- };
28
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -34,33 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
34
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
35
9
  });
36
10
  };
37
- var __generator = (this && this.__generator) || function (thisArg, body) {
38
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
39
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
- function verb(n) { return function (v) { return step([n, v]); }; }
41
- function step(op) {
42
- if (f) throw new TypeError("Generator is already executing.");
43
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
44
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
- if (y = 0, t) op = [op[0] & 2, t.value];
46
- switch (op[0]) {
47
- case 0: case 1: t = op; break;
48
- case 4: _.label++; return { value: op[1], done: false };
49
- case 5: _.label++; y = op[1]; op = [0]; continue;
50
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
- default:
52
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
- if (t[2]) _.ops.pop();
57
- _.trys.pop(); continue;
58
- }
59
- op = body.call(thisArg, _);
60
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
- }
63
- };
64
11
  var __rest = (this && this.__rest) || function (s, e) {
65
12
  var t = {};
66
13
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -74,151 +21,110 @@ var __rest = (this && this.__rest) || function (s, e) {
74
21
  };
75
22
  Object.defineProperty(exports, "__esModule", { value: true });
76
23
  exports.FetchTransport = void 0;
77
- var faro_core_1 = require("@grafana/faro-core");
78
- var sessionManager_1 = require("../../instrumentations/session/sessionManager");
79
- var sessionManagerUtils_1 = require("../../instrumentations/session/sessionManager/sessionManagerUtils");
80
- var DEFAULT_BUFFER_SIZE = 30;
81
- var DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17
82
- var DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;
83
- var BEACON_BODY_SIZE_LIMIT = 60000;
84
- var TOO_MANY_REQUESTS = 429;
85
- var ACCEPTED = 202;
86
- var FetchTransport = /** @class */ (function (_super) {
87
- __extends(FetchTransport, _super);
88
- function FetchTransport(options) {
24
+ const faro_core_1 = require("@grafana/faro-core");
25
+ const sessionManager_1 = require("../../instrumentations/session/sessionManager");
26
+ const sessionManagerUtils_1 = require("../../instrumentations/session/sessionManager/sessionManagerUtils");
27
+ const DEFAULT_BUFFER_SIZE = 30;
28
+ const DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17
29
+ const DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;
30
+ const BEACON_BODY_SIZE_LIMIT = 60000;
31
+ const TOO_MANY_REQUESTS = 429;
32
+ const ACCEPTED = 202;
33
+ class FetchTransport extends faro_core_1.BaseTransport {
34
+ constructor(options) {
89
35
  var _a, _b, _c, _d;
90
- var _this = _super.call(this) || this;
91
- _this.options = options;
92
- _this.name = '@grafana/faro-web-sdk:transport-fetch';
93
- _this.version = faro_core_1.VERSION;
94
- _this.disabledUntil = new Date();
95
- _this.rateLimitBackoffMs = (_a = options.defaultRateLimitBackoffMs) !== null && _a !== void 0 ? _a : DEFAULT_RATE_LIMIT_BACKOFF_MS;
96
- _this.getNow = (_b = options.getNow) !== null && _b !== void 0 ? _b : (function () { return Date.now(); });
97
- _this.promiseBuffer = (0, faro_core_1.createPromiseBuffer)({
36
+ super();
37
+ this.options = options;
38
+ this.name = '@grafana/faro-web-sdk:transport-fetch';
39
+ this.version = faro_core_1.VERSION;
40
+ this.disabledUntil = new Date(0);
41
+ this.rateLimitBackoffMs = (_a = options.defaultRateLimitBackoffMs) !== null && _a !== void 0 ? _a : DEFAULT_RATE_LIMIT_BACKOFF_MS;
42
+ this.getNow = (_b = options.getNow) !== null && _b !== void 0 ? _b : (() => Date.now());
43
+ this.promiseBuffer = (0, faro_core_1.createPromiseBuffer)({
98
44
  size: (_c = options.bufferSize) !== null && _c !== void 0 ? _c : DEFAULT_BUFFER_SIZE,
99
45
  concurrency: (_d = options.concurrency) !== null && _d !== void 0 ? _d : DEFAULT_CONCURRENCY,
100
46
  });
101
- return _this;
102
47
  }
103
- FetchTransport.prototype.send = function (items) {
104
- return __awaiter(this, void 0, void 0, function () {
105
- var err_1;
106
- var _this = this;
107
- return __generator(this, function (_a) {
108
- switch (_a.label) {
109
- case 0:
110
- _a.trys.push([0, 2, , 3]);
111
- if (this.disabledUntil > new Date(this.getNow())) {
112
- this.logWarn("Dropping transport item due to too many requests. Backoff until ".concat(this.disabledUntil));
113
- return [2 /*return*/, Promise.resolve()];
114
- }
115
- return [4 /*yield*/, this.promiseBuffer.add(function () { return __awaiter(_this, void 0, void 0, function () {
116
- var body, _a, url, requestOptions, apiKey, _b, _c, headers, restOfRequestOptions, sessionId, sessionMeta, resolvedHeaders, _i, _d, _e, key, value, _f, _g, _h;
117
- var _this = this;
118
- return __generator(this, function (_j) {
119
- switch (_j.label) {
120
- case 0:
121
- body = JSON.stringify((0, faro_core_1.getTransportBody)(items));
122
- _a = this.options, url = _a.url, requestOptions = _a.requestOptions, apiKey = _a.apiKey;
123
- _b = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, _c = _b.headers, headers = _c === void 0 ? {} : _c, restOfRequestOptions = __rest(_b, ["headers"]);
124
- sessionMeta = this.metas.value.session;
125
- if (sessionMeta != null) {
126
- sessionId = sessionMeta.id;
127
- }
128
- resolvedHeaders = {};
129
- _i = 0, _d = Object.entries(headers);
130
- _j.label = 1;
131
- case 1:
132
- if (!(_i < _d.length)) return [3 /*break*/, 6];
133
- _e = _d[_i], key = _e[0], value = _e[1];
134
- _f = resolvedHeaders;
135
- _g = key;
136
- if (!(typeof value === 'function')) return [3 /*break*/, 3];
137
- return [4 /*yield*/, Promise.resolve(value())];
138
- case 2:
139
- _h = _j.sent();
140
- return [3 /*break*/, 4];
141
- case 3:
142
- _h = value;
143
- _j.label = 4;
144
- case 4:
145
- _f[_g] = _h;
146
- _j.label = 5;
147
- case 5:
148
- _i++;
149
- return [3 /*break*/, 1];
150
- case 6: return [2 /*return*/, fetch(url, __assign({ method: 'POST', headers: __assign(__assign(__assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), (sessionId ? { 'x-faro-session-id': sessionId } : {})), body: body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
151
- .then(function (response) { return __awaiter(_this, void 0, void 0, function () {
152
- var sessionExpired;
153
- return __generator(this, function (_a) {
154
- if (response.status === ACCEPTED) {
155
- sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid';
156
- if (sessionExpired) {
157
- this.extendFaroSession(this.config, this.logDebug);
158
- }
159
- }
160
- if (response.status === TOO_MANY_REQUESTS) {
161
- this.disabledUntil = this.getRetryAfterDate(response);
162
- this.logWarn("Too many requests, backing off until ".concat(this.disabledUntil));
163
- }
164
- // read the body so the connection can be closed
165
- response.text().catch(faro_core_1.noop);
166
- return [2 /*return*/, response];
167
- });
168
- }); })
169
- .catch(function (err) {
170
- _this.logError('Failed sending payload to the receiver\n', JSON.parse(body), err);
171
- })];
172
- }
173
- });
174
- }); })];
175
- case 1:
176
- _a.sent();
177
- return [3 /*break*/, 3];
178
- case 2:
179
- err_1 = _a.sent();
180
- this.logError(err_1);
181
- return [3 /*break*/, 3];
182
- case 3: return [2 /*return*/];
48
+ send(items) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ try {
51
+ if (this.disabledUntil > new Date(this.getNow())) {
52
+ this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`);
53
+ return Promise.resolve();
183
54
  }
184
- });
55
+ yield this.promiseBuffer.add(() => __awaiter(this, void 0, void 0, function* () {
56
+ const body = JSON.stringify((0, faro_core_1.getTransportBody)(items));
57
+ const { url, requestOptions, apiKey } = this.options;
58
+ const _a = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, { headers = {} } = _a, restOfRequestOptions = __rest(_a, ["headers"]);
59
+ let sessionId;
60
+ const sessionMeta = this.metas.value.session;
61
+ if (sessionMeta != null) {
62
+ sessionId = sessionMeta.id;
63
+ }
64
+ const resolvedHeaders = {};
65
+ for (const [key, value] of Object.entries(headers)) {
66
+ resolvedHeaders[key] = typeof value === 'function' ? yield Promise.resolve(value()) : value;
67
+ }
68
+ return fetch(url, Object.assign({ method: 'POST', headers: Object.assign(Object.assign(Object.assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), (sessionId ? { 'x-faro-session-id': sessionId } : {})), body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
69
+ .then((response) => __awaiter(this, void 0, void 0, function* () {
70
+ if (response.status === ACCEPTED) {
71
+ const sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid';
72
+ if (sessionExpired) {
73
+ this.extendFaroSession(this.config, this.logDebug);
74
+ }
75
+ }
76
+ if (response.status === TOO_MANY_REQUESTS) {
77
+ this.disabledUntil = this.getRetryAfterDate(response);
78
+ this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`);
79
+ }
80
+ // read the body so the connection can be closed
81
+ response.text().catch(faro_core_1.noop);
82
+ return response;
83
+ }))
84
+ .catch((err) => {
85
+ this.logError('Failed sending payload to the receiver\n', JSON.parse(body), err);
86
+ });
87
+ }));
88
+ }
89
+ catch (err) {
90
+ this.logError(err);
91
+ }
185
92
  });
186
- };
187
- FetchTransport.prototype.getIgnoreUrls = function () {
93
+ }
94
+ getIgnoreUrls() {
188
95
  var _a;
189
96
  return [this.options.url].concat((_a = this.config.ignoreUrls) !== null && _a !== void 0 ? _a : []);
190
- };
191
- FetchTransport.prototype.isBatched = function () {
97
+ }
98
+ isBatched() {
192
99
  return true;
193
- };
194
- FetchTransport.prototype.getRetryAfterDate = function (response) {
195
- var now = this.getNow();
196
- var retryAfterHeader = response.headers.get('Retry-After');
100
+ }
101
+ getRetryAfterDate(response) {
102
+ const now = this.getNow();
103
+ const retryAfterHeader = response.headers.get('Retry-After');
197
104
  if (retryAfterHeader) {
198
- var delay = Number(retryAfterHeader);
105
+ const delay = Number(retryAfterHeader);
199
106
  if (!isNaN(delay)) {
200
107
  return new Date(delay * 1000 + now);
201
108
  }
202
- var date = Date.parse(retryAfterHeader);
109
+ const date = Date.parse(retryAfterHeader);
203
110
  if (!isNaN(date)) {
204
111
  return new Date(date);
205
112
  }
206
113
  }
207
114
  return new Date(now + this.rateLimitBackoffMs);
208
- };
209
- FetchTransport.prototype.extendFaroSession = function (config, logDebug) {
210
- var SessionExpiredString = "Session expired";
211
- var sessionTrackingConfig = config.sessionTracking;
115
+ }
116
+ extendFaroSession(config, logDebug) {
117
+ const SessionExpiredString = `Session expired`;
118
+ const sessionTrackingConfig = config.sessionTracking;
212
119
  if (sessionTrackingConfig === null || sessionTrackingConfig === void 0 ? void 0 : sessionTrackingConfig.enabled) {
213
- var _a = (0, sessionManager_1.getSessionManagerByConfig)(sessionTrackingConfig), fetchUserSession = _a.fetchUserSession, storeUserSession = _a.storeUserSession;
214
- (0, sessionManagerUtils_1.getUserSessionUpdater)({ fetchUserSession: fetchUserSession, storeUserSession: storeUserSession })({ forceSessionExtend: true });
215
- logDebug("".concat(SessionExpiredString, " created new session."));
120
+ const { fetchUserSession, storeUserSession } = (0, sessionManager_1.getSessionManagerByConfig)(sessionTrackingConfig);
121
+ (0, sessionManagerUtils_1.getUserSessionUpdater)({ fetchUserSession, storeUserSession })({ forceSessionExtend: true });
122
+ logDebug(`${SessionExpiredString} created new session.`);
216
123
  }
217
124
  else {
218
- logDebug("".concat(SessionExpiredString, "."));
125
+ logDebug(`${SessionExpiredString}.`);
219
126
  }
220
- };
221
- return FetchTransport;
222
- }(faro_core_1.BaseTransport));
127
+ }
128
+ }
223
129
  exports.FetchTransport = FetchTransport;
224
130
  //# sourceMappingURL=transport.js.map
@@ -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"]}
@@ -5,27 +5,23 @@ exports.throttle = throttle;
5
5
  * Tail based throttle which caches the args of the last call and updates
6
6
  */
7
7
  function throttle(callback, delay) {
8
- var pause = false;
9
- var lastPending;
10
- var timeoutBehavior = function () {
8
+ let pause = false;
9
+ let lastPending;
10
+ const timeoutBehavior = () => {
11
11
  if (lastPending == null) {
12
12
  pause = false;
13
13
  return;
14
14
  }
15
- callback.apply(void 0, lastPending);
15
+ callback(...lastPending);
16
16
  lastPending = null;
17
17
  setTimeout(timeoutBehavior, delay);
18
18
  };
19
- return function () {
20
- var args = [];
21
- for (var _i = 0; _i < arguments.length; _i++) {
22
- args[_i] = arguments[_i];
23
- }
19
+ return (...args) => {
24
20
  if (pause) {
25
21
  lastPending = args;
26
22
  return;
27
23
  }
28
- callback.apply(void 0, args);
24
+ callback(...args);
29
25
  pause = true;
30
26
  setTimeout(timeoutBehavior, delay);
31
27
  };
@@ -1 +1 @@
1
- {"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../../src/utils/throttle.ts"],"names":[],"mappings":";;AAGA,4BAyBC;AA5BD;;GAEG;AACH,SAAgB,QAAQ,CAAqC,QAAW,EAAE,KAAa;IACrF,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,WAAiC,CAAC;IAEtC,IAAM,eAAe,GAAG;QACtB,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC;YACd,OAAO;QACT,CAAC;QAED,QAAQ,eAAI,WAAW,EAAE;QACzB,WAAW,GAAG,IAAI,CAAC;QACnB,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO;QAAC,cAAsB;aAAtB,UAAsB,EAAtB,qBAAsB,EAAtB,IAAsB;YAAtB,yBAAsB;;QAC5B,IAAI,KAAK,EAAE,CAAC;YACV,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QAED,QAAQ,eAAI,IAAI,EAAE;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Tail based throttle which caches the args of the last call and updates\n */\nexport function throttle<T extends (...args: any[]) => void>(callback: T, delay: number) {\n let pause = false;\n let lastPending: Parameters<T> | null;\n\n const timeoutBehavior = () => {\n if (lastPending == null) {\n pause = false;\n return;\n }\n\n callback(...lastPending);\n lastPending = null;\n setTimeout(timeoutBehavior, delay);\n };\n\n return (...args: Parameters<T>) => {\n if (pause) {\n lastPending = args;\n return;\n }\n\n callback(...args);\n pause = true;\n setTimeout(timeoutBehavior, delay);\n };\n}\n"]}
1
+ {"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../../src/utils/throttle.ts"],"names":[],"mappings":";;AAGA,4BAyBC;AA5BD;;GAEG;AACH,SAAgB,QAAQ,CAAqC,QAAW,EAAE,KAAa;IACrF,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,WAAiC,CAAC;IAEtC,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC;YACd,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,GAAG,WAAW,CAAC,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC;QACnB,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,IAAmB,EAAE,EAAE;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Tail based throttle which caches the args of the last call and updates\n */\nexport function throttle<T extends (...args: any[]) => void>(callback: T, delay: number) {\n let pause = false;\n let lastPending: Parameters<T> | null;\n\n const timeoutBehavior = () => {\n if (lastPending == null) {\n pause = false;\n return;\n }\n\n callback(...lastPending);\n lastPending = null;\n setTimeout(timeoutBehavior, delay);\n };\n\n return (...args: Parameters<T>) => {\n if (pause) {\n lastPending = args;\n return;\n }\n\n callback(...args);\n pause = true;\n setTimeout(timeoutBehavior, delay);\n };\n}\n"]}
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getIgnoreUrls = getIgnoreUrls;
4
4
  exports.isUrlIgnored = isUrlIgnored;
5
5
  exports.getUrlFromResource = getUrlFromResource;
6
- var faro_core_1 = require("@grafana/faro-core");
6
+ const faro_core_1 = require("@grafana/faro-core");
7
7
  /**
8
8
  * Retrieves a list of URLs to be ignored by aggregating the ignore URLs from all transports.
9
9
  *
10
10
  * @returns {string[]} An array of URLs to be ignored.
11
11
  */
12
12
  function getIgnoreUrls() {
13
- return faro_core_1.faro.transports.transports.flatMap(function (transport) { return transport.getIgnoreUrls(); });
13
+ return faro_core_1.faro.transports.transports.flatMap((transport) => transport.getIgnoreUrls());
14
14
  }
15
15
  /**
16
16
  * Checks if the given URL should be ignored based on a list of ignored URLs.
@@ -18,9 +18,8 @@ function getIgnoreUrls() {
18
18
  * @param url - The URL to check.
19
19
  * @returns `true` if the URL is in the list of ignored URLs, `false` otherwise.
20
20
  */
21
- function isUrlIgnored(url) {
22
- if (url === void 0) { url = ''; }
23
- return getIgnoreUrls().some(function (ignoredUrl) { return url && url.match(ignoredUrl) != null; });
21
+ function isUrlIgnored(url = '') {
22
+ return getIgnoreUrls().some((ignoredUrl) => url && url.match(ignoredUrl) != null);
24
23
  }
25
24
  /**
26
25
  * Extracts a URL string from the given resource.