@openobserve/browser-core 0.2.11-rc1 → 0.2.12-beta.1

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 (626) hide show
  1. package/package.json +6 -5
  2. package/src/boot/displayAlreadyInitializedError.ts +8 -0
  3. package/src/boot/init.ts +29 -15
  4. package/src/browser/addEventListener.ts +13 -10
  5. package/src/browser/{types.ts → browser.types.ts} +42 -0
  6. package/src/browser/cookie.ts +49 -14
  7. package/src/browser/fetchObservable.ts +80 -21
  8. package/src/browser/{pageExitObservable.ts → pageMayExitObservable.ts} +11 -22
  9. package/src/browser/runOnReadyState.ts +14 -4
  10. package/src/browser/xhrObservable.ts +17 -4
  11. package/src/domain/allowedTrackingOrigins.ts +30 -0
  12. package/src/domain/bufferedData.ts +32 -0
  13. package/src/domain/configuration/configuration.ts +352 -83
  14. package/src/domain/configuration/endpointBuilder.ts +29 -32
  15. package/src/domain/configuration/index.ts +6 -5
  16. package/src/domain/configuration/transportConfiguration.ts +42 -35
  17. package/src/domain/connectivity/connectivity.ts +5 -1
  18. package/src/domain/console/consoleObservable.ts +57 -21
  19. package/src/domain/context/contextConstants.ts +22 -0
  20. package/src/domain/context/contextManager.ts +48 -11
  21. package/src/domain/context/contextUtils.ts +14 -0
  22. package/src/domain/context/defineContextMethod.ts +31 -0
  23. package/src/domain/context/storeContextManager.ts +7 -3
  24. package/src/domain/contexts/accountContext.ts +47 -0
  25. package/src/domain/contexts/globalContext.ts +30 -0
  26. package/src/domain/contexts/rumInternalContext.type.ts +15 -0
  27. package/src/domain/contexts/userContext.ts +64 -0
  28. package/src/domain/deflate/{types.ts → deflate.types.ts} +6 -4
  29. package/src/domain/deflate/index.ts +1 -1
  30. package/src/domain/error/error.ts +28 -84
  31. package/src/domain/error/error.types.ts +10 -2
  32. package/src/domain/error/trackRuntimeError.ts +29 -32
  33. package/src/domain/eventRateLimiter/createEventRateLimiter.ts +5 -2
  34. package/src/domain/extension/extensionUtils.ts +28 -0
  35. package/src/domain/intakeSites.ts +18 -0
  36. package/src/domain/report/reportObservable.ts +35 -30
  37. package/src/domain/resourceUtils.ts +20 -16
  38. package/src/domain/session/README.md +193 -0
  39. package/src/domain/session/oldCookiesMigration.ts +2 -2
  40. package/src/domain/session/sessionConstants.ts +16 -1
  41. package/src/domain/session/sessionManager.ts +179 -15
  42. package/src/domain/session/sessionState.ts +49 -17
  43. package/src/domain/session/sessionStateValidation.ts +9 -0
  44. package/src/domain/session/sessionStore.ts +118 -55
  45. package/src/domain/session/sessionStoreOperations.ts +47 -20
  46. package/src/domain/session/storeStrategies/sessionInCookie.ts +105 -26
  47. package/src/domain/session/storeStrategies/sessionInLocalStorage.ts +10 -8
  48. package/src/domain/session/storeStrategies/sessionStoreStrategy.ts +5 -2
  49. package/src/domain/synthetics/syntheticsWorkerValues.ts +13 -2
  50. package/src/domain/tags.ts +76 -0
  51. package/src/domain/telemetry/index.ts +12 -4
  52. package/src/domain/telemetry/rawTelemetryEvent.types.ts +6 -3
  53. package/src/domain/telemetry/telemetry.ts +235 -106
  54. package/src/domain/telemetry/telemetryEvent.types.ts +514 -5
  55. package/src/domain/trackingConsent.ts +34 -0
  56. package/src/index.ts +90 -59
  57. package/src/tools/abstractHooks.ts +72 -0
  58. package/src/tools/abstractLifeCycle.ts +1 -0
  59. package/src/tools/boundedBuffer.ts +36 -8
  60. package/src/tools/display.ts +4 -0
  61. package/src/tools/encoder.ts +3 -2
  62. package/src/tools/experimentalFeatures.ts +18 -7
  63. package/src/tools/getZoneJsOriginalValue.ts +1 -1
  64. package/src/tools/{getGlobalObject.ts → globalObject.ts} +20 -0
  65. package/src/tools/instrumentMethod.ts +58 -41
  66. package/src/tools/matchOption.ts +1 -2
  67. package/src/tools/monitor.ts +11 -7
  68. package/src/tools/observable.ts +78 -12
  69. package/src/tools/queueMicrotask.ts +13 -0
  70. package/src/tools/readBytesFromStream.ts +24 -64
  71. package/src/tools/requestIdleCallback.ts +40 -0
  72. package/src/tools/sendToExtension.ts +3 -1
  73. package/src/tools/serialisation/context.ts +4 -1
  74. package/src/tools/serialisation/sanitize.ts +32 -14
  75. package/src/{domain/error → tools/stackTrace}/computeStackTrace.ts +72 -8
  76. package/src/tools/stackTrace/handlingStack.ts +48 -0
  77. package/src/tools/taskQueue.ts +63 -0
  78. package/src/tools/timer.ts +1 -1
  79. package/src/tools/utils/arrayUtils.ts +11 -3
  80. package/src/tools/utils/browserDetection.ts +0 -9
  81. package/src/tools/utils/byteUtils.ts +13 -2
  82. package/src/tools/utils/functionUtils.ts +0 -2
  83. package/src/tools/utils/numberUtils.ts +2 -1
  84. package/src/tools/utils/objectUtils.ts +1 -3
  85. package/src/tools/utils/polyfills.ts +6 -107
  86. package/src/tools/utils/responseUtils.ts +1 -1
  87. package/src/tools/utils/stringUtils.ts +34 -2
  88. package/src/tools/utils/timeUtils.ts +18 -13
  89. package/src/tools/utils/timezone.ts +9 -0
  90. package/src/tools/utils/urlPolyfill.ts +29 -59
  91. package/src/tools/valueHistory.ts +66 -35
  92. package/src/transport/batch.ts +77 -80
  93. package/src/transport/eventBridge.ts +24 -5
  94. package/src/transport/flushController.ts +27 -21
  95. package/src/transport/httpRequest.ts +92 -71
  96. package/src/transport/index.ts +7 -4
  97. package/src/transport/sendWithRetryStrategy.ts +55 -36
  98. package/cjs/boot/init.d.ts +0 -5
  99. package/cjs/boot/init.js +0 -36
  100. package/cjs/boot/init.js.map +0 -1
  101. package/cjs/browser/addEventListener.d.ts +0 -84
  102. package/cjs/browser/addEventListener.js +0 -94
  103. package/cjs/browser/addEventListener.js.map +0 -1
  104. package/cjs/browser/cookie.d.ts +0 -17
  105. package/cjs/browser/cookie.js +0 -86
  106. package/cjs/browser/cookie.js.map +0 -1
  107. package/cjs/browser/fetchObservable.d.ts +0 -23
  108. package/cjs/browser/fetchObservable.js +0 -69
  109. package/cjs/browser/fetchObservable.js.map +0 -1
  110. package/cjs/browser/pageExitObservable.d.ts +0 -14
  111. package/cjs/browser/pageExitObservable.js +0 -57
  112. package/cjs/browser/pageExitObservable.js.map +0 -1
  113. package/cjs/browser/runOnReadyState.d.ts +0 -2
  114. package/cjs/browser/runOnReadyState.js +0 -15
  115. package/cjs/browser/runOnReadyState.js.map +0 -1
  116. package/cjs/browser/types.d.ts +0 -19
  117. package/cjs/browser/types.js +0 -6
  118. package/cjs/browser/types.js.map +0 -1
  119. package/cjs/browser/xhrObservable.d.ts +0 -21
  120. package/cjs/browser/xhrObservable.js +0 -85
  121. package/cjs/browser/xhrObservable.js.map +0 -1
  122. package/cjs/domain/configuration/configuration.d.ts +0 -72
  123. package/cjs/domain/configuration/configuration.js +0 -94
  124. package/cjs/domain/configuration/configuration.js.map +0 -1
  125. package/cjs/domain/configuration/endpointBuilder.d.ts +0 -10
  126. package/cjs/domain/configuration/endpointBuilder.js +0 -84
  127. package/cjs/domain/configuration/endpointBuilder.js.map +0 -1
  128. package/cjs/domain/configuration/index.d.ts +0 -4
  129. package/cjs/domain/configuration/index.js +0 -27
  130. package/cjs/domain/configuration/index.js.map +0 -1
  131. package/cjs/domain/configuration/intakeSites.d.ts +0 -5
  132. package/cjs/domain/configuration/intakeSites.js +0 -9
  133. package/cjs/domain/configuration/intakeSites.js.map +0 -1
  134. package/cjs/domain/configuration/tags.d.ts +0 -4
  135. package/cjs/domain/configuration/tags.js +0 -39
  136. package/cjs/domain/configuration/tags.js.map +0 -1
  137. package/cjs/domain/configuration/transportConfiguration.d.ts +0 -16
  138. package/cjs/domain/configuration/transportConfiguration.js +0 -42
  139. package/cjs/domain/configuration/transportConfiguration.js.map +0 -1
  140. package/cjs/domain/connectivity/connectivity.d.ts +0 -13
  141. package/cjs/domain/connectivity/connectivity.js +0 -14
  142. package/cjs/domain/connectivity/connectivity.js.map +0 -1
  143. package/cjs/domain/connectivity/index.d.ts +0 -1
  144. package/cjs/domain/connectivity/index.js +0 -18
  145. package/cjs/domain/connectivity/index.js.map +0 -1
  146. package/cjs/domain/console/consoleObservable.d.ts +0 -11
  147. package/cjs/domain/console/consoleObservable.js +0 -72
  148. package/cjs/domain/console/consoleObservable.js.map +0 -1
  149. package/cjs/domain/context/contextConstants.d.ts +0 -5
  150. package/cjs/domain/context/contextConstants.js +0 -3
  151. package/cjs/domain/context/contextConstants.js.map +0 -1
  152. package/cjs/domain/context/contextManager.d.ts +0 -12
  153. package/cjs/domain/context/contextManager.js +0 -43
  154. package/cjs/domain/context/contextManager.js.map +0 -1
  155. package/cjs/domain/context/customerDataTracker.d.ts +0 -45
  156. package/cjs/domain/context/customerDataTracker.js +0 -107
  157. package/cjs/domain/context/customerDataTracker.js.map +0 -1
  158. package/cjs/domain/context/storeContextManager.d.ts +0 -6
  159. package/cjs/domain/context/storeContextManager.js +0 -38
  160. package/cjs/domain/context/storeContextManager.js.map +0 -1
  161. package/cjs/domain/deflate/types.d.ts +0 -0
  162. package/cjs/domain/deflate/types.js +0 -3
  163. package/cjs/domain/deflate/types.js.map +0 -1
  164. package/cjs/domain/error/computeStackTrace.d.ts +0 -33
  165. package/cjs/domain/error/computeStackTrace.js +0 -142
  166. package/cjs/domain/error/computeStackTrace.js.map +0 -1
  167. package/cjs/domain/error/error.d.ts +0 -28
  168. package/cjs/domain/error/error.js +0 -131
  169. package/cjs/domain/error/error.js.map +0 -1
  170. package/cjs/domain/error/error.types.d.ts +0 -40
  171. package/cjs/domain/error/error.types.js +0 -13
  172. package/cjs/domain/error/error.types.js.map +0 -1
  173. package/cjs/domain/error/trackRuntimeError.d.ts +0 -13
  174. package/cjs/domain/error/trackRuntimeError.js +0 -54
  175. package/cjs/domain/error/trackRuntimeError.js.map +0 -1
  176. package/cjs/domain/eventRateLimiter/createEventRateLimiter.d.ts +0 -5
  177. package/cjs/domain/eventRateLimiter/createEventRateLimiter.js +0 -40
  178. package/cjs/domain/eventRateLimiter/createEventRateLimiter.js.map +0 -1
  179. package/cjs/domain/report/browser.types.d.ts +0 -34
  180. package/cjs/domain/report/browser.types.js +0 -3
  181. package/cjs/domain/report/browser.types.js.map +0 -1
  182. package/cjs/domain/report/reportObservable.d.ts +0 -17
  183. package/cjs/domain/report/reportObservable.js +0 -94
  184. package/cjs/domain/report/reportObservable.js.map +0 -1
  185. package/cjs/domain/resourceUtils.d.ts +0 -16
  186. package/cjs/domain/resourceUtils.js +0 -3
  187. package/cjs/domain/resourceUtils.js.map +0 -1
  188. package/cjs/domain/session/oldCookiesMigration.d.ts +0 -11
  189. package/cjs/domain/session/oldCookiesMigration.js +0 -40
  190. package/cjs/domain/session/oldCookiesMigration.js.map +0 -1
  191. package/cjs/domain/session/sessionConstants.d.ts +0 -2
  192. package/cjs/domain/session/sessionConstants.js +0 -7
  193. package/cjs/domain/session/sessionConstants.js.map +0 -1
  194. package/cjs/domain/session/sessionManager.d.ts +0 -20
  195. package/cjs/domain/session/sessionManager.js +0 -65
  196. package/cjs/domain/session/sessionManager.js.map +0 -1
  197. package/cjs/domain/session/sessionState.d.ts +0 -11
  198. package/cjs/domain/session/sessionState.js +0 -45
  199. package/cjs/domain/session/sessionState.js.map +0 -1
  200. package/cjs/domain/session/sessionStore.d.ts +0 -34
  201. package/cjs/domain/session/sessionStore.js +0 -144
  202. package/cjs/domain/session/sessionStore.js.map +0 -1
  203. package/cjs/domain/session/sessionStoreOperations.d.ts +0 -10
  204. package/cjs/domain/session/sessionStoreOperations.js +0 -96
  205. package/cjs/domain/session/sessionStoreOperations.js.map +0 -1
  206. package/cjs/domain/session/storeStrategies/sessionInCookie.d.ts +0 -6
  207. package/cjs/domain/session/storeStrategies/sessionInCookie.js +0 -59
  208. package/cjs/domain/session/storeStrategies/sessionInCookie.js.map +0 -1
  209. package/cjs/domain/session/storeStrategies/sessionInLocalStorage.d.ts +0 -3
  210. package/cjs/domain/session/storeStrategies/sessionInLocalStorage.js +0 -41
  211. package/cjs/domain/session/storeStrategies/sessionInLocalStorage.js.map +0 -1
  212. package/cjs/domain/session/storeStrategies/sessionStoreStrategy.d.ts +0 -15
  213. package/cjs/domain/session/storeStrategies/sessionStoreStrategy.js +0 -5
  214. package/cjs/domain/session/storeStrategies/sessionStoreStrategy.js.map +0 -1
  215. package/cjs/domain/synthetics/syntheticsWorkerValues.d.ts +0 -11
  216. package/cjs/domain/synthetics/syntheticsWorkerValues.js +0 -22
  217. package/cjs/domain/synthetics/syntheticsWorkerValues.js.map +0 -1
  218. package/cjs/domain/telemetry/index.d.ts +0 -3
  219. package/cjs/domain/telemetry/index.js +0 -28
  220. package/cjs/domain/telemetry/index.js.map +0 -1
  221. package/cjs/domain/telemetry/rawTelemetryEvent.types.d.ts +0 -15
  222. package/cjs/domain/telemetry/rawTelemetryEvent.types.js +0 -8
  223. package/cjs/domain/telemetry/rawTelemetryEvent.types.js.map +0 -1
  224. package/cjs/domain/telemetry/telemetry.d.ts +0 -116
  225. package/cjs/domain/telemetry/telemetry.js +0 -157
  226. package/cjs/domain/telemetry/telemetry.js.map +0 -1
  227. package/cjs/domain/telemetry/telemetryEvent.types.d.ts +0 -391
  228. package/cjs/domain/telemetry/telemetryEvent.types.js +0 -7
  229. package/cjs/domain/telemetry/telemetryEvent.types.js.map +0 -1
  230. package/cjs/domain/user/index.d.ts +0 -2
  231. package/cjs/domain/user/index.js +0 -19
  232. package/cjs/domain/user/index.js.map +0 -1
  233. package/cjs/domain/user/user.d.ts +0 -12
  234. package/cjs/domain/user/user.js +0 -35
  235. package/cjs/domain/user/user.js.map +0 -1
  236. package/cjs/domain/user/user.types.d.ts +0 -6
  237. package/cjs/domain/user/user.types.js +0 -3
  238. package/cjs/domain/user/user.types.js.map +0 -1
  239. package/cjs/tools/abstractLifeCycle.d.ts +0 -23
  240. package/cjs/tools/abstractLifeCycle.js +0 -29
  241. package/cjs/tools/abstractLifeCycle.js.map +0 -1
  242. package/cjs/tools/boundedBuffer.d.ts +0 -5
  243. package/cjs/tools/boundedBuffer.js +0 -22
  244. package/cjs/tools/boundedBuffer.js.map +0 -1
  245. package/cjs/tools/catchUserErrors.d.ts +0 -1
  246. package/cjs/tools/catchUserErrors.js +0 -20
  247. package/cjs/tools/catchUserErrors.js.map +0 -1
  248. package/cjs/tools/display.d.ts +0 -35
  249. package/cjs/tools/display.js +0 -41
  250. package/cjs/tools/display.js.map +0 -1
  251. package/cjs/tools/encoder.d.ts +0 -53
  252. package/cjs/tools/encoder.js +0 -41
  253. package/cjs/tools/encoder.js.map +0 -1
  254. package/cjs/tools/experimentalFeatures.d.ts +0 -22
  255. package/cjs/tools/experimentalFeatures.js +0 -45
  256. package/cjs/tools/experimentalFeatures.js.map +0 -1
  257. package/cjs/tools/getGlobalObject.d.ts +0 -4
  258. package/cjs/tools/getGlobalObject.js +0 -37
  259. package/cjs/tools/getGlobalObject.js.map +0 -1
  260. package/cjs/tools/getZoneJsOriginalValue.d.ts +0 -19
  261. package/cjs/tools/getZoneJsOriginalValue.js +0 -30
  262. package/cjs/tools/getZoneJsOriginalValue.js.map +0 -1
  263. package/cjs/tools/instrumentMethod.d.ts +0 -59
  264. package/cjs/tools/instrumentMethod.js +0 -106
  265. package/cjs/tools/instrumentMethod.js.map +0 -1
  266. package/cjs/tools/matchOption.d.ts +0 -8
  267. package/cjs/tools/matchOption.js +0 -38
  268. package/cjs/tools/matchOption.js.map +0 -1
  269. package/cjs/tools/mergeInto.d.ts +0 -25
  270. package/cjs/tools/mergeInto.js +0 -105
  271. package/cjs/tools/mergeInto.js.map +0 -1
  272. package/cjs/tools/monitor.d.ts +0 -8
  273. package/cjs/tools/monitor.js +0 -76
  274. package/cjs/tools/monitor.js.map +0 -1
  275. package/cjs/tools/observable.d.ts +0 -12
  276. package/cjs/tools/observable.js +0 -43
  277. package/cjs/tools/observable.js.map +0 -1
  278. package/cjs/tools/readBytesFromStream.d.ts +0 -11
  279. package/cjs/tools/readBytesFromStream.js +0 -64
  280. package/cjs/tools/readBytesFromStream.js.map +0 -1
  281. package/cjs/tools/sendToExtension.d.ts +0 -3
  282. package/cjs/tools/sendToExtension.js +0 -11
  283. package/cjs/tools/sendToExtension.js.map +0 -1
  284. package/cjs/tools/serialisation/context.d.ts +0 -6
  285. package/cjs/tools/serialisation/context.js +0 -3
  286. package/cjs/tools/serialisation/context.js.map +0 -1
  287. package/cjs/tools/serialisation/jsonStringify.d.ts +0 -13
  288. package/cjs/tools/serialisation/jsonStringify.js +0 -49
  289. package/cjs/tools/serialisation/jsonStringify.js.map +0 -1
  290. package/cjs/tools/serialisation/sanitize.d.ts +0 -18
  291. package/cjs/tools/serialisation/sanitize.js +0 -185
  292. package/cjs/tools/serialisation/sanitize.js.map +0 -1
  293. package/cjs/tools/timer.d.ts +0 -5
  294. package/cjs/tools/timer.js +0 -23
  295. package/cjs/tools/timer.js.map +0 -1
  296. package/cjs/tools/utils/arrayUtils.d.ts +0 -1
  297. package/cjs/tools/utils/arrayUtils.js +0 -11
  298. package/cjs/tools/utils/arrayUtils.js.map +0 -1
  299. package/cjs/tools/utils/browserDetection.d.ts +0 -10
  300. package/cjs/tools/utils/browserDetection.js +0 -42
  301. package/cjs/tools/utils/browserDetection.js.map +0 -1
  302. package/cjs/tools/utils/byteUtils.d.ts +0 -4
  303. package/cjs/tools/utils/byteUtils.js +0 -31
  304. package/cjs/tools/utils/byteUtils.js.map +0 -1
  305. package/cjs/tools/utils/functionUtils.d.ts +0 -9
  306. package/cjs/tools/utils/functionUtils.js +0 -48
  307. package/cjs/tools/utils/functionUtils.js.map +0 -1
  308. package/cjs/tools/utils/numberUtils.d.ts +0 -8
  309. package/cjs/tools/utils/numberUtils.js +0 -24
  310. package/cjs/tools/utils/numberUtils.js.map +0 -1
  311. package/cjs/tools/utils/objectUtils.d.ts +0 -10
  312. package/cjs/tools/utils/objectUtils.js +0 -26
  313. package/cjs/tools/utils/objectUtils.js.map +0 -1
  314. package/cjs/tools/utils/polyfills.d.ts +0 -24
  315. package/cjs/tools/utils/polyfills.js +0 -110
  316. package/cjs/tools/utils/polyfills.js.map +0 -1
  317. package/cjs/tools/utils/responseUtils.d.ts +0 -2
  318. package/cjs/tools/utils/responseUtils.js +0 -18
  319. package/cjs/tools/utils/responseUtils.js.map +0 -1
  320. package/cjs/tools/utils/stringUtils.d.ts +0 -8
  321. package/cjs/tools/utils/stringUtils.js +0 -59
  322. package/cjs/tools/utils/stringUtils.js.map +0 -1
  323. package/cjs/tools/utils/timeUtils.d.ts +0 -57
  324. package/cjs/tools/utils/timeUtils.js +0 -99
  325. package/cjs/tools/utils/timeUtils.js.map +0 -1
  326. package/cjs/tools/utils/typeUtils.d.ts +0 -4
  327. package/cjs/tools/utils/typeUtils.js +0 -17
  328. package/cjs/tools/utils/typeUtils.js.map +0 -1
  329. package/cjs/tools/utils/urlPolyfill.d.ts +0 -14
  330. package/cjs/tools/utils/urlPolyfill.js +0 -92
  331. package/cjs/tools/utils/urlPolyfill.js.map +0 -1
  332. package/cjs/tools/valueHistory.d.ts +0 -50
  333. package/cjs/tools/valueHistory.js +0 -106
  334. package/cjs/tools/valueHistory.js.map +0 -1
  335. package/cjs/transport/batch.d.ts +0 -21
  336. package/cjs/transport/batch.js +0 -123
  337. package/cjs/transport/batch.js.map +0 -1
  338. package/cjs/transport/eventBridge.d.ts +0 -12
  339. package/cjs/transport/eventBridge.js +0 -34
  340. package/cjs/transport/eventBridge.js.map +0 -1
  341. package/cjs/transport/flushController.d.ts +0 -58
  342. package/cjs/transport/flushController.js +0 -112
  343. package/cjs/transport/flushController.js.map +0 -1
  344. package/cjs/transport/httpRequest.d.ts +0 -38
  345. package/cjs/transport/httpRequest.js +0 -95
  346. package/cjs/transport/httpRequest.js.map +0 -1
  347. package/cjs/transport/index.d.ts +0 -4
  348. package/cjs/transport/index.js +0 -13
  349. package/cjs/transport/index.js.map +0 -1
  350. package/cjs/transport/sendWithRetryStrategy.d.ts +0 -39
  351. package/cjs/transport/sendWithRetryStrategy.js +0 -151
  352. package/cjs/transport/sendWithRetryStrategy.js.map +0 -1
  353. package/cjs/transport/startBatchWithReplica.d.ts +0 -20
  354. package/cjs/transport/startBatchWithReplica.js +0 -42
  355. package/cjs/transport/startBatchWithReplica.js.map +0 -1
  356. package/esm/boot/init.d.ts +0 -5
  357. package/esm/boot/init.js +0 -31
  358. package/esm/boot/init.js.map +0 -1
  359. package/esm/browser/addEventListener.d.ts +0 -84
  360. package/esm/browser/addEventListener.js +0 -89
  361. package/esm/browser/addEventListener.js.map +0 -1
  362. package/esm/browser/cookie.d.ts +0 -17
  363. package/esm/browser/cookie.js +0 -76
  364. package/esm/browser/cookie.js.map +0 -1
  365. package/esm/browser/fetchObservable.d.ts +0 -23
  366. package/esm/browser/fetchObservable.js +0 -65
  367. package/esm/browser/fetchObservable.js.map +0 -1
  368. package/esm/browser/pageExitObservable.d.ts +0 -14
  369. package/esm/browser/pageExitObservable.js +0 -52
  370. package/esm/browser/pageExitObservable.js.map +0 -1
  371. package/esm/browser/runOnReadyState.d.ts +0 -2
  372. package/esm/browser/runOnReadyState.js +0 -11
  373. package/esm/browser/runOnReadyState.js.map +0 -1
  374. package/esm/browser/types.d.ts +0 -19
  375. package/esm/browser/types.js +0 -5
  376. package/esm/browser/types.js.map +0 -1
  377. package/esm/browser/xhrObservable.d.ts +0 -21
  378. package/esm/browser/xhrObservable.js +0 -81
  379. package/esm/browser/xhrObservable.js.map +0 -1
  380. package/esm/domain/configuration/configuration.d.ts +0 -72
  381. package/esm/domain/configuration/configuration.js +0 -89
  382. package/esm/domain/configuration/configuration.js.map +0 -1
  383. package/esm/domain/configuration/endpointBuilder.d.ts +0 -10
  384. package/esm/domain/configuration/endpointBuilder.js +0 -80
  385. package/esm/domain/configuration/endpointBuilder.js.map +0 -1
  386. package/esm/domain/configuration/index.d.ts +0 -4
  387. package/esm/domain/configuration/index.js +0 -5
  388. package/esm/domain/configuration/index.js.map +0 -1
  389. package/esm/domain/configuration/intakeSites.d.ts +0 -5
  390. package/esm/domain/configuration/intakeSites.js +0 -6
  391. package/esm/domain/configuration/intakeSites.js.map +0 -1
  392. package/esm/domain/configuration/tags.d.ts +0 -4
  393. package/esm/domain/configuration/tags.js +0 -34
  394. package/esm/domain/configuration/tags.js.map +0 -1
  395. package/esm/domain/configuration/transportConfiguration.d.ts +0 -16
  396. package/esm/domain/configuration/transportConfiguration.js +0 -38
  397. package/esm/domain/configuration/transportConfiguration.js.map +0 -1
  398. package/esm/domain/connectivity/connectivity.d.ts +0 -13
  399. package/esm/domain/connectivity/connectivity.js +0 -10
  400. package/esm/domain/connectivity/connectivity.js.map +0 -1
  401. package/esm/domain/connectivity/index.d.ts +0 -1
  402. package/esm/domain/connectivity/index.js +0 -2
  403. package/esm/domain/connectivity/index.js.map +0 -1
  404. package/esm/domain/console/consoleObservable.d.ts +0 -11
  405. package/esm/domain/console/consoleObservable.js +0 -67
  406. package/esm/domain/console/consoleObservable.js.map +0 -1
  407. package/esm/domain/context/contextConstants.d.ts +0 -5
  408. package/esm/domain/context/contextConstants.js +0 -2
  409. package/esm/domain/context/contextConstants.js.map +0 -1
  410. package/esm/domain/context/contextManager.d.ts +0 -12
  411. package/esm/domain/context/contextManager.js +0 -39
  412. package/esm/domain/context/contextManager.js.map +0 -1
  413. package/esm/domain/context/customerDataTracker.d.ts +0 -45
  414. package/esm/domain/context/customerDataTracker.js +0 -102
  415. package/esm/domain/context/customerDataTracker.js.map +0 -1
  416. package/esm/domain/context/storeContextManager.d.ts +0 -6
  417. package/esm/domain/context/storeContextManager.js +0 -32
  418. package/esm/domain/context/storeContextManager.js.map +0 -1
  419. package/esm/domain/deflate/index.d.ts +0 -1
  420. package/esm/domain/deflate/index.js +0 -2
  421. package/esm/domain/deflate/index.js.map +0 -1
  422. package/esm/domain/deflate/types.d.ts +0 -38
  423. package/esm/domain/deflate/types.js +0 -2
  424. package/esm/domain/deflate/types.js.map +0 -1
  425. package/esm/domain/error/computeStackTrace.d.ts +0 -33
  426. package/esm/domain/error/computeStackTrace.js +0 -137
  427. package/esm/domain/error/computeStackTrace.js.map +0 -1
  428. package/esm/domain/error/error.d.ts +0 -28
  429. package/esm/domain/error/error.js +0 -121
  430. package/esm/domain/error/error.js.map +0 -1
  431. package/esm/domain/error/error.types.d.ts +0 -40
  432. package/esm/domain/error/error.types.js +0 -10
  433. package/esm/domain/error/error.types.js.map +0 -1
  434. package/esm/domain/error/trackRuntimeError.d.ts +0 -13
  435. package/esm/domain/error/trackRuntimeError.js +0 -48
  436. package/esm/domain/error/trackRuntimeError.js.map +0 -1
  437. package/esm/domain/eventRateLimiter/createEventRateLimiter.d.ts +0 -5
  438. package/esm/domain/eventRateLimiter/createEventRateLimiter.js +0 -36
  439. package/esm/domain/eventRateLimiter/createEventRateLimiter.js.map +0 -1
  440. package/esm/domain/report/browser.types.d.ts +0 -34
  441. package/esm/domain/report/browser.types.js +0 -2
  442. package/esm/domain/report/browser.types.js.map +0 -1
  443. package/esm/domain/report/reportObservable.d.ts +0 -17
  444. package/esm/domain/report/reportObservable.js +0 -90
  445. package/esm/domain/report/reportObservable.js.map +0 -1
  446. package/esm/domain/resourceUtils.d.ts +0 -16
  447. package/esm/domain/resourceUtils.js +0 -2
  448. package/esm/domain/resourceUtils.js.map +0 -1
  449. package/esm/domain/session/oldCookiesMigration.d.ts +0 -11
  450. package/esm/domain/session/oldCookiesMigration.js +0 -36
  451. package/esm/domain/session/oldCookiesMigration.js.map +0 -1
  452. package/esm/domain/session/sessionConstants.d.ts +0 -2
  453. package/esm/domain/session/sessionConstants.js +0 -4
  454. package/esm/domain/session/sessionConstants.js.map +0 -1
  455. package/esm/domain/session/sessionManager.d.ts +0 -20
  456. package/esm/domain/session/sessionManager.js +0 -60
  457. package/esm/domain/session/sessionManager.js.map +0 -1
  458. package/esm/domain/session/sessionState.d.ts +0 -11
  459. package/esm/domain/session/sessionState.js +0 -38
  460. package/esm/domain/session/sessionState.js.map +0 -1
  461. package/esm/domain/session/sessionStore.d.ts +0 -34
  462. package/esm/domain/session/sessionStore.js +0 -139
  463. package/esm/domain/session/sessionStore.js.map +0 -1
  464. package/esm/domain/session/sessionStoreOperations.d.ts +0 -10
  465. package/esm/domain/session/sessionStoreOperations.js +0 -92
  466. package/esm/domain/session/sessionStoreOperations.js.map +0 -1
  467. package/esm/domain/session/storeStrategies/sessionInCookie.d.ts +0 -6
  468. package/esm/domain/session/storeStrategies/sessionInCookie.js +0 -53
  469. package/esm/domain/session/storeStrategies/sessionInCookie.js.map +0 -1
  470. package/esm/domain/session/storeStrategies/sessionInLocalStorage.d.ts +0 -3
  471. package/esm/domain/session/storeStrategies/sessionInLocalStorage.js +0 -36
  472. package/esm/domain/session/storeStrategies/sessionInLocalStorage.js.map +0 -1
  473. package/esm/domain/session/storeStrategies/sessionStoreStrategy.d.ts +0 -15
  474. package/esm/domain/session/storeStrategies/sessionStoreStrategy.js +0 -2
  475. package/esm/domain/session/storeStrategies/sessionStoreStrategy.js.map +0 -1
  476. package/esm/domain/synthetics/syntheticsWorkerValues.d.ts +0 -11
  477. package/esm/domain/synthetics/syntheticsWorkerValues.js +0 -16
  478. package/esm/domain/synthetics/syntheticsWorkerValues.js.map +0 -1
  479. package/esm/domain/telemetry/index.d.ts +0 -3
  480. package/esm/domain/telemetry/index.js +0 -4
  481. package/esm/domain/telemetry/index.js.map +0 -1
  482. package/esm/domain/telemetry/rawTelemetryEvent.types.d.ts +0 -15
  483. package/esm/domain/telemetry/rawTelemetryEvent.types.js +0 -5
  484. package/esm/domain/telemetry/rawTelemetryEvent.types.js.map +0 -1
  485. package/esm/domain/telemetry/telemetry.d.ts +0 -116
  486. package/esm/domain/telemetry/telemetry.js +0 -145
  487. package/esm/domain/telemetry/telemetry.js.map +0 -1
  488. package/esm/domain/telemetry/telemetryEvent.types.d.ts +0 -391
  489. package/esm/domain/telemetry/telemetryEvent.types.js +0 -6
  490. package/esm/domain/telemetry/telemetryEvent.types.js.map +0 -1
  491. package/esm/domain/user/index.d.ts +0 -2
  492. package/esm/domain/user/index.js +0 -3
  493. package/esm/domain/user/index.js.map +0 -1
  494. package/esm/domain/user/user.d.ts +0 -12
  495. package/esm/domain/user/user.js +0 -30
  496. package/esm/domain/user/user.js.map +0 -1
  497. package/esm/domain/user/user.types.d.ts +0 -6
  498. package/esm/domain/user/user.types.js +0 -2
  499. package/esm/domain/user/user.types.js.map +0 -1
  500. package/esm/index.d.ts +0 -67
  501. package/esm/index.js +0 -64
  502. package/esm/index.js.map +0 -1
  503. package/esm/tools/abstractLifeCycle.d.ts +0 -23
  504. package/esm/tools/abstractLifeCycle.js +0 -26
  505. package/esm/tools/abstractLifeCycle.js.map +0 -1
  506. package/esm/tools/boundedBuffer.d.ts +0 -5
  507. package/esm/tools/boundedBuffer.js +0 -19
  508. package/esm/tools/boundedBuffer.js.map +0 -1
  509. package/esm/tools/catchUserErrors.d.ts +0 -1
  510. package/esm/tools/catchUserErrors.js +0 -16
  511. package/esm/tools/catchUserErrors.js.map +0 -1
  512. package/esm/tools/display.d.ts +0 -35
  513. package/esm/tools/display.js +0 -38
  514. package/esm/tools/display.js.map +0 -1
  515. package/esm/tools/encoder.d.ts +0 -53
  516. package/esm/tools/encoder.js +0 -37
  517. package/esm/tools/encoder.js.map +0 -1
  518. package/esm/tools/experimentalFeatures.d.ts +0 -22
  519. package/esm/tools/experimentalFeatures.js +0 -38
  520. package/esm/tools/experimentalFeatures.js.map +0 -1
  521. package/esm/tools/getGlobalObject.d.ts +0 -4
  522. package/esm/tools/getGlobalObject.js +0 -33
  523. package/esm/tools/getGlobalObject.js.map +0 -1
  524. package/esm/tools/getZoneJsOriginalValue.d.ts +0 -19
  525. package/esm/tools/getZoneJsOriginalValue.js +0 -26
  526. package/esm/tools/getZoneJsOriginalValue.js.map +0 -1
  527. package/esm/tools/instrumentMethod.d.ts +0 -59
  528. package/esm/tools/instrumentMethod.js +0 -101
  529. package/esm/tools/instrumentMethod.js.map +0 -1
  530. package/esm/tools/matchOption.d.ts +0 -8
  531. package/esm/tools/matchOption.js +0 -33
  532. package/esm/tools/matchOption.js.map +0 -1
  533. package/esm/tools/mergeInto.d.ts +0 -25
  534. package/esm/tools/mergeInto.js +0 -99
  535. package/esm/tools/mergeInto.js.map +0 -1
  536. package/esm/tools/monitor.d.ts +0 -8
  537. package/esm/tools/monitor.js +0 -66
  538. package/esm/tools/monitor.js.map +0 -1
  539. package/esm/tools/observable.d.ts +0 -12
  540. package/esm/tools/observable.js +0 -39
  541. package/esm/tools/observable.js.map +0 -1
  542. package/esm/tools/readBytesFromStream.d.ts +0 -11
  543. package/esm/tools/readBytesFromStream.js +0 -60
  544. package/esm/tools/readBytesFromStream.js.map +0 -1
  545. package/esm/tools/sendToExtension.d.ts +0 -3
  546. package/esm/tools/sendToExtension.js +0 -7
  547. package/esm/tools/sendToExtension.js.map +0 -1
  548. package/esm/tools/serialisation/context.d.ts +0 -6
  549. package/esm/tools/serialisation/context.js +0 -2
  550. package/esm/tools/serialisation/context.js.map +0 -1
  551. package/esm/tools/serialisation/jsonStringify.d.ts +0 -13
  552. package/esm/tools/serialisation/jsonStringify.js +0 -44
  553. package/esm/tools/serialisation/jsonStringify.js.map +0 -1
  554. package/esm/tools/serialisation/sanitize.d.ts +0 -18
  555. package/esm/tools/serialisation/sanitize.js +0 -181
  556. package/esm/tools/serialisation/sanitize.js.map +0 -1
  557. package/esm/tools/timer.d.ts +0 -5
  558. package/esm/tools/timer.js +0 -16
  559. package/esm/tools/timer.js.map +0 -1
  560. package/esm/tools/utils/arrayUtils.d.ts +0 -1
  561. package/esm/tools/utils/arrayUtils.js +0 -7
  562. package/esm/tools/utils/arrayUtils.js.map +0 -1
  563. package/esm/tools/utils/browserDetection.d.ts +0 -10
  564. package/esm/tools/utils/browserDetection.js +0 -35
  565. package/esm/tools/utils/browserDetection.js.map +0 -1
  566. package/esm/tools/utils/byteUtils.d.ts +0 -4
  567. package/esm/tools/utils/byteUtils.js +0 -26
  568. package/esm/tools/utils/byteUtils.js.map +0 -1
  569. package/esm/tools/utils/functionUtils.d.ts +0 -9
  570. package/esm/tools/utils/functionUtils.js +0 -43
  571. package/esm/tools/utils/functionUtils.js.map +0 -1
  572. package/esm/tools/utils/numberUtils.d.ts +0 -8
  573. package/esm/tools/utils/numberUtils.js +0 -17
  574. package/esm/tools/utils/numberUtils.js.map +0 -1
  575. package/esm/tools/utils/objectUtils.d.ts +0 -10
  576. package/esm/tools/utils/objectUtils.js +0 -19
  577. package/esm/tools/utils/objectUtils.js.map +0 -1
  578. package/esm/tools/utils/polyfills.d.ts +0 -24
  579. package/esm/tools/utils/polyfills.js +0 -95
  580. package/esm/tools/utils/polyfills.js.map +0 -1
  581. package/esm/tools/utils/responseUtils.d.ts +0 -2
  582. package/esm/tools/utils/responseUtils.js +0 -13
  583. package/esm/tools/utils/responseUtils.js.map +0 -1
  584. package/esm/tools/utils/stringUtils.d.ts +0 -8
  585. package/esm/tools/utils/stringUtils.js +0 -52
  586. package/esm/tools/utils/stringUtils.js.map +0 -1
  587. package/esm/tools/utils/timeUtils.d.ts +0 -57
  588. package/esm/tools/utils/timeUtils.js +0 -82
  589. package/esm/tools/utils/timeUtils.js.map +0 -1
  590. package/esm/tools/utils/typeUtils.d.ts +0 -4
  591. package/esm/tools/utils/typeUtils.js +0 -13
  592. package/esm/tools/utils/typeUtils.js.map +0 -1
  593. package/esm/tools/utils/urlPolyfill.d.ts +0 -14
  594. package/esm/tools/utils/urlPolyfill.js +0 -80
  595. package/esm/tools/utils/urlPolyfill.js.map +0 -1
  596. package/esm/tools/valueHistory.d.ts +0 -50
  597. package/esm/tools/valueHistory.js +0 -103
  598. package/esm/tools/valueHistory.js.map +0 -1
  599. package/esm/transport/batch.d.ts +0 -21
  600. package/esm/transport/batch.js +0 -120
  601. package/esm/transport/batch.js.map +0 -1
  602. package/esm/transport/eventBridge.d.ts +0 -12
  603. package/esm/transport/eventBridge.js +0 -29
  604. package/esm/transport/eventBridge.js.map +0 -1
  605. package/esm/transport/flushController.d.ts +0 -58
  606. package/esm/transport/flushController.js +0 -108
  607. package/esm/transport/flushController.js.map +0 -1
  608. package/esm/transport/httpRequest.d.ts +0 -38
  609. package/esm/transport/httpRequest.js +0 -89
  610. package/esm/transport/httpRequest.js.map +0 -1
  611. package/esm/transport/index.d.ts +0 -4
  612. package/esm/transport/index.js +0 -5
  613. package/esm/transport/index.js.map +0 -1
  614. package/esm/transport/sendWithRetryStrategy.d.ts +0 -39
  615. package/esm/transport/sendWithRetryStrategy.js +0 -146
  616. package/esm/transport/sendWithRetryStrategy.js.map +0 -1
  617. package/esm/transport/startBatchWithReplica.d.ts +0 -20
  618. package/esm/transport/startBatchWithReplica.js +0 -38
  619. package/esm/transport/startBatchWithReplica.js.map +0 -1
  620. package/src/domain/configuration/intakeSites.ts +0 -5
  621. package/src/domain/configuration/tags.ts +0 -43
  622. package/src/domain/context/customerDataTracker.ts +0 -134
  623. package/src/domain/user/index.ts +0 -2
  624. package/src/domain/user/user.ts +0 -33
  625. package/src/domain/user/user.types.ts +0 -6
  626. package/src/transport/startBatchWithReplica.ts +0 -68
