@grafana/faro-core 1.14.0 → 1.14.2

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 (233) hide show
  1. package/dist/bundle/faro-core.iife.js +1 -1
  2. package/dist/bundle/types/api/ItemBuffer.d.ts +7 -0
  3. package/dist/bundle/types/api/apiTestHelpers.d.ts +11 -0
  4. package/dist/bundle/types/api/const.d.ts +3 -0
  5. package/dist/bundle/types/api/events/initialize.d.ts +13 -2
  6. package/dist/bundle/types/api/events/types.d.ts +11 -0
  7. package/dist/bundle/types/api/exceptions/initialize.d.ts +13 -2
  8. package/dist/bundle/types/api/exceptions/types.d.ts +2 -0
  9. package/dist/bundle/types/api/index.d.ts +3 -1
  10. package/dist/bundle/types/api/initialize.d.ts +3 -1
  11. package/dist/bundle/types/api/logs/initialize.d.ts +13 -2
  12. package/dist/bundle/types/api/logs/types.d.ts +3 -1
  13. package/dist/bundle/types/api/measurements/initialize.d.ts +13 -1
  14. package/dist/bundle/types/api/measurements/types.d.ts +2 -0
  15. package/dist/bundle/types/api/meta/initialize.d.ts +14 -2
  16. package/dist/bundle/types/api/types.d.ts +37 -0
  17. package/dist/bundle/types/api/userActionLifecycleHandler.d.ts +13 -0
  18. package/dist/bundle/types/api/utils.d.ts +2 -0
  19. package/dist/bundle/types/config/types.d.ts +21 -12
  20. package/dist/bundle/types/index.d.ts +4 -4
  21. package/dist/bundle/types/testUtils/mockTransport.d.ts +1 -1
  22. package/dist/bundle/types/transports/initialize.d.ts +2 -4
  23. package/dist/bundle/types/transports/types.d.ts +0 -1
  24. package/dist/bundle/types/utils/index.d.ts +2 -0
  25. package/dist/bundle/types/utils/reactive.d.ts +46 -0
  26. package/dist/bundle/types/version.d.ts +1 -1
  27. package/dist/cjs/api/ItemBuffer.js +27 -0
  28. package/dist/cjs/api/ItemBuffer.js.map +1 -0
  29. package/dist/cjs/api/apiTestHelpers.js +36 -0
  30. package/dist/cjs/api/apiTestHelpers.js.map +1 -0
  31. package/dist/cjs/api/const.js +7 -0
  32. package/dist/cjs/api/const.js.map +1 -0
  33. package/dist/cjs/api/events/initialize.js +15 -6
  34. package/dist/cjs/api/events/initialize.js.map +1 -1
  35. package/dist/cjs/api/events/types.js.map +1 -1
  36. package/dist/cjs/api/exceptions/initialize.js +59 -37
  37. package/dist/cjs/api/exceptions/initialize.js.map +1 -1
  38. package/dist/cjs/api/exceptions/types.js.map +1 -1
  39. package/dist/cjs/api/index.js +7 -1
  40. package/dist/cjs/api/index.js.map +1 -1
  41. package/dist/cjs/api/initialize.js +16 -2
  42. package/dist/cjs/api/initialize.js.map +1 -1
  43. package/dist/cjs/api/logs/initialize.js +15 -6
  44. package/dist/cjs/api/logs/initialize.js.map +1 -1
  45. package/dist/cjs/api/logs/types.js.map +1 -1
  46. package/dist/cjs/api/measurements/initialize.js +12 -3
  47. package/dist/cjs/api/measurements/initialize.js.map +1 -1
  48. package/dist/cjs/api/measurements/types.js.map +1 -1
  49. package/dist/cjs/api/meta/initialize.js +2 -1
  50. package/dist/cjs/api/meta/initialize.js.map +1 -1
  51. package/dist/cjs/api/types.js.map +1 -1
  52. package/dist/cjs/api/userActionLifecycleHandler.js +59 -0
  53. package/dist/cjs/api/userActionLifecycleHandler.js.map +1 -0
  54. package/dist/cjs/api/utils.js +11 -0
  55. package/dist/cjs/api/utils.js.map +1 -0
  56. package/dist/cjs/config/types.js.map +1 -1
  57. package/dist/cjs/index.js +8 -2
  58. package/dist/cjs/index.js.map +1 -1
  59. package/dist/cjs/transports/initialize.js +1 -35
  60. package/dist/cjs/transports/initialize.js.map +1 -1
  61. package/dist/cjs/transports/registerInitial.js +0 -1
  62. package/dist/cjs/transports/registerInitial.js.map +1 -1
  63. package/dist/cjs/transports/types.js.map +1 -1
  64. package/dist/cjs/utils/index.js +4 -1
  65. package/dist/cjs/utils/index.js.map +1 -1
  66. package/dist/cjs/utils/reactive.js +104 -0
  67. package/dist/cjs/utils/reactive.js.map +1 -0
  68. package/dist/cjs/version.js +1 -1
  69. package/dist/cjs/version.js.map +1 -1
  70. package/dist/esm/api/ItemBuffer.js +21 -0
  71. package/dist/esm/api/ItemBuffer.js.map +1 -0
  72. package/dist/esm/api/apiTestHelpers.js +33 -0
  73. package/dist/esm/api/apiTestHelpers.js.map +1 -0
  74. package/dist/esm/api/const.js +4 -0
  75. package/dist/esm/api/const.js.map +1 -0
  76. package/dist/esm/api/events/initialize.js +15 -7
  77. package/dist/esm/api/events/initialize.js.map +1 -1
  78. package/dist/esm/api/events/types.js.map +1 -1
  79. package/dist/esm/api/exceptions/initialize.js +56 -35
  80. package/dist/esm/api/exceptions/initialize.js.map +1 -1
  81. package/dist/esm/api/exceptions/types.js.map +1 -1
  82. package/dist/esm/api/index.js +2 -0
  83. package/dist/esm/api/index.js.map +1 -1
  84. package/dist/esm/api/initialize.js +15 -1
  85. package/dist/esm/api/initialize.js.map +1 -1
  86. package/dist/esm/api/logs/initialize.js +12 -4
  87. package/dist/esm/api/logs/initialize.js.map +1 -1
  88. package/dist/esm/api/logs/types.js.map +1 -1
  89. package/dist/esm/api/measurements/initialize.js +12 -4
  90. package/dist/esm/api/measurements/initialize.js.map +1 -1
  91. package/dist/esm/api/measurements/types.js.map +1 -1
  92. package/dist/esm/api/meta/initialize.js +1 -1
  93. package/dist/esm/api/meta/initialize.js.map +1 -1
  94. package/dist/esm/api/types.js.map +1 -1
  95. package/dist/esm/api/userActionLifecycleHandler.js +43 -0
  96. package/dist/esm/api/userActionLifecycleHandler.js.map +1 -0
  97. package/dist/esm/api/utils.js +7 -0
  98. package/dist/esm/api/utils.js.map +1 -0
  99. package/dist/esm/config/types.js.map +1 -1
  100. package/dist/esm/index.js +2 -2
  101. package/dist/esm/index.js.map +1 -1
  102. package/dist/esm/transports/initialize.js +0 -28
  103. package/dist/esm/transports/initialize.js.map +1 -1
  104. package/dist/esm/transports/registerInitial.js +0 -1
  105. package/dist/esm/transports/registerInitial.js.map +1 -1
  106. package/dist/esm/transports/types.js.map +1 -1
  107. package/dist/esm/utils/index.js +1 -0
  108. package/dist/esm/utils/index.js.map +1 -1
  109. package/dist/esm/utils/reactive.js +93 -0
  110. package/dist/esm/utils/reactive.js.map +1 -0
  111. package/dist/esm/version.js +1 -1
  112. package/dist/esm/version.js.map +1 -1
  113. package/dist/spec/core/src/api/ItemBuffer.js +27 -0
  114. package/dist/spec/core/src/api/ItemBuffer.js.map +1 -0
  115. package/dist/spec/core/src/api/apiTestHelpers.js +36 -0
  116. package/dist/spec/core/src/api/apiTestHelpers.js.map +1 -0
  117. package/dist/spec/core/src/api/const.js +7 -0
  118. package/dist/spec/core/src/api/const.js.map +1 -0
  119. package/dist/spec/core/src/api/events/initialize.js +15 -6
  120. package/dist/spec/core/src/api/events/initialize.js.map +1 -1
  121. package/dist/spec/core/src/api/events/initialize.test.js +57 -0
  122. package/dist/spec/core/src/api/events/initialize.test.js.map +1 -1
  123. package/dist/spec/core/src/api/events/types.js.map +1 -1
  124. package/dist/spec/core/src/api/exceptions/initialize.js +59 -37
  125. package/dist/spec/core/src/api/exceptions/initialize.js.map +1 -1
  126. package/dist/spec/core/src/api/exceptions/initialize.test.js +83 -3
  127. package/dist/spec/core/src/api/exceptions/initialize.test.js.map +1 -1
  128. package/dist/spec/core/src/api/exceptions/types.js.map +1 -1
  129. package/dist/spec/core/src/api/index.js +7 -1
  130. package/dist/spec/core/src/api/index.js.map +1 -1
  131. package/dist/spec/core/src/api/initialize.js +16 -2
  132. package/dist/spec/core/src/api/initialize.js.map +1 -1
  133. package/dist/spec/core/src/api/initialize.test.js +73 -0
  134. package/dist/spec/core/src/api/initialize.test.js.map +1 -0
  135. package/dist/spec/core/src/api/itemBuffer.test.js +36 -0
  136. package/dist/spec/core/src/api/itemBuffer.test.js.map +1 -0
  137. package/dist/spec/core/src/api/logs/initialize.js +15 -6
  138. package/dist/spec/core/src/api/logs/initialize.js.map +1 -1
  139. package/dist/spec/core/src/api/logs/initialize.test.js +98 -0
  140. package/dist/spec/core/src/api/logs/initialize.test.js.map +1 -1
  141. package/dist/spec/core/src/api/logs/types.js.map +1 -1
  142. package/dist/spec/core/src/api/measurements/initialize.js +12 -3
  143. package/dist/spec/core/src/api/measurements/initialize.js.map +1 -1
  144. package/dist/spec/core/src/api/measurements/initialize.test.js +105 -0
  145. package/dist/spec/core/src/api/measurements/initialize.test.js.map +1 -1
  146. package/dist/spec/core/src/api/measurements/types.js.map +1 -1
  147. package/dist/spec/core/src/api/meta/initialize.js +2 -1
  148. package/dist/spec/core/src/api/meta/initialize.js.map +1 -1
  149. package/dist/spec/core/src/api/meta/initilialize.test.js +1 -3
  150. package/dist/spec/core/src/api/meta/initilialize.test.js.map +1 -1
  151. package/dist/spec/core/src/api/types.js.map +1 -1
  152. package/dist/spec/core/src/api/userActionLifecycleHandler.js +59 -0
  153. package/dist/spec/core/src/api/userActionLifecycleHandler.js.map +1 -0
  154. package/dist/spec/core/src/api/userActionLifecycleHandler.test.js +152 -0
  155. package/dist/spec/core/src/api/userActionLifecycleHandler.test.js.map +1 -0
  156. package/dist/spec/core/src/api/utils.js +11 -0
  157. package/dist/spec/core/src/api/utils.js.map +1 -0
  158. package/dist/spec/core/src/api/utils.test.js +20 -0
  159. package/dist/spec/core/src/api/utils.test.js.map +1 -0
  160. package/dist/spec/core/src/config/types.js.map +1 -1
  161. package/dist/spec/core/src/index.js +8 -2
  162. package/dist/spec/core/src/index.js.map +1 -1
  163. package/dist/spec/core/src/transports/initialize.js +1 -35
  164. package/dist/spec/core/src/transports/initialize.js.map +1 -1
  165. package/dist/spec/core/src/transports/registerInitial.js +0 -1
  166. package/dist/spec/core/src/transports/registerInitial.js.map +1 -1
  167. package/dist/spec/core/src/transports/transports.test.js +0 -16
  168. package/dist/spec/core/src/transports/transports.test.js.map +1 -1
  169. package/dist/spec/core/src/transports/types.js.map +1 -1
  170. package/dist/spec/core/src/utils/index.js +4 -1
  171. package/dist/spec/core/src/utils/index.js.map +1 -1
  172. package/dist/spec/core/src/utils/reactive.js +104 -0
  173. package/dist/spec/core/src/utils/reactive.js.map +1 -0
  174. package/dist/spec/core/src/utils/reactive.test.js +104 -0
  175. package/dist/spec/core/src/utils/reactive.test.js.map +1 -0
  176. package/dist/spec/core/src/version.js +1 -1
  177. package/dist/spec/core/src/version.js.map +1 -1
  178. package/dist/types/api/ItemBuffer.d.ts +7 -0
  179. package/dist/types/api/apiTestHelpers.d.ts +11 -0
  180. package/dist/types/api/const.d.ts +3 -0
  181. package/dist/types/api/events/initialize.d.ts +13 -2
  182. package/dist/types/api/events/types.d.ts +11 -0
  183. package/dist/types/api/exceptions/initialize.d.ts +13 -2
  184. package/dist/types/api/exceptions/types.d.ts +2 -0
  185. package/dist/types/api/index.d.ts +3 -1
  186. package/dist/types/api/initialize.d.ts +3 -1
  187. package/dist/types/api/logs/initialize.d.ts +13 -2
  188. package/dist/types/api/logs/types.d.ts +3 -1
  189. package/dist/types/api/measurements/initialize.d.ts +13 -1
  190. package/dist/types/api/measurements/types.d.ts +2 -0
  191. package/dist/types/api/meta/initialize.d.ts +14 -2
  192. package/dist/types/api/types.d.ts +37 -0
  193. package/dist/types/api/userActionLifecycleHandler.d.ts +13 -0
  194. package/dist/types/api/utils.d.ts +2 -0
  195. package/dist/types/config/types.d.ts +21 -12
  196. package/dist/types/core/src/api/ItemBuffer.d.ts +7 -0
  197. package/dist/types/core/src/api/apiTestHelpers.d.ts +11 -0
  198. package/dist/types/core/src/api/const.d.ts +3 -0
  199. package/dist/types/core/src/api/events/initialize.d.ts +13 -2
  200. package/dist/types/core/src/api/events/types.d.ts +11 -0
  201. package/dist/types/core/src/api/exceptions/initialize.d.ts +13 -2
  202. package/dist/types/core/src/api/exceptions/types.d.ts +2 -0
  203. package/dist/types/core/src/api/index.d.ts +3 -1
  204. package/dist/types/core/src/api/initialize.d.ts +3 -1
  205. package/dist/types/core/src/api/initialize.test.d.ts +1 -0
  206. package/dist/types/core/src/api/itemBuffer.test.d.ts +1 -0
  207. package/dist/types/core/src/api/logs/initialize.d.ts +13 -2
  208. package/dist/types/core/src/api/logs/types.d.ts +3 -1
  209. package/dist/types/core/src/api/measurements/initialize.d.ts +13 -1
  210. package/dist/types/core/src/api/measurements/types.d.ts +2 -0
  211. package/dist/types/core/src/api/meta/initialize.d.ts +14 -2
  212. package/dist/types/core/src/api/types.d.ts +37 -0
  213. package/dist/types/core/src/api/userActionLifecycleHandler.d.ts +13 -0
  214. package/dist/types/core/src/api/userActionLifecycleHandler.test.d.ts +1 -0
  215. package/dist/types/core/src/api/utils.d.ts +2 -0
  216. package/dist/types/core/src/api/utils.test.d.ts +1 -0
  217. package/dist/types/core/src/config/types.d.ts +21 -12
  218. package/dist/types/core/src/index.d.ts +4 -4
  219. package/dist/types/core/src/testUtils/mockTransport.d.ts +1 -1
  220. package/dist/types/core/src/transports/initialize.d.ts +2 -4
  221. package/dist/types/core/src/transports/types.d.ts +0 -1
  222. package/dist/types/core/src/utils/index.d.ts +2 -0
  223. package/dist/types/core/src/utils/reactive.d.ts +46 -0
  224. package/dist/types/core/src/utils/reactive.test.d.ts +1 -0
  225. package/dist/types/core/src/version.d.ts +1 -1
  226. package/dist/types/index.d.ts +4 -4
  227. package/dist/types/testUtils/mockTransport.d.ts +1 -1
  228. package/dist/types/transports/initialize.d.ts +2 -4
  229. package/dist/types/transports/types.d.ts +0 -1
  230. package/dist/types/utils/index.d.ts +2 -0
  231. package/dist/types/utils/reactive.d.ts +46 -0
  232. package/dist/types/version.d.ts +1 -1
  233. package/package.json +2 -2
