@multiplayer-app/session-recorder-common 0.0.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 (285) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +230 -0
  3. package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.d.ts +35 -0
  4. package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -0
  5. package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.js +355 -0
  6. package/dist/esm/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -0
  7. package/dist/esm/SessionRecorderHttpTraceExporterBrowser.d.ts +26 -0
  8. package/dist/esm/SessionRecorderHttpTraceExporterBrowser.d.ts.map +1 -0
  9. package/dist/esm/SessionRecorderHttpTraceExporterBrowser.js +116 -0
  10. package/dist/esm/SessionRecorderHttpTraceExporterBrowser.js.map +1 -0
  11. package/dist/esm/SessionRecorderIdGenerator.d.ts +15 -0
  12. package/dist/esm/SessionRecorderIdGenerator.d.ts.map +1 -0
  13. package/dist/esm/SessionRecorderIdGenerator.js +63 -0
  14. package/dist/esm/SessionRecorderIdGenerator.js.map +1 -0
  15. package/dist/esm/SessionRecorderJsonTraceSerializer.d.ts +4 -0
  16. package/dist/esm/SessionRecorderJsonTraceSerializer.d.ts.map +1 -0
  17. package/dist/esm/SessionRecorderJsonTraceSerializer.js +26 -0
  18. package/dist/esm/SessionRecorderJsonTraceSerializer.js.map +1 -0
  19. package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.d.ts +11 -0
  20. package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -0
  21. package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js +45 -0
  22. package/dist/esm/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -0
  23. package/dist/esm/constants.base.d.ts +32 -0
  24. package/dist/esm/constants.base.d.ts.map +1 -0
  25. package/dist/esm/constants.base.js +32 -0
  26. package/dist/esm/constants.base.js.map +1 -0
  27. package/dist/esm/constants.browser.d.ts +2 -0
  28. package/dist/esm/constants.browser.d.ts.map +1 -0
  29. package/dist/esm/constants.browser.js +2 -0
  30. package/dist/esm/constants.browser.js.map +1 -0
  31. package/dist/esm/constants.node.d.ts +3 -0
  32. package/dist/esm/constants.node.d.ts.map +1 -0
  33. package/dist/esm/constants.node.js +5 -0
  34. package/dist/esm/constants.node.js.map +1 -0
  35. package/dist/esm/index-browser.d.ts +8 -0
  36. package/dist/esm/index-browser.d.ts.map +1 -0
  37. package/dist/esm/index-browser.js +9 -0
  38. package/dist/esm/index-browser.js.map +1 -0
  39. package/dist/esm/index-node.d.ts +8 -0
  40. package/dist/esm/index-node.d.ts.map +1 -0
  41. package/dist/esm/index-node.js +9 -0
  42. package/dist/esm/index-node.js.map +1 -0
  43. package/dist/esm/index.d.ts +9 -0
  44. package/dist/esm/index.d.ts.map +1 -0
  45. package/dist/esm/index.js +10 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/sdk/capture-exception.d.ts +7 -0
  48. package/dist/esm/sdk/capture-exception.d.ts.map +1 -0
  49. package/dist/esm/sdk/capture-exception.js +19 -0
  50. package/dist/esm/sdk/capture-exception.js.map +1 -0
  51. package/dist/esm/sdk/id-generator.d.ts +2 -0
  52. package/dist/esm/sdk/id-generator.d.ts.map +1 -0
  53. package/dist/esm/sdk/id-generator.js +14 -0
  54. package/dist/esm/sdk/id-generator.js.map +1 -0
  55. package/dist/esm/sdk/index.d.ts +8 -0
  56. package/dist/esm/sdk/index.d.ts.map +1 -0
  57. package/dist/esm/sdk/index.js +8 -0
  58. package/dist/esm/sdk/index.js.map +1 -0
  59. package/dist/esm/sdk/is-gzip.d.ts +2 -0
  60. package/dist/esm/sdk/is-gzip.d.ts.map +1 -0
  61. package/dist/esm/sdk/is-gzip.js +7 -0
  62. package/dist/esm/sdk/is-gzip.js.map +1 -0
  63. package/dist/esm/sdk/mask.d.ts +6 -0
  64. package/dist/esm/sdk/mask.d.ts.map +1 -0
  65. package/dist/esm/sdk/mask.js +148 -0
  66. package/dist/esm/sdk/mask.js.map +1 -0
  67. package/dist/esm/sdk/save-continuous-deb-session.d.ts +7 -0
  68. package/dist/esm/sdk/save-continuous-deb-session.d.ts.map +1 -0
  69. package/dist/esm/sdk/save-continuous-deb-session.js +21 -0
  70. package/dist/esm/sdk/save-continuous-deb-session.js.map +1 -0
  71. package/dist/esm/sdk/schemify.d.ts +4 -0
  72. package/dist/esm/sdk/schemify.d.ts.map +1 -0
  73. package/dist/esm/sdk/schemify.js +51 -0
  74. package/dist/esm/sdk/schemify.js.map +1 -0
  75. package/dist/esm/sdk/set-attribute.d.ts +90 -0
  76. package/dist/esm/sdk/set-attribute.d.ts.map +1 -0
  77. package/dist/esm/sdk/set-attribute.js +160 -0
  78. package/dist/esm/sdk/set-attribute.js.map +1 -0
  79. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  80. package/dist/esm/type/index.d.ts +2 -0
  81. package/dist/esm/type/index.d.ts.map +1 -0
  82. package/dist/esm/type/index.js +2 -0
  83. package/dist/esm/type/index.js.map +1 -0
  84. package/dist/esm/type/session-type.enum.d.ts +5 -0
  85. package/dist/esm/type/session-type.enum.d.ts.map +1 -0
  86. package/dist/esm/type/session-type.enum.js +6 -0
  87. package/dist/esm/type/session-type.enum.js.map +1 -0
  88. package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.d.ts +35 -0
  89. package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -0
  90. package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.js +221 -0
  91. package/dist/esnext/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -0
  92. package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.d.ts +26 -0
  93. package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.d.ts.map +1 -0
  94. package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.js +82 -0
  95. package/dist/esnext/SessionRecorderHttpTraceExporterBrowser.js.map +1 -0
  96. package/dist/esnext/SessionRecorderIdGenerator.d.ts +15 -0
  97. package/dist/esnext/SessionRecorderIdGenerator.d.ts.map +1 -0
  98. package/dist/esnext/SessionRecorderIdGenerator.js +42 -0
  99. package/dist/esnext/SessionRecorderIdGenerator.js.map +1 -0
  100. package/dist/esnext/SessionRecorderJsonTraceSerializer.d.ts +4 -0
  101. package/dist/esnext/SessionRecorderJsonTraceSerializer.d.ts.map +1 -0
  102. package/dist/esnext/SessionRecorderJsonTraceSerializer.js +26 -0
  103. package/dist/esnext/SessionRecorderJsonTraceSerializer.js.map +1 -0
  104. package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.d.ts +11 -0
  105. package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -0
  106. package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js +42 -0
  107. package/dist/esnext/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -0
  108. package/dist/esnext/constants.base.d.ts +32 -0
  109. package/dist/esnext/constants.base.d.ts.map +1 -0
  110. package/dist/esnext/constants.base.js +32 -0
  111. package/dist/esnext/constants.base.js.map +1 -0
  112. package/dist/esnext/constants.browser.d.ts +2 -0
  113. package/dist/esnext/constants.browser.d.ts.map +1 -0
  114. package/dist/esnext/constants.browser.js +2 -0
  115. package/dist/esnext/constants.browser.js.map +1 -0
  116. package/dist/esnext/constants.node.d.ts +3 -0
  117. package/dist/esnext/constants.node.d.ts.map +1 -0
  118. package/dist/esnext/constants.node.js +5 -0
  119. package/dist/esnext/constants.node.js.map +1 -0
  120. package/dist/esnext/index-browser.d.ts +8 -0
  121. package/dist/esnext/index-browser.d.ts.map +1 -0
  122. package/dist/esnext/index-browser.js +8 -0
  123. package/dist/esnext/index-browser.js.map +1 -0
  124. package/dist/esnext/index-node.d.ts +8 -0
  125. package/dist/esnext/index-node.d.ts.map +1 -0
  126. package/dist/esnext/index-node.js +8 -0
  127. package/dist/esnext/index-node.js.map +1 -0
  128. package/dist/esnext/index.d.ts +9 -0
  129. package/dist/esnext/index.d.ts.map +1 -0
  130. package/dist/esnext/index.js +9 -0
  131. package/dist/esnext/index.js.map +1 -0
  132. package/dist/esnext/sdk/capture-exception.d.ts +7 -0
  133. package/dist/esnext/sdk/capture-exception.d.ts.map +1 -0
  134. package/dist/esnext/sdk/capture-exception.js +19 -0
  135. package/dist/esnext/sdk/capture-exception.js.map +1 -0
  136. package/dist/esnext/sdk/id-generator.d.ts +2 -0
  137. package/dist/esnext/sdk/id-generator.d.ts.map +1 -0
  138. package/dist/esnext/sdk/id-generator.js +14 -0
  139. package/dist/esnext/sdk/id-generator.js.map +1 -0
  140. package/dist/esnext/sdk/index.d.ts +8 -0
  141. package/dist/esnext/sdk/index.d.ts.map +1 -0
  142. package/dist/esnext/sdk/index.js +8 -0
  143. package/dist/esnext/sdk/index.js.map +1 -0
  144. package/dist/esnext/sdk/is-gzip.d.ts +2 -0
  145. package/dist/esnext/sdk/is-gzip.d.ts.map +1 -0
  146. package/dist/esnext/sdk/is-gzip.js +7 -0
  147. package/dist/esnext/sdk/is-gzip.js.map +1 -0
  148. package/dist/esnext/sdk/mask.d.ts +6 -0
  149. package/dist/esnext/sdk/mask.d.ts.map +1 -0
  150. package/dist/esnext/sdk/mask.js +144 -0
  151. package/dist/esnext/sdk/mask.js.map +1 -0
  152. package/dist/esnext/sdk/save-continuous-deb-session.d.ts +7 -0
  153. package/dist/esnext/sdk/save-continuous-deb-session.d.ts.map +1 -0
  154. package/dist/esnext/sdk/save-continuous-deb-session.js +21 -0
  155. package/dist/esnext/sdk/save-continuous-deb-session.js.map +1 -0
  156. package/dist/esnext/sdk/schemify.d.ts +4 -0
  157. package/dist/esnext/sdk/schemify.d.ts.map +1 -0
  158. package/dist/esnext/sdk/schemify.js +49 -0
  159. package/dist/esnext/sdk/schemify.js.map +1 -0
  160. package/dist/esnext/sdk/set-attribute.d.ts +90 -0
  161. package/dist/esnext/sdk/set-attribute.d.ts.map +1 -0
  162. package/dist/esnext/sdk/set-attribute.js +151 -0
  163. package/dist/esnext/sdk/set-attribute.js.map +1 -0
  164. package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -0
  165. package/dist/esnext/type/index.d.ts +2 -0
  166. package/dist/esnext/type/index.d.ts.map +1 -0
  167. package/dist/esnext/type/index.js +2 -0
  168. package/dist/esnext/type/index.js.map +1 -0
  169. package/dist/esnext/type/session-type.enum.d.ts +5 -0
  170. package/dist/esnext/type/session-type.enum.d.ts.map +1 -0
  171. package/dist/esnext/type/session-type.enum.js +6 -0
  172. package/dist/esnext/type/session-type.enum.js.map +1 -0
  173. package/dist/src/SessionRecorderHttpInstrumentationHooksNode.d.ts +35 -0
  174. package/dist/src/SessionRecorderHttpInstrumentationHooksNode.d.ts.map +1 -0
  175. package/dist/src/SessionRecorderHttpInstrumentationHooksNode.js +224 -0
  176. package/dist/src/SessionRecorderHttpInstrumentationHooksNode.js.map +1 -0
  177. package/dist/src/SessionRecorderHttpTraceExporterBrowser.d.ts +26 -0
  178. package/dist/src/SessionRecorderHttpTraceExporterBrowser.d.ts.map +1 -0
  179. package/dist/src/SessionRecorderHttpTraceExporterBrowser.js +86 -0
  180. package/dist/src/SessionRecorderHttpTraceExporterBrowser.js.map +1 -0
  181. package/dist/src/SessionRecorderIdGenerator.d.ts +15 -0
  182. package/dist/src/SessionRecorderIdGenerator.d.ts.map +1 -0
  183. package/dist/src/SessionRecorderIdGenerator.js +46 -0
  184. package/dist/src/SessionRecorderIdGenerator.js.map +1 -0
  185. package/dist/src/SessionRecorderJsonTraceSerializer.d.ts +4 -0
  186. package/dist/src/SessionRecorderJsonTraceSerializer.d.ts.map +1 -0
  187. package/dist/src/SessionRecorderJsonTraceSerializer.js +29 -0
  188. package/dist/src/SessionRecorderJsonTraceSerializer.js.map +1 -0
  189. package/dist/src/SessionRecorderTraceIdRatioBasedSampler.d.ts +11 -0
  190. package/dist/src/SessionRecorderTraceIdRatioBasedSampler.d.ts.map +1 -0
  191. package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js +46 -0
  192. package/dist/src/SessionRecorderTraceIdRatioBasedSampler.js.map +1 -0
  193. package/dist/src/constants.base.d.ts +32 -0
  194. package/dist/src/constants.base.d.ts.map +1 -0
  195. package/dist/src/constants.base.js +35 -0
  196. package/dist/src/constants.base.js.map +1 -0
  197. package/dist/src/constants.browser.d.ts +2 -0
  198. package/dist/src/constants.browser.d.ts.map +1 -0
  199. package/dist/src/constants.browser.js +18 -0
  200. package/dist/src/constants.browser.js.map +1 -0
  201. package/dist/src/constants.node.d.ts +3 -0
  202. package/dist/src/constants.node.d.ts.map +1 -0
  203. package/dist/src/constants.node.js +22 -0
  204. package/dist/src/constants.node.js.map +1 -0
  205. package/dist/src/index-browser.d.ts +8 -0
  206. package/dist/src/index-browser.d.ts.map +1 -0
  207. package/dist/src/index-browser.js +29 -0
  208. package/dist/src/index-browser.js.map +1 -0
  209. package/dist/src/index-node.d.ts +8 -0
  210. package/dist/src/index-node.d.ts.map +1 -0
  211. package/dist/src/index-node.js +29 -0
  212. package/dist/src/index-node.js.map +1 -0
  213. package/dist/src/index.d.ts +9 -0
  214. package/dist/src/index.d.ts.map +1 -0
  215. package/dist/src/index.js +31 -0
  216. package/dist/src/index.js.map +1 -0
  217. package/dist/src/sdk/capture-exception.d.ts +7 -0
  218. package/dist/src/sdk/capture-exception.d.ts.map +1 -0
  219. package/dist/src/sdk/capture-exception.js +23 -0
  220. package/dist/src/sdk/capture-exception.js.map +1 -0
  221. package/dist/src/sdk/id-generator.d.ts +2 -0
  222. package/dist/src/sdk/id-generator.d.ts.map +1 -0
  223. package/dist/src/sdk/id-generator.js +18 -0
  224. package/dist/src/sdk/id-generator.js.map +1 -0
  225. package/dist/src/sdk/index.d.ts +8 -0
  226. package/dist/src/sdk/index.d.ts.map +1 -0
  227. package/dist/src/sdk/index.js +29 -0
  228. package/dist/src/sdk/index.js.map +1 -0
  229. package/dist/src/sdk/is-gzip.d.ts +2 -0
  230. package/dist/src/sdk/is-gzip.d.ts.map +1 -0
  231. package/dist/src/sdk/is-gzip.js +11 -0
  232. package/dist/src/sdk/is-gzip.js.map +1 -0
  233. package/dist/src/sdk/mask.d.ts +6 -0
  234. package/dist/src/sdk/mask.d.ts.map +1 -0
  235. package/dist/src/sdk/mask.js +147 -0
  236. package/dist/src/sdk/mask.js.map +1 -0
  237. package/dist/src/sdk/save-continuous-deb-session.d.ts +7 -0
  238. package/dist/src/sdk/save-continuous-deb-session.d.ts.map +1 -0
  239. package/dist/src/sdk/save-continuous-deb-session.js +25 -0
  240. package/dist/src/sdk/save-continuous-deb-session.js.map +1 -0
  241. package/dist/src/sdk/schemify.d.ts +4 -0
  242. package/dist/src/sdk/schemify.d.ts.map +1 -0
  243. package/dist/src/sdk/schemify.js +51 -0
  244. package/dist/src/sdk/schemify.js.map +1 -0
  245. package/dist/src/sdk/set-attribute.d.ts +90 -0
  246. package/dist/src/sdk/set-attribute.d.ts.map +1 -0
  247. package/dist/src/sdk/set-attribute.js +164 -0
  248. package/dist/src/sdk/set-attribute.js.map +1 -0
  249. package/dist/src/type/index.d.ts +2 -0
  250. package/dist/src/type/index.d.ts.map +1 -0
  251. package/dist/src/type/index.js +18 -0
  252. package/dist/src/type/index.js.map +1 -0
  253. package/dist/src/type/session-type.enum.d.ts +5 -0
  254. package/dist/src/type/session-type.enum.d.ts.map +1 -0
  255. package/dist/src/type/session-type.enum.js +9 -0
  256. package/dist/src/type/session-type.enum.js.map +1 -0
  257. package/package.json +50 -0
  258. package/src/SessionRecorderHttpInstrumentationHooksNode.ts +362 -0
  259. package/src/SessionRecorderHttpTraceExporterBrowser.ts +123 -0
  260. package/src/SessionRecorderIdGenerator.ts +72 -0
  261. package/src/SessionRecorderJsonTraceSerializer.ts +43 -0
  262. package/src/SessionRecorderTraceIdRatioBasedSampler.ts +57 -0
  263. package/src/constants.base.ts +61 -0
  264. package/src/constants.browser.ts +1 -0
  265. package/src/constants.node.ts +5 -0
  266. package/src/index-browser.ts +7 -0
  267. package/src/index-node.ts +7 -0
  268. package/src/index.ts +8 -0
  269. package/src/sdk/capture-exception.ts +19 -0
  270. package/src/sdk/id-generator.ts +17 -0
  271. package/src/sdk/index.ts +7 -0
  272. package/src/sdk/is-gzip.ts +7 -0
  273. package/src/sdk/mask.ts +161 -0
  274. package/src/sdk/save-continuous-deb-session.ts +28 -0
  275. package/src/sdk/schemify.ts +58 -0
  276. package/src/sdk/set-attribute.ts +210 -0
  277. package/src/type/index.ts +1 -0
  278. package/src/type/session-type.enum.ts +4 -0
  279. package/tsconfig.base.es5.json +8 -0
  280. package/tsconfig.base.esm.json +7 -0
  281. package/tsconfig.base.esnext.json +10 -0
  282. package/tsconfig.base.json +35 -0
  283. package/tsconfig.esm.json +12 -0
  284. package/tsconfig.esnext.json +12 -0
  285. package/tsconfig.json +25 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+
