@softprobe/softprobe-js 2.0.0

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 (328) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/bin/softprobe +15 -0
  4. package/dist/api/baggage.d.ts +13 -0
  5. package/dist/api/baggage.d.ts.map +1 -0
  6. package/dist/api/baggage.js +32 -0
  7. package/dist/api/baggage.js.map +1 -0
  8. package/dist/api/compare.d.ts +16 -0
  9. package/dist/api/compare.d.ts.map +1 -0
  10. package/dist/api/compare.js +77 -0
  11. package/dist/api/compare.js.map +1 -0
  12. package/dist/api.d.ts +63 -0
  13. package/dist/api.d.ts.map +1 -0
  14. package/dist/api.js +104 -0
  15. package/dist/api.js.map +1 -0
  16. package/dist/bindings/http-span.d.ts +6 -0
  17. package/dist/bindings/http-span.d.ts.map +1 -0
  18. package/dist/bindings/http-span.js +11 -0
  19. package/dist/bindings/http-span.js.map +1 -0
  20. package/dist/bindings/postgres-span.d.ts +6 -0
  21. package/dist/bindings/postgres-span.d.ts.map +1 -0
  22. package/dist/bindings/postgres-span.js +11 -0
  23. package/dist/bindings/postgres-span.js.map +1 -0
  24. package/dist/bindings/redis-span.d.ts +6 -0
  25. package/dist/bindings/redis-span.d.ts.map +1 -0
  26. package/dist/bindings/redis-span.js +11 -0
  27. package/dist/bindings/redis-span.js.map +1 -0
  28. package/dist/bindings/test-span.d.ts +6 -0
  29. package/dist/bindings/test-span.d.ts.map +1 -0
  30. package/dist/bindings/test-span.js +9 -0
  31. package/dist/bindings/test-span.js.map +1 -0
  32. package/dist/bootstrap/otel/framework-mutator.d.ts +20 -0
  33. package/dist/bootstrap/otel/framework-mutator.d.ts.map +1 -0
  34. package/dist/bootstrap/otel/framework-mutator.js +144 -0
  35. package/dist/bootstrap/otel/framework-mutator.js.map +1 -0
  36. package/dist/bootstrap/otel/inject.d.ts +17 -0
  37. package/dist/bootstrap/otel/inject.d.ts.map +1 -0
  38. package/dist/bootstrap/otel/inject.js +28 -0
  39. package/dist/bootstrap/otel/inject.js.map +1 -0
  40. package/dist/bootstrap/otel/mutator.d.ts +17 -0
  41. package/dist/bootstrap/otel/mutator.d.ts.map +1 -0
  42. package/dist/bootstrap/otel/mutator.js +51 -0
  43. package/dist/bootstrap/otel/mutator.js.map +1 -0
  44. package/dist/capture/express.d.ts +6 -0
  45. package/dist/capture/express.d.ts.map +1 -0
  46. package/dist/capture/express.js +11 -0
  47. package/dist/capture/express.js.map +1 -0
  48. package/dist/capture/fastify.d.ts +5 -0
  49. package/dist/capture/fastify.d.ts.map +1 -0
  50. package/dist/capture/fastify.js +9 -0
  51. package/dist/capture/fastify.js.map +1 -0
  52. package/dist/capture/framework-mutator.d.ts +20 -0
  53. package/dist/capture/framework-mutator.d.ts.map +1 -0
  54. package/dist/capture/framework-mutator.js +144 -0
  55. package/dist/capture/framework-mutator.js.map +1 -0
  56. package/dist/capture/http-inbound.d.ts +28 -0
  57. package/dist/capture/http-inbound.d.ts.map +1 -0
  58. package/dist/capture/http-inbound.js +40 -0
  59. package/dist/capture/http-inbound.js.map +1 -0
  60. package/dist/capture/inject.d.ts +17 -0
  61. package/dist/capture/inject.d.ts.map +1 -0
  62. package/dist/capture/inject.js +28 -0
  63. package/dist/capture/inject.js.map +1 -0
  64. package/dist/capture/mutator.d.ts +17 -0
  65. package/dist/capture/mutator.d.ts.map +1 -0
  66. package/dist/capture/mutator.js +51 -0
  67. package/dist/capture/mutator.js.map +1 -0
  68. package/dist/capture/postgres.d.ts +6 -0
  69. package/dist/capture/postgres.d.ts.map +1 -0
  70. package/dist/capture/postgres.js +11 -0
  71. package/dist/capture/postgres.js.map +1 -0
  72. package/dist/capture/redis.d.ts +5 -0
  73. package/dist/capture/redis.d.ts.map +1 -0
  74. package/dist/capture/redis.js +10 -0
  75. package/dist/capture/redis.js.map +1 -0
  76. package/dist/capture/store-accessor.d.ts +11 -0
  77. package/dist/capture/store-accessor.d.ts.map +1 -0
  78. package/dist/capture/store-accessor.js +19 -0
  79. package/dist/capture/store-accessor.js.map +1 -0
  80. package/dist/capture/stream-tap.d.ts +5 -0
  81. package/dist/capture/stream-tap.d.ts.map +1 -0
  82. package/dist/capture/stream-tap.js +9 -0
  83. package/dist/capture/stream-tap.js.map +1 -0
  84. package/dist/cli/diff-reporter.d.ts +26 -0
  85. package/dist/cli/diff-reporter.d.ts.map +1 -0
  86. package/dist/cli/diff-reporter.js +163 -0
  87. package/dist/cli/diff-reporter.js.map +1 -0
  88. package/dist/cli/diff.d.ts +18 -0
  89. package/dist/cli/diff.d.ts.map +1 -0
  90. package/dist/cli/diff.js +105 -0
  91. package/dist/cli/diff.js.map +1 -0
  92. package/dist/cli.d.ts +7 -0
  93. package/dist/cli.d.ts.map +1 -0
  94. package/dist/cli.js +84 -0
  95. package/dist/cli.js.map +1 -0
  96. package/dist/config/config-manager.d.ts +20 -0
  97. package/dist/config/config-manager.d.ts.map +1 -0
  98. package/dist/config/config-manager.js +46 -0
  99. package/dist/config/config-manager.js.map +1 -0
  100. package/dist/context.d.ts +98 -0
  101. package/dist/context.d.ts.map +1 -0
  102. package/dist/context.js +198 -0
  103. package/dist/context.js.map +1 -0
  104. package/dist/core/bindings/http-span.d.ts +39 -0
  105. package/dist/core/bindings/http-span.d.ts.map +1 -0
  106. package/dist/core/bindings/http-span.js +55 -0
  107. package/dist/core/bindings/http-span.js.map +1 -0
  108. package/dist/core/bindings/index.d.ts +12 -0
  109. package/dist/core/bindings/index.d.ts.map +1 -0
  110. package/dist/core/bindings/index.js +21 -0
  111. package/dist/core/bindings/index.js.map +1 -0
  112. package/dist/core/bindings/postgres-span.d.ts +41 -0
  113. package/dist/core/bindings/postgres-span.d.ts.map +1 -0
  114. package/dist/core/bindings/postgres-span.js +57 -0
  115. package/dist/core/bindings/postgres-span.js.map +1 -0
  116. package/dist/core/bindings/redis-span.d.ts +40 -0
  117. package/dist/core/bindings/redis-span.d.ts.map +1 -0
  118. package/dist/core/bindings/redis-span.js +65 -0
  119. package/dist/core/bindings/redis-span.js.map +1 -0
  120. package/dist/core/bindings/test-span.d.ts +15 -0
  121. package/dist/core/bindings/test-span.d.ts.map +1 -0
  122. package/dist/core/bindings/test-span.js +24 -0
  123. package/dist/core/bindings/test-span.js.map +1 -0
  124. package/dist/core/cassette/capture-store-accessor.d.ts +11 -0
  125. package/dist/core/cassette/capture-store-accessor.d.ts.map +1 -0
  126. package/dist/core/cassette/capture-store-accessor.js +19 -0
  127. package/dist/core/cassette/capture-store-accessor.js.map +1 -0
  128. package/dist/core/cassette/context-request-storage.d.ts +14 -0
  129. package/dist/core/cassette/context-request-storage.d.ts.map +1 -0
  130. package/dist/core/cassette/context-request-storage.js +24 -0
  131. package/dist/core/cassette/context-request-storage.js.map +1 -0
  132. package/dist/core/cassette/index.d.ts +8 -0
  133. package/dist/core/cassette/index.d.ts.map +1 -0
  134. package/dist/core/cassette/index.js +16 -0
  135. package/dist/core/cassette/index.js.map +1 -0
  136. package/dist/core/cassette/ndjson-cassette.d.ts +22 -0
  137. package/dist/core/cassette/ndjson-cassette.d.ts.map +1 -0
  138. package/dist/core/cassette/ndjson-cassette.js +56 -0
  139. package/dist/core/cassette/ndjson-cassette.js.map +1 -0
  140. package/dist/core/cassette/request-storage.d.ts +16 -0
  141. package/dist/core/cassette/request-storage.d.ts.map +1 -0
  142. package/dist/core/cassette/request-storage.js +22 -0
  143. package/dist/core/cassette/request-storage.js.map +1 -0
  144. package/dist/core/context/index.d.ts +5 -0
  145. package/dist/core/context/index.d.ts.map +1 -0
  146. package/dist/core/context/index.js +9 -0
  147. package/dist/core/context/index.js.map +1 -0
  148. package/dist/core/contracts/index.d.ts +5 -0
  149. package/dist/core/contracts/index.d.ts.map +1 -0
  150. package/dist/core/contracts/index.js +3 -0
  151. package/dist/core/contracts/index.js.map +1 -0
  152. package/dist/core/identifier.d.ts +20 -0
  153. package/dist/core/identifier.d.ts.map +1 -0
  154. package/dist/core/identifier.js +31 -0
  155. package/dist/core/identifier.js.map +1 -0
  156. package/dist/core/index.d.ts +11 -0
  157. package/dist/core/index.d.ts.map +1 -0
  158. package/dist/core/index.js +27 -0
  159. package/dist/core/index.js.map +1 -0
  160. package/dist/core/matcher/extract-key.d.ts +41 -0
  161. package/dist/core/matcher/extract-key.d.ts.map +1 -0
  162. package/dist/core/matcher/extract-key.js +80 -0
  163. package/dist/core/matcher/extract-key.js.map +1 -0
  164. package/dist/core/matcher/index.d.ts +9 -0
  165. package/dist/core/matcher/index.d.ts.map +1 -0
  166. package/dist/core/matcher/index.js +24 -0
  167. package/dist/core/matcher/index.js.map +1 -0
  168. package/dist/core/matcher/matcher.d.ts +25 -0
  169. package/dist/core/matcher/matcher.d.ts.map +1 -0
  170. package/dist/core/matcher/matcher.js +83 -0
  171. package/dist/core/matcher/matcher.js.map +1 -0
  172. package/dist/core/matcher/softprobe-matcher.d.ts +41 -0
  173. package/dist/core/matcher/softprobe-matcher.d.ts.map +1 -0
  174. package/dist/core/matcher/softprobe-matcher.js +92 -0
  175. package/dist/core/matcher/softprobe-matcher.js.map +1 -0
  176. package/dist/core/matcher/store-accessor.d.ts +14 -0
  177. package/dist/core/matcher/store-accessor.d.ts.map +1 -0
  178. package/dist/core/matcher/store-accessor.js +25 -0
  179. package/dist/core/matcher/store-accessor.js.map +1 -0
  180. package/dist/core/matcher/topology.d.ts +37 -0
  181. package/dist/core/matcher/topology.d.ts.map +1 -0
  182. package/dist/core/matcher/topology.js +72 -0
  183. package/dist/core/matcher/topology.js.map +1 -0
  184. package/dist/core/runtime/architecture-guard.d.ts +9 -0
  185. package/dist/core/runtime/architecture-guard.d.ts.map +1 -0
  186. package/dist/core/runtime/architecture-guard.js +131 -0
  187. package/dist/core/runtime/architecture-guard.js.map +1 -0
  188. package/dist/core/runtime/index.d.ts +6 -0
  189. package/dist/core/runtime/index.d.ts.map +1 -0
  190. package/dist/core/runtime/index.js +11 -0
  191. package/dist/core/runtime/index.js.map +1 -0
  192. package/dist/identifier.d.ts +5 -0
  193. package/dist/identifier.d.ts.map +1 -0
  194. package/dist/identifier.js +11 -0
  195. package/dist/identifier.js.map +1 -0
  196. package/dist/index.d.ts +5 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +21 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/init.d.ts +21 -0
  201. package/dist/init.d.ts.map +1 -0
  202. package/dist/init.js +51 -0
  203. package/dist/init.js.map +1 -0
  204. package/dist/instrumentations/common/http/context-headers.d.ts +9 -0
  205. package/dist/instrumentations/common/http/context-headers.d.ts.map +1 -0
  206. package/dist/instrumentations/common/http/context-headers.js +16 -0
  207. package/dist/instrumentations/common/http/context-headers.js.map +1 -0
  208. package/dist/instrumentations/common/http/inbound-capture.d.ts +17 -0
  209. package/dist/instrumentations/common/http/inbound-capture.d.ts.map +1 -0
  210. package/dist/instrumentations/common/http/inbound-capture.js +41 -0
  211. package/dist/instrumentations/common/http/inbound-capture.js.map +1 -0
  212. package/dist/instrumentations/common/http/inbound-record.d.ts +28 -0
  213. package/dist/instrumentations/common/http/inbound-record.d.ts.map +1 -0
  214. package/dist/instrumentations/common/http/inbound-record.js +40 -0
  215. package/dist/instrumentations/common/http/inbound-record.js.map +1 -0
  216. package/dist/instrumentations/common/http/span-adapter.d.ts +6 -0
  217. package/dist/instrumentations/common/http/span-adapter.d.ts.map +1 -0
  218. package/dist/instrumentations/common/http/span-adapter.js +12 -0
  219. package/dist/instrumentations/common/http/span-adapter.js.map +1 -0
  220. package/dist/instrumentations/common/http/stream-tap.d.ts +28 -0
  221. package/dist/instrumentations/common/http/stream-tap.d.ts.map +1 -0
  222. package/dist/instrumentations/common/http/stream-tap.js +61 -0
  223. package/dist/instrumentations/common/http/stream-tap.js.map +1 -0
  224. package/dist/instrumentations/express/capture.d.ts +26 -0
  225. package/dist/instrumentations/express/capture.d.ts.map +1 -0
  226. package/dist/instrumentations/express/capture.js +80 -0
  227. package/dist/instrumentations/express/capture.js.map +1 -0
  228. package/dist/instrumentations/express/index.d.ts +7 -0
  229. package/dist/instrumentations/express/index.d.ts.map +1 -0
  230. package/dist/instrumentations/express/index.js +15 -0
  231. package/dist/instrumentations/express/index.js.map +1 -0
  232. package/dist/instrumentations/express/replay.d.ts +10 -0
  233. package/dist/instrumentations/express/replay.d.ts.map +1 -0
  234. package/dist/instrumentations/express/replay.js +16 -0
  235. package/dist/instrumentations/express/replay.js.map +1 -0
  236. package/dist/instrumentations/fastify/capture.d.ts +13 -0
  237. package/dist/instrumentations/fastify/capture.d.ts.map +1 -0
  238. package/dist/instrumentations/fastify/capture.js +65 -0
  239. package/dist/instrumentations/fastify/capture.js.map +1 -0
  240. package/dist/instrumentations/fastify/index.d.ts +7 -0
  241. package/dist/instrumentations/fastify/index.d.ts.map +1 -0
  242. package/dist/instrumentations/fastify/index.js +13 -0
  243. package/dist/instrumentations/fastify/index.js.map +1 -0
  244. package/dist/instrumentations/fastify/replay.d.ts +13 -0
  245. package/dist/instrumentations/fastify/replay.d.ts.map +1 -0
  246. package/dist/instrumentations/fastify/replay.js +24 -0
  247. package/dist/instrumentations/fastify/replay.js.map +1 -0
  248. package/dist/instrumentations/fetch/index.d.ts +5 -0
  249. package/dist/instrumentations/fetch/index.d.ts.map +1 -0
  250. package/dist/instrumentations/fetch/index.js +10 -0
  251. package/dist/instrumentations/fetch/index.js.map +1 -0
  252. package/dist/instrumentations/fetch/replay.d.ts +19 -0
  253. package/dist/instrumentations/fetch/replay.d.ts.map +1 -0
  254. package/dist/instrumentations/fetch/replay.js +259 -0
  255. package/dist/instrumentations/fetch/replay.js.map +1 -0
  256. package/dist/instrumentations/postgres/capture.d.ts +46 -0
  257. package/dist/instrumentations/postgres/capture.d.ts.map +1 -0
  258. package/dist/instrumentations/postgres/capture.js +68 -0
  259. package/dist/instrumentations/postgres/capture.js.map +1 -0
  260. package/dist/instrumentations/postgres/index.d.ts +6 -0
  261. package/dist/instrumentations/postgres/index.d.ts.map +1 -0
  262. package/dist/instrumentations/postgres/index.js +14 -0
  263. package/dist/instrumentations/postgres/index.js.map +1 -0
  264. package/dist/instrumentations/postgres/replay.d.ts +20 -0
  265. package/dist/instrumentations/postgres/replay.d.ts.map +1 -0
  266. package/dist/instrumentations/postgres/replay.js +163 -0
  267. package/dist/instrumentations/postgres/replay.js.map +1 -0
  268. package/dist/instrumentations/redis/capture.d.ts +20 -0
  269. package/dist/instrumentations/redis/capture.d.ts.map +1 -0
  270. package/dist/instrumentations/redis/capture.js +61 -0
  271. package/dist/instrumentations/redis/capture.js.map +1 -0
  272. package/dist/instrumentations/redis/index.d.ts +6 -0
  273. package/dist/instrumentations/redis/index.d.ts.map +1 -0
  274. package/dist/instrumentations/redis/index.js +13 -0
  275. package/dist/instrumentations/redis/index.js.map +1 -0
  276. package/dist/instrumentations/redis/replay.d.ts +24 -0
  277. package/dist/instrumentations/redis/replay.d.ts.map +1 -0
  278. package/dist/instrumentations/redis/replay.js +173 -0
  279. package/dist/instrumentations/redis/replay.js.map +1 -0
  280. package/dist/replay/express.d.ts +5 -0
  281. package/dist/replay/express.d.ts.map +1 -0
  282. package/dist/replay/express.js +9 -0
  283. package/dist/replay/express.js.map +1 -0
  284. package/dist/replay/extract-key.d.ts +41 -0
  285. package/dist/replay/extract-key.d.ts.map +1 -0
  286. package/dist/replay/extract-key.js +80 -0
  287. package/dist/replay/extract-key.js.map +1 -0
  288. package/dist/replay/fastify.d.ts +5 -0
  289. package/dist/replay/fastify.d.ts.map +1 -0
  290. package/dist/replay/fastify.js +9 -0
  291. package/dist/replay/fastify.js.map +1 -0
  292. package/dist/replay/http.d.ts +5 -0
  293. package/dist/replay/http.d.ts.map +1 -0
  294. package/dist/replay/http.js +10 -0
  295. package/dist/replay/http.js.map +1 -0
  296. package/dist/replay/matcher.d.ts +25 -0
  297. package/dist/replay/matcher.d.ts.map +1 -0
  298. package/dist/replay/matcher.js +83 -0
  299. package/dist/replay/matcher.js.map +1 -0
  300. package/dist/replay/postgres.d.ts +5 -0
  301. package/dist/replay/postgres.d.ts.map +1 -0
  302. package/dist/replay/postgres.js +10 -0
  303. package/dist/replay/postgres.js.map +1 -0
  304. package/dist/replay/redis.d.ts +5 -0
  305. package/dist/replay/redis.d.ts.map +1 -0
  306. package/dist/replay/redis.js +10 -0
  307. package/dist/replay/redis.js.map +1 -0
  308. package/dist/replay/softprobe-matcher.d.ts +41 -0
  309. package/dist/replay/softprobe-matcher.d.ts.map +1 -0
  310. package/dist/replay/softprobe-matcher.js +92 -0
  311. package/dist/replay/softprobe-matcher.js.map +1 -0
  312. package/dist/replay/store-accessor.d.ts +14 -0
  313. package/dist/replay/store-accessor.d.ts.map +1 -0
  314. package/dist/replay/store-accessor.js +26 -0
  315. package/dist/replay/store-accessor.js.map +1 -0
  316. package/dist/replay/topology.d.ts +37 -0
  317. package/dist/replay/topology.d.ts.map +1 -0
  318. package/dist/replay/topology.js +72 -0
  319. package/dist/replay/topology.js.map +1 -0
  320. package/dist/store/cassette-store.d.ts +36 -0
  321. package/dist/store/cassette-store.d.ts.map +1 -0
  322. package/dist/store/cassette-store.js +66 -0
  323. package/dist/store/cassette-store.js.map +1 -0
  324. package/dist/types/schema.d.ts +114 -0
  325. package/dist/types/schema.d.ts.map +1 -0
  326. package/dist/types/schema.js +13 -0
  327. package/dist/types/schema.js.map +1 -0
  328. package/package.json +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-record.js","sourceRoot":"","sources":["../../../../src/instrumentations/common/http/inbound-record.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAyBH,wDAuCC;AA5DD,yDAA0D;AAiB1D;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,KAAoB,EACpB,OAAgC;IAEhC,MAAM,EACJ,OAAO,EACP,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,GAAG,EACH,WAAW,EACX,UAAU,EACV,YAAY,GACb,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAA4B;QACtC,OAAO,EAAE,KAAK;QACd,OAAO;QACP,MAAM;QACN,YAAY;QACZ,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,IAAA,2BAAc,EAAC,MAAM,EAAE,GAAG,CAAC;KACxC,CAAC;IAEF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,cAAc,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,CAAC,eAAe,GAAG;YACvB,UAAU;YACV,IAAI,EAAE,YAAY;SACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Builds the canonical inbound HTTP identifier used for capture/replay matching.
