@grafana/faro-core 1.14.1 → 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 (198) 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/config/types.d.ts +21 -12
  19. package/dist/bundle/types/index.d.ts +4 -4
  20. package/dist/bundle/types/testUtils/mockTransport.d.ts +1 -1
  21. package/dist/bundle/types/utils/index.d.ts +2 -0
  22. package/dist/bundle/types/utils/reactive.d.ts +46 -0
  23. package/dist/bundle/types/version.d.ts +1 -1
  24. package/dist/cjs/api/ItemBuffer.js +27 -0
  25. package/dist/cjs/api/ItemBuffer.js.map +1 -0
  26. package/dist/cjs/api/apiTestHelpers.js +36 -0
  27. package/dist/cjs/api/apiTestHelpers.js.map +1 -0
  28. package/dist/cjs/api/const.js +7 -0
  29. package/dist/cjs/api/const.js.map +1 -0
  30. package/dist/cjs/api/events/initialize.js +15 -6
  31. package/dist/cjs/api/events/initialize.js.map +1 -1
  32. package/dist/cjs/api/events/types.js.map +1 -1
  33. package/dist/cjs/api/exceptions/initialize.js +51 -37
  34. package/dist/cjs/api/exceptions/initialize.js.map +1 -1
  35. package/dist/cjs/api/exceptions/types.js.map +1 -1
  36. package/dist/cjs/api/index.js +7 -1
  37. package/dist/cjs/api/index.js.map +1 -1
  38. package/dist/cjs/api/initialize.js +16 -2
  39. package/dist/cjs/api/initialize.js.map +1 -1
  40. package/dist/cjs/api/logs/initialize.js +15 -6
  41. package/dist/cjs/api/logs/initialize.js.map +1 -1
  42. package/dist/cjs/api/logs/types.js.map +1 -1
  43. package/dist/cjs/api/measurements/initialize.js +12 -3
  44. package/dist/cjs/api/measurements/initialize.js.map +1 -1
  45. package/dist/cjs/api/measurements/types.js.map +1 -1
  46. package/dist/cjs/api/meta/initialize.js +2 -1
  47. package/dist/cjs/api/meta/initialize.js.map +1 -1
  48. package/dist/cjs/api/types.js.map +1 -1
  49. package/dist/cjs/api/userActionLifecycleHandler.js +59 -0
  50. package/dist/cjs/api/userActionLifecycleHandler.js.map +1 -0
  51. package/dist/cjs/config/types.js.map +1 -1
  52. package/dist/cjs/index.js +8 -2
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/cjs/utils/index.js +4 -1
  55. package/dist/cjs/utils/index.js.map +1 -1
  56. package/dist/cjs/utils/reactive.js +104 -0
  57. package/dist/cjs/utils/reactive.js.map +1 -0
  58. package/dist/cjs/version.js +1 -1
  59. package/dist/cjs/version.js.map +1 -1
  60. package/dist/esm/api/ItemBuffer.js +21 -0
  61. package/dist/esm/api/ItemBuffer.js.map +1 -0
  62. package/dist/esm/api/apiTestHelpers.js +33 -0
  63. package/dist/esm/api/apiTestHelpers.js.map +1 -0
  64. package/dist/esm/api/const.js +4 -0
  65. package/dist/esm/api/const.js.map +1 -0
  66. package/dist/esm/api/events/initialize.js +15 -7
  67. package/dist/esm/api/events/initialize.js.map +1 -1
  68. package/dist/esm/api/events/types.js.map +1 -1
  69. package/dist/esm/api/exceptions/initialize.js +47 -34
  70. package/dist/esm/api/exceptions/initialize.js.map +1 -1
  71. package/dist/esm/api/exceptions/types.js.map +1 -1
  72. package/dist/esm/api/index.js +2 -0
  73. package/dist/esm/api/index.js.map +1 -1
  74. package/dist/esm/api/initialize.js +15 -1
  75. package/dist/esm/api/initialize.js.map +1 -1
  76. package/dist/esm/api/logs/initialize.js +12 -4
  77. package/dist/esm/api/logs/initialize.js.map +1 -1
  78. package/dist/esm/api/logs/types.js.map +1 -1
  79. package/dist/esm/api/measurements/initialize.js +12 -4
  80. package/dist/esm/api/measurements/initialize.js.map +1 -1
  81. package/dist/esm/api/measurements/types.js.map +1 -1
  82. package/dist/esm/api/meta/initialize.js +1 -1
  83. package/dist/esm/api/meta/initialize.js.map +1 -1
  84. package/dist/esm/api/types.js.map +1 -1
  85. package/dist/esm/api/userActionLifecycleHandler.js +43 -0
  86. package/dist/esm/api/userActionLifecycleHandler.js.map +1 -0
  87. package/dist/esm/config/types.js.map +1 -1
  88. package/dist/esm/index.js +2 -2
  89. package/dist/esm/index.js.map +1 -1
  90. package/dist/esm/utils/index.js +1 -0
  91. package/dist/esm/utils/index.js.map +1 -1
  92. package/dist/esm/utils/reactive.js +93 -0
  93. package/dist/esm/utils/reactive.js.map +1 -0
  94. package/dist/esm/version.js +1 -1
  95. package/dist/esm/version.js.map +1 -1
  96. package/dist/spec/core/src/api/ItemBuffer.js +27 -0
  97. package/dist/spec/core/src/api/ItemBuffer.js.map +1 -0
  98. package/dist/spec/core/src/api/apiTestHelpers.js +36 -0
  99. package/dist/spec/core/src/api/apiTestHelpers.js.map +1 -0
  100. package/dist/spec/core/src/api/const.js +7 -0
  101. package/dist/spec/core/src/api/const.js.map +1 -0
  102. package/dist/spec/core/src/api/events/initialize.js +15 -6
  103. package/dist/spec/core/src/api/events/initialize.js.map +1 -1
  104. package/dist/spec/core/src/api/events/initialize.test.js +57 -0
  105. package/dist/spec/core/src/api/events/initialize.test.js.map +1 -1
  106. package/dist/spec/core/src/api/events/types.js.map +1 -1
  107. package/dist/spec/core/src/api/exceptions/initialize.js +51 -37
  108. package/dist/spec/core/src/api/exceptions/initialize.js.map +1 -1
  109. package/dist/spec/core/src/api/exceptions/initialize.test.js +62 -3
  110. package/dist/spec/core/src/api/exceptions/initialize.test.js.map +1 -1
  111. package/dist/spec/core/src/api/exceptions/types.js.map +1 -1
  112. package/dist/spec/core/src/api/index.js +7 -1
  113. package/dist/spec/core/src/api/index.js.map +1 -1
  114. package/dist/spec/core/src/api/initialize.js +16 -2
  115. package/dist/spec/core/src/api/initialize.js.map +1 -1
  116. package/dist/spec/core/src/api/initialize.test.js +73 -0
  117. package/dist/spec/core/src/api/initialize.test.js.map +1 -0
  118. package/dist/spec/core/src/api/itemBuffer.test.js +36 -0
  119. package/dist/spec/core/src/api/itemBuffer.test.js.map +1 -0
  120. package/dist/spec/core/src/api/logs/initialize.js +15 -6
  121. package/dist/spec/core/src/api/logs/initialize.js.map +1 -1
  122. package/dist/spec/core/src/api/logs/initialize.test.js +98 -0
  123. package/dist/spec/core/src/api/logs/initialize.test.js.map +1 -1
  124. package/dist/spec/core/src/api/logs/types.js.map +1 -1
  125. package/dist/spec/core/src/api/measurements/initialize.js +12 -3
  126. package/dist/spec/core/src/api/measurements/initialize.js.map +1 -1
  127. package/dist/spec/core/src/api/measurements/initialize.test.js +105 -0
  128. package/dist/spec/core/src/api/measurements/initialize.test.js.map +1 -1
  129. package/dist/spec/core/src/api/measurements/types.js.map +1 -1
  130. package/dist/spec/core/src/api/meta/initialize.js +2 -1
  131. package/dist/spec/core/src/api/meta/initialize.js.map +1 -1
  132. package/dist/spec/core/src/api/meta/initilialize.test.js +1 -3
  133. package/dist/spec/core/src/api/meta/initilialize.test.js.map +1 -1
  134. package/dist/spec/core/src/api/types.js.map +1 -1
  135. package/dist/spec/core/src/api/userActionLifecycleHandler.js +59 -0
  136. package/dist/spec/core/src/api/userActionLifecycleHandler.js.map +1 -0
  137. package/dist/spec/core/src/api/userActionLifecycleHandler.test.js +152 -0
  138. package/dist/spec/core/src/api/userActionLifecycleHandler.test.js.map +1 -0
  139. package/dist/spec/core/src/config/types.js.map +1 -1
  140. package/dist/spec/core/src/index.js +8 -2
  141. package/dist/spec/core/src/index.js.map +1 -1
  142. package/dist/spec/core/src/utils/index.js +4 -1
  143. package/dist/spec/core/src/utils/index.js.map +1 -1
  144. package/dist/spec/core/src/utils/reactive.js +104 -0
  145. package/dist/spec/core/src/utils/reactive.js.map +1 -0
  146. package/dist/spec/core/src/utils/reactive.test.js +104 -0
  147. package/dist/spec/core/src/utils/reactive.test.js.map +1 -0
  148. package/dist/spec/core/src/version.js +1 -1
  149. package/dist/spec/core/src/version.js.map +1 -1
  150. package/dist/types/api/ItemBuffer.d.ts +7 -0
  151. package/dist/types/api/apiTestHelpers.d.ts +11 -0
  152. package/dist/types/api/const.d.ts +3 -0
  153. package/dist/types/api/events/initialize.d.ts +13 -2
  154. package/dist/types/api/events/types.d.ts +11 -0
  155. package/dist/types/api/exceptions/initialize.d.ts +13 -2
  156. package/dist/types/api/exceptions/types.d.ts +2 -0
  157. package/dist/types/api/index.d.ts +3 -1
  158. package/dist/types/api/initialize.d.ts +3 -1
  159. package/dist/types/api/logs/initialize.d.ts +13 -2
  160. package/dist/types/api/logs/types.d.ts +3 -1
  161. package/dist/types/api/measurements/initialize.d.ts +13 -1
  162. package/dist/types/api/measurements/types.d.ts +2 -0
  163. package/dist/types/api/meta/initialize.d.ts +14 -2
  164. package/dist/types/api/types.d.ts +37 -0
  165. package/dist/types/api/userActionLifecycleHandler.d.ts +13 -0
  166. package/dist/types/config/types.d.ts +21 -12
  167. package/dist/types/core/src/api/ItemBuffer.d.ts +7 -0
  168. package/dist/types/core/src/api/apiTestHelpers.d.ts +11 -0
  169. package/dist/types/core/src/api/const.d.ts +3 -0
  170. package/dist/types/core/src/api/events/initialize.d.ts +13 -2
  171. package/dist/types/core/src/api/events/types.d.ts +11 -0
  172. package/dist/types/core/src/api/exceptions/initialize.d.ts +13 -2
  173. package/dist/types/core/src/api/exceptions/types.d.ts +2 -0
  174. package/dist/types/core/src/api/index.d.ts +3 -1
  175. package/dist/types/core/src/api/initialize.d.ts +3 -1
  176. package/dist/types/core/src/api/initialize.test.d.ts +1 -0
  177. package/dist/types/core/src/api/itemBuffer.test.d.ts +1 -0
  178. package/dist/types/core/src/api/logs/initialize.d.ts +13 -2
  179. package/dist/types/core/src/api/logs/types.d.ts +3 -1
  180. package/dist/types/core/src/api/measurements/initialize.d.ts +13 -1
  181. package/dist/types/core/src/api/measurements/types.d.ts +2 -0
  182. package/dist/types/core/src/api/meta/initialize.d.ts +14 -2
  183. package/dist/types/core/src/api/types.d.ts +37 -0
  184. package/dist/types/core/src/api/userActionLifecycleHandler.d.ts +13 -0
  185. package/dist/types/core/src/api/userActionLifecycleHandler.test.d.ts +1 -0
  186. package/dist/types/core/src/config/types.d.ts +21 -12
  187. package/dist/types/core/src/index.d.ts +4 -4
  188. package/dist/types/core/src/testUtils/mockTransport.d.ts +1 -1
  189. package/dist/types/core/src/utils/index.d.ts +2 -0
  190. package/dist/types/core/src/utils/reactive.d.ts +46 -0
  191. package/dist/types/core/src/utils/reactive.test.d.ts +1 -0
  192. package/dist/types/core/src/version.d.ts +1 -1
  193. package/dist/types/index.d.ts +4 -4
  194. package/dist/types/testUtils/mockTransport.d.ts +1 -1
  195. package/dist/types/utils/index.d.ts +2 -0
  196. package/dist/types/utils/reactive.d.ts +46 -0
  197. package/dist/types/version.d.ts +1 -1
  198. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.js","sourceRoot":"","sources":["../../../src/utils/reactive.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,UAAU;IAGrB;QACE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,QAA2B;QACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhC,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;SAC9C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAO;QACZ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAA2B;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,YAAY,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,SAAgC;QACxC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAK,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAQ,EAAE,EAAE;YAC/C,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE;gBACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACtB;iBAAM;gBACL,YAAY,CAAC,WAAW,EAAE,CAAC;aAC5B;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,cAAc;QACZ,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,QAA6B;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;IACxE,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAI,GAAG,WAAiC;IAC3D,MAAM,cAAc,GAAG,IAAI,UAAU,EAAK,CAAC;IAC3C,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,KAAQ,EAAE,EAAE;YACrD,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QACxD,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QACxD,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;QAChD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;QAClD,cAAc,EAAE,GAAG,EAAE;YACnB,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;gBACjC,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;KACe,CAAC;AACrB,CAAC","sourcesContent":["export interface Subscription {\n unsubscribe: () => void;\n}\n\nexport class Observable<T = any> {\n private subscribers: Array<(data: T) => void>;\n\n constructor() {\n this.subscribers = [];\n }\n\n /**\n * Subscribes a callback function to the observable.\n * @param callback - The function to call when the observable emits a value.\n * @returns A subscription object with an unsubscribe method to cancel the subscription.\n */\n subscribe(callback: (data: T) => void): Subscription {\n this.subscribers.push(callback);\n\n return {\n unsubscribe: () => this.unsubscribe(callback),\n };\n }\n\n /**\n * Notifies all subscribers with the given data.\n * @param data - The data to emit to all subscribers.\n */\n notify(data: T): void {\n this.subscribers.forEach((callback) => callback(data));\n }\n\n /**\n * Subscribes a callback function to the observable and automatically unsubscribes after the first emission.\n * @param callback - The function to call when the observable emits a value.\n * @returns A subscription object with an unsubscribe method to cancel the subscription.\n */\n first(callback: (data: T) => void): Subscription {\n const subscription = this.subscribe((data) => {\n callback(data);\n subscription.unsubscribe();\n });\n\n return subscription;\n }\n\n /**\n * Emits values from the source observable until the provided predicate function returns false.\n * @param predicate - A function that evaluates each value emitted by the source observable.\n * @returns A new observable that emits values from the source observable while the predicate returns true.\n */\n takeWhile(predicate: (value: T) => boolean): Observable<T> {\n const result = new Observable<T>();\n const subscription = this.subscribe((value: T) => {\n if (predicate(value)) {\n result.notify(value);\n } else {\n subscription.unsubscribe();\n }\n });\n\n return result;\n }\n\n /**\n * Unsubscribes all subscribers by clearing the subscribers array.\n *\n * @remarks\n * This method sets the `subscribers` array to an empty array, effectively removing all current subscribers.\n */\n unsubscribeAll(): void {\n this.subscribers = [];\n }\n\n private unsubscribe(callback: (data: any) => void): void {\n this.subscribers = this.subscribers.filter((sub) => sub !== callback);\n }\n}\n\n/**\n * Merges multiple observables into a single observable.\n *\n * @template T - The type of the values emitted by the observables.\n * @param {...Observable[]} observables - The observables to merge.\n * @returns {Observable} A new observable that emits values from all input observables.\n */\nexport function merge<T>(...observables: Array<Observable<T>>): Observable<T> {\n const mainObservable = new Observable<T>();\n const subscriptions: Subscription[] = [];\n\n observables.forEach((observable) => {\n const subscription = observable.subscribe((value: T) => {\n mainObservable.notify(value);\n });\n subscriptions.push(subscription);\n });\n\n return {\n subscribe: mainObservable.subscribe.bind(mainObservable),\n takeWhile: mainObservable.takeWhile.bind(mainObservable),\n first: mainObservable.first.bind(mainObservable),\n notify: mainObservable.notify.bind(mainObservable),\n unsubscribeAll: () => {\n observables.forEach((observable) => {\n observable.unsubscribeAll();\n });\n },\n } as Observable<T>;\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  // auto-generated by bin/genVersion.ts
2
- export const VERSION = '1.14.1';
2
+ export const VERSION = '1.14.2';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.14.1';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC","sourcesContent":["// auto-generated by bin/genVersion.ts\nexport const VERSION = '1.14.2';\n"]}
@@ -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"]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mockTracesApi = exports.mockTransports = exports.mockMetas = void 0;
4
+ exports.mockMetas = {
5
+ add: jest.fn(),
6
+ remove: jest.fn(),
7
+ addListener: jest.fn(),
8
+ removeListener: jest.fn(),
9
+ value: {},
10
+ };
11
+ exports.mockTransports = {
12
+ add: jest.fn(),
13
+ addBeforeSendHooks: jest.fn(),
14
+ execute: jest.fn(),
15
+ getBeforeSendHooks: jest.fn(),
16
+ remove: jest.fn(),
17
+ removeBeforeSendHooks: jest.fn(),
18
+ isPaused: function () {
19
+ throw new Error('Function not implemented.');
20
+ },
21
+ transports: [],
22
+ pause: function () {
23
+ throw new Error('Function not implemented.');
24
+ },
25
+ unpause: function () {
26
+ throw new Error('Function not implemented.');
27
+ },
28
+ };
29
+ exports.mockTracesApi = {
30
+ getOTEL: jest.fn(),
31
+ getTraceContext: jest.fn(),
32
+ initOTEL: jest.fn(),
33
+ isOTELInitialized: jest.fn(),
34
+ pushTraces: jest.fn(),
35
+ };
36
+ //# sourceMappingURL=apiTestHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiTestHelpers.js","sourceRoot":"","sources":["../../../../../src/api/apiTestHelpers.ts"],"names":[],"mappings":";;;AAIa,QAAA,SAAS,GAAG;IACvB,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;IACtB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;IACzB,KAAK,EAAE,EAAE;CACV,CAAC;AAEW,QAAA,cAAc,GAAe;IACxC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC7B,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;IAClB,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC7B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;IACjB,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE;IAChC,QAAQ,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,UAAU,EAAE,EAAE;IACd,KAAK,EAAE;QACL,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE;QACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC;AAEW,QAAA,aAAa,GAAc;IACtC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;IAClB,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;IAC1B,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;IACnB,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC5B,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;CACtB,CAAC","sourcesContent":["import type { Transports } from '../transports';\n\nimport type { TracesAPI } from './traces/types';\n\nexport const mockMetas = {\n add: jest.fn(),\n remove: jest.fn(),\n addListener: jest.fn(),\n removeListener: jest.fn(),\n value: {},\n};\n\nexport const mockTransports: Transports = {\n add: jest.fn(),\n addBeforeSendHooks: jest.fn(),\n execute: jest.fn(),\n getBeforeSendHooks: jest.fn(),\n remove: jest.fn(),\n removeBeforeSendHooks: jest.fn(),\n isPaused: function (): boolean {\n throw new Error('Function not implemented.');\n },\n transports: [],\n pause: function (): void {\n throw new Error('Function not implemented.');\n },\n unpause: function (): void {\n throw new Error('Function not implemented.');\n },\n};\n\nexport const mockTracesApi: TracesAPI = {\n getOTEL: jest.fn(),\n getTraceContext: jest.fn(),\n initOTEL: jest.fn(),\n isOTELInitialized: jest.fn(),\n pushTraces: jest.fn(),\n};\n"]}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.USER_ACTION_CANCEL_MESSAGE_TYPE = exports.USER_ACTION_END_MESSAGE_TYPE = exports.USER_ACTION_START_MESSAGE_TYPE = void 0;
4
+ exports.USER_ACTION_START_MESSAGE_TYPE = 'user-action-start';
5
+ exports.USER_ACTION_END_MESSAGE_TYPE = 'user-action-end';
6
+ exports.USER_ACTION_CANCEL_MESSAGE_TYPE = 'user-action-cancel';
7
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../src/api/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,8BAA8B,GAAG,mBAAmB,CAAC;AACrD,QAAA,4BAA4B,GAAG,iBAAiB,CAAC;AACjD,QAAA,+BAA+B,GAAG,oBAAoB,CAAC","sourcesContent":["export const USER_ACTION_START_MESSAGE_TYPE = 'user-action-start';\nexport const USER_ACTION_END_MESSAGE_TYPE = 'user-action-end';\nexport const USER_ACTION_CANCEL_MESSAGE_TYPE = 'user-action-cancel';\n"]}
@@ -4,17 +4,20 @@ exports.initializeEventsAPI = void 0;
4
4
  var transports_1 = require("../../transports");
5
5
  var utils_1 = require("../../utils");
6
6
  var date_1 = require("../../utils/date");
7
- function initializeEventsAPI(_unpatchedConsole, internalLogger, config, metas, transports, tracesApi) {
7
+ var const_1 = require("../const");
8
+ function initializeEventsAPI(_a) {
9
+ var internalLogger = _a.internalLogger, config = _a.config, metas = _a.metas, transports = _a.transports, tracesApi = _a.tracesApi, actionBuffer = _a.actionBuffer, getMessage = _a.getMessage;
8
10
  var lastPayload = null;
9
11
  var pushEvent = function (name, attributes, domain, _a) {
10
- var _b = _a === void 0 ? {} : _a, skipDedupe = _b.skipDedupe, spanContext = _b.spanContext, timestampOverwriteMs = _b.timestampOverwriteMs;
12
+ var _b = _a === void 0 ? {} : _a, skipDedupe = _b.skipDedupe, spanContext = _b.spanContext, timestampOverwriteMs = _b.timestampOverwriteMs, _c = _b.customPayloadTransformer, customPayloadTransformer = _c === void 0 ? function (payload) { return payload; } : _c;
11
13
  try {
14
+ var attrs = (0, utils_1.stringifyObjectValues)(attributes);
12
15
  var item = {
13
16
  meta: metas.value,
14
- payload: {
17
+ payload: customPayloadTransformer({
15
18
  name: name,
16
19
  domain: domain !== null && domain !== void 0 ? domain : config.eventDomain,
17
- attributes: (0, utils_1.stringifyObjectValues)(attributes),
20
+ attributes: (0, utils_1.isEmpty)(attrs) ? undefined : attrs,
18
21
  timestamp: timestampOverwriteMs ? (0, date_1.timestampToIsoString)(timestampOverwriteMs) : (0, utils_1.getCurrentTimestamp)(),
19
22
  trace: spanContext
20
23
  ? {
@@ -22,7 +25,7 @@ function initializeEventsAPI(_unpatchedConsole, internalLogger, config, metas, t
22
25
  span_id: spanContext.spanId,
23
26
  }
24
27
  : tracesApi.getTraceContext(),
25
- },
28
+ }),
26
29
  type: transports_1.TransportItemType.EVENT,
27
30
  };
28
31
  var testingPayload = {
@@ -36,7 +39,13 @@ function initializeEventsAPI(_unpatchedConsole, internalLogger, config, metas, t
36
39
  }
37
40
  lastPayload = testingPayload;
38
41
  internalLogger.debug('Pushing event\n', item);
39
- transports.execute(item);
42
+ var msg = getMessage();
43
+ if (msg && msg.type === const_1.USER_ACTION_START_MESSAGE_TYPE) {
44
+ actionBuffer.addItem(item);
45
+ }
46
+ else {
47
+ transports.execute(item);
48
+ }
40
49
  }
41
50
  catch (err) {
42
51
  internalLogger.error('Error pushing event', err);
@@ -1 +1 @@
1
- {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../../../../../src/api/events/initialize.ts"],"names":[],"mappings":";;;AAGA,+CAAgF;AAEhF,qCAA4F;AAC5F,yCAAwD;AAKxD,SAAgB,mBAAmB,CACjC,iBAAmC,EACnC,cAA8B,EAC9B,MAAc,EACd,KAAY,EACZ,UAAsB,EACtB,SAAoB;IAEpB,IAAI,WAAW,GAA8D,IAAI,CAAC;IAElF,IAAM,SAAS,GAA2B,UACxC,IAAI,EACJ,UAAU,EACV,MAAM,EACN,EAAsD;YAAtD,qBAAoD,EAAE,KAAA,EAApD,UAAU,gBAAA,EAAE,WAAW,iBAAA,EAAE,oBAAoB,0BAAA;QAE/C,IAAI;YACF,IAAM,IAAI,GAA8B;gBACtC,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,OAAO,EAAE;oBACP,IAAI,MAAA;oBACJ,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,MAAM,CAAC,WAAW;oBACpC,UAAU,EAAE,IAAA,6BAAqB,EAAC,UAAU,CAAC;oBAC7C,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAA,2BAAoB,EAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAmB,GAAE;oBACpG,KAAK,EAAE,WAAW;wBAChB,CAAC,CAAC;4BACE,QAAQ,EAAE,WAAW,CAAC,OAAO;4BAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;yBAC5B;wBACH,CAAC,CAAC,SAAS,CAAC,eAAe,EAAE;iBAChC;gBACD,IAAI,EAAE,8BAAiB,CAAC,KAAK;aAC9B,CAAC;YAEF,IAAM,cAAc,GAAG;gBACrB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACvB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;aAC5B,CAAC;YAEF,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAA,cAAM,EAAC,WAAW,CAAC,IAAI,IAAA,iBAAS,EAAC,cAAc,EAAE,WAAW,CAAC,EAAE;gBAClG,cAAc,CAAC,KAAK,CAAC,8DAA8D,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAEnG,OAAO;aACR;YAED,WAAW,GAAG,cAAc,CAAC;YAE7B,cAAc,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YAE9C,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC1B;QAAC,OAAO,GAAG,EAAE;YACZ,cAAc,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;SAClD;IACH,CAAC,CAAC;IAEF,OAAO;QACL,SAAS,WAAA;KACV,CAAC;AACJ,CAAC;AA3DD,kDA2DC","sourcesContent":["import type { Config } from '../../config';\nimport type { InternalLogger } from '../../internalLogger';\nimport type { Metas } from '../../metas';\nimport { TransportItem, TransportItemType, Transports } from '../../transports';\nimport type { UnpatchedConsole } from '../../unpatchedConsole';\nimport { deepEqual, getCurrentTimestamp, isNull, stringifyObjectValues } from '../../utils';\nimport { timestampToIsoString } from '../../utils/date';\nimport type { TracesAPI } from '../traces';\n\nimport type { EventEvent, EventsAPI } from './types';\n\nexport function initializeEventsAPI(\n _unpatchedConsole: UnpatchedConsole,\n internalLogger: InternalLogger,\n config: Config,\n metas: Metas,\n transports: Transports,\n tracesApi: TracesAPI\n): EventsAPI {\n let lastPayload: Pick<EventEvent, 'name' | 'domain' | 'attributes'> | null = null;\n\n const pushEvent: EventsAPI['pushEvent'] = (\n name,\n attributes,\n domain,\n { skipDedupe, spanContext, timestampOverwriteMs } = {}\n ) => {\n try {\n const item: TransportItem<EventEvent> = {\n meta: metas.value,\n payload: {\n name,\n domain: domain ?? config.eventDomain,\n attributes: stringifyObjectValues(attributes),\n timestamp: timestampOverwriteMs ? timestampToIsoString(timestampOverwriteMs) : getCurrentTimestamp(),\n trace: spanContext\n ? {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n }\n : tracesApi.getTraceContext(),\n },\n type: TransportItemType.EVENT,\n };\n\n const testingPayload = {\n name: item.payload.name,\n attributes: item.payload.attributes,\n domain: item.payload.domain,\n };\n\n if (!skipDedupe && config.dedupe && !isNull(lastPayload) && deepEqual(testingPayload, lastPayload)) {\n internalLogger.debug('Skipping event push because it is the same as the last one\\n', item.payload);\n\n return;\n }\n\n lastPayload = testingPayload;\n\n internalLogger.debug('Pushing event\\n', item);\n\n transports.execute(item);\n } catch (err) {\n internalLogger.error('Error pushing event', err);\n }\n };\n\n return {\n pushEvent,\n };\n}\n"]}
1
+ {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../../../../../src/api/events/initialize.ts"],"names":[],"mappings":";;;AAGA,+CAAqD;AAGrD,qCAAqG;AACrG,yCAAwD;AACxD,kCAA0D;AAO1D,SAAgB,mBAAmB,CAAC,EAiBnC;QAhBC,cAAc,oBAAA,EACd,MAAM,YAAA,EACN,KAAK,WAAA,EACL,UAAU,gBAAA,EACV,SAAS,eAAA,EACT,YAAY,kBAAA,EACZ,UAAU,gBAAA;IAWV,IAAI,WAAW,GAA8D,IAAI,CAAC;IAElF,IAAM,SAAS,GAA2B,UACxC,IAAI,EACJ,UAAU,EACV,MAAM,EACN,EAAmH;YAAnH,qBAAiH,EAAE,KAAA,EAAjH,UAAU,gBAAA,EAAE,WAAW,iBAAA,EAAE,oBAAoB,0BAAA,EAAE,gCAA2D,EAA3D,wBAAwB,mBAAG,UAAC,OAAmB,IAAK,OAAA,OAAO,EAAP,CAAO,KAAA;QAE5G,IAAI;YACF,IAAM,KAAK,GAAG,IAAA,6BAAqB,EAAC,UAAU,CAAC,CAAC;YAEhD,IAAM,IAAI,GAA8B;gBACtC,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,OAAO,EAAE,wBAAwB,CAAC;oBAChC,IAAI,MAAA;oBACJ,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,MAAM,CAAC,WAAW;oBACpC,UAAU,EAAE,IAAA,eAAO,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;oBAC9C,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAA,2BAAoB,EAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAmB,GAAE;oBACpG,KAAK,EAAE,WAAW;wBAChB,CAAC,CAAC;4BACE,QAAQ,EAAE,WAAW,CAAC,OAAO;4BAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;yBAC5B;wBACH,CAAC,CAAC,SAAS,CAAC,eAAe,EAAE;iBAChC,CAAC;gBACF,IAAI,EAAE,8BAAiB,CAAC,KAAK;aAC9B,CAAC;YAEF,IAAM,cAAc,GAAG;gBACrB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACvB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;aAC5B,CAAC;YAEF,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAA,cAAM,EAAC,WAAW,CAAC,IAAI,IAAA,iBAAS,EAAC,cAAc,EAAE,WAAW,CAAC,EAAE;gBAClG,cAAc,CAAC,KAAK,CAAC,8DAA8D,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAEnG,OAAO;aACR;YAED,WAAW,GAAG,cAAc,CAAC;YAE7B,cAAc,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YAE9C,IAAM,GAAG,GAAG,UAAU,EAAE,CAAC;YACzB,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,sCAA8B,EAAE;gBACtD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC5B;iBAAM;gBACL,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC1B;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,cAAc,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;SAClD;IACH,CAAC,CAAC;IAEF,OAAO;QACL,SAAS,WAAA;KACV,CAAC;AACJ,CAAC;AA5ED,kDA4EC","sourcesContent":["import type { Config } from '../../config';\nimport type { InternalLogger } from '../../internalLogger';\nimport type { Metas } from '../../metas';\nimport { TransportItemType } from '../../transports';\nimport type { TransportItem, Transports } from '../../transports';\nimport type { UnpatchedConsole } from '../../unpatchedConsole';\nimport { deepEqual, getCurrentTimestamp, isEmpty, isNull, stringifyObjectValues } from '../../utils';\nimport { timestampToIsoString } from '../../utils/date';\nimport { USER_ACTION_START_MESSAGE_TYPE } from '../const';\nimport type { ItemBuffer } from '../ItemBuffer';\nimport type { TracesAPI } from '../traces';\nimport type { ApiMessageBusMessages } from '../types';\n\nimport type { EventEvent, EventsAPI } from './types';\n\nexport function initializeEventsAPI({\n internalLogger,\n config,\n metas,\n transports,\n tracesApi,\n actionBuffer,\n getMessage,\n}: {\n unpatchedConsole: UnpatchedConsole;\n internalLogger: InternalLogger;\n config: Config;\n metas: Metas;\n transports: Transports;\n tracesApi: TracesAPI;\n actionBuffer: ItemBuffer<TransportItem>;\n getMessage: () => ApiMessageBusMessages | undefined;\n}): EventsAPI {\n let lastPayload: Pick<EventEvent, 'name' | 'domain' | 'attributes'> | null = null;\n\n const pushEvent: EventsAPI['pushEvent'] = (\n name,\n attributes,\n domain,\n { skipDedupe, spanContext, timestampOverwriteMs, customPayloadTransformer = (payload: EventEvent) => payload } = {}\n ) => {\n try {\n const attrs = stringifyObjectValues(attributes);\n\n const item: TransportItem<EventEvent> = {\n meta: metas.value,\n payload: customPayloadTransformer({\n name,\n domain: domain ?? config.eventDomain,\n attributes: isEmpty(attrs) ? undefined : attrs,\n timestamp: timestampOverwriteMs ? timestampToIsoString(timestampOverwriteMs) : getCurrentTimestamp(),\n trace: spanContext\n ? {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n }\n : tracesApi.getTraceContext(),\n }),\n type: TransportItemType.EVENT,\n };\n\n const testingPayload = {\n name: item.payload.name,\n attributes: item.payload.attributes,\n domain: item.payload.domain,\n };\n\n if (!skipDedupe && config.dedupe && !isNull(lastPayload) && deepEqual(testingPayload, lastPayload)) {\n internalLogger.debug('Skipping event push because it is the same as the last one\\n', item.payload);\n\n return;\n }\n\n lastPayload = testingPayload;\n\n internalLogger.debug('Pushing event\\n', item);\n\n const msg = getMessage();\n if (msg && msg.type === USER_ACTION_START_MESSAGE_TYPE) {\n actionBuffer.addItem(item);\n } else {\n transports.execute(item);\n }\n } catch (err) {\n internalLogger.error('Error pushing event', err);\n }\n };\n\n return {\n pushEvent,\n };\n}\n"]}
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var initialize_1 = require("../../initialize");
4
4
  var testUtils_1 = require("../../testUtils");
5
+ var utils_1 = require("../../utils");
6
+ var apiTestHelpers_1 = require("../apiTestHelpers");
7
+ var const_1 = require("../const");
8
+ var ItemBuffer_1 = require("../ItemBuffer");
9
+ var initialize_2 = require("./initialize");
5
10
  describe('api.events', function () {
6
11
  function createAPI(_a) {
7
12
  var _b = _a === void 0 ? { dedupe: true } : _a, dedupe = _b.dedupe;
@@ -129,6 +134,58 @@ describe('api.events', function () {
129
134
  i: '[1,2,3]',
130
135
  });
131
136
  });
137
+ it('does not stringify empty attributes', function () {
138
+ api.pushEvent('test');
139
+ api.pushEvent('test2', {});
140
+ expect(transport.items).toHaveLength(2);
141
+ expect(transport.items[0].payload.attributes).toBeUndefined();
142
+ expect(transport.items[0].payload.attributes).toBeUndefined();
143
+ });
144
+ });
145
+ });
146
+ describe('User action', function () {
147
+ it('buffers the error if a user action is in progress', function () {
148
+ var internalLogger = testUtils_1.mockInternalLogger;
149
+ var config = (0, testUtils_1.mockConfig)();
150
+ var actionBuffer = new ItemBuffer_1.ItemBuffer();
151
+ var message;
152
+ var getMessage = function () { return message; };
153
+ message = {
154
+ type: const_1.USER_ACTION_START_MESSAGE_TYPE,
155
+ name: 'testAction',
156
+ startTime: Date.now(),
157
+ parentId: 'parent-id',
158
+ };
159
+ var api = (0, initialize_2.initializeEventsAPI)({
160
+ unpatchedConsole: console,
161
+ internalLogger: internalLogger,
162
+ config: config,
163
+ metas: apiTestHelpers_1.mockMetas,
164
+ transports: apiTestHelpers_1.mockTransports,
165
+ tracesApi: apiTestHelpers_1.mockTracesApi,
166
+ actionBuffer: actionBuffer,
167
+ getMessage: getMessage,
168
+ });
169
+ api.pushEvent('test');
170
+ expect(actionBuffer.size()).toBe(1);
171
+ message = {
172
+ type: const_1.USER_ACTION_END_MESSAGE_TYPE,
173
+ name: 'testAction',
174
+ id: 'parent-id',
175
+ startTime: (0, utils_1.dateNow)(),
176
+ endTime: (0, utils_1.dateNow)(),
177
+ duration: 0,
178
+ eventType: 'click',
179
+ };
180
+ api.pushEvent('test-2');
181
+ expect(actionBuffer.size()).toBe(1);
182
+ message = {
183
+ type: const_1.USER_ACTION_CANCEL_MESSAGE_TYPE,
184
+ name: 'testAction',
185
+ parentId: 'parent-id',
186
+ };
187
+ api.pushEvent('test-3');
188
+ expect(actionBuffer.size()).toBe(1);
132
189
  });
133
190
  });
134
191
  });
@@ -1 +1 @@
1
- {"version":3,"file":"initialize.test.js","sourceRoot":"","sources":["../../../../../../src/api/events/initialize.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { initializeFaro } from '../../initialize';\nimport { mockConfig, MockTransport } from '../../testUtils';\nimport type { API } from '../types';\n\nimport type { EventEvent, PushEventOptions } from './types';\n\ndescribe('api.events', () => {\n function createAPI({ dedupe }: { dedupe: boolean } = { dedupe: true }): [API, MockTransport] {\n const transport = new MockTransport();\n const config = mockConfig({\n dedupe,\n transports: [transport],\n });\n\n const { api } = initializeFaro(config);\n\n return [api, transport];\n }\n\n describe('pushEvent', () => {\n let api: API;\n let transport: MockTransport;\n\n beforeEach(() => {\n [api, transport] = createAPI();\n });\n\n describe('Filtering', () => {\n it('filters the same event', () => {\n api.pushEvent('test', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n });\n\n it(\"doesn't filter events with same name and partially same values\", () => {\n api.pushEvent('test', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test', {\n a: '1',\n b: '2',\n });\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"doesn't filter events with different name and same values\", () => {\n api.pushEvent('test1', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test2', {\n a: '1',\n });\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"filters an event and doesn't filter the next different one\", () => {\n api.pushEvent('test1', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test1', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test2', {\n b: '1',\n });\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"doesn't filter when dedupe is false\", () => {\n [api, transport] = createAPI({ dedupe: false });\n\n api.pushEvent('test');\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test');\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"doesn't filter when skipDedupe is true\", () => {\n api.pushEvent('test');\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test', {}, undefined, { skipDedupe: true });\n expect(transport.items).toHaveLength(2);\n });\n\n it('uses traceId and spanId from custom context', () => {\n const spanContext: PushEventOptions['spanContext'] = {\n traceId: 'my-trace-id',\n spanId: 'my-span-id',\n };\n\n const mockGetTraceContext = jest.fn();\n jest.spyOn(api, 'getTraceContext').mockImplementationOnce(mockGetTraceContext);\n\n api.pushEvent('test', undefined, undefined, { spanContext });\n\n expect(mockGetTraceContext).not.toHaveBeenCalled();\n expect((transport.items[0]?.payload as EventEvent).trace).toStrictEqual({\n trace_id: 'my-trace-id',\n span_id: 'my-span-id',\n });\n });\n\n it('Sets the timestamp to the provided custom timestamp', () => {\n api.pushEvent('test', undefined, undefined, { timestampOverwriteMs: 123 });\n expect(transport.items).toHaveLength(1);\n expect((transport.items[0]?.payload as EventEvent).timestamp).toBe('1970-01-01T00:00:00.123Z');\n });\n\n it('stringifies all values in the attributes object', () => {\n api.pushEvent('test', {\n // @ts-expect-error\n a: 1,\n b: 'foo',\n // @ts-expect-error\n c: true,\n // @ts-expect-error\n d: { e: 'bar' },\n // @ts-expect-error\n g: null,\n // @ts-expect-error\n h: undefined,\n // @ts-expect-error\n i: [1, 2, 3],\n });\n\n // @ts-expect-error\n expect(transport.items[0]?.payload.attributes).toStrictEqual({\n a: '1',\n b: 'foo',\n c: 'true',\n d: '{\"e\":\"bar\"}',\n g: 'null',\n h: 'undefined',\n i: '[1,2,3]',\n });\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"initialize.test.js","sourceRoot":"","sources":["../../../../../../src/api/events/initialize.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransportItem } from '../..';\nimport { initializeFaro } from '../../initialize';\nimport { mockConfig, mockInternalLogger, MockTransport } from '../../testUtils';\nimport { dateNow } from '../../utils';\nimport { mockMetas, mockTracesApi, mockTransports } from '../apiTestHelpers';\nimport {\n USER_ACTION_CANCEL_MESSAGE_TYPE,\n USER_ACTION_END_MESSAGE_TYPE,\n USER_ACTION_START_MESSAGE_TYPE,\n} from '../const';\nimport { ItemBuffer } from '../ItemBuffer';\nimport type { API, APIEvent, ApiMessageBusMessages } from '../types';\n\nimport { initializeEventsAPI } from './initialize';\nimport type { EventEvent, PushEventOptions } from './types';\n\ndescribe('api.events', () => {\n function createAPI({ dedupe }: { dedupe: boolean } = { dedupe: true }): [API, MockTransport] {\n const transport = new MockTransport();\n const config = mockConfig({\n dedupe,\n transports: [transport],\n });\n\n const { api } = initializeFaro(config);\n\n return [api, transport];\n }\n\n describe('pushEvent', () => {\n let api: API;\n let transport: MockTransport;\n\n beforeEach(() => {\n [api, transport] = createAPI();\n });\n\n describe('Filtering', () => {\n it('filters the same event', () => {\n api.pushEvent('test', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n });\n\n it(\"doesn't filter events with same name and partially same values\", () => {\n api.pushEvent('test', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test', {\n a: '1',\n b: '2',\n });\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"doesn't filter events with different name and same values\", () => {\n api.pushEvent('test1', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test2', {\n a: '1',\n });\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"filters an event and doesn't filter the next different one\", () => {\n api.pushEvent('test1', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test1', {\n a: '1',\n });\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test2', {\n b: '1',\n });\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"doesn't filter when dedupe is false\", () => {\n [api, transport] = createAPI({ dedupe: false });\n\n api.pushEvent('test');\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test');\n expect(transport.items).toHaveLength(2);\n });\n\n it(\"doesn't filter when skipDedupe is true\", () => {\n api.pushEvent('test');\n expect(transport.items).toHaveLength(1);\n\n api.pushEvent('test', {}, undefined, { skipDedupe: true });\n expect(transport.items).toHaveLength(2);\n });\n\n it('uses traceId and spanId from custom context', () => {\n const spanContext: PushEventOptions['spanContext'] = {\n traceId: 'my-trace-id',\n spanId: 'my-span-id',\n };\n\n const mockGetTraceContext = jest.fn();\n jest.spyOn(api, 'getTraceContext').mockImplementationOnce(mockGetTraceContext);\n\n api.pushEvent('test', undefined, undefined, { spanContext });\n\n expect(mockGetTraceContext).not.toHaveBeenCalled();\n expect((transport.items[0]?.payload as EventEvent).trace).toStrictEqual({\n trace_id: 'my-trace-id',\n span_id: 'my-span-id',\n });\n });\n\n it('Sets the timestamp to the provided custom timestamp', () => {\n api.pushEvent('test', undefined, undefined, { timestampOverwriteMs: 123 });\n expect(transport.items).toHaveLength(1);\n expect((transport.items[0]?.payload as EventEvent).timestamp).toBe('1970-01-01T00:00:00.123Z');\n });\n\n it('stringifies all values in the attributes object', () => {\n api.pushEvent('test', {\n // @ts-expect-error\n a: 1,\n b: 'foo',\n // @ts-expect-error\n c: true,\n // @ts-expect-error\n d: { e: 'bar' },\n // @ts-expect-error\n g: null,\n // @ts-expect-error\n h: undefined,\n // @ts-expect-error\n i: [1, 2, 3],\n });\n\n // @ts-expect-error\n expect(transport.items[0]?.payload.attributes).toStrictEqual({\n a: '1',\n b: 'foo',\n c: 'true',\n d: '{\"e\":\"bar\"}',\n g: 'null',\n h: 'undefined',\n i: '[1,2,3]',\n });\n });\n\n it('does not stringify empty attributes', () => {\n api.pushEvent('test');\n api.pushEvent('test2', {});\n expect(transport.items).toHaveLength(2);\n expect((transport.items[0] as TransportItem<EventEvent>).payload.attributes).toBeUndefined();\n expect((transport.items[0] as TransportItem<EventEvent>).payload.attributes).toBeUndefined();\n });\n });\n });\n\n describe('User action', () => {\n it('buffers the error if a user action is in progress', () => {\n const internalLogger = mockInternalLogger;\n const config = mockConfig();\n\n const actionBuffer = new ItemBuffer<TransportItem<APIEvent>>();\n\n let message: ApiMessageBusMessages | undefined;\n\n const getMessage = () => message;\n\n message = {\n type: USER_ACTION_START_MESSAGE_TYPE,\n name: 'testAction',\n startTime: Date.now(),\n parentId: 'parent-id',\n };\n const api = initializeEventsAPI({\n unpatchedConsole: console,\n internalLogger,\n config,\n metas: mockMetas,\n transports: mockTransports,\n tracesApi: mockTracesApi,\n actionBuffer,\n getMessage,\n });\n\n api.pushEvent('test');\n expect(actionBuffer.size()).toBe(1);\n\n message = {\n type: USER_ACTION_END_MESSAGE_TYPE,\n name: 'testAction',\n id: 'parent-id',\n startTime: dateNow(),\n endTime: dateNow(),\n duration: 0,\n eventType: 'click',\n };\n\n api.pushEvent('test-2');\n expect(actionBuffer.size()).toBe(1);\n\n message = {\n type: USER_ACTION_CANCEL_MESSAGE_TYPE,\n name: 'testAction',\n parentId: 'parent-id',\n };\n\n api.pushEvent('test-3');\n expect(actionBuffer.size()).toBe(1);\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/api/events/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SpanContext } from '@opentelemetry/api';\n\nimport type { TraceContext } from '../traces';\n\nexport type EventAttributes = Record<string, string>;\n\nexport interface EventEvent {\n name: string;\n timestamp: string;\n\n domain?: string;\n attributes?: EventAttributes;\n trace?: TraceContext;\n}\n\nexport interface PushEventOptions {\n skipDedupe?: boolean;\n spanContext?: Pick<SpanContext, 'traceId' | 'spanId'>;\n timestampOverwriteMs?: number;\n}\n\nexport interface EventsAPI {\n pushEvent: (name: string, attributes?: EventAttributes, domain?: string, options?: PushEventOptions) => void;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/api/events/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SpanContext } from '@opentelemetry/api';\n\nimport type { TraceContext } from '../traces';\nimport type { UserAction } from '../types';\n\nexport type EventAttributes = Record<string, string>;\n\nexport interface EventEvent {\n name: string;\n timestamp: string;\n\n domain?: string;\n attributes?: EventAttributes;\n trace?: TraceContext;\n\n action?: UserAction;\n}\n\nexport interface PushEventOptions {\n skipDedupe?: boolean;\n spanContext?: Pick<SpanContext, 'traceId' | 'spanId'>;\n timestampOverwriteMs?: number;\n\n /**\n * Allows manual transformation of the payload before adding it to the internal buffer.\n *\n * @param payload - The event payload to be transformed.\n * @returns The transformed event payload.\n *\n * @remarks This should be used sparingly and only in special cases where custom payload processing cannot be deferred to the before-send hook.\n */\n customPayloadTransformer?: (payload: EventEvent) => EventEvent;\n}\n\nexport interface EventsAPI {\n pushEvent: (name: string, attributes?: EventAttributes, domain?: string, options?: PushEventOptions) => void;\n}\n"]}
@@ -15,60 +15,74 @@ exports.initializeExceptionsAPI = void 0;
15
15
  var transports_1 = require("../../transports");
16
16
  var utils_1 = require("../../utils");
17
17
  var date_1 = require("../../utils/date");
18
+ var const_1 = require("../const");
18
19
  var utils_2 = require("../utils");
19
- var const_1 = require("./const");
20
+ var const_2 = require("./const");
20
21
  var stacktraceParser;
21
- function initializeExceptionsAPI(_unpatchedConsole, internalLogger, config, metas, transports, tracesApi) {
22
- var _a;
22
+ function initializeExceptionsAPI(_a) {
23
+ var _b;
24
+ var internalLogger = _a.internalLogger, config = _a.config, metas = _a.metas, transports = _a.transports, tracesApi = _a.tracesApi, actionBuffer = _a.actionBuffer, getMessage = _a.getMessage;
23
25
  internalLogger.debug('Initializing exceptions API');
24
26
  var lastPayload = null;
25
- stacktraceParser = (_a = config.parseStacktrace) !== null && _a !== void 0 ? _a : stacktraceParser;
27
+ stacktraceParser = (_b = config.parseStacktrace) !== null && _b !== void 0 ? _b : stacktraceParser;
26
28
  var changeStacktraceParser = function (newStacktraceParser) {
27
29
  internalLogger.debug('Changing stacktrace parser');
28
30
  stacktraceParser = newStacktraceParser !== null && newStacktraceParser !== void 0 ? newStacktraceParser : stacktraceParser;
29
31
  };
30
32
  var getStacktraceParser = function () { return stacktraceParser; };
31
- var _b = config.ignoreErrors, ignoreErrors = _b === void 0 ? [] : _b;
33
+ var _c = config.ignoreErrors, ignoreErrors = _c === void 0 ? [] : _c;
32
34
  var pushError = function (error, _a) {
33
35
  var _b = _a === void 0 ? {} : _a, skipDedupe = _b.skipDedupe, stackFrames = _b.stackFrames, type = _b.type, context = _b.context, spanContext = _b.spanContext, timestampOverwriteMs = _b.timestampOverwriteMs;
34
36
  if (isErrorIgnored(ignoreErrors, error)) {
35
37
  return;
36
38
  }
37
- var item = {
38
- meta: metas.value,
39
- payload: {
40
- type: type || error.name || const_1.defaultExceptionType,
41
- value: error.message,
42
- timestamp: timestampOverwriteMs ? (0, date_1.timestampToIsoString)(timestampOverwriteMs) : (0, utils_1.getCurrentTimestamp)(),
43
- trace: spanContext
44
- ? {
45
- trace_id: spanContext.traceId,
46
- span_id: spanContext.spanId,
47
- }
48
- : tracesApi.getTraceContext(),
49
- context: (0, utils_1.stringifyObjectValues)(__assign(__assign({}, parseCause(error)), (context !== null && context !== void 0 ? context : {}))),
50
- },
51
- type: transports_1.TransportItemType.EXCEPTION,
52
- };
53
- stackFrames = stackFrames !== null && stackFrames !== void 0 ? stackFrames : (error.stack ? stacktraceParser === null || stacktraceParser === void 0 ? void 0 : stacktraceParser(error).frames : undefined);
54
- if (stackFrames === null || stackFrames === void 0 ? void 0 : stackFrames.length) {
55
- item.payload.stacktrace = {
56
- frames: stackFrames,
39
+ try {
40
+ var ctx = (0, utils_1.stringifyObjectValues)(__assign(__assign({}, parseCause(error)), (context !== null && context !== void 0 ? context : {})));
41
+ var item = {
42
+ meta: metas.value,
43
+ payload: {
44
+ type: type || error.name || const_2.defaultExceptionType,
45
+ value: error.message,
46
+ timestamp: timestampOverwriteMs ? (0, date_1.timestampToIsoString)(timestampOverwriteMs) : (0, utils_1.getCurrentTimestamp)(),
47
+ trace: spanContext
48
+ ? {
49
+ trace_id: spanContext.traceId,
50
+ span_id: spanContext.spanId,
51
+ }
52
+ : tracesApi.getTraceContext(),
53
+ context: (0, utils_1.isEmpty)(ctx) ? undefined : ctx,
54
+ },
55
+ type: transports_1.TransportItemType.EXCEPTION,
57
56
  };
57
+ stackFrames = stackFrames !== null && stackFrames !== void 0 ? stackFrames : (error.stack ? stacktraceParser === null || stacktraceParser === void 0 ? void 0 : stacktraceParser(error).frames : undefined);
58
+ if (stackFrames === null || stackFrames === void 0 ? void 0 : stackFrames.length) {
59
+ item.payload.stacktrace = {
60
+ frames: stackFrames,
61
+ };
62
+ }
63
+ var testingPayload = {
64
+ type: item.payload.type,
65
+ value: item.payload.value,
66
+ stackTrace: item.payload.stacktrace,
67
+ context: item.payload.context,
68
+ };
69
+ if (!skipDedupe && config.dedupe && !(0, utils_1.isNull)(lastPayload) && (0, utils_1.deepEqual)(testingPayload, lastPayload)) {
70
+ internalLogger.debug('Skipping error push because it is the same as the last one\n', item.payload);
71
+ return;
72
+ }
73
+ lastPayload = testingPayload;
74
+ internalLogger.debug('Pushing exception\n', item);
75
+ var msg = getMessage();
76
+ if (msg && msg.type === const_1.USER_ACTION_START_MESSAGE_TYPE) {
77
+ actionBuffer.addItem(item);
78
+ }
79
+ else {
80
+ transports.execute(item);
81
+ }
58
82
  }
59
- var testingPayload = {
60
- type: item.payload.type,
61
- value: item.payload.value,
62
- stackTrace: item.payload.stacktrace,
63
- context: item.payload.context,
64
- };
65
- if (!skipDedupe && config.dedupe && !(0, utils_1.isNull)(lastPayload) && (0, utils_1.deepEqual)(testingPayload, lastPayload)) {
66
- internalLogger.debug('Skipping error push because it is the same as the last one\n', item.payload);
67
- return;
83
+ catch (err) {
84
+ internalLogger.error('Error pushing event', err);
68
85
  }
69
- lastPayload = testingPayload;
70
- internalLogger.debug('Pushing exception\n', item);
71
- transports.execute(item);
72
86
  };
73
87
  changeStacktraceParser(config.parseStacktrace);
74
88
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../../../../../src/api/exceptions/initialize.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config, Patterns } from '../../config';\nimport type { InternalLogger } from '../../internalLogger';\nimport type { Metas } from '../../metas';\nimport { TransportItemType } from '../../transports';\nimport type { TransportItem, Transports } from '../../transports';\nimport type { UnpatchedConsole } from '../../unpatchedConsole';\nimport {\n deepEqual,\n getCurrentTimestamp,\n isArray,\n isError,\n isNull,\n isObject,\n stringifyExternalJson,\n stringifyObjectValues,\n} from '../../utils';\nimport { timestampToIsoString } from '../../utils/date';\nimport type { TracesAPI } from '../traces';\nimport { shouldIgnoreEvent } from '../utils';\n\nimport { defaultExceptionType } from './const';\nimport type { ErrorWithIndexProperties, ExceptionEvent, ExceptionsAPI, StacktraceParser } from './types';\n\nlet stacktraceParser: StacktraceParser | undefined;\n\nexport function initializeExceptionsAPI(\n _unpatchedConsole: UnpatchedConsole,\n internalLogger: InternalLogger,\n config: Config,\n metas: Metas,\n transports: Transports,\n tracesApi: TracesAPI\n): ExceptionsAPI {\n internalLogger.debug('Initializing exceptions API');\n\n let lastPayload: Pick<ExceptionEvent, 'type' | 'value' | 'stacktrace' | 'context'> | null = null;\n\n stacktraceParser = config.parseStacktrace ?? stacktraceParser;\n\n const changeStacktraceParser: ExceptionsAPI['changeStacktraceParser'] = (newStacktraceParser) => {\n internalLogger.debug('Changing stacktrace parser');\n\n stacktraceParser = newStacktraceParser ?? stacktraceParser;\n };\n\n const getStacktraceParser: ExceptionsAPI['getStacktraceParser'] = () => stacktraceParser;\n\n const { ignoreErrors = [] } = config;\n\n const pushError: ExceptionsAPI['pushError'] = (\n error,\n { skipDedupe, stackFrames, type, context, spanContext, timestampOverwriteMs } = {}\n ) => {\n if (isErrorIgnored(ignoreErrors, error)) {\n return;\n }\n\n const item: TransportItem<ExceptionEvent> = {\n meta: metas.value,\n payload: {\n type: type || error.name || defaultExceptionType,\n value: error.message,\n timestamp: timestampOverwriteMs ? timestampToIsoString(timestampOverwriteMs) : getCurrentTimestamp(),\n trace: spanContext\n ? {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n }\n : tracesApi.getTraceContext(),\n context: stringifyObjectValues({\n ...parseCause(error),\n ...(context ?? {}),\n }),\n },\n type: TransportItemType.EXCEPTION,\n };\n\n stackFrames = stackFrames ?? (error.stack ? stacktraceParser?.(error).frames : undefined);\n\n if (stackFrames?.length) {\n item.payload.stacktrace = {\n frames: stackFrames,\n };\n }\n\n const testingPayload = {\n type: item.payload.type,\n value: item.payload.value,\n stackTrace: item.payload.stacktrace,\n context: item.payload.context,\n };\n\n if (!skipDedupe && config.dedupe && !isNull(lastPayload) && deepEqual(testingPayload, lastPayload)) {\n internalLogger.debug('Skipping error push because it is the same as the last one\\n', item.payload);\n\n return;\n }\n\n lastPayload = testingPayload;\n\n internalLogger.debug('Pushing exception\\n', item);\n\n transports.execute(item);\n };\n\n changeStacktraceParser(config.parseStacktrace);\n\n return {\n changeStacktraceParser,\n getStacktraceParser,\n pushError,\n };\n}\n\nfunction parseCause(error: ErrorWithIndexProperties): {} | { cause: string } {\n let cause = error.cause;\n\n if (isError(cause)) {\n cause = error.cause.toString();\n // typeof operator on null returns \"object\". This is a well-known quirk in JavaScript and is considered a bug that cannot be fixed due to backward compatibility issues.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#typeof_null\n } else if (cause !== null && (isObject(error.cause) || isArray(error.cause))) {\n cause = stringifyExternalJson(error.cause);\n } else if (cause != null) {\n cause = error.cause.toString();\n }\n\n return cause == null ? {} : { cause };\n}\n\nfunction isErrorIgnored(ignoreErrors: Patterns, error: ErrorWithIndexProperties): boolean {\n const { message, name, stack } = error;\n return shouldIgnoreEvent(ignoreErrors, message + ' ' + name + ' ' + stack);\n}\n"]}
1
+ {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../../../../../src/api/exceptions/initialize.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Config, Patterns } from '../../config';\nimport type { InternalLogger } from '../../internalLogger';\nimport type { Metas } from '../../metas';\nimport { TransportItemType } from '../../transports';\nimport type { TransportItem, Transports } from '../../transports';\nimport type { UnpatchedConsole } from '../../unpatchedConsole';\nimport {\n deepEqual,\n getCurrentTimestamp,\n isArray,\n isEmpty,\n isError,\n isNull,\n isObject,\n stringifyExternalJson,\n stringifyObjectValues,\n} from '../../utils';\nimport { timestampToIsoString } from '../../utils/date';\nimport { USER_ACTION_START_MESSAGE_TYPE } from '../const';\nimport type { ItemBuffer } from '../ItemBuffer';\nimport type { TracesAPI } from '../traces';\nimport type { ApiMessageBusMessages } from '../types';\nimport { shouldIgnoreEvent } from '../utils';\n\nimport { defaultExceptionType } from './const';\nimport type { ErrorWithIndexProperties, ExceptionEvent, ExceptionsAPI, StacktraceParser } from './types';\n\nlet stacktraceParser: StacktraceParser | undefined;\n\nexport function initializeExceptionsAPI({\n internalLogger,\n config,\n metas,\n transports,\n tracesApi,\n actionBuffer,\n getMessage,\n}: {\n unpatchedConsole: UnpatchedConsole;\n internalLogger: InternalLogger;\n config: Config;\n metas: Metas;\n transports: Transports;\n tracesApi: TracesAPI;\n actionBuffer: ItemBuffer<TransportItem>;\n getMessage: () => ApiMessageBusMessages | undefined;\n}): ExceptionsAPI {\n internalLogger.debug('Initializing exceptions API');\n\n let lastPayload: Pick<ExceptionEvent, 'type' | 'value' | 'stacktrace' | 'context'> | null = null;\n\n stacktraceParser = config.parseStacktrace ?? stacktraceParser;\n\n const changeStacktraceParser: ExceptionsAPI['changeStacktraceParser'] = (newStacktraceParser) => {\n internalLogger.debug('Changing stacktrace parser');\n\n stacktraceParser = newStacktraceParser ?? stacktraceParser;\n };\n\n const getStacktraceParser: ExceptionsAPI['getStacktraceParser'] = () => stacktraceParser;\n\n const { ignoreErrors = [] } = config;\n\n const pushError: ExceptionsAPI['pushError'] = (\n error,\n { skipDedupe, stackFrames, type, context, spanContext, timestampOverwriteMs } = {}\n ) => {\n if (isErrorIgnored(ignoreErrors, error)) {\n return;\n }\n try {\n const ctx = stringifyObjectValues({\n ...parseCause(error),\n ...(context ?? {}),\n });\n\n const item: TransportItem<ExceptionEvent> = {\n meta: metas.value,\n payload: {\n type: type || error.name || defaultExceptionType,\n value: error.message,\n timestamp: timestampOverwriteMs ? timestampToIsoString(timestampOverwriteMs) : getCurrentTimestamp(),\n trace: spanContext\n ? {\n trace_id: spanContext.traceId,\n span_id: spanContext.spanId,\n }\n : tracesApi.getTraceContext(),\n context: isEmpty(ctx) ? undefined : ctx,\n },\n type: TransportItemType.EXCEPTION,\n };\n\n stackFrames = stackFrames ?? (error.stack ? stacktraceParser?.(error).frames : undefined);\n\n if (stackFrames?.length) {\n item.payload.stacktrace = {\n frames: stackFrames,\n };\n }\n\n const testingPayload = {\n type: item.payload.type,\n value: item.payload.value,\n stackTrace: item.payload.stacktrace,\n context: item.payload.context,\n };\n\n if (!skipDedupe && config.dedupe && !isNull(lastPayload) && deepEqual(testingPayload, lastPayload)) {\n internalLogger.debug('Skipping error push because it is the same as the last one\\n', item.payload);\n\n return;\n }\n\n lastPayload = testingPayload;\n\n internalLogger.debug('Pushing exception\\n', item);\n\n const msg = getMessage();\n if (msg && msg.type === USER_ACTION_START_MESSAGE_TYPE) {\n actionBuffer.addItem(item);\n } else {\n transports.execute(item);\n }\n } catch (err) {\n internalLogger.error('Error pushing event', err);\n }\n };\n\n changeStacktraceParser(config.parseStacktrace);\n\n return {\n changeStacktraceParser,\n getStacktraceParser,\n pushError,\n };\n}\n\nfunction parseCause(error: ErrorWithIndexProperties): {} | { cause: string } {\n let cause = error.cause;\n\n if (isError(cause)) {\n cause = error.cause.toString();\n // typeof operator on null returns \"object\". This is a well-known quirk in JavaScript and is considered a bug that cannot be fixed due to backward compatibility issues.\n // MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#typeof_null\n } else if (cause !== null && (isObject(error.cause) || isArray(error.cause))) {\n cause = stringifyExternalJson(error.cause);\n } else if (cause != null) {\n cause = error.cause.toString();\n }\n\n return cause == null ? {} : { cause };\n}\n\nfunction isErrorIgnored(ignoreErrors: Patterns, error: ErrorWithIndexProperties): boolean {\n const { message, name, stack } = error;\n return shouldIgnoreEvent(ignoreErrors, message + ' ' + name + ' ' + stack);\n}\n"]}
@@ -3,6 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var initialize_1 = require("../../initialize");
4
4
  var testUtils_1 = require("../../testUtils");
5
5
  var transports_1 = require("../../transports");
6
+ var utils_1 = require("../../utils");
7
+ var apiTestHelpers_1 = require("../apiTestHelpers");
8
+ var const_1 = require("../const");
9
+ var ItemBuffer_1 = require("../ItemBuffer");
10
+ var initialize_2 = require("./initialize");
6
11
  describe('api.exceptions', function () {
7
12
  function createAPI(_a) {
8
13
  var _b = _a === void 0 ? { dedupe: true } : _a, dedupe = _b.dedupe;
@@ -73,6 +78,15 @@ describe('api.exceptions', function () {
73
78
  expect(stacktrace === null || stacktrace === void 0 ? void 0 : stacktrace.frames.length).toBeGreaterThan(3);
74
79
  expect((_b = stacktrace === null || stacktrace === void 0 ? void 0 : stacktrace.frames[0]) === null || _b === void 0 ? void 0 : _b.filename).toEqual('Error: test');
75
80
  });
81
+ it('does not stringify empty context', function () {
82
+ api.pushError(new Error('test'));
83
+ api.pushError(new Error('test2'), {
84
+ context: {},
85
+ });
86
+ expect(transport.items).toHaveLength(2);
87
+ expect(transport.items[0].payload.context).toBeUndefined();
88
+ expect(transport.items[0].payload.context).toBeUndefined();
89
+ });
76
90
  describe('Filtering', function () {
77
91
  it('filters the same event', function () {
78
92
  var error = new Error('test');
@@ -187,9 +201,9 @@ describe('api.exceptions', function () {
187
201
  expect((_d = (_c = transport.items[1]) === null || _c === void 0 ? void 0 : _c.payload) === null || _d === void 0 ? void 0 : _d.context).toEqual({ cause: '[1,3]' });
188
202
  expect((_f = (_e = transport.items[2]) === null || _e === void 0 ? void 0 : _e.payload) === null || _f === void 0 ? void 0 : _f.context).toEqual({ cause: '{"a":"b"}' });
189
203
  expect((_h = (_g = transport.items[3]) === null || _g === void 0 ? void 0 : _g.payload) === null || _h === void 0 ? void 0 : _h.context).toEqual({ cause: 'Error: original error' });
190
- expect((_k = (_j = transport.items[4]) === null || _j === void 0 ? void 0 : _j.payload) === null || _k === void 0 ? void 0 : _k.context).toEqual({});
191
- expect((_m = (_l = transport.items[5]) === null || _l === void 0 ? void 0 : _l.payload) === null || _m === void 0 ? void 0 : _m.context).toEqual({});
192
- expect((_p = (_o = transport.items[5]) === null || _o === void 0 ? void 0 : _o.payload) === null || _p === void 0 ? void 0 : _p.context).toEqual({});
204
+ expect((_k = (_j = transport.items[4]) === null || _j === void 0 ? void 0 : _j.payload) === null || _k === void 0 ? void 0 : _k.context).toBeUndefined();
205
+ expect((_m = (_l = transport.items[5]) === null || _l === void 0 ? void 0 : _l.payload) === null || _m === void 0 ? void 0 : _m.context).toBeUndefined();
206
+ expect((_p = (_o = transport.items[6]) === null || _o === void 0 ? void 0 : _o.payload) === null || _p === void 0 ? void 0 : _p.context).toBeUndefined();
193
207
  });
194
208
  it('stringifies all values added to the context', function () {
195
209
  var _a, _b;
@@ -246,6 +260,51 @@ describe('api.exceptions', function () {
246
260
  expect(((_a = transport.items[0]) === null || _a === void 0 ? void 0 : _a.payload).value).toEqual(typeErrorMsg);
247
261
  });
248
262
  });
263
+ describe('User action', function () {
264
+ it('buffers the error if a user action is in progress', function () {
265
+ var internalLogger = testUtils_1.mockInternalLogger;
266
+ var config = (0, testUtils_1.mockConfig)();
267
+ var actionBuffer = new ItemBuffer_1.ItemBuffer();
268
+ var message;
269
+ var getMessage = function () { return message; };
270
+ message = {
271
+ type: const_1.USER_ACTION_START_MESSAGE_TYPE,
272
+ name: 'testAction',
273
+ startTime: Date.now(),
274
+ parentId: 'parent-id',
275
+ };
276
+ var api = (0, initialize_2.initializeExceptionsAPI)({
277
+ unpatchedConsole: console,
278
+ internalLogger: internalLogger,
279
+ config: config,
280
+ metas: apiTestHelpers_1.mockMetas,
281
+ transports: apiTestHelpers_1.mockTransports,
282
+ tracesApi: apiTestHelpers_1.mockTracesApi,
283
+ actionBuffer: actionBuffer,
284
+ getMessage: getMessage,
285
+ });
286
+ api.pushError(new Error('test error'));
287
+ expect(actionBuffer.size()).toBe(1);
288
+ message = {
289
+ type: const_1.USER_ACTION_END_MESSAGE_TYPE,
290
+ name: 'testAction',
291
+ id: 'parent-id',
292
+ startTime: (0, utils_1.dateNow)(),
293
+ endTime: (0, utils_1.dateNow)(),
294
+ duration: 0,
295
+ eventType: 'click',
296
+ };
297
+ api.pushError(new Error('test error 2'));
298
+ expect(actionBuffer.size()).toBe(1);
299
+ message = {
300
+ type: const_1.USER_ACTION_CANCEL_MESSAGE_TYPE,
301
+ name: 'testAction',
302
+ parentId: 'parent-id',
303
+ };
304
+ api.pushError(new Error('test error 3'));
305
+ expect(actionBuffer.size()).toBe(1);
306
+ });
307
+ });
249
308
  });
250
309
  });
251
310
  //# sourceMappingURL=initialize.test.js.map