2
+ MIT License
3
+
4
+ Copyright (c) 2024 Multiplayer Software, Inc.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,230 @@
1
+ # Session Recorder OpenTelemetry Core
2
+
3
+ This package provides implementations of the OpenTelemetry API for trace and metrics. It's intended for use both on the server and in the browser.
4
+
5
+ ## Built-in Implementations
6
+
7
+ - [Session Recorder OpenTelemetry Core](#session-recorder-opentelemetry-core)
8
+ - [Built-in Implementations](#built-in-implementations)
9
+ - [Constants](#constants)
10
+ - [Setup opentelemetry for capturing http request/response body](#session-recorder-http-instrumentation-hooks-node)
11
+ - [Session Recorder Http Trace exporter web](#session-recorder-http-trace-exporter-web)
12
+ - [Session Recorder id generator](#session-recorder-id-generator)
13
+ - [Trace id ratio based sampler](#trace-id-ratio-based-sampler)
14
+ - [Helper for capturing exception in session recording](#helper-for-capturing-exceptions)
15
+ - [Helpers for adding content to session recording](#helper-for-setting-attributes-to-span)
16
+ - [License](#license)
17
+
18
+ ### Constants
19
+
20
+ ```javascript
21
+ import {
22
+ MULTIPLAYER_TRACE_DOC_PREFIX,
23
+ MULTIPLAYER_TRACE_DEBUG_PREFIX,
24
+ MULTIPLAYER_OTEL_DEFAULT_TRACES_EXPORTER_URL,
25
+ MULTIPLAYER_OTEL_DEFAULT_LOGS_EXPORTER_URL,
26
+ MULTIPLAYER_ATTRIBUTE_PREFIX,
27
+ MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE,
28
+ ATTR_MULTIPLAYER_DEBUG_SESSION,
29
+ ATTR_MULTIPLAYER_HTTP_REQUEST_BODY,
30
+ ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY,
31
+ ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS,
32
+ ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS,
33
+ ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING,
34
+ ATTR_MULTIPLAYER_RPC_REQUEST_MESSAGE,
35
+ ATTR_MULTIPLAYER_RPC_RESPONSE_MESSAGE,
36
+ ATTR_MULTIPLAYER_GRPC_REQUEST_MESSAGE,
37
+ ATTR_MULTIPLAYER_GRPC_RESPONSE_MESSAGE,
38
+ ATTR_MULTIPLAYER_MESSAGING_MESSAGE_BODY,
39
+ } from '@multiplayer-app/session-recorder-opentelemetry'
40
+ ```
41
+
42
+ ### Setup opentelemetry for capturing http request/response body
43
+
44
+ Session Recorder hooks for nodejs http instrumentation for injecting http request/response headers and payload to span.
45
+
46
+ ```javascript
47
+ import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'
48
+ import { type Instrumentation } from '@opentelemetry/instrumentation'
49
+ import { SessionRecorderHttpInstrumentationHooks } from '@multiplayer-app/session-recorder-opentelemetry'
50
+
51
+ export const instrumentations: Instrumentation[] = getNodeAutoInstrumentations({
52
+ '@opentelemetry/instrumentation-http': {
53
+ enabled: true,
54
+ responseHook: SessionRecorderHttpInstrumentationHooks.responseHook({
55
+ maxPayloadSizeBytes: 1000,
56
+ uncompressPayload: true,
57
+ captureHeaders: true,
58
+ captureBody: true,
59
+ isMaskingEnabled: true,
60
+ maskBody: (data, span) => {
61
+ // mask logic here
62
+ return data
63
+ },
64
+ maskHeaders: (data, span) => {
65
+ // mask logic here
66
+ return data
67
+ },
68
+ maskBodyFieldsList: ['password', 'card'],
69
+ maskHeadersList: ['x-trace-id'],
70
+ headersToInclude: ['Set-Cookie', 'Authorization'],
71
+ headersToExclude: ['Cookie'],
72
+ }),
73
+ requestHook: SessionRecorderHttpInstrumentationHooks.requestHook({
74
+ maxPayloadSizeBytes: 1000,
75
+ captureHeaders: true,
76
+ captureBody: true,
77
+ isMaskingEnabled: true,
78
+ maskBody: (data, span) => {
79
+ // mask logic here
80
+ return data
81
+ },
82
+ maskHeaders: (data, span) => {
83
+ // mask logic here
84
+ return data
85
+ },
86
+ maskBodyFieldsList: ['password', 'card'],
87
+ maskHeadersList: ['x-trace-id'],
88
+ headersToInclude: ['Set-Cookie', 'Authorization'],
89
+ headersToExclude: ['Cookie'],
90
+ }),
91
+ },
92
+ )
93
+ ```
94
+
95
+ ### Session Recorder Http Trace exporter web
96
+
97
+ ```javascript
98
+ import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'
99
+ import { SessionRecorderHttpTraceExporterBrowser } from '@multiplayer-app/session-recorder-opentelemetry'
100
+
101
+ const collectorOptions = {
102
+ url: '<opentelemetry-collector-url>', // url is optional and can be omitted - default is https://api.multiplayer.app/v1/traces
103
+ apiKey: '<multiplayer-otlp-key>' // api key from multiplayer integration
104
+ }
105
+
106
+ const exporter = new SessionRecorderHttpTraceExporterBrowser(collectorOptions)
107
+ const provider = new WebTracerProvider({
108
+ spanProcessors: [
109
+ new BatchSpanProcessor(exporter, {
110
+ // The maximum queue size. After the size is reached spans are dropped.
111
+ maxQueueSize: 100,
112
+ // The maximum batch size of every export. It must be smaller or equal to maxQueueSize.
113
+ maxExportBatchSize: 10,
114
+ // The interval between two consecutive exports
115
+ scheduledDelayMillis: 500,
116
+ // How long the export can run before it is cancelled
117
+ exportTimeoutMillis: 30000
118
+ })
119
+ ]
120
+ })
121
+
122
+ provider.register()
123
+ ```
124
+
125
+ ### Session Recorder id generator
126
+
127
+
128
+ ```javascript
129
+ import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'
130
+ import { SessionRecorderIdGenerator, SessionRecorderHttpTraceExporterBrowser } from '@multiplayer-app/session-recorder-opentelemetry'
131
+
132
+ const idGenerator = new SessionRecorderIdGenerator({ autoDocTracesRatio: 0.05 })
133
+
134
+ const collectorOptions = {
135
+ url: '<opentelemetry-collector-url>', // url is optional and can be omitted - default is https://api.multiplayer.app/v1/traces
136
+ apiKey: '<multiplayer-otlp-key>' // api key from multiplayer integration
137
+ }
138
+
139
+ const exporter = new SessionRecorderHttpTraceExporterBrowser(collectorOptions)
140
+ const provider = new WebTracerProvider({
141
+ spanProcessors: [
142
+ new BatchSpanProcessor(exporter, {
143
+ // The maximum queue size. After the size is reached spans are dropped.
144
+ maxQueueSize: 100,
145
+ // The maximum batch size of every export. It must be smaller or equal to maxQueueSize.
146
+ maxExportBatchSize: 10,
147
+ // The interval between two consecutive exports
148
+ scheduledDelayMillis: 500,
149
+ // How long the export can run before it is cancelled
150
+ exportTimeoutMillis: 30000
151
+ })
152
+ ],
153
+ idGenerator
154
+ })
155
+
156
+ idGenerator.setSessionId('<multiplayer-debug-session-short-id>')
157
+ ```
158
+
159
+ ### Trace id ratio based sampler
160
+
161
+ Session Recorder sampler will always sample traces with appropriate prefixes, other traces will be sampled using ration provided to constructor.
162
+
163
+ ```javascript
164
+ import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'
165
+ import { SessionRecorderTraceIdRatioBasedSampler, SessionRecorderHttpTraceExporterBrowser } from '@multiplayer-app/session-recorder-opentelemetry'
166
+
167
+ const collectorOptions = {
168
+ url: '<opentelemetry-collector-url>', // url is optional and can be omitted - default is https://api.multiplayer.app/v1/traces
169
+ apiKey: '<multiplayer-otlp-key>' // api key from multiplayer integration
170
+ }
171
+
172
+ const exporter = new SessionRecorderHttpTraceExporterBrowser(collectorOptions)
173
+ const provider = new WebTracerProvider({
174
+ spanProcessors: [
175
+ new BatchSpanProcessor(exporter, {
176
+ // The maximum queue size. After the size is reached spans are dropped.
177
+ maxQueueSize: 100,
178
+ // The maximum batch size of every export. It must be smaller or equal to maxQueueSize.
179
+ maxExportBatchSize: 10,
180
+ // The interval between two consecutive exports
181
+ scheduledDelayMillis: 500,
182
+ // How long the export can run before it is cancelled
183
+ exportTimeoutMillis: 30000
184
+ })
185
+ ],
186
+ sampler: new SessionRecorderTraceIdRatioBasedSampler(0.05)
187
+ })
188
+ ```
189
+
190
+ ### Helper for capturing exception in session recording
191
+
192
+ ```javascript
193
+ import { SessionRecorderSdk } from '@multiplayer-app/session-recorder-opentelemetry'
194
+
195
+ const error = new Error('Some text here')
196
+
197
+ SessionRecorderSdk.captureException(error)
198
+ ```
199
+
200
+ ### Helpers for adding content to session recording
201
+
202
+ ```javascript
203
+ import { SessionRecorderSdk } from '@multiplayer-app/session-recorder-opentelemetry'
204
+
205
+ SessionRecorderSdk.setAttribute('{{SOME_KEY}}', '{{SOME_VALUE}}')
206
+
207
+ // following helpers do masking of sensitive fields
208
+ SessionRecorderSdk.setHttpRequestBody('{{ANY_REQUEST_PAYLOAD_HERE}}')
209
+
210
+ SessionRecorderSdk.setHttpRequestHeaders({ Cookie: '...', Authorization: '...'})
211
+
212
+ SessionRecorderSdk.setHttpResponseBody({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
213
+
214
+ SessionRecorderSdk.setHttpResponseHeaders({ 'Set-Cookie': '...' })
215
+
216
+ SessionRecorderSdk.setMessageBody({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
217
+
218
+ SessionRecorderSdk.setRpcRequestMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
219
+
220
+ SessionRecorderSdk.setRpcResponseMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
221
+
222
+ SessionRecorderSdk.setGrpcRequestMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
223
+
224
+ SessionRecorderSdk.setGrpcResponseMessage({some_payload: '{{ANY_REQUEST_PAYLOAD_HERE}}'})
225
+
226
+ ```
227
+
228
+ ## License
229
+
230
+ MIT - See [LICENSE](./LICENSE) for more information.
@@ -0,0 +1,35 @@
1
+ import type { IncomingMessage, ServerResponse, ClientRequest } from 'http';
2
+ import type { Span } from '@opentelemetry/api';
3
+ interface HttpResponseHookOptions {
4
+ maxPayloadSizeBytes?: number;
5
+ schemifyDocSpanPayload?: boolean;
6
+ uncompressPayload?: boolean;
7
+ captureHeaders?: boolean;
8
+ captureBody?: boolean;
9
+ isMaskingEnabled?: boolean;
10
+ maskBody?: (arg: any, span: Span) => any;
11
+ maskHeaders?: (arg: any, span: Span) => any;
12
+ maskBodyFieldsList?: string[];
13
+ maskHeadersList?: string[];
14
+ headersToInclude?: string[];
15
+ headersToExclude?: string[];
16
+ }
17
+ interface HttpRequestHookOptions {
18
+ maxPayloadSizeBytes?: number;
19
+ schemifyDocSpanPayload?: boolean;
20
+ captureHeaders?: boolean;
21
+ captureBody?: boolean;
22
+ isMaskingEnabled?: boolean;
23
+ maskBody?: (arg: any, span: Span) => any;
24
+ maskHeaders?: (arg: any, span: Span) => any;
25
+ maskBodyFieldsList?: string[];
26
+ maskHeadersList?: string[];
27
+ headersToInclude?: string[];
28
+ headersToExclude?: string[];
29
+ }
30
+ export declare const SessionRecorderHttpInstrumentationHooksNode: {
31
+ responseHook: (options?: HttpResponseHookOptions) => (span: Span, response: IncomingMessage | ServerResponse) => void;
32
+ requestHook: (options?: HttpRequestHookOptions) => (span: Span, request: ClientRequest | IncomingMessage) => void;
33
+ };
34
+ export {};
35
+ //# sourceMappingURL=SessionRecorderHttpInstrumentationHooksNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionRecorderHttpInstrumentationHooksNode.d.ts","sourceRoot":"","sources":["../../src/SessionRecorderHttpInstrumentationHooksNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAoB9C,UAAU,uBAAuB;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAE3B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IACxC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IAE3C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAE1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC5B;AAED,UAAU,sBAAsB;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAEhC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IACxC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,CAAA;IAE3C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAE1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC5B;AAqED,eAAO,MAAM,2CAA2C;6BAC9B,uBAAuB,YACtC,IAAI,YAAY,eAAe,GAAG,cAAc;4BAqIlC,sBAAsB,YACpC,IAAI,WAAW,aAAa,GAAG,eAAe;CA6FxD,CAAA"}
@@ -0,0 +1,355 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ var __read = (this && this.__read) || function (o, n) {
38
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
39
+ if (!m) return o;
40
+ var i = m.call(o), r, ar = [], e;
41
+ try {
42
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
43
+ }
44
+ catch (error) { e = { error: error }; }
45
+ finally {
46
+ try {
47
+ if (r && !r.done && (m = i["return"])) m.call(i);
48
+ }
49
+ finally { if (e) throw e.error; }
50
+ }
51
+ return ar;
52
+ };
53
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
54
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
55
+ if (ar || !(i in from)) {
56
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
57
+ ar[i] = from[i];
58
+ }
59
+ }
60
+ return to.concat(ar || Array.prototype.slice.call(from));
61
+ };
62
+ var __values = (this && this.__values) || function(o) {
63
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
64
+ if (m) return m.call(o);
65
+ if (o && typeof o.length === "number") return {
66
+ next: function () {
67
+ if (o && i >= o.length) o = void 0;
68
+ return { value: o && o[i++], done: !o };
69
+ }
70
+ };
71
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
72
+ };
73
+ import * as zlib from 'zlib';
74
+ import { ATTR_MULTIPLAYER_HTTP_REQUEST_BODY, ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY, ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS, MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE, ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING, MULTIPLAYER_TRACE_DEBUG_PREFIX, } from './constants.node';
75
+ import { mask, schemify, isGzip, } from './sdk';
76
+ import { sensitiveFields, sensitiveHeaders } from './sdk/mask';
77
+ var setDefaultOptions = function (options) {
78
+ options.captureHeaders = 'captureHeaders' in options
79
+ ? options.captureHeaders
80
+ : true;
81
+ options.captureBody = 'captureBody' in options
82
+ ? options.captureBody
83
+ : true;
84
+ options.isMaskingEnabled = 'isMaskingEnabled' in options
85
+ ? options.isMaskingEnabled
86
+ : true;
87
+ options.schemifyDocSpanPayload = 'schemifyDocSpanPayload' in options
88
+ ? options.schemifyDocSpanPayload
89
+ : false;
90
+ options.uncompressPayload = 'uncompressPayload' in options
91
+ ? options.uncompressPayload
92
+ : true;
93
+ options.maskBody = options.maskBody || mask(__spreadArray(__spreadArray([], __read((Array.isArray(options.maskBodyFieldsList)
94
+ ? options.maskBodyFieldsList
95
+ : sensitiveFields)), false), __read((Array.isArray(options.maskHeadersList)
96
+ ? options.maskHeadersList
97
+ : sensitiveHeaders)), false));
98
+ options.maskHeaders = options.maskHeaders || mask(__spreadArray(__spreadArray([], __read((Array.isArray(options.maskBodyFieldsList)
99
+ ? options.maskBodyFieldsList
100
+ : sensitiveFields)), false), __read((Array.isArray(options.maskHeadersList)
101
+ ? options.maskHeadersList
102
+ : sensitiveHeaders)), false));
103
+ options.maxPayloadSizeBytes = options.maxPayloadSizeBytes || MULTIPLAYER_MAX_HTTP_REQUEST_RESPONSE_SIZE;
104
+ return options;
105
+ };
106
+ export var SessionRecorderHttpInstrumentationHooksNode = {
107
+ responseHook: function (options) {
108
+ if (options === void 0) { options = {}; }
109
+ return function (span, response) {
110
+ try {
111
+ var _options_1 = setDefaultOptions(options);
112
+ if (!_options_1.captureBody && !_options_1.captureHeaders) {
113
+ return;
114
+ }
115
+ var _response_1 = response;
116
+ var traceId_1 = span.spanContext().traceId;
117
+ if (_response_1.setHeader) {
118
+ _response_1.setHeader('X-Trace-Id', traceId_1);
119
+ }
120
+ var _a = __read([_response_1.write, _response_1.end], 2), oldWrite_1 = _a[0], oldEnd_1 = _a[1];
121
+ var chunks_1 = [];
122
+ if (_options_1.captureBody) {
123
+ _response_1.write = function () {
124
+ var restArgs = [];
125
+ for (var _i = 0; _i < arguments.length; _i++) {
126
+ restArgs[_i] = arguments[_i];
127
+ }
128
+ chunks_1.push(Buffer.from(restArgs[0]));
129
+ // eslint-disable-next-line
130
+ // @ts-ignore
131
+ oldWrite_1.apply(_response_1, restArgs);
132
+ };
133
+ }
134
+ // eslint-disable-next-line
135
+ // @ts-ignore
136
+ _response_1.end = function () {
137
+ var restArgs = [];
138
+ for (var _i = 0; _i < arguments.length; _i++) {
139
+ restArgs[_i] = arguments[_i];
140
+ }
141
+ return __awaiter(this, void 0, void 0, function () {
142
+ var responseBuffer, responseBody, skipResponseBodyModification, dezippedBuffer, headers, _headers, _a, _b, headerName, _c, _d, headerName, stringifiedHeaders;
143
+ var e_1, _e, e_2, _f;
144
+ var _g, _h, _j;
145
+ return __generator(this, function (_k) {
146
+ switch (_k.label) {
147
+ case 0:
148
+ if (_options_1.captureBody && restArgs[0]) {
149
+ chunks_1.push(Buffer.from(restArgs[0]));
150
+ }
151
+ responseBuffer = Buffer.concat(chunks_1);
152
+ if (!(_options_1.captureBody
153
+ && responseBuffer.byteLength > 0
154
+ && responseBuffer.byteLength < _options_1.maxPayloadSizeBytes)) return [3 /*break*/, 6];
155
+ responseBody = void 0;
156
+ skipResponseBodyModification = false;
157
+ if (!isGzip(responseBuffer)) return [3 /*break*/, 4];
158
+ if (!_options_1.uncompressPayload) return [3 /*break*/, 2];
159
+ return [4 /*yield*/, new Promise(function (resolve) { return zlib
160
+ .gunzip(responseBuffer, function (err, dezipped) {
161
+ if (err) {
162
+ return resolve(Buffer.from(''));
163
+ }
164
+ else {
165
+ return resolve(dezipped);
166
+ }
167
+ }); })];
168
+ case 1:
169
+ dezippedBuffer = _k.sent();
170
+ responseBody = dezippedBuffer.toString('utf-8');
171
+ return [3 /*break*/, 3];
172
+ case 2:
173
+ span.setAttribute(ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY_ENCODING, 'gzip');
174
+ skipResponseBodyModification = true;
175
+ responseBody = responseBuffer.toString('hex');
176
+ _k.label = 3;
177
+ case 3: return [3 /*break*/, 5];
178
+ case 4:
179
+ responseBody = responseBuffer.toString('utf-8');
180
+ _k.label = 5;
181
+ case 5:
182
+ if (!skipResponseBodyModification) {
183
+ if (traceId_1.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
184
+ && _options_1.isMaskingEnabled) {
185
+ responseBody = _options_1.maskBody(responseBody, span);
186
+ }
187
+ else if (_options_1.schemifyDocSpanPayload) {
188
+ responseBody = schemify(responseBody);
189
+ }
190
+ else if (typeof responseBody !== 'string') {
191
+ responseBody = JSON.stringify(responseBody);
192
+ }
193
+ }
194
+ if (responseBody.length) {
195
+ span.setAttribute(ATTR_MULTIPLAYER_HTTP_RESPONSE_BODY, responseBody);
196
+ }
197
+ _k.label = 6;
198
+ case 6:
199
+ if (_options_1.captureHeaders) {
200
+ headers = _options_1.maskHeaders(_response_1.getHeaders(), span);
201
+ _headers = {};
202
+ if (!((_g = _options_1.headersToInclude) === null || _g === void 0 ? void 0 : _g.length)
203
+ && !((_h = _options_1.headersToExclude) === null || _h === void 0 ? void 0 : _h.length)) {
204
+ _headers = JSON.parse(JSON.stringify(headers));
205
+ }
206
+ else {
207
+ if (_options_1.headersToInclude) {
208
+ try {
209
+ for (_a = __values(_options_1.headersToInclude), _b = _a.next(); !_b.done; _b = _a.next()) {
210
+ headerName = _b.value;
211
+ _headers[headerName] = headers[headerName];
212
+ }
213
+ }
214
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
215
+ finally {
216
+ try {
217
+ if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
218
+ }
219
+ finally { if (e_1) throw e_1.error; }
220
+ }
221
+ }
222
+ if ((_j = _options_1.headersToExclude) === null || _j === void 0 ? void 0 : _j.length) {
223
+ try {
224
+ for (_c = __values(_options_1.headersToExclude), _d = _c.next(); !_d.done; _d = _c.next()) {
225
+ headerName = _d.value;
226
+ delete _headers[headerName];
227
+ }
228
+ }
229
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
230
+ finally {
231
+ try {
232
+ if (_d && !_d.done && (_f = _c.return)) _f.call(_c);
233
+ }
234
+ finally { if (e_2) throw e_2.error; }
235
+ }
236
+ }
237
+ }
238
+ stringifiedHeaders = JSON.stringify(_headers);
239
+ if (stringifiedHeaders === null || stringifiedHeaders === void 0 ? void 0 : stringifiedHeaders.length) {
240
+ span.setAttribute(ATTR_MULTIPLAYER_HTTP_RESPONSE_HEADERS, stringifiedHeaders);
241
+ }
242
+ }
243
+ // eslint-disable-next-line
244
+ // @ts-ignore
245
+ return [2 /*return*/, oldEnd_1.apply(_response_1, restArgs)];
246
+ }
247
+ });
248
+ });
249
+ };
250
+ }
251
+ catch (error) {
252
+ // eslint-disable-next-line
253
+ console.error('An error occured in multiplayer otlp http responseHook', error);
254
+ }
255
+ };
256
+ },
257
+ requestHook: function (options) {
258
+ if (options === void 0) { options = {}; }
259
+ return function (span, request) {
260
+ var e_3, _a, e_4, _b;
261
+ var _c, _d, _e, _f;
262
+ try {
263
+ var _options_2 = setDefaultOptions(options);
264
+ if (!_options_2.captureBody && !_options_2.captureHeaders) {
265
+ return;
266
+ }
267
+ var traceId_2 = span.spanContext().traceId;
268
+ var _request = request;
269
+ if (_options_2.captureHeaders) {
270
+ var _headers = {};
271
+ if (!((_c = _options_2.headersToInclude) === null || _c === void 0 ? void 0 : _c.length)
272
+ && !((_d = _options_2.headersToExclude) === null || _d === void 0 ? void 0 : _d.length)) {
273
+ _headers = JSON.parse(JSON.stringify(_request.headers));
274
+ }
275
+ else {
276
+ if (_options_2.headersToInclude) {
277
+ try {
278
+ for (var _g = __values(_options_2.headersToInclude), _h = _g.next(); !_h.done; _h = _g.next()) {
279
+ var headerName = _h.value;
280
+ _headers[headerName] = _request.headers;
281
+ }
282
+ }
283
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
284
+ finally {
285
+ try {
286
+ if (_h && !_h.done && (_a = _g.return)) _a.call(_g);
287
+ }
288
+ finally { if (e_3) throw e_3.error; }
289
+ }
290
+ }
291
+ if ((_e = _options_2.headersToExclude) === null || _e === void 0 ? void 0 : _e.length) {
292
+ try {
293
+ for (var _j = __values(_options_2.headersToExclude), _k = _j.next(); !_k.done; _k = _j.next()) {
294
+ var headerName = _k.value;
295
+ delete _headers[headerName];
296
+ }
297
+ }
298
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
299
+ finally {
300
+ try {
301
+ if (_k && !_k.done && (_b = _j.return)) _b.call(_j);
302
+ }
303
+ finally { if (e_4) throw e_4.error; }
304
+ }
305
+ }
306
+ }
307
+ var headers = _options_2.maskHeaders(_headers, span);
308
+ span.setAttribute(ATTR_MULTIPLAYER_HTTP_REQUEST_HEADERS, JSON.stringify(headers));
309
+ }
310
+ var contentType = (_f = _request === null || _request === void 0 ? void 0 : _request.headers) === null || _f === void 0 ? void 0 : _f['content-type'];
311
+ if (_options_2.captureBody
312
+ && (contentType === null || contentType === void 0 ? void 0 : contentType.includes('application/json'))) {
313
+ var body_1 = '';
314
+ _request.on('data', function (chunk) {
315
+ body_1 += chunk;
316
+ });
317
+ _request.on('end', function () {
318
+ try {
319
+ var requestBodySizeBytes = Buffer.byteLength(body_1, 'utf8');
320
+ if (requestBodySizeBytes === 0
321
+ || requestBodySizeBytes > _options_2.maxPayloadSizeBytes) {
322
+ return;
323
+ }
324
+ var requestBody = body_1;
325
+ if (!requestBody)
326
+ return;
327
+ if (traceId_2.startsWith(MULTIPLAYER_TRACE_DEBUG_PREFIX)
328
+ && _options_2.isMaskingEnabled) {
329
+ requestBody = _options_2.maskBody(requestBody, span);
330
+ }
331
+ else if (_options_2.schemifyDocSpanPayload) {
332
+ requestBody = schemify(requestBody);
333
+ }
334
+ else if (typeof requestBody !== 'string') {
335
+ requestBody = JSON.stringify(requestBody);
336
+ }
337
+ if (requestBody === null || requestBody === void 0 ? void 0 : requestBody.length) {
338
+ span.setAttribute(ATTR_MULTIPLAYER_HTTP_REQUEST_BODY, requestBody);
339
+ }
340
+ }
341
+ catch (err) {
342
+ // eslint-disable-next-line
343
+ console.error('[MULTIPLAYER-HTTP-REQ-HOOK] An error occured in multiplayer otlp http requestHook', err);
344
+ }
345
+ });
346
+ }
347
+ }
348
+ catch (error) {
349
+ // eslint-disable-next-line
350
+ console.error('An error occured in multiplayer otlp http requestHook', error);
351
+ }
352
+ };
353
+ },
354
+ };
355
+ //# sourceMappingURL=SessionRecorderHttpInstrumentationHooksNode.js.map