3
+ * Keeps Express and Fastify inbound capture paths aligned on one shared implementation.
4
+ */
5
+ export declare function buildInboundHttpIdentifier(method: string, url: string): string;
6
+ //# sourceMappingURL=span-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-adapter.d.ts","sourceRoot":"","sources":["../../../../src/instrumentations/common/http/span-adapter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9E"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildInboundHttpIdentifier = buildInboundHttpIdentifier;
4
+ const identifier_1 = require("../../../core/identifier");
5
+ /**
6
+ * Builds the canonical inbound HTTP identifier used for capture/replay matching.
7
+ * Keeps Express and Fastify inbound capture paths aligned on one shared implementation.
8
+ */
9
+ function buildInboundHttpIdentifier(method, url) {
10
+ return (0, identifier_1.httpIdentifier)(method, url);
11
+ }
12
+ //# sourceMappingURL=span-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-adapter.js","sourceRoot":"","sources":["../../../../src/instrumentations/common/http/span-adapter.ts"],"names":[],"mappings":";;AAMA,gEAEC;AARD,yDAA0D;AAE1D;;;GAGG;AACH,SAAgB,0BAA0B,CAAC,MAAc,EAAE,GAAW;IACpE,OAAO,IAAA,2BAAc,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Safe stream tap for HTTP capture. Tees a Readable so the original consumer
3
+ * receives the full stream while we collect bytes for the side-channel, with
4
+ * a maxPayloadSize cap. Design §10.2: PassThrough/tee pattern, payload max-size
5
+ * circuit breaker, do not starve original stream consumers.
6
+ */
7
+ import { Readable } from 'stream';
8
+ export type TapReadableStreamOptions = {
9
+ /** Maximum bytes to retain; excess is dropped and truncated=true. */
10
+ maxPayloadSize: number;
11
+ };
12
+ export type TapCaptured = {
13
+ /** Collected body (capped at maxPayloadSize). */
14
+ body: Buffer;
15
+ /** True when stream length exceeded maxPayloadSize. */
16
+ truncated: boolean;
17
+ };
18
+ /**
19
+ * Taps a Node Readable stream: returns a stream that delivers the same data to
20
+ * the consumer, and a getCaptured() that resolves with up to maxPayloadSize
21
+ * bytes and a truncated flag. Does not consume the original stream - the
22
+ * returned readable is the stream the consumer should read from.
23
+ */
24
+ export declare function tapReadableStream(source: Readable, options: TapReadableStreamOptions): {
25
+ readable: Readable;
26
+ getCaptured: () => Promise<TapCaptured>;
27
+ };
28
+ //# sourceMappingURL=stream-tap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-tap.d.ts","sourceRoot":"","sources":["../../../../src/instrumentations/common/http/stream-tap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAe,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE/C,MAAM,MAAM,wBAAwB,GAAG;IACrC,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,wBAAwB,GAChC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAA;CAAE,CA6CjE"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Safe stream tap for HTTP capture. Tees a Readable so the original consumer
4
+ * receives the full stream while we collect bytes for the side-channel, with
5
+ * a maxPayloadSize cap. Design §10.2: PassThrough/tee pattern, payload max-size
6
+ * circuit breaker, do not starve original stream consumers.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.tapReadableStream = tapReadableStream;
10
+ const stream_1 = require("stream");
11
+ /**
12
+ * Taps a Node Readable stream: returns a stream that delivers the same data to
13
+ * the consumer, and a getCaptured() that resolves with up to maxPayloadSize
14
+ * bytes and a truncated flag. Does not consume the original stream - the
15
+ * returned readable is the stream the consumer should read from.
16
+ */
17
+ function tapReadableStream(source, options) {
18
+ const { maxPayloadSize } = options;
19
+ const out = new stream_1.PassThrough();
20
+ const chunks = [];
21
+ let length = 0;
22
+ let truncated = false;
23
+ let settled;
24
+ let resolveCaptured;
25
+ const capturedPromise = new Promise((resolve) => {
26
+ resolveCaptured = resolve;
27
+ });
28
+ source.on('data', (chunk) => {
29
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
30
+ if (length < maxPayloadSize) {
31
+ const remain = maxPayloadSize - length;
32
+ if (buf.length <= remain) {
33
+ chunks.push(buf);
34
+ length += buf.length;
35
+ }
36
+ else {
37
+ chunks.push(buf.subarray(0, remain));
38
+ length += remain;
39
+ truncated = true;
40
+ }
41
+ }
42
+ else {
43
+ truncated = true;
44
+ }
45
+ });
46
+ const finalize = () => {
47
+ if (settled)
48
+ return;
49
+ settled = { body: Buffer.concat(chunks, length), truncated };
50
+ resolveCaptured(settled);
51
+ };
52
+ source.once('end', finalize);
53
+ source.once('error', finalize);
54
+ source.once('close', finalize);
55
+ source.pipe(out);
56
+ return {
57
+ readable: out,
58
+ getCaptured: () => (settled !== undefined ? Promise.resolve(settled) : capturedPromise),
59
+ };
60
+ }
61
+ //# sourceMappingURL=stream-tap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-tap.js","sourceRoot":"","sources":["../../../../src/instrumentations/common/http/stream-tap.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAsBH,8CAgDC;AApED,mCAA+C;AAc/C;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,MAAgB,EAChB,OAAiC;IAEjC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,oBAAW,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,OAAgC,CAAC;IACrC,IAAI,eAA6C,CAAC;IAClD,MAAM,eAAe,GAAG,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;QAC3D,eAAe,GAAG,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,IAAI,MAAM,GAAG,cAAc,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,cAAc,GAAG,MAAM,CAAC;YACvC,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACrC,MAAM,IAAI,MAAM,CAAC;gBACjB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;QAC7D,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE/B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjB,OAAO;QACL,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;KACxF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Express middleware for Softprobe: capture path taps res.send; replay path primes matcher by traceId.
3
+ * Design §16.1: CAPTURE → queueInboundResponse; REPLAY → activateReplayForContext(traceId).
4
+ * Task 17.3.2: Set OTel softprobe context so downstream code can use SoftprobeContext.
5
+ */
6
+ import { CaptureEngine, queueInboundResponse, type QueueInboundResponsePayload } from '../common/http/inbound-capture';
7
+ export { CaptureEngine, queueInboundResponse };
8
+ export type { QueueInboundResponsePayload };
9
+ /**
10
+ * Environment-aware Express middleware. Replay uses cassetteDirectory + traceId (from context/headers);
11
+ * storage is resolved per request and SoftprobeContext.run loads the cassette in REPLAY mode.
12
+ * In CAPTURE mode wraps res.send to record status/body via CaptureEngine.queueInboundResponse.
13
+ * When placed after body-parser, req.body is captured in the inbound record (Task 14.3.1).
14
+ * Task 17.3.2: Runs the whole request inside OTel context and does not return until res.end() so
15
+ * downstream code (route handlers, MSW fetch listener) sees the same SoftprobeContext state.
16
+ */
17
+ export declare function softprobeExpressMiddleware(req: {
18
+ method: string;
19
+ path: string;
20
+ body?: unknown;
21
+ headers?: Record<string, string | string[] | undefined>;
22
+ }, res: {
23
+ statusCode: number;
24
+ send: (body?: unknown) => unknown;
25
+ }, next: (err?: unknown) => void): void | Promise<void>;
26
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/express/capture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,KAAK,2BAA2B,EACjC,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,CAAC;AAC/C,YAAY,EAAE,2BAA2B,EAAE,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CAAE,EAC9G,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;CAAE,EAC9D,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,GAC5B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DtB"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * Express middleware for Softprobe: capture path taps res.send; replay path primes matcher by traceId.
4
+ * Design §16.1: CAPTURE → queueInboundResponse; REPLAY → activateReplayForContext(traceId).
5
+ * Task 17.3.2: Set OTel softprobe context so downstream code can use SoftprobeContext.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.queueInboundResponse = exports.CaptureEngine = void 0;
9
+ exports.softprobeExpressMiddleware = softprobeExpressMiddleware;
10
+ const api_1 = require("@opentelemetry/api");
11
+ const replay_1 = require("./replay");
12
+ const context_1 = require("../../context");
13
+ const context_request_storage_1 = require("../../core/cassette/context-request-storage");
14
+ const inbound_capture_1 = require("../common/http/inbound-capture");
15
+ Object.defineProperty(exports, "CaptureEngine", { enumerable: true, get: function () { return inbound_capture_1.CaptureEngine; } });
16
+ Object.defineProperty(exports, "queueInboundResponse", { enumerable: true, get: function () { return inbound_capture_1.queueInboundResponse; } });
17
+ const span_adapter_1 = require("../common/http/span-adapter");
18
+ /**
19
+ * Environment-aware Express middleware. Replay uses cassetteDirectory + traceId (from context/headers);
20
+ * storage is resolved per request and SoftprobeContext.run loads the cassette in REPLAY mode.
21
+ * In CAPTURE mode wraps res.send to record status/body via CaptureEngine.queueInboundResponse.
22
+ * When placed after body-parser, req.body is captured in the inbound record (Task 14.3.1).
23
+ * Task 17.3.2: Runs the whole request inside OTel context and does not return until res.end() so
24
+ * downstream code (route handlers, MSW fetch listener) sees the same SoftprobeContext state.
25
+ */
26
+ function softprobeExpressMiddleware(req, res, next) {
27
+ const span = api_1.trace.getActiveSpan();
28
+ const spanTraceId = span?.spanContext().traceId;
29
+ const base = context_1.SoftprobeContext.active();
30
+ const withTrace = { ...base, traceId: spanTraceId };
31
+ const fromHeadersValue = context_1.SoftprobeContext.fromHeaders(withTrace, req.headers ?? {});
32
+ // Trace id from header (replay CLI) or OTel active span.
33
+ const traceId = fromHeadersValue.traceId ?? spanTraceId;
34
+ const softprobeValue = { ...fromHeadersValue, traceId };
35
+ const activeCtx = api_1.context.active();
36
+ const ctxWithSoftprobe = context_1.SoftprobeContext.withData(activeCtx, softprobeValue);
37
+ const ctxTraceId = context_1.SoftprobeContext.getTraceId(ctxWithSoftprobe);
38
+ if (!ctxTraceId) {
39
+ console.error('Softprobe: trace id required. Trace id is not set in the context.');
40
+ process.exit(1);
41
+ }
42
+ const mode = context_1.SoftprobeContext.getMode(ctxWithSoftprobe);
43
+ const { storage } = (0, context_request_storage_1.resolveRequestStorageForContext)(req.headers, activeCtx, ctxTraceId);
44
+ const runOptions = { mode, traceId: ctxTraceId, storage };
45
+ const waitForResponseThenNext = () => new Promise((resolve) => {
46
+ const origEnd = res.end?.bind(res);
47
+ if (typeof origEnd === 'function') {
48
+ res.end = function (chunk, encoding, cb) {
49
+ res.end = origEnd;
50
+ const result = origEnd.call(this, chunk, encoding, cb);
51
+ resolve();
52
+ return result;
53
+ };
54
+ }
55
+ else {
56
+ resolve();
57
+ }
58
+ next();
59
+ });
60
+ const promise = api_1.context.with(ctxWithSoftprobe, () => context_1.SoftprobeContext.run(runOptions, async () => {
61
+ if (mode === 'REPLAY') {
62
+ (0, replay_1.activateReplayForContext)(ctxTraceId);
63
+ }
64
+ if (mode === 'CAPTURE') {
65
+ const originalSend = res.send.bind(res);
66
+ res.send = function (body) {
67
+ inbound_capture_1.CaptureEngine.queueInboundResponse(ctxTraceId, {
68
+ status: res.statusCode,
69
+ body,
70
+ identifier: (0, span_adapter_1.buildInboundHttpIdentifier)(req.method, req.path),
71
+ requestBody: req.body,
72
+ });
73
+ return originalSend.apply(res, arguments);
74
+ };
75
+ }
76
+ await waitForResponseThenNext();
77
+ }));
78
+ return Promise.resolve(promise).catch((err) => next(err));
79
+ }
80
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/instrumentations/express/capture.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAwBH,gEAkEC;AAxFD,4CAAoD;AACpD,qCAAoD;AACpD,2CAAiD;AACjD,yFAA8F;AAC9F,oEAIwC;AAG/B,8FANP,+BAAa,OAMO;AAAE,qGALtB,sCAAoB,OAKsB;AAF5C,8DAAyE;AAKzE;;;;;;;GAOG;AACH,SAAgB,0BAA0B,CACxC,GAA8G,EAC9G,GAA8D,EAC9D,IAA6B;IAE7B,MAAM,IAAI,GAAG,WAAK,CAAC,aAAa,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC;IAChD,MAAM,IAAI,GAAG,0BAAgB,CAAC,MAAM,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,0BAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACpF,yDAAyD;IACzD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,IAAI,WAAW,CAAC;IACxD,MAAM,cAAc,GAAG,EAAE,GAAG,gBAAgB,EAAE,OAAO,EAAE,CAAC;IACxD,MAAM,SAAS,GAAG,aAAO,CAAC,MAAM,EAAE,CAAC;IACnC,MAAM,gBAAgB,GAAG,0BAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAE9E,MAAM,UAAU,GAAG,0BAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,0BAAgB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,yDAA+B,EAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAW,CAAC;IAKnE,MAAM,uBAAuB,GAAG,GAAkB,EAAE,CAClD,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAI,GAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YACjC,GAAkB,CAAC,GAAG,GAAG,UAA4B,KAAe,EAAE,QAAiB,EAAE,EAAe;gBACtG,GAAkB,CAAC,GAAG,GAAG,OAAO,CAAC;gBAClC,MAAM,MAAM,GAAG,OAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxD,OAAO,EAAE,CAAC;gBACV,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,aAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAClD,0BAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QAC1C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAA,iCAAwB,EAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxC,GAAG,CAAC,IAAI,GAAG,UAAU,IAAc;gBACjC,+BAAa,CAAC,oBAAoB,CAAC,UAAU,EAAE;oBAC7C,MAAM,EAAE,GAAG,CAAC,UAAU;oBACtB,IAAI;oBACJ,UAAU,EAAE,IAAA,yCAA0B,EAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;oBAC5D,WAAW,EAAE,GAAG,CAAC,IAAI;iBACtB,CAAC,CAAC;gBACH,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,SAAgB,CAAC,CAAC;YACnD,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,uBAAuB,EAAE,CAAC;IAClC,CAAC,CAAC,CACH,CAAC;IACF,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Express instrumentation package entry point.
3
+ */
4
+ export { normalizeHeaderMap } from '../../instrumentations/common/http/context-headers';
5
+ export { softprobeExpressMiddleware, CaptureEngine, queueInboundResponse } from './capture';
6
+ export { activateReplayForContext } from './replay';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/express/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.activateReplayForContext = exports.queueInboundResponse = exports.CaptureEngine = exports.softprobeExpressMiddleware = exports.normalizeHeaderMap = void 0;
4
+ /**
5
+ * Express instrumentation package entry point.
6
+ */
7
+ var context_headers_1 = require("../../instrumentations/common/http/context-headers");
8
+ Object.defineProperty(exports, "normalizeHeaderMap", { enumerable: true, get: function () { return context_headers_1.normalizeHeaderMap; } });
9
+ var capture_1 = require("./capture");
10
+ Object.defineProperty(exports, "softprobeExpressMiddleware", { enumerable: true, get: function () { return capture_1.softprobeExpressMiddleware; } });
11
+ Object.defineProperty(exports, "CaptureEngine", { enumerable: true, get: function () { return capture_1.CaptureEngine; } });
12
+ Object.defineProperty(exports, "queueInboundResponse", { enumerable: true, get: function () { return capture_1.queueInboundResponse; } });
13
+ var replay_1 = require("./replay");
14
+ Object.defineProperty(exports, "activateReplayForContext", { enumerable: true, get: function () { return replay_1.activateReplayForContext; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentations/express/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,sFAAwF;AAA/E,qHAAA,kBAAkB,OAAA;AAC3B,qCAA4F;AAAnF,qHAAA,0BAA0B,OAAA;AAAE,wGAAA,aAAa,OAAA;AAAE,+GAAA,oBAAoB,OAAA;AACxE,mCAAoD;AAA3C,kHAAA,wBAAwB,OAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Express replay trigger: primes the matcher for the current request traceId.
3
+ * Design §16.1: when SOFTPROBE_MODE=REPLAY and traceId is in context, middleware calls this.
4
+ */
5
+ /**
6
+ * Primes the active Softprobe matcher with records for the given traceId.
7
+ * Called by softprobeExpressMiddleware when SOFTPROBE_MODE=REPLAY so outbound calls use the right cassette.
8
+ */
9
+ export declare function activateReplayForContext(traceId: string): void;
10
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/express/replay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9D"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Express replay trigger: primes the matcher for the current request traceId.
4
+ * Design §16.1: when SOFTPROBE_MODE=REPLAY and traceId is in context, middleware calls this.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.activateReplayForContext = activateReplayForContext;
8
+ const api_1 = require("../../api");
9
+ /**
10
+ * Primes the active Softprobe matcher with records for the given traceId.
11
+ * Called by softprobeExpressMiddleware when SOFTPROBE_MODE=REPLAY so outbound calls use the right cassette.
12
+ */
13
+ function activateReplayForContext(traceId) {
14
+ api_1.softprobe.activateReplayForContext(traceId);
15
+ }
16
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../src/instrumentations/express/replay.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAQH,4DAEC;AARD,mCAAsC;AAEtC;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,OAAe;IACtD,eAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Fastify plugin for Softprobe: CAPTURE uses onSend; REPLAY uses preHandler to prime matcher.
3
+ * Design §16.2: CAPTURE → onSend; REPLAY → preHandler primes SoftprobeMatcher by traceId.
4
+ * Task 17.3.2: Set OTel softprobe context in onRequest so downstream SoftprobeContext works.
5
+ */
6
+ import type { FastifyInstance } from 'fastify';
7
+ /**
8
+ * Environment-aware Fastify plugin. In CAPTURE mode adds onSend; in REPLAY mode
9
+ * adds preHandler to prime the matcher with records for the active OTel traceId.
10
+ * Task 17.3.2: Adds onRequest so every request runs in softprobe OTel context.
11
+ */
12
+ export declare function softprobeFastifyPlugin(fastify: FastifyInstance): Promise<void>;
13
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/fastify/capture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAiD7E;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpF"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * Fastify plugin for Softprobe: CAPTURE uses onSend; REPLAY uses preHandler to prime matcher.
4
+ * Design §16.2: CAPTURE → onSend; REPLAY → preHandler primes SoftprobeMatcher by traceId.
5
+ * Task 17.3.2: Set OTel softprobe context in onRequest so downstream SoftprobeContext works.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.softprobeFastifyPlugin = softprobeFastifyPlugin;
9
+ const api_1 = require("@opentelemetry/api");
10
+ const inbound_capture_1 = require("../common/http/inbound-capture");
11
+ const span_adapter_1 = require("../common/http/span-adapter");
12
+ const replay_1 = require("./replay");
13
+ const context_1 = require("../../context");
14
+ const context_request_storage_1 = require("../../core/cassette/context-request-storage");
15
+ /**
16
+ * onRequest hook: run the rest of the request pipeline in an OTel context that has
17
+ * softprobe traceId/mode/storage so SoftprobeContext works in route handlers.
18
+ * Does not return until the response is finished so OTel context stays active for MSW/fetch.
19
+ */
20
+ function softprobeFastifyOnRequest(request, reply, next) {
21
+ const span = api_1.trace.getActiveSpan();
22
+ const traceId = span?.spanContext().traceId;
23
+ const base = context_1.SoftprobeContext.active();
24
+ const withTrace = { ...base, traceId };
25
+ const softprobeValue = context_1.SoftprobeContext.fromHeaders(withTrace, request.headers);
26
+ const activeCtx = api_1.context.active();
27
+ const ctxWithSoftprobe = context_1.SoftprobeContext.withData(activeCtx, softprobeValue);
28
+ const runMode = context_1.SoftprobeContext.getMode(ctxWithSoftprobe);
29
+ const runTraceId = context_1.SoftprobeContext.getTraceId(ctxWithSoftprobe);
30
+ const { storage } = (0, context_request_storage_1.resolveRequestStorageForContext)(request.headers, activeCtx, runTraceId);
31
+ const promise = api_1.context.with(ctxWithSoftprobe, () => context_1.SoftprobeContext.run({ mode: runMode, traceId: runTraceId, storage }, async () => {
32
+ next();
33
+ await new Promise((resolve) => {
34
+ reply.raw.once('finish', resolve);
35
+ });
36
+ }));
37
+ void Promise.resolve(promise).catch((err) => {
38
+ next(err);
39
+ });
40
+ }
41
+ /**
42
+ * Environment-aware Fastify plugin. In CAPTURE mode adds onSend; in REPLAY mode
43
+ * adds preHandler to prime the matcher with records for the active OTel traceId.
44
+ * Task 17.3.2: Adds onRequest so every request runs in softprobe OTel context.
45
+ */
46
+ async function softprobeFastifyPlugin(fastify) {
47
+ fastify.addHook('onRequest', softprobeFastifyOnRequest);
48
+ if (context_1.SoftprobeContext.getMode() === 'REPLAY') {
49
+ fastify.addHook('preHandler', replay_1.softprobeFastifyReplayPreHandler);
50
+ }
51
+ if (context_1.SoftprobeContext.getMode() === 'CAPTURE') {
52
+ fastify.addHook('onSend', async (request, reply, payload) => {
53
+ const span = api_1.trace.getActiveSpan();
54
+ const traceId = span?.spanContext().traceId ?? '';
55
+ // payload is the serialized response (string/Buffer) that will be sent
56
+ inbound_capture_1.CaptureEngine.queueInboundResponse(traceId, {
57
+ status: reply.statusCode,
58
+ body: payload,
59
+ identifier: (0, span_adapter_1.buildInboundHttpIdentifier)(request.method, request.url),
60
+ });
61
+ return payload;
62
+ });
63
+ }
64
+ }
65
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/instrumentations/fastify/capture.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAwDH,wDAkBC;AAvED,4CAAoD;AACpD,oEAA+D;AAC/D,8DAAyE;AACzE,qCAA4D;AAC5D,2CAAiD;AACjD,yFAA8F;AAE9F;;;;GAIG;AACH,SAAS,yBAAyB,CAChC,OAAuB,EACvB,KAAmB,EACnB,IAA2B;IAE3B,MAAM,IAAI,GAAG,WAAK,CAAC,aAAa,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC;IAC5C,MAAM,IAAI,GAAG,0BAAgB,CAAC,MAAM,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;IACvC,MAAM,cAAc,GAAG,0BAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,OAAwD,CAAC,CAAC;IACjI,MAAM,SAAS,GAAG,aAAO,CAAC,MAAM,EAAE,CAAC;IACnC,MAAM,gBAAgB,GAAG,0BAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,0BAAgB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,0BAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACjE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,yDAA+B,EACjD,OAAO,CAAC,OAAwD,EAChE,SAAS,EACT,UAAU,CACX,CAAC;IAEF,MAAM,OAAO,GAAG,aAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAClD,0BAAgB,CAAC,GAAG,CAClB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EAC/C,KAAK,IAAI,EAAE;QACT,IAAI,EAAE,CAAC;QACP,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CACF,CAAC;IACF,KAAK,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACnD,IAAI,CAAC,GAAY,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CAAC,OAAwB;IACnE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;IACxD,IAAI,0BAAgB,CAAC,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,yCAAgC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,0BAAgB,CAAC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC1D,MAAM,IAAI,GAAG,WAAK,CAAC,aAAa,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;YAClD,uEAAuE;YACvE,+BAAa,CAAC,oBAAoB,CAAC,OAAO,EAAE;gBAC1C,MAAM,EAAE,KAAK,CAAC,UAAU;gBACxB,IAAI,EAAE,OAAO;gBACb,UAAU,EAAE,IAAA,yCAA0B,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;aACpE,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fastify instrumentation package entry point.
3
+ */
4
+ export { normalizeHeaderMap } from '../../instrumentations/common/http/context-headers';
5
+ export { softprobeFastifyPlugin } from './capture';
6
+ export { softprobeFastifyReplayPreHandler } from './replay';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/fastify/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.softprobeFastifyReplayPreHandler = exports.softprobeFastifyPlugin = exports.normalizeHeaderMap = void 0;
4
+ /**
5
+ * Fastify instrumentation package entry point.
6
+ */
7
+ var context_headers_1 = require("../../instrumentations/common/http/context-headers");
8
+ Object.defineProperty(exports, "normalizeHeaderMap", { enumerable: true, get: function () { return context_headers_1.normalizeHeaderMap; } });
9
+ var capture_1 = require("./capture");
10
+ Object.defineProperty(exports, "softprobeFastifyPlugin", { enumerable: true, get: function () { return capture_1.softprobeFastifyPlugin; } });
11
+ var replay_1 = require("./replay");
12
+ Object.defineProperty(exports, "softprobeFastifyReplayPreHandler", { enumerable: true, get: function () { return replay_1.softprobeFastifyReplayPreHandler; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentations/fastify/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,sFAAwF;AAA/E,qHAAA,kBAAkB,OAAA;AAC3B,qCAAmD;AAA1C,iHAAA,sBAAsB,OAAA;AAC/B,mCAA4D;AAAnD,0HAAA,gCAAgC,OAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Fastify replay trigger: preHandler primes the matcher for the current request traceId.
3
+ * Design §16.2: when mode=REPLAY, preHandler calls activateReplayForContext(traceId)
4
+ * so subsequent outbound calls use records matching the active OTel traceId.
5
+ */
6
+ import type { FastifyRequest, FastifyReply } from 'fastify';
7
+ /**
8
+ * PreHandler hook that primes the active SoftprobeMatcher with records for the
9
+ * current request's OTel traceId. Register in REPLAY mode so route handlers see
10
+ * the correct cassette records for matching outbound calls.
11
+ */
12
+ export declare function softprobeFastifyReplayPreHandler(_request: FastifyRequest, _reply: FastifyReply): Promise<void>;
13
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/fastify/replay.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK5D;;;;GAIG;AACH,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Fastify replay trigger: preHandler primes the matcher for the current request traceId.
4
+ * Design §16.2: when mode=REPLAY, preHandler calls activateReplayForContext(traceId)
5
+ * so subsequent outbound calls use records matching the active OTel traceId.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.softprobeFastifyReplayPreHandler = softprobeFastifyReplayPreHandler;
9
+ const api_1 = require("@opentelemetry/api");
10
+ const api_2 = require("../../api");
11
+ const context_1 = require("../../context");
12
+ /**
13
+ * PreHandler hook that primes the active SoftprobeMatcher with records for the
14
+ * current request's OTel traceId. Register in REPLAY mode so route handlers see
15
+ * the correct cassette records for matching outbound calls.
16
+ */
17
+ async function softprobeFastifyReplayPreHandler(_request, _reply) {
18
+ const span = api_1.trace.getActiveSpan();
19
+ const traceId = span?.spanContext().traceId;
20
+ if (context_1.SoftprobeContext.getMode() === 'REPLAY' && traceId) {
21
+ api_2.softprobe.activateReplayForContext(traceId);
22
+ }
23
+ }
24
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../src/instrumentations/fastify/replay.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAYH,4EASC;AAlBD,4CAA2C;AAC3C,mCAAsC;AACtC,2CAAiD;AAEjD;;;;GAIG;AACI,KAAK,UAAU,gCAAgC,CACpD,QAAwB,EACxB,MAAoB;IAEpB,MAAM,IAAI,GAAG,WAAK,CAAC,aAAa,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC;IAC5C,IAAI,0BAAgB,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;QACvD,eAAS,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Fetch/HTTP outbound instrumentation package entry point.
3
+ */
4
+ export { handleHttpReplayRequest, setupHttpReplayInterceptor, } from './replay';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/fetch/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,UAAU,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupHttpReplayInterceptor = exports.handleHttpReplayRequest = void 0;
4
+ /**
5
+ * Fetch/HTTP outbound instrumentation package entry point.
6
+ */
7
+ var replay_1 = require("./replay");
8
+ Object.defineProperty(exports, "handleHttpReplayRequest", { enumerable: true, get: function () { return replay_1.handleHttpReplayRequest; } });
9
+ Object.defineProperty(exports, "setupHttpReplayInterceptor", { enumerable: true, get: function () { return replay_1.setupHttpReplayInterceptor; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/instrumentations/fetch/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,mCAGkB;AAFhB,iHAAA,uBAAuB,OAAA;AACvB,oHAAA,0BAA0B,OAAA"}
@@ -0,0 +1,19 @@
1
+ import { BatchInterceptor } from '@mswjs/interceptors';
2
+ import { ClientRequestInterceptor } from '@mswjs/interceptors/ClientRequest';
3
+ import { FetchInterceptor } from '@mswjs/interceptors/fetch';
4
+ type RequestController = {
5
+ respondWith: (response: Response) => void;
6
+ };
7
+ type RequestEvent = {
8
+ request: Request;
9
+ controller: RequestController;
10
+ };
11
+ type HttpReplayOptions = {
12
+ shouldIgnoreUrl?: (url?: string) => boolean;
13
+ /** When set and mode is CAPTURE, used to perform the real request (avoids re-entering the interceptor). */
14
+ bypassFetch?: (input: Request | string | URL, init?: RequestInit) => Promise<Response>;
15
+ };
16
+ export declare function handleHttpReplayRequest(event: RequestEvent, options?: HttpReplayOptions): Promise<void>;
17
+ export declare function setupHttpReplayInterceptor(options?: HttpReplayOptions): BatchInterceptor<(ClientRequestInterceptor | FetchInterceptor)[], import("@mswjs/interceptors").HttpRequestEventMap>;
18
+ export {};
19
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/fetch/replay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAS7D,KAAK,iBAAiB,GAAG;IAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAA;CAAE,CAAC;AACvE,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAiBxE,KAAK,iBAAiB,GAAG;IACvB,eAAe,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,2GAA2G;IAC3G,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxF,CAAC;AAmKF,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA+Df;AAYD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,iBAAsB,wHAgBzE"}