@@ -1,59 +1,97 @@
1
- import { display } from '../tools/display'
1
+ import { DOCS_TROUBLESHOOTING, MORE_DETAILS, display } from '../tools/display'
2
2
  import type { Context } from '../tools/serialisation/context'
3
3
  import { objectValues } from '../tools/utils/polyfills'
4
- import { isPageExitReason } from '../browser/pageExitObservable'
4
+ import { isPageExitReason } from '../browser/pageMayExitObservable'
5
5
  import { jsonStringify } from '../tools/serialisation/jsonStringify'
6
- import type { Subscription } from '../tools/observable'
7
6
  import type { Encoder, EncoderResult } from '../tools/encoder'
8
- import { computeBytesCount } from '../tools/utils/byteUtils'
7
+ import { computeBytesCount, ONE_KIBI_BYTE } from '../tools/utils/byteUtils'
9
8
  import type { HttpRequest, Payload } from './httpRequest'
10
9
  import type { FlushController, FlushEvent } from './flushController'
11
10
 
12
- export class Batch {
13
- private upsertBuffer: { [key: string]: string } = {}
14
- private flushSubscription: Subscription
15
-
16
- constructor(
17
- private encoder: Encoder,
18
- private request: HttpRequest,
19
- public flushController: FlushController,
20
- private messageBytesLimit: number
21
- ) {
22
- this.flushSubscription = this.flushController.flushObservable.subscribe((event) => this.flush(event))
11
+ export const MESSAGE_BYTES_LIMIT = 256 * ONE_KIBI_BYTE
12
+
13
+ export interface Batch {
14
+ flushController: FlushController
15
+ add: (message: Context) => void
16
+ upsert: (message: Context, key: string) => void
17
+ stop: () => void
18
+ }
19
+
20
+ export function createBatch({
21
+ encoder,
22
+ request,
23
+ flushController,
24
+ }: {
25
+ encoder: Encoder
26
+ request: HttpRequest
27
+ flushController: FlushController
28
+ }): Batch {
29
+ let upsertBuffer: { [key: string]: string } = {}
30
+ const flushSubscription = flushController.flushObservable.subscribe((event) => flush(event))
31
+
32
+ function push(serializedMessage: string, estimatedMessageBytesCount: number, key?: string) {
33
+ flushController.notifyBeforeAddMessage(estimatedMessageBytesCount)
34
+
35
+ if (key !== undefined) {
36
+ upsertBuffer[key] = serializedMessage
37
+ flushController.notifyAfterAddMessage()
38
+ } else {
39
+ encoder.write(encoder.isEmpty ? serializedMessage : `\n${serializedMessage}`, (realMessageBytesCount) => {
40
+ flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount)
41
+ })
42
+ }
23
43
  }
24
44
 
25
- add(message: Context) {
26
- this.addOrUpdate(message)
45
+ function hasMessageFor(key?: string): key is string {
46
+ return key !== undefined && upsertBuffer[key] !== undefined
27
47
  }
28
48
 
29
- upsert(message: Context, key: string) {
30
- this.addOrUpdate(message, key)
49
+ function remove(key: string) {
50
+ const removedMessage = upsertBuffer[key]
51
+ delete upsertBuffer[key]
52
+ const messageBytesCount = encoder.estimateEncodedBytesCount(removedMessage)
53
+ flushController.notifyAfterRemoveMessage(messageBytesCount)
31
54
  }
32
55
 
33
- stop() {
34
- this.flushSubscription.unsubscribe()
56
+ function addOrUpdate(message: Context, key?: string) {
57
+ const serializedMessage = jsonStringify(message)!
58
+
59
+ const estimatedMessageBytesCount = encoder.estimateEncodedBytesCount(serializedMessage)
60
+
61
+ if (estimatedMessageBytesCount >= MESSAGE_BYTES_LIMIT) {
62
+ display.warn(
63
+ `Discarded a message whose size was bigger than the maximum allowed size ${MESSAGE_BYTES_LIMIT / ONE_KIBI_BYTE}KiB. ${MORE_DETAILS} ${DOCS_TROUBLESHOOTING}/#technical-limitations`
64
+ )
65
+ return
66
+ }
67
+
68
+ if (hasMessageFor(key)) {
69
+ remove(key)
70
+ }
71
+
72
+ push(serializedMessage, estimatedMessageBytesCount, key)
35
73
  }
36
74
 
37
- private flush(event: FlushEvent) {
38
- const upsertMessages = objectValues(this.upsertBuffer).join('\n')
39
- this.upsertBuffer = {}
75
+ function flush(event: FlushEvent) {
76
+ const upsertMessages = objectValues(upsertBuffer).join('\n')
77
+ upsertBuffer = {}
40
78
 
41
- const isPageExit = isPageExitReason(event.reason)
42
- const send = isPageExit ? this.request.sendOnExit : this.request.send
79
+ const pageMightExit = isPageExitReason(event.reason)
80
+ const send = pageMightExit ? request.sendOnExit : request.send
43
81
 
44
82
  if (
45
- isPageExit &&
83
+ pageMightExit &&
46
84
  // Note: checking that the encoder is async is not strictly needed, but it's an optimization:
47
85
  // if the encoder is async we need to send two requests in some cases (one for encoded data
48
86
  // and the other for non-encoded data). But if it's not async, we don't have to worry about
49
87
  // it and always send a single request.
50
- this.encoder.isAsync
88
+ encoder.isAsync
51
89
  ) {
52
- const encoderResult = this.encoder.finishSync()
90
+ const encoderResult = encoder.finishSync()
53
91
 
54
92
  // Send encoded messages
55
93
  if (encoderResult.outputBytesCount) {
56
- send(formatPayloadFromEncoder(encoderResult, event))
94
+ send(formatPayloadFromEncoder(encoderResult))
57
95
  }
58
96
 
59
97
  // Send messages that are not yet encoded at this point
@@ -62,67 +100,27 @@ export class Batch {
62
100
  send({
63
101
  data: pendingMessages,
64
102
  bytesCount: computeBytesCount(pendingMessages),
65
- flushReason: event.reason,
66
103
  })
67
104
  }
68
105
  } else {
69
106
  if (upsertMessages) {
70
- this.encoder.write(this.encoder.isEmpty ? upsertMessages : `\n${upsertMessages}`)
107
+ encoder.write(encoder.isEmpty ? upsertMessages : `\n${upsertMessages}`)
71
108
  }
72
- this.encoder.finish((encoderResult) => {
73
- send(formatPayloadFromEncoder(encoderResult, event))
109
+ encoder.finish((encoderResult) => {
110
+ send(formatPayloadFromEncoder(encoderResult))
74
111
  })
75
112
  }
76
113
  }
77
114
 
78
- private addOrUpdate(message: Context, key?: string) {
79
- const serializedMessage = jsonStringify(message)!
80
-
81
- const estimatedMessageBytesCount = this.encoder.estimateEncodedBytesCount(serializedMessage)
82
-
83
- if (estimatedMessageBytesCount >= this.messageBytesLimit) {
84
- display.warn(
85
- `Discarded a message whose size was bigger than the maximum allowed size ${this.messageBytesLimit}KB.`
86
- )
87
- return
88
- }
89
-
90
- if (this.hasMessageFor(key)) {
91
- this.remove(key)
92
- }
93
-
94
- this.push(serializedMessage, estimatedMessageBytesCount, key)
95
- }
96
-
97
- private push(serializedMessage: string, estimatedMessageBytesCount: number, key?: string) {
98
- this.flushController.notifyBeforeAddMessage(estimatedMessageBytesCount)
99
-
100
- if (key !== undefined) {
101
- this.upsertBuffer[key] = serializedMessage
102
- this.flushController.notifyAfterAddMessage()
103
- } else {
104
- this.encoder.write(
105
- this.encoder.isEmpty ? serializedMessage : `\n${serializedMessage}`,
106
- (realMessageBytesCount) => {
107
- this.flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount)
108
- }
109
- )
110
- }
111
- }
112
-
113
- private remove(key: string) {
114
- const removedMessage = this.upsertBuffer[key]
115
- delete this.upsertBuffer[key]
116
- const messageBytesCount = this.encoder.estimateEncodedBytesCount(removedMessage)
117
- this.flushController.notifyAfterRemoveMessage(messageBytesCount)
118
- }
119
-
120
- private hasMessageFor(key?: string): key is string {
121
- return key !== undefined && this.upsertBuffer[key] !== undefined
115
+ return {
116
+ flushController,
117
+ add: addOrUpdate,
118
+ upsert: addOrUpdate,
119
+ stop: flushSubscription.unsubscribe,
122
120
  }
123
121
  }
124
122
 
125
- function formatPayloadFromEncoder(encoderResult: EncoderResult, flushEvent: FlushEvent): Payload {
123
+ function formatPayloadFromEncoder(encoderResult: EncoderResult): Payload {
126
124
  let data: string | Blob
127
125
  if (typeof encoderResult.output === 'string') {
128
126
  data = encoderResult.output
@@ -142,6 +140,5 @@ function formatPayloadFromEncoder(encoderResult: EncoderResult, flushEvent: Flus
142
140
  data,
143
141
  bytesCount: encoderResult.outputBytesCount,
144
142
  encoding: encoderResult.encoding,
145
- flushReason: flushEvent.reason,
146
143
  }
147
144
  }
@@ -1,15 +1,21 @@
1
- import { endsWith } from '../tools/utils/polyfills'
2
- import { getGlobalObject } from '../tools/getGlobalObject'
1
+ import { getGlobalObject } from '../tools/globalObject'
2
+ import type { DefaultPrivacyLevel } from '../domain/configuration'
3
3
 
4
4
  export interface BrowserWindowWithEventBridge extends Window {
5
5
  DatadogEventBridge?: DatadogEventBridge
6
6
  }
7
7
 
8
8
  export interface DatadogEventBridge {
9
+ getCapabilities?(): string
10
+ getPrivacyLevel?(): DefaultPrivacyLevel
9
11
  getAllowedWebViewHosts(): string
10
12
  send(msg: string): void
11
13
  }
12
14
 
15
+ export const enum BridgeCapability {
16
+ RECORDS = 'records',
17
+ }
18
+
13
19
  export function getEventBridge<T, E>() {
14
20
  const eventBridgeGlobal = getEventBridgeGlobal()
15
21
 
@@ -18,22 +24,35 @@ export function getEventBridge<T, E>() {
18
24
  }
19
25
 
20
26
  return {
27
+ getCapabilities() {
28
+ return JSON.parse(eventBridgeGlobal.getCapabilities?.() || '[]') as BridgeCapability[]
29
+ },
30
+ getPrivacyLevel() {
31
+ return eventBridgeGlobal.getPrivacyLevel?.()
32
+ },
21
33
  getAllowedWebViewHosts() {
22
34
  return JSON.parse(eventBridgeGlobal.getAllowedWebViewHosts()) as string[]
23
35
  },
24
- send(eventType: T, event: E) {
25
- eventBridgeGlobal.send(JSON.stringify({ eventType, event }))
36
+ send(eventType: T, event: E, viewId?: string) {
37
+ const view = viewId ? { id: viewId } : undefined
38
+ eventBridgeGlobal.send(JSON.stringify({ eventType, event, view }))
26
39
  },
27
40
  }
28
41
  }
29
42
 
43
+ export function bridgeSupports(capability: BridgeCapability): boolean {
44
+ const bridge = getEventBridge()
45
+ return !!bridge && bridge.getCapabilities().includes(capability)
46
+ }
47
+
30
48
  export function canUseEventBridge(currentHost = getGlobalObject<Window>().location?.hostname): boolean {
31
49
  const bridge = getEventBridge()
50
+
32
51
  return (
33
52
  !!bridge &&
34
53
  bridge
35
54
  .getAllowedWebViewHosts()
36
- .some((allowedHost) => currentHost === allowedHost || endsWith(currentHost, `.${allowedHost}`))
55
+ .some((allowedHost) => currentHost === allowedHost || currentHost.endsWith(`.${allowedHost}`))
37
56
  )
38
57
  }
39
58
 
@@ -1,11 +1,26 @@
1
- import type { PageExitEvent, PageExitReason } from '../browser/pageExitObservable'
1
+ import type { PageMayExitEvent, PageExitReason } from '../browser/pageMayExitObservable'
2
+ import { isWorkerEnvironment } from '../tools/globalObject'
2
3
  import { Observable } from '../tools/observable'
3
4
  import type { TimeoutId } from '../tools/timer'
4
5
  import { clearTimeout, setTimeout } from '../tools/timer'
6
+ import { ONE_SECOND } from '../tools/utils/timeUtils'
5
7
  import type { Duration } from '../tools/utils/timeUtils'
8
+ import { RECOMMENDED_REQUEST_BYTES_LIMIT } from './httpRequest'
6
9
 
7
10
  export type FlushReason = PageExitReason | 'duration_limit' | 'bytes_limit' | 'messages_limit' | 'session_expire'
8
11
 
12
+ /**
13
+ * flush automatically, aim to be lower than ALB connection timeout
14
+ * to maximize connection reuse.
15
+ */
16
+ export const FLUSH_DURATION_LIMIT = (30 * ONE_SECOND) as Duration
17
+
18
+ /**
19
+ * When using the SDK in a Worker Environment, we limit the batch size to 1 to ensure it can be sent
20
+ * in a single event.
21
+ */
22
+ export const MESSAGES_LIMIT = isWorkerEnvironment ? 1 : 50
23
+
9
24
  export type FlushController = ReturnType<typeof createFlushController>
10
25
  export interface FlushEvent {
11
26
  reason: FlushReason
@@ -14,10 +29,7 @@ export interface FlushEvent {
14
29
  }
15
30
 
16
31
  interface FlushControllerOptions {
17
- messagesLimit: number
18
- bytesLimit: number
19
- durationLimit: Duration
20
- pageExitObservable: Observable<PageExitEvent>
32
+ pageMayExitObservable: Observable<PageMayExitEvent>
21
33
  sessionExpireObservable: Observable<void>
22
34
  }
23
35
 
@@ -26,18 +38,12 @@ interface FlushControllerOptions {
26
38
  * to happen. The implementation is designed to support both synchronous and asynchronous usages,
27
39
  * but relies on invariants described in each method documentation to keep a coherent state.
28
40
  */
29
- export function createFlushController({
30
- messagesLimit,
31
- bytesLimit,
32
- durationLimit,
33
- pageExitObservable,
34
- sessionExpireObservable,
35
- }: FlushControllerOptions) {
36
- const pageExitSubscription = pageExitObservable.subscribe((event) => flush(event.reason))
41
+ export function createFlushController({ pageMayExitObservable, sessionExpireObservable }: FlushControllerOptions) {
42
+ const pageMayExitSubscription = pageMayExitObservable.subscribe((event) => flush(event.reason))
37
43
  const sessionExpireSubscription = sessionExpireObservable.subscribe(() => flush('session_expire'))
38
44
 
39
45
  const flushObservable = new Observable<FlushEvent>(() => () => {
40
- pageExitSubscription.unsubscribe()
46
+ pageMayExitSubscription.unsubscribe()
41
47
  sessionExpireSubscription.unsubscribe()
42
48
  })
43
49
 
@@ -68,7 +74,7 @@ export function createFlushController({
68
74
  if (durationLimitTimeoutId === undefined) {
69
75
  durationLimitTimeoutId = setTimeout(() => {
70
76
  flush('duration_limit')
71
- }, durationLimit)
77
+ }, FLUSH_DURATION_LIMIT)
72
78
  }
73
79
  }
74
80
 
@@ -89,11 +95,11 @@ export function createFlushController({
89
95
  * This function needs to be called synchronously, right before adding the message, so no flush
90
96
  * event can happen after `notifyBeforeAddMessage` and before adding the message.
91
97
  *
92
- * @param estimatedMessageBytesCount: an estimation of the message bytes count once it is
98
+ * @param estimatedMessageBytesCount - an estimation of the message bytes count once it is
93
99
  * actually added.
94
100
  */
95
101
  notifyBeforeAddMessage(estimatedMessageBytesCount: number) {
96
- if (currentBytesCount + estimatedMessageBytesCount >= bytesLimit) {
102
+ if (currentBytesCount + estimatedMessageBytesCount >= RECOMMENDED_REQUEST_BYTES_LIMIT) {
97
103
  flush('bytes_limit')
98
104
  }
99
105
  // Consider the message to be added now rather than in `notifyAfterAddMessage`, because if no
@@ -110,15 +116,15 @@ export function createFlushController({
110
116
  * This function can be called asynchronously after the message was added, but in this case it
111
117
  * should not be called if a flush event occurred in between.
112
118
  *
113
- * @param messageBytesCountDiff: the difference between the estimated message bytes count and
119
+ * @param messageBytesCountDiff - the difference between the estimated message bytes count and
114
120
  * its actual bytes count once added to the pool.
115
121
  */
116
122
  notifyAfterAddMessage(messageBytesCountDiff = 0) {
117
123
  currentBytesCount += messageBytesCountDiff
118
124
 
119
- if (currentMessagesCount >= messagesLimit) {
125
+ if (currentMessagesCount >= MESSAGES_LIMIT) {
120
126
  flush('messages_limit')
121
- } else if (currentBytesCount >= bytesLimit) {
127
+ } else if (currentBytesCount >= RECOMMENDED_REQUEST_BYTES_LIMIT) {
122
128
  flush('bytes_limit')
123
129
  }
124
130
  },
@@ -129,7 +135,7 @@ export function createFlushController({
129
135
  * This function needs to be called synchronously, right after removing the message, so no flush
130
136
  * event can happen after removing the message and before `notifyAfterRemoveMessage`.
131
137
  *
132
- * @param messageBytesCount: the message bytes count that was added to the pool. Should
138
+ * @param messageBytesCount - the message bytes count that was added to the pool. Should
133
139
  * correspond to the sum of bytes counts passed to `notifyBeforeAddMessage` and
134
140
  * `notifyAfterAddMessage`.
135
141
  */
@@ -1,11 +1,17 @@
1
- import type { EndpointBuilder, Configuration } from '../domain/configuration'
2
- import { addTelemetryError } from '../domain/telemetry'
1
+ import type { EndpointBuilder } from '../domain/configuration'
3
2
  import type { Context } from '../tools/serialisation/context'
4
- import { monitor } from '../tools/monitor'
5
- import { addEventListener } from '../browser/addEventListener'
3
+ import { monitor, monitorError } from '../tools/monitor'
6
4
  import type { RawError } from '../domain/error/error.types'
5
+ import { isExperimentalFeatureEnabled, ExperimentalFeature } from '../tools/experimentalFeatures'
6
+ import { Observable } from '../tools/observable'
7
+ import { ONE_KIBI_BYTE } from '../tools/utils/byteUtils'
7
8
  import { newRetryState, sendWithRetryStrategy } from './sendWithRetryStrategy'
8
- import type { FlushReason } from './flushController'
9
+
10
+ /**
11
+ * beacon payload max queue size implementation is 64kb
12
+ * ensure that we leave room for logs, rum and potential other users
13
+ */
14
+ export const RECOMMENDED_REQUEST_BYTES_LIMIT = 16 * ONE_KIBI_BYTE
9
15
 
10
16
  /**
11
17
  * Use POST request without content type to:
@@ -16,18 +22,46 @@ import type { FlushReason } from './flushController'
16
22
  * to be parsed correctly without content type header
17
23
  */
18
24
 
19
- export type HttpRequest = ReturnType<typeof createHttpRequest>
25
+ export interface HttpRequest<Body extends Payload = Payload> {
26
+ observable: Observable<HttpRequestEvent<Body>>
27
+ send(this: void, payload: Body): void
28
+ sendOnExit(this: void, payload: Body): void
29
+ }
20
30
 
21
31
  export interface HttpResponse extends Context {
22
32
  status: number
23
33
  type?: ResponseType
24
34
  }
25
35
 
36
+ export interface BandwidthStats {
37
+ ongoingByteCount: number
38
+ ongoingRequestCount: number
39
+ }
40
+
41
+ export type HttpRequestEvent<Body extends Payload = Payload> =
42
+ | {
43
+ // A request to send the given payload failed. (We may retry.)
44
+ type: 'failure'
45
+ bandwidth: BandwidthStats
46
+ payload: Body
47
+ }
48
+ | {
49
+ // The given payload was discarded because the request queue is full.
50
+ type: 'queue-full'
51
+ bandwidth: BandwidthStats
52
+ payload: Body
53
+ }
54
+ | {
55
+ // A request to send the given payload succeeded.
56
+ type: 'success'
57
+ bandwidth: BandwidthStats
58
+ payload: Body
59
+ }
60
+
26
61
  export interface Payload {
27
62
  data: string | FormData | Blob
28
63
  bytesCount: number
29
64
  retry?: RetryInfo
30
- flushReason?: FlushReason
31
65
  encoding?: 'deflate'
32
66
  }
33
67
 
@@ -36,36 +70,47 @@ export interface RetryInfo {
36
70
  lastFailureStatus: number
37
71
  }
38
72
 
39
- export function createHttpRequest(
40
- configuration: Configuration,
41
- endpointBuilder: EndpointBuilder,
42
- bytesLimit: number,
43
- reportError: (error: RawError) => void
44
- ) {
45
- const retryState = newRetryState()
46
- const sendStrategyForRetry = (payload: Payload, onResponse: (r: HttpResponse) => void) =>
47
- fetchKeepAliveStrategy(configuration, endpointBuilder, bytesLimit, payload, onResponse)
73
+ export function createHttpRequest<Body extends Payload = Payload>(
74
+ endpointBuilders: EndpointBuilder[],
75
+ reportError: (error: RawError) => void,
76
+ bytesLimit: number = RECOMMENDED_REQUEST_BYTES_LIMIT
77
+ ): HttpRequest<Body> {
78
+ const observable = new Observable<HttpRequestEvent<Body>>()
79
+ const retryState = newRetryState<Body>()
48
80
 
49
81
  return {
50
- send: (payload: Payload) => {
51
- sendWithRetryStrategy(payload, retryState, sendStrategyForRetry, endpointBuilder.trackType, reportError)
82
+ observable,
83
+ send: (payload: Body) => {
84
+ for (const endpointBuilder of endpointBuilders) {
85
+ sendWithRetryStrategy(
86
+ payload,
87
+ retryState,
88
+ (payload, onResponse) => {
89
+ if (isExperimentalFeatureEnabled(ExperimentalFeature.AVOID_FETCH_KEEPALIVE)) {
90
+ fetchStrategy(endpointBuilder, payload, onResponse)
91
+ } else {
92
+ fetchKeepAliveStrategy(endpointBuilder, bytesLimit, payload, onResponse)
93
+ }
94
+ },
95
+ endpointBuilder.trackType,
96
+ reportError,
97
+ observable
98
+ )
99
+ }
52
100
  },
53
101
  /**
54
102
  * Since fetch keepalive behaves like regular fetch on Firefox,
55
103
  * keep using sendBeaconStrategy on exit
56
104
  */
57
- sendOnExit: (payload: Payload) => {
58
- sendBeaconStrategy(configuration, endpointBuilder, bytesLimit, payload)
105
+ sendOnExit: (payload: Body) => {
106
+ for (const endpointBuilder of endpointBuilders) {
107
+ sendBeaconStrategy(endpointBuilder, bytesLimit, payload)
108
+ }
59
109
  },
60
110
  }
61
111
  }
62
112
 
63
- function sendBeaconStrategy(
64
- configuration: Configuration,
65
- endpointBuilder: EndpointBuilder,
66
- bytesLimit: number,
67
- payload: Payload
68
- ) {
113
+ function sendBeaconStrategy(endpointBuilder: EndpointBuilder, bytesLimit: number, payload: Payload) {
69
114
  const canUseBeacon = !!navigator.sendBeacon && payload.bytesCount < bytesLimit
70
115
  if (canUseBeacon) {
71
116
  try {
@@ -80,8 +125,7 @@ function sendBeaconStrategy(
80
125
  }
81
126
  }
82
127
 
83
- const xhrUrl = endpointBuilder.build('xhr', payload)
84
- sendXHR(configuration, xhrUrl, payload.data)
128
+ fetchStrategy(endpointBuilder, payload)
85
129
  }
86
130
 
87
131
  let hasReportedBeaconError = false
@@ -89,34 +133,41 @@ let hasReportedBeaconError = false
89
133
  function reportBeaconError(e: unknown) {
90
134
  if (!hasReportedBeaconError) {
91
135
  hasReportedBeaconError = true
92
- addTelemetryError(e)
136
+ monitorError(e)
93
137
  }
94
138
  }
95
139
 
96
140
  export function fetchKeepAliveStrategy(
97
- configuration: Configuration,
98
141
  endpointBuilder: EndpointBuilder,
99
142
  bytesLimit: number,
100
143
  payload: Payload,
101
144
  onResponse?: (r: HttpResponse) => void
102
145
  ) {
103
146
  const canUseKeepAlive = isKeepAliveSupported() && payload.bytesCount < bytesLimit
147
+
104
148
  if (canUseKeepAlive) {
105
- const fetchUrl = endpointBuilder.build('fetch', payload)
106
- fetch(fetchUrl, { method: 'POST', body: payload.data, keepalive: true, mode: 'cors' }).then(
107
- monitor((response: Response) => onResponse?.({ status: response.status, type: response.type })),
108
- monitor(() => {
109
- const xhrUrl = endpointBuilder.build('xhr', payload)
110
- // failed to queue the request
111
- sendXHR(configuration, xhrUrl, payload.data, onResponse)
112
- })
113
- )
149
+ const fetchUrl = endpointBuilder.build('fetch-keepalive', payload)
150
+
151
+ fetch(fetchUrl, { method: 'POST', body: payload.data, keepalive: true, mode: 'cors' })
152
+ .then(monitor((response: Response) => onResponse?.({ status: response.status, type: response.type })))
153
+ .catch(monitor(() => fetchStrategy(endpointBuilder, payload, onResponse)))
114
154
  } else {
115
- const xhrUrl = endpointBuilder.build('xhr', payload)
116
- sendXHR(configuration, xhrUrl, payload.data, onResponse)
155
+ fetchStrategy(endpointBuilder, payload, onResponse)
117
156
  }
118
157
  }
119
158
 
159
+ export function fetchStrategy(
160
+ endpointBuilder: EndpointBuilder,
161
+ payload: Payload,
162
+ onResponse?: (r: HttpResponse) => void
163
+ ) {
164
+ const fetchUrl = endpointBuilder.build('fetch', payload)
165
+
166
+ fetch(fetchUrl, { method: 'POST', body: payload.data, mode: 'cors' })
167
+ .then(monitor((response: Response) => onResponse?.({ status: response.status, type: response.type })))
168
+ .catch(monitor(() => onResponse?.({ status: 0 })))
169
+ }
170
+
120
171
  function isKeepAliveSupported() {
121
172
  // Request can throw, cf https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#errors
122
173
  try {
@@ -125,33 +176,3 @@ function isKeepAliveSupported() {
125
176
  return false
126
177
  }
127
178
  }
128
-
129
- export function sendXHR(
130
- configuration: Configuration,
131
- url: string,
132
- data: Payload['data'],
133
- onResponse?: (r: HttpResponse) => void
134
- ) {
135
- const request = new XMLHttpRequest()
136
- request.open('POST', url, true)
137
- if (data instanceof Blob) {
138
- // When using a Blob instance, IE does not use its 'type' to define the 'Content-Type' header
139
- // automatically, so the intake request ends up being rejected with an HTTP status 415
140
- // Defining the header manually fixes this issue.
141
- request.setRequestHeader('Content-Type', data.type)
142
- }
143
- addEventListener(
144
- configuration,
145
- request,
146
- 'loadend',
147
- () => {
148
- onResponse?.({ status: request.status })
149
- },
150
- {
151
- // prevent multiple onResponse callbacks
152
- // if the xhr instance is reused by a third party
153
- once: true,
154
- }
155
- )
156
- request.send(data)
157
- }
@@ -1,4 +1,7 @@
1
- export { HttpRequest, createHttpRequest, Payload, RetryInfo } from './httpRequest'
2
- export { canUseEventBridge, getEventBridge, BrowserWindowWithEventBridge } from './eventBridge'
3
- export { startBatchWithReplica } from './startBatchWithReplica'
4
- export { createFlushController, FlushController, FlushEvent, FlushReason } from './flushController'
1
+ export type { BandwidthStats, HttpRequest, HttpRequestEvent, Payload, RetryInfo } from './httpRequest'
2
+ export { createHttpRequest } from './httpRequest'
3
+ export type { BrowserWindowWithEventBridge, DatadogEventBridge } from './eventBridge'
4
+ export { canUseEventBridge, bridgeSupports, getEventBridge, BridgeCapability } from './eventBridge'
5
+ export { createBatch } from './batch'
6
+ export type { FlushController, FlushEvent, FlushReason } from './flushController'
7
+ export { createFlushController, FLUSH_DURATION_LIMIT } from './flushController'