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