@@ -1 +1 @@
1
- var GrafanaFaroCore=function(e){"use strict";function n(e,n){return typeof e===n}function t(e,n){return Object.prototype.toString.call(e)===`[object ${n}]`}function r(e,n){try{return e instanceof n}catch(e){return!1}}const i=e=>n(e,"null"),a=e=>n(e,"string"),s=e=>n(e,"number")&&!isNaN(e)||n(e,"bigint"),o=e=>!i(e)&&n(e,"object"),l=e=>n(e,"function"),u=e=>t(e,"Array"),c="undefined"!=typeof Event,d="undefined"!=typeof Error,g=e=>d&&r(e,Error),p="undefined"!=typeof Element,f="undefined"!=typeof Map;function m(e){return null==e||(u(e)||a(e)?0===e.length:!!o(e)&&0===Object.keys(e).length)}function v(e,t){if(e===t)return!0;if(n(e,"number")&&isNaN(e))return n(t,"number")&&isNaN(t);const r=u(e),i=u(t);if(r!==i)return!1;if(r&&i){const n=e.length;if(n!==t.length)return!1;for(let r=n;0!=r--;)if(!v(e[r],t[r]))return!1;return!0}const a=o(e),s=o(t);if(a!==s)return!1;if(e&&t&&a&&s){const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;for(let r of n)if(!v(e[r],t[r]))return!1;return!0}return!1}function b(){return(new Date).toISOString()}function h(e){return new Date(e).toISOString()}var E;e.LogLevel=void 0,(E=e.LogLevel||(e.LogLevel={})).TRACE="trace",E.DEBUG="debug",E.INFO="info",E.LOG="log",E.WARN="warn",E.ERROR="error";const y=e.LogLevel.LOG,I=[e.LogLevel.TRACE,e.LogLevel.DEBUG,e.LogLevel.INFO,e.LogLevel.LOG,e.LogLevel.WARN,e.LogLevel.ERROR];function T(){}const O="abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789";const L="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof self?self:void 0;function S(){const e=new WeakSet;return function(n,t){if(o(t)&&null!==t){if(e.has(t))return null;e.add(t)}return t}}function N(e={}){return JSON.stringify(null!=e?e:{},S())}function j(e={}){const n={};for(const[t,r]of Object.entries(e))n[t]=o(r)&&null!==r?N(r):String(r);return n}class R{constructor(e,n){var t,r;this.signalBuffer=[],this.itemLimit=null!==(t=null==n?void 0:n.itemLimit)&&void 0!==t?t:50,this.sendTimeout=null!==(r=null==n?void 0:n.sendTimeout)&&void 0!==r?r:250,this.paused=(null==n?void 0:n.paused)||!1,this.sendFn=e,this.flushInterval=-1,this.paused||this.start(),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&this.flush()}))}addItem(e){this.paused||(this.signalBuffer.push(e),this.signalBuffer.length>=this.itemLimit&&this.flush())}start(){this.paused=!1,this.sendTimeout>0&&(this.flushInterval=window.setInterval((()=>this.flush()),this.sendTimeout))}pause(){this.paused=!0,clearInterval(this.flushInterval)}groupItems(e){const n=new Map;return e.forEach((e=>{const t=JSON.stringify(e.meta);let r=n.get(t);r=void 0===r?[e]:[...r,e],n.set(t,r)})),Array.from(n.values())}flush(){if(this.paused||0===this.signalBuffer.length)return;this.groupItems(this.signalBuffer).forEach(this.sendFn),this.signalBuffer=[]}}var x;e.TransportItemType=void 0,(x=e.TransportItemType||(e.TransportItemType={})).EXCEPTION="exception",x.LOG="log",x.MEASUREMENT="measurement",x.TRACE="trace",x.EVENT="event";const A={[e.TransportItemType.EXCEPTION]:"exceptions",[e.TransportItemType.LOG]:"logs",[e.TransportItemType.MEASUREMENT]:"measurements",[e.TransportItemType.TRACE]:"traces",[e.TransportItemType.EVENT]:"events"};function w(n){return t=>{if(t.type===e.TransportItemType.EXCEPTION&&t.payload){const e=t.payload,r=`${e.type}: ${e.value}`;if(function(e,n){return e.some((e=>a(e)?n.includes(e):!!n.match(e)))}(n,r))return null}return t}}function C(e,n,t,r){var i;n.debug("Initializing transports");const a=[];let s=t.paused,o=[];const l=e=>{let n=e;for(const e of o){const t=n.map(e).filter(Boolean);if(0===t.length)return[];n=t}return n},u=e=>{const t=l(e);if(0!==t.length)for(const e of a)n.debug(`Transporting item using ${e.name}\n`,t),e.isBatched()&&e.send(t)};let c;(null===(i=t.batching)||void 0===i?void 0:i.enabled)&&(c=new R(u,{sendTimeout:t.batching.sendTimeout,itemLimit:t.batching.itemLimit,paused:s}));return{add:(...i)=>{n.debug("Adding transports"),i.forEach((i=>{n.debug(`Adding "${i.name}" transport`);a.some((e=>e===i))?n.warn(`Transport ${i.name} is already added`):(i.unpatchedConsole=e,i.internalLogger=n,i.config=t,i.metas=r,a.push(i))}))},addBeforeSendHooks:(...e)=>{n.debug("Adding beforeSendHooks\n",o),e.forEach((e=>{e&&o.push(e)}))},addIgnoreErrorsPatterns:(...e)=>{n.debug("Adding ignoreErrorsPatterns\n",e),e.forEach((e=>{e&&o.push(w(e))}))},getBeforeSendHooks:()=>[...o],execute:e=>{var r;s||((null===(r=t.batching)||void 0===r?void 0:r.enabled)&&(null==c||c.addItem(e)),(e=>{var r,i;if((null===(r=t.batching)||void 0===r?void 0:r.enabled)&&a.every((e=>e.isBatched())))return;const[s]=l([e]);if(void 0!==s)for(const e of a)n.debug(`Transporting item using ${e.name}\n`,s),e.isBatched()?(null===(i=t.batching)||void 0===i?void 0:i.enabled)||e.send([s]):e.send(s)})(e))},isPaused:()=>s,pause:()=>{n.debug("Pausing transports"),null==c||c.pause(),s=!0},remove:(...e)=>{n.debug("Removing transports"),e.forEach((e=>{n.debug(`Removing "${e.name}" transport`);const t=a.indexOf(e);-1!==t?a.splice(t,1):n.warn(`Transport "${e.name}" is not added`)}))},removeBeforeSendHooks:(...e)=>{o.filter((n=>!e.includes(n)))},get transports(){return[...a]},unpause:()=>{n.debug("Unpausing transports"),null==c||c.start(),s=!1}}}var k;e.InternalLoggerLevel=void 0,(k=e.InternalLoggerLevel||(e.InternalLoggerLevel={}))[k.OFF=0]="OFF",k[k.ERROR=1]="ERROR",k[k.WARN=2]="WARN",k[k.INFO=3]="INFO",k[k.VERBOSE=4]="VERBOSE";const _={debug:T,error:T,info:T,prefix:"Faro",warn:T},P=e.InternalLoggerLevel.ERROR,B=Object.assign({},console);let F=B;function D(e){var n;return F=null!==(n=e.unpatchedConsole)&&void 0!==n?n:F,F}function V(n=B,t=P){const r=_;return t>e.InternalLoggerLevel.OFF&&(r.error=t>=e.InternalLoggerLevel.ERROR?function(...e){n.error(`${r.prefix}\n`,...e)}:T,r.warn=t>=e.InternalLoggerLevel.WARN?function(...e){n.warn(`${r.prefix}\n`,...e)}:T,r.info=t>=e.InternalLoggerLevel.INFO?function(...e){n.info(`${r.prefix}\n`,...e)}:T,r.debug=t>=e.InternalLoggerLevel.VERBOSE?function(...e){n.debug(`${r.prefix}\n`,...e)}:T),r}let M=_;function $(e,n){return M=V(e,n.internalLoggerLevel),M}class G{constructor(){this.unpatchedConsole=B,this.internalLogger=_,this.config={},this.metas={}}logDebug(...e){this.internalLogger.debug(`${this.name}\n`,...e)}logInfo(...e){this.internalLogger.info(`${this.name}\n`,...e)}logWarn(...e){this.internalLogger.warn(`${this.name}\n`,...e)}logError(...e){this.internalLogger.error(`${this.name}\n`,...e)}}function z(e,n){var t,r;if(void 0===n)return e;if(void 0===e)return{resourceSpans:n};const i=null===(t=e.resourceSpans)||void 0===t?void 0:t[0];if(void 0===i)return e;const a=(null==i?void 0:i.scopeSpans)||[],s=(null===(r=null==n?void 0:n[0])||void 0===r?void 0:r.scopeSpans)||[];return Object.assign(Object.assign({},e),{resourceSpans:[Object.assign(Object.assign({},i),{scopeSpans:[...a,...s]})]})}const U="Error";let K;function W(e){let n=e.cause;return g(n)?n=e.cause.toString():null!==n&&(o(e.cause)||u(e.cause))?n=N(e.cause):null!=n&&(n=e.cause.toString()),null==n?{}:{cause:n}}const H=e=>e.map((e=>{try{return String(e)}catch(e){return""}})).join(" ");function X(n,t,r,s,o){t.debug("Initializing API");const l=function(n,t,r,i,a){let s;return t.debug("Initializing traces API"),{getOTEL:()=>s,getTraceContext:()=>{const e=null==s?void 0:s.trace.getSpanContext(s.context.active());return e?{trace_id:e.traceId,span_id:e.spanId}:void 0},initOTEL:(e,n)=>{t.debug("Initializing OpenTelemetry"),s={trace:e,context:n}},isOTELInitialized:()=>!!s,pushTraces:n=>{try{const r={type:e.TransportItemType.TRACE,payload:n,meta:i.value};t.debug("Pushing trace\n",r),a.execute(r)}catch(e){t.error("Error pushing trace\n",e)}}}}(0,t,0,s,o);return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},l),function(n,t,r,a,s,o){var l;t.debug("Initializing exceptions API");let u=null;K=null!==(l=r.parseStacktrace)&&void 0!==l?l:K;const c=e=>{t.debug("Changing stacktrace parser"),K=null!=e?e:K};return c(r.parseStacktrace),{changeStacktraceParser:c,getStacktraceParser:()=>K,pushError:(n,{skipDedupe:l,stackFrames:c,type:d,context:g,spanContext:p,timestampOverwriteMs:f}={})=>{d=d||n.name||U;const m={meta:a.value,payload:{type:d,value:n.message,timestamp:f?h(f):b(),trace:p?{trace_id:p.traceId,span_id:p.spanId}:o.getTraceContext(),context:j(Object.assign(Object.assign({},W(n)),null!=g?g:{}))},type:e.TransportItemType.EXCEPTION};(null==(c=null!=c?c:n.stack?null==K?void 0:K(n).frames:void 0)?void 0:c.length)&&(m.payload.stacktrace={frames:c});const E={type:m.payload.type,value:m.payload.value,stackTrace:m.payload.stacktrace,context:m.payload.context};l||!r.dedupe||i(u)||!v(E,u)?(u=E,t.debug("Pushing exception\n",m),s.execute(m)):t.debug("Skipping error push because it is the same as the last one\n",m.payload)}}}(0,t,r,s,o,l)),function(e,n,t,r){let i,s,o,l;n.debug("Initializing meta API");const u=e=>{s&&r.remove(s),s={user:e},r.add(s)},c=(e,n)=>{var t;const a=null==n?void 0:n.overrides,s=a?{overrides:Object.assign(Object.assign({},null===(t=null==i?void 0:i.session)||void 0===t?void 0:t.overrides),a)}:{};i&&r.remove(i),i={session:Object.assign(Object.assign({},m(e)?void 0:e),s)},r.add(i)},d=()=>r.value.session,g=()=>r.value.page;return{setUser:u,resetUser:u,setSession:c,resetSession:c,getSession:d,setView:(e,n)=>{var t;if((null==n?void 0:n.overrides)&&c(d(),{overrides:n.overrides}),(null===(t=null==o?void 0:o.view)||void 0===t?void 0:t.name)===(null==e?void 0:e.name))return;const i=o;o={view:e},r.add(o),i&&r.remove(i)},getView:()=>r.value.view,setPage:e=>{var n;const t=a(e)?Object.assign(Object.assign({},null!==(n=null==l?void 0:l.page)&&void 0!==n?n:g()),{id:e}):e;l&&r.remove(l),l={page:t},r.add(l)},getPage:g}}(0,t,0,s)),function(n,t,r,a,s,o){var l;t.debug("Initializing logs API");let u=null;const c=null!==(l=r.logArgsSerializer)&&void 0!==l?l:H;return{pushLog:(n,{context:l,level:d,skipDedupe:g,spanContext:p,timestampOverwriteMs:f}={})=>{try{const m={type:e.TransportItemType.LOG,payload:{message:c(n),level:null!=d?d:y,context:j(l),timestamp:f?h(f):b(),trace:p?{trace_id:p.traceId,span_id:p.spanId}:o.getTraceContext()},meta:a.value},E={message:m.payload.message,level:m.payload.level,context:m.payload.context};if(!g&&r.dedupe&&!i(u)&&v(E,u))return void t.debug("Skipping log push because it is the same as the last one\n",m.payload);u=E,t.debug("Pushing log\n",m),s.execute(m)}catch(e){t.error("Error pushing log\n",e)}}}}(0,t,r,s,o,l)),function(n,t,r,a,s,o){t.debug("Initializing measurements API");let l=null;return{pushMeasurement:(n,{skipDedupe:u,context:c,spanContext:d,timestampOverwriteMs:g}={})=>{try{const p={type:e.TransportItemType.MEASUREMENT,payload:Object.assign(Object.assign({},n),{trace:d?{trace_id:d.traceId,span_id:d.spanId}:o.getTraceContext(),timestamp:g?h(g):b(),context:j(c)}),meta:a.value},f={type:p.payload.type,values:p.payload.values,context:p.payload.context};if(!u&&r.dedupe&&!i(l)&&v(f,l))return void t.debug("Skipping measurement push because it is the same as the last one\n",p.payload);l=f,t.debug("Pushing measurement\n",p),s.execute(p)}catch(e){t.error("Error pushing measurement\n",e)}}}}(0,t,r,s,o,l)),function(n,t,r,a,s,o){let l=null;return{pushEvent:(n,u,c,{skipDedupe:d,spanContext:g,timestampOverwriteMs:p}={})=>{try{const f={meta:a.value,payload:{name:n,domain:null!=c?c:r.eventDomain,attributes:j(u),timestamp:p?h(p):b(),trace:g?{trace_id:g.traceId,span_id:g.spanId}:o.getTraceContext()},type:e.TransportItemType.EVENT},m={name:f.payload.name,attributes:f.payload.attributes,domain:f.payload.domain};if(!d&&r.dedupe&&!i(l)&&v(m,l))return void t.debug("Skipping event push because it is the same as the last one\n",f.payload);l=m,t.debug("Pushing event\n",f),s.execute(f)}catch(e){t.error("Error pushing event",e)}}}}(0,t,r,s,o,l))}const J="1.14.0";const q="_faroInternal";function Q(e){e.config.isolate?e.internalLogger.debug("Skipping registering internal Faro instance on global object"):(e.internalLogger.debug("Registering internal Faro instance on global object"),Object.defineProperty(L,q,{configurable:!1,enumerable:!1,writable:!1,value:e}))}function Y(){return q in L}function Z(n,t,r,i,a,s,o){return t.debug("Initializing Faro"),e.faro={api:s,config:r,instrumentations:o,internalLogger:t,metas:i,pause:a.pause,transports:a,unpatchedConsole:n,unpause:a.unpause},Q(e.faro),function(e){if(e.config.preventGlobalExposure)e.internalLogger.debug("Skipping registering public Faro instance in the global scope");else{if(e.internalLogger.debug(`Registering public faro reference in the global scope using "${e.config.globalObjectKey}" key`),e.config.globalObjectKey in L)return void e.internalLogger.warn(`Skipping global registration due to key "${e.config.globalObjectKey}" being used already. Please set "globalObjectKey" to something else or set "preventGlobalExposure" to "true"`);Object.defineProperty(L,e.config.globalObjectKey,{configurable:!1,writable:!1,value:e})}}(e.faro),e.faro}e.faro={};return e.BaseExtension=G,e.BaseInstrumentation=class extends G{constructor(){super(...arguments),this.api={},this.transports={}}},e.BaseTransport=class extends G{isBatched(){return!1}getIgnoreUrls(){return[]}},e.Conventions={EventNames:{CLICK:"click",NAVIGATION:"navigation",SESSION_START:"session_start",VIEW_CHANGED:"view_changed"}},e.EVENT_CLICK="click",e.EVENT_NAVIGATION="navigation",e.EVENT_OVERRIDES_SERVICE_NAME="service_name_override",e.EVENT_ROUTE_CHANGE="route_change",e.EVENT_SESSION_EXTEND="session_extend",e.EVENT_SESSION_RESUME="session_resume",e.EVENT_SESSION_START="session_start",e.EVENT_VIEW_CHANGED="view_changed",e.VERSION=J,e.allLogLevels=I,e.createInternalLogger=V,e.createPromiseBuffer=function(e){const{size:n,concurrency:t}=e,r=[];let i=0;const a=()=>{if(i<t&&r.length){const{producer:e,resolve:n,reject:t}=r.shift();i++,e().then((e=>{i--,a(),n(e)}),(e=>{i--,a(),t(e)}))}};return{add:e=>{if(r.length+i>=n)throw new Error("Task buffer full");return new Promise(((n,t)=>{r.push({producer:e,resolve:n,reject:t}),a()}))}}},e.dateNow=function(){return Date.now()},e.deepEqual=v,e.defaultBatchingConfig={enabled:!0,sendTimeout:250,itemLimit:50},e.defaultErrorArgsSerializer=e=>e.map((e=>o(e)?N(e):String(e))).join(" "),e.defaultExceptionType=U,e.defaultGlobalObjectKey="faro",e.defaultInternalLoggerLevel=P,e.defaultLogArgsSerializer=H,e.defaultLogLevel=y,e.defaultUnpatchedConsole=B,e.genShortID=function(e=10){return Array.from(Array(e)).map((()=>O[Math.floor(59*Math.random())])).join("")},e.getCircularDependencyReplacer=S,e.getCurrentTimestamp=b,e.getInternalFaroFromGlobalObject=function(){return L[q]},e.getTransportBody=function(n){let t={meta:{}};return void 0!==n[0]&&(t.meta=n[0].meta),n.forEach((n=>{switch(n.type){case e.TransportItemType.LOG:case e.TransportItemType.EVENT:case e.TransportItemType.EXCEPTION:case e.TransportItemType.MEASUREMENT:const r=A[n.type],i=t[r];t=Object.assign(Object.assign({},t),{[r]:void 0===i?[n.payload]:[...i,n.payload]});break;case e.TransportItemType.TRACE:t=Object.assign(Object.assign({},t),{traces:z(t.traces,n.payload.resourceSpans)})}})),t},e.globalObject=L,e.initializeFaro=function(e){const n=D(e),t=$(n,e);if(Y()&&!e.isolate)return void t.error('Faro is already registered. Either add instrumentations, transports etc. to the global faro instance or use the "isolate" property');t.debug("Initializing");const r=function(e,n){let t=[],r=[];const i=()=>t.reduce(((e,n)=>Object.assign(e,l(n)?n():n)),{}),a=()=>{if(r.length){const e=i();r.forEach((n=>n(e)))}};return{add:(...e)=>{n.debug("Adding metas\n",e),t.push(...e),a()},remove:(...e)=>{n.debug("Removing metas\n",e),t=t.filter((n=>!e.includes(n))),a()},addListener:e=>{n.debug("Adding metas listener\n",e),r.push(e)},removeListener:e=>{n.debug("Removing metas listener\n",e),r=r.filter((n=>n!==e))},get value(){return i()}}}(0,t),i=C(n,t,e,r),a=X(0,t,e,r,i),s=function(e,n,t,r,i,a){n.debug("Initializing instrumentations");const s=[];return{add:(...o)=>{n.debug("Adding instrumentations"),o.forEach((o=>{n.debug(`Adding "${o.name}" instrumentation`),s.some((e=>e.name===o.name))?n.warn(`Instrumentation ${o.name} is already added`):(o.unpatchedConsole=e,o.internalLogger=n,o.config=t,o.metas=r,o.transports=i,o.api=a,s.push(o),o.initialize())}))},get instrumentations(){return[...s]},remove:(...e)=>{n.debug("Removing instrumentations"),e.forEach((e=>{var t,r;n.debug(`Removing "${e.name}" instrumentation`);const i=s.reduce(((n,t,r)=>null===n&&t.name===e.name?r:null),null);i?(null===(r=(t=s[i]).destroy)||void 0===r||r.call(t),s.splice(i,1)):n.warn(`Instrumentation "${e.name}" is not added`)}))}}}(n,t,e,r,i,a),o=Z(n,t,e,r,i,a,s);return function(e){var n,t;const r={sdk:{version:J},app:{bundleId:e.config.app.name&&(i=e.config.app.name,null==L?void 0:L[`__faroBundleId_${i}`])}};var i;const a=null===(n=e.config.sessionTracking)||void 0===n?void 0:n.session;a&&e.api.setSession(a),e.config.app&&(r.app=Object.assign(Object.assign({},e.config.app),r.app)),e.config.user&&(r.user=e.config.user),e.config.view&&(r.view=e.config.view),e.metas.add(r,...null!==(t=e.config.metas)&&void 0!==t?t:[])}(o),function(e){e.transports.add(...e.config.transports),e.transports.addBeforeSendHooks(e.config.beforeSend),e.transports.addIgnoreErrorsPatterns(e.config.ignoreErrors)}(o),function(e){e.instrumentations.add(...e.config.instrumentations)}(o),o},e.internalGlobalObjectKey=q,e.isArray=u,e.isBoolean=e=>n(e,"boolean"),e.isDomError=e=>t(e,"DOMError"),e.isDomException=e=>t(e,"DOMException"),e.isElement=e=>p&&r(e,Element),e.isElementDefined=p,e.isEmpty=m,e.isError=g,e.isErrorDefined=d,e.isErrorEvent=e=>t(e,"ErrorEvent"),e.isEvent=e=>c&&r(e,Event),e.isEventDefined=c,e.isFunction=l,e.isInstanceOf=r,e.isInt=e=>s(e)&&Number.isInteger(e),e.isInternalFaroOnGlobalObject=Y,e.isMap=e=>f&&r(e,Map),e.isMapDefined=f,e.isNull=i,e.isNumber=s,e.isObject=o,e.isPrimitive=e=>!o(e)&&!l(e),e.isRegExp=e=>t(e,"RegExp"),e.isString=a,e.isSymbol=e=>n(e,"symbol"),e.isSyntheticEvent=e=>o(e)&&"nativeEvent"in e&&"preventDefault"in e&&"stopPropagation"in e,e.isThenable=e=>l(null==e?void 0:e.then),e.isToString=t,e.isTypeof=n,e.isUndefined=e=>n(e,"undefined"),e.noop=T,e.setInternalFaroOnGlobalObject=Q,e.stringifyExternalJson=N,e.stringifyObjectValues=j,e.transportItemTypeToBodyKey=A,e.unknownString="unknown",e}({});
1
+ var GrafanaFaroCore=function(e){"use strict";function t(e,t){return typeof e===t}function n(e,t){return Object.prototype.toString.call(e)===`[object ${t}]`}function r(e,t){try{return e instanceof t}catch(e){return!1}}const s=e=>t(e,"null"),i=e=>t(e,"string"),a=e=>t(e,"number")&&!isNaN(e)||t(e,"bigint"),o=e=>!s(e)&&t(e,"object"),u=e=>t(e,"function"),l=e=>n(e,"Array"),c="undefined"!=typeof Event,g="undefined"!=typeof Error,d=e=>g&&r(e,Error),p="undefined"!=typeof Element,f="undefined"!=typeof Map;function b(e){return null==e||(l(e)||i(e)?0===e.length:!!o(e)&&0===Object.keys(e).length)}function m(e,n){if(e===n)return!0;if(t(e,"number")&&isNaN(e))return t(n,"number")&&isNaN(n);const r=l(e),s=l(n);if(r!==s)return!1;if(r&&s){const t=e.length;if(t!==n.length)return!1;for(let r=t;0!=r--;)if(!m(e[r],n[r]))return!1;return!0}const i=o(e),a=o(n);if(i!==a)return!1;if(e&&n&&i&&a){const t=Object.keys(e),r=Object.keys(n);if(t.length!==r.length)return!1;for(let e of t)if(!r.includes(e))return!1;for(let r of t)if(!m(e[r],n[r]))return!1;return!0}return!1}function v(){return(new Date).toISOString()}function h(e){return new Date(e).toISOString()}var E;e.LogLevel=void 0,(E=e.LogLevel||(e.LogLevel={})).TRACE="trace",E.DEBUG="debug",E.INFO="info",E.LOG="log",E.WARN="warn",E.ERROR="error";const y=e.LogLevel.LOG,I=[e.LogLevel.TRACE,e.LogLevel.DEBUG,e.LogLevel.INFO,e.LogLevel.LOG,e.LogLevel.WARN,e.LogLevel.ERROR];function T(){}const O="abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789";const L="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof self?self:void 0;function S(){const e=new WeakSet;return function(t,n){if(o(n)&&null!==n){if(e.has(n))return null;e.add(n)}return n}}function A(e={}){return JSON.stringify(null!=e?e:{},S())}function N(e={}){const t={};for(const[n,r]of Object.entries(e))t[n]=o(r)&&null!==r?A(r):String(r);return t}class j{constructor(){this.subscribers=[]}subscribe(e){return this.subscribers.push(e),{unsubscribe:()=>this.unsubscribe(e)}}notify(e){this.subscribers.forEach((t=>t(e)))}first(e){const t=this.subscribe((n=>{e(n),t.unsubscribe()}));return t}takeWhile(e){const t=new j,n=this.subscribe((r=>{e(r)?t.notify(r):n.unsubscribe()}));return t}unsubscribeAll(){this.subscribers=[]}unsubscribe(e){this.subscribers=this.subscribers.filter((t=>t!==e))}}class R{constructor(e,t){var n,r;this.signalBuffer=[],this.itemLimit=null!==(n=null==t?void 0:t.itemLimit)&&void 0!==n?n:50,this.sendTimeout=null!==(r=null==t?void 0:t.sendTimeout)&&void 0!==r?r:250,this.paused=(null==t?void 0:t.paused)||!1,this.sendFn=e,this.flushInterval=-1,this.paused||this.start(),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState&&this.flush()}))}addItem(e){this.paused||(this.signalBuffer.push(e),this.signalBuffer.length>=this.itemLimit&&this.flush())}start(){this.paused=!1,this.sendTimeout>0&&(this.flushInterval=window.setInterval((()=>this.flush()),this.sendTimeout))}pause(){this.paused=!0,clearInterval(this.flushInterval)}groupItems(e){const t=new Map;return e.forEach((e=>{const n=JSON.stringify(e.meta);let r=t.get(n);r=void 0===r?[e]:[...r,e],t.set(n,r)})),Array.from(t.values())}flush(){if(this.paused||0===this.signalBuffer.length)return;this.groupItems(this.signalBuffer).forEach(this.sendFn),this.signalBuffer=[]}}function x(e,t,n,r){var s;t.debug("Initializing transports");const i=[];let a=n.paused,o=[];const u=e=>{let t=e;for(const e of o){const n=t.map(e).filter(Boolean);if(0===n.length)return[];t=n}return t},l=e=>{const n=u(e);if(0!==n.length)for(const e of i)t.debug(`Transporting item using ${e.name}\n`,n),e.isBatched()&&e.send(n)};let c;(null===(s=n.batching)||void 0===s?void 0:s.enabled)&&(c=new R(l,{sendTimeout:n.batching.sendTimeout,itemLimit:n.batching.itemLimit,paused:a}));return{add:(...s)=>{t.debug("Adding transports"),s.forEach((s=>{t.debug(`Adding "${s.name}" transport`);i.some((e=>e===s))?t.warn(`Transport ${s.name} is already added`):(s.unpatchedConsole=e,s.internalLogger=t,s.config=n,s.metas=r,i.push(s))}))},addBeforeSendHooks:(...e)=>{t.debug("Adding beforeSendHooks\n",o),e.forEach((e=>{e&&o.push(e)}))},getBeforeSendHooks:()=>[...o],execute:e=>{var r;a||((null===(r=n.batching)||void 0===r?void 0:r.enabled)&&(null==c||c.addItem(e)),(e=>{var r,s;if((null===(r=n.batching)||void 0===r?void 0:r.enabled)&&i.every((e=>e.isBatched())))return;const[a]=u([e]);if(void 0!==a)for(const e of i)t.debug(`Transporting item using ${e.name}\n`,a),e.isBatched()?(null===(s=n.batching)||void 0===s?void 0:s.enabled)||e.send([a]):e.send(a)})(e))},isPaused:()=>a,pause:()=>{t.debug("Pausing transports"),null==c||c.pause(),a=!0},remove:(...e)=>{t.debug("Removing transports"),e.forEach((e=>{t.debug(`Removing "${e.name}" transport`);const n=i.indexOf(e);-1!==n?i.splice(n,1):t.warn(`Transport "${e.name}" is not added`)}))},removeBeforeSendHooks:(...e)=>{o.filter((t=>!e.includes(t)))},get transports(){return[...i]},unpause:()=>{t.debug("Unpausing transports"),null==c||c.start(),a=!1}}}var _;e.InternalLoggerLevel=void 0,(_=e.InternalLoggerLevel||(e.InternalLoggerLevel={}))[_.OFF=0]="OFF",_[_.ERROR=1]="ERROR",_[_.WARN=2]="WARN",_[_.INFO=3]="INFO",_[_.VERBOSE=4]="VERBOSE";const w={debug:T,error:T,info:T,prefix:"Faro",warn:T},C=e.InternalLoggerLevel.ERROR,k=Object.assign({},console);let B=k;function M(e){var t;return B=null!==(t=e.unpatchedConsole)&&void 0!==t?t:B,B}function P(t=k,n=C){const r=w;return n>e.InternalLoggerLevel.OFF&&(r.error=n>=e.InternalLoggerLevel.ERROR?function(...e){t.error(`${r.prefix}\n`,...e)}:T,r.warn=n>=e.InternalLoggerLevel.WARN?function(...e){t.warn(`${r.prefix}\n`,...e)}:T,r.info=n>=e.InternalLoggerLevel.INFO?function(...e){t.info(`${r.prefix}\n`,...e)}:T,r.debug=n>=e.InternalLoggerLevel.VERBOSE?function(...e){t.debug(`${r.prefix}\n`,...e)}:T),r}let D=w;function F(e,t){return D=P(e,t.internalLoggerLevel),D}class G{constructor(){this.unpatchedConsole=k,this.internalLogger=w,this.config={},this.metas={}}logDebug(...e){this.internalLogger.debug(`${this.name}\n`,...e)}logInfo(...e){this.internalLogger.info(`${this.name}\n`,...e)}logWarn(...e){this.internalLogger.warn(`${this.name}\n`,...e)}logError(...e){this.internalLogger.error(`${this.name}\n`,...e)}}var V;e.TransportItemType=void 0,(V=e.TransportItemType||(e.TransportItemType={})).EXCEPTION="exception",V.LOG="log",V.MEASUREMENT="measurement",V.TRACE="trace",V.EVENT="event";const $={[e.TransportItemType.EXCEPTION]:"exceptions",[e.TransportItemType.LOG]:"logs",[e.TransportItemType.MEASUREMENT]:"measurements",[e.TransportItemType.TRACE]:"traces",[e.TransportItemType.EVENT]:"events"};function z(e,t){var n,r;if(void 0===t)return e;if(void 0===e)return{resourceSpans:t};const s=null===(n=e.resourceSpans)||void 0===n?void 0:n[0];if(void 0===s)return e;const i=(null==s?void 0:s.scopeSpans)||[],a=(null===(r=null==t?void 0:t[0])||void 0===r?void 0:r.scopeSpans)||[];return Object.assign(Object.assign({},e),{resourceSpans:[Object.assign(Object.assign({},s),{scopeSpans:[...i,...a]})]})}const U="user-action-start",W="user-action-end",K="user-action-cancel";const H="Error";let X;function J({internalLogger:t,config:n,metas:r,transports:a,tracesApi:u,actionBuffer:c,getMessage:g}){var p;t.debug("Initializing exceptions API");let f=null;X=null!==(p=n.parseStacktrace)&&void 0!==p?p:X;const E=e=>{t.debug("Changing stacktrace parser"),X=null!=e?e:X},{ignoreErrors:y=[]}=n;return E(n.parseStacktrace),{changeStacktraceParser:E,getStacktraceParser:()=>X,pushError:(p,{skipDedupe:E,stackFrames:I,type:T,context:O,spanContext:L,timestampOverwriteMs:S}={})=>{if(!function(e,t){const{message:n,name:r,stack:s}=t;return a=e,o=n+" "+r+" "+s,a.some((e=>i(e)?o.includes(e):!!o.match(e)));var a,o}(y,p))try{const i=N(Object.assign(Object.assign({},function(e){let t=e.cause;d(t)?t=e.cause.toString():null!==t&&(o(e.cause)||l(e.cause))?t=A(e.cause):null!=t&&(t=e.cause.toString());return null==t?{}:{cause:t}}(p)),null!=O?O:{})),y={meta:r.value,payload:{type:T||p.name||H,value:p.message,timestamp:S?h(S):v(),trace:L?{trace_id:L.traceId,span_id:L.spanId}:u.getTraceContext(),context:b(i)?void 0:i},type:e.TransportItemType.EXCEPTION};(null==(I=null!=I?I:p.stack?null==X?void 0:X(p).frames:void 0)?void 0:I.length)&&(y.payload.stacktrace={frames:I});const j={type:y.payload.type,value:y.payload.value,stackTrace:y.payload.stacktrace,context:y.payload.context};if(!E&&n.dedupe&&!s(f)&&m(j,f))return void t.debug("Skipping error push because it is the same as the last one\n",y.payload);f=j,t.debug("Pushing exception\n",y);const R=g();R&&R.type===U?c.addItem(y):a.execute(y)}catch(e){t.error("Error pushing event",e)}}}}const Y=e=>e.map((e=>{try{return String(e)}catch(e){return""}})).join(" ");class q{constructor(){this.buffer=[]}addItem(e){this.buffer.push(e)}flushBuffer(e){if(u(e))for(const t of this.buffer)e(t);this.buffer.length=0}size(){return this.buffer.length}}function Q({apiMessageBus:t,transports:n,config:r}){const s=new q,i=r.trackUserActionsExcludeItem;let a;t.subscribe((t=>{if(t.type!==U){if(t.type===W){const{id:r,name:o}=t;return s.flushBuffer((t=>{if(function(t,n){return(null==n?void 0:n(t))||t.type===e.TransportItemType.MEASUREMENT&&"web-vitals"===t.payload.type}(t,i))return void n.execute(t);const s=Object.assign(Object.assign({},t),{payload:Object.assign(Object.assign({},t.payload),{action:{parentId:r,name:o}})});n.execute(s)})),void(a=void 0)}t.type===K&&(a=void 0,s.flushBuffer((e=>{n.execute(e)})))}else a=t}));return{actionBuffer:s,getMessage:()=>a}}const Z=new j;function ee(t,n,r,a,o){n.debug("Initializing API");const{actionBuffer:u,getMessage:l}=Q({apiMessageBus:Z,transports:o,config:r}),c=function(t,n,r,s,i){let a;return n.debug("Initializing traces API"),{getOTEL:()=>a,getTraceContext:()=>{const e=null==a?void 0:a.trace.getSpanContext(a.context.active());return e?{trace_id:e.traceId,span_id:e.spanId}:void 0},initOTEL:(e,t)=>{n.debug("Initializing OpenTelemetry"),a={trace:e,context:t}},isOTELInitialized:()=>!!a,pushTraces:t=>{try{const r={type:e.TransportItemType.TRACE,payload:t,meta:s.value};n.debug("Pushing trace\n",r),i.execute(r)}catch(e){n.error("Error pushing trace\n",e)}}}}(0,n,0,a,o),g={unpatchedConsole:t,internalLogger:n,config:r,metas:a,transports:o,tracesApi:c,actionBuffer:u,getMessage:l};return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},c),J(g)),function({internalLogger:e,metas:t}){let n,r,s,a;e.debug("Initializing meta API");const o=e=>{r&&t.remove(r),r={user:e},t.add(r)},u=(e,r)=>{var s;const i=null==r?void 0:r.overrides,a=i?{overrides:Object.assign(Object.assign({},null===(s=null==n?void 0:n.session)||void 0===s?void 0:s.overrides),i)}:{};n&&t.remove(n),n={session:Object.assign(Object.assign({},b(e)?void 0:e),a)},t.add(n)},l=()=>t.value.session,c=()=>t.value.page;return{setUser:o,resetUser:o,setSession:u,resetSession:u,getSession:l,setView:(e,n)=>{var r;if((null==n?void 0:n.overrides)&&u(l(),{overrides:n.overrides}),(null===(r=null==s?void 0:s.view)||void 0===r?void 0:r.name)===(null==e?void 0:e.name))return;const i=s;s={view:e},t.add(s),i&&t.remove(i)},getView:()=>t.value.view,setPage:e=>{var n;const r=i(e)?Object.assign(Object.assign({},null!==(n=null==a?void 0:a.page)&&void 0!==n?n:c()),{id:e}):e;a&&t.remove(a),a={page:r},t.add(a)},getPage:c}}(g)),function({internalLogger:t,config:n,metas:r,transports:i,tracesApi:a,actionBuffer:o,getMessage:u}){var l;t.debug("Initializing logs API");let c=null;const g=null!==(l=n.logArgsSerializer)&&void 0!==l?l:Y;return{pushLog:(l,{context:d,level:p,skipDedupe:f,spanContext:E,timestampOverwriteMs:I}={})=>{try{const T=N(d),O={type:e.TransportItemType.LOG,payload:{message:g(l),level:null!=p?p:y,context:b(T)?void 0:T,timestamp:I?h(I):v(),trace:E?{trace_id:E.traceId,span_id:E.spanId}:a.getTraceContext()},meta:r.value},L={message:O.payload.message,level:O.payload.level,context:O.payload.context};if(!f&&n.dedupe&&!s(c)&&m(L,c))return void t.debug("Skipping log push because it is the same as the last one\n",O.payload);c=L,t.debug("Pushing log\n",O);const S=u();S&&S.type===U?o.addItem(O):i.execute(O)}catch(e){t.error("Error pushing log\n",e)}}}}(g)),function({internalLogger:t,config:n,metas:r,transports:i,tracesApi:a,actionBuffer:o,getMessage:u}){t.debug("Initializing measurements API");let l=null;return{pushMeasurement:(c,{skipDedupe:g,context:d,spanContext:p,timestampOverwriteMs:f}={})=>{try{const E=N(d),y={type:e.TransportItemType.MEASUREMENT,payload:Object.assign(Object.assign({},c),{trace:p?{trace_id:p.traceId,span_id:p.spanId}:a.getTraceContext(),timestamp:f?h(f):v(),context:b(E)?void 0:E}),meta:r.value},I={type:y.payload.type,values:y.payload.values,context:y.payload.context};if(!g&&n.dedupe&&!s(l)&&m(I,l))return void t.debug("Skipping measurement push because it is the same as the last one\n",y.payload);l=I,t.debug("Pushing measurement\n",y);const T=u();T&&T.type===U?o.addItem(y):i.execute(y)}catch(e){t.error("Error pushing measurement\n",e)}}}}(g)),function({internalLogger:t,config:n,metas:r,transports:i,tracesApi:a,actionBuffer:o,getMessage:u}){let l=null;return{pushEvent:(c,g,d,{skipDedupe:p,spanContext:f,timestampOverwriteMs:E,customPayloadTransformer:y=e=>e}={})=>{try{const I=N(g),T={meta:r.value,payload:y({name:c,domain:null!=d?d:n.eventDomain,attributes:b(I)?void 0:I,timestamp:E?h(E):v(),trace:f?{trace_id:f.traceId,span_id:f.spanId}:a.getTraceContext()}),type:e.TransportItemType.EVENT},O={name:T.payload.name,attributes:T.payload.attributes,domain:T.payload.domain};if(!p&&n.dedupe&&!s(l)&&m(O,l))return void t.debug("Skipping event push because it is the same as the last one\n",T.payload);l=O,t.debug("Pushing event\n",T);const L=u();L&&L.type===U?o.addItem(T):i.execute(T)}catch(e){t.error("Error pushing event",e)}}}}(g))}const te="1.14.2";const ne="_faroInternal";function re(e){e.config.isolate?e.internalLogger.debug("Skipping registering internal Faro instance on global object"):(e.internalLogger.debug("Registering internal Faro instance on global object"),Object.defineProperty(L,ne,{configurable:!1,enumerable:!1,writable:!1,value:e}))}function se(){return ne in L}function ie(t,n,r,s,i,a,o){return n.debug("Initializing Faro"),e.faro={api:a,config:r,instrumentations:o,internalLogger:n,metas:s,pause:i.pause,transports:i,unpatchedConsole:t,unpause:i.unpause},re(e.faro),function(e){if(e.config.preventGlobalExposure)e.internalLogger.debug("Skipping registering public Faro instance in the global scope");else{if(e.internalLogger.debug(`Registering public faro reference in the global scope using "${e.config.globalObjectKey}" key`),e.config.globalObjectKey in L)return void e.internalLogger.warn(`Skipping global registration due to key "${e.config.globalObjectKey}" being used already. Please set "globalObjectKey" to something else or set "preventGlobalExposure" to "true"`);Object.defineProperty(L,e.config.globalObjectKey,{configurable:!1,writable:!1,value:e})}}(e.faro),e.faro}e.faro={};return e.BaseExtension=G,e.BaseInstrumentation=class extends G{constructor(){super(...arguments),this.api={},this.transports={}}},e.BaseTransport=class extends G{isBatched(){return!1}getIgnoreUrls(){return[]}},e.Conventions={EventNames:{CLICK:"click",NAVIGATION:"navigation",SESSION_START:"session_start",VIEW_CHANGED:"view_changed"}},e.EVENT_CLICK="click",e.EVENT_NAVIGATION="navigation",e.EVENT_OVERRIDES_SERVICE_NAME="service_name_override",e.EVENT_ROUTE_CHANGE="route_change",e.EVENT_SESSION_EXTEND="session_extend",e.EVENT_SESSION_RESUME="session_resume",e.EVENT_SESSION_START="session_start",e.EVENT_VIEW_CHANGED="view_changed",e.Observable=j,e.USER_ACTION_CANCEL_MESSAGE_TYPE=K,e.USER_ACTION_END_MESSAGE_TYPE=W,e.USER_ACTION_START_MESSAGE_TYPE=U,e.VERSION=te,e.allLogLevels=I,e.apiMessageBus=Z,e.createInternalLogger=P,e.createPromiseBuffer=function(e){const{size:t,concurrency:n}=e,r=[];let s=0;const i=()=>{if(s<n&&r.length){const{producer:e,resolve:t,reject:n}=r.shift();s++,e().then((e=>{s--,i(),t(e)}),(e=>{s--,i(),n(e)}))}};return{add:e=>{if(r.length+s>=t)throw new Error("Task buffer full");return new Promise(((t,n)=>{r.push({producer:e,resolve:t,reject:n}),i()}))}}},e.dateNow=function(){return Date.now()},e.deepEqual=m,e.defaultBatchingConfig={enabled:!0,sendTimeout:250,itemLimit:50},e.defaultErrorArgsSerializer=e=>e.map((e=>o(e)?A(e):String(e))).join(" "),e.defaultExceptionType=H,e.defaultGlobalObjectKey="faro",e.defaultInternalLoggerLevel=C,e.defaultLogArgsSerializer=Y,e.defaultLogLevel=y,e.defaultUnpatchedConsole=k,e.genShortID=function(e=10){return Array.from(Array(e)).map((()=>O[Math.floor(59*Math.random())])).join("")},e.getCircularDependencyReplacer=S,e.getCurrentTimestamp=v,e.getInternalFaroFromGlobalObject=function(){return L[ne]},e.getTransportBody=function(t){let n={meta:{}};return void 0!==t[0]&&(n.meta=t[0].meta),t.forEach((t=>{switch(t.type){case e.TransportItemType.LOG:case e.TransportItemType.EVENT:case e.TransportItemType.EXCEPTION:case e.TransportItemType.MEASUREMENT:const r=$[t.type],s=n[r];n=Object.assign(Object.assign({},n),{[r]:void 0===s?[t.payload]:[...s,t.payload]});break;case e.TransportItemType.TRACE:n=Object.assign(Object.assign({},n),{traces:z(n.traces,t.payload.resourceSpans)})}})),n},e.globalObject=L,e.initializeFaro=function(e){const t=M(e),n=F(t,e);if(se()&&!e.isolate)return void n.error('Faro is already registered. Either add instrumentations, transports etc. to the global faro instance or use the "isolate" property');n.debug("Initializing");const r=function(e,t){let n=[],r=[];const s=()=>n.reduce(((e,t)=>Object.assign(e,u(t)?t():t)),{}),i=()=>{if(r.length){const e=s();r.forEach((t=>t(e)))}};return{add:(...e)=>{t.debug("Adding metas\n",e),n.push(...e),i()},remove:(...e)=>{t.debug("Removing metas\n",e),n=n.filter((t=>!e.includes(t))),i()},addListener:e=>{t.debug("Adding metas listener\n",e),r.push(e)},removeListener:e=>{t.debug("Removing metas listener\n",e),r=r.filter((t=>t!==e))},get value(){return s()}}}(0,n),s=x(t,n,e,r),i=ee(t,n,e,r,s),a=function(e,t,n,r,s,i){t.debug("Initializing instrumentations");const a=[];return{add:(...o)=>{t.debug("Adding instrumentations"),o.forEach((o=>{t.debug(`Adding "${o.name}" instrumentation`),a.some((e=>e.name===o.name))?t.warn(`Instrumentation ${o.name} is already added`):(o.unpatchedConsole=e,o.internalLogger=t,o.config=n,o.metas=r,o.transports=s,o.api=i,a.push(o),o.initialize())}))},get instrumentations(){return[...a]},remove:(...e)=>{t.debug("Removing instrumentations"),e.forEach((e=>{var n,r;t.debug(`Removing "${e.name}" instrumentation`);const s=a.reduce(((t,n,r)=>null===t&&n.name===e.name?r:null),null);s?(null===(r=(n=a[s]).destroy)||void 0===r||r.call(n),a.splice(s,1)):t.warn(`Instrumentation "${e.name}" is not added`)}))}}}(t,n,e,r,s,i),o=ie(t,n,e,r,s,i,a);return function(e){var t,n;const r={sdk:{version:te},app:{bundleId:e.config.app.name&&(s=e.config.app.name,null==L?void 0:L[`__faroBundleId_${s}`])}};var s;const i=null===(t=e.config.sessionTracking)||void 0===t?void 0:t.session;i&&e.api.setSession(i),e.config.app&&(r.app=Object.assign(Object.assign({},e.config.app),r.app)),e.config.user&&(r.user=e.config.user),e.config.view&&(r.view=e.config.view),e.metas.add(r,...null!==(n=e.config.metas)&&void 0!==n?n:[])}(o),function(e){e.transports.add(...e.config.transports),e.transports.addBeforeSendHooks(e.config.beforeSend)}(o),function(e){e.instrumentations.add(...e.config.instrumentations)}(o),o},e.internalGlobalObjectKey=ne,e.isArray=l,e.isBoolean=e=>t(e,"boolean"),e.isDomError=e=>n(e,"DOMError"),e.isDomException=e=>n(e,"DOMException"),e.isElement=e=>p&&r(e,Element),e.isElementDefined=p,e.isEmpty=b,e.isError=d,e.isErrorDefined=g,e.isErrorEvent=e=>n(e,"ErrorEvent"),e.isEvent=e=>c&&r(e,Event),e.isEventDefined=c,e.isFunction=u,e.isInstanceOf=r,e.isInt=e=>a(e)&&Number.isInteger(e),e.isInternalFaroOnGlobalObject=se,e.isMap=e=>f&&r(e,Map),e.isMapDefined=f,e.isNull=s,e.isNumber=a,e.isObject=o,e.isPrimitive=e=>!o(e)&&!u(e),e.isRegExp=e=>n(e,"RegExp"),e.isString=i,e.isSymbol=e=>t(e,"symbol"),e.isSyntheticEvent=e=>o(e)&&"nativeEvent"in e&&"preventDefault"in e&&"stopPropagation"in e,e.isThenable=e=>u(null==e?void 0:e.then),e.isToString=n,e.isTypeof=t,e.isUndefined=e=>t(e,"undefined"),e.merge=function(...e){const t=new j;return e.forEach((e=>{e.subscribe((e=>{t.notify(e)}))})),{subscribe:t.subscribe.bind(t),takeWhile:t.takeWhile.bind(t),first:t.first.bind(t),notify:t.notify.bind(t),unsubscribeAll:()=>{e.forEach((e=>{e.unsubscribeAll()}))}}},e.noop=T,e.setInternalFaroOnGlobalObject=re,e.stringifyExternalJson=A,e.stringifyObjectValues=N,e.transportItemTypeToBodyKey=$,e.unknownString="unknown",e}({});
@@ -0,0 +1,7 @@
1
+ export declare class ItemBuffer<T> {
2
+ private buffer;
3
+ constructor();
4
+ addItem(item: T): void;
5
+ flushBuffer(cb?: (item: T) => void): void;
6
+ size(): number;
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { Transports } from '../transports';
2
+ import type { TracesAPI } from './traces/types';
3
+ export declare const mockMetas: {
4
+ add: jest.Mock<any, any, any>;
5
+ remove: jest.Mock<any, any, any>;
6
+ addListener: jest.Mock<any, any, any>;
7
+ removeListener: jest.Mock<any, any, any>;
8
+ value: {};
9
+ };
10
+ export declare const mockTransports: Transports;
11
+ export declare const mockTracesApi: TracesAPI;
@@ -0,0 +1,3 @@
1
+ export declare const USER_ACTION_START_MESSAGE_TYPE = "user-action-start";
2
+ export declare const USER_ACTION_END_MESSAGE_TYPE = "user-action-end";
3
+ export declare const USER_ACTION_CANCEL_MESSAGE_TYPE = "user-action-cancel";
@@ -1,8 +1,19 @@
1
1
  import type { Config } from '../../config';
2
2
  import type { InternalLogger } from '../../internalLogger';
3
3
  import type { Metas } from '../../metas';
4
- import { Transports } from '../../transports';
4
+ import type { TransportItem, Transports } from '../../transports';
5
5
  import type { UnpatchedConsole } from '../../unpatchedConsole';
6
+ import type { ItemBuffer } from '../ItemBuffer';
6
7
  import type { TracesAPI } from '../traces';
8
+ import type { ApiMessageBusMessages } from '../types';
7
9
  import type { EventsAPI } from './types';
8
- export declare function initializeEventsAPI(_unpatchedConsole: UnpatchedConsole, internalLogger: InternalLogger, config: Config, metas: Metas, transports: Transports, tracesApi: TracesAPI): EventsAPI;
10
+ export declare function initializeEventsAPI({ internalLogger, config, metas, transports, tracesApi, actionBuffer, getMessage, }: {
11
+ unpatchedConsole: UnpatchedConsole;
12
+ internalLogger: InternalLogger;
13
+ config: Config;
14
+ metas: Metas;
15
+ transports: Transports;
16
+ tracesApi: TracesAPI;
17
+ actionBuffer: ItemBuffer<TransportItem>;
18
+ getMessage: () => ApiMessageBusMessages | undefined;
19
+ }): EventsAPI;
@@ -1,5 +1,6 @@
1
1
  import type { SpanContext } from '@opentelemetry/api';
2
2
  import type { TraceContext } from '../traces';
3
+ import type { UserAction } from '../types';
3
4
  export type EventAttributes = Record<string, string>;
4
5
  export interface EventEvent {
5
6
  name: string;
@@ -7,11 +8,21 @@ export interface EventEvent {
7
8
  domain?: string;
8
9
  attributes?: EventAttributes;
9
10
  trace?: TraceContext;
11
+ action?: UserAction;
10
12
  }
11
13
  export interface PushEventOptions {
12
14
  skipDedupe?: boolean;
13
15
  spanContext?: Pick<SpanContext, 'traceId' | 'spanId'>;
14
16
  timestampOverwriteMs?: number;
17
+ /**
18
+ * Allows manual transformation of the payload before adding it to the internal buffer.
19
+ *
20
+ * @param payload - The event payload to be transformed.
21
+ * @returns The transformed event payload.
22
+ *
23
+ * @remarks This should be used sparingly and only in special cases where custom payload processing cannot be deferred to the before-send hook.
24
+ */
25
+ customPayloadTransformer?: (payload: EventEvent) => EventEvent;
15
26
  }
16
27
  export interface EventsAPI {
17
28
  pushEvent: (name: string, attributes?: EventAttributes, domain?: string, options?: PushEventOptions) => void;
@@ -1,8 +1,19 @@
1
1
  import type { Config } from '../../config';
2
2
  import type { InternalLogger } from '../../internalLogger';
3
3
  import type { Metas } from '../../metas';
4
- import type { Transports } from '../../transports';
4
+ import type { TransportItem, Transports } from '../../transports';
5
5
  import type { UnpatchedConsole } from '../../unpatchedConsole';
6
+ import type { ItemBuffer } from '../ItemBuffer';
6
7
  import type { TracesAPI } from '../traces';
8
+ import type { ApiMessageBusMessages } from '../types';
7
9
  import type { ExceptionsAPI } from './types';
8
- export declare function initializeExceptionsAPI(_unpatchedConsole: UnpatchedConsole, internalLogger: InternalLogger, config: Config, metas: Metas, transports: Transports, tracesApi: TracesAPI): ExceptionsAPI;
10
+ export declare function initializeExceptionsAPI({ internalLogger, config, metas, transports, tracesApi, actionBuffer, getMessage, }: {
11
+ unpatchedConsole: UnpatchedConsole;
12
+ internalLogger: InternalLogger;
13
+ config: Config;
14
+ metas: Metas;
15
+ transports: Transports;
16
+ tracesApi: TracesAPI;
17
+ actionBuffer: ItemBuffer<TransportItem>;
18
+ getMessage: () => ApiMessageBusMessages | undefined;
19
+ }): ExceptionsAPI;
@@ -1,5 +1,6 @@
1
1
  import type { SpanContext } from '@opentelemetry/api';
2
2
  import type { TraceContext } from '../traces';
3
+ import type { UserAction } from '../types';
3
4
  export type StacktraceParser = (err: ExtendedError) => Stacktrace;
4
5
  export interface ExceptionStackFrame {
5
6
  filename: string;
@@ -23,6 +24,7 @@ export interface ExceptionEvent {
23
24
  stacktrace?: Stacktrace;
24
25
  trace?: TraceContext;
25
26
  context?: ExceptionContext;
27
+ action?: UserAction;
26
28
  }
27
29
  export interface PushErrorOptions {
28
30
  skipDedupe?: boolean;
@@ -1,5 +1,5 @@
1
1
  export { initializeAPI } from './initialize';
2
- export type { API, APIEvent } from './types';
2
+ export type { API, APIEvent, ApiMessageBusMessages, UserActionCancelMessage, UserActionEndMessage, UserActionStartMessage, UserAction, } from './types';
3
3
  export type { EventAttributes, EventEvent, EventsAPI, PushEventOptions } from './events';
4
4
  export { defaultExceptionType, defaultErrorArgsSerializer } from './exceptions';
5
5
  export type { ExceptionEvent, ExceptionStackFrame, ExceptionsAPI, ExtendedError, PushErrorOptions, Stacktrace, StacktraceParser, } from './exceptions';
@@ -8,3 +8,5 @@ export type { LogContext, LogEvent, LogArgsSerializer, LogsAPI, PushLogOptions }
8
8
  export type { MeasurementEvent, MeasurementsAPI, PushMeasurementOptions } from './measurements';
9
9
  export type { MetaAPI } from './meta';
10
10
  export type { OTELApi, TraceContext, TraceEvent, TracesAPI } from './traces';
11
+ export { apiMessageBus } from './initialize';
12
+ export { USER_ACTION_CANCEL_MESSAGE_TYPE, USER_ACTION_END_MESSAGE_TYPE, USER_ACTION_START_MESSAGE_TYPE } from './const';
@@ -3,5 +3,7 @@ import type { InternalLogger } from '../internalLogger';
3
3
  import type { Metas } from '../metas';
4
4
  import type { Transports } from '../transports';
5
5
  import type { UnpatchedConsole } from '../unpatchedConsole';
6
- import type { API } from './types';
6
+ import { Observable } from '../utils';
7
+ import type { API, ApiMessageBusMessages } from './types';
8
+ export declare const apiMessageBus: Observable<ApiMessageBusMessages>;
7
9
  export declare function initializeAPI(unpatchedConsole: UnpatchedConsole, internalLogger: InternalLogger, config: Config, metas: Metas, transports: Transports): API;
@@ -1,8 +1,19 @@
1
1
  import type { Config } from '../../config';
2
2
  import type { InternalLogger } from '../../internalLogger';
3
3
  import type { Metas } from '../../metas';
4
- import type { Transports } from '../../transports';
4
+ import { TransportItem, Transports } from '../../transports';
5
5
  import type { UnpatchedConsole } from '../../unpatchedConsole';
6
+ import type { ItemBuffer } from '../ItemBuffer';
6
7
  import type { TracesAPI } from '../traces';
8
+ import type { ApiMessageBusMessages } from '../types';
7
9
  import type { LogsAPI } from './types';
8
- export declare function initializeLogsAPI(_unpatchedConsole: UnpatchedConsole, internalLogger: InternalLogger, config: Config, metas: Metas, transports: Transports, tracesApi: TracesAPI): LogsAPI;
10
+ export declare function initializeLogsAPI({ internalLogger, config, metas, transports, tracesApi, actionBuffer, getMessage, }: {
11
+ unpatchedConsole: UnpatchedConsole;
12
+ internalLogger: InternalLogger;
13
+ config: Config;
14
+ metas: Metas;
15
+ transports: Transports;
16
+ tracesApi: TracesAPI;
17
+ actionBuffer: ItemBuffer<TransportItem>;
18
+ getMessage: () => ApiMessageBusMessages | undefined;
19
+ }): LogsAPI;
@@ -1,13 +1,15 @@
1
1
  import type { SpanContext } from '@opentelemetry/api';
2
2
  import type { LogLevel } from '../../utils';
3
3
  import type { TraceContext } from '../traces';
4
+ import type { UserAction } from '../types';
4
5
  export type LogContext = Record<string, string>;
5
6
  export interface LogEvent {
6
- context: LogContext;
7
+ context: LogContext | undefined;
7
8
  level: LogLevel;
8
9
  message: string;
9
10
  timestamp: string;
10
11
  trace?: TraceContext;
12
+ action?: UserAction;
11
13
  }
12
14
  export interface PushLogOptions {
13
15
  context?: LogContext;
@@ -1,8 +1,20 @@
1
1
  import type { Config } from '../../config';
2
2
  import type { InternalLogger } from '../../internalLogger';
3
3
  import type { Metas } from '../../metas';
4
+ import { TransportItem } from '../../transports';
4
5
  import type { Transports } from '../../transports';
5
6
  import type { UnpatchedConsole } from '../../unpatchedConsole';
7
+ import type { ItemBuffer } from '../ItemBuffer';
6
8
  import type { TracesAPI } from '../traces';
9
+ import type { ApiMessageBusMessages } from '../types';
7
10
  import type { MeasurementsAPI } from './types';
8
- export declare function initializeMeasurementsAPI(_unpatchedConsole: UnpatchedConsole, internalLogger: InternalLogger, config: Config, metas: Metas, transports: Transports, tracesApi: TracesAPI): MeasurementsAPI;
11
+ export declare function initializeMeasurementsAPI({ internalLogger, config, metas, transports, tracesApi, actionBuffer, getMessage, }: {
12
+ unpatchedConsole: UnpatchedConsole;
13
+ internalLogger: InternalLogger;
14
+ config: Config;
15
+ metas: Metas;
16
+ transports: Transports;
17
+ tracesApi: TracesAPI;
18
+ actionBuffer: ItemBuffer<TransportItem>;
19
+ getMessage: () => ApiMessageBusMessages | undefined;
20
+ }): MeasurementsAPI;
@@ -1,5 +1,6 @@
1
1
  import type { SpanContext } from '@opentelemetry/api';
2
2
  import type { TraceContext } from '../traces';
3
+ import type { UserAction } from '../types';
3
4
  export type MeasurementContext = Record<string, string>;
4
5
  export interface MeasurementEvent<V extends {
5
6
  [label: string]: number;
@@ -11,6 +12,7 @@ export interface MeasurementEvent<V extends {
11
12
  timestamp: string;
12
13
  trace?: TraceContext;
13
14
  context?: MeasurementContext;
15
+ action?: UserAction;
14
16
  }
15
17
  export interface PushMeasurementOptions {
16
18
  skipDedupe?: boolean;
@@ -1,7 +1,19 @@
1
1
  import type { Config } from '../../config';
2
2
  import type { InternalLogger } from '../../internalLogger';
3
3
  import type { Metas } from '../../metas';
4
- import type { Transports } from '../../transports';
4
+ import type { TransportItem, Transports } from '../../transports';
5
5
  import type { UnpatchedConsole } from '../../unpatchedConsole';
6
+ import type { ItemBuffer } from '../ItemBuffer';
7
+ import type { TracesAPI } from '../traces';
8
+ import type { ApiMessageBusMessages } from '../types';
6
9
  import type { MetaAPI } from './types';
7
- export declare function initializeMetaAPI(_unpatchedConsole: UnpatchedConsole, internalLogger: InternalLogger, _config: Config, metas: Metas, _transports: Transports): MetaAPI;
10
+ export declare function initializeMetaAPI({ internalLogger, metas, }: {
11
+ unpatchedConsole: UnpatchedConsole;
12
+ internalLogger: InternalLogger;
13
+ config: Config;
14
+ metas: Metas;
15
+ transports: Transports;
16
+ tracesApi: TracesAPI;
17
+ actionBuffer: ItemBuffer<TransportItem>;
18
+ getMessage: () => ApiMessageBusMessages | undefined;
19
+ }): MetaAPI;
@@ -1,3 +1,4 @@
1
+ import type { USER_ACTION_CANCEL_MESSAGE_TYPE, USER_ACTION_END_MESSAGE_TYPE, USER_ACTION_START_MESSAGE_TYPE } from './const';
1
2
  import type { EventEvent, EventsAPI } from './events';
2
3
  import type { ExceptionEvent, ExceptionsAPI } from './exceptions';
3
4
  import type { LogEvent, LogsAPI } from './logs';
@@ -6,3 +7,39 @@ import type { MetaAPI } from './meta';
6
7
  import type { TraceEvent, TracesAPI } from './traces';
7
8
  export type APIEvent = LogEvent | ExceptionEvent | MeasurementEvent | TraceEvent | EventEvent;
8
9
  export type API = LogsAPI & ExceptionsAPI & MeasurementsAPI & TracesAPI & MetaAPI & EventsAPI;
10
+ export type ApiMessageBusMessages = UserActionStartMessage | UserActionEndMessage | UserActionCancelMessage;
11
+ export type UserActionMessageType = typeof USER_ACTION_START_MESSAGE_TYPE | typeof USER_ACTION_END_MESSAGE_TYPE | typeof USER_ACTION_CANCEL_MESSAGE_TYPE;
12
+ export type UserActionStartMessage = {
13
+ type: typeof USER_ACTION_START_MESSAGE_TYPE;
14
+ name: string;
15
+ startTime: number;
16
+ /**
17
+ * Unique identifier of the parent user action to which this action belongs.
18
+ */
19
+ parentId: string;
20
+ };
21
+ export type UserActionEndMessage = {
22
+ type: typeof USER_ACTION_END_MESSAGE_TYPE;
23
+ name: string;
24
+ startTime: number;
25
+ endTime: number;
26
+ duration: number;
27
+ eventType: string;
28
+ /**
29
+ * Unique identifier for the user action. Will be undefined for messages related to child actions.
30
+ */
31
+ id: string;
32
+ };
33
+ export type UserActionCancelMessage = {
34
+ type: typeof USER_ACTION_CANCEL_MESSAGE_TYPE;
35
+ name: string;
36
+ /**
37
+ * Unique identifier of the parent user action to which this action belongs.
38
+ */
39
+ parentId?: string;
40
+ };
41
+ export type UserAction = {
42
+ name: string;
43
+ id?: string;
44
+ parentId?: string;
45
+ };
@@ -0,0 +1,13 @@
1
+ import type { Config } from '../config';
2
+ import { type TransportItem, type Transports } from '../transports';
3
+ import type { Observable } from '../utils';
4
+ import { ItemBuffer } from './ItemBuffer';
5
+ import type { APIEvent, ApiMessageBusMessages } from './types';
6
+ export declare function createUserActionLifecycleHandler({ apiMessageBus, transports, config, }: {
7
+ apiMessageBus: Observable<ApiMessageBusMessages>;
8
+ transports: Transports;
9
+ config: Config;
10
+ }): {
11
+ actionBuffer: ItemBuffer<TransportItem<APIEvent>>;
12
+ getMessage: () => ApiMessageBusMessages | undefined;
13
+ };
@@ -0,0 +1,2 @@
1
+ import type { Patterns } from '../config/types';
2
+ export declare function shouldIgnoreEvent(patterns: Patterns, msg: string): boolean;
@@ -2,7 +2,7 @@ import type { APIEvent, LogArgsSerializer, StacktraceParser } from '../api';
2
2
  import type { Instrumentation } from '../instrumentations';
3
3
  import type { InternalLoggerLevel } from '../internalLogger';
4
4
  import type { Meta, MetaApp, MetaItem, MetaPage, MetaSession, MetaUser, MetaView } from '../metas';
5
- import type { BatchExecutorOptions, BeforeSendHook, Transport } from '../transports';
5
+ import type { BatchExecutorOptions, BeforeSendHook, Transport, TransportItem } from '../transports';
6
6
  import type { UnpatchedConsole } from '../unpatchedConsole';
7
7
  import type { LogLevel } from '../utils';
8
8
  type SamplingContext = {
@@ -192,18 +192,27 @@ export interface Config<P = APIEvent> {
192
192
  generatePageId?: (location: Location) => string;
193
193
  };
194
194
  /**
195
- * Configuration for the location tracking (Grafana cloud only)
195
+ * Enable or disable geolocation tracking.
196
+ * Geolocation tracking must be enabled in the Grafana Cloud settings first.
197
+ * It cannot be enabled solely on the client side.
198
+ * This option allows control over tracking on the client side to comply with user
199
+ * privacy requirements.
196
200
  */
197
- geoLocationTracking?: {
198
- /**
199
- * Enable or disable geolocation tracking.
200
- * Geolocation tracking must be enabled in the Grafana Cloud settings first.
201
- * It cannot be enabled solely on the client side.
202
- * This option allows control over tracking on the client side to comply with user
203
- * privacy requirements.
204
- */
205
- enabled?: boolean;
206
- };
201
+ trackGeolocation?: boolean;
202
+ /**
203
+ * This is a preview feature.
204
+ * We have tested it thoroughly, but it is possible that it might not work as expected in all cases.
205
+ */
206
+ trackUserActionsPreview?: boolean;
207
+ /**
208
+ * Configure your own attribute name for tracking user actions. Default is 'data-faro-user-action-name'
209
+ */
210
+ trackUserActionsDataAttributeName?: string;
211
+ /**
212
+ * Predicate function to exclude items from user actions.
213
+ * If the function returns true, the item will be excluded from user actions.
214
+ */
215
+ trackUserActionsExcludeItem?: (item: TransportItem<APIEvent>) => boolean;
207
216
  }
208
217
  export type Patterns = Array<string | RegExp>;
209
218
  export {};
@@ -1,5 +1,5 @@
1
- export { defaultExceptionType, defaultLogArgsSerializer, defaultErrorArgsSerializer } from './api';
2
- export type { API, APIEvent, EventAttributes, EventEvent, EventsAPI, ExceptionEvent, ExceptionStackFrame, ExceptionsAPI, ExtendedError, LogArgsSerializer, LogContext, LogEvent, LogsAPI, MeasurementEvent, MeasurementsAPI, MetaAPI, OTELApi, PushErrorOptions, PushEventOptions, PushLogOptions, PushMeasurementOptions, Stacktrace, StacktraceParser, TraceContext, TraceEvent, TracesAPI, } from './api';
1
+ export { defaultExceptionType, defaultLogArgsSerializer, defaultErrorArgsSerializer, apiMessageBus, USER_ACTION_CANCEL_MESSAGE_TYPE, USER_ACTION_END_MESSAGE_TYPE, USER_ACTION_START_MESSAGE_TYPE, } from './api';
2
+ export type { API, APIEvent, EventAttributes, EventEvent, EventsAPI, ExceptionEvent, ExceptionStackFrame, ExceptionsAPI, ExtendedError, LogArgsSerializer, LogContext, LogEvent, LogsAPI, MeasurementEvent, MeasurementsAPI, MetaAPI, OTELApi, PushErrorOptions, PushEventOptions, PushLogOptions, PushMeasurementOptions, Stacktrace, StacktraceParser, TraceContext, TraceEvent, TracesAPI, ApiMessageBusMessages, UserActionStartMessage, UserActionEndMessage, UserActionCancelMessage, UserAction, } from './api';
3
3
  export { BaseExtension } from './extensions';
4
4
  export type { Extension } from './extensions';
5
5
  export { globalObject } from './globalObject';
@@ -19,7 +19,7 @@ export { BaseTransport, getTransportBody, TransportItemType, transportItemTypeTo
19
19
  export type { BeforeSendHook, SendFn, Transport, TransportBody, TransportItem, TransportItemPayload, Transports, } from './transports';
20
20
  export { defaultUnpatchedConsole } from './unpatchedConsole';
21
21
  export type { UnpatchedConsole } from './unpatchedConsole';
22
- export { allLogLevels, createPromiseBuffer, deepEqual, defaultLogLevel, genShortID, getCurrentTimestamp, isArray, isBoolean, isDomError, isDomException, isElement, isElementDefined, isError, isErrorDefined, isErrorEvent, isEvent, isEventDefined, isFunction, isInstanceOf, isInt, isMap, isMapDefined, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isSymbol, isSyntheticEvent, isThenable, isToString, isTypeof, isUndefined, LogLevel, noop, dateNow, isEmpty, getCircularDependencyReplacer, stringifyExternalJson, stringifyObjectValues, } from './utils';
23
- export type { BaseObject, BaseObjectKey, BaseObjectPrimitiveValue, BaseObjectValue, BufferItem, PromiseBuffer, PromiseBufferOptions, PromiseProducer, } from './utils';
22
+ export { allLogLevels, createPromiseBuffer, deepEqual, defaultLogLevel, genShortID, getCurrentTimestamp, isArray, isBoolean, isDomError, isDomException, isElement, isElementDefined, isError, isErrorDefined, isErrorEvent, isEvent, isEventDefined, isFunction, isInstanceOf, isInt, isMap, isMapDefined, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isSymbol, isSyntheticEvent, isThenable, isToString, isTypeof, isUndefined, LogLevel, noop, dateNow, isEmpty, getCircularDependencyReplacer, stringifyExternalJson, stringifyObjectValues, Observable, merge, } from './utils';
23
+ export type { BaseObject, BaseObjectKey, BaseObjectPrimitiveValue, BaseObjectValue, BufferItem, PromiseBuffer, PromiseBufferOptions, PromiseProducer, Subscription, } from './utils';
24
24
  export { VERSION } from './version';
25
25
  export { unknownString } from './consts';
@@ -4,7 +4,7 @@ import type { Transport, TransportItem } from '../transports';
4
4
  export declare class MockTransport extends BaseTransport implements Transport {
5
5
  private ignoreURLs;
6
6
  readonly name = "@grafana/transport-mock";
7
- readonly version = "1.14.0";
7
+ readonly version = "1.14.2";
8
8
  items: TransportItem[];
9
9
  constructor(ignoreURLs?: Patterns);
10
10
  send(items: TransportItem[]): void | Promise<void>;
@@ -1,8 +1,6 @@
1
- import type { Config, Patterns } from '../config';
1
+ import type { Config } from '../config';
2
2
  import type { InternalLogger } from '../internalLogger';
3
3
  import type { Metas } from '../metas';
4
4
  import type { UnpatchedConsole } from '../unpatchedConsole';
5
- import type { BeforeSendHook, Transports } from './types';
6
- export declare function shouldIgnoreEvent(patterns: Patterns, msg: string): boolean;
7
- export declare function createBeforeSendHookFromIgnorePatterns(patterns: Patterns): BeforeSendHook;
5
+ import type { Transports } from './types';
8
6
  export declare function initializeTransports(unpatchedConsole: UnpatchedConsole, internalLogger: InternalLogger, config: Config, metas: Metas): Transports;
@@ -28,7 +28,6 @@ export interface TransportBody {
28
28
  export interface Transports {
29
29
  add: (...transports: Transport[]) => void;
30
30
  addBeforeSendHooks: (...hooks: Array<BeforeSendHook | undefined>) => void;
31
- addIgnoreErrorsPatterns: (...ignoreErrorsPatterns: Array<Patterns | undefined>) => void;
32
31
  execute: (transportItem: TransportItem) => void;
33
32
  getBeforeSendHooks: () => BeforeSendHook[];
34
33
  isPaused: () => boolean;
@@ -11,3 +11,5 @@ export { genShortID } from './shortId';
11
11
  export { getBundleId } from './sourceMaps';
12
12
  export { dateNow } from './date';
13
13
  export { getCircularDependencyReplacer, stringifyExternalJson, stringifyObjectValues } from './json';
14
+ export { Observable, merge } from './reactive';
15
+ export type { Subscription } from './reactive';
@@ -0,0 +1,46 @@
1
+ export interface Subscription {
2
+ unsubscribe: () => void;
3
+ }
4
+ export declare class Observable<T = any> {
5
+ private subscribers;
6
+ constructor();
7
+ /**
8
+ * Subscribes a callback function to the observable.
9
+ * @param callback - The function to call when the observable emits a value.
10
+ * @returns A subscription object with an unsubscribe method to cancel the subscription.
11
+ */
12
+ subscribe(callback: (data: T) => void): Subscription;
13
+ /**
14
+ * Notifies all subscribers with the given data.
15
+ * @param data - The data to emit to all subscribers.
16
+ */
17
+ notify(data: T): void;
18
+ /**
19
+ * Subscribes a callback function to the observable and automatically unsubscribes after the first emission.
20
+ * @param callback - The function to call when the observable emits a value.
21
+ * @returns A subscription object with an unsubscribe method to cancel the subscription.
22
+ */
23
+ first(callback: (data: T) => void): Subscription;
24
+ /**
25
+ * Emits values from the source observable until the provided predicate function returns false.
26
+ * @param predicate - A function that evaluates each value emitted by the source observable.
27
+ * @returns A new observable that emits values from the source observable while the predicate returns true.
28
+ */
29
+ takeWhile(predicate: (value: T) => boolean): Observable<T>;
30
+ /**
31
+ * Unsubscribes all subscribers by clearing the subscribers array.
32
+ *
33
+ * @remarks
34
+ * This method sets the `subscribers` array to an empty array, effectively removing all current subscribers.
35
+ */
36
+ unsubscribeAll(): void;
37
+ private unsubscribe;
38
+ }
39
+ /**
40
+ * Merges multiple observables into a single observable.
41
+ *
42
+ * @template T - The type of the values emitted by the observables.
43
+ * @param {...Observable[]} observables - The observables to merge.
44
+ * @returns {Observable} A new observable that emits values from all input observables.
45
+ */
46
+ export declare function merge<T>(...observables: Array<Observable<T>>): Observable<T>;
@@ -1 +1 @@
1
- export declare const VERSION = "1.14.0";
1
+ export declare const VERSION = "1.14.2";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ItemBuffer = void 0;
4
+ var is_1 = require("../utils/is");
5
+ var ItemBuffer = /** @class */ (function () {
6
+ function ItemBuffer() {
7
+ this.buffer = [];
8
+ }
9
+ ItemBuffer.prototype.addItem = function (item) {
10
+ this.buffer.push(item);
11
+ };
12
+ ItemBuffer.prototype.flushBuffer = function (cb) {
13
+ if ((0, is_1.isFunction)(cb)) {
14
+ for (var _i = 0, _a = this.buffer; _i < _a.length; _i++) {
15
+ var item = _a[_i];
16
+ cb(item);
17
+ }
18
+ }
19
+ this.buffer.length = 0;
20
+ };
21
+ ItemBuffer.prototype.size = function () {
22
+ return this.buffer.length;
23
+ };
24
+ return ItemBuffer;
25
+ }());
26
+ exports.ItemBuffer = ItemBuffer;
27
+ //# sourceMappingURL=ItemBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemBuffer.js","sourceRoot":"","sources":["../../../src/api/ItemBuffer.ts"],"names":[],"mappings":";;;AAAA,kCAAyC;AAEzC;IAGE;QACE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,4BAAO,GAAP,UAAQ,IAAO;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,gCAAW,GAAX,UAAY,EAAsB;QAChC,IAAI,IAAA,eAAU,EAAC,EAAE,CAAC,EAAE;YAClB,KAAmB,UAAW,EAAX,KAAA,IAAI,CAAC,MAAM,EAAX,cAAW,EAAX,IAAW,EAAE;gBAA3B,IAAM,IAAI,SAAA;gBACb,EAAE,CAAC,IAAI,CAAC,CAAC;aACV;SACF;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,yBAAI,GAAJ;QACE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IACH,iBAAC;AAAD,CAAC,AAxBD,IAwBC;AAxBY,gCAAU","sourcesContent":["import { isFunction } from '../utils/is';\n\nexport class ItemBuffer<T> {\n private buffer: T[];\n\n constructor() {\n this.buffer = [];\n }\n\n addItem(item: T) {\n this.buffer.push(item);\n }\n\n flushBuffer(cb?: (item: T) => void) {\n if (isFunction(cb)) {\n for (const item of this.buffer) {\n cb(item);\n }\n }\n\n this.buffer.length = 0;\n }\n\n size() {\n return this.buffer.length;\n }\n}\n"]}