@graphrefly/graphrefly 0.45.0 → 0.47.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 (714) hide show
  1. package/README.md +1 -2
  2. package/dist/_internal-B23BagFd.d.cts +33 -0
  3. package/dist/_internal-B23BagFd.d.ts +33 -0
  4. package/dist/adaptive-rate-limiter-Dch_xYIi.d.cts +111 -0
  5. package/dist/adaptive-rate-limiter-Dch_xYIi.d.ts +111 -0
  6. package/dist/agents-C0Ji9ldU.d.cts +629 -0
  7. package/dist/agents-C9zexT7I.d.ts +629 -0
  8. package/dist/audit-BAXb3VOg.d.ts +246 -0
  9. package/dist/audit-C_bPfkqS.d.cts +246 -0
  10. package/dist/backoff-7KIK3WQW.js +24 -0
  11. package/dist/backoff-7KIK3WQW.js.map +1 -0
  12. package/dist/backoff-Bnb9OoPh.d.cts +6 -0
  13. package/dist/backoff-Bnb9OoPh.d.ts +6 -0
  14. package/dist/base/composition/index.cjs +865 -0
  15. package/dist/base/composition/index.cjs.map +1 -0
  16. package/dist/base/composition/index.d.cts +468 -0
  17. package/dist/base/composition/index.d.ts +468 -0
  18. package/dist/base/composition/index.js +40 -0
  19. package/dist/base/composition/index.js.map +1 -0
  20. package/dist/base/index.cjs +6390 -0
  21. package/dist/base/index.cjs.map +1 -0
  22. package/dist/base/index.d.cts +21 -0
  23. package/dist/base/index.d.ts +21 -0
  24. package/dist/base/index.js +259 -0
  25. package/dist/base/index.js.map +1 -0
  26. package/dist/base/io/index.cjs +3270 -0
  27. package/dist/base/io/index.cjs.map +1 -0
  28. package/dist/base/io/index.d.cts +2245 -0
  29. package/dist/base/io/index.d.ts +2245 -0
  30. package/dist/base/io/index.js +117 -0
  31. package/dist/base/io/index.js.map +1 -0
  32. package/dist/base/meta/index.cjs +43 -0
  33. package/dist/base/meta/index.cjs.map +1 -0
  34. package/dist/base/meta/index.d.cts +45 -0
  35. package/dist/base/meta/index.d.ts +45 -0
  36. package/dist/base/meta/index.js +13 -0
  37. package/dist/base/meta/index.js.map +1 -0
  38. package/dist/base/mutation/index.cjs +200 -0
  39. package/dist/base/mutation/index.cjs.map +1 -0
  40. package/dist/base/mutation/index.d.cts +177 -0
  41. package/dist/base/mutation/index.d.ts +177 -0
  42. package/dist/base/mutation/index.js +22 -0
  43. package/dist/base/mutation/index.js.map +1 -0
  44. package/dist/base/render/index.cjs +1120 -0
  45. package/dist/base/render/index.cjs.map +1 -0
  46. package/dist/base/render/index.d.cts +227 -0
  47. package/dist/base/render/index.d.ts +227 -0
  48. package/dist/base/render/index.js +24 -0
  49. package/dist/base/render/index.js.map +1 -0
  50. package/dist/base/sources/browser/index.cjs +172 -0
  51. package/dist/base/sources/browser/index.cjs.map +1 -0
  52. package/dist/base/sources/browser/index.d.cts +84 -0
  53. package/dist/base/sources/browser/index.d.ts +84 -0
  54. package/dist/base/sources/browser/index.js +151 -0
  55. package/dist/base/sources/browser/index.js.map +1 -0
  56. package/dist/base/sources/event/index.cjs +98 -0
  57. package/dist/base/sources/event/index.cjs.map +1 -0
  58. package/dist/base/sources/event/index.d.cts +91 -0
  59. package/dist/base/sources/event/index.d.ts +91 -0
  60. package/dist/base/sources/event/index.js +13 -0
  61. package/dist/base/sources/event/index.js.map +1 -0
  62. package/dist/base/sources/index.cjs +755 -0
  63. package/dist/base/sources/index.cjs.map +1 -0
  64. package/dist/base/sources/index.d.cts +357 -0
  65. package/dist/base/sources/index.d.ts +357 -0
  66. package/dist/base/sources/index.js +42 -0
  67. package/dist/base/sources/index.js.map +1 -0
  68. package/dist/base/sources/node/index.cjs +320 -0
  69. package/dist/base/sources/node/index.cjs.map +1 -0
  70. package/dist/base/sources/node/index.d.cts +185 -0
  71. package/dist/base/sources/node/index.d.ts +185 -0
  72. package/dist/base/sources/node/index.js +306 -0
  73. package/dist/base/sources/node/index.js.map +1 -0
  74. package/dist/base/utils/index.cjs +37 -0
  75. package/dist/base/utils/index.cjs.map +1 -0
  76. package/dist/base/utils/index.d.cts +37 -0
  77. package/dist/base/utils/index.d.ts +37 -0
  78. package/dist/base/utils/index.js +11 -0
  79. package/dist/base/utils/index.js.map +1 -0
  80. package/dist/base/worker/index.cjs +548 -0
  81. package/dist/base/worker/index.cjs.map +1 -0
  82. package/dist/base/worker/index.d.cts +207 -0
  83. package/dist/base/worker/index.d.ts +207 -0
  84. package/dist/base/worker/index.js +20 -0
  85. package/dist/base/worker/index.js.map +1 -0
  86. package/dist/breaker-C9skL3d8.d.ts +175 -0
  87. package/dist/breaker-ugSdq54q.d.cts +175 -0
  88. package/dist/cascading-CSSbKGrJ.d.ts +199 -0
  89. package/dist/cascading-baGkiihI.d.cts +199 -0
  90. package/dist/chunk-22SG74BD.js +207 -0
  91. package/dist/chunk-22SG74BD.js.map +1 -0
  92. package/dist/chunk-255UCBG4.js +58 -0
  93. package/dist/chunk-255UCBG4.js.map +1 -0
  94. package/dist/chunk-2LO3EL4W.js +1 -0
  95. package/dist/chunk-2LO3EL4W.js.map +1 -0
  96. package/dist/chunk-2OB3CEJS.js +1065 -0
  97. package/dist/chunk-2OB3CEJS.js.map +1 -0
  98. package/dist/chunk-36NMM65U.js +144 -0
  99. package/dist/chunk-36NMM65U.js.map +1 -0
  100. package/dist/chunk-3CEXCBN6.js +1 -0
  101. package/dist/chunk-3CEXCBN6.js.map +1 -0
  102. package/dist/chunk-3MUSLI6E.js +105 -0
  103. package/dist/chunk-3MUSLI6E.js.map +1 -0
  104. package/dist/chunk-3PSLNJDU.js +884 -0
  105. package/dist/chunk-3PSLNJDU.js.map +1 -0
  106. package/dist/chunk-42FQ27MQ.js +594 -0
  107. package/dist/chunk-42FQ27MQ.js.map +1 -0
  108. package/dist/chunk-4GYMCUDZ.js +1085 -0
  109. package/dist/chunk-4GYMCUDZ.js.map +1 -0
  110. package/dist/chunk-4S53H2KR.js +382 -0
  111. package/dist/chunk-4S53H2KR.js.map +1 -0
  112. package/dist/chunk-4XCHZRUJ.js +128 -0
  113. package/dist/chunk-4XCHZRUJ.js.map +1 -0
  114. package/dist/chunk-5IMMNARC.js +1153 -0
  115. package/dist/chunk-5IMMNARC.js.map +1 -0
  116. package/dist/chunk-6XZYT4SW.js +256 -0
  117. package/dist/chunk-6XZYT4SW.js.map +1 -0
  118. package/dist/chunk-7EGRP2VX.js +76 -0
  119. package/dist/chunk-7EGRP2VX.js.map +1 -0
  120. package/dist/chunk-A7KV5UK4.js +150 -0
  121. package/dist/chunk-A7KV5UK4.js.map +1 -0
  122. package/dist/chunk-APY2SS5X.js +156 -0
  123. package/dist/chunk-APY2SS5X.js.map +1 -0
  124. package/dist/chunk-AZDQPQ3V.js +66 -0
  125. package/dist/chunk-AZDQPQ3V.js.map +1 -0
  126. package/dist/chunk-BU3SEFA5.js +90 -0
  127. package/dist/chunk-BU3SEFA5.js.map +1 -0
  128. package/dist/chunk-BXGZFGZ4.js +189 -0
  129. package/dist/chunk-BXGZFGZ4.js.map +1 -0
  130. package/dist/chunk-CGHORL6G.js +579 -0
  131. package/dist/chunk-CGHORL6G.js.map +1 -0
  132. package/dist/chunk-CXANAIZU.js +530 -0
  133. package/dist/chunk-CXANAIZU.js.map +1 -0
  134. package/dist/chunk-CZQHCKKG.js +1 -0
  135. package/dist/chunk-CZQHCKKG.js.map +1 -0
  136. package/dist/chunk-DKNHAICT.js +133 -0
  137. package/dist/chunk-DKNHAICT.js.map +1 -0
  138. package/dist/chunk-DM4OMPWK.js +584 -0
  139. package/dist/chunk-DM4OMPWK.js.map +1 -0
  140. package/dist/chunk-DMSNO6ZB.js +452 -0
  141. package/dist/chunk-DMSNO6ZB.js.map +1 -0
  142. package/dist/chunk-E5OZPDIW.js +229 -0
  143. package/dist/chunk-E5OZPDIW.js.map +1 -0
  144. package/dist/chunk-EHRRQ4IC.js +211 -0
  145. package/dist/chunk-EHRRQ4IC.js.map +1 -0
  146. package/dist/chunk-EVYY4X5A.js +509 -0
  147. package/dist/chunk-EVYY4X5A.js.map +1 -0
  148. package/dist/chunk-FDFD67UO.js +1 -0
  149. package/dist/chunk-FDFD67UO.js.map +1 -0
  150. package/dist/chunk-FMPF42Q4.js +13 -0
  151. package/dist/chunk-FMPF42Q4.js.map +1 -0
  152. package/dist/chunk-FW23JYNQ.js +454 -0
  153. package/dist/chunk-FW23JYNQ.js.map +1 -0
  154. package/dist/chunk-GWRNLJNW.js +2508 -0
  155. package/dist/chunk-GWRNLJNW.js.map +1 -0
  156. package/dist/chunk-HL7HUJIX.js +1 -0
  157. package/dist/chunk-HL7HUJIX.js.map +1 -0
  158. package/dist/chunk-IHTWQEDR.js +169 -0
  159. package/dist/chunk-IHTWQEDR.js.map +1 -0
  160. package/dist/chunk-IJRR6YAI.js +128 -0
  161. package/dist/chunk-IJRR6YAI.js.map +1 -0
  162. package/dist/chunk-JGFRAFDL.js +221 -0
  163. package/dist/chunk-JGFRAFDL.js.map +1 -0
  164. package/dist/chunk-JKTC747G.js +725 -0
  165. package/dist/chunk-JKTC747G.js.map +1 -0
  166. package/dist/chunk-KN3H5CNT.js +11 -0
  167. package/dist/chunk-KN3H5CNT.js.map +1 -0
  168. package/dist/chunk-KPG3DGLA.js +1 -0
  169. package/dist/chunk-KPG3DGLA.js.map +1 -0
  170. package/dist/chunk-KRNQ6RGQ.js +1 -0
  171. package/dist/chunk-KRNQ6RGQ.js.map +1 -0
  172. package/dist/chunk-MLTPJMH6.js +417 -0
  173. package/dist/chunk-MLTPJMH6.js.map +1 -0
  174. package/dist/chunk-N3SZ7BMH.js +95 -0
  175. package/dist/chunk-N3SZ7BMH.js.map +1 -0
  176. package/dist/chunk-NDUD3IMO.js +540 -0
  177. package/dist/chunk-NDUD3IMO.js.map +1 -0
  178. package/dist/chunk-NY2PYHNC.js +873 -0
  179. package/dist/chunk-NY2PYHNC.js.map +1 -0
  180. package/dist/chunk-O3MT7DYI.js +225 -0
  181. package/dist/chunk-O3MT7DYI.js.map +1 -0
  182. package/dist/chunk-OCUDSN63.js +2386 -0
  183. package/dist/chunk-OCUDSN63.js.map +1 -0
  184. package/dist/chunk-OIWU3NYV.js +199 -0
  185. package/dist/chunk-OIWU3NYV.js.map +1 -0
  186. package/dist/chunk-OQUIJT7A.js +1 -0
  187. package/dist/chunk-OQUIJT7A.js.map +1 -0
  188. package/dist/chunk-P5LBT622.js +105 -0
  189. package/dist/chunk-P5LBT622.js.map +1 -0
  190. package/dist/chunk-PKGQG5QQ.js +519 -0
  191. package/dist/chunk-PKGQG5QQ.js.map +1 -0
  192. package/dist/chunk-PKPO3JTZ.js +561 -0
  193. package/dist/chunk-PKPO3JTZ.js.map +1 -0
  194. package/dist/chunk-PL5UDIQ5.js +118 -0
  195. package/dist/chunk-PL5UDIQ5.js.map +1 -0
  196. package/dist/chunk-PZWISPIQ.js +432 -0
  197. package/dist/chunk-PZWISPIQ.js.map +1 -0
  198. package/dist/chunk-Q3EYOCZB.js +510 -0
  199. package/dist/chunk-Q3EYOCZB.js.map +1 -0
  200. package/dist/chunk-QMBYUVRL.js +15 -0
  201. package/dist/chunk-QMBYUVRL.js.map +1 -0
  202. package/dist/chunk-RAGGHLCV.js +200 -0
  203. package/dist/chunk-RAGGHLCV.js.map +1 -0
  204. package/dist/chunk-RJOG4IJU.js +1039 -0
  205. package/dist/chunk-RJOG4IJU.js.map +1 -0
  206. package/dist/chunk-SOOKUYVM.js +403 -0
  207. package/dist/chunk-SOOKUYVM.js.map +1 -0
  208. package/dist/chunk-T5BN5KG7.js +1 -0
  209. package/dist/chunk-T5BN5KG7.js.map +1 -0
  210. package/dist/chunk-TNX5ZGDJ.js +574 -0
  211. package/dist/chunk-TNX5ZGDJ.js.map +1 -0
  212. package/dist/chunk-TP7244Y6.js +207 -0
  213. package/dist/chunk-TP7244Y6.js.map +1 -0
  214. package/dist/chunk-TSBFTJKM.js +57 -0
  215. package/dist/chunk-TSBFTJKM.js.map +1 -0
  216. package/dist/chunk-URQ2CBBF.js +143 -0
  217. package/dist/chunk-URQ2CBBF.js.map +1 -0
  218. package/dist/chunk-VLAGJZSL.js +1079 -0
  219. package/dist/chunk-VLAGJZSL.js.map +1 -0
  220. package/dist/chunk-W2BOPXTI.js +1 -0
  221. package/dist/chunk-W2BOPXTI.js.map +1 -0
  222. package/dist/chunk-Y52CS6YA.js +88 -0
  223. package/dist/chunk-Y52CS6YA.js.map +1 -0
  224. package/dist/chunk-YCBUWK77.js +92 -0
  225. package/dist/chunk-YCBUWK77.js.map +1 -0
  226. package/dist/chunk-YJ4U2D2C.js +314 -0
  227. package/dist/chunk-YJ4U2D2C.js.map +1 -0
  228. package/dist/chunk-Z4YXAUDN.js +239 -0
  229. package/dist/chunk-Z4YXAUDN.js.map +1 -0
  230. package/dist/chunk-Z65DVDEQ.js +146 -0
  231. package/dist/chunk-Z65DVDEQ.js.map +1 -0
  232. package/dist/chunk-Z6EGP5D7.js +92 -0
  233. package/dist/chunk-Z6EGP5D7.js.map +1 -0
  234. package/dist/chunk-ZT4WMQW4.js +1575 -0
  235. package/dist/chunk-ZT4WMQW4.js.map +1 -0
  236. package/dist/chunk-ZVXXDWIB.js +1282 -0
  237. package/dist/chunk-ZVXXDWIB.js.map +1 -0
  238. package/dist/compat/index.cjs +3150 -6
  239. package/dist/compat/index.cjs.map +1 -1
  240. package/dist/compat/index.d.cts +116 -1
  241. package/dist/compat/index.d.ts +116 -1
  242. package/dist/compat/index.js +175 -2
  243. package/dist/compat/index.js.map +1 -1
  244. package/dist/compat/jotai/index.cjs +130 -2
  245. package/dist/compat/jotai/index.cjs.map +1 -1
  246. package/dist/compat/jotai/index.d.cts +2 -1
  247. package/dist/compat/jotai/index.d.ts +2 -1
  248. package/dist/compat/jotai/index.js +7 -2
  249. package/dist/compat/jotai/index.js.map +1 -1
  250. package/dist/compat/nanostores/index.cjs +186 -2
  251. package/dist/compat/nanostores/index.cjs.map +1 -1
  252. package/dist/compat/nanostores/index.d.cts +2 -1
  253. package/dist/compat/nanostores/index.d.ts +2 -1
  254. package/dist/compat/nanostores/index.js +21 -2
  255. package/dist/compat/nanostores/index.js.map +1 -1
  256. package/dist/compat/nestjs/index.cjs +2291 -6
  257. package/dist/compat/nestjs/index.cjs.map +1 -1
  258. package/dist/compat/nestjs/index.d.cts +10 -1
  259. package/dist/compat/nestjs/index.d.ts +10 -1
  260. package/dist/compat/nestjs/index.js +76 -2
  261. package/dist/compat/nestjs/index.js.map +1 -1
  262. package/dist/compat/react/index.cjs +95 -2
  263. package/dist/compat/react/index.cjs.map +1 -1
  264. package/dist/compat/react/index.d.cts +2 -1
  265. package/dist/compat/react/index.d.ts +2 -1
  266. package/dist/compat/react/index.js +11 -2
  267. package/dist/compat/react/index.js.map +1 -1
  268. package/dist/compat/solid/index.cjs +82 -2
  269. package/dist/compat/solid/index.cjs.map +1 -1
  270. package/dist/compat/solid/index.d.cts +2 -1
  271. package/dist/compat/solid/index.d.ts +2 -1
  272. package/dist/compat/solid/index.js +11 -2
  273. package/dist/compat/solid/index.js.map +1 -1
  274. package/dist/compat/svelte/index.cjs +85 -2
  275. package/dist/compat/svelte/index.cjs.map +1 -1
  276. package/dist/compat/svelte/index.d.cts +2 -1
  277. package/dist/compat/svelte/index.d.ts +2 -1
  278. package/dist/compat/svelte/index.js +11 -2
  279. package/dist/compat/svelte/index.js.map +1 -1
  280. package/dist/compat/vue/index.cjs +100 -2
  281. package/dist/compat/vue/index.cjs.map +1 -1
  282. package/dist/compat/vue/index.d.cts +3 -1
  283. package/dist/compat/vue/index.d.ts +3 -1
  284. package/dist/compat/vue/index.js +11 -2
  285. package/dist/compat/vue/index.js.map +1 -1
  286. package/dist/compat/zustand/index.cjs +50 -2
  287. package/dist/compat/zustand/index.cjs.map +1 -1
  288. package/dist/compat/zustand/index.d.cts +2 -1
  289. package/dist/compat/zustand/index.d.ts +2 -1
  290. package/dist/compat/zustand/index.js +7 -2
  291. package/dist/compat/zustand/index.js.map +1 -1
  292. package/dist/distill-De6Rnn15.d.cts +48 -0
  293. package/dist/distill-De6Rnn15.d.ts +48 -0
  294. package/dist/external-register-CWyroXb_.d.cts +138 -0
  295. package/dist/external-register-CWyroXb_.d.ts +138 -0
  296. package/dist/fallback-Bx46zqky.d.cts +243 -0
  297. package/dist/fallback-pIWW8A2d.d.ts +243 -0
  298. package/dist/guarded-execution-BcdtxeBk.d.ts +207 -0
  299. package/dist/guarded-execution-C-3hnP6A.d.cts +207 -0
  300. package/dist/index-B6pxYJzO.d.cts +36 -0
  301. package/dist/index-B6pxYJzO.d.ts +36 -0
  302. package/dist/index-BFsng6v1.d.cts +44 -0
  303. package/dist/index-BFsng6v1.d.ts +44 -0
  304. package/dist/index-B_p8tnvf.d.cts +770 -0
  305. package/dist/index-Bg-LwEt-.d.cts +45 -0
  306. package/dist/index-Bg-LwEt-.d.ts +45 -0
  307. package/dist/index-Brp888t0.d.cts +127 -0
  308. package/dist/index-Brp888t0.d.ts +127 -0
  309. package/dist/index-CDfk6jHN.d.cts +37 -0
  310. package/dist/index-CDfk6jHN.d.ts +37 -0
  311. package/dist/index-DLAxYaN5.d.cts +169 -0
  312. package/dist/index-DLAxYaN5.d.ts +169 -0
  313. package/dist/index-DeWbQzMe.d.cts +34 -0
  314. package/dist/index-DeWbQzMe.d.ts +34 -0
  315. package/dist/index-_HDSmPyp.d.ts +770 -0
  316. package/dist/index-dX9IzPqj.d.cts +86 -0
  317. package/dist/index-dX9IzPqj.d.ts +86 -0
  318. package/dist/index.cjs +26009 -0
  319. package/dist/index.cjs.map +1 -1
  320. package/dist/index.d.cts +55 -42
  321. package/dist/index.d.ts +55 -42
  322. package/dist/index.js +849 -0
  323. package/dist/index.js.map +1 -1
  324. package/dist/layout-types-B5aiHYgk.d.cts +72 -0
  325. package/dist/layout-types-B5aiHYgk.d.ts +72 -0
  326. package/dist/memory-composers-BryDrRBX.d.cts +529 -0
  327. package/dist/memory-composers-CVQqPYEV.d.ts +529 -0
  328. package/dist/observable-B25XqCbZ.d.cts +59 -0
  329. package/dist/observable-B25XqCbZ.d.ts +59 -0
  330. package/dist/pipeline-graph-Ce47CB6Y.d.cts +145 -0
  331. package/dist/pipeline-graph-DXCwY9vG.d.ts +145 -0
  332. package/dist/presets/ai/index.cjs +4377 -0
  333. package/dist/presets/ai/index.cjs.map +1 -0
  334. package/dist/presets/ai/index.d.cts +98 -0
  335. package/dist/presets/ai/index.d.ts +98 -0
  336. package/dist/presets/ai/index.js +54 -0
  337. package/dist/presets/ai/index.js.map +1 -0
  338. package/dist/presets/harness/index.cjs +5929 -0
  339. package/dist/presets/harness/index.cjs.map +1 -0
  340. package/dist/presets/harness/index.d.cts +566 -0
  341. package/dist/presets/harness/index.d.ts +566 -0
  342. package/dist/presets/harness/index.js +71 -0
  343. package/dist/presets/harness/index.js.map +1 -0
  344. package/dist/presets/index.cjs +9782 -0
  345. package/dist/presets/index.cjs.map +1 -0
  346. package/dist/presets/index.d.cts +28 -0
  347. package/dist/presets/index.d.ts +28 -0
  348. package/dist/presets/index.js +129 -0
  349. package/dist/presets/index.js.map +1 -0
  350. package/dist/presets/inspect/index.cjs +1087 -0
  351. package/dist/presets/inspect/index.cjs.map +1 -0
  352. package/dist/presets/inspect/index.d.cts +172 -0
  353. package/dist/presets/inspect/index.d.ts +172 -0
  354. package/dist/presets/inspect/index.js +21 -0
  355. package/dist/presets/inspect/index.js.map +1 -0
  356. package/dist/presets/resilience/index.cjs +1593 -0
  357. package/dist/presets/resilience/index.cjs.map +1 -0
  358. package/dist/presets/resilience/index.d.cts +205 -0
  359. package/dist/presets/resilience/index.d.ts +205 -0
  360. package/dist/presets/resilience/index.js +18 -0
  361. package/dist/presets/resilience/index.js.map +1 -0
  362. package/dist/rate-limiter-CEALq4N1.d.ts +559 -0
  363. package/dist/rate-limiter-DpVbSYdH.d.cts +559 -0
  364. package/dist/reactive-layout-fswlBUvX.d.cts +195 -0
  365. package/dist/reactive-layout-fswlBUvX.d.ts +195 -0
  366. package/dist/retry-BDbRZ_gx.d.ts +125 -0
  367. package/dist/retry-DWuhjvsA.d.cts +125 -0
  368. package/dist/solutions/index.cjs +8200 -0
  369. package/dist/solutions/index.cjs.map +1 -0
  370. package/dist/solutions/index.d.cts +23 -0
  371. package/dist/solutions/index.d.ts +23 -0
  372. package/dist/solutions/index.js +55 -0
  373. package/dist/solutions/index.js.map +1 -0
  374. package/dist/spawnable-5mDY501F.d.cts +746 -0
  375. package/dist/spawnable-D3lR0oQu.d.ts +746 -0
  376. package/dist/status-U-rUI79b.d.cts +84 -0
  377. package/dist/status-U-rUI79b.d.ts +84 -0
  378. package/dist/timeout-U5O4ESK3.js +12 -0
  379. package/dist/timeout-U5O4ESK3.js.map +1 -0
  380. package/dist/types-BB5Lw-pB.d.cts +442 -0
  381. package/dist/types-BB5Lw-pB.d.ts +442 -0
  382. package/dist/types-CJWIMJiZ.d.ts +548 -0
  383. package/dist/types-vCq7ShIm.d.cts +548 -0
  384. package/dist/utils/ai/browser.cjs +2169 -0
  385. package/dist/utils/ai/browser.cjs.map +1 -0
  386. package/dist/utils/ai/browser.d.cts +129 -0
  387. package/dist/utils/ai/browser.d.ts +129 -0
  388. package/dist/utils/ai/browser.js +255 -0
  389. package/dist/utils/ai/browser.js.map +1 -0
  390. package/dist/utils/ai/index.cjs +8468 -0
  391. package/dist/utils/ai/index.cjs.map +1 -0
  392. package/dist/utils/ai/index.d.cts +1777 -0
  393. package/dist/utils/ai/index.d.ts +1777 -0
  394. package/dist/utils/ai/index.js +173 -0
  395. package/dist/utils/ai/index.js.map +1 -0
  396. package/dist/utils/ai/node.cjs +648 -0
  397. package/dist/utils/ai/node.cjs.map +1 -0
  398. package/dist/utils/ai/node.d.cts +57 -0
  399. package/dist/utils/ai/node.d.ts +57 -0
  400. package/dist/utils/ai/node.js +84 -0
  401. package/dist/utils/ai/node.js.map +1 -0
  402. package/dist/utils/cqrs/index.cjs +1036 -0
  403. package/dist/utils/cqrs/index.cjs.map +1 -0
  404. package/dist/utils/cqrs/index.d.cts +438 -0
  405. package/dist/utils/cqrs/index.d.ts +438 -0
  406. package/dist/utils/cqrs/index.js +18 -0
  407. package/dist/utils/cqrs/index.js.map +1 -0
  408. package/dist/utils/demo-shell/index.cjs +865 -0
  409. package/dist/utils/demo-shell/index.cjs.map +1 -0
  410. package/dist/utils/demo-shell/index.d.cts +90 -0
  411. package/dist/utils/demo-shell/index.d.ts +90 -0
  412. package/dist/utils/demo-shell/index.js +13 -0
  413. package/dist/utils/demo-shell/index.js.map +1 -0
  414. package/dist/utils/domain-templates/index.cjs +732 -0
  415. package/dist/utils/domain-templates/index.cjs.map +1 -0
  416. package/dist/utils/domain-templates/index.d.cts +214 -0
  417. package/dist/utils/domain-templates/index.d.ts +214 -0
  418. package/dist/utils/domain-templates/index.js +17 -0
  419. package/dist/utils/domain-templates/index.js.map +1 -0
  420. package/dist/utils/graphspec/index.cjs +1174 -0
  421. package/dist/utils/graphspec/index.cjs.map +1 -0
  422. package/dist/utils/graphspec/index.d.cts +449 -0
  423. package/dist/utils/graphspec/index.d.ts +449 -0
  424. package/dist/utils/graphspec/index.js +35 -0
  425. package/dist/utils/graphspec/index.js.map +1 -0
  426. package/dist/utils/harness/index.cjs +656 -0
  427. package/dist/utils/harness/index.cjs.map +1 -0
  428. package/dist/utils/harness/index.d.cts +542 -0
  429. package/dist/utils/harness/index.d.ts +542 -0
  430. package/dist/utils/harness/index.js +56 -0
  431. package/dist/utils/harness/index.js.map +1 -0
  432. package/dist/utils/index.cjs +17614 -0
  433. package/dist/utils/index.cjs.map +1 -0
  434. package/dist/utils/index.d.cts +96 -0
  435. package/dist/utils/index.d.ts +96 -0
  436. package/dist/utils/index.js +514 -0
  437. package/dist/utils/index.js.map +1 -0
  438. package/dist/utils/inspect/index.cjs +807 -0
  439. package/dist/utils/inspect/index.cjs.map +1 -0
  440. package/dist/utils/inspect/index.d.cts +123 -0
  441. package/dist/utils/inspect/index.d.ts +123 -0
  442. package/dist/utils/inspect/index.js +30 -0
  443. package/dist/utils/inspect/index.js.map +1 -0
  444. package/dist/utils/job-queue/index.cjs +717 -0
  445. package/dist/utils/job-queue/index.cjs.map +1 -0
  446. package/dist/utils/job-queue/index.d.cts +200 -0
  447. package/dist/utils/job-queue/index.d.ts +200 -0
  448. package/dist/utils/job-queue/index.js +18 -0
  449. package/dist/utils/job-queue/index.js.map +1 -0
  450. package/dist/utils/memory/index.cjs +1456 -0
  451. package/dist/utils/memory/index.cjs.map +1 -0
  452. package/dist/utils/memory/index.d.cts +660 -0
  453. package/dist/utils/memory/index.d.ts +660 -0
  454. package/dist/utils/memory/index.js +19 -0
  455. package/dist/utils/memory/index.js.map +1 -0
  456. package/dist/utils/messaging/index.cjs +666 -0
  457. package/dist/utils/messaging/index.cjs.map +1 -0
  458. package/dist/utils/messaging/index.d.cts +562 -0
  459. package/dist/utils/messaging/index.d.ts +562 -0
  460. package/dist/utils/messaging/index.js +50 -0
  461. package/dist/utils/messaging/index.js.map +1 -0
  462. package/dist/utils/orchestration/index.cjs +876 -0
  463. package/dist/utils/orchestration/index.cjs.map +1 -0
  464. package/dist/utils/orchestration/index.d.cts +233 -0
  465. package/dist/utils/orchestration/index.d.ts +233 -0
  466. package/dist/utils/orchestration/index.js +19 -0
  467. package/dist/utils/orchestration/index.js.map +1 -0
  468. package/dist/utils/process/index.cjs +743 -0
  469. package/dist/utils/process/index.cjs.map +1 -0
  470. package/dist/utils/process/index.d.cts +411 -0
  471. package/dist/utils/process/index.d.ts +411 -0
  472. package/dist/utils/process/index.js +14 -0
  473. package/dist/utils/process/index.js.map +1 -0
  474. package/dist/utils/reactive-layout/index.cjs +1607 -0
  475. package/dist/utils/reactive-layout/index.cjs.map +1 -0
  476. package/dist/utils/reactive-layout/index.d.cts +492 -0
  477. package/dist/utils/reactive-layout/index.d.ts +492 -0
  478. package/dist/utils/reactive-layout/index.js +52 -0
  479. package/dist/utils/reactive-layout/index.js.map +1 -0
  480. package/dist/utils/reduction/index.cjs +203 -0
  481. package/dist/utils/reduction/index.cjs.map +1 -0
  482. package/dist/utils/reduction/index.d.cts +102 -0
  483. package/dist/utils/reduction/index.d.ts +102 -0
  484. package/dist/utils/reduction/index.js +14 -0
  485. package/dist/utils/reduction/index.js.map +1 -0
  486. package/dist/utils/resilience/index.cjs +1617 -0
  487. package/dist/utils/resilience/index.cjs.map +1 -0
  488. package/dist/utils/resilience/index.d.cts +9 -0
  489. package/dist/utils/resilience/index.d.ts +9 -0
  490. package/dist/utils/resilience/index.js +44 -0
  491. package/dist/utils/resilience/index.js.map +1 -0
  492. package/dist/utils/surface/index.cjs +1070 -0
  493. package/dist/utils/surface/index.cjs.map +1 -0
  494. package/dist/utils/surface/index.d.cts +240 -0
  495. package/dist/utils/surface/index.d.ts +240 -0
  496. package/dist/utils/surface/index.js +30 -0
  497. package/dist/utils/surface/index.js.map +1 -0
  498. package/dist/utils/topology-view/index.cjs +620 -0
  499. package/dist/utils/topology-view/index.cjs.map +1 -0
  500. package/dist/utils/topology-view/index.d.cts +68 -0
  501. package/dist/utils/topology-view/index.d.ts +68 -0
  502. package/dist/utils/topology-view/index.js +11 -0
  503. package/dist/utils/topology-view/index.js.map +1 -0
  504. package/package.json +293 -241
  505. package/dist/core/index.cjs +0 -21
  506. package/dist/core/index.cjs.map +0 -1
  507. package/dist/core/index.d.cts +0 -1
  508. package/dist/core/index.d.ts +0 -1
  509. package/dist/core/index.js +0 -3
  510. package/dist/core/index.js.map +0 -1
  511. package/dist/extra/browser.cjs +0 -21
  512. package/dist/extra/browser.cjs.map +0 -1
  513. package/dist/extra/browser.d.cts +0 -1
  514. package/dist/extra/browser.d.ts +0 -1
  515. package/dist/extra/browser.js +0 -3
  516. package/dist/extra/browser.js.map +0 -1
  517. package/dist/extra/index.cjs +0 -21
  518. package/dist/extra/index.cjs.map +0 -1
  519. package/dist/extra/index.d.cts +0 -1
  520. package/dist/extra/index.d.ts +0 -1
  521. package/dist/extra/index.js +0 -3
  522. package/dist/extra/index.js.map +0 -1
  523. package/dist/extra/node.cjs +0 -21
  524. package/dist/extra/node.cjs.map +0 -1
  525. package/dist/extra/node.d.cts +0 -1
  526. package/dist/extra/node.d.ts +0 -1
  527. package/dist/extra/node.js +0 -3
  528. package/dist/extra/node.js.map +0 -1
  529. package/dist/extra/operators.cjs +0 -21
  530. package/dist/extra/operators.cjs.map +0 -1
  531. package/dist/extra/operators.d.cts +0 -1
  532. package/dist/extra/operators.d.ts +0 -1
  533. package/dist/extra/operators.js +0 -3
  534. package/dist/extra/operators.js.map +0 -1
  535. package/dist/extra/reactive.cjs +0 -21
  536. package/dist/extra/reactive.cjs.map +0 -1
  537. package/dist/extra/reactive.d.cts +0 -1
  538. package/dist/extra/reactive.d.ts +0 -1
  539. package/dist/extra/reactive.js +0 -3
  540. package/dist/extra/reactive.js.map +0 -1
  541. package/dist/extra/render/index.cjs +0 -21
  542. package/dist/extra/render/index.cjs.map +0 -1
  543. package/dist/extra/render/index.d.cts +0 -1
  544. package/dist/extra/render/index.d.ts +0 -1
  545. package/dist/extra/render/index.js +0 -3
  546. package/dist/extra/render/index.js.map +0 -1
  547. package/dist/extra/sources.cjs +0 -21
  548. package/dist/extra/sources.cjs.map +0 -1
  549. package/dist/extra/sources.d.cts +0 -1
  550. package/dist/extra/sources.d.ts +0 -1
  551. package/dist/extra/sources.js +0 -3
  552. package/dist/extra/sources.js.map +0 -1
  553. package/dist/extra/storage-browser.cjs +0 -21
  554. package/dist/extra/storage-browser.cjs.map +0 -1
  555. package/dist/extra/storage-browser.d.cts +0 -1
  556. package/dist/extra/storage-browser.d.ts +0 -1
  557. package/dist/extra/storage-browser.js +0 -3
  558. package/dist/extra/storage-browser.js.map +0 -1
  559. package/dist/extra/storage-core.cjs +0 -21
  560. package/dist/extra/storage-core.cjs.map +0 -1
  561. package/dist/extra/storage-core.d.cts +0 -1
  562. package/dist/extra/storage-core.d.ts +0 -1
  563. package/dist/extra/storage-core.js +0 -3
  564. package/dist/extra/storage-core.js.map +0 -1
  565. package/dist/extra/storage-node.cjs +0 -21
  566. package/dist/extra/storage-node.cjs.map +0 -1
  567. package/dist/extra/storage-node.d.cts +0 -1
  568. package/dist/extra/storage-node.d.ts +0 -1
  569. package/dist/extra/storage-node.js +0 -3
  570. package/dist/extra/storage-node.js.map +0 -1
  571. package/dist/extra/storage-tiers-browser.cjs +0 -21
  572. package/dist/extra/storage-tiers-browser.cjs.map +0 -1
  573. package/dist/extra/storage-tiers-browser.d.cts +0 -1
  574. package/dist/extra/storage-tiers-browser.d.ts +0 -1
  575. package/dist/extra/storage-tiers-browser.js +0 -3
  576. package/dist/extra/storage-tiers-browser.js.map +0 -1
  577. package/dist/extra/storage-tiers-node.cjs +0 -21
  578. package/dist/extra/storage-tiers-node.cjs.map +0 -1
  579. package/dist/extra/storage-tiers-node.d.cts +0 -1
  580. package/dist/extra/storage-tiers-node.d.ts +0 -1
  581. package/dist/extra/storage-tiers-node.js +0 -3
  582. package/dist/extra/storage-tiers-node.js.map +0 -1
  583. package/dist/extra/storage-tiers.cjs +0 -21
  584. package/dist/extra/storage-tiers.cjs.map +0 -1
  585. package/dist/extra/storage-tiers.d.cts +0 -1
  586. package/dist/extra/storage-tiers.d.ts +0 -1
  587. package/dist/extra/storage-tiers.js +0 -3
  588. package/dist/extra/storage-tiers.js.map +0 -1
  589. package/dist/extra/storage-wal.cjs +0 -21
  590. package/dist/extra/storage-wal.cjs.map +0 -1
  591. package/dist/extra/storage-wal.d.cts +0 -1
  592. package/dist/extra/storage-wal.d.ts +0 -1
  593. package/dist/extra/storage-wal.js +0 -3
  594. package/dist/extra/storage-wal.js.map +0 -1
  595. package/dist/graph/index.cjs +0 -21
  596. package/dist/graph/index.cjs.map +0 -1
  597. package/dist/graph/index.d.cts +0 -1
  598. package/dist/graph/index.d.ts +0 -1
  599. package/dist/graph/index.js +0 -3
  600. package/dist/graph/index.js.map +0 -1
  601. package/dist/patterns/ai/browser.cjs +0 -21
  602. package/dist/patterns/ai/browser.cjs.map +0 -1
  603. package/dist/patterns/ai/browser.d.cts +0 -1
  604. package/dist/patterns/ai/browser.d.ts +0 -1
  605. package/dist/patterns/ai/browser.js +0 -3
  606. package/dist/patterns/ai/browser.js.map +0 -1
  607. package/dist/patterns/ai/index.cjs +0 -21
  608. package/dist/patterns/ai/index.cjs.map +0 -1
  609. package/dist/patterns/ai/index.d.cts +0 -1
  610. package/dist/patterns/ai/index.d.ts +0 -1
  611. package/dist/patterns/ai/index.js +0 -3
  612. package/dist/patterns/ai/index.js.map +0 -1
  613. package/dist/patterns/ai/node.cjs +0 -21
  614. package/dist/patterns/ai/node.cjs.map +0 -1
  615. package/dist/patterns/ai/node.d.cts +0 -1
  616. package/dist/patterns/ai/node.d.ts +0 -1
  617. package/dist/patterns/ai/node.js +0 -3
  618. package/dist/patterns/ai/node.js.map +0 -1
  619. package/dist/patterns/cqrs/index.cjs +0 -21
  620. package/dist/patterns/cqrs/index.cjs.map +0 -1
  621. package/dist/patterns/cqrs/index.d.cts +0 -1
  622. package/dist/patterns/cqrs/index.d.ts +0 -1
  623. package/dist/patterns/cqrs/index.js +0 -3
  624. package/dist/patterns/cqrs/index.js.map +0 -1
  625. package/dist/patterns/demo-shell/index.cjs +0 -21
  626. package/dist/patterns/demo-shell/index.cjs.map +0 -1
  627. package/dist/patterns/demo-shell/index.d.cts +0 -1
  628. package/dist/patterns/demo-shell/index.d.ts +0 -1
  629. package/dist/patterns/demo-shell/index.js +0 -3
  630. package/dist/patterns/demo-shell/index.js.map +0 -1
  631. package/dist/patterns/domain-templates/index.cjs +0 -21
  632. package/dist/patterns/domain-templates/index.cjs.map +0 -1
  633. package/dist/patterns/domain-templates/index.d.cts +0 -1
  634. package/dist/patterns/domain-templates/index.d.ts +0 -1
  635. package/dist/patterns/domain-templates/index.js +0 -3
  636. package/dist/patterns/domain-templates/index.js.map +0 -1
  637. package/dist/patterns/graphspec/index.cjs +0 -21
  638. package/dist/patterns/graphspec/index.cjs.map +0 -1
  639. package/dist/patterns/graphspec/index.d.cts +0 -1
  640. package/dist/patterns/graphspec/index.d.ts +0 -1
  641. package/dist/patterns/graphspec/index.js +0 -3
  642. package/dist/patterns/graphspec/index.js.map +0 -1
  643. package/dist/patterns/harness/index.cjs +0 -21
  644. package/dist/patterns/harness/index.cjs.map +0 -1
  645. package/dist/patterns/harness/index.d.cts +0 -1
  646. package/dist/patterns/harness/index.d.ts +0 -1
  647. package/dist/patterns/harness/index.js +0 -3
  648. package/dist/patterns/harness/index.js.map +0 -1
  649. package/dist/patterns/inspect/index.cjs +0 -21
  650. package/dist/patterns/inspect/index.cjs.map +0 -1
  651. package/dist/patterns/inspect/index.d.cts +0 -1
  652. package/dist/patterns/inspect/index.d.ts +0 -1
  653. package/dist/patterns/inspect/index.js +0 -3
  654. package/dist/patterns/inspect/index.js.map +0 -1
  655. package/dist/patterns/job-queue/index.cjs +0 -21
  656. package/dist/patterns/job-queue/index.cjs.map +0 -1
  657. package/dist/patterns/job-queue/index.d.cts +0 -1
  658. package/dist/patterns/job-queue/index.d.ts +0 -1
  659. package/dist/patterns/job-queue/index.js +0 -3
  660. package/dist/patterns/job-queue/index.js.map +0 -1
  661. package/dist/patterns/memory/index.cjs +0 -21
  662. package/dist/patterns/memory/index.cjs.map +0 -1
  663. package/dist/patterns/memory/index.d.cts +0 -1
  664. package/dist/patterns/memory/index.d.ts +0 -1
  665. package/dist/patterns/memory/index.js +0 -3
  666. package/dist/patterns/memory/index.js.map +0 -1
  667. package/dist/patterns/messaging/index.cjs +0 -21
  668. package/dist/patterns/messaging/index.cjs.map +0 -1
  669. package/dist/patterns/messaging/index.d.cts +0 -1
  670. package/dist/patterns/messaging/index.d.ts +0 -1
  671. package/dist/patterns/messaging/index.js +0 -3
  672. package/dist/patterns/messaging/index.js.map +0 -1
  673. package/dist/patterns/orchestration/index.cjs +0 -21
  674. package/dist/patterns/orchestration/index.cjs.map +0 -1
  675. package/dist/patterns/orchestration/index.d.cts +0 -1
  676. package/dist/patterns/orchestration/index.d.ts +0 -1
  677. package/dist/patterns/orchestration/index.js +0 -3
  678. package/dist/patterns/orchestration/index.js.map +0 -1
  679. package/dist/patterns/process/index.cjs +0 -21
  680. package/dist/patterns/process/index.cjs.map +0 -1
  681. package/dist/patterns/process/index.d.cts +0 -1
  682. package/dist/patterns/process/index.d.ts +0 -1
  683. package/dist/patterns/process/index.js +0 -3
  684. package/dist/patterns/process/index.js.map +0 -1
  685. package/dist/patterns/reactive-layout/index.cjs +0 -21
  686. package/dist/patterns/reactive-layout/index.cjs.map +0 -1
  687. package/dist/patterns/reactive-layout/index.d.cts +0 -1
  688. package/dist/patterns/reactive-layout/index.d.ts +0 -1
  689. package/dist/patterns/reactive-layout/index.js +0 -3
  690. package/dist/patterns/reactive-layout/index.js.map +0 -1
  691. package/dist/patterns/reduction/index.cjs +0 -21
  692. package/dist/patterns/reduction/index.cjs.map +0 -1
  693. package/dist/patterns/reduction/index.d.cts +0 -1
  694. package/dist/patterns/reduction/index.d.ts +0 -1
  695. package/dist/patterns/reduction/index.js +0 -3
  696. package/dist/patterns/reduction/index.js.map +0 -1
  697. package/dist/patterns/surface/index.cjs +0 -21
  698. package/dist/patterns/surface/index.cjs.map +0 -1
  699. package/dist/patterns/surface/index.d.cts +0 -1
  700. package/dist/patterns/surface/index.d.ts +0 -1
  701. package/dist/patterns/surface/index.js +0 -3
  702. package/dist/patterns/surface/index.js.map +0 -1
  703. package/dist/patterns/topology-view/index.cjs +0 -21
  704. package/dist/patterns/topology-view/index.cjs.map +0 -1
  705. package/dist/patterns/topology-view/index.d.cts +0 -1
  706. package/dist/patterns/topology-view/index.d.ts +0 -1
  707. package/dist/patterns/topology-view/index.js +0 -3
  708. package/dist/patterns/topology-view/index.js.map +0 -1
  709. package/dist/testing/index.cjs +0 -21
  710. package/dist/testing/index.cjs.map +0 -1
  711. package/dist/testing/index.d.cts +0 -1
  712. package/dist/testing/index.d.ts +0 -1
  713. package/dist/testing/index.js +0 -3
  714. package/dist/testing/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/base/io/checkpoint.ts","../src/base/io/clickhouse-watch.ts","../src/base/io/csv.ts","../src/base/io/drizzle.ts","../src/base/io/http.ts","../src/base/io/_sink.ts","../src/base/io/kafka.ts","../src/base/io/kysely.ts","../src/base/io/mcp.ts","../src/base/io/nats.ts","../src/base/io/ndjson.ts","../src/base/io/otel.ts","../src/base/io/prisma.ts","../src/base/io/prometheus.ts","../src/base/io/pulsar.ts","../src/base/io/rabbitmq.ts","../src/base/io/redis-stream.ts","../src/base/io/sqlite.ts","../src/base/io/statsd.ts","../src/base/io/syslog.ts","../src/base/io/to-clickhouse.ts","../src/base/io/to-file.ts","../src/base/io/to-csv.ts","../src/base/io/to-loki.ts","../src/base/io/to-mongo.ts","../src/base/io/to-postgres.ts","../src/base/io/to-s3.ts","../src/base/io/to-tempo.ts","../src/base/io/webhook.ts","../src/base/io/websocket.ts"],"sourcesContent":["/**\n * Graph checkpoint sinks — `checkpointToS3` and `checkpointToRedis` wire a\n * graph's `attachSnapshotStorage` with an S3- or Redis-backed\n * {@link SnapshotStorageTier}.\n */\n\nimport { wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport type { SnapshotStorageTier } from \"@graphrefly/pure-ts/extra/storage\";\nimport type { GraphCheckpointRecord } from \"@graphrefly/pure-ts/graph\";\nimport type { AttachStorageGraphLike } from \"./_internal.js\";\nimport type { S3ClientLike } from \"./to-s3.js\";\n\n/** Options for {@link checkpointToS3}. */\nexport type CheckpointToS3Options = {\n\t/** S3 key prefix. Default: `\"checkpoints/\"`. */\n\tprefix?: string;\n\t/** Debounce ms on the S3 tier. Default: `500`. */\n\tdebounceMs?: number;\n\t/** Full snapshot compaction interval. Default: `10`. */\n\tcompactEvery?: number;\n\tonError?: (error: unknown) => void;\n};\n\n/**\n * Wires `graph.attachSnapshotStorage()` with an S3-backed tier.\n *\n * @param graph - Graph instance to checkpoint.\n * @param client - S3-compatible client with `putObject()`.\n * @param bucket - S3 bucket name.\n * @param opts - Key prefix, debounce, and compaction options.\n * @returns Dispose handle.\n *\n * @category extra\n */\nexport function checkpointToS3(\n\tgraph: AttachStorageGraphLike,\n\tclient: S3ClientLike,\n\tbucket: string,\n\topts?: CheckpointToS3Options,\n): { dispose(): void } {\n\tconst { prefix = \"checkpoints/\", debounceMs = 500, compactEvery = 10, onError } = opts ?? {};\n\tconst tier: SnapshotStorageTier<GraphCheckpointRecord> = {\n\t\tname: `s3:${bucket}`,\n\t\tdebounceMs,\n\t\tcompactEvery,\n\t\tsave(record) {\n\t\t\tconst ms = Math.floor(wallClockNs() / 1_000_000);\n\t\t\tconst s3Key = `${prefix}${graph.name}/checkpoint-${ms}.json`;\n\t\t\tlet body: string;\n\t\t\ttry {\n\t\t\t\tbody = JSON.stringify(record);\n\t\t\t} catch (err) {\n\t\t\t\tonError?.(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid client\n\t\t\t\t.putObject({\n\t\t\t\t\tBucket: bucket,\n\t\t\t\t\tKey: s3Key,\n\t\t\t\t\tBody: body,\n\t\t\t\t\tContentType: \"application/json\",\n\t\t\t\t})\n\t\t\t\t.catch((err) => onError?.(err));\n\t\t},\n\t\t// S3 tier is write-only here — one object per checkpoint timestamp,\n\t\t// no canonical \"latest\" key for load.\n\t};\n\treturn graph.attachSnapshotStorage([{ snapshot: tier }], {\n\t\tonError: (err: unknown) => onError?.(err),\n\t});\n}\n\n/** Duck-typed Redis client for checkpoint storage. */\nexport type RedisCheckpointClientLike = {\n\tset(key: string, value: string): Promise<unknown>;\n\tget(key: string): Promise<string | null>;\n};\n\n/** Options for {@link checkpointToRedis}. */\nexport type CheckpointToRedisOptions = {\n\t/** Key prefix. Default: `\"graphrefly:checkpoint:\"`. */\n\tprefix?: string;\n\t/** Debounce ms on the Redis tier. Default: `500`. */\n\tdebounceMs?: number;\n\t/** Full snapshot compaction interval. Default: `10`. */\n\tcompactEvery?: number;\n\tonError?: (error: unknown) => void;\n};\n\n/**\n * Wires `graph.attachSnapshotStorage()` with a Redis-backed tier.\n *\n * @param graph - Graph instance to checkpoint.\n * @param client - Redis client with `set()`/`get()`.\n * @param opts - Key prefix, debounce, and compaction options.\n * @returns Dispose handle.\n *\n * @category extra\n */\nexport function checkpointToRedis(\n\tgraph: AttachStorageGraphLike,\n\tclient: RedisCheckpointClientLike,\n\topts?: CheckpointToRedisOptions,\n): { dispose(): void } {\n\tconst {\n\t\tprefix = \"graphrefly:checkpoint:\",\n\t\tdebounceMs = 500,\n\t\tcompactEvery = 10,\n\t\tonError,\n\t} = opts ?? {};\n\tconst redisKey = `${prefix}${graph.name}`;\n\tconst tier: SnapshotStorageTier<GraphCheckpointRecord> = {\n\t\tname: `redis:${redisKey}`,\n\t\tdebounceMs,\n\t\tcompactEvery,\n\t\tsave(record) {\n\t\t\tlet body: string;\n\t\t\ttry {\n\t\t\t\tbody = JSON.stringify(record);\n\t\t\t} catch (err) {\n\t\t\t\tonError?.(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid client.set(redisKey, body).catch((err) => onError?.(err));\n\t\t},\n\t\tasync load() {\n\t\t\tconst raw = await client.get(redisKey);\n\t\t\tif (raw == null) return undefined;\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(raw) as GraphCheckpointRecord;\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t};\n\treturn graph.attachSnapshotStorage([{ snapshot: tier }], {\n\t\tonError: (err: unknown) => onError?.(err),\n\t});\n}\n","/**\n * ClickHouse live materialized view IO — `fromClickHouseWatch` polls a query\n * via `fromTimer + switchMap` (reactive timer, switch semantics cancel\n * in-flight queries) and emits one `DATA` per result row per scrape.\n */\n\nimport { COMPLETE, ERROR, type Node, node } from \"@graphrefly/pure-ts/core\";\nimport { type AsyncSourceOpts, fromTimer, switchMap } from \"@graphrefly/pure-ts/extra\";\nimport { NS_PER_MS, NS_PER_SEC } from \"../resilience/backoff.js\";\n\n/** Structured ClickHouse query result row. */\nexport type ClickHouseRow = Record<string, unknown>;\n\n/** Duck-typed ClickHouse client. */\nexport type ClickHouseClientLike = {\n\tquery(opts: { query: string; format?: string }): Promise<{\n\t\tjson<T = unknown>(): Promise<T[]>;\n\t}>;\n};\n\n/** Options for {@link fromClickHouseWatch}. */\nexport type FromClickHouseWatchOptions = AsyncSourceOpts & {\n\t/** Polling interval in nanoseconds. Default: `5 * NS_PER_SEC` (5s). */\n\tintervalNs?: number;\n\t/** JSON format to request. Default: `\"JSONEachRow\"`. */\n\tformat?: string;\n\t/**\n\t * Maximum consecutive query errors before terminating the source. Prevents\n\t * error storms when the database is unavailable. Default: `5`. Set to\n\t * `Infinity` to keep retrying indefinitely.\n\t */\n\tmaxConsecutiveErrors?: number;\n};\n\n/**\n * ClickHouse live materialized view as a reactive source.\n *\n * Polls a ClickHouse query on a reactive timer interval and emits new/changed rows.\n * Uses a timer-driven approach (not busy-wait polling).\n *\n * @param client - ClickHouse client instance (caller owns connection).\n * @param query - SQL query to execute on each interval.\n * @param opts - Polling interval and format options.\n * @returns `Node<ClickHouseRow>` — one `DATA` per result row per scrape.\n *\n * @example\n * ```ts\n * import { createClient } from \"@clickhouse/client\";\n * import { fromClickHouseWatch } from \"@graphrefly/graphrefly-ts\";\n *\n * const client = createClient({ url: \"http://localhost:8123\" });\n * const rows$ = fromClickHouseWatch(client, \"SELECT * FROM errors_mv ORDER BY timestamp DESC LIMIT 100\");\n * ```\n *\n * @category extra\n */\nexport function fromClickHouseWatch(\n\tclient: ClickHouseClientLike,\n\tquery: string,\n\topts?: FromClickHouseWatchOptions,\n): Node<ClickHouseRow> {\n\tconst {\n\t\tintervalNs = 5 * NS_PER_SEC,\n\t\tformat = \"JSONEachRow\",\n\t\tsignal: externalSignal,\n\t\tmaxConsecutiveErrors = 1,\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\t// Circuit breaker shared across switchMap inners.\n\tlet consecutiveErrors = 0;\n\n\t// `fromTimer | switchMap(producer(one-query))` — timer ticks drive a single\n\t// query each; switchMap cancels any in-flight inner when the next tick\n\t// arrives. First tick at t=0, then every intervalMs.\n\treturn switchMap(fromTimer(0, { period: intervalMs, signal: externalSignal }), () =>\n\t\tnode<ClickHouseRow>([], (_data, a) => {\n\t\t\tlet active = true;\n\t\t\tconst run = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await client.query({ query, format });\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tconst rows = await result.json<ClickHouseRow>();\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tfor (const row of rows) a.emit(row);\n\t\t\t\t\tconsecutiveErrors = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tconsecutiveErrors += 1;\n\t\t\t\t\tif (consecutiveErrors >= maxConsecutiveErrors) {\n\t\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\t}\n\t\t\t\t\t// else: swallow transient error; next tick retries.\n\t\t\t\t}\n\t\t\t};\n\t\t\tvoid run();\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t}),\n\t);\n}\n","/**\n * CSV ingest IO — `fromCSV` reads an `AsyncIterable<string>` of CSV chunks\n * (one node per row), and `csvRows` is the stateful operator variant for\n * existing reactive `Node<string>` upstreams. Both share the local\n * `parseCSVLine` helper so quoted fields and embedded delimiters are handled\n * uniformly.\n */\n\nimport { COMPLETE, ERROR, type Node, type NodeOptions, node } from \"@graphrefly/pure-ts/core\";\nimport { type ExtraOpts, sourceOpts } from \"./_internal.js\";\n\n/** Parsed CSV row. */\nexport type CSVRow = Record<string, string>;\n\n/** Options for {@link fromCSV}. */\nexport type FromCSVOptions = ExtraOpts & {\n\t/** Column delimiter. Default: `\",\"`. */\n\tdelimiter?: string;\n\t/** Whether the first row is a header. Default: `true`. */\n\thasHeader?: boolean;\n\t/** Explicit column names (overrides header row). */\n\tcolumns?: string[];\n\t/** Custom line parser (e.g. wrapping a library like `csv-parse`). Overrides built-in parser + delimiter. */\n\tparseLine?: (line: string) => string[];\n};\n\n/**\n * CSV file/stream ingest for batch replay.\n *\n * Reads a CSV from a `ReadableStream<string>` or an `AsyncIterable<string>` of lines,\n * emitting one `DATA` per row. `COMPLETE` after all rows are emitted.\n *\n * @param source - Async iterable of CSV text chunks (lines or multi-line chunks).\n * @param opts - Delimiter, header, and column options.\n * @returns `Node<CSVRow>` — one `DATA` per parsed row.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromCSV } from \"@graphrefly/graphrefly-ts\";\n *\n * const csv$ = fromCSV(createReadStream(\"data.csv\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromCSV(source: AsyncIterable<string>, opts?: FromCSVOptions): Node<CSVRow> {\n\tconst {\n\t\tdelimiter = \",\",\n\t\thasHeader = true,\n\t\tcolumns: explicitColumns,\n\t\tparseLine,\n\t\t...rest\n\t} = opts ?? {};\n\tconst parse = parseLine ?? ((line: string) => parseCSVLine(line, delimiter));\n\n\treturn node<CSVRow>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet cancelled = false;\n\n\t\t\tconst run = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet headers: string[] | undefined = explicitColumns;\n\t\t\t\t\tlet buffer = \"\";\n\n\t\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\t\t// Keep last partial line in buffer.\n\t\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\t\tif (!line.trim()) continue;\n\n\t\t\t\t\t\t\tconst values = parse(line);\n\n\t\t\t\t\t\t\tif (!headers && hasHeader) {\n\t\t\t\t\t\t\t\theaders = values;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!headers) {\n\t\t\t\t\t\t\t\theaders = values.map((_, i) => `col${i}`);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Process remaining buffer.\n\t\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\t\tconst values = parse(buffer);\n\t\t\t\t\t\tif (headers) {\n\t\t\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\t\t\tfor (let i = 0; i < headers.length; i++) {\n\t\t\t\t\t\t\t\trow[headers[i]] = values[i] ?? \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta.emit(row);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvoid run();\n\n\t\t\treturn () => {\n\t\t\t\tcancelled = true;\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/**\n * Stateful CSV parser operator — takes a `Node<string>` emitting raw text\n * chunks (from any source: {@link fromAsyncIter}, {@link fromHTTPStream},\n * WebSocket, file watcher, etc.) and emits one `DATA` per parsed row.\n *\n * Buffers incomplete lines across chunks. Mirrors {@link fromCSV}'s parsing\n * logic without committing to an async-iterable-only input.\n *\n * @example\n * ```ts\n * import { fromHTTPStream, csvRows } from \"@graphrefly/graphrefly-ts\";\n * const bytes$ = fromHTTPStream(\"https://example.com/data.csv\");\n * const text$ = decodeText(bytes$); // caller-provided byte→string decoder\n * const rows$ = csvRows(text$, { columns: [\"name\", \"age\"] });\n * ```\n *\n * @category extra\n */\nexport function csvRows(source: Node<string>, opts?: FromCSVOptions): Node<CSVRow> {\n\tconst {\n\t\tdelimiter = \",\",\n\t\thasHeader = true,\n\t\tcolumns: explicitColumns,\n\t\tparseLine,\n\t\t...rest\n\t} = opts ?? {};\n\tconst parse = parseLine ?? ((line: string) => parseCSVLine(line, delimiter));\n\t// Lock 6.D (Phase 13.6.B): clear parser state on deactivation so\n\t// `csvRows` under retry/resubscribe patterns doesn't leak a stale\n\t// half-parsed line or sticky header detection from a prior run.\n\tlet cleanup: { onDeactivation: () => void } | undefined;\n\treturn node<CSVRow>(\n\t\t[source as Node],\n\t\t(data, a, ctx) => {\n\t\t\tif (cleanup === undefined) {\n\t\t\t\tconst store = ctx.store;\n\t\t\t\tcleanup = {\n\t\t\t\t\tonDeactivation: () => {\n\t\t\t\t\t\tdelete store.buffer;\n\t\t\t\t\t\tdelete store.headers;\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst batch0 = data[0];\n\t\t\tif (batch0 == null || batch0.length === 0) return cleanup;\n\t\t\tconst s = ctx.store as { buffer: string; headers: string[] | undefined };\n\t\t\tif (typeof s.buffer !== \"string\") s.buffer = \"\";\n\t\t\tif (s.headers === undefined && explicitColumns) s.headers = explicitColumns.slice();\n\t\t\tfor (const chunkRaw of batch0) {\n\t\t\t\ts.buffer = s.buffer + (chunkRaw as string);\n\t\t\t\tconst lines: string[] = s.buffer.split(/\\r?\\n/);\n\t\t\t\ts.buffer = lines.pop() ?? \"\";\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tif (!line.trim()) continue;\n\t\t\t\t\tconst values = parse(line);\n\t\t\t\t\tif (!s.headers && hasHeader) {\n\t\t\t\t\t\ts.headers = values;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (!s.headers) s.headers = values.map((_, i) => `col${i}`);\n\t\t\t\t\tconst row: CSVRow = {};\n\t\t\t\t\tfor (let i = 0; i < s.headers.length; i++) row[s.headers[i]] = values[i] ?? \"\";\n\t\t\t\t\ta.emit(row);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cleanup;\n\t\t},\n\t\t{ describeKind: \"derived\", ...rest } as NodeOptions<CSVRow>,\n\t);\n}\n\nfunction parseCSVLine(line: string, delimiter: string): string[] {\n\tconst values: string[] = [];\n\tlet current = \"\";\n\tlet inQuotes = false;\n\n\tfor (let i = 0; i < line.length; i++) {\n\t\tconst ch = line[i];\n\t\tif (inQuotes) {\n\t\t\tif (ch === '\"') {\n\t\t\t\tif (line[i + 1] === '\"') {\n\t\t\t\t\tcurrent += '\"';\n\t\t\t\t\ti++;\n\t\t\t\t} else {\n\t\t\t\t\tinQuotes = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcurrent += ch;\n\t\t\t}\n\t\t} else if (ch === '\"') {\n\t\t\tinQuotes = true;\n\t\t} else if (ch === delimiter) {\n\t\t\tvalues.push(current);\n\t\t\tcurrent = \"\";\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t}\n\t}\n\tvalues.push(current);\n\treturn values;\n}\n","/**\n * Drizzle adapter (5.2b) — `fromDrizzle` runs `query.execute()` and emits one\n * `DATA` containing the full mapped row array, then `COMPLETE`.\n */\n\nimport { COMPLETE, ERROR, type Node, type NodeOptions, node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/**\n * Duck-typed Drizzle query builder result.\n *\n * Drizzle query builders (e.g. `db.select().from(users)`) expose `.execute()`\n * which returns `Promise<T[]>`. This interface captures that contract without\n * depending on `drizzle-orm`.\n */\nexport type DrizzleQueryLike<T = unknown> = {\n\texecute(): Promise<T[]>;\n};\n\n/** Options for {@link fromDrizzle}. */\nexport type FromDrizzleOptions<T, U = T> = ExtraOpts & {\n\t/** Map each row to the desired shape. Default: identity cast. */\n\tmapRow?: (row: T) => U;\n};\n\n/**\n * One-shot Drizzle query as a reactive source.\n *\n * Calls `query.execute()`, emits one `DATA` per result row, then `COMPLETE`.\n * Compose with `switchMap` + `fromTimer` for periodic re-query.\n *\n * @param query - Drizzle query builder (e.g. `db.select().from(users).where(...)`).\n * @param opts - Row mapper and node options.\n * @returns `Node<U>` — one `DATA` per row, then `COMPLETE`.\n *\n * @example\n * ```ts\n * import { drizzle } from \"drizzle-orm/node-postgres\";\n * import { fromDrizzle } from \"@graphrefly/graphrefly-ts\";\n *\n * const db = drizzle(pool);\n * const rows$ = fromDrizzle(db.select().from(users).where(eq(users.active, true)));\n * ```\n *\n * @category extra\n */\nexport function fromDrizzle<T = unknown, U = T>(\n\tquery: DrizzleQueryLike<T>,\n\topts?: FromDrizzleOptions<T, U>,\n): Node<U[]> {\n\tconst { mapRow = (r: T) => r as unknown as U, ...rest } = opts ?? {};\n\n\treturn node<U[]>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\n\t\t\tvoid query\n\t\t\t\t.execute()\n\t\t\t\t.then((rows) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.emit(rows.map(mapRow));\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ttry {\n\t\t\t\t\t\ta.down([[ERROR, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* node already torn down — swallow */\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t},\n\t\t{ ...rest, describeKind: \"producer\", completeWhenDepsComplete: false } as NodeOptions<U[]>,\n\t);\n}\n","/**\n * HTTP IO — `fromHTTP` (one-shot fetch with `withStatus` companion bundle),\n * `toHTTP` (per-record / buffered sink with retry support), `fromHTTPStream`\n * (raw `Uint8Array` byte stream), `fromHTTPPoll` (interval-driven re-fetch).\n *\n * Uses the platform `fetch` API (Node 18+, browsers, Deno, Bun). Timeouts use\n * `AbortController` driven by `setTimeout` per spec §5.10's resilience-operator\n * carve-out.\n */\n\nimport {\n\tbatch,\n\tCOMPLETE,\n\tDATA,\n\tERROR,\n\ttype Node,\n\tnode,\n\twallClockNs,\n} from \"@graphrefly/pure-ts/core\";\nimport { type AsyncSourceOpts, fromTimer, switchMap } from \"@graphrefly/pure-ts/extra\";\nimport { NS_PER_MS, NS_PER_SEC } from \"../resilience/backoff.js\";\nimport { type WithStatusBundle, withStatus } from \"../resilience/status.js\";\nimport { type ExtraOpts, sourceOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/**\n * Options for {@link fromHTTP}.\n *\n * @category extra\n */\nexport interface FromHTTPOptions extends AsyncSourceOpts {\n\t/** HTTP method. Default: `\"GET\"`. */\n\tmethod?: string;\n\t/** Request headers. */\n\theaders?: Record<string, string>;\n\t/** Request body (for POST/PUT/PATCH). */\n\tbody?: any;\n\t/** Transform the Response before emitting. Default: `response.json()`. */\n\ttransform?: (response: Response) => any | Promise<any>;\n\t/** Request timeout in **nanoseconds**. Default: `30s` (30 * NS_PER_SEC). */\n\ttimeoutNs?: number;\n\t/**\n\t * When `true`, emit `COMPLETE` after the first successful fetch. Useful for\n\t * one-shot semantics where downstream wants to know \"no more values ever.\"\n\t * Default: `false` — the node stays live and replays cached DATA to late\n\t * subscribers via push-on-subscribe (spec §2.2).\n\t */\n\tcompleteAfterFetch?: boolean;\n\t/**\n\t * When `true`, trigger a fresh fetch on each new subscriber instead of\n\t * sharing one cached result. Default: `false` — one shared fetch whose\n\t * result is cached and replayed to every subscriber.\n\t */\n\trefetchOnSubscribe?: boolean;\n}\n\n/**\n * Result of {@link fromHTTP}: main source plus status, error, and fetch count companions.\n *\n * @category extra\n */\nexport type HTTPBundle<T> = WithStatusBundle<T> & {\n\t/** Number of successful fetches. */\n\tfetchCount: Node<number>;\n\t/** Nanosecond wall-clock timestamp of the last successful fetch. */\n\tlastUpdated: Node<number>;\n\t/**\n\t * `true` after at least one successful fetch; stays `true` across\n\t * resubscribes. Orthogonal to {@link withStatus}'s `active`/`completed`\n\t * lifecycle — use this as the \"fetch done\" signal under the default\n\t * (cached, stays-live) behavior where `withStatus` never transitions to\n\t * `\"completed\"` unless `completeAfterFetch: true` is set.\n\t */\n\tfetched: Node<boolean>;\n};\n\n/**\n * Creates a one-shot fetch-based HTTP source with lifecycle tracking.\n *\n * @category extra\n */\nexport function fromHTTP<T = any>(url: string, opts?: FromHTTPOptions): HTTPBundle<T> {\n\tconst {\n\t\tmethod = \"GET\",\n\t\theaders,\n\t\tbody: bodyOpt,\n\t\ttransform = (r: Response) => r.json(),\n\t\ttimeoutNs = 30 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\tcompleteAfterFetch = false,\n\t\trefetchOnSubscribe = false,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst fetchCount = node<number>([], { initial: 0, name: `${rest.name ?? \"http\"}/fetchCount` });\n\tconst lastUpdated = node<number>([], { initial: 0, name: `${rest.name ?? \"http\"}/lastUpdated` });\n\tconst fetched = node<boolean>([], { initial: false, name: `${rest.name ?? \"http\"}/fetched` });\n\t// Closure-owned counter: `fetchCount` is a write-only observable of this\n\t// local count. Avoids the `fetchCount.cache + 1` read-modify-write pattern\n\t// (P3 audit #6) — the node stays in sync because every write flows through\n\t// here.\n\tlet fetchCountLocal = 0;\n\n\tconst body =\n\t\tbodyOpt !== undefined\n\t\t\t? typeof bodyOpt === \"string\"\n\t\t\t\t? bodyOpt\n\t\t\t\t: JSON.stringify(bodyOpt)\n\t\t\t: undefined;\n\n\t// Fetch body + lifecycle — shared between the default \"one shared fetch\"\n\t// path and the refetch-on-subscribe resubscribable producer path.\n\tconst runFetch = (a: {\n\t\temit: (v: T) => void;\n\t\tdown: (msgs: [symbol, ...unknown[]][]) => void;\n\t}): (() => void) => {\n\t\tconst abort = new AbortController();\n\t\tlet active = true;\n\n\t\tif (externalSignal?.aborted) {\n\t\t\t// Abort already fired before activation — short-circuit with ERROR\n\t\t\t// and flip `active` so the idempotent cleanup below is coherent.\n\t\t\tactive = false;\n\t\t\ta.down([[ERROR, externalSignal.reason ?? new Error(\"Aborted\")]]);\n\t\t\treturn () => {};\n\t\t}\n\t\texternalSignal?.addEventListener(\"abort\", () => abort.abort(externalSignal.reason), {\n\t\t\tonce: true,\n\t\t});\n\n\t\tconst timeoutId = setTimeout(\n\t\t\t() => abort.abort(new Error(\"Request timeout\")),\n\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t);\n\n\t\tfetch(url, { method, headers, body, signal: abort.signal })\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\t\t\tconst data = await transform(res);\n\t\t\t\tif (!active) return;\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfetchCountLocal += 1;\n\t\t\t\t\tfetchCount.down([[DATA, fetchCountLocal]]);\n\t\t\t\t\tlastUpdated.down([[DATA, wallClockNs()]]);\n\t\t\t\t\tfetched.down([[DATA, true]]);\n\t\t\t\t\ta.emit(data as T);\n\t\t\t\t});\n\t\t\t\tif (completeAfterFetch) a.down([[COMPLETE]]);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tif (!active) return;\n\t\t\t\tif (err && (err as Error).name === \"AbortError\") return;\n\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tabort.abort();\n\t\t};\n\t};\n\n\tconst sourceNode = node<T>(\n\t\t[],\n\t\t(_data, a) =>\n\t\t\trunFetch({\n\t\t\t\temit: (v) => a.emit(v),\n\t\t\t\tdown: (msgs) => a.down(msgs as unknown as [symbol, unknown?][]),\n\t\t\t}),\n\t\t{\n\t\t\t...sourceOpts(rest),\n\t\t\t// `resubscribable: true` when refetchOnSubscribe — each new activation\n\t\t\t// (subscribe after full deactivation) re-runs the producer fn → fresh\n\t\t\t// fetch. Default (cache-once) stays non-resubscribable: producer runs\n\t\t\t// once on first activation, cached DATA replays to late subscribers.\n\t\t\tresubscribable: refetchOnSubscribe,\n\t\t},\n\t);\n\n\tconst tracked = withStatus(sourceNode);\n\n\treturn {\n\t\t...tracked,\n\t\tfetchCount,\n\t\tlastUpdated,\n\t\tfetched,\n\t};\n}\n\n/** Options for {@link toHTTP}. */\nexport type ToHTTPOptions<T> = ExtraOpts & {\n\t/** HTTP method. Default: `\"POST\"`. */\n\tmethod?: string;\n\t/** Request headers applied to every call. Caller sets Content-Type. */\n\theaders?: Record<string, string>;\n\t/** Serialize a value to a request body. Default: `JSON.stringify`. */\n\tserialize?: (value: T) => string | Uint8Array;\n\t/** Optional request timeout in nanoseconds. */\n\ttimeoutNs?: number;\n\t/**\n\t * Format used when `batchSize` / `flushIntervalMs` is set:\n\t * - `\"json-array\"` — body is `JSON.stringify(batch)`\n\t * - `\"ndjson\"` — body is newline-delimited JSON.\n\t * Default: `\"json-array\"`.\n\t */\n\tbatchFormat?: \"json-array\" | \"ndjson\";\n\t/** Batch size before auto-flush (buffered mode). */\n\tbatchSize?: number;\n\t/** Flush interval in ms (buffered mode). */\n\tflushIntervalMs?: number;\n\t/** Retry configuration — same shape as {@link ReactiveSinkRetryOptions}. */\n\tretry?: Parameters<typeof reactiveSink<T>>[1][\"retry\"];\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * HTTP sink — forwards upstream `DATA` values as HTTP requests.\n *\n * Per-record mode (default, no batching knobs): one request per DATA.\n * Buffered mode (`batchSize` / `flushIntervalMs`): one request per chunk,\n * body is JSON-array or NDJSON depending on `batchFormat`.\n *\n * @param source - Upstream node.\n * @param url - Request URL.\n * @param opts - Serialization, batching, retry options.\n * @returns {@link ReactiveSinkHandle}.\n *\n * @category extra\n */\nexport function toHTTP<T>(\n\tsource: Node<T>,\n\turl: string,\n\topts?: ToHTTPOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tmethod = \"POST\",\n\t\theaders = { \"Content-Type\": \"application/json\" },\n\t\tserialize = (v: T) => JSON.stringify(v),\n\t\ttimeoutNs,\n\t\tbatchFormat = \"json-array\",\n\t\tbatchSize,\n\t\tflushIntervalMs,\n\t\tretry,\n\t\tonTransportError,\n\t} = opts ?? {};\n\n\tconst sendOne = async (body: string | Uint8Array): Promise<void> => {\n\t\tconst controller = timeoutNs !== undefined ? new AbortController() : undefined;\n\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\t\tif (controller && timeoutNs !== undefined) {\n\t\t\ttimeoutId = setTimeout(\n\t\t\t\t() => controller.abort(new Error(\"Request timeout\")),\n\t\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t\t);\n\t\t}\n\t\ttry {\n\t\t\tconst res = await fetch(url, {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t\tbody: body as BodyInit | null | undefined,\n\t\t\t\tsignal: controller?.signal,\n\t\t\t});\n\t\t\t// Drain the response body in every branch — un-drained bodies on\n\t\t\t// non-ok responses hold the connection open in Node's fetch pool\n\t\t\t// until GC, which starves the pool during retry storms.\n\t\t\tconst drain = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait res.arrayBuffer?.();\n\t\t\t\t} catch {\n\t\t\t\t\t/* body already consumed / socket dead — nothing to drain */\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (!res.ok) {\n\t\t\t\tawait drain();\n\t\t\t\tthrow new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\t\t}\n\t\t\tawait drain();\n\t\t} finally {\n\t\t\tif (timeoutId !== undefined) clearTimeout(timeoutId);\n\t\t}\n\t};\n\n\tconst buffered = batchSize !== undefined || flushIntervalMs !== undefined;\n\tif (buffered) {\n\t\t// Buffered mode: batchFormat decides the body shape; per-item `serialize`\n\t\t// is only applied for ndjson (line-oriented). json-array format sends the\n\t\t// raw batch through `JSON.stringify` as a single array.\n\t\treturn reactiveSink<T>(source, {\n\t\t\tonTransportError,\n\t\t\tretry,\n\t\t\tbatchSize,\n\t\t\tflushIntervalMs,\n\t\t\tsendBatch: async (chunk) => {\n\t\t\t\tlet body: string | Uint8Array;\n\t\t\t\tif (batchFormat === \"ndjson\") {\n\t\t\t\t\tbody = (chunk as T[])\n\t\t\t\t\t\t.map((v) => {\n\t\t\t\t\t\t\tconst s = serialize(v);\n\t\t\t\t\t\t\treturn typeof s === \"string\" ? s : new TextDecoder().decode(s);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t} else {\n\t\t\t\t\tbody = JSON.stringify(chunk);\n\t\t\t\t}\n\t\t\t\tawait sendOne(body);\n\t\t\t},\n\t\t});\n\t}\n\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tretry,\n\t\tserialize,\n\t\tsend: async (payload) => {\n\t\t\tawait sendOne(payload as string | Uint8Array);\n\t\t},\n\t});\n}\n\n/** Options for {@link fromHTTPStream}. */\nexport type FromHTTPStreamOptions = ExtraOpts & {\n\tmethod?: string;\n\theaders?: Record<string, string>;\n\tbody?: unknown;\n\tsignal?: AbortSignal;\n};\n\n/**\n * Streaming HTTP source — emits each chunk from the response body as a\n * `Uint8Array` `DATA`. `COMPLETE` when the stream ends; `ERROR` on non-ok\n * response or fetch failure.\n *\n * Useful for ingesting server-push APIs (LLM streaming, SSE endpoints — pair\n * with {@link fromSSE}, NDJSON endpoints — pair with {@link fromNDJSON}).\n *\n * @category extra\n */\nexport function fromHTTPStream(url: string, opts?: FromHTTPStreamOptions): Node<Uint8Array> {\n\tconst { method = \"GET\", headers, body: bodyOpt, signal: externalSignal, ...rest } = opts ?? {};\n\treturn node<Uint8Array>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\t\t\tconst abort = new AbortController();\n\t\t\tif (externalSignal?.aborted) {\n\t\t\t\ta.down([[ERROR, externalSignal.reason ?? new Error(\"Aborted\")]]);\n\t\t\t\treturn () => {};\n\t\t\t}\n\t\t\texternalSignal?.addEventListener(\"abort\", () => abort.abort(externalSignal.reason), {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t\tconst body =\n\t\t\t\tbodyOpt !== undefined\n\t\t\t\t\t? typeof bodyOpt === \"string\"\n\t\t\t\t\t\t? bodyOpt\n\t\t\t\t\t\t: JSON.stringify(bodyOpt)\n\t\t\t\t\t: undefined;\n\n\t\t\tconst run = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await fetch(url, { method, headers, body, signal: abort.signal });\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tif (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n\t\t\t\t\tif (!res.body) throw new Error(\"HTTP response has no body\");\n\t\t\t\t\tconst reader = res.body.getReader();\n\t\t\t\t\twhile (active) {\n\t\t\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\t\t\tif (done) break;\n\t\t\t\t\t\tif (value) a.emit(value);\n\t\t\t\t\t}\n\t\t\t\t\tif (active) a.down([[COMPLETE]]);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tif (err && (err as Error).name === \"AbortError\") return;\n\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t};\n\t\t\tvoid run();\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tabort.abort();\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/** Options for {@link fromHTTPPoll}. */\nexport type FromHTTPPollOptions = FromHTTPOptions & {\n\t/** Poll interval in milliseconds. Default: `5000`. */\n\tintervalMs?: number;\n};\n\n/**\n * Repeatedly-fetching HTTP source — a reactive composition of\n * {@link fromTimer} + {@link switchMap} + {@link fromHTTP} that fetches on an\n * interval and emits the latest response. Previous in-flight fetches are\n * cancelled when a new tick arrives (switch semantics).\n *\n * @example\n * ```ts\n * import { fromHTTPPoll } from \"@graphrefly/graphrefly-ts\";\n * const health$ = fromHTTPPoll<{ ok: boolean }>(\"https://example.com/health\", { intervalMs: 10_000 });\n * ```\n *\n * @category extra\n */\nexport function fromHTTPPoll<T = unknown>(url: string, opts?: FromHTTPPollOptions): Node<T> {\n\tconst { intervalMs = 5000, ...httpOpts } = opts ?? {};\n\treturn switchMap(\n\t\tfromTimer(intervalMs, { period: intervalMs }),\n\t\t() => fromHTTP<T>(url, { ...httpOpts, completeAfterFetch: true }).node,\n\t);\n}\n","/**\n * {@link reactiveSink} — canonical sink factory for Wave 5 adapters.\n *\n * Every `to*` adapter in {@link ./adapters.ts} can be expressed as a thin\n * config wrapper around this one factory. It centralizes:\n *\n * - **Transport boundary** — the sole place in the sink layer where a raw\n * Promise / `.then` / `.catch` sits (§5.10 boundary documented here).\n * - **Retry** — delegates to {@link BackoffStrategy} from `backoff.ts`.\n * - **Buffering** — `batchSize` / `flushIntervalMs` with tier-3 flush-on-\n * terminal per spec §5.11. Buffered mode activates when `sendBatch` is\n * supplied or a batching knob is set.\n * - **Backpressure** — bounded internal queue with `drop-oldest` /\n * `drop-newest` / `error` strategies. The `\"wait\"` strategy is deferred\n * to external composition (`source | valve(...) | reactiveSink(...)`).\n * - **Companions** — `sent` / `failed` / `inFlight` / `errors` (+ `buffered`\n * / `paused` when buffering or backpressure is active). These surface\n * every transport outcome as reactive nodes so downstream operators can\n * build retry fallbacks, dead-letter queues, or SLO gauges without\n * touching callback soup.\n */\n\nimport {\n\tCOMPLETE,\n\tDATA,\n\tdefaultConfig,\n\tERROR,\n\ttype Message,\n\ttype Node,\n\tnode,\n\tRingBuffer,\n\tTEARDOWN,\n} from \"@graphrefly/pure-ts/core\";\nimport {\n\ttype BackoffPreset,\n\ttype BackoffStrategy,\n\tNS_PER_MS,\n\tresolveBackoffPreset,\n} from \"../resilience/backoff.js\";\n\n/**\n * Dual-mode buffer for the sink's backpressure queue.\n * - Bounded (finite `maxBuf`): wraps {@link RingBuffer} so drop-oldest is O(1)\n * instead of O(n) via `Array.prototype.shift`.\n * - Unbounded (`Infinity`): plain array — no drops, no need for ring semantics.\n * `drain()` always returns the current contents and resets to empty.\n */\nclass BackpressureBuffer<T> {\n\tprivate ring: RingBuffer<T> | null;\n\tprivate arr: T[] | null;\n\tconstructor(cap: number) {\n\t\tif (cap === Number.POSITIVE_INFINITY || cap <= 0) {\n\t\t\tthis.arr = [];\n\t\t\tthis.ring = null;\n\t\t} else {\n\t\t\tthis.ring = new RingBuffer<T>(cap);\n\t\t\tthis.arr = null;\n\t\t}\n\t}\n\tget length(): number {\n\t\treturn this.ring != null ? this.ring.size : this.arr!.length;\n\t}\n\tpush(item: T): void {\n\t\tif (this.ring != null) this.ring.push(item);\n\t\telse this.arr!.push(item);\n\t}\n\t/** Drop-oldest — O(1) in bounded mode. Returns undefined when empty. */\n\tshift(): T | undefined {\n\t\tif (this.ring != null) return this.ring.shift();\n\t\treturn this.arr!.shift();\n\t}\n\t/** Full drain — returns contents, resets to empty. */\n\tdrain(): T[] {\n\t\tif (this.ring != null) {\n\t\t\tconst out = this.ring.toArray();\n\t\t\tthis.ring.clear();\n\t\t\treturn out;\n\t\t}\n\t\tconst out = this.arr!;\n\t\tthis.arr = [];\n\t\treturn out;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Structured transport-failure record. Every sink routes both recoverable\n * (pre-retry) and terminal (post-exhaustion) failures through this shape.\n *\n * @category extra\n */\nexport type SinkTransportError = {\n\t/**\n\t * Failure stage. Known values: `\"serialize\"`, `\"send\"`, `\"close\"`,\n\t * `\"routing_key\"`, `\"ack\"`, `\"retry_exhausted\"`. Open to extension for\n\t * protocol-specific stages.\n\t */\n\tstage: string;\n\t/** The error. */\n\terror: Error;\n\t/** Unwrapped DATA value (present for per-record failures). */\n\tvalue: unknown;\n\t/** Full message tuple (present for non-DATA stages like `\"close\"`). */\n\tmessage?: Message;\n\t/** Attempt number when `retry` is active — `1` = initial send. */\n\tattempt?: number;\n};\n\n/**\n * Terminal failure record delivered on the `failed` companion after retries\n * are exhausted (or `shouldRetry` returned `false`).\n *\n * @category extra\n */\nexport type SinkFailure<T> = {\n\tvalue: T;\n\terror: Error;\n\t/** Total attempts made, including the initial send. */\n\tattempts: number;\n};\n\n/**\n * Handle returned by every Wave 5 sink.\n *\n * @category extra\n */\nexport type ReactiveSinkHandle<T> = {\n\t/** Unsubscribe from source, cancel timers, fire `TEARDOWN` on companions. */\n\tdispose(): void;\n\t/** Drain buffer + await in-flight sends (buffered mode only). */\n\tflush?(): Promise<void>;\n\t/** DATA values that successfully reached the transport. */\n\tsent: Node<T>;\n\t/** Values that permanently failed (after any retries). */\n\tfailed: Node<SinkFailure<T> | null>;\n\t/** Number of pending transport operations. */\n\tinFlight: Node<number>;\n\t/** Every transient transport error (pre-retry). Latest-only. */\n\terrors: Node<SinkTransportError | null>;\n\t/** Items currently buffered (buffered mode / backpressure only). */\n\tbuffered?: Node<number>;\n\t/** `true` when a backpressure strategy has dropped / rejected items. */\n\tpaused?: Node<boolean>;\n};\n\n/**\n * Retry configuration for {@link reactiveSink}.\n *\n * @category extra\n */\nexport type ReactiveSinkRetryOptions = {\n\t/** Total attempts including the initial send. Default: `1` (no retry). */\n\tmaxAttempts?: number;\n\t/** Backoff strategy (ns) or preset name. Default: `\"exponential\"` when `maxAttempts > 1`. */\n\tbackoff?: BackoffStrategy | BackoffPreset;\n\t/** Predicate — return `false` to short-circuit retry for a given error. */\n\tshouldRetry?: (err: Error, attempt: number) => boolean;\n};\n\n/**\n * Backpressure configuration for {@link reactiveSink}. When omitted, the\n * sink has no internal buffer cap beyond the natural `batchSize` /\n * `flushIntervalMs` limits.\n *\n * @category extra\n */\nexport type ReactiveSinkBackpressureOptions = {\n\t/** Hard cap on buffered items; further items trigger `strategy`. Default: `Infinity`. */\n\tmaxBuffer?: number;\n\t/** Policy when the buffer is full. Default: `\"drop-oldest\"`. */\n\tstrategy?: \"drop-oldest\" | \"drop-newest\" | \"error\";\n};\n\n/**\n * Base options shared by every sink built on {@link reactiveSink}.\n *\n * @category extra\n */\nexport type ReactiveSinkOptions<T> = {\n\t/** Optional name used for companion node naming. */\n\tname?: string;\n\t/** Invoked synchronously for every transient transport error. */\n\tonTransportError?: (err: SinkTransportError) => void;\n\t/** Retry configuration. */\n\tretry?: ReactiveSinkRetryOptions;\n\t/** Backpressure configuration. */\n\tbackpressure?: ReactiveSinkBackpressureOptions;\n\t/** Batch size before auto-flush (buffered mode). */\n\tbatchSize?: number;\n\t/** Flush interval in ms; `0` = write-through (buffered mode). */\n\tflushIntervalMs?: number;\n\t/** Optional transform applied before `send` / `sendBatch`. */\n\tserialize?: (value: T) => unknown;\n\t/**\n\t * Reactive stop signal — when this node emits any DATA or terminal, the\n\t * sink tears down. Gives callers a reactive alternative to the imperative\n\t * `handle.dispose()` call so teardown can be wired through the graph.\n\t */\n\tstopOn?: Node<unknown>;\n\t/**\n\t * Optional hook invoked for each upstream non-DATA message (COMPLETE /\n\t * ERROR / etc.) observed by the sink. Used by adapters like\n\t * {@link toWebSocket} to close the underlying resource when the source\n\t * terminates, without the caller having to subscribe twice.\n\t */\n\tonUpstreamMessage?: (msg: Message) => void;\n\t/**\n\t * Invoked once during `dispose()` after the sink's own cleanup (unsub,\n\t * final drain, TEARDOWN on companions). Adapters wrap external resources\n\t * (socket listeners, file handles) by passing their cleanup here —\n\t * avoids hand-rolling a wrapper around `handle.dispose`.\n\t */\n\tonDispose?: () => void;\n\t/**\n\t * Ignored — reserved for future parity with `source.pipe(...)` style.\n\t *\n\t * @internal\n\t */\n\t_reserved?: never;\n};\n\n/**\n * Full config accepted by {@link reactiveSink}. One of `send` / `sendBatch`\n * is required.\n *\n * @category extra\n */\nexport type ReactiveSinkConfig<T, Ctx = unknown> = ReactiveSinkOptions<T> & {\n\t/** Per-record transport call. */\n\tsend?: (value: T, ctx: Ctx) => Promise<void> | void;\n\t/** Batched transport call. When supplied, buffering activates automatically. */\n\tsendBatch?: (batch: T[], ctx: Ctx) => Promise<void> | void;\n\t/** Context object threaded into every `send` / `sendBatch` call. */\n\tctx?: Ctx;\n};\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction coerceError(err: unknown): Error {\n\treturn err instanceof Error ? err : new Error(String(err));\n}\n\nfunction resolveBackoff(\n\tbackoff: BackoffStrategy | BackoffPreset | undefined,\n): BackoffStrategy | null {\n\tif (backoff === undefined) return null;\n\tif (typeof backoff === \"string\") return resolveBackoffPreset(backoff);\n\treturn backoff;\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Build a reactive sink with retry / buffering / backpressure / observability\n * companions. Every Wave 5 `to*` adapter is a thin config wrapper around\n * this factory.\n *\n * **Modes:**\n * - `send` only, no batching knobs → **per-record write-through**\n * - `send` + `batchSize` or `flushIntervalMs` → **per-record buffered**\n * (buffer drains via repeated `send` calls — one-by-one in order)\n * - `sendBatch` → **batched** (whole chunks handed to the transport)\n *\n * @category extra\n */\nexport function reactiveSink<T, Ctx = unknown>(\n\tsource: Node<T>,\n\tconfig: ReactiveSinkConfig<T, Ctx>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tname,\n\t\tonTransportError,\n\t\tretry,\n\t\tbackpressure,\n\t\tbatchSize = Number.POSITIVE_INFINITY,\n\t\tflushIntervalMs = 0,\n\t\tserialize,\n\t\tstopOn,\n\t\tonUpstreamMessage,\n\t\tonDispose,\n\t\tsend,\n\t\tsendBatch,\n\t\tctx: ctxValue,\n\t} = config;\n\n\tif (!send && !sendBatch) {\n\t\tthrow new Error(\"reactiveSink: `send` or `sendBatch` must be provided\");\n\t}\n\n\tconst ctx = ctxValue as Ctx;\n\tconst maxAttempts = Math.max(1, retry?.maxAttempts ?? 1);\n\tconst backoffStrategy = resolveBackoff(\n\t\tretry?.backoff ?? (maxAttempts > 1 ? \"exponential\" : undefined),\n\t);\n\tconst shouldRetry = retry?.shouldRetry ?? (() => true);\n\n\tconst useBuffering =\n\t\tsendBatch !== undefined || batchSize < Number.POSITIVE_INFINITY || flushIntervalMs > 0;\n\n\tconst nameFor = (suffix: string) => (name ? `${name}::${suffix}` : undefined);\n\n\tconst sent = node<T | undefined>([], {\n\t\tinitial: undefined,\n\t\tequals: () => false,\n\t\tname: nameFor(\"sent\"),\n\t}) as unknown as Node<T>;\n\tconst failed = node<SinkFailure<T> | null>([], { initial: null, name: nameFor(\"failed\") });\n\tconst inFlightCountNode = node([], { initial: 0, name: nameFor(\"inFlight\") });\n\tconst errorsNode = node<SinkTransportError | null>([], {\n\t\tinitial: null,\n\t\tname: nameFor(\"errors\"),\n\t});\n\tconst bufferedNode = useBuffering\n\t\t? node([], { initial: 0, name: nameFor(\"buffered\") })\n\t\t: undefined;\n\tconst pausedNode = backpressure\n\t\t? node([], { initial: false, name: nameFor(\"paused\") })\n\t\t: undefined;\n\n\tlet inFlightCount = 0;\n\tconst bumpInFlight = (delta: number) => {\n\t\tinFlightCount += delta;\n\t\tinFlightCountNode.down([[DATA, inFlightCount]]);\n\t};\n\n\tconst reportError = (err: SinkTransportError) => {\n\t\ttry {\n\t\t\tonTransportError?.(err);\n\t\t} catch {\n\t\t\t/* user hook must not escape */\n\t\t}\n\t\ttry {\n\t\t\terrorsNode.down([[DATA, err]]);\n\t\t} catch {\n\t\t\t/* re-entrant drain — swallow */\n\t\t}\n\t};\n\n\tconst inFlightPromises = new Set<Promise<void>>();\n\n\tconst trackPromise = (p: Promise<void>) => {\n\t\tinFlightPromises.add(p);\n\t\tconst done = () => inFlightPromises.delete(p);\n\t\tp.then(done, done);\n\t};\n\n\t// Retry scheduling shared by per-record + batched paths.\n\tconst scheduleRetry = (runAgain: () => Promise<void>, attempt: number, error: Error) => {\n\t\tconst raw = backoffStrategy ? backoffStrategy(attempt - 1, error, null) : 0;\n\t\tconst delayNs =\n\t\t\traw === null || raw === undefined ? 0 : typeof raw === \"number\" && raw > 0 ? raw : 0;\n\t\t// Clamp to >=1ms — sub-ms delays via integer division collapse to 0 and\n\t\t// create synchronous retry loops that starve the event loop.\n\t\tconst delayMs = Math.max(1, Math.ceil(delayNs / NS_PER_MS));\n\t\treturn new Promise<void>((resolve) => {\n\t\t\t// §5.10: retry delay at the transport boundary.\n\t\t\tsetTimeout(() => resolve(runAgain()), delayMs);\n\t\t});\n\t};\n\n\tconst isThenable = (v: unknown): v is Promise<void> =>\n\t\tv != null && typeof v === \"object\" && typeof (v as { then?: unknown }).then === \"function\";\n\n\t// -------------------------------------------------------------------\n\t// Per-record send path — handles retry for a single value.\n\t//\n\t// Sync throws in `serialize` → reported synchronously as stage:\"serialize\".\n\t// Sync throws in `send` → reported synchronously as stage:\"send\".\n\t// Async rejections from send → reported as stage:\"send\" on the next tick.\n\t// -------------------------------------------------------------------\n\tconst performSend = (value: T): Promise<void> => {\n\t\tlet payload: unknown;\n\t\ttry {\n\t\t\tpayload = serialize ? serialize(value) : value;\n\t\t} catch (rawErr) {\n\t\t\tconst error = coerceError(rawErr);\n\t\t\treportError({ stage: \"serialize\", error, value });\n\t\t\tfailed.down([[DATA, { value, error, attempts: 0 } satisfies SinkFailure<T>]]);\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tlet attempt = 0;\n\n\t\tconst onError = (rawErr: unknown): Promise<void> | undefined => {\n\t\t\tbumpInFlight(-1);\n\t\t\tconst error = coerceError(rawErr);\n\t\t\treportError({ stage: \"send\", error, value, attempt });\n\t\t\tconst more = attempt < maxAttempts && shouldRetry(error, attempt);\n\t\t\tif (!more) {\n\t\t\t\tfailed.down([[DATA, { value, error, attempts: attempt } satisfies SinkFailure<T>]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn scheduleRetry(run, attempt, error);\n\t\t};\n\n\t\tconst onSuccess = () => {\n\t\t\tbumpInFlight(-1);\n\t\t\tsent.down([[DATA, value]]);\n\t\t};\n\n\t\tfunction run(): Promise<void> {\n\t\t\tattempt += 1;\n\t\t\tbumpInFlight(+1);\n\t\t\tlet result: Promise<void> | void;\n\t\t\ttry {\n\t\t\t\tresult = (send as (v: unknown, c: Ctx) => Promise<void> | void)(payload, ctx);\n\t\t\t} catch (rawErr) {\n\t\t\t\treturn onError(rawErr) ?? Promise.resolve();\n\t\t\t}\n\t\t\tif (isThenable(result)) {\n\t\t\t\treturn result.then(onSuccess, (rawErr) => onError(rawErr));\n\t\t\t}\n\t\t\tonSuccess();\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\treturn run();\n\t};\n\n\t// -------------------------------------------------------------------\n\t// Buffer management (buffered mode).\n\t//\n\t// Buffer entries keep the original value (for failure reporting) alongside\n\t// the post-serialize payload (for the transport call). Serializing at push\n\t// time guarantees sync `stage: \"serialize\"` error reporting — the old\n\t// hand-rolled sinks relied on this ordering.\n\t// -------------------------------------------------------------------\n\ttype BufferEntry = { value: T; payload: unknown };\n\tconst maxBuf = backpressure?.maxBuffer ?? Number.POSITIVE_INFINITY;\n\tconst buffer = new BackpressureBuffer<BufferEntry>(maxBuf);\n\tlet flushTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet disposed = false;\n\n\tconst updateBuffered = () => {\n\t\tbufferedNode?.down([[DATA, buffer.length]]);\n\t};\n\n\tconst markPaused = (paused: boolean) => {\n\t\tif (!pausedNode) return;\n\t\tpausedNode.down([[DATA, paused]]);\n\t};\n\n\tconst bpStrategy = backpressure?.strategy ?? \"drop-oldest\";\n\n\tconst pushWithBackpressure = (value: T, payload: unknown): boolean => {\n\t\tconst entry: BufferEntry = { value, payload };\n\t\tif (buffer.length < maxBuf) {\n\t\t\tbuffer.push(entry);\n\t\t\tupdateBuffered();\n\t\t\treturn true;\n\t\t}\n\t\t// At cap — apply strategy.\n\t\tif (bpStrategy === \"drop-oldest\") {\n\t\t\tconst dropped = buffer.shift() as BufferEntry;\n\t\t\tbuffer.push(entry);\n\t\t\tupdateBuffered();\n\t\t\tmarkPaused(true);\n\t\t\tfailed.down([\n\t\t\t\t[\n\t\t\t\t\tDATA,\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: dropped.value,\n\t\t\t\t\t\terror: new Error(\"backpressure: buffer overflow — dropped oldest\"),\n\t\t\t\t\t\tattempts: 0,\n\t\t\t\t\t} satisfies SinkFailure<T>,\n\t\t\t\t],\n\t\t\t]);\n\t\t\treturn true;\n\t\t}\n\t\tif (bpStrategy === \"drop-newest\") {\n\t\t\tmarkPaused(true);\n\t\t\tfailed.down([\n\t\t\t\t[\n\t\t\t\t\tDATA,\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\terror: new Error(\"backpressure: buffer overflow — dropped newest\"),\n\t\t\t\t\t\tattempts: 0,\n\t\t\t\t\t} satisfies SinkFailure<T>,\n\t\t\t\t],\n\t\t\t]);\n\t\t\treturn false;\n\t\t}\n\t\t// \"error\"\n\t\tconst err = new Error(\"backpressure: buffer overflow\");\n\t\treportError({ stage: \"send\", error: err, value });\n\t\tfailed.down([[DATA, { value, error: err, attempts: 0 } satisfies SinkFailure<T>]]);\n\t\tmarkPaused(true);\n\t\treturn false;\n\t};\n\n\t// Buffered flush: chunk is already serialized at push time. Retry the whole\n\t// chunk on sendBatch failure (or per-record send failure).\n\tconst performBufferedBatchFlush = (chunk: BufferEntry[]): Promise<void> => {\n\t\tlet attempt = 0;\n\t\tconst payloads = chunk.map((e) => e.payload);\n\n\t\tconst onError = (rawErr: unknown): Promise<void> | undefined => {\n\t\t\tbumpInFlight(-1);\n\t\t\tconst error = coerceError(rawErr);\n\t\t\treportError({ stage: \"send\", error, value: chunk.map((e) => e.value), attempt });\n\t\t\tconst more = attempt < maxAttempts && shouldRetry(error, attempt);\n\t\t\tif (!more) {\n\t\t\t\tfor (const { value: v } of chunk) {\n\t\t\t\t\tfailed.down([[DATA, { value: v, error, attempts: attempt } satisfies SinkFailure<T>]]);\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn scheduleRetry(run, attempt, error);\n\t\t};\n\n\t\tconst onSuccess = () => {\n\t\t\tbumpInFlight(-1);\n\t\t\tfor (const { value: v } of chunk) sent.down([[DATA, v]]);\n\t\t};\n\n\t\tfunction run(): Promise<void> {\n\t\t\tattempt += 1;\n\t\t\tbumpInFlight(+1);\n\t\t\tlet result: Promise<void> | void;\n\t\t\ttry {\n\t\t\t\tresult = (sendBatch as (b: unknown[], c: Ctx) => Promise<void> | void)(payloads, ctx);\n\t\t\t} catch (rawErr) {\n\t\t\t\treturn onError(rawErr) ?? Promise.resolve();\n\t\t\t}\n\t\t\tif (isThenable(result)) {\n\t\t\t\treturn result.then(onSuccess, (rawErr) => onError(rawErr));\n\t\t\t}\n\t\t\tonSuccess();\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn run();\n\t};\n\n\tconst performBufferedPerRecordFlush = async (chunk: BufferEntry[]): Promise<void> => {\n\t\tfor (const entry of chunk) {\n\t\t\t// Intentionally do NOT check `disposed` here — a dispose() mid-\n\t\t\t// drain must let the already-captured chunk finish; otherwise\n\t\t\t// buffered items would be dropped silently. `teardownRequested`\n\t\t\t// prevents NEW work from starting (no new subscribe batches past\n\t\t\t// this point), which is the right guard.\n\t\t\tawait performPreSerializedSend(entry.value, entry.payload);\n\t\t}\n\t};\n\n\t// Per-record send that skips re-serialization (buffer already serialized).\n\tconst performPreSerializedSend = (value: T, payload: unknown): Promise<void> => {\n\t\tlet attempt = 0;\n\t\tconst onError = (rawErr: unknown): Promise<void> | undefined => {\n\t\t\tbumpInFlight(-1);\n\t\t\tconst error = coerceError(rawErr);\n\t\t\treportError({ stage: \"send\", error, value, attempt });\n\t\t\tconst more = attempt < maxAttempts && shouldRetry(error, attempt);\n\t\t\tif (!more) {\n\t\t\t\tfailed.down([[DATA, { value, error, attempts: attempt } satisfies SinkFailure<T>]]);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn scheduleRetry(run, attempt, error);\n\t\t};\n\t\tconst onSuccess = () => {\n\t\t\tbumpInFlight(-1);\n\t\t\tsent.down([[DATA, value]]);\n\t\t};\n\t\tfunction run(): Promise<void> {\n\t\t\tattempt += 1;\n\t\t\tbumpInFlight(+1);\n\t\t\tlet result: Promise<void> | void;\n\t\t\ttry {\n\t\t\t\tresult = (send as (v: unknown, c: Ctx) => Promise<void> | void)(payload, ctx);\n\t\t\t} catch (rawErr) {\n\t\t\t\treturn onError(rawErr) ?? Promise.resolve();\n\t\t\t}\n\t\t\tif (isThenable(result)) {\n\t\t\t\treturn result.then(onSuccess, (rawErr) => onError(rawErr));\n\t\t\t}\n\t\t\tonSuccess();\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn run();\n\t};\n\n\tconst doFlush = (): Promise<void> => {\n\t\tif (disposed || buffer.length === 0) return Promise.resolve();\n\t\tconst chunk = buffer.drain();\n\t\tupdateBuffered();\n\t\tmarkPaused(false);\n\t\tif (sendBatch !== undefined) {\n\t\t\tconst p = performBufferedBatchFlush(chunk);\n\t\t\ttrackPromise(p);\n\t\t\treturn p;\n\t\t}\n\t\tconst p = performBufferedPerRecordFlush(chunk);\n\t\ttrackPromise(p);\n\t\treturn p;\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushTimer !== undefined || disposed) return;\n\t\tif (flushIntervalMs <= 0) return;\n\t\tflushTimer = setTimeout(() => {\n\t\t\t/* §5.10: flush deadline timer — not reactive scheduling */\n\t\t\tflushTimer = undefined;\n\t\t\tvoid doFlush();\n\t\t}, flushIntervalMs);\n\t};\n\n\t// -------------------------------------------------------------------\n\t// Upstream subscription.\n\t// -------------------------------------------------------------------\n\tconst unsub = source.subscribe((msgs) => {\n\t\tfor (const msg of msgs) {\n\t\t\tconst type = msg[0];\n\t\t\tif (type !== DATA) {\n\t\t\t\ttry {\n\t\t\t\t\tonUpstreamMessage?.(msg);\n\t\t\t\t} catch {\n\t\t\t\t\t/* user hook must not escape */\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (type === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tif (useBuffering) {\n\t\t\t\t\t// Serialize sync at push time so `stage: \"serialize\"` errors\n\t\t\t\t\t// surface on the same tick as the upstream DATA emission.\n\t\t\t\t\tlet payload: unknown;\n\t\t\t\t\tif (serialize) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tpayload = serialize(value);\n\t\t\t\t\t\t} catch (rawErr) {\n\t\t\t\t\t\t\tconst error = coerceError(rawErr);\n\t\t\t\t\t\t\treportError({ stage: \"serialize\", error, value });\n\t\t\t\t\t\t\tfailed.down([[DATA, { value, error, attempts: 0 } satisfies SinkFailure<T>]]);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpayload = value;\n\t\t\t\t\t}\n\t\t\t\t\tconst admitted = pushWithBackpressure(value, payload);\n\t\t\t\t\tif (!admitted) continue;\n\t\t\t\t\tif (buffer.length >= batchSize) void doFlush();\n\t\t\t\t\telse scheduleFlush();\n\t\t\t\t} else {\n\t\t\t\t\tconst p = performSend(value);\n\t\t\t\t\ttrackPromise(p);\n\t\t\t\t}\n\t\t\t} else if (defaultConfig.messageTier(type) >= 3) {\n\t\t\t\t// Spec §5.11 — flush on tier-3+ terminal / teardown. INVALIDATE\n\t\t\t\t// (tier 4) hits an empty buffer and is a no-op.\n\t\t\t\tif (useBuffering) {\n\t\t\t\t\tif (flushTimer !== undefined) {\n\t\t\t\t\t\tclearTimeout(flushTimer);\n\t\t\t\t\t\tflushTimer = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tvoid doFlush();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// -------------------------------------------------------------------\n\t// Reactive stop signal — a *fresh* emission on `stopOn` tears the sink\n\t// down. The first batch delivered through subscribe contains the cached\n\t// push-on-subscribe DATA (§2.2) and must be skipped; any emission\n\t// arriving in a later batch is a real stop request.\n\t// -------------------------------------------------------------------\n\tlet stopUnsub: (() => void) | undefined;\n\tif (stopOn) {\n\t\tlet firstBatchSeen = false;\n\t\tstopUnsub = stopOn.subscribe((msgs) => {\n\t\t\tif (!firstBatchSeen) {\n\t\t\t\tfirstBatchSeen = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (msgs.length > 0 && !teardownRequested) dispose();\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------\n\t// Dispose.\n\t//\n\t// Two flags:\n\t// - `teardownRequested`: set synchronously when `dispose()` is entered.\n\t// Gates further subscribe / buffer work and short-circuits stopOn\n\t// re-entry.\n\t// - `disposed`: set only after the final drain + unsub + TEARDOWN fan-\n\t// out have landed. In-flight per-record drain loops read this to\n\t// decide \"am I mid-cleanup vs fully-torn-down?\" They only stop on\n\t// `disposed`, so a dispose mid-drain doesn't truncate the current\n\t// buffer — it just prevents further work from being scheduled.\n\t// -------------------------------------------------------------------\n\tlet teardownRequested = false;\n\tconst dispose = () => {\n\t\tif (teardownRequested) return;\n\t\tteardownRequested = true;\n\t\tif (flushTimer !== undefined) {\n\t\t\tclearTimeout(flushTimer);\n\t\t\tflushTimer = undefined;\n\t\t}\n\t\t// Final drain of buffered items. Fire-and-forget — the per-record\n\t\t// drain loop reads `disposed` (still false) to keep draining the\n\t\t// already-captured chunk.\n\t\tif (useBuffering) void doFlush();\n\t\tdisposed = true;\n\t\tstopUnsub?.();\n\t\tunsub();\n\t\t// Fire TEARDOWN on companions so downstream subscribers observe\n\t\t// the sink's lifecycle end.\n\t\tconst tearDown = (n: Node<unknown>) => {\n\t\t\ttry {\n\t\t\t\tn.down([[TEARDOWN]]);\n\t\t\t} catch {\n\t\t\t\t/* drain re-entrance — swallow */\n\t\t\t}\n\t\t};\n\t\ttearDown(errorsNode as Node<unknown>);\n\t\ttearDown(failed as Node<unknown>);\n\t\ttearDown(sent as Node<unknown>);\n\t\ttearDown(inFlightCountNode as Node<unknown>);\n\t\tif (bufferedNode) tearDown(bufferedNode as Node<unknown>);\n\t\tif (pausedNode) tearDown(pausedNode as Node<unknown>);\n\t\t// Run adapter-supplied cleanup AFTER our own teardown completes so\n\t\t// external resources (socket listeners, file handles) tear down with\n\t\t// the sink as an atomic boundary.\n\t\ttry {\n\t\t\tonDispose?.();\n\t\t} catch {\n\t\t\t/* adapter cleanup failure must not escape */\n\t\t}\n\t};\n\n\tconst handle: ReactiveSinkHandle<T> = {\n\t\tdispose,\n\t\tsent,\n\t\tfailed,\n\t\tinFlight: inFlightCountNode,\n\t\terrors: errorsNode,\n\t};\n\tif (useBuffering) {\n\t\thandle.buffered = bufferedNode;\n\t\thandle.flush = async () => {\n\t\t\tif (disposed) return;\n\t\t\tawait doFlush();\n\t\t\tawait Promise.all(inFlightPromises);\n\t\t};\n\t}\n\tif (pausedNode) handle.paused = pausedNode;\n\n\t// Silence \"unused\" warnings for COMPLETE / ERROR — they're handled as\n\t// part of the messageTier(type) >= 3 branch above.\n\tvoid COMPLETE;\n\tvoid ERROR;\n\n\treturn handle;\n}\n","/**\n * Kafka IO — `fromKafka` (KafkaJS-compatible consumer source) and\n * `toKafka` (producer sink). Compatible with Pulsar via KoP (Kafka-on-Pulsar).\n */\n\nimport { ERROR, type Node, node, wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport { type ExtraOpts, sourceOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed Kafka consumer (compatible with kafkajs, confluent-kafka, Pulsar KoP). */\nexport type KafkaConsumerLike = {\n\tsubscribe(opts: { topic: string; fromBeginning?: boolean }): Promise<void>;\n\trun(opts: {\n\t\teachMessage: (payload: {\n\t\t\ttopic: string;\n\t\t\tpartition: number;\n\t\t\tmessage: {\n\t\t\t\tkey: Buffer | null;\n\t\t\t\tvalue: Buffer | null;\n\t\t\t\theaders?: Record<string, Buffer | string | undefined>;\n\t\t\t\toffset: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t\t}) => Promise<void>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Duck-typed Kafka producer. */\nexport type KafkaProducerLike = {\n\tsend(record: {\n\t\ttopic: string;\n\t\tmessages: Array<{\n\t\t\tkey?: string | Buffer | null;\n\t\t\tvalue: string | Buffer | null;\n\t\t\theaders?: Record<string, string | Buffer>;\n\t\t}>;\n\t}): Promise<void>;\n\tdisconnect(): Promise<void>;\n};\n\n/** Structured Kafka message. */\nexport type KafkaMessage<T = unknown> = {\n\ttopic: string;\n\tpartition: number;\n\tkey: string | null;\n\tvalue: T;\n\theaders: Record<string, string>;\n\toffset: string;\n\ttimestamp: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromKafka}. */\nexport type FromKafkaOptions = ExtraOpts & {\n\t/** Start from beginning of topic. Default: `false`. */\n\tfromBeginning?: boolean;\n\t/** Deserialize message value. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (value: Buffer | null) => unknown;\n};\n\n/**\n * Kafka consumer as a reactive source.\n *\n * Wraps a KafkaJS-compatible consumer. Each message becomes a `DATA` emission.\n * Compatible with Pulsar via KoP (Kafka-on-Pulsar).\n *\n * @param consumer - KafkaJS-compatible consumer instance (caller owns connect/disconnect lifecycle).\n * @param topic - Topic to consume from.\n * @param opts - Deserialization and source options.\n * @returns `Node<KafkaMessage<T>>` — one `DATA` per Kafka message.\n *\n * @example\n * ```ts\n * import { Kafka } from \"kafkajs\";\n * import { fromKafka } from \"@graphrefly/graphrefly-ts\";\n *\n * const kafka = new Kafka({ brokers: [\"localhost:9092\"] });\n * const consumer = kafka.consumer({ groupId: \"my-group\" });\n * await consumer.connect();\n *\n * const events$ = fromKafka(consumer, \"events\", { deserialize: (buf) => JSON.parse(buf!.toString()) });\n * ```\n *\n * @category extra\n */\nexport function fromKafka<T = unknown>(\n\tconsumer: KafkaConsumerLike,\n\ttopic: string,\n\topts?: FromKafkaOptions,\n): Node<KafkaMessage<T>> {\n\tconst {\n\t\tfromBeginning = false,\n\t\tdeserialize = (buf: Buffer | null) => {\n\t\t\tif (buf === null) return null;\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn node<KafkaMessage<T>>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\n\t\t\tconst start = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait consumer.subscribe({ topic, fromBeginning });\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ topic: t, partition, message: msg }) => {\n\t\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\t\tconst headers: Record<string, string> = {};\n\t\t\t\t\t\t\tif (msg.headers) {\n\t\t\t\t\t\t\t\tfor (const [k, v] of Object.entries(msg.headers)) {\n\t\t\t\t\t\t\t\t\tif (v !== undefined) headers[k] = typeof v === \"string\" ? v : v.toString();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\t\ttopic: t,\n\t\t\t\t\t\t\t\tpartition,\n\t\t\t\t\t\t\t\tkey: msg.key?.toString() ?? null,\n\t\t\t\t\t\t\t\tvalue: deserialize(msg.value) as T,\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t\toffset: msg.offset,\n\t\t\t\t\t\t\t\ttimestamp: msg.timestamp,\n\t\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvoid start();\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/** Options for {@link toKafka}. */\nexport type ToKafkaOptions<T> = ExtraOpts & {\n\t/** Serialize value for Kafka. Default: `JSON.stringify`. */\n\tserialize?: (value: T) => string | Buffer;\n\t/** Extract message key from value. Default: `null` (no key). */\n\tkeyExtractor?: (value: T) => string | null;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Kafka producer sink — forwards upstream `DATA` to a Kafka topic.\n *\n * @param source - Upstream node to forward.\n * @param kafkaProducer - KafkaJS-compatible producer instance.\n * @param topic - Target topic.\n * @param opts - Serialization and key extraction options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toKafka<T>(\n\tsource: Node<T>,\n\tkafkaProducer: KafkaProducerLike,\n\ttopic: string,\n\topts?: ToKafkaOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst { serialize = (v: T) => JSON.stringify(v), keyExtractor, onTransportError } = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tsend: async (value) => {\n\t\t\tconst key = keyExtractor?.(value) ?? null;\n\t\t\tconst serialized = serialize(value);\n\t\t\tawait kafkaProducer.send({\n\t\t\t\ttopic,\n\t\t\t\tmessages: [{ key, value: Buffer.from(serialized as string) }],\n\t\t\t});\n\t\t},\n\t});\n}\n","/**\n * Kysely adapter (5.2b) — `fromKysely` runs `query.execute()` and emits one\n * `DATA` containing the full mapped row array, then `COMPLETE`.\n */\n\nimport { COMPLETE, ERROR, type Node, type NodeOptions, node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/**\n * Duck-typed Kysely query builder result.\n *\n * Kysely query builders expose `.execute()` which returns `Promise<T[]>`.\n * This interface captures that contract without depending on `kysely`.\n */\nexport type KyselyQueryLike<T = unknown> = {\n\texecute(): Promise<T[]>;\n};\n\n/** Options for {@link fromKysely}. */\nexport type FromKyselyOptions<T, U = T> = ExtraOpts & {\n\t/** Map each row to the desired shape. Default: identity cast. */\n\tmapRow?: (row: T) => U;\n};\n\n/**\n * One-shot Kysely query as a reactive source.\n *\n * Calls `query.execute()`, emits one `DATA` per result row, then `COMPLETE`.\n * Compose with `switchMap` + `fromTimer` for periodic re-query.\n *\n * @param query - Kysely query builder (e.g. `db.selectFrom(\"users\").selectAll()`).\n * @param opts - Row mapper and node options.\n * @returns `Node<U>` — one `DATA` per row, then `COMPLETE`.\n *\n * @example\n * ```ts\n * import { Kysely, PostgresDialect } from \"kysely\";\n * import { fromKysely } from \"@graphrefly/graphrefly-ts\";\n *\n * const db = new Kysely<DB>({ dialect: new PostgresDialect({ pool }) });\n * const rows$ = fromKysely(db.selectFrom(\"users\").selectAll().where(\"active\", \"=\", true));\n * ```\n *\n * @category extra\n */\nexport function fromKysely<T = unknown, U = T>(\n\tquery: KyselyQueryLike<T>,\n\topts?: FromKyselyOptions<T, U>,\n): Node<U[]> {\n\tconst { mapRow = (r: T) => r as unknown as U, ...rest } = opts ?? {};\n\n\treturn node<U[]>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\n\t\t\tvoid query\n\t\t\t\t.execute()\n\t\t\t\t.then((rows) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.emit(rows.map(mapRow));\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ttry {\n\t\t\t\t\t\ta.down([[ERROR, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* node already torn down — swallow */\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t},\n\t\t{ ...rest, describeKind: \"producer\", completeWhenDepsComplete: false } as NodeOptions<U[]>,\n\t);\n}\n","/**\n * MCP (Model Context Protocol) IO — `fromMCP` wraps an MCP client's\n * notification surface as a reactive source via `externalProducer`.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport { externalProducer } from \"../composition/external-register.js\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/**\n * Duck-typed MCP (Model Context Protocol) client — only the notification\n * registration surface is required so callers are not coupled to a specific SDK.\n */\nexport type MCPClientLike = {\n\tsetNotificationHandler(method: string, handler: (notification: unknown) => void): void;\n};\n\n/** Options for {@link fromMCP}. */\nexport type FromMCPOptions = ExtraOpts & {\n\t/** MCP notification method to subscribe to. Default `\"notifications/message\"`. */\n\tmethod?: string;\n\tonDisconnect?: (cb: (err?: unknown) => void) => void;\n};\n\n/**\n * Wraps an MCP client's server-push notifications as a reactive source.\n *\n * @category extra\n */\nexport function fromMCP<T = unknown>(client: MCPClientLike, opts?: FromMCPOptions): Node<T> {\n\tconst { method = \"notifications/message\", onDisconnect, ...rest } = opts ?? {};\n\treturn externalProducer<T>(({ emit, error }) => {\n\t\tclient.setNotificationHandler(method, (notification) => emit(notification as T));\n\t\tonDisconnect?.((err?: unknown) => error(err ?? new Error(\"MCP client disconnected\")));\n\t\t// MCP SDKs do not expose handler deregistration — replace with a no-op\n\t\t// on teardown. Caller owns the client lifecycle for full cleanup.\n\t\treturn () => client.setNotificationHandler(method, () => {});\n\t}, rest);\n}\n","/**\n * NATS IO — `fromNATS` (subject-subscription consumer source) and `toNATS`\n * (publish sink). Compatible with `nats.js`-style clients.\n */\n\nimport { COMPLETE, ERROR, type Node, node, wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport { type ExtraOpts, sourceOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed NATS subscription (compatible with nats.js). */\nexport type NATSSubscriptionLike = AsyncIterable<{\n\tsubject: string;\n\tdata: Uint8Array;\n\theaders?: { get(key: string): string; keys(): string[] };\n\treply?: string;\n\tsid: number;\n}>;\n\n/** Duck-typed NATS client (compatible with nats.js). */\nexport type NATSClientLike = {\n\tsubscribe(subject: string, opts?: { queue?: string }): NATSSubscriptionLike;\n\tpublish(subject: string, data?: Uint8Array, opts?: { headers?: unknown; reply?: string }): void;\n\tdrain(): Promise<void>;\n};\n\n/** Structured NATS message. */\nexport type NATSMessage<T = unknown> = {\n\tsubject: string;\n\tdata: T;\n\theaders: Record<string, string>;\n\treply: string | undefined;\n\tsid: number;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromNATS}. */\nexport type FromNATSOptions = ExtraOpts & {\n\t/** Queue group name for load balancing. */\n\tqueue?: string;\n\t/** Deserialize message data. Default: `JSON.parse(textDecoder.decode(data))`. */\n\tdeserialize?: (data: Uint8Array) => unknown;\n};\n\n/**\n * NATS consumer as a reactive source.\n *\n * Wraps a `nats.js`-compatible client subscription. Each message becomes a `DATA` emission.\n *\n * @param client - NATS client instance (caller owns connect/drain lifecycle).\n * @param subject - Subject to subscribe to (supports wildcards).\n * @param opts - Queue group, deserialization, and source options.\n * @returns `Node<NATSMessage<T>>` — one `DATA` per NATS message.\n *\n * @remarks\n * Teardown sets an internal flag but cannot break the async iterator. The loop\n * exits on the next message or when the subscription is drained/unsubscribed\n * externally. Call `client.drain()` after unsubscribing for prompt cleanup.\n *\n * @example\n * ```ts\n * import { connect } from \"nats\";\n * import { fromNATS } from \"@graphrefly/graphrefly-ts\";\n *\n * const nc = await connect({ servers: \"localhost:4222\" });\n * const events$ = fromNATS(nc, \"events.>\");\n * ```\n *\n * @category extra\n */\nexport function fromNATS<T = unknown>(\n\tclient: NATSClientLike,\n\tsubject: string,\n\topts?: FromNATSOptions,\n): Node<NATSMessage<T>> {\n\tconst decoder = new TextDecoder();\n\tconst {\n\t\tqueue,\n\t\tdeserialize = (data: Uint8Array) => {\n\t\t\tconst text = decoder.decode(data);\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t} catch {\n\t\t\t\treturn text;\n\t\t\t}\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn node<NATSMessage<T>>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\t\t\tconst sub = client.subscribe(subject, queue ? { queue } : undefined);\n\n\t\t\tconst loop = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tfor await (const msg of sub) {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tconst headers: Record<string, string> = {};\n\t\t\t\t\t\tif (msg.headers) {\n\t\t\t\t\t\t\tfor (const k of msg.headers.keys()) {\n\t\t\t\t\t\t\t\theaders[k] = msg.headers.get(k);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\tsubject: msg.subject,\n\t\t\t\t\t\t\tdata: deserialize(msg.data) as T,\n\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\treply: msg.reply,\n\t\t\t\t\t\t\tsid: msg.sid,\n\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t// Subscription closed (drain or unsubscribe) — complete.\n\t\t\t\t\tif (active) a.down([[COMPLETE]]);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvoid loop();\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/** Options for {@link toNATS}. */\nexport type ToNATSOptions<T> = ExtraOpts & {\n\t/** Serialize value for NATS. Default: `JSON.stringify` → Uint8Array. */\n\tserialize?: (value: T) => Uint8Array;\n\t/** Called on serialization failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * NATS publisher sink — forwards upstream `DATA` to a NATS subject.\n *\n * @param source - Upstream node to forward.\n * @param client - NATS client instance.\n * @param subject - Target subject.\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toNATS<T>(\n\tsource: Node<T>,\n\tclient: NATSClientLike,\n\tsubject: string,\n\topts?: ToNATSOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst encoder = new TextEncoder();\n\tconst { serialize = (v: T) => encoder.encode(JSON.stringify(v)), onTransportError } = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tsend: (value) => {\n\t\t\t// NATS publish is synchronous; wrap in a resolved Promise for the\n\t\t\t// reactiveSink transport boundary.\n\t\t\tclient.publish(subject, serialize(value));\n\t\t},\n\t});\n}\n","/**\n * NDJSON (newline-delimited JSON) IO — `fromNDJSON` reads an\n * `AsyncIterable<string>` of NDJSON chunks (one node per line) and\n * `ndjsonRows` is the stateful operator variant for existing reactive\n * `Node<string>` upstreams.\n */\n\nimport { COMPLETE, ERROR, type Node, type NodeOptions, node } from \"@graphrefly/pure-ts/core\";\nimport { type ExtraOpts, sourceOpts } from \"./_internal.js\";\n\n/**\n * Stateful NDJSON parser operator — takes a `Node<string>` of raw text chunks\n * and emits one `DATA` per parsed JSON object. Buffers partial lines across\n * chunks.\n *\n * @category extra\n */\nexport function ndjsonRows<T = unknown>(source: Node<string>, opts?: ExtraOpts): Node<T> {\n\t// Lock 6.D (Phase 13.6.B): clear parser buffer on deactivation so a\n\t// resubscribed operator doesn't bleed a half-line from a prior run.\n\tlet cleanup: { onDeactivation: () => void } | undefined;\n\treturn node<T>(\n\t\t[source as Node],\n\t\t(data, a, ctx) => {\n\t\t\tif (cleanup === undefined) {\n\t\t\t\tconst store = ctx.store;\n\t\t\t\tcleanup = {\n\t\t\t\t\tonDeactivation: () => {\n\t\t\t\t\t\tdelete store.buffer;\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst batch0 = data[0];\n\t\t\tif (batch0 == null || batch0.length === 0) return cleanup;\n\t\t\tconst s = ctx.store as { buffer: string };\n\t\t\tif (typeof s.buffer !== \"string\") s.buffer = \"\";\n\t\t\tfor (const chunkRaw of batch0) {\n\t\t\t\ts.buffer = s.buffer + (chunkRaw as string);\n\t\t\t\tconst lines: string[] = s.buffer.split(/\\r?\\n/);\n\t\t\t\ts.buffer = lines.pop() ?? \"\";\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tif (!line.trim()) continue;\n\t\t\t\t\ttry {\n\t\t\t\t\t\ta.emit(JSON.parse(line) as T);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\t\treturn cleanup;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cleanup;\n\t\t},\n\t\t{ describeKind: \"derived\", ...(opts ?? {}) } as NodeOptions<T>,\n\t);\n}\n\n/** Options for {@link fromNDJSON}. */\nexport type FromNDJSONOptions = ExtraOpts & {};\n\n/**\n * Newline-delimited JSON stream ingest for batch replay.\n *\n * Reads an async iterable of text chunks, splits by newline, parses each line\n * as JSON, and emits one `DATA` per parsed object. `COMPLETE` after stream ends.\n *\n * @param source - Async iterable of NDJSON text chunks.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — one `DATA` per JSON line.\n *\n * @example\n * ```ts\n * import { createReadStream } from \"node:fs\";\n * import { fromNDJSON } from \"@graphrefly/graphrefly-ts\";\n *\n * const logs$ = fromNDJSON(createReadStream(\"logs.ndjson\", \"utf-8\"));\n * ```\n *\n * @category extra\n */\nexport function fromNDJSON<T = unknown>(\n\tsource: AsyncIterable<string>,\n\topts?: FromNDJSONOptions,\n): Node<T> {\n\treturn node<T>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet cancelled = false;\n\n\t\t\tconst run = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlet buffer = \"\";\n\n\t\t\t\t\tfor await (const chunk of source) {\n\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\tbuffer += chunk;\n\n\t\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\n\t\t\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\t\t\tconst trimmed = line.trim();\n\t\t\t\t\t\t\tif (!trimmed) continue;\n\t\t\t\t\t\t\ta.emit(JSON.parse(trimmed) as T);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Process remaining buffer.\n\t\t\t\t\tif (!cancelled && buffer.trim()) {\n\t\t\t\t\t\ta.emit(JSON.parse(buffer.trim()) as T);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!cancelled) a.down([[COMPLETE]]);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (!cancelled) a.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvoid run();\n\n\t\t\treturn () => {\n\t\t\t\tcancelled = true;\n\t\t\t};\n\t\t},\n\t\tsourceOpts(opts),\n\t);\n}\n","/**\n * OpenTelemetry (OTLP/HTTP) IO — `fromOTel` exposes traces/metrics/logs as\n * three reactive nodes via `externalBundle`. The caller owns the HTTP server\n * and wires the registrar callback to OTLP routes.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport { batch } from \"@graphrefly/pure-ts/core\";\nimport { type BundleTriad, externalBundle } from \"../composition/external-register.js\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/** Structured OTel span. */\nexport type OTelSpan = {\n\ttraceId: string;\n\tspanId: string;\n\toperationName: string;\n\tserviceName: string;\n\tstartTimeNs: number;\n\tendTimeNs: number;\n\tstatus: \"OK\" | \"ERROR\" | \"UNSET\";\n\tattributes: Record<string, unknown>;\n\tevents: Array<{ name: string; timestampNs: number; attributes?: Record<string, unknown> }>;\n};\n\n/** Structured OTel metric data point. */\nexport type OTelMetric = {\n\tname: string;\n\tdescription?: string;\n\tunit?: string;\n\ttype: \"gauge\" | \"sum\" | \"histogram\" | \"summary\";\n\tvalue: number;\n\tattributes: Record<string, unknown>;\n\ttimestampNs: number;\n};\n\n/** Structured OTel log record. */\nexport type OTelLog = {\n\ttimestampNs: number;\n\tseverityNumber?: number;\n\tseverityText?: string;\n\tbody: unknown;\n\tattributes: Record<string, unknown>;\n\ttraceId?: string;\n\tspanId?: string;\n};\n\n/** Registration callback for the OTLP/HTTP receiver. */\nexport type OTelRegister = (handlers: {\n\tonTraces: (spans: OTelSpan[]) => void;\n\tonMetrics: (metrics: OTelMetric[]) => void;\n\tonLogs: (logs: OTelLog[]) => void;\n\tonError: (err: unknown) => void;\n}) => (() => void) | undefined;\n\n/** Options for {@link fromOTel}. */\nexport type FromOTelOptions = ExtraOpts & {};\n\n/** Bundle returned by {@link fromOTel}. */\nexport type OTelBundle = {\n\ttraces: Node<OTelSpan>;\n\tmetrics: Node<OTelMetric>;\n\tlogs: Node<OTelLog>;\n\t/** Unconditional teardown — calls the registrar's cleanup and fires COMPLETE on every channel. */\n\tdispose(): void;\n};\n\n/**\n * OTLP/HTTP receiver — accepts traces, metrics, and logs as separate reactive nodes.\n *\n * The caller owns the HTTP server. `fromOTel` receives a `register` callback that\n * wires OTLP POST endpoints to the three signal handlers. Each signal type gets\n * its own `Node` so downstream can subscribe selectively.\n *\n * @param register - Wires OTLP HTTP routes to `onTraces`, `onMetrics`, `onLogs` handlers.\n * @param opts - Optional producer options.\n * @returns {@link OTelBundle} — `{ traces, metrics, logs }` nodes.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromOTel } from \"@graphrefly/graphrefly-ts\";\n *\n * const app = express();\n * app.use(express.json());\n *\n * const otel = fromOTel(({ onTraces, onMetrics, onLogs }) => {\n * app.post(\"/v1/traces\", (req, res) => { onTraces(req.body.resourceSpans ?? []); res.sendStatus(200); });\n * app.post(\"/v1/metrics\", (req, res) => { onMetrics(req.body.resourceMetrics ?? []); res.sendStatus(200); });\n * app.post(\"/v1/logs\", (req, res) => { onLogs(req.body.resourceLogs ?? []); res.sendStatus(200); });\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromOTel(register: OTelRegister, opts?: FromOTelOptions): OTelBundle {\n\ttype OTelChannels = { traces: OTelSpan; metrics: OTelMetric; logs: OTelLog };\n\tconst nodes = externalBundle<OTelChannels>(\n\t\t({ traces, metrics, logs, error }: BundleTriad<OTelChannels>) => {\n\t\t\treturn (\n\t\t\t\tregister({\n\t\t\t\t\tonTraces: (spans) => {\n\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\tfor (const s of spans) traces(s);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tonMetrics: (ms) => {\n\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\tfor (const m of ms) metrics(m);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tonLogs: (ls) => {\n\t\t\t\t\t\tbatch(() => {\n\t\t\t\t\t\t\tfor (const l of ls) logs(l);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tonError: error,\n\t\t\t\t}) ?? undefined\n\t\t\t);\n\t\t},\n\t\t[\"traces\", \"metrics\", \"logs\"],\n\t\topts?.name ? { name: opts.name } : undefined,\n\t);\n\treturn nodes;\n}\n","/**\n * Prisma adapter (5.2b) — `fromPrisma` runs `model.findMany(args)` and emits\n * one `DATA` containing the full mapped row array, then `COMPLETE`.\n */\n\nimport { COMPLETE, ERROR, type Node, type NodeOptions, node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/**\n * Duck-typed Prisma model delegate.\n *\n * Compatible with any Prisma model's `findMany` method (e.g. `prisma.user`).\n * The consumer passes the model delegate directly — no dependency on `@prisma/client`.\n */\nexport type PrismaModelLike<T = unknown> = {\n\tfindMany(args?: unknown): Promise<T[]>;\n};\n\n/** Options for {@link fromPrisma}. */\nexport type FromPrismaOptions<T, U = T> = ExtraOpts & {\n\t/** Prisma `findMany` args (where, orderBy, select, include, take, skip, etc.). */\n\targs?: unknown;\n\t/** Map each row to the desired shape. Default: identity cast. */\n\tmapRow?: (row: T) => U;\n};\n\n/**\n * One-shot Prisma query as a reactive source.\n *\n * Calls `model.findMany(args)`, emits one `DATA` per result row, then `COMPLETE`.\n * Compose with `switchMap` + `fromTimer` for periodic re-query.\n *\n * @param model - Prisma model delegate (e.g. `prisma.user`).\n * @param opts - `findMany` args, row mapper, and node options.\n * @returns `Node<U>` — one `DATA` per row, then `COMPLETE`.\n *\n * @example\n * ```ts\n * import { PrismaClient } from \"@prisma/client\";\n * import { fromPrisma } from \"@graphrefly/graphrefly-ts\";\n *\n * const prisma = new PrismaClient();\n * const activeUsers = fromPrisma(prisma.user, {\n * args: { where: { active: true } },\n * });\n * ```\n *\n * @category extra\n */\nexport function fromPrisma<T = unknown, U = T>(\n\tmodel: PrismaModelLike<T>,\n\topts?: FromPrismaOptions<T, U>,\n): Node<U[]> {\n\tconst { args, mapRow = (r: T) => r as unknown as U, ...rest } = opts ?? {};\n\n\treturn node<U[]>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\n\t\t\tvoid model\n\t\t\t\t.findMany(args)\n\t\t\t\t.then((rows) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ta.emit(rows.map(mapRow));\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\ttry {\n\t\t\t\t\t\ta.down([[ERROR, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* node already torn down — swallow */\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t},\n\t\t{ ...rest, describeKind: \"producer\", completeWhenDepsComplete: false } as NodeOptions<U[]>,\n\t);\n}\n","/**\n * Prometheus scrape IO — `fromPrometheus` polls a `/metrics` endpoint via\n * `fromTimer + switchMap` (reactive timer, not bare `setInterval`) and emits\n * one `DATA` per parsed metric per scrape. `parsePrometheusText` exposes the\n * exposition-format parser as a pure helper.\n */\n\nimport { COMPLETE, ERROR, type Node, node, wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport type { AsyncSourceOpts } from \"@graphrefly/pure-ts/extra\";\nimport { fromTimer, switchMap } from \"@graphrefly/pure-ts/extra\";\nimport { NS_PER_MS, NS_PER_SEC } from \"../resilience/backoff.js\";\n\n/** Parsed Prometheus metric. */\nexport type PrometheusMetric = {\n\tname: string;\n\tlabels: Record<string, string>;\n\tvalue: number;\n\ttimestampMs?: number;\n\ttype?: \"counter\" | \"gauge\" | \"histogram\" | \"summary\" | \"untyped\";\n\thelp?: string;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromPrometheus}. */\nexport type FromPrometheusOptions = AsyncSourceOpts & {\n\t/** Scrape interval in nanoseconds. Default `15 * NS_PER_SEC` (15s). */\n\tintervalNs?: number;\n\t/** Request headers for the scrape. */\n\theaders?: Record<string, string>;\n\t/** Request timeout in nanoseconds. Default `10 * NS_PER_SEC` (10s). */\n\ttimeoutNs?: number;\n\t/**\n\t * Maximum consecutive scrape errors before terminating the source. Prevents\n\t * error storms when the endpoint is down. Default: `1` (terminate on first error — preserves pre-switchMap back-compat). Raise it (or set `Infinity`)\n\t * to keep retrying indefinitely.\n\t */\n\tmaxConsecutiveErrors?: number;\n};\n\n/**\n * Scrapes a Prometheus `/metrics` endpoint on a reactive timer interval.\n *\n * Each scrape parses the exposition format and emits one `DATA` per metric line.\n * Uses `fromTimer` semantics internally (reactive timer source, not polling).\n *\n * @param endpoint - URL of the Prometheus metrics endpoint.\n * @param opts - Scrape interval, headers, timeout.\n * @returns `Node<PrometheusMetric>` — one `DATA` per metric per scrape.\n *\n * @example\n * ```ts\n * import { fromPrometheus } from \"@graphrefly/graphrefly-ts\";\n *\n * const prom$ = fromPrometheus(\"http://localhost:9090/metrics\", { intervalNs: 30 * NS_PER_SEC });\n * ```\n *\n * @category extra\n */\nexport function fromPrometheus(\n\tendpoint: string,\n\topts?: FromPrometheusOptions,\n): Node<PrometheusMetric> {\n\tconst {\n\t\tintervalNs = 15 * NS_PER_SEC,\n\t\theaders,\n\t\ttimeoutNs = 10 * NS_PER_SEC,\n\t\tsignal: externalSignal,\n\t\tmaxConsecutiveErrors = 1,\n\t} = opts ?? {};\n\tconst intervalMs = Math.ceil(intervalNs / NS_PER_MS);\n\t// Circuit breaker shared across switchMap inners — resets on any successful\n\t// scrape, trips when consecutive errors hit the cap.\n\tlet consecutiveErrors = 0;\n\n\t// Timer drives scrapes: first tick at t=0, then every intervalMs. Each tick\n\t// switches to a fresh inner producer that does one scrape and completes —\n\t// switchMap cancels any in-flight scrape when the next tick arrives.\n\treturn switchMap(fromTimer(0, { period: intervalMs, signal: externalSignal }), () =>\n\t\tnode<PrometheusMetric>([], (_data, a) => {\n\t\t\tlet active = true;\n\t\t\tconst abort = new AbortController();\n\t\t\tconst timeoutId = setTimeout(\n\t\t\t\t() => abort.abort(new Error(\"Scrape timeout\")),\n\t\t\t\tMath.ceil(timeoutNs / NS_PER_MS),\n\t\t\t);\n\t\t\tconst run = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await fetch(endpoint, {\n\t\t\t\t\t\theaders: { Accept: \"text/plain\", ...headers },\n\t\t\t\t\t\tsignal: abort.signal,\n\t\t\t\t\t});\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tif (!res.ok) throw new Error(`Prometheus scrape ${res.status}: ${res.statusText}`);\n\t\t\t\t\tconst text = await res.text();\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tconst metrics = parsePrometheusText(text);\n\t\t\t\t\tfor (const m of metrics) a.emit(m);\n\t\t\t\t\tconsecutiveErrors = 0;\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t\tif (!active) return;\n\t\t\t\t\tif (err instanceof Error && err.name === \"AbortError\") return;\n\t\t\t\t\tconsecutiveErrors += 1;\n\t\t\t\t\tif (consecutiveErrors >= maxConsecutiveErrors) {\n\t\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\t}\n\t\t\t\t\t// else: swallow transient error; next tick retries.\n\t\t\t\t}\n\t\t\t};\n\t\t\tvoid run();\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tabort.abort();\n\t\t\t};\n\t\t}),\n\t);\n}\n\n/**\n * Parses Prometheus exposition format text into structured metrics.\n *\n * @category extra\n */\nexport function parsePrometheusText(text: string): PrometheusMetric[] {\n\tconst results: PrometheusMetric[] = [];\n\tconst types = new Map<string, string>();\n\tconst helps = new Map<string, string>();\n\n\tfor (const rawLine of text.split(\"\\n\")) {\n\t\tconst line = rawLine.trim();\n\t\tif (!line) continue;\n\n\t\tif (line.startsWith(\"# TYPE \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\ttypes.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"# HELP \")) {\n\t\t\tconst rest = line.slice(7);\n\t\t\tconst spaceIdx = rest.indexOf(\" \");\n\t\t\tif (spaceIdx > 0) {\n\t\t\t\thelps.set(rest.slice(0, spaceIdx), rest.slice(spaceIdx + 1).trim());\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"#\")) continue;\n\n\t\t// metric_name{label=\"value\"} 123 timestamp?\n\t\tlet name: string;\n\t\tlet labels: Record<string, string> = {};\n\t\tlet valueStr: string;\n\t\tlet tsStr: string | undefined;\n\n\t\tconst braceIdx = line.indexOf(\"{\");\n\t\tif (braceIdx >= 0) {\n\t\t\tname = line.slice(0, braceIdx);\n\t\t\tconst closeBrace = line.indexOf(\"}\", braceIdx);\n\t\t\tif (closeBrace < 0) continue;\n\t\t\tconst labelStr = line.slice(braceIdx + 1, closeBrace);\n\t\t\tlabels = parsePrometheusLabels(labelStr);\n\t\t\tconst after = line\n\t\t\t\t.slice(closeBrace + 1)\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\s+/);\n\t\t\tvalueStr = after[0] ?? \"\";\n\t\t\ttsStr = after[1];\n\t\t} else {\n\t\t\tconst parts = line.split(/\\s+/);\n\t\t\tname = parts[0] ?? \"\";\n\t\t\tvalueStr = parts[1] ?? \"\";\n\t\t\ttsStr = parts[2];\n\t\t}\n\n\t\tif (!name || !valueStr) continue;\n\n\t\tconst baseName = name.replace(/(_total|_count|_sum|_bucket|_created|_info)$/, \"\");\n\t\tresults.push({\n\t\t\tname,\n\t\t\tlabels,\n\t\t\tvalue: Number(valueStr),\n\t\t\ttimestampMs: tsStr ? Number(tsStr) : undefined,\n\t\t\ttype: (types.get(baseName) ?? types.get(name)) as PrometheusMetric[\"type\"],\n\t\t\thelp: helps.get(baseName) ?? helps.get(name),\n\t\t\ttimestampNs: wallClockNs(),\n\t\t});\n\t}\n\n\treturn results;\n}\n\nfunction parsePrometheusLabels(str: string): Record<string, string> {\n\tconst labels: Record<string, string> = {};\n\tconst re = /(\\w+)=\"((?:[^\"\\\\]|\\\\.)*)\"/g;\n\tlet m: RegExpExecArray | null = re.exec(str);\n\twhile (m !== null) {\n\t\tlabels[m[1]] = m[2].replace(/\\\\(.)/g, \"$1\");\n\t\tm = re.exec(str);\n\t}\n\treturn labels;\n}\n","/**\n * Apache Pulsar IO — `fromPulsar` (native-client consumer source with optional\n * manual ack via {@link AckableMessage} envelopes) and `toPulsar` (producer\n * sink). For Kafka-on-Pulsar (KoP), use the Kafka adapter instead.\n */\n\nimport { ERROR, type Node, node, wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport { type AckableMessage, type ExtraOpts, sourceOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed Pulsar consumer (compatible with pulsar-client). */\nexport type PulsarConsumerLike = {\n\treceive(): Promise<{\n\t\tgetData(): Buffer;\n\t\tgetMessageId(): { toString(): string };\n\t\tgetPartitionKey(): string;\n\t\tgetProperties(): Record<string, string>;\n\t\tgetPublishTimestamp(): number;\n\t\tgetEventTimestamp(): number;\n\t\tgetTopicName(): string;\n\t}>;\n\tacknowledge(msg: unknown): Promise<void>;\n\tclose(): Promise<void>;\n};\n\n/** Duck-typed Pulsar producer. */\nexport type PulsarProducerLike = {\n\tsend(msg: {\n\t\tdata: Buffer;\n\t\tpartitionKey?: string;\n\t\tproperties?: Record<string, string>;\n\t}): Promise<void>;\n\tclose(): Promise<void>;\n};\n\n/** Structured Pulsar message. */\nexport type PulsarMessage<T = unknown> = {\n\ttopic: string;\n\tmessageId: string;\n\tkey: string;\n\tvalue: T;\n\tproperties: Record<string, string>;\n\tpublishTime: number;\n\teventTime: number;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromPulsar}. */\nexport type FromPulsarOptions = ExtraOpts & {\n\t/** Deserialize message data. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (data: Buffer) => unknown;\n\t/** Acknowledge messages automatically. Default: `true`. */\n\tautoAck?: boolean;\n\t/**\n\t * Routes ack/nack transport failures to the caller. Covers:\n\t * - `autoAck: true` — post-emit `acknowledge()` promise rejections.\n\t * - `autoAck: false` — envelope `ack()` / `nack()` promise rejections.\n\t * Default: swallow (SDK handles redelivery on its own).\n\t */\n\tonAckError?: (err: Error) => void;\n};\n\n/**\n * Apache Pulsar consumer as a reactive source (native client).\n *\n * Wraps a `pulsar-client`-compatible consumer. Each message becomes a `DATA` emission.\n * For Kafka-on-Pulsar (KoP), use {@link fromKafka} instead.\n *\n * @param consumer - Pulsar consumer instance (caller owns create/close lifecycle).\n * @param opts - Deserialization and source options.\n * @returns `Node<PulsarMessage<T>>` — one `DATA` per Pulsar message.\n *\n * @remarks\n * Teardown sets an internal flag but cannot interrupt a pending `consumer.receive()`.\n * The loop exits on the next message or when the consumer is closed externally.\n * Callers should call `consumer.close()` after unsubscribing for prompt cleanup.\n *\n * @example\n * ```ts\n * import Pulsar from \"pulsar-client\";\n * import { fromPulsar } from \"@graphrefly/graphrefly-ts\";\n *\n * const client = new Pulsar.Client({ serviceUrl: \"pulsar://localhost:6650\" });\n * const consumer = await client.subscribe({ topic: \"events\", subscription: \"my-sub\" });\n * const events$ = fromPulsar(consumer);\n * ```\n *\n * @category extra\n */\nexport function fromPulsar<T = unknown>(\n\tconsumer: PulsarConsumerLike,\n\topts?: FromPulsarOptions & { autoAck?: true },\n): Node<PulsarMessage<T>>;\nexport function fromPulsar<T = unknown>(\n\tconsumer: PulsarConsumerLike,\n\topts: FromPulsarOptions & { autoAck: false },\n): Node<AckableMessage<PulsarMessage<T>>>;\nexport function fromPulsar<T = unknown>(\n\tconsumer: PulsarConsumerLike,\n\topts?: FromPulsarOptions,\n): Node<PulsarMessage<T> | AckableMessage<PulsarMessage<T>>> {\n\tconst {\n\t\tautoAck = true,\n\t\tdeserialize = (buf: Buffer) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\tonAckError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst reportAckError = (err: unknown) => {\n\t\tif (!onAckError) return;\n\t\ttry {\n\t\t\tonAckError(err instanceof Error ? err : new Error(String(err)));\n\t\t} catch {\n\t\t\t/* user hook must not escape */\n\t\t}\n\t};\n\n\treturn node<PulsarMessage<T> | AckableMessage<PulsarMessage<T>>>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\n\t\t\tconst loop = async () => {\n\t\t\t\twhile (active) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst rawMsg = await consumer.receive();\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tconst structured: PulsarMessage<T> = {\n\t\t\t\t\t\t\ttopic: rawMsg.getTopicName(),\n\t\t\t\t\t\t\tmessageId: rawMsg.getMessageId().toString(),\n\t\t\t\t\t\t\tkey: rawMsg.getPartitionKey(),\n\t\t\t\t\t\t\tvalue: deserialize(rawMsg.getData()) as T,\n\t\t\t\t\t\t\tproperties: rawMsg.getProperties(),\n\t\t\t\t\t\t\tpublishTime: rawMsg.getPublishTimestamp(),\n\t\t\t\t\t\t\teventTime: rawMsg.getEventTimestamp(),\n\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (autoAck) {\n\t\t\t\t\t\t\ta.emit(structured);\n\t\t\t\t\t\t\tvoid consumer.acknowledge(rawMsg).catch(reportAckError);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Manual ack — wrap in AckableMessage. Pulsar's SDK has no\n\t\t\t\t\t\t\t// per-message nack(requeue=false) — a plain `nack` re-delivers\n\t\t\t\t\t\t\t// after the subscription's negativeAckRedeliveryDelay. `requeue`\n\t\t\t\t\t\t\t// is honored as \"always redeliver\" (SDK default).\n\t\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\t\tconst envelope: AckableMessage<PulsarMessage<T>> = {\n\t\t\t\t\t\t\t\tvalue: structured,\n\t\t\t\t\t\t\t\tack() {\n\t\t\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\t\t\tvoid consumer.acknowledge(rawMsg).catch(reportAckError);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnack(_opts) {\n\t\t\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\t\t\tconst anyConsumer = consumer as unknown as {\n\t\t\t\t\t\t\t\t\t\tnegativeAcknowledge?: (m: unknown) => Promise<void> | void;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tconst result = anyConsumer.negativeAcknowledge?.(rawMsg);\n\t\t\t\t\t\t\t\t\t\t// nack may return Promise (some SDKs) — route rejection.\n\t\t\t\t\t\t\t\t\t\tif (result && typeof (result as Promise<void>).then === \"function\") {\n\t\t\t\t\t\t\t\t\t\t\tvoid (result as Promise<void>).catch(reportAckError);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t\t\treportAckError(err);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\ta.emit(envelope);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvoid loop();\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/** Options for {@link toPulsar}. */\nexport type ToPulsarOptions<T> = ExtraOpts & {\n\t/** Serialize value for Pulsar. Default: `JSON.stringify` → Buffer. */\n\tserialize?: (value: T) => Buffer;\n\t/** Extract partition key from value. Default: none. */\n\tkeyExtractor?: (value: T) => string | undefined;\n\t/** Extract properties from value. */\n\tpropertiesExtractor?: (value: T) => Record<string, string> | undefined;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Pulsar producer sink — forwards upstream `DATA` to a Pulsar topic.\n *\n * @param source - Upstream node to forward.\n * @param pulsarProducer - Pulsar producer instance (caller owns lifecycle).\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toPulsar<T>(\n\tsource: Node<T>,\n\tpulsarProducer: PulsarProducerLike,\n\topts?: ToPulsarOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tserialize = (v: T) => Buffer.from(JSON.stringify(v)),\n\t\tkeyExtractor,\n\t\tpropertiesExtractor,\n\t\tonTransportError,\n\t} = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tsend: async (value) => {\n\t\t\tawait pulsarProducer.send({\n\t\t\t\tdata: serialize(value),\n\t\t\t\tpartitionKey: keyExtractor?.(value),\n\t\t\t\tproperties: propertiesExtractor?.(value),\n\t\t\t});\n\t\t},\n\t});\n}\n","/**\n * RabbitMQ IO — `fromRabbitMQ` (queue-consumer source with optional manual\n * ack via {@link AckableMessage} envelopes) and `toRabbitMQ` (publisher\n * sink). Compatible with `amqplib`-style channels.\n */\n\nimport { ERROR, type Node, node, wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport { type AckableMessage, type ExtraOpts, sourceOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed RabbitMQ channel (compatible with amqplib). */\nexport type RabbitMQChannelLike = {\n\tconsume(\n\t\tqueue: string,\n\t\tonMessage: (\n\t\t\tmsg: {\n\t\t\t\tcontent: Buffer;\n\t\t\t\tfields: {\n\t\t\t\t\troutingKey: string;\n\t\t\t\t\texchange: string;\n\t\t\t\t\tdeliveryTag: number;\n\t\t\t\t\tredelivered: boolean;\n\t\t\t\t};\n\t\t\t\tproperties: Record<string, unknown>;\n\t\t\t} | null,\n\t\t) => void,\n\t\topts?: { noAck?: boolean },\n\t): Promise<{ consumerTag: string }>;\n\tcancel(consumerTag: string): Promise<void>;\n\tack(msg: unknown): void;\n\tpublish(\n\t\texchange: string,\n\t\troutingKey: string,\n\t\tcontent: Buffer,\n\t\topts?: Record<string, unknown>,\n\t): boolean;\n\tsendToQueue(queue: string, content: Buffer, opts?: Record<string, unknown>): boolean;\n};\n\n/** Structured RabbitMQ message. */\nexport type RabbitMQMessage<T = unknown> = {\n\tqueue: string;\n\troutingKey: string;\n\texchange: string;\n\tcontent: T;\n\tproperties: Record<string, unknown>;\n\tdeliveryTag: number;\n\tredelivered: boolean;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromRabbitMQ}. */\nexport type FromRabbitMQOptions = ExtraOpts & {\n\t/** Deserialize message content. Default: `JSON.parse(buffer.toString())`. */\n\tdeserialize?: (content: Buffer) => unknown;\n\t/** Auto-acknowledge messages. Default: `true`. */\n\tautoAck?: boolean;\n\t/**\n\t * Routes envelope ack/nack transport failures (including \"SDK exposes no\n\t * `nack` method\") to the caller. Default: swallow.\n\t */\n\tonAckError?: (err: Error) => void;\n};\n\n/**\n * RabbitMQ consumer as a reactive source.\n *\n * Wraps an `amqplib`-compatible channel. Each message becomes a `DATA` emission.\n *\n * @param channel - AMQP channel instance (caller owns connection/channel lifecycle).\n * @param queue - Queue to consume from.\n * @param opts - Deserialization and acknowledgment options.\n * @returns `Node<RabbitMQMessage<T>>` — one `DATA` per RabbitMQ message.\n *\n * @remarks\n * When `autoAck` is `false`, the adapter opens the channel with `noAck: false`\n * (broker requires acks) but does not call `channel.ack()`. The caller must ack\n * messages externally using the `deliveryTag` from the emitted {@link RabbitMQMessage}:\n * ```ts\n * channel.ack({ fields: { deliveryTag: msg.deliveryTag } } as any);\n * ```\n *\n * @example\n * ```ts\n * import amqplib from \"amqplib\";\n * import { fromRabbitMQ } from \"@graphrefly/graphrefly-ts\";\n *\n * const conn = await amqplib.connect(\"amqp://localhost\");\n * const ch = await conn.createChannel();\n * await ch.assertQueue(\"events\");\n * const events$ = fromRabbitMQ(ch, \"events\");\n * ```\n *\n * @category extra\n */\nexport function fromRabbitMQ<T = unknown>(\n\tchannel: RabbitMQChannelLike,\n\tqueue: string,\n\topts?: FromRabbitMQOptions & { autoAck?: true },\n): Node<RabbitMQMessage<T>>;\nexport function fromRabbitMQ<T = unknown>(\n\tchannel: RabbitMQChannelLike,\n\tqueue: string,\n\topts: FromRabbitMQOptions & { autoAck: false },\n): Node<AckableMessage<RabbitMQMessage<T>>>;\nexport function fromRabbitMQ<T = unknown>(\n\tchannel: RabbitMQChannelLike,\n\tqueue: string,\n\topts?: FromRabbitMQOptions,\n): Node<RabbitMQMessage<T> | AckableMessage<RabbitMQMessage<T>>> {\n\tconst {\n\t\tautoAck = true,\n\t\tdeserialize = (buf: Buffer) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buf.toString());\n\t\t\t} catch {\n\t\t\t\treturn buf.toString();\n\t\t\t}\n\t\t},\n\t\tonAckError,\n\t\t...rest\n\t} = opts ?? {};\n\n\tconst reportAckError = (err: unknown) => {\n\t\tif (!onAckError) return;\n\t\ttry {\n\t\t\tonAckError(err instanceof Error ? err : new Error(String(err)));\n\t\t} catch {\n\t\t\t/* user hook must not escape */\n\t\t}\n\t};\n\n\treturn node<RabbitMQMessage<T> | AckableMessage<RabbitMQMessage<T>>>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\t\t\tlet consumerTag: string | undefined;\n\n\t\t\tconst start = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await channel.consume(\n\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t(rawMsg) => {\n\t\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\t\tif (rawMsg === null) {\n\t\t\t\t\t\t\t\t// Broker cancelled the consumer (queue deleted, etc.).\n\t\t\t\t\t\t\t\tif (active) a.down([[ERROR, new Error(\"Consumer cancelled by broker\")]]);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst structured: RabbitMQMessage<T> = {\n\t\t\t\t\t\t\t\tqueue,\n\t\t\t\t\t\t\t\troutingKey: rawMsg.fields.routingKey,\n\t\t\t\t\t\t\t\texchange: rawMsg.fields.exchange,\n\t\t\t\t\t\t\t\tcontent: deserialize(rawMsg.content) as T,\n\t\t\t\t\t\t\t\tproperties: rawMsg.properties,\n\t\t\t\t\t\t\t\tdeliveryTag: rawMsg.fields.deliveryTag,\n\t\t\t\t\t\t\t\tredelivered: rawMsg.fields.redelivered,\n\t\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (autoAck) {\n\t\t\t\t\t\t\t\ta.emit(structured);\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tchannel.ack(rawMsg);\n\t\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t\treportAckError(err);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\t\t\tconst channelWithNack = channel as unknown as {\n\t\t\t\t\t\t\t\t\tnack?: (msg: unknown, allUpTo?: boolean, requeue?: boolean) => void;\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tconst envelope: AckableMessage<RabbitMQMessage<T>> = {\n\t\t\t\t\t\t\t\t\tvalue: structured,\n\t\t\t\t\t\t\t\t\tack() {\n\t\t\t\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tchannel.ack(rawMsg);\n\t\t\t\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t\t\t\treportAckError(err);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tnack(nackOpts) {\n\t\t\t\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\t\t\t\t// `requeue` passes through to SDK — `undefined` lets the\n\t\t\t\t\t\t\t\t\t\t// SDK apply its own default (amqplib: true). Explicit\n\t\t\t\t\t\t\t\t\t\t// `false` routes to DLX if configured.\n\t\t\t\t\t\t\t\t\t\tconst requeue = nackOpts?.requeue;\n\t\t\t\t\t\t\t\t\t\tif (!channelWithNack.nack) {\n\t\t\t\t\t\t\t\t\t\t\treportAckError(\n\t\t\t\t\t\t\t\t\t\t\t\tnew Error(\"RabbitMQ channel does not expose `nack`; cannot negative-ack\"),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tchannelWithNack.nack(rawMsg, false, requeue);\n\t\t\t\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t\t\t\treportAckError(err);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\ta.emit(envelope);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ noAck: false },\n\t\t\t\t\t);\n\t\t\t\t\tconsumerTag = result.consumerTag;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (active) a.down([[ERROR, err]]);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvoid start();\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tif (consumerTag !== undefined) {\n\t\t\t\t\tvoid channel.cancel(consumerTag);\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/** Options for {@link toRabbitMQ}. */\nexport type ToRabbitMQOptions<T> = ExtraOpts & {\n\t/** Serialize value for RabbitMQ. Default: `Buffer.from(JSON.stringify(value))`. */\n\tserialize?: (value: T) => Buffer;\n\t/** Extract routing key from value. Default: `\"\"`. */\n\troutingKeyExtractor?: (value: T) => string;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * RabbitMQ producer sink — forwards upstream `DATA` to a RabbitMQ exchange/queue.\n *\n * @param source - Upstream node to forward.\n * @param channel - AMQP channel instance.\n * @param exchange - Target exchange (use `\"\"` for default exchange + queue routing).\n * @param opts - Serialization and routing options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toRabbitMQ<T>(\n\tsource: Node<T>,\n\tchannel: RabbitMQChannelLike,\n\texchange: string,\n\topts?: ToRabbitMQOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tserialize = (v: T) => Buffer.from(JSON.stringify(v)),\n\t\troutingKeyExtractor = () => \"\",\n\t\tonTransportError,\n\t} = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tsend: (value) => {\n\t\t\tconst routingKey = routingKeyExtractor(value);\n\t\t\tconst content = serialize(value);\n\t\t\tchannel.publish(exchange, routingKey, content);\n\t\t},\n\t});\n}\n","/**\n * Redis Streams IO — `fromRedisStream` (XREAD-BLOCK consumer source) and\n * `toRedisStream` (XADD producer sink). Caller owns the Redis client\n * lifecycle.\n */\n\nimport { ERROR, type Node, node, wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport { type ExtraOpts, sourceOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed Redis client (compatible with ioredis, redis). */\nexport type RedisClientLike = {\n\txadd(key: string, id: string, ...fieldsAndValues: string[]): Promise<string>;\n\txread(\n\t\t...args: Array<string | number>\n\t): Promise<Array<[string, Array<[string, string[]]>]> | null>;\n\tdisconnect(): void;\n};\n\n/** Structured Redis Stream entry. */\nexport type RedisStreamEntry<T = unknown> = {\n\tid: string;\n\tkey: string;\n\tdata: T;\n\ttimestampNs: number;\n};\n\n/** Options for {@link fromRedisStream}. */\nexport type FromRedisStreamOptions = ExtraOpts & {\n\t/** Block timeout in ms for XREAD. Default: `5000`. */\n\tblockMs?: number;\n\t/** Start ID. Default: `\"$\"` (new entries only). */\n\tstartId?: string;\n\t/** Parse raw Redis hash fields to structured data. Default: parses `data` field as JSON. */\n\tparse?: (fields: string[]) => unknown;\n};\n\n/**\n * Redis Streams consumer as a reactive source.\n *\n * Uses XREAD with BLOCK to reactively consume stream entries.\n *\n * @param client - ioredis/redis-compatible client (caller owns connection).\n * @param key - Redis stream key.\n * @param opts - Block timeout, start ID, and parsing options.\n * @returns `Node<RedisStreamEntry<T>>` — one `DATA` per stream entry.\n *\n * @remarks\n * **COMPLETE:** This source never emits `COMPLETE` under normal operation — it\n * is a long-lived stream consumer that runs until teardown or error, same as\n * Kafka consumers. If you need a bounded read, wrap with `take()` or\n * `takeUntil()`.\n *\n * **Client lifecycle:** The caller owns the Redis client connection. The adapter\n * does not call `disconnect()` on teardown — the caller is responsible for\n * closing the connection (same contract as `fromKafka`).\n *\n * @category extra\n */\nexport function fromRedisStream<T = unknown>(\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: FromRedisStreamOptions,\n): Node<RedisStreamEntry<T>> {\n\tconst {\n\t\tblockMs = 5000,\n\t\tstartId = \"$\",\n\t\tparse = (fields: string[]) => {\n\t\t\t// Redis returns flat [field, value, field, value, ...] arrays.\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tif (fields[i] === \"data\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(fields[i + 1]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn fields[i + 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return as object if no \"data\" field.\n\t\t\tconst obj: Record<string, string> = {};\n\t\t\tfor (let i = 0; i < fields.length; i += 2) {\n\t\t\t\tobj[fields[i]] = fields[i + 1];\n\t\t\t}\n\t\t\treturn obj;\n\t\t},\n\t\t...rest\n\t} = opts ?? {};\n\n\treturn node<RedisStreamEntry<T>>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\t\t\tlet lastId = startId;\n\n\t\t\tconst poll = async () => {\n\t\t\t\twhile (active) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await client.xread(\"BLOCK\", blockMs, \"STREAMS\", key, lastId);\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tfor (const [_streamKey, entries] of result) {\n\t\t\t\t\t\t\t\tfor (const [id, fields] of entries) {\n\t\t\t\t\t\t\t\t\tlastId = id;\n\t\t\t\t\t\t\t\t\ta.emit({\n\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t\t\tdata: parse(fields) as T,\n\t\t\t\t\t\t\t\t\t\ttimestampNs: wallClockNs(),\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tif (!active) return;\n\t\t\t\t\t\ta.down([[ERROR, err]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvoid poll();\n\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/** Options for {@link toRedisStream}. */\nexport type ToRedisStreamOptions<T> = ExtraOpts & {\n\t/** Serialize value to Redis hash fields. Default: `[\"data\", JSON.stringify(value)]`. */\n\tserialize?: (value: T) => string[];\n\t/** Max stream length (MAXLEN ~). Default: no trimming. */\n\tmaxLen?: number;\n\t/** Called on serialization or send failures. */\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Redis Streams producer sink — forwards upstream `DATA` to a Redis stream.\n *\n * @param source - Upstream node to forward.\n * @param client - ioredis/redis-compatible client.\n * @param key - Redis stream key.\n * @param opts - Serialization options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toRedisStream<T>(\n\tsource: Node<T>,\n\tclient: RedisClientLike,\n\tkey: string,\n\topts?: ToRedisStreamOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tserialize = (v: T) => [\"data\", JSON.stringify(v)],\n\t\tmaxLen,\n\t\tonTransportError,\n\t} = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tsend: async (value) => {\n\t\t\tconst fields = serialize(value);\n\t\t\tawait (maxLen !== undefined\n\t\t\t\t? client.xadd(key, \"MAXLEN\", \"~\", String(maxLen), \"*\", ...fields)\n\t\t\t\t: client.xadd(key, \"*\", ...fields));\n\t\t},\n\t});\n}\n","/**\n * SQLite IO (roadmap §5.2b) — `fromSqlite` (one-shot synchronous query),\n * `fromSqliteCursor` (row-by-row streaming via `iterate()`), and `toSqlite`\n * (insert sink with optional transactional batching).\n *\n * Synchronous boundaries: SQLite drivers are typically synchronous\n * (`better-sqlite3`, `node:sqlite`), so errors propagate immediately rather\n * than via promise rejection. The duck-typed `SqliteDbLike.query` matches the\n * project-wide `query(sql, params)` convention used by Postgres/ClickHouse.\n */\n\nimport {\n\tbatch,\n\tCOMPLETE,\n\tDATA,\n\tdefaultConfig,\n\tERROR,\n\ttype Node,\n\ttype NodeOptions,\n\tnode,\n\tTEARDOWN,\n} from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport {\n\ttype ReactiveSinkHandle,\n\treactiveSink,\n\ttype SinkFailure,\n\ttype SinkTransportError,\n} from \"./_sink.js\";\n\n/**\n * Duck-typed synchronous SQLite database.\n *\n * Compatible with `better-sqlite3` (`.prepare().all()` / `.prepare().run()`)\n * and Node.js `node:sqlite` `DatabaseSync`. The user wraps their driver behind\n * this uniform contract — method name `query` matches the project-wide\n * convention (`PostgresClientLike.query`, `ClickHouseClientLike.query`).\n */\nexport type SqliteDbLike = {\n\tquery(sql: string, params?: unknown[]): unknown[];\n};\n\n/** Options for {@link fromSqlite}. */\nexport type FromSqliteOptions<T> = ExtraOpts & {\n\t/** Map a raw row object to the desired type. Default: identity cast. */\n\tmapRow?: (row: unknown) => T;\n\t/** Bind parameters for the query. */\n\tparams?: unknown[];\n};\n\n/**\n * One-shot SQLite query as a reactive source.\n *\n * Executes `query` synchronously via `db.query()`, emits **one `DATA` containing\n * the full result array**, then `COMPLETE`. Downstream flattens with\n * `mergeAll` / a custom operator if per-row semantics are required — the\n * array shape is the simpler default and matches how every SQL driver returns\n * results natively. Use {@link fromSqliteCursor} for streaming row-by-row.\n *\n * @param db - SQLite database (caller owns connection).\n * @param query - SQL string to execute.\n * @param opts - Row mapper, params, and node options.\n * @returns `Node<T[]>` — one `DATA` with the full row array, then `COMPLETE`.\n *\n * @example\n * ```ts\n * import Database from \"better-sqlite3\";\n * import { fromSqlite } from \"@graphrefly/graphrefly-ts\";\n *\n * const raw = new Database(\"app.db\");\n * const db = { query: (sql, params) => raw.prepare(sql).all(...(params ?? [])) };\n * const rows$ = fromSqlite(db, \"SELECT * FROM users WHERE active = ?\", { params: [1] });\n * ```\n *\n * @category extra\n */\nexport function fromSqlite<T = unknown>(\n\tdb: SqliteDbLike,\n\tquery: string,\n\topts?: FromSqliteOptions<T>,\n): Node<T[]> {\n\tconst { mapRow = (r: unknown) => r as T, params, ...rest } = opts ?? {};\n\n\treturn node<T[]>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\ttry {\n\t\t\t\tconst rows = db.query(query, params);\n\t\t\t\tconst mapped = rows.map(mapRow);\n\t\t\t\ta.emit(mapped);\n\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t} catch (err) {\n\t\t\t\ta.down([[ERROR, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t{ describeKind: \"producer\", completeWhenDepsComplete: false, ...rest } as NodeOptions<T[]>,\n\t);\n}\n\n/**\n * Duck-typed iterable-capable SQLite database — `iterate(sql, params)` returns\n * a synchronous iterator over rows, avoiding the \"all-rows-in-memory\" cost of\n * `db.query`. Compatible with `better-sqlite3`'s `.prepare().iterate()`.\n *\n * @category extra\n */\nexport type SqliteIterableDbLike = {\n\titerate(sql: string, params?: unknown[]): Iterable<unknown>;\n};\n\n/**\n * Cursor-streaming SQLite query — emits one `DATA` per row from a synchronous\n * row iterator, then `COMPLETE`. Use when result sets are too large to\n * materialize fully into an array.\n *\n * @category extra\n */\nexport function fromSqliteCursor<T = unknown>(\n\tdb: SqliteIterableDbLike,\n\tquery: string,\n\topts?: FromSqliteOptions<T>,\n): Node<T> {\n\tconst { mapRow = (r: unknown) => r as T, params, ...rest } = opts ?? {};\n\treturn node<T>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\ttry {\n\t\t\t\tconst it = db.iterate(query, params);\n\t\t\t\tbatch(() => {\n\t\t\t\t\tfor (const row of it) a.emit(mapRow(row));\n\t\t\t\t\ta.down([[COMPLETE]]);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\ta.down([[ERROR, err instanceof Error ? err : new Error(String(err))]]);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t{ describeKind: \"producer\", completeWhenDepsComplete: false, ...rest } as NodeOptions<T>,\n\t);\n}\n\n/** Options for {@link toSqlite}. */\nexport type ToSqliteOptions<T> = ExtraOpts & {\n\t/** Build SQL + params for an insert. Default: JSON insert into `(data)` column. */\n\ttoSQL?: (value: T, table: string) => { sql: string; params: unknown[] };\n\tonTransportError?: (err: SinkTransportError) => void;\n\t/**\n\t * When `true`, buffer DATA values and execute all inserts inside a single\n\t * `BEGIN`/`COMMIT` transaction when the batch drains. This avoids per-row\n\t * fsync overhead and dramatically reduces event-loop blocking for\n\t * high-throughput sources. The first insert error stops the batch and\n\t * triggers a `ROLLBACK`; the error is reported via `onTransportError`.\n\t */\n\tbatchInsert?: boolean;\n\t/** Auto-flush when buffer reaches this size. Default: `1000`. Only applies when `batchInsert` is `true`. */\n\tmaxBatchSize?: number;\n\t/** Periodic flush interval in ms. `0` = no timer (flush on terminal messages only). Default: `0`. Only applies when `batchInsert` is `true`. */\n\tflushIntervalMs?: number;\n};\n\n/**\n * SQLite sink — inserts each upstream `DATA` value as a row.\n *\n * Follows the same pattern as {@link toPostgres} / {@link toMongo}. Since SQLite\n * is synchronous, errors propagate immediately (no `void promise.catch`).\n *\n * @param source - Upstream node.\n * @param db - SQLite database (caller owns connection).\n * @param table - Target table name.\n * @param opts - SQL builder and error options.\n * @returns Unsubscribe function.\n *\n * @example\n * ```ts\n * import Database from \"better-sqlite3\";\n * import { toSqlite, state } from \"@graphrefly/graphrefly-ts\";\n *\n * const raw = new Database(\"app.db\");\n * const db = { query: (sql, params) => (raw.prepare(sql).run(...(params ?? [])), []) };\n * const source = state({ name: \"Alice\", score: 42 });\n * const unsub = toSqlite(source, db, \"events\");\n * ```\n *\n * @category extra\n */\nexport function toSqlite<T>(\n\tsource: Node<T>,\n\tdb: SqliteDbLike,\n\ttable: string,\n\topts?: ToSqliteOptions<T>,\n): ReactiveSinkHandle<T> {\n\tif (table.includes(\"\\0\") || table.length === 0) {\n\t\tthrow new Error(`toSqlite: invalid table name: ${JSON.stringify(table)}`);\n\t}\n\tconst {\n\t\ttoSQL = (v: T, t: string) => ({\n\t\t\tsql: `INSERT INTO \"${t.replace(/\"/g, '\"\"')}\" (data) VALUES (?)`,\n\t\t\tparams: [JSON.stringify(v)],\n\t\t}),\n\t\tonTransportError,\n\t\tbatchInsert = false,\n\t\tmaxBatchSize = 1000,\n\t\tflushIntervalMs = 0,\n\t} = opts ?? {};\n\n\tconst serialize = (value: T) => toSQL(value, table);\n\ttype Query = { sql: string; params: unknown[] };\n\n\tif (!batchInsert) {\n\t\treturn reactiveSink<T>(source, {\n\t\t\tonTransportError,\n\t\t\tserialize,\n\t\t\tsend: (q) => {\n\t\t\t\tconst query = q as Query;\n\t\t\t\tdb.query(query.sql, query.params);\n\t\t\t},\n\t\t});\n\t}\n\n\t// Batched mode — transactional: BEGIN → inserts → COMMIT (or ROLLBACK on\n\t// first insert error). Must preserve pending queries when BEGIN itself\n\t// fails (e.g. \"database is locked\") so a subsequent `flush()` can retry\n\t// with the same data intact. The generic `reactiveSink` clears its buffer\n\t// before invoking `sendBatch`, so we keep a bespoke transactional loop on\n\t// top of the reactiveSink skeleton: custom `flush()` + local pending\n\t// queue with re-queue semantics on BEGIN failure.\n\tconst errorsNode = node<SinkTransportError | null>([], { initial: null });\n\tconst sentNode = node<T | undefined>([], {\n\t\tinitial: undefined,\n\t\tequals: () => false,\n\t}) as unknown as Node<T>;\n\tconst failedNode = node<SinkFailure<T> | null>([], { initial: null });\n\tconst inFlightNode = node<number>([], { initial: 0 });\n\tconst bufferedNode = node<number>([], { initial: 0 });\n\n\tconst reportError = (err: SinkTransportError) => {\n\t\ttry {\n\t\t\tonTransportError?.(err);\n\t\t} catch {\n\t\t\t/* user hook must not escape */\n\t\t}\n\t\ttry {\n\t\t\terrorsNode.down([[DATA, err]]);\n\t\t} catch {\n\t\t\t/* drain re-entrance */\n\t\t}\n\t};\n\n\ttype PendingEntry = { value: T; query: Query };\n\tlet pending: PendingEntry[] = [];\n\tlet flushing = false;\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet disposed = false;\n\n\tconst updateBuffered = () => bufferedNode.down([[DATA, pending.length]]);\n\n\t// Guarded emit helpers — drop post-TEARDOWN writes silently (spec §1.3.4\n\t// terminal filter already blocks them downstream; this skips the\n\t// allocation). Prevents \"emit after TEARDOWN\" observable in subscribers\n\t// that race with in-flight flushes.\n\tconst safeEmitSent = (v: T) => {\n\t\tif (disposed) return;\n\t\tsentNode.down([[DATA, v]]);\n\t};\n\tconst safeEmitFailed = (f: SinkFailure<T>) => {\n\t\tif (disposed) return;\n\t\tfailedNode.down([[DATA, f]]);\n\t};\n\tconst safeSetInFlight = (n: number) => {\n\t\tif (disposed) return;\n\t\tinFlightNode.down([[DATA, n]]);\n\t};\n\tconst safeReportError = (err: SinkTransportError) => {\n\t\tif (disposed) return;\n\t\treportError(err);\n\t};\n\n\tconst flushTransaction = () => {\n\t\tif (pending.length === 0 || flushing) return;\n\t\tflushing = true;\n\t\tsafeSetInFlight(1);\n\t\ttry {\n\t\t\tdb.query(\"BEGIN\", []);\n\t\t} catch (err) {\n\t\t\t// BEGIN failed — keep `pending` intact so a later flush can retry.\n\t\t\tflushing = false;\n\t\t\tsafeSetInFlight(0);\n\t\t\tsafeReportError({\n\t\t\t\tstage: \"send\",\n\t\t\t\terror: err instanceof Error ? err : new Error(String(err)),\n\t\t\t\tvalue: undefined,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tconst chunk = pending;\n\t\tpending = [];\n\t\tupdateBuffered();\n\n\t\tlet firstError: Error | undefined;\n\t\tlet committedCount = 0;\n\t\tfor (const entry of chunk) {\n\t\t\ttry {\n\t\t\t\tdb.query(entry.query.sql, entry.query.params);\n\t\t\t\tcommittedCount += 1;\n\t\t\t} catch (err) {\n\t\t\t\tfirstError = err instanceof Error ? err : new Error(String(err));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (firstError) {\n\t\t\ttry {\n\t\t\t\tdb.query(\"ROLLBACK\", []);\n\t\t\t} catch {\n\t\t\t\t/* ROLLBACK failure — firstError already captured */\n\t\t\t}\n\t\t\tsafeReportError({ stage: \"send\", error: firstError, value: undefined });\n\t\t\tfor (const entry of chunk) {\n\t\t\t\tsafeEmitFailed({ value: entry.value, error: firstError, attempts: 1 });\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tdb.query(\"COMMIT\", []);\n\t\t\t\tfor (const entry of chunk) safeEmitSent(entry.value);\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\t\tsafeReportError({ stage: \"send\", error, value: undefined });\n\t\t\t\tfor (let i = 0; i < committedCount; i++) {\n\t\t\t\t\tsafeEmitFailed({ value: chunk[i].value, error, attempts: 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tflushing = false;\n\t\tsafeSetInFlight(0);\n\t};\n\n\tconst scheduleFlush = () => {\n\t\tif (flushIntervalMs > 0 && timer === undefined && !disposed) {\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\t/* I/O flush timer — not reactive scheduling (§5.10) */\n\t\t\t\ttimer = undefined;\n\t\t\t\tflushTransaction();\n\t\t\t}, flushIntervalMs);\n\t\t}\n\t};\n\n\tconst unsub = source.subscribe((msgs) => {\n\t\tfor (const msg of msgs) {\n\t\t\tconst t = msg[0];\n\t\t\tif (t === DATA) {\n\t\t\t\tconst value = msg[1] as T;\n\t\t\t\tlet query: Query;\n\t\t\t\ttry {\n\t\t\t\t\tquery = serialize(value);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\t\t\treportError({ stage: \"serialize\", error, value });\n\t\t\t\t\tfailedNode.down([[DATA, { value, error, attempts: 0 } satisfies SinkFailure<T>]]);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tpending.push({ value, query });\n\t\t\t\tupdateBuffered();\n\t\t\t\tif (pending.length >= maxBatchSize) flushTransaction();\n\t\t\t\telse scheduleFlush();\n\t\t\t} else if (defaultConfig.messageTier(t) >= 3) {\n\t\t\t\tflushTransaction();\n\t\t\t}\n\t\t}\n\t});\n\n\tconst dispose = () => {\n\t\tif (disposed) return;\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t\tflushTransaction();\n\t\tdisposed = true;\n\t\tunsub();\n\t\tfor (const n of [errorsNode, sentNode, failedNode, inFlightNode, bufferedNode]) {\n\t\t\ttry {\n\t\t\t\t(n as Node<unknown>).down([[TEARDOWN]]);\n\t\t\t} catch {\n\t\t\t\t/* drain re-entrance */\n\t\t\t}\n\t\t}\n\t};\n\n\treturn {\n\t\tdispose,\n\t\tsent: sentNode,\n\t\tfailed: failedNode,\n\t\tinFlight: inFlightNode,\n\t\terrors: errorsNode,\n\t\tbuffered: bufferedNode,\n\t\tflush: async () => {\n\t\t\tif (!disposed) flushTransaction();\n\t\t},\n\t};\n}\n","/**\n * StatsD / DogStatsD IO — `fromStatsD` registrar-based source plus\n * `parseStatsD` helper for the line format. The caller owns the UDP socket;\n * the adapter only wires the `emit` triad.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport { wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport {\n\ttype EmitTriad,\n\ttype ExternalRegister,\n\texternalProducer,\n} from \"../composition/external-register.js\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/** Parsed StatsD metric. */\nexport type StatsDMetric = {\n\tname: string;\n\tvalue: number;\n\ttype: \"counter\" | \"gauge\" | \"timer\" | \"histogram\" | \"set\" | \"distribution\";\n\tsampleRate?: number;\n\ttags: Record<string, string>;\n\ttimestampNs: number;\n};\n\n/** Registration callback for StatsD receiver. Alias of {@link ExternalRegister} over {@link EmitTriad}. */\nexport type StatsDRegister = ExternalRegister<EmitTriad<StatsDMetric>>;\n\n/** Options for {@link fromStatsD}. */\nexport type FromStatsDOptions = ExtraOpts & {};\n\n/**\n * StatsD/DogStatsD UDP receiver as a reactive source.\n *\n * The caller owns the UDP socket. `fromStatsD` receives a `register` callback\n * that wires datagrams to the `emit` handler with parsed metrics.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<StatsDMetric>` — one `DATA` per metric line.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromStatsD, parseStatsD } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const stats$ = fromStatsD(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * for (const line of buf.toString().split(\"\\\\n\")) {\n * if (line.trim()) {\n * try { emit(parseStatsD(line)); }\n * catch (e) { error(e); }\n * }\n * }\n * });\n * server.bind(8125);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromStatsD(register: StatsDRegister, opts?: FromStatsDOptions): Node<StatsDMetric> {\n\treturn externalProducer<StatsDMetric>(register, opts);\n}\n\nconst STATSD_TYPES: Record<string, StatsDMetric[\"type\"]> = {\n\tc: \"counter\",\n\tg: \"gauge\",\n\tms: \"timer\",\n\th: \"histogram\",\n\ts: \"set\",\n\td: \"distribution\",\n};\n\n/**\n * Parses a raw StatsD/DogStatsD line into a structured {@link StatsDMetric}.\n *\n * Format: `metric.name:value|type|@sampleRate|#tag1:val1,tag2:val2`\n *\n * @category extra\n */\nexport function parseStatsD(line: string): StatsDMetric {\n\tconst parts = line.split(\"|\");\n\tconst [name, valueStr] = (parts[0] ?? \"\").split(\":\");\n\tif (!name || valueStr === undefined) {\n\t\tthrow new Error(`Invalid StatsD line: ${line}`);\n\t}\n\tconst typeCode = parts[1]?.trim() ?? \"c\";\n\tconst type = STATSD_TYPES[typeCode] ?? \"counter\";\n\t// Set type uses string identifiers (e.g. unique user IDs), not numeric values.\n\tconst value = type === \"set\" ? 0 : Number(valueStr);\n\n\tlet sampleRate: number | undefined;\n\tconst tags: Record<string, string> = {};\n\n\tfor (let i = 2; i < parts.length; i++) {\n\t\tconst part = parts[i].trim();\n\t\tif (part.startsWith(\"@\")) {\n\t\t\tsampleRate = Number(part.slice(1));\n\t\t} else if (part.startsWith(\"#\")) {\n\t\t\tfor (const tag of part.slice(1).split(\",\")) {\n\t\t\t\tconst [k, v] = tag.split(\":\");\n\t\t\t\tif (k) tags[k] = v ?? \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { name: name.trim(), value, type, sampleRate, tags, timestampNs: wallClockNs() };\n}\n","/**\n * Syslog (RFC 5424) IO — `fromSyslog` registrar-based source plus\n * `parseSyslog` helper for the line format. The caller owns the UDP/TCP\n * socket; the adapter only wires the `emit` triad.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport { wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport {\n\ttype EmitTriad,\n\ttype ExternalRegister,\n\texternalProducer,\n} from \"../composition/external-register.js\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/** Parsed syslog message (RFC 5424). */\nexport type SyslogMessage = {\n\tfacility: number;\n\tseverity: number;\n\ttimestamp: string;\n\thostname: string;\n\tappName: string;\n\tprocId: string;\n\tmsgId: string;\n\tmessage: string;\n\ttimestampNs: number;\n};\n\n/** Registration callback for syslog receiver. Alias of {@link ExternalRegister} over {@link EmitTriad}. */\nexport type SyslogRegister = ExternalRegister<EmitTriad<SyslogMessage>>;\n\n/** Options for {@link fromSyslog}. */\nexport type FromSyslogOptions = ExtraOpts & {};\n\n/**\n * RFC 5424 syslog receiver as a reactive source.\n *\n * The caller owns the UDP/TCP socket. `fromSyslog` receives a `register` callback\n * that wires socket data events to the `emit` handler with parsed syslog messages.\n *\n * @param register - Wires socket to emit/error/complete handlers.\n * @param opts - Optional producer options.\n * @returns `Node<SyslogMessage>` — one `DATA` per syslog message.\n *\n * @example\n * ```ts\n * import dgram from \"node:dgram\";\n * import { fromSyslog, parseSyslog } from \"@graphrefly/graphrefly-ts\";\n *\n * const server = dgram.createSocket(\"udp4\");\n * const syslog$ = fromSyslog(({ emit, error }) => {\n * server.on(\"message\", (buf) => {\n * try { emit(parseSyslog(buf.toString())); }\n * catch (e) { error(e); }\n * });\n * server.bind(514);\n * return () => server.close();\n * });\n * ```\n *\n * @category extra\n */\nexport function fromSyslog(\n\tregister: SyslogRegister,\n\topts?: FromSyslogOptions,\n): Node<SyslogMessage> {\n\treturn externalProducer<SyslogMessage>(register, opts);\n}\n\n/**\n * Parses a raw RFC 5424 syslog line into a structured {@link SyslogMessage}.\n *\n * Format: `<PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID MSG`\n *\n * @category extra\n */\nexport function parseSyslog(raw: string): SyslogMessage {\n\tconst match = raw.match(/^<(\\d{1,3})>\\d?\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*(.*)/s);\n\tif (!match) {\n\t\tconst nowNs = wallClockNs();\n\t\treturn {\n\t\t\tfacility: 1,\n\t\t\tseverity: 6,\n\t\t\ttimestamp: new Date(Math.floor(nowNs / 1_000_000)).toISOString(),\n\t\t\thostname: \"-\",\n\t\t\tappName: \"-\",\n\t\t\tprocId: \"-\",\n\t\t\tmsgId: \"-\",\n\t\t\tmessage: raw.trim(),\n\t\t\ttimestampNs: nowNs,\n\t\t};\n\t}\n\tconst pri = Number(match[1]);\n\treturn {\n\t\tfacility: pri >> 3,\n\t\tseverity: pri & 7,\n\t\ttimestamp: match[2],\n\t\thostname: match[3],\n\t\tappName: match[4],\n\t\tprocId: match[5],\n\t\tmsgId: match[6],\n\t\tmessage: (match[7] ?? \"\").trim(),\n\t\ttimestampNs: wallClockNs(),\n\t};\n}\n","/**\n * ClickHouse insert sink IO — `toClickHouse` accumulates upstream `DATA`\n * values and inserts them in batches via the duck-typed\n * {@link ClickHouseInsertClientLike}.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed ClickHouse client for batch inserts. */\nexport type ClickHouseInsertClientLike = {\n\tinsert(params: { table: string; values: unknown[]; format?: string }): Promise<void>;\n};\n\n/** Options for {@link toClickHouse}. */\nexport type ToClickHouseOptions<T> = ExtraOpts & {\n\t/** Batch size before auto-flush. Default: `1000`. */\n\tbatchSize?: number;\n\t/** Flush interval in ms. Default: `5000`. */\n\tflushIntervalMs?: number;\n\t/** Insert format. Default: `\"JSONEachRow\"`. */\n\tformat?: string;\n\t/** Transform value before insert. Default: identity. */\n\ttransform?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * ClickHouse buffered batch insert sink.\n *\n * Accumulates upstream `DATA` values and inserts in batches.\n *\n * @param source - Upstream node.\n * @param client - ClickHouse client with `insert()`.\n * @param table - Target table name.\n * @param opts - Batch size, flush interval, and transform options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toClickHouse<T>(\n\tsource: Node<T>,\n\tclient: ClickHouseInsertClientLike,\n\ttable: string,\n\topts?: ToClickHouseOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tbatchSize = 1000,\n\t\tflushIntervalMs = 5000,\n\t\tformat = \"JSONEachRow\",\n\t\ttransform = (v: T) => v,\n\t\tonTransportError,\n\t} = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tbatchSize,\n\t\tflushIntervalMs,\n\t\tserialize: transform,\n\t\tsendBatch: async (batch) => {\n\t\t\tawait client.insert({ table, values: batch, format });\n\t\t},\n\t});\n}\n","/**\n * File-writer sink IO — `toFile` writes upstream `DATA` to any\n * `FileWriterLike` (e.g. `fs.createWriteStream`). Buffered or write-through\n * depending on `flushIntervalMs` / `batchSize`.\n *\n * Uses a duck-typed writable so the universal `extra/io` entry stays\n * browser-safe — the caller injects the Node `fs` writer at the boundary.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed writable file handle (compatible with `fs.createWriteStream`). */\nexport type FileWriterLike = {\n\twrite(data: string | Uint8Array): boolean | undefined;\n\tend(): void;\n};\n\n/** Options for {@link toFile}. */\nexport type ToFileOptions<T> = ExtraOpts & {\n\t/** Serialize a value to a string line. Default: `JSON.stringify(v) + \"\\n\"`. */\n\tserialize?: (value: T) => string;\n\t/** `\"append\"` (default) or `\"overwrite\"` — controls initial file behavior hint. */\n\tmode?: \"append\" | \"overwrite\";\n\t/** Flush interval in ms. `0` = write-through (no buffering). Default: `0`. */\n\tflushIntervalMs?: number;\n\t/** Buffer size (item count) before auto-flush. Default: `Infinity` (timer only). */\n\tbatchSize?: number;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * File sink — writes upstream `DATA` values to a file-like writable.\n *\n * When `flushIntervalMs > 0` or `batchSize` is set, values are buffered and\n * flushed in batches. Otherwise, each value is written immediately.\n *\n * @param source - Upstream node.\n * @param writer - Writable file handle (e.g. `fs.createWriteStream(path, { flags: \"a\" })`).\n * @param opts - Serialization, buffering, and mode options.\n * @returns `BufferedSinkHandle` with `dispose()` and `flush()`.\n *\n * @category extra\n */\nexport function toFile<T>(\n\tsource: Node<T>,\n\twriter: FileWriterLike,\n\topts?: ToFileOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tserialize = (v: T) => `${JSON.stringify(v)}\\n`,\n\t\tflushIntervalMs = 0,\n\t\tbatchSize = Number.POSITIVE_INFINITY,\n\t\tonTransportError,\n\t\tmode: _mode,\n\t} = opts ?? {};\n\n\tconst buffered = flushIntervalMs > 0 || batchSize < Number.POSITIVE_INFINITY;\n\t// Pass `serialize` via reactiveSink's config so sync throws are classified as\n\t// `stage:\"serialize\"` rather than `stage:\"send\"`. Inside send/sendBatch the\n\t// payload is already a string (serialize output).\n\tconst handle: ReactiveSinkHandle<T> = buffered\n\t\t? reactiveSink<T>(source, {\n\t\t\t\tonTransportError,\n\t\t\t\tbatchSize,\n\t\t\t\tflushIntervalMs,\n\t\t\t\tserialize,\n\t\t\t\tsendBatch: (chunk) => {\n\t\t\t\t\twriter.write((chunk as unknown as string[]).join(\"\"));\n\t\t\t\t},\n\t\t\t})\n\t\t: reactiveSink<T>(source, {\n\t\t\t\tonTransportError,\n\t\t\t\tserialize,\n\t\t\t\tsend: (line) => {\n\t\t\t\t\twriter.write(line as unknown as string);\n\t\t\t\t},\n\t\t\t});\n\n\tconst originalDispose = handle.dispose;\n\thandle.dispose = () => {\n\t\toriginalDispose();\n\t\ttry {\n\t\t\twriter.end();\n\t\t} catch {\n\t\t\t/* writer may already be closed */\n\t\t}\n\t};\n\treturn handle;\n}\n","/**\n * CSV file sink IO — `toCSV` adds CSV row formatting on top of\n * {@link toFile}. Uses the local `escapeCSVField` helper to quote cells that\n * contain delimiters / quotes / newlines.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport type { ReactiveSinkHandle, SinkTransportError } from \"./_sink.js\";\nimport { type FileWriterLike, toFile } from \"./to-file.js\";\n\n/** Options for {@link toCSV}. */\nexport type ToCSVOptions<T> = ExtraOpts & {\n\t/** Column names. Required — determines header row and field order. */\n\tcolumns: string[];\n\t/** Column delimiter. Default: `\",\"`. */\n\tdelimiter?: string;\n\t/** Whether to write a header row on first flush. Default: `true`. */\n\twriteHeader?: boolean;\n\t/** Extract a cell value from the row object. Default: `String(row[col] ?? \"\")`. */\n\tcellExtractor?: (row: T, column: string) => string;\n\t/** Flush interval in ms. Default: `0` (write-through). */\n\tflushIntervalMs?: number;\n\t/** Buffer size before auto-flush. Default: `Infinity`. */\n\tbatchSize?: number;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\nfunction escapeCSVField(value: string, delimiter: string): string {\n\tif (value.includes(delimiter) || value.includes('\"') || value.includes(\"\\n\")) {\n\t\treturn `\"${value.replace(/\"/g, '\"\"')}\"`;\n\t}\n\treturn value;\n}\n\n/**\n * CSV file sink — writes upstream `DATA` as CSV rows.\n *\n * @param source - Upstream node.\n * @param writer - Writable file handle.\n * @param opts - Column definition, delimiter, and buffering options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toCSV<T>(\n\tsource: Node<T>,\n\twriter: FileWriterLike,\n\topts: ToCSVOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tcolumns,\n\t\tdelimiter = \",\",\n\t\twriteHeader = true,\n\t\tcellExtractor = (row: T, col: string) => String((row as Record<string, unknown>)[col] ?? \"\"),\n\t\tflushIntervalMs = 0,\n\t\tbatchSize = Number.POSITIVE_INFINITY,\n\t\tonTransportError,\n\t\t...rest\n\t} = opts;\n\n\tlet headerWritten = false;\n\n\tconst serializeRow = (row: T): string => {\n\t\tif (!headerWritten && writeHeader) {\n\t\t\theaderWritten = true;\n\t\t\tconst header = columns.map((c) => escapeCSVField(c, delimiter)).join(delimiter);\n\t\t\tconst data = columns\n\t\t\t\t.map((c) => escapeCSVField(cellExtractor(row, c), delimiter))\n\t\t\t\t.join(delimiter);\n\t\t\treturn `${header}\\n${data}\\n`;\n\t\t}\n\t\treturn `${columns.map((c) => escapeCSVField(cellExtractor(row, c), delimiter)).join(delimiter)}\\n`;\n\t};\n\n\treturn toFile<T>(source, writer, {\n\t\tserialize: serializeRow,\n\t\tflushIntervalMs,\n\t\tbatchSize,\n\t\tonTransportError,\n\t\t...rest,\n\t});\n}\n","/**\n * Grafana Loki sink IO — `toLoki` pushes upstream `DATA` values as log\n * entries via the duck-typed {@link LokiClientLike} `push()` surface.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport { wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Loki log stream entry. */\nexport type LokiStream = {\n\tstream: Record<string, string>;\n\tvalues: [string, string][];\n};\n\n/** Duck-typed Loki push client (HTTP push API). */\nexport type LokiClientLike = {\n\tpush(streams: { streams: LokiStream[] }): Promise<unknown>;\n};\n\n/** Options for {@link toLoki}. */\nexport type ToLokiOptions<T> = ExtraOpts & {\n\t/** Static labels applied to every log entry. */\n\tlabels?: Record<string, string>;\n\t/** Extract the log line from a value. Default: `JSON.stringify(v)`. */\n\ttoLine?: (value: T) => string;\n\t/** Extract additional labels from a value. Default: none. */\n\ttoLabels?: (value: T) => Record<string, string>;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Grafana Loki sink — pushes upstream `DATA` values as log entries.\n *\n * @param source - Upstream node.\n * @param client - Loki-compatible client with `push()`.\n * @param opts - Label, serialization, and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toLoki<T>(\n\tsource: Node<T>,\n\tclient: LokiClientLike,\n\topts?: ToLokiOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tlabels = {},\n\t\ttoLine = (v: T) => JSON.stringify(v),\n\t\ttoLabels,\n\t\tonTransportError,\n\t} = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tserialize: (value) => ({\n\t\t\tline: toLine(value),\n\t\t\tlabels: toLabels ? { ...labels, ...toLabels(value) } : labels,\n\t\t}),\n\t\tsend: async (payload) => {\n\t\t\tconst { line, labels: streamLabels } = payload as {\n\t\t\t\tline: string;\n\t\t\t\tlabels: Record<string, string>;\n\t\t\t};\n\t\t\tconst ts = `${wallClockNs()}`;\n\t\t\tawait client.push({ streams: [{ stream: streamLabels, values: [[ts, line]] }] });\n\t\t},\n\t});\n}\n","/**\n * MongoDB insert sink IO — `toMongo` inserts each upstream `DATA` value via\n * the duck-typed {@link MongoCollectionLike} `insertOne()`.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed MongoDB collection (compatible with `mongodb` driver). */\nexport type MongoCollectionLike = {\n\tinsertOne(doc: unknown): Promise<unknown>;\n};\n\n/** Options for {@link toMongo}. */\nexport type ToMongoOptions<T> = ExtraOpts & {\n\t/** Transform value to a MongoDB document. Default: identity. */\n\ttoDocument?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * MongoDB sink — inserts each upstream `DATA` value as a document.\n *\n * @param source - Upstream node.\n * @param collection - MongoDB collection with `insertOne()`.\n * @param opts - Document transform and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toMongo<T>(\n\tsource: Node<T>,\n\tcollection: MongoCollectionLike,\n\topts?: ToMongoOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst { toDocument = (v: T) => v, onTransportError } = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tserialize: toDocument,\n\t\tsend: async (doc) => {\n\t\t\tawait collection.insertOne(doc);\n\t\t},\n\t});\n}\n","/**\n * Postgres insert sink IO — `toPostgres` inserts each upstream `DATA` value\n * via the duck-typed {@link PostgresClientLike} `query()` surface.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed Postgres client (compatible with `pg.Client` / `pg.Pool`). */\nexport type PostgresClientLike = {\n\tquery(sql: string, params?: unknown[]): Promise<unknown>;\n};\n\n/** Options for {@link toPostgres}. */\nexport type ToPostgresOptions<T> = ExtraOpts & {\n\t/** Build the SQL + params for an insert. Default: JSON insert into `table`. */\n\ttoSQL?: (value: T, table: string) => { sql: string; params: unknown[] };\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * PostgreSQL sink — inserts each upstream `DATA` value as a row.\n *\n * @param source - Upstream node.\n * @param client - Postgres client with `query()`.\n * @param table - Target table name.\n * @param opts - SQL builder and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toPostgres<T>(\n\tsource: Node<T>,\n\tclient: PostgresClientLike,\n\ttable: string,\n\topts?: ToPostgresOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\ttoSQL = (v: T, t: string) => ({\n\t\t\tsql: `INSERT INTO \"${t.replace(/\"/g, '\"\"')}\" (data) VALUES ($1)`,\n\t\t\tparams: [JSON.stringify(v)],\n\t\t}),\n\t\tonTransportError,\n\t} = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tserialize: (value) => toSQL(value, table),\n\t\tsend: async (q) => {\n\t\t\tconst query = q as unknown as { sql: string; params: unknown[] };\n\t\t\tawait client.query(query.sql, query.params);\n\t\t},\n\t});\n}\n","/**\n * S3 object-storage sink IO — `toS3` buffers upstream `DATA` values and\n * uploads them as NDJSON or JSON objects via the duck-typed\n * {@link S3ClientLike}.\n *\n * `S3ClientLike` is also used by `checkpointToS3` (in `./checkpoint.ts`).\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport { wallClockNs } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed S3 client (compatible with AWS SDK v3 `S3Client.send(PutObjectCommand(...))`). */\nexport type S3ClientLike = {\n\tputObject(params: {\n\t\tBucket: string;\n\t\tKey: string;\n\t\tBody: string | Uint8Array;\n\t\tContentType?: string;\n\t}): Promise<unknown>;\n};\n\n/** Options for {@link toS3}. */\nexport type ToS3Options<T> = ExtraOpts & {\n\t/** Output format. Default: `\"ndjson\"`. */\n\tformat?: \"ndjson\" | \"json\";\n\t/** Generate the S3 key for each batch. Receives `(seq, wallClockNs)`. Default: ISO timestamp + sequence. */\n\tkeyGenerator?: (seq: number, timestampNs: number) => string;\n\t/** Batch size before auto-flush. Default: `1000`. */\n\tbatchSize?: number;\n\t/** Flush interval in ms. Default: `10000`. */\n\tflushIntervalMs?: number;\n\t/** Transform value before serialization. Default: identity. */\n\ttransform?: (value: T) => unknown;\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * S3 object storage sink — buffers values and uploads as NDJSON or JSON objects.\n *\n * @param source - Upstream node.\n * @param client - S3-compatible client with `putObject()`.\n * @param bucket - S3 bucket name.\n * @param opts - Format, key generation, batching options.\n * @returns `BufferedSinkHandle`.\n *\n * @category extra\n */\nexport function toS3<T>(\n\tsource: Node<T>,\n\tclient: S3ClientLike,\n\tbucket: string,\n\topts?: ToS3Options<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tformat = \"ndjson\",\n\t\tkeyGenerator = (seq: number, timestampNs: number) => {\n\t\t\tconst ms = Math.floor(timestampNs / 1_000_000);\n\t\t\tconst ts = new Date(ms).toISOString().replace(/[:.]/g, \"-\");\n\t\t\treturn `data/${ts}-${seq}.${format === \"ndjson\" ? \"ndjson\" : \"json\"}`;\n\t\t},\n\t\tbatchSize = 1000,\n\t\tflushIntervalMs = 10000,\n\t\ttransform = (v: T) => v,\n\t\tonTransportError,\n\t} = opts ?? {};\n\n\tconst contentType = format === \"ndjson\" ? \"application/x-ndjson\" : \"application/json\";\n\tlet seq = 0;\n\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tbatchSize,\n\t\tflushIntervalMs,\n\t\tserialize: transform,\n\t\tsendBatch: async (batch) => {\n\t\t\tseq += 1;\n\t\t\tconst body =\n\t\t\t\tformat === \"ndjson\"\n\t\t\t\t\t? `${batch.map((v) => JSON.stringify(v)).join(\"\\n\")}\\n`\n\t\t\t\t\t: JSON.stringify(batch);\n\t\t\tconst key = keyGenerator(seq, wallClockNs());\n\t\t\tawait client.putObject({ Bucket: bucket, Key: key, Body: body, ContentType: contentType });\n\t\t},\n\t});\n}\n","/**\n * Grafana Tempo sink IO — `toTempo` pushes upstream `DATA` values as trace\n * spans (OTLP/HTTP shape) via the duck-typed {@link TempoClientLike}.\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport type { ExtraOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** Duck-typed Tempo span push client (OTLP/HTTP shape). */\nexport type TempoClientLike = {\n\tpush(payload: { resourceSpans: unknown[] }): Promise<unknown>;\n};\n\n/** Options for {@link toTempo}. */\nexport type ToTempoOptions<T> = ExtraOpts & {\n\t/** Transform a value into OTLP resourceSpans entries. */\n\ttoResourceSpans?: (value: T) => unknown[];\n\tonTransportError?: (err: SinkTransportError) => void;\n};\n\n/**\n * Grafana Tempo sink — pushes upstream `DATA` values as trace spans.\n *\n * @param source - Upstream node.\n * @param client - Tempo-compatible client with `push()`.\n * @param opts - Span transform and error options.\n * @returns Unsubscribe function.\n *\n * @category extra\n */\nexport function toTempo<T>(\n\tsource: Node<T>,\n\tclient: TempoClientLike,\n\topts?: ToTempoOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst { toResourceSpans = (v: T) => [v], onTransportError } = opts ?? {};\n\treturn reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tserialize: toResourceSpans,\n\t\tsend: async (spans) => {\n\t\t\tawait client.push({ resourceSpans: spans as unknown[] });\n\t\t},\n\t});\n}\n","/**\n * Webhook IO — `fromWebhook` is a thin wrapper over `externalProducer` that\n * exposes the standard `EmitTriad` (`emit` / `error` / `complete`) callback\n * shape to the caller's framework integration (Express, Fastify, Hono,\n * Cloudflare Workers, etc.).\n */\n\nimport type { Node } from \"@graphrefly/pure-ts/core\";\nimport {\n\ttype EmitTriad,\n\ttype ExternalRegister,\n\texternalProducer,\n} from \"../composition/external-register.js\";\nimport type { ExtraOpts } from \"./_internal.js\";\n\n/** Registration callback for {@link fromWebhook}. Alias of {@link ExternalRegister} over {@link EmitTriad}. */\nexport type WebhookRegister<T> = ExternalRegister<EmitTriad<T>>;\n\n/**\n * Bridges HTTP webhook callbacks into a GraphReFly source.\n *\n * The `register` callback wires your runtime/framework callback to GraphReFly and may return a\n * cleanup function. This keeps the adapter runtime-agnostic while following the same producer\n * pattern as {@link fromEvent}.\n *\n * @param register - Registers webhook handlers (`emit`, `error`, `complete`) and optionally returns cleanup.\n * @param opts - Optional producer options.\n * @returns `Node<T>` — webhook payloads as `DATA`; teardown runs returned cleanup.\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * type HookPayload = { event: string; data: unknown };\n * const app = express();\n * app.use(express.json());\n *\n * const hook$ = fromWebhook<HookPayload>(({ emit, error }) => {\n * const handler = (req: express.Request, res: express.Response) => {\n * try {\n * emit(req.body as HookPayload);\n * res.status(200).send(\"ok\");\n * } catch (e) {\n * error(e);\n * res.status(500).send(\"error\");\n * }\n * };\n * app.post(\"/webhook\", handler);\n * return () => {\n * // Express has no direct route-removal API in common use.\n * };\n * });\n * ```\n *\n * @example Fastify\n * ```ts\n * import Fastify from \"fastify\";\n * import { fromWebhook } from \"@graphrefly/graphrefly-ts\";\n *\n * const fastify = Fastify();\n * const hook$ = fromWebhook<any>(({ emit, error }) => {\n * const handler = async (req: any, reply: any) => {\n * try {\n * emit(req.body);\n * reply.code(200).send({ ok: true });\n * } catch (e) {\n * error(e);\n * reply.code(500).send({ ok: false });\n * }\n * };\n * fastify.post(\"/webhook\", handler);\n * return () => {};\n * });\n * ```\n *\n * @category extra\n */\nexport function fromWebhook<T = unknown>(register: WebhookRegister<T>, opts?: ExtraOpts): Node<T> {\n\treturn externalProducer<T>(register, opts);\n}\n","/**\n * WebSocket IO — `fromWebSocket` (DOM-style `WebSocketLike` source / register\n * variant), `toWebSocket` (sink with optional ack-tracking + retry),\n * `fromWebSocketReconnect` (`fromWebSocket` wrapped in retry-on-disconnect with\n * exponential backoff).\n */\n\nimport { COMPLETE, ERROR, type Message, type Node, node } from \"@graphrefly/pure-ts/core\";\nimport { retry } from \"../resilience/retry.js\";\nimport { type ExtraOpts, sourceOpts } from \"./_internal.js\";\nimport { type ReactiveSinkHandle, reactiveSink, type SinkTransportError } from \"./_sink.js\";\n\n/** WebSocket-like transport accepted by {@link fromWebSocket} / {@link toWebSocket}. */\nexport type WebSocketLike = {\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n\tclose(code?: number, reason?: string): void;\n\taddEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n\tremoveEventListener(type: \"message\" | \"error\" | \"close\", listener: (ev: unknown) => void): void;\n};\n\nexport type WebSocketMessageEventLike = { data: unknown };\nexport type WebSocketRegister<T> = (\n\temit: (payload: T) => void,\n\terror: (err: unknown) => void,\n\tcomplete: () => void,\n) => () => void;\n\n/**\n * Wraps a WebSocket as a GraphReFly producer source.\n *\n * Incoming socket messages are emitted as `DATA`; socket `error` emits `ERROR`; socket `close`\n * emits `COMPLETE`. Teardown detaches listeners and optionally closes the socket.\n *\n * @category extra\n */\nexport function fromWebSocket<T = unknown>(\n\tsocket: WebSocketLike,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tregister: WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T>;\nexport function fromWebSocket<T = unknown>(\n\tsocketOrRegister: WebSocketLike | WebSocketRegister<T>,\n\topts?: ExtraOpts & {\n\t\tparse?: (payload: unknown, event: unknown) => T;\n\t\tcloseOnTeardown?: boolean;\n\t},\n): Node<T> {\n\tconst { parse, closeOnTeardown = false, ...rest } = opts ?? {};\n\treturn node<T>(\n\t\t[],\n\t\t(_data, a) => {\n\t\t\tlet active = true;\n\t\t\tlet cleanup: (() => void) | undefined;\n\t\t\tconst runCleanup = () => {\n\t\t\t\tconst fn = cleanup;\n\t\t\t\tcleanup = undefined;\n\t\t\t\tfn?.();\n\t\t\t};\n\t\t\tconst terminate = (message: Message) => {\n\t\t\t\tif (!active) return;\n\t\t\t\tactive = false;\n\t\t\t\ta.down([message]);\n\t\t\t\trunCleanup();\n\t\t\t};\n\t\t\tconst emit = (raw: unknown, event: unknown = raw) => {\n\t\t\t\tif (!active) return;\n\t\t\t\ttry {\n\t\t\t\t\tconst payload =\n\t\t\t\t\t\traw !== null && typeof raw === \"object\" && \"data\" in (raw as Record<string, unknown>)\n\t\t\t\t\t\t\t? (raw as WebSocketMessageEventLike).data\n\t\t\t\t\t\t\t: raw;\n\t\t\t\t\tconst parsed = parse ? parse(payload, event) : (payload as T);\n\t\t\t\t\ta.emit(parsed);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tterminate([ERROR, err]);\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst error = (err: unknown) => {\n\t\t\t\tterminate([ERROR, err]);\n\t\t\t};\n\t\t\tconst complete = () => {\n\t\t\t\tterminate([COMPLETE]);\n\t\t\t};\n\t\t\tif (typeof socketOrRegister === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tcleanup = socketOrRegister(emit, error, complete);\n\t\t\t\t\tif (typeof cleanup !== \"function\") {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"fromWebSocket register contract violation: register must return cleanup callable\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tterminate([ERROR, err]);\n\t\t\t\t}\n\t\t\t\treturn () => {\n\t\t\t\t\tactive = false;\n\t\t\t\t\trunCleanup();\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst ws = socketOrRegister;\n\t\t\tconst onMessage = (event: unknown) => emit(event, event);\n\t\t\tconst onError = (event: unknown) => error(event);\n\t\t\tconst onClose = () => complete();\n\t\t\tws.addEventListener(\"message\", onMessage);\n\t\t\tws.addEventListener(\"error\", onError);\n\t\t\tws.addEventListener(\"close\", onClose);\n\t\t\tcleanup = () => {\n\t\t\t\tws.removeEventListener(\"message\", onMessage);\n\t\t\t\tws.removeEventListener(\"error\", onError);\n\t\t\t\tws.removeEventListener(\"close\", onClose);\n\t\t\t\tif (closeOnTeardown) ws.close();\n\t\t\t};\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\trunCleanup();\n\t\t\t};\n\t\t},\n\t\tsourceOpts(rest),\n\t);\n}\n\n/** Options for {@link toWebSocket}. */\nexport type ToWebSocketOptions<T> = {\n\t/** Serialize DATA payloads before `socket.send(...)`. */\n\tserialize?: (value: T) => string | ArrayBufferLike | Blob | ArrayBufferView;\n\t/** Close socket when upstream emits COMPLETE. Default: `true`. */\n\tcloseOnComplete?: boolean;\n\t/** Close socket when upstream emits ERROR. Default: `true`. */\n\tcloseOnError?: boolean;\n\t/** Optional close code used when close is triggered by terminal tuples. */\n\tcloseCode?: number;\n\t/** Optional close reason used when close is triggered by terminal tuples. */\n\tcloseReason?: string;\n\t/** Structured callback — uses the unified {@link SinkTransportError} shape. */\n\tonTransportError?: (event: SinkTransportError) => void;\n\t/** Retry configuration — passed through to {@link reactiveSink}. */\n\tretry?: ReactiveSinkHandle<T> extends infer _\n\t\t? Parameters<typeof reactiveSink<T>>[1][\"retry\"]\n\t\t: never;\n\t/** Backpressure configuration — passed through to {@link reactiveSink}. */\n\tbackpressure?: Parameters<typeof reactiveSink<T>>[1][\"backpressure\"];\n\t/** Reactive stop signal — when it emits any DATA / terminal, the sink tears down. */\n\tstopOn?: Node<unknown>;\n};\n\n/**\n * Forwards upstream `DATA` payloads to a WebSocket via `send`.\n *\n * Returns a {@link ReactiveSinkHandle} — every transport outcome (including\n * socket `close` events) surfaces on the `errors` / `failed` / `sent` /\n * `inFlight` companions.\n *\n * @category extra\n */\nexport function toWebSocket<T>(\n\tsource: Node<T>,\n\tsocket: WebSocketLike,\n\topts?: ToWebSocketOptions<T>,\n): ReactiveSinkHandle<T> {\n\tconst {\n\t\tserialize = (value: T) => {\n\t\t\tif (\n\t\t\t\ttypeof value === \"string\" ||\n\t\t\t\tvalue instanceof Blob ||\n\t\t\t\tvalue instanceof ArrayBuffer ||\n\t\t\t\tArrayBuffer.isView(value)\n\t\t\t) {\n\t\t\t\treturn value as string | ArrayBufferLike | Blob | ArrayBufferView;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(value);\n\t\t\t} catch {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t},\n\t\tcloseOnComplete = true,\n\t\tcloseOnError = true,\n\t\tcloseCode,\n\t\tcloseReason,\n\t\tonTransportError,\n\t\tretry: retryOpt,\n\t\tbackpressure,\n\t\tstopOn,\n\t} = opts ?? {};\n\n\tlet socketClosed = false;\n\tconst closeSocket = (trigger?: Message) => {\n\t\tif (socketClosed) return;\n\t\tsocketClosed = true;\n\t\ttry {\n\t\t\tsocket.close(closeCode, closeReason);\n\t\t} catch (err) {\n\t\t\tconst error = err instanceof Error ? err : new Error(String(err));\n\t\t\ttry {\n\t\t\t\tonTransportError?.({ stage: \"close\", error, value: undefined, message: trigger });\n\t\t\t} catch {\n\t\t\t\t/* user hook must not escape */\n\t\t\t}\n\t\t}\n\t};\n\n\t// External close listener — installed before sink construction so we can\n\t// pass its cleanup via reactiveSink's `onDispose` hook. That hook fires on\n\t// any teardown path (user `.dispose()`, `stopOn` signal, upstream\n\t// terminal) — guaranteeing the listener is removed even when the reactive\n\t// sink's internal dispose fires without going through a wrapper.\n\tlet externalCloseHandler: ((ev: unknown) => void) | null = null;\n\tconst removeExternalCloseHandler = () => {\n\t\tif (externalCloseHandler) {\n\t\t\ttry {\n\t\t\t\tsocket.removeEventListener(\"close\", externalCloseHandler);\n\t\t\t} catch {\n\t\t\t\t/* removeEventListener may throw on some environments when socket is dead */\n\t\t\t}\n\t\t\texternalCloseHandler = null;\n\t\t}\n\t};\n\n\tconst handle = reactiveSink<T>(source, {\n\t\tonTransportError,\n\t\tserialize: (value) => {\n\t\t\tconst s = serialize(value);\n\t\t\tif (s === undefined) {\n\t\t\t\tthrow new Error(\"serialize returned undefined\");\n\t\t\t}\n\t\t\treturn s;\n\t\t},\n\t\tretry: retryOpt,\n\t\tbackpressure,\n\t\tstopOn,\n\t\tonDispose: removeExternalCloseHandler,\n\t\tsend: (payload) => {\n\t\t\tsocket.send(payload as string | ArrayBufferLike | Blob | ArrayBufferView);\n\t\t},\n\t\tonUpstreamMessage: (msg) => {\n\t\t\tif (msg[0] === COMPLETE && closeOnComplete) closeSocket(msg);\n\t\t\telse if (msg[0] === ERROR && closeOnError) closeSocket(msg);\n\t\t},\n\t});\n\n\t// Listen for external socket `close` events to tear the sink down.\n\texternalCloseHandler = () => {\n\t\tsocketClosed = true;\n\t\thandle.dispose();\n\t};\n\tsocket.addEventListener(\"close\", externalCloseHandler);\n\treturn handle;\n}\n\n/** Options for {@link fromWebSocketReconnect}. */\nexport type FromWebSocketReconnectOptions<T> = ExtraOpts & {\n\t/** Optional parser applied to incoming messages. */\n\tparse?: (payload: unknown, event: unknown) => T;\n\t/** Max reconnect attempts. Default: `Infinity` (implied when `backoff` is set). */\n\tmaxRetries?: number;\n\t/** Backoff strategy (ns) or preset name. Default: `\"exponential\"`. */\n\tbackoff?: Parameters<typeof retry>[1] extends infer O\n\t\t? O extends { backoff?: infer B }\n\t\t\t? B\n\t\t\t: never\n\t\t: never;\n\t/** Close the socket on teardown. Default: `true`. */\n\tcloseOnTeardown?: boolean;\n};\n\n/**\n * Reconnecting WebSocket source — each connection attempt calls `factory` to\n * obtain a fresh {@link WebSocketLike}; on `close` (treated as terminal\n * `COMPLETE`), {@link retry} rebuilds the inner source and reconnects.\n *\n * For transient errors, {@link retry} retries with the configured\n * backoff. On `maxRetries` exhaustion, terminal `ERROR` propagates.\n *\n * @param factory - Invoked per reconnect to create a fresh WebSocket.\n * @param opts - Parse, retry, and close options.\n *\n * @example\n * ```ts\n * import { fromWebSocketReconnect } from \"@graphrefly/graphrefly-ts\";\n * const ws$ = fromWebSocketReconnect(\n * () => new WebSocket(\"wss://example/stream\"),\n * { backoff: \"exponential\", maxRetries: 10 },\n * );\n * ```\n *\n * @category extra\n */\nexport function fromWebSocketReconnect<T = unknown>(\n\tfactory: () => WebSocketLike,\n\topts?: FromWebSocketReconnectOptions<T>,\n): Node<T> {\n\tconst {\n\t\tparse,\n\t\tmaxRetries,\n\t\tbackoff = \"exponential\",\n\t\tcloseOnTeardown = true,\n\t\t...rest\n\t} = opts ?? {};\n\treturn retry<T>(\n\t\t() =>\n\t\t\tfromWebSocket<T>(factory(), {\n\t\t\t\tparse,\n\t\t\t\tcloseOnTeardown,\n\t\t\t\t...rest,\n\t\t\t}),\n\t\t{ count: maxRetries, backoff },\n\t).node;\n}\n"],"mappings":"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","names":["COMPLETE","ERROR","node","node","COMPLETE","ERROR","COMPLETE","ERROR","node","COMPLETE","DATA","ERROR","node","wallClockNs","fromTimer","switchMap","COMPLETE","ERROR","node","out","retry","node","p","COMPLETE","ERROR","node","ERROR","DATA","wallClockNs","COMPLETE","retry","switchMap","fromTimer","ERROR","node","wallClockNs","node","wallClockNs","ERROR","COMPLETE","ERROR","node","COMPLETE","ERROR","node","wallClockNs","node","wallClockNs","COMPLETE","ERROR","COMPLETE","ERROR","node","node","ERROR","COMPLETE","batch","batch","COMPLETE","ERROR","node","COMPLETE","ERROR","node","wallClockNs","fromTimer","switchMap","switchMap","fromTimer","node","COMPLETE","ERROR","wallClockNs","ERROR","node","wallClockNs","node","wallClockNs","ERROR","ERROR","node","wallClockNs","node","ERROR","wallClockNs","ERROR","node","wallClockNs","node","wallClockNs","ERROR","batch","COMPLETE","DATA","defaultConfig","ERROR","node","TEARDOWN","node","COMPLETE","ERROR","batch","DATA","defaultConfig","TEARDOWN","wallClockNs","wallClockNs","wallClockNs","wallClockNs","batch","wallClockNs","wallClockNs","wallClockNs","seq","batch","wallClockNs","COMPLETE","ERROR","node","node","ERROR","COMPLETE"]}