@graphrefly/graphrefly 0.27.0 → 0.29.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 (428) hide show
  1. package/dist/backoff-HPZMEZNF.js +1 -0
  2. package/dist/cascading-Bp99ckMJ.d.ts +180 -0
  3. package/dist/cascading-CcAgRacD.d.cts +180 -0
  4. package/dist/chunk-22F4K3G7.js +1 -0
  5. package/dist/chunk-22SVXUPB.js +64 -0
  6. package/dist/chunk-2GQREQ6C.js +1 -0
  7. package/dist/chunk-3JXNEPCD.js +2 -0
  8. package/dist/chunk-4JJCCD5S.js +2 -0
  9. package/dist/chunk-4OFIQ66T.js +1 -0
  10. package/dist/chunk-4V4C7K56.js +1 -0
  11. package/dist/chunk-4VVTGLXJ.js +1 -0
  12. package/dist/chunk-567NWZ3T.js +1 -0
  13. package/dist/chunk-5JDE5JHE.js +1 -0
  14. package/dist/chunk-5QDBSZBV.js +1 -0
  15. package/dist/chunk-5Z4HDCO6.js +1 -0
  16. package/dist/chunk-63FFOHLA.js +1 -0
  17. package/dist/chunk-6QZNQS5B.js +1 -0
  18. package/dist/chunk-7JDLFI6N.js +1 -0
  19. package/dist/chunk-7TDOES3L.js +1 -0
  20. package/dist/chunk-A7IAQQ63.js +1 -0
  21. package/dist/chunk-AMG5VBHW.js +1 -0
  22. package/dist/chunk-AUY2YKCO.js +1 -0
  23. package/dist/chunk-AV3PIDFQ.js +1 -0
  24. package/dist/chunk-BA5URFYW.js +1 -0
  25. package/dist/chunk-BKPLTBL5.js +1 -0
  26. package/dist/chunk-BZP5T4X6.js +1 -0
  27. package/dist/chunk-CK2E7BTU.js +1 -0
  28. package/dist/chunk-CSJE2EKV.js +1 -0
  29. package/dist/chunk-E3AXATVZ.js +9 -0
  30. package/dist/chunk-ESMPEKEV.js +1 -0
  31. package/dist/chunk-GJR3P6JG.js +1 -0
  32. package/dist/chunk-GNCBXARM.js +1 -0
  33. package/dist/chunk-GPW2V3RE.js +1 -0
  34. package/dist/chunk-HSIEYSDY.js +1 -0
  35. package/dist/chunk-I6VIH3VA.js +1 -0
  36. package/dist/chunk-ISCENNXS.js +1 -0
  37. package/dist/chunk-JYOUF6UQ.js +1 -0
  38. package/dist/chunk-KASHOCF5.js +1 -0
  39. package/dist/chunk-LGSNR4LU.js +5 -0
  40. package/dist/chunk-LVGBLZM2.js +1 -0
  41. package/dist/chunk-MGKAO4EK.js +7 -0
  42. package/dist/chunk-NSG4C6BF.js +23 -0
  43. package/dist/chunk-OL33ZI6R.js +1 -0
  44. package/dist/chunk-PCZ35NXD.js +78 -0
  45. package/dist/chunk-PGMUCUHG.js +43 -0
  46. package/dist/chunk-QYADASLV.js +1 -0
  47. package/dist/chunk-RD52SNH2.js +1 -0
  48. package/dist/chunk-SLMYTGTU.js +1 -0
  49. package/dist/chunk-TWMEGG45.js +1 -0
  50. package/dist/chunk-UVJQ35G2.js +1 -0
  51. package/dist/chunk-VGTCGNRX.js +18 -0
  52. package/dist/chunk-VIMF6LGM.js +1 -0
  53. package/dist/chunk-VJLMUKOI.js +1 -0
  54. package/dist/chunk-VWPRPPKR.js +1 -0
  55. package/dist/chunk-W4TSQ6RJ.js +1 -0
  56. package/dist/chunk-WM7H7WTY.js +3 -0
  57. package/dist/chunk-Y32RJO24.js +1 -0
  58. package/dist/chunk-Y53B6NS4.js +1 -0
  59. package/dist/compat/index.cjs +15 -7656
  60. package/dist/compat/index.d.cts +15 -14
  61. package/dist/compat/index.d.ts +15 -14
  62. package/dist/compat/index.js +1 -50
  63. package/dist/compat/jotai/index.cjs +1 -2048
  64. package/dist/compat/jotai/index.d.cts +2 -2
  65. package/dist/compat/jotai/index.d.ts +2 -2
  66. package/dist/compat/jotai/index.js +1 -9
  67. package/dist/compat/nanostores/index.cjs +1 -2175
  68. package/dist/compat/nanostores/index.d.cts +2 -2
  69. package/dist/compat/nanostores/index.d.ts +2 -2
  70. package/dist/compat/nanostores/index.js +1 -23
  71. package/dist/compat/nestjs/index.cjs +15 -6782
  72. package/dist/compat/nestjs/index.d.cts +7 -6
  73. package/dist/compat/nestjs/index.d.ts +7 -6
  74. package/dist/compat/nestjs/index.js +1 -83
  75. package/dist/compat/react/index.cjs +1 -141
  76. package/dist/compat/react/index.d.cts +2 -2
  77. package/dist/compat/react/index.d.ts +2 -2
  78. package/dist/compat/react/index.js +1 -12
  79. package/dist/compat/solid/index.cjs +1 -128
  80. package/dist/compat/solid/index.d.cts +2 -2
  81. package/dist/compat/solid/index.d.ts +2 -2
  82. package/dist/compat/solid/index.js +1 -12
  83. package/dist/compat/svelte/index.cjs +1 -131
  84. package/dist/compat/svelte/index.d.cts +2 -2
  85. package/dist/compat/svelte/index.d.ts +2 -2
  86. package/dist/compat/svelte/index.js +1 -12
  87. package/dist/compat/vue/index.cjs +1 -146
  88. package/dist/compat/vue/index.d.cts +2 -2
  89. package/dist/compat/vue/index.d.ts +2 -2
  90. package/dist/compat/vue/index.js +1 -12
  91. package/dist/compat/zustand/index.cjs +7 -4931
  92. package/dist/compat/zustand/index.d.cts +5 -5
  93. package/dist/compat/zustand/index.d.ts +5 -5
  94. package/dist/compat/zustand/index.js +1 -12
  95. package/dist/composite-BL-llbnE.d.ts +69 -0
  96. package/dist/composite-Dze--DaA.d.cts +69 -0
  97. package/dist/core/index.cjs +1 -2271
  98. package/dist/core/index.d.cts +4 -4
  99. package/dist/core/index.d.ts +4 -4
  100. package/dist/core/index.js +1 -110
  101. package/dist/extra/browser.cjs +1 -0
  102. package/dist/extra/browser.d.cts +3 -0
  103. package/dist/extra/browser.d.ts +3 -0
  104. package/dist/extra/browser.js +1 -0
  105. package/dist/extra/index.cjs +24 -9971
  106. package/dist/extra/index.d.cts +13 -6
  107. package/dist/extra/index.d.ts +13 -6
  108. package/dist/extra/index.js +1 -381
  109. package/dist/extra/node.cjs +3 -0
  110. package/dist/extra/node.d.cts +81 -0
  111. package/dist/extra/node.d.ts +81 -0
  112. package/dist/extra/node.js +2 -0
  113. package/dist/extra/operators.cjs +1 -0
  114. package/dist/extra/operators.d.cts +910 -0
  115. package/dist/extra/operators.d.ts +910 -0
  116. package/dist/extra/operators.js +1 -0
  117. package/dist/extra/reactive.cjs +1 -0
  118. package/dist/extra/reactive.d.cts +352 -0
  119. package/dist/extra/reactive.d.ts +352 -0
  120. package/dist/extra/reactive.js +1 -0
  121. package/dist/extra/sources.cjs +1 -2486
  122. package/dist/extra/sources.d.cts +6 -2
  123. package/dist/extra/sources.d.ts +6 -2
  124. package/dist/extra/sources.js +1 -57
  125. package/dist/extra/storage-browser.cjs +1 -0
  126. package/dist/extra/storage-browser.d.cts +71 -0
  127. package/dist/extra/storage-browser.d.ts +71 -0
  128. package/dist/extra/storage-browser.js +1 -0
  129. package/dist/extra/storage-core.cjs +1 -0
  130. package/dist/extra/storage-core.d.cts +98 -0
  131. package/dist/extra/storage-core.d.ts +98 -0
  132. package/dist/extra/storage-core.js +1 -0
  133. package/dist/extra/storage-node.cjs +2 -0
  134. package/dist/extra/storage-node.d.cts +60 -0
  135. package/dist/extra/storage-node.d.ts +60 -0
  136. package/dist/extra/storage-node.js +1 -0
  137. package/dist/fallback-BaTS7vVY.d.cts +258 -0
  138. package/dist/fallback-eOm3LNxP.d.ts +258 -0
  139. package/dist/graph/index.cjs +7 -5030
  140. package/dist/graph/index.d.cts +6 -5
  141. package/dist/graph/index.d.ts +6 -5
  142. package/dist/graph/index.js +1 -50
  143. package/dist/{graph-DNCrvZSn.d.cts → graph-DgohqXK-.d.cts} +151 -32
  144. package/dist/{graph-CCwGKLCm.d.ts → graph-Qjg9gWHI.d.ts} +151 -32
  145. package/dist/{index-BwfLUNw4.d.ts → index-2BVuRCI4.d.ts} +173 -2040
  146. package/dist/{index-BPVt8kqc.d.ts → index-2NvguqQA.d.ts} +10 -195
  147. package/dist/index-A65LZhoM.d.ts +186 -0
  148. package/dist/{index-DlLp-2Xn.d.cts → index-B-8FCEua.d.cts} +10 -195
  149. package/dist/index-B-gqvYel.d.ts +135 -0
  150. package/dist/index-B2PRuolf.d.cts +86 -0
  151. package/dist/index-BJqt9EwW.d.ts +231 -0
  152. package/dist/{index-BHlKbUwO.d.cts → index-BKjT5DiZ.d.cts} +173 -2040
  153. package/dist/{index-C0svESO4.d.ts → index-BM8BU4q6.d.ts} +1 -1
  154. package/dist/{index-VdHQMPy1.d.ts → index-BQaEnxBf.d.ts} +1 -1
  155. package/dist/index-BSfwiy5B.d.ts +192 -0
  156. package/dist/index-BTSkeCZs.d.cts +291 -0
  157. package/dist/index-BUVtw1Ay.d.cts +186 -0
  158. package/dist/index-BUi57v_p.d.ts +163 -0
  159. package/dist/{messaging-Gt4LPbyA.d.cts → index-BanNUILp.d.cts} +31 -93
  160. package/dist/{audit-DRlSzBu9.d.ts → index-BayHDRx6.d.cts} +27 -21
  161. package/dist/{index-B6D3QNSA.d.ts → index-BiyjsZ0m.d.ts} +148 -20
  162. package/dist/index-BqZ6vB2A.d.ts +2057 -0
  163. package/dist/{memory-li6FL5RM.d.ts → index-BuVidq3D.d.cts} +26 -26
  164. package/dist/index-Byh-xTyp.d.ts +105 -0
  165. package/dist/index-C08QPDcV.d.cts +321 -0
  166. package/dist/{demo-shell-BDkOptd6.d.ts → index-C66RJiX8.d.ts} +14 -14
  167. package/dist/index-C8RfjffH.d.ts +291 -0
  168. package/dist/index-CA1Cu7Ud.d.ts +873 -0
  169. package/dist/{index-ByQxazQJ.d.cts → index-CABbltIu.d.cts} +1 -1
  170. package/dist/{index-VHqptjhu.d.cts → index-CHEBsnYv.d.cts} +1 -1
  171. package/dist/{index-BuEoe-Qu.d.ts → index-CI0yDnLp.d.ts} +9 -9
  172. package/dist/{index-B9B7_HEY.d.ts → index-CJ45TW-h.d.ts} +1 -1
  173. package/dist/{index-CO8uBlUh.d.cts → index-CJZKZoo4.d.cts} +148 -20
  174. package/dist/{index-wEn0eFe8.d.ts → index-CX2tFJL1.d.ts} +1 -1
  175. package/dist/{index-BaSM3aYt.d.ts → index-CcWOJ6F0.d.ts} +3 -3
  176. package/dist/{audit-ClmqGOCx.d.cts → index-CiaVoZGo.d.ts} +27 -21
  177. package/dist/{index-Dzk2hrlR.d.ts → index-Ct5CWc4E.d.ts} +1 -1
  178. package/dist/index-D38duMCv.d.cts +357 -0
  179. package/dist/{index-C8oil6M6.d.ts → index-D5XJ2tSx.d.ts} +30 -6
  180. package/dist/{index-DO_6JN9Z.d.cts → index-D80do5jX.d.cts} +1 -1
  181. package/dist/index-D9HKAH_-.d.cts +231 -0
  182. package/dist/index-DBe_8XW5.d.cts +143 -0
  183. package/dist/{memory-C6Z2tGpC.d.cts → index-DCeTyFlB.d.ts} +26 -26
  184. package/dist/index-DDy8eeXS.d.ts +321 -0
  185. package/dist/index-DJ5oNBc8.d.ts +143 -0
  186. package/dist/{index-CI3DprxP.d.cts → index-DP0_O3ls.d.cts} +30 -6
  187. package/dist/{demo-shell-Crid1WdR.d.cts → index-DX8xS-yB.d.cts} +14 -14
  188. package/dist/index-DiZejfCI.d.cts +2057 -0
  189. package/dist/index-DknyJ2Fu.d.cts +163 -0
  190. package/dist/index-DoWMs-Kk.d.cts +135 -0
  191. package/dist/{messaging-XDoYablx.d.ts → index-DuB5aO4-.d.ts} +31 -93
  192. package/dist/index-DwjJGKxV.d.ts +357 -0
  193. package/dist/{index-B6EhDnjH.d.cts → index-H_oxVec5.d.cts} +1 -1
  194. package/dist/{index-3lsddbbS.d.ts → index-IMAHq-ia.d.ts} +1 -1
  195. package/dist/{index-B1tloyhO.d.cts → index-U1nir7MX.d.cts} +1 -1
  196. package/dist/index-Vg7tORgk.d.ts +86 -0
  197. package/dist/index-dig-r2tQ.d.cts +873 -0
  198. package/dist/{index-CxFrXH4m.d.ts → index-gsT79Xu9.d.ts} +1 -1
  199. package/dist/{index-D8wS_PeY.d.cts → index-i99Ka8s7.d.cts} +9 -9
  200. package/dist/index-iKkyJosF.d.cts +105 -0
  201. package/dist/{index-Xi3u0HCQ.d.cts → index-jleeotBT.d.cts} +1 -1
  202. package/dist/{index-DVGiGFGT.d.cts → index-kykKWwV-.d.cts} +3 -3
  203. package/dist/index-vgcLF5TH.d.cts +192 -0
  204. package/dist/{index-DYme44FM.d.cts → index-y1RllPn4.d.cts} +1 -1
  205. package/dist/index.cjs +151 -24142
  206. package/dist/index.d.cts +69 -2099
  207. package/dist/index.d.ts +69 -2099
  208. package/dist/index.js +1 -3868
  209. package/dist/{meta-CbznRPYJ.d.ts → meta-CX7YsOzp.d.cts} +5 -5
  210. package/dist/{meta-BxCA7rcr.d.cts → meta-CckhhFRd.d.ts} +5 -5
  211. package/dist/{node-BmerH3kS.d.cts → node-Dd6wHSib.d.cts} +71 -11
  212. package/dist/{node-BmerH3kS.d.ts → node-Dd6wHSib.d.ts} +71 -11
  213. package/dist/{observable-BgGUwcqp.d.ts → observable-BZJgo616.d.ts} +1 -1
  214. package/dist/{observable-DJt_AxzQ.d.cts → observable-kwzpLvbi.d.cts} +1 -1
  215. package/dist/patterns/ai/browser.cjs +25 -0
  216. package/dist/patterns/ai/browser.d.cts +127 -0
  217. package/dist/patterns/ai/browser.d.ts +127 -0
  218. package/dist/patterns/ai/browser.js +3 -0
  219. package/dist/patterns/ai/index.cjs +92 -0
  220. package/dist/patterns/ai/index.d.cts +17 -0
  221. package/dist/patterns/ai/index.d.ts +17 -0
  222. package/dist/patterns/ai/index.js +1 -0
  223. package/dist/patterns/ai/node.cjs +2 -0
  224. package/dist/patterns/ai/node.d.cts +58 -0
  225. package/dist/patterns/ai/node.d.ts +58 -0
  226. package/dist/patterns/ai/node.js +1 -0
  227. package/dist/patterns/audit/index.cjs +7 -0
  228. package/dist/patterns/audit/index.d.cts +6 -0
  229. package/dist/patterns/audit/index.d.ts +6 -0
  230. package/dist/patterns/audit/index.js +1 -0
  231. package/dist/patterns/cqrs/index.cjs +7 -0
  232. package/dist/patterns/cqrs/index.d.cts +5 -0
  233. package/dist/patterns/cqrs/index.d.ts +5 -0
  234. package/dist/patterns/cqrs/index.js +1 -0
  235. package/dist/patterns/demo-shell/index.cjs +8 -0
  236. package/dist/patterns/demo-shell/index.d.cts +6 -0
  237. package/dist/patterns/demo-shell/index.d.ts +6 -0
  238. package/dist/patterns/demo-shell/index.js +1 -0
  239. package/dist/patterns/domain-templates/index.cjs +7 -0
  240. package/dist/patterns/domain-templates/index.d.cts +5 -0
  241. package/dist/patterns/domain-templates/index.d.ts +5 -0
  242. package/dist/patterns/domain-templates/index.js +1 -0
  243. package/dist/patterns/graphspec/index.cjs +84 -0
  244. package/dist/patterns/graphspec/index.d.cts +7 -0
  245. package/dist/patterns/graphspec/index.d.ts +7 -0
  246. package/dist/patterns/graphspec/index.js +1 -0
  247. package/dist/patterns/guarded-execution/index.cjs +7 -0
  248. package/dist/patterns/guarded-execution/index.d.cts +7 -0
  249. package/dist/patterns/guarded-execution/index.d.ts +7 -0
  250. package/dist/patterns/guarded-execution/index.js +1 -0
  251. package/dist/patterns/harness/index.cjs +49 -0
  252. package/dist/patterns/harness/index.d.cts +11 -0
  253. package/dist/patterns/harness/index.d.ts +11 -0
  254. package/dist/patterns/harness/index.js +1 -0
  255. package/dist/patterns/job-queue/index.cjs +7 -0
  256. package/dist/patterns/job-queue/index.d.cts +5 -0
  257. package/dist/patterns/job-queue/index.d.ts +5 -0
  258. package/dist/patterns/job-queue/index.js +1 -0
  259. package/dist/patterns/lens/index.cjs +7 -0
  260. package/dist/patterns/lens/index.d.cts +7 -0
  261. package/dist/patterns/lens/index.d.ts +7 -0
  262. package/dist/patterns/lens/index.js +1 -0
  263. package/dist/patterns/memory/index.cjs +7 -0
  264. package/dist/patterns/memory/index.d.cts +5 -0
  265. package/dist/patterns/memory/index.d.ts +5 -0
  266. package/dist/patterns/memory/index.js +1 -0
  267. package/dist/patterns/messaging/index.cjs +7 -0
  268. package/dist/patterns/messaging/index.d.cts +5 -0
  269. package/dist/patterns/messaging/index.d.ts +5 -0
  270. package/dist/patterns/messaging/index.js +1 -0
  271. package/dist/patterns/orchestration/index.cjs +7 -0
  272. package/dist/patterns/orchestration/index.d.cts +6 -0
  273. package/dist/patterns/orchestration/index.d.ts +6 -0
  274. package/dist/patterns/orchestration/index.js +1 -0
  275. package/dist/patterns/reactive-layout/index.cjs +8 -6444
  276. package/dist/patterns/reactive-layout/index.d.cts +6 -6
  277. package/dist/patterns/reactive-layout/index.d.ts +6 -6
  278. package/dist/patterns/reactive-layout/index.js +1 -56
  279. package/dist/patterns/reduction/index.cjs +7 -0
  280. package/dist/patterns/reduction/index.d.cts +5 -0
  281. package/dist/patterns/reduction/index.d.ts +5 -0
  282. package/dist/patterns/reduction/index.js +1 -0
  283. package/dist/patterns/refine-loop/index.cjs +9 -0
  284. package/dist/patterns/refine-loop/index.d.cts +7 -0
  285. package/dist/patterns/refine-loop/index.d.ts +7 -0
  286. package/dist/patterns/refine-loop/index.js +1 -0
  287. package/dist/patterns/resilient-pipeline/index.cjs +1 -0
  288. package/dist/patterns/resilient-pipeline/index.d.cts +7 -0
  289. package/dist/patterns/resilient-pipeline/index.d.ts +7 -0
  290. package/dist/patterns/resilient-pipeline/index.js +1 -0
  291. package/dist/patterns/surface/index.cjs +15 -0
  292. package/dist/patterns/surface/index.d.cts +8 -0
  293. package/dist/patterns/surface/index.d.ts +8 -0
  294. package/dist/patterns/surface/index.js +1 -0
  295. package/dist/{reactive-layout-u5Ulnqag.d.ts → reactive-layout-BkBwVvwm.d.ts} +2 -2
  296. package/dist/{reactive-layout-MQP--J3F.d.cts → reactive-layout-PiFwVaWS.d.cts} +2 -2
  297. package/dist/reactive-log-1QTyx10a.d.ts +190 -0
  298. package/dist/reactive-log-BiVoSxke.d.cts +190 -0
  299. package/dist/{composite-aUCvjZVR.d.ts → reactive-map-CwO_COHy.d.cts} +2 -67
  300. package/dist/{composite-C7PcQvcs.d.cts → reactive-map-FeuTVAJb.d.ts} +2 -67
  301. package/dist/resilience-CBfYJW5C.d.ts +493 -0
  302. package/dist/resilience-XRUF267O.js +1 -0
  303. package/dist/resilience-uBz4yvYB.d.cts +493 -0
  304. package/dist/{sugar-CCOxXK1e.d.ts → sugar-CY-MCfZ9.d.ts} +17 -15
  305. package/dist/{sugar-D02n5JjF.d.cts → sugar-DHttV0LX.d.cts} +17 -15
  306. package/dist/topology-tree-CVjt2gp7.d.cts +25 -0
  307. package/dist/topology-tree-one6oSKY.d.ts +25 -0
  308. package/dist/types-O3GzJY2U.d.cts +401 -0
  309. package/dist/types-u64Ose53.d.ts +401 -0
  310. package/package.json +252 -22
  311. package/dist/ai-CaR_912Q.d.cts +0 -1033
  312. package/dist/ai-WlRltJV7.d.ts +0 -1033
  313. package/dist/chunk-3ZWCKRHX.js +0 -117
  314. package/dist/chunk-3ZWCKRHX.js.map +0 -1
  315. package/dist/chunk-7TAQJHQV.js +0 -103
  316. package/dist/chunk-7TAQJHQV.js.map +0 -1
  317. package/dist/chunk-APFNLIRG.js +0 -62
  318. package/dist/chunk-APFNLIRG.js.map +0 -1
  319. package/dist/chunk-AT5LKYNL.js +0 -395
  320. package/dist/chunk-AT5LKYNL.js.map +0 -1
  321. package/dist/chunk-BQ6RQQFF.js +0 -5087
  322. package/dist/chunk-BQ6RQQFF.js.map +0 -1
  323. package/dist/chunk-BVZYTZ5H.js +0 -599
  324. package/dist/chunk-BVZYTZ5H.js.map +0 -1
  325. package/dist/chunk-DST5DKZS.js +0 -1371
  326. package/dist/chunk-DST5DKZS.js.map +0 -1
  327. package/dist/chunk-GTE6PWRZ.js +0 -866
  328. package/dist/chunk-GTE6PWRZ.js.map +0 -1
  329. package/dist/chunk-HXZEYDUR.js +0 -94
  330. package/dist/chunk-HXZEYDUR.js.map +0 -1
  331. package/dist/chunk-J22W6HV3.js +0 -107
  332. package/dist/chunk-J22W6HV3.js.map +0 -1
  333. package/dist/chunk-J2VBW3DZ.js +0 -302
  334. package/dist/chunk-J2VBW3DZ.js.map +0 -1
  335. package/dist/chunk-JSCT3CR4.js +0 -38
  336. package/dist/chunk-JSCT3CR4.js.map +0 -1
  337. package/dist/chunk-JWBCY4NC.js +0 -330
  338. package/dist/chunk-JWBCY4NC.js.map +0 -1
  339. package/dist/chunk-K2AUJHVP.js +0 -2251
  340. package/dist/chunk-K2AUJHVP.js.map +0 -1
  341. package/dist/chunk-MJ2NKQQL.js +0 -119
  342. package/dist/chunk-MJ2NKQQL.js.map +0 -1
  343. package/dist/chunk-N6UR7YVY.js +0 -198
  344. package/dist/chunk-N6UR7YVY.js.map +0 -1
  345. package/dist/chunk-NC6S43JJ.js +0 -456
  346. package/dist/chunk-NC6S43JJ.js.map +0 -1
  347. package/dist/chunk-OFVJBJXR.js +0 -98
  348. package/dist/chunk-OFVJBJXR.js.map +0 -1
  349. package/dist/chunk-OHISZPOJ.js +0 -97
  350. package/dist/chunk-OHISZPOJ.js.map +0 -1
  351. package/dist/chunk-OU5CQKNW.js +0 -102
  352. package/dist/chunk-OU5CQKNW.js.map +0 -1
  353. package/dist/chunk-PF7GRZMW.js +0 -2712
  354. package/dist/chunk-PF7GRZMW.js.map +0 -1
  355. package/dist/chunk-PHOUUNK7.js +0 -2291
  356. package/dist/chunk-PHOUUNK7.js.map +0 -1
  357. package/dist/chunk-RNHBMHKA.js +0 -1665
  358. package/dist/chunk-RNHBMHKA.js.map +0 -1
  359. package/dist/chunk-SX52TAR4.js +0 -110
  360. package/dist/chunk-SX52TAR4.js.map +0 -1
  361. package/dist/chunk-VYPWMZ6H.js +0 -98
  362. package/dist/chunk-VYPWMZ6H.js.map +0 -1
  363. package/dist/chunk-WBZOVTYK.js +0 -171
  364. package/dist/chunk-WBZOVTYK.js.map +0 -1
  365. package/dist/chunk-WKNUIZOY.js +0 -354
  366. package/dist/chunk-WKNUIZOY.js.map +0 -1
  367. package/dist/chunk-X3VMZYBT.js +0 -713
  368. package/dist/chunk-X3VMZYBT.js.map +0 -1
  369. package/dist/chunk-X5R3GL6H.js +0 -525
  370. package/dist/chunk-X5R3GL6H.js.map +0 -1
  371. package/dist/chunk-XGPU467M.js +0 -136
  372. package/dist/chunk-XGPU467M.js.map +0 -1
  373. package/dist/compat/index.cjs.map +0 -1
  374. package/dist/compat/index.js.map +0 -1
  375. package/dist/compat/jotai/index.cjs.map +0 -1
  376. package/dist/compat/jotai/index.js.map +0 -1
  377. package/dist/compat/nanostores/index.cjs.map +0 -1
  378. package/dist/compat/nanostores/index.js.map +0 -1
  379. package/dist/compat/nestjs/index.cjs.map +0 -1
  380. package/dist/compat/nestjs/index.js.map +0 -1
  381. package/dist/compat/react/index.cjs.map +0 -1
  382. package/dist/compat/react/index.js.map +0 -1
  383. package/dist/compat/solid/index.cjs.map +0 -1
  384. package/dist/compat/solid/index.js.map +0 -1
  385. package/dist/compat/svelte/index.cjs.map +0 -1
  386. package/dist/compat/svelte/index.js.map +0 -1
  387. package/dist/compat/vue/index.cjs.map +0 -1
  388. package/dist/compat/vue/index.js.map +0 -1
  389. package/dist/compat/zustand/index.cjs.map +0 -1
  390. package/dist/compat/zustand/index.js.map +0 -1
  391. package/dist/core/index.cjs.map +0 -1
  392. package/dist/core/index.js.map +0 -1
  393. package/dist/extra/index.cjs.map +0 -1
  394. package/dist/extra/index.js.map +0 -1
  395. package/dist/extra/sources.cjs.map +0 -1
  396. package/dist/extra/sources.js.map +0 -1
  397. package/dist/graph/index.cjs.map +0 -1
  398. package/dist/graph/index.js.map +0 -1
  399. package/dist/index.cjs.map +0 -1
  400. package/dist/index.js.map +0 -1
  401. package/dist/patterns/ai.cjs +0 -7930
  402. package/dist/patterns/ai.cjs.map +0 -1
  403. package/dist/patterns/ai.d.cts +0 -10
  404. package/dist/patterns/ai.d.ts +0 -10
  405. package/dist/patterns/ai.js +0 -71
  406. package/dist/patterns/ai.js.map +0 -1
  407. package/dist/patterns/audit.cjs +0 -5805
  408. package/dist/patterns/audit.cjs.map +0 -1
  409. package/dist/patterns/audit.d.cts +0 -6
  410. package/dist/patterns/audit.d.ts +0 -6
  411. package/dist/patterns/audit.js +0 -29
  412. package/dist/patterns/audit.js.map +0 -1
  413. package/dist/patterns/demo-shell.cjs +0 -5604
  414. package/dist/patterns/demo-shell.cjs.map +0 -1
  415. package/dist/patterns/demo-shell.d.cts +0 -6
  416. package/dist/patterns/demo-shell.d.ts +0 -6
  417. package/dist/patterns/demo-shell.js +0 -15
  418. package/dist/patterns/demo-shell.js.map +0 -1
  419. package/dist/patterns/memory.cjs +0 -5283
  420. package/dist/patterns/memory.cjs.map +0 -1
  421. package/dist/patterns/memory.d.cts +0 -5
  422. package/dist/patterns/memory.d.ts +0 -5
  423. package/dist/patterns/memory.js +0 -20
  424. package/dist/patterns/memory.js.map +0 -1
  425. package/dist/patterns/reactive-layout/index.cjs.map +0 -1
  426. package/dist/patterns/reactive-layout/index.js.map +0 -1
  427. package/dist/storage-CMjUUuxn.d.ts +0 -190
  428. package/dist/storage-DdWlZo6U.d.cts +0 -190
@@ -1,525 +0,0 @@
1
- import {
2
- domainMeta
3
- } from "./chunk-JSCT3CR4.js";
4
- import {
5
- reactiveList,
6
- reactiveMap
7
- } from "./chunk-WKNUIZOY.js";
8
- import {
9
- reactiveLog
10
- } from "./chunk-J2VBW3DZ.js";
11
- import {
12
- keepalive
13
- } from "./chunk-BVZYTZ5H.js";
14
- import {
15
- Graph
16
- } from "./chunk-PF7GRZMW.js";
17
- import {
18
- batch,
19
- derived,
20
- node,
21
- state
22
- } from "./chunk-PHOUUNK7.js";
23
- import {
24
- COMPLETE,
25
- DATA,
26
- __export
27
- } from "./chunk-SX52TAR4.js";
28
-
29
- // src/patterns/messaging.ts
30
- var messaging_exports = {};
31
- __export(messaging_exports, {
32
- JobFlowGraph: () => JobFlowGraph,
33
- JobQueueGraph: () => JobQueueGraph,
34
- MessagingHubGraph: () => MessagingHubGraph,
35
- SubscriptionGraph: () => SubscriptionGraph,
36
- TopicBridgeGraph: () => TopicBridgeGraph,
37
- TopicGraph: () => TopicGraph,
38
- jobFlow: () => jobFlow,
39
- jobQueue: () => jobQueue,
40
- messagingHub: () => messagingHub,
41
- subscription: () => subscription,
42
- topic: () => topic,
43
- topicBridge: () => topicBridge
44
- });
45
- var DEFAULT_MAX_PER_PUMP = 2147483647;
46
- function requireNonNegativeInt(value, label) {
47
- if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
48
- throw new Error(`${label} must be a non-negative integer`);
49
- }
50
- return value;
51
- }
52
- function messagingMeta(kind, extra) {
53
- return domainMeta("messaging", kind, extra);
54
- }
55
- var TopicGraph = class extends Graph {
56
- _log;
57
- events;
58
- /**
59
- * Most recently published value, or `null` when the topic has no entries
60
- * yet. Spec §5.12 reserves `undefined` as the protocol-internal "never
61
- * sent DATA" sentinel — `null` is the idiomatic "empty / no value" signal
62
- * for domain nodes. F7.
63
- *
64
- * **Caveat when `T` itself includes `null`** (e.g., `topic<number | null>`):
65
- * `latest === null` is ambiguous — it could mean "no publish yet" OR "a
66
- * `null` value was published". Use {@link hasLatest} to disambiguate, or
67
- * observe {@link events} directly and track length yourself.
68
- */
69
- latest;
70
- /**
71
- * Reactive `true` once the topic has at least one published entry.
72
- * Disambiguates "`null` never published" from "`null` was published" when
73
- * `T` includes `null`.
74
- */
75
- hasLatest;
76
- constructor(name, opts = {}) {
77
- super(name, opts.graph);
78
- this._log = reactiveLog([], { name: "events", maxSize: opts.retainedLimit });
79
- this.events = this._log.entries;
80
- this.add("events", this.events);
81
- this.latest = derived(
82
- [this.events],
83
- ([snapshot]) => {
84
- const entries = snapshot;
85
- return entries.length === 0 ? null : entries[entries.length - 1];
86
- },
87
- {
88
- name: "latest",
89
- describeKind: "derived",
90
- meta: messagingMeta("topic_latest")
91
- }
92
- );
93
- this.add("latest", this.latest);
94
- this.addDisposer(keepalive(this.latest));
95
- this.hasLatest = derived(
96
- [this.events],
97
- ([snapshot]) => snapshot.length > 0,
98
- {
99
- name: "hasLatest",
100
- describeKind: "derived",
101
- meta: messagingMeta("topic_has_latest")
102
- }
103
- );
104
- this.add("hasLatest", this.hasLatest);
105
- this.addDisposer(keepalive(this.hasLatest));
106
- this.addDisposer(() => {
107
- this.events.down([[COMPLETE]]);
108
- });
109
- this.addDisposer(() => this._log.disposeAllViews());
110
- }
111
- publish(value) {
112
- this._log.append(value);
113
- }
114
- retained() {
115
- return this.events.cache;
116
- }
117
- };
118
- var SubscriptionGraph = class extends Graph {
119
- source;
120
- cursor;
121
- available;
122
- /**
123
- * Reference to the upstream topic graph. Intentionally NOT mounted
124
- * under this subscription: a subscription is a VIEW over an
125
- * externally-owned topic. Double-mounting (e.g. hub-owned topic +
126
- * sub-mount here) would make either-side teardown leave the other
127
- * holding a dead reference. Node-level `derived([topicEvents], …)`
128
- * still wires the data dependency across graph boundaries. D1(e).
129
- */
130
- topic;
131
- constructor(name, topicGraph, opts = {}) {
132
- super(name, opts.graph);
133
- const initialCursor = requireNonNegativeInt(opts.cursor ?? 0, "subscription cursor");
134
- this.topic = topicGraph;
135
- const topicEvents = topicGraph.events;
136
- this.source = derived([topicEvents], ([snapshot]) => snapshot, {
137
- name: "source",
138
- describeKind: "derived",
139
- meta: messagingMeta("subscription_source"),
140
- initial: topicEvents.cache
141
- });
142
- this.add("source", this.source);
143
- this.cursor = state(initialCursor, {
144
- name: "cursor",
145
- describeKind: "state",
146
- meta: messagingMeta("subscription_cursor")
147
- });
148
- this.add("cursor", this.cursor);
149
- this.available = derived(
150
- [this.source, this.cursor],
151
- ([sourceSnapshot, cursor]) => {
152
- const entries = sourceSnapshot;
153
- const start = Math.max(0, Math.trunc(cursor ?? 0));
154
- return entries.slice(start);
155
- },
156
- {
157
- name: "available",
158
- describeKind: "derived",
159
- meta: messagingMeta("subscription_available"),
160
- initial: []
161
- }
162
- );
163
- this.add("available", this.available);
164
- this.addDisposer(keepalive(this.source));
165
- this.addDisposer(keepalive(this.available));
166
- }
167
- ack(count) {
168
- const available = this.available.cache;
169
- const requested = count === void 0 ? available.length : requireNonNegativeInt(count, "subscription ack count");
170
- const step = Math.min(requested, available.length);
171
- if (step <= 0) return this.cursor.cache;
172
- const next = this.cursor.cache + step;
173
- this.cursor.emit(next);
174
- return next;
175
- }
176
- pull(limit, opts = {}) {
177
- const available = this.available.cache;
178
- const max = limit === void 0 ? available.length : requireNonNegativeInt(limit, "subscription pull limit");
179
- const out = available.slice(0, max);
180
- if (opts.ack && out.length > 0) this.ack(out.length);
181
- return out;
182
- }
183
- };
184
- var JobQueueGraph = class extends Graph {
185
- _pending;
186
- _jobs;
187
- _seq = 0;
188
- pending;
189
- jobs;
190
- depth;
191
- constructor(name, opts = {}) {
192
- super(name, opts.graph);
193
- this._pending = reactiveList([], { name: "pending" });
194
- this._jobs = reactiveMap({ name: "jobs" });
195
- this.pending = this._pending.items;
196
- this.jobs = this._jobs.entries;
197
- this.add("pending", this.pending);
198
- this.add("jobs", this.jobs);
199
- this.depth = derived([this.pending], ([snapshot]) => snapshot.length, {
200
- name: "depth",
201
- describeKind: "derived",
202
- meta: messagingMeta("queue_depth"),
203
- initial: 0
204
- });
205
- this.add("depth", this.depth);
206
- this.addDisposer(keepalive(this.depth));
207
- }
208
- enqueue(payload, opts = {}) {
209
- const id = opts.id ?? `${this.name}-${++this._seq}`;
210
- if (this._jobs.get(id) !== void 0) {
211
- throw new Error(`jobQueue("${this.name}"): duplicate job id "${id}"`);
212
- }
213
- const job = {
214
- id,
215
- payload,
216
- attempts: 0,
217
- metadata: Object.freeze({ ...opts.metadata ?? {} }),
218
- state: "queued"
219
- };
220
- this._jobs.set(id, job);
221
- this._pending.append(id);
222
- return id;
223
- }
224
- claim(limit = 1) {
225
- const max = requireNonNegativeInt(limit, "job queue claim limit");
226
- if (max === 0) return [];
227
- const out = [];
228
- while (out.length < max) {
229
- const ids = this.pending.cache;
230
- if (ids.length === 0) break;
231
- const id = this._pending.pop(0);
232
- const job = this._jobs.get(id);
233
- if (!job || job.state !== "queued") continue;
234
- const inflight = {
235
- ...job,
236
- state: "inflight",
237
- attempts: job.attempts + 1
238
- };
239
- this._jobs.set(id, inflight);
240
- out.push(inflight);
241
- }
242
- return out;
243
- }
244
- ack(id) {
245
- const job = this._jobs.get(id);
246
- if (!job || job.state !== "inflight") return false;
247
- this._jobs.delete(id);
248
- return true;
249
- }
250
- nack(id, opts = {}) {
251
- const job = this._jobs.get(id);
252
- if (!job || job.state !== "inflight") return false;
253
- if (opts.requeue ?? true) {
254
- this._jobs.set(id, { ...job, state: "queued" });
255
- this._pending.append(id);
256
- return true;
257
- }
258
- this._jobs.delete(id);
259
- return true;
260
- }
261
- };
262
- var JobFlowGraph = class extends Graph {
263
- _stageNames;
264
- _queues = /* @__PURE__ */ new Map();
265
- _completed;
266
- completed;
267
- completedCount;
268
- constructor(name, opts = {}) {
269
- super(name, opts.graph);
270
- const stages = (opts.stages ?? ["incoming", "processing", "done"]).map((v) => v.trim());
271
- if (stages.length < 2) {
272
- throw new Error(`jobFlow("${name}"): requires at least 2 stages`);
273
- }
274
- const unique = new Set(stages);
275
- if (unique.size !== stages.length) {
276
- throw new Error(`jobFlow("${name}"): stage names must be unique`);
277
- }
278
- this._stageNames = Object.freeze([...stages]);
279
- for (const stage of this._stageNames) {
280
- const q = jobQueue(`${name}-${stage}`);
281
- this._queues.set(stage, q);
282
- this.mount(stage, q);
283
- }
284
- this._completed = reactiveLog([], { name: "completed" });
285
- this.completed = this._completed.entries;
286
- this.add("completed", this.completed);
287
- this.completedCount = derived(
288
- [this.completed],
289
- ([snapshot]) => snapshot.length,
290
- {
291
- name: "completedCount",
292
- describeKind: "derived",
293
- meta: messagingMeta("job_flow_completed_count"),
294
- initial: 0
295
- }
296
- );
297
- this.add("completedCount", this.completedCount);
298
- this.addDisposer(keepalive(this.completedCount));
299
- const maxPerPump = Math.max(
300
- 1,
301
- requireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, "job flow maxPerPump")
302
- );
303
- for (let i = 0; i < this._stageNames.length; i += 1) {
304
- const stage = this._stageNames[i];
305
- const current = this.queue(stage);
306
- const next = i + 1 < this._stageNames.length ? this.queue(this._stageNames[i + 1]) : null;
307
- const pump = node(
308
- [current.pending],
309
- () => {
310
- let moved = 0;
311
- while (moved < maxPerPump) {
312
- const claim = current.claim(1);
313
- if (claim.length === 0) break;
314
- const job = claim[0];
315
- if (!job) break;
316
- if (next) {
317
- next.enqueue(job.payload, {
318
- metadata: {
319
- ...job.metadata,
320
- job_flow_from: stage
321
- }
322
- });
323
- } else {
324
- this._completed.append(job);
325
- }
326
- current.ack(job.id);
327
- moved += 1;
328
- }
329
- },
330
- {
331
- name: `pump_${stage}`,
332
- describeKind: "effect",
333
- meta: messagingMeta("job_flow_pump")
334
- }
335
- );
336
- this.add(`pump_${stage}`, pump);
337
- this.addDisposer(keepalive(pump));
338
- }
339
- }
340
- stages() {
341
- return this._stageNames;
342
- }
343
- queue(stage) {
344
- const q = this._queues.get(stage);
345
- if (!q) throw new Error(`jobFlow("${this.name}"): unknown stage "${stage}"`);
346
- return q;
347
- }
348
- enqueue(payload, opts = {}) {
349
- return this.queue(this._stageNames[0]).enqueue(payload, opts);
350
- }
351
- retainedCompleted() {
352
- return this.completed.cache;
353
- }
354
- };
355
- var TopicBridgeGraph = class extends Graph {
356
- _sourceSub;
357
- _target;
358
- bridgedCount;
359
- constructor(name, sourceTopic, targetTopic, opts = {}) {
360
- super(name, opts.graph);
361
- this._sourceSub = subscription(`${name}-subscription`, sourceTopic, {
362
- cursor: opts.cursor
363
- });
364
- this._target = targetTopic;
365
- this.mount("subscription", this._sourceSub);
366
- this.bridgedCount = state(0, {
367
- name: "bridgedCount",
368
- describeKind: "state",
369
- meta: messagingMeta("topic_bridge_count")
370
- });
371
- this.add("bridgedCount", this.bridgedCount);
372
- const maxPerPump = Math.max(
373
- 1,
374
- requireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, "topic bridge maxPerPump")
375
- );
376
- const mapValue = opts.map ?? ((value) => value);
377
- const pump = node(
378
- [this._sourceSub.available],
379
- () => {
380
- const available = this._sourceSub.pull(maxPerPump, { ack: true });
381
- if (available.length === 0) return;
382
- let bridged = 0;
383
- for (const value of available) {
384
- const mapped = mapValue(value);
385
- if (mapped === void 0) continue;
386
- this._target.publish(mapped);
387
- bridged += 1;
388
- }
389
- if (bridged > 0) {
390
- const current = this.bridgedCount.cache;
391
- this.bridgedCount.down([[DATA, current + bridged]]);
392
- }
393
- },
394
- {
395
- name: "pump",
396
- describeKind: "effect",
397
- meta: messagingMeta("topic_bridge_pump")
398
- }
399
- );
400
- this.add("pump", pump);
401
- this.addDisposer(keepalive(pump));
402
- }
403
- };
404
- var MessagingHubGraph = class extends Graph {
405
- _topics = /* @__PURE__ */ new Map();
406
- _version = 0;
407
- _defaultTopicOptions;
408
- constructor(name, opts = {}) {
409
- super(name, opts.graph);
410
- this._defaultTopicOptions = { ...opts.defaultTopicOptions ?? {} };
411
- }
412
- /** Monotonic counter advancing on topic create/remove. */
413
- get version() {
414
- return this._version;
415
- }
416
- /** Number of topics currently in the hub. */
417
- get size() {
418
- return this._topics.size;
419
- }
420
- /** Checks topic existence without creating. */
421
- has(name) {
422
- return this._topics.has(name);
423
- }
424
- /** Iterator over topic names. */
425
- topicNames() {
426
- return this._topics.keys();
427
- }
428
- /**
429
- * Returns the {@link TopicGraph} for `name`, creating lazily on first call.
430
- * Subsequent calls with the same name return the same instance (options on
431
- * repeat calls are ignored — the topic is already configured).
432
- */
433
- topic(name, opts) {
434
- let t = this._topics.get(name);
435
- if (t === void 0) {
436
- const effective = { ...this._defaultTopicOptions, ...opts ?? {} };
437
- t = new TopicGraph(name, effective);
438
- this._topics.set(name, t);
439
- this.mount(name, t);
440
- this._version += 1;
441
- }
442
- return t;
443
- }
444
- /**
445
- * Publishes a value to the topic, lazily creating it on first publish.
446
- *
447
- * **Late-subscriber caveat:** the topic is created lazily, so subscribers
448
- * that attach AFTER a publish only see the retained window (governed by
449
- * `retainedLimit` on `TopicOptions` / `defaultTopicOptions`). If
450
- * `retainedLimit === 0` is set explicitly, early publishes are
451
- * effectively dropped — prefer an unset `retainedLimit` (unbounded
452
- * retention) or subscribe before publishing when late-subscribers matter.
453
- */
454
- publish(name, value) {
455
- this.topic(name).publish(value);
456
- }
457
- /**
458
- * Bulk publish — issues all publishes inside one outer batch. New topics
459
- * are created on demand. No-op if `entries` yields nothing.
460
- *
461
- * **Iterable consumption (F6):** `entries` is consumed once (single-pass)
462
- * INSIDE the batch frame. If the iterator throws mid-way, the batch is
463
- * discarded and NO publishes are visible to subscribers (all-or-nothing).
464
- * Pass an array or `Set` for multi-shot callers.
465
- */
466
- publishMany(entries) {
467
- batch(() => {
468
- for (const [name, value] of entries) {
469
- this.topic(name).publish(value);
470
- }
471
- });
472
- }
473
- /**
474
- * Creates a {@link SubscriptionGraph} over a named topic. The topic is
475
- * lazily created if missing. Subscription lifecycle is owned by the caller —
476
- * the hub does NOT mount the subscription.
477
- *
478
- * @param subName - Local name for the subscription graph.
479
- * @param topicName - Hub topic to subscribe to.
480
- * @param opts - `SubscriptionOptions` (initial cursor, etc.).
481
- */
482
- subscribe(subName, topicName, opts) {
483
- const t = this.topic(topicName);
484
- return new SubscriptionGraph(subName, t, opts);
485
- }
486
- /**
487
- * Unmounts and tears down the topic's graph. Returns `true` if the topic
488
- * existed. Subscribers receive `TEARDOWN` via {@link Graph.remove}.
489
- */
490
- removeTopic(name) {
491
- if (!this._topics.has(name)) return false;
492
- try {
493
- this.remove(name);
494
- } finally {
495
- this._topics.delete(name);
496
- this._version += 1;
497
- }
498
- return true;
499
- }
500
- };
501
- function topic(name, opts) {
502
- return new TopicGraph(name, opts);
503
- }
504
- function messagingHub(name, opts) {
505
- return new MessagingHubGraph(name, opts);
506
- }
507
- function subscription(name, topicGraph, opts) {
508
- return new SubscriptionGraph(name, topicGraph, opts);
509
- }
510
- function jobQueue(name, opts) {
511
- return new JobQueueGraph(name, opts);
512
- }
513
- function jobFlow(name, opts) {
514
- return new JobFlowGraph(name, opts);
515
- }
516
- function topicBridge(name, sourceTopic, targetTopic, opts) {
517
- return new TopicBridgeGraph(name, sourceTopic, targetTopic, opts);
518
- }
519
-
520
- export {
521
- TopicGraph,
522
- topic,
523
- messaging_exports
524
- };
525
- //# sourceMappingURL=chunk-X5R3GL6H.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/patterns/messaging.ts"],"sourcesContent":["/**\n * Messaging patterns (roadmap §4.2).\n *\n * Pulsar-inspired messaging features modeled as graph factories:\n * - `topic()` for append-only topic streams\n * - `subscription()` for cursor-based consumers\n * - `jobQueue()` for queue claim/ack flow\n */\n\nimport { batch, COMPLETE, DATA, derived, type Node, node, state } from \"../core/index.js\";\nimport { reactiveList } from \"../extra/reactive-list.js\";\nimport { reactiveLog } from \"../extra/reactive-log.js\";\nimport { reactiveMap } from \"../extra/reactive-map.js\";\nimport { Graph, type GraphOptions } from \"../graph/index.js\";\n\nconst DEFAULT_MAX_PER_PUMP = 2_147_483_647;\n\nfunction requireNonNegativeInt(value: number, label: string): number {\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {\n\t\tthrow new Error(`${label} must be a non-negative integer`);\n\t}\n\treturn value;\n}\n\nimport { domainMeta, keepalive } from \"./_internal.js\";\n\nfunction messagingMeta(kind: string, extra?: Record<string, unknown>): Record<string, unknown> {\n\treturn domainMeta(\"messaging\", kind, extra);\n}\n\nexport type TopicOptions = {\n\tgraph?: GraphOptions;\n\tretainedLimit?: number;\n};\n\nexport class TopicGraph<T> extends Graph {\n\tprivate readonly _log;\n\treadonly events: Node<readonly T[]>;\n\t/**\n\t * Most recently published value, or `null` when the topic has no entries\n\t * yet. Spec §5.12 reserves `undefined` as the protocol-internal \"never\n\t * sent DATA\" sentinel — `null` is the idiomatic \"empty / no value\" signal\n\t * for domain nodes. F7.\n\t *\n\t * **Caveat when `T` itself includes `null`** (e.g., `topic<number | null>`):\n\t * `latest === null` is ambiguous — it could mean \"no publish yet\" OR \"a\n\t * `null` value was published\". Use {@link hasLatest} to disambiguate, or\n\t * observe {@link events} directly and track length yourself.\n\t */\n\treadonly latest: Node<T | null>;\n\t/**\n\t * Reactive `true` once the topic has at least one published entry.\n\t * Disambiguates \"`null` never published\" from \"`null` was published\" when\n\t * `T` includes `null`.\n\t */\n\treadonly hasLatest: Node<boolean>;\n\n\tconstructor(name: string, opts: TopicOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tthis._log = reactiveLog<T>([], { name: \"events\", maxSize: opts.retainedLimit });\n\t\tthis.events = this._log.entries;\n\t\tthis.add(\"events\", this.events);\n\t\tthis.latest = derived<T | null>(\n\t\t\t[this.events],\n\t\t\t([snapshot]) => {\n\t\t\t\tconst entries = snapshot as readonly T[];\n\t\t\t\treturn entries.length === 0 ? null : (entries[entries.length - 1] as T);\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"latest\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"topic_latest\"),\n\t\t\t},\n\t\t);\n\t\tthis.add(\"latest\", this.latest);\n\t\tthis.addDisposer(keepalive(this.latest));\n\n\t\tthis.hasLatest = derived<boolean>(\n\t\t\t[this.events],\n\t\t\t([snapshot]) => (snapshot as readonly T[]).length > 0,\n\t\t\t{\n\t\t\t\tname: \"hasLatest\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"topic_has_latest\"),\n\t\t\t},\n\t\t);\n\t\tthis.add(\"hasLatest\", this.hasLatest);\n\t\tthis.addDisposer(keepalive(this.hasLatest));\n\n\t\t// D1(a): on teardown, propagate COMPLETE on `events` so downstream\n\t\t// derived chains (including any externally-held SubscriptionGraph\n\t\t// sources) see the termination via their `terminalDeps` and can stop\n\t\t// serving stale caches. Tier-3 terminal per spec §2.2.\n\t\tthis.addDisposer(() => {\n\t\t\tthis.events.down([[COMPLETE]]);\n\t\t});\n\t\t// P9: release any memoized tail/slice view keepalives held by the log.\n\t\t// TopicGraph itself doesn't call log.tail/slice, but plugins may have\n\t\t// attached views via `_log` — defensive.\n\t\tthis.addDisposer(() => this._log.disposeAllViews());\n\t}\n\n\tpublish(value: T): void {\n\t\tthis._log.append(value);\n\t}\n\n\tretained(): readonly T[] {\n\t\treturn this.events.cache as readonly T[];\n\t}\n}\n\nexport type SubscriptionOptions = {\n\tgraph?: GraphOptions;\n\tcursor?: number;\n};\n\nexport class SubscriptionGraph<T> extends Graph {\n\treadonly source: Node<readonly T[]>;\n\treadonly cursor: Node<number>;\n\treadonly available: Node<readonly T[]>;\n\t/**\n\t * Reference to the upstream topic graph. Intentionally NOT mounted\n\t * under this subscription: a subscription is a VIEW over an\n\t * externally-owned topic. Double-mounting (e.g. hub-owned topic +\n\t * sub-mount here) would make either-side teardown leave the other\n\t * holding a dead reference. Node-level `derived([topicEvents], …)`\n\t * still wires the data dependency across graph boundaries. D1(e).\n\t */\n\treadonly topic: TopicGraph<T>;\n\n\tconstructor(name: string, topicGraph: TopicGraph<T>, opts: SubscriptionOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tconst initialCursor = requireNonNegativeInt(opts.cursor ?? 0, \"subscription cursor\");\n\t\tthis.topic = topicGraph;\n\t\tconst topicEvents = topicGraph.events;\n\t\tthis.source = derived([topicEvents], ([snapshot]) => snapshot as readonly T[], {\n\t\t\tname: \"source\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: messagingMeta(\"subscription_source\"),\n\t\t\tinitial: topicEvents.cache as readonly T[],\n\t\t});\n\t\tthis.add(\"source\", this.source);\n\t\tthis.cursor = state(initialCursor, {\n\t\t\tname: \"cursor\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: messagingMeta(\"subscription_cursor\"),\n\t\t});\n\t\tthis.add(\"cursor\", this.cursor);\n\t\tthis.available = derived(\n\t\t\t[this.source, this.cursor],\n\t\t\t([sourceSnapshot, cursor]) => {\n\t\t\t\tconst entries = sourceSnapshot as readonly T[];\n\t\t\t\tconst start = Math.max(0, Math.trunc((cursor as number) ?? 0));\n\t\t\t\treturn entries.slice(start);\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"available\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"subscription_available\"),\n\t\t\t\tinitial: [],\n\t\t\t},\n\t\t);\n\t\tthis.add(\"available\", this.available);\n\t\t// No `connect(\"topic::events\", \"source\")` — topic is not mounted here.\n\t\t// The node-level dep `derived([topicEvents], …)` above is the live wire.\n\t\tthis.addDisposer(keepalive(this.source));\n\t\tthis.addDisposer(keepalive(this.available));\n\t}\n\n\tack(count?: number): number {\n\t\tconst available = this.available.cache as readonly T[];\n\t\tconst requested =\n\t\t\tcount === undefined\n\t\t\t\t? available.length\n\t\t\t\t: requireNonNegativeInt(count, \"subscription ack count\");\n\t\tconst step = Math.min(requested, available.length);\n\t\tif (step <= 0) return this.cursor.cache as number;\n\t\tconst next = (this.cursor.cache as number) + step;\n\t\t// F8: use emit() so the pipeline auto-prefixes DIRTY, runs equals\n\t\t// substitution, and produces a proper two-phase wave (the raw\n\t\t// `down([[DATA, next]])` path bypassed those contracts).\n\t\tthis.cursor.emit(next);\n\t\treturn next;\n\t}\n\n\tpull(limit?: number, opts: { ack?: boolean } = {}): readonly T[] {\n\t\tconst available = this.available.cache as readonly T[];\n\t\tconst max =\n\t\t\tlimit === undefined\n\t\t\t\t? available.length\n\t\t\t\t: requireNonNegativeInt(limit, \"subscription pull limit\");\n\t\tconst out = available.slice(0, max);\n\t\tif (opts.ack && out.length > 0) this.ack(out.length);\n\t\treturn out;\n\t}\n}\n\nexport type JobState = \"queued\" | \"inflight\";\n\nexport type JobEnvelope<T> = {\n\tid: string;\n\tpayload: T;\n\tattempts: number;\n\tmetadata: Readonly<Record<string, unknown>>;\n\tstate: JobState;\n};\n\nexport type JobQueueOptions = {\n\tgraph?: GraphOptions;\n};\n\nexport class JobQueueGraph<T> extends Graph {\n\tprivate readonly _pending;\n\tprivate readonly _jobs;\n\tprivate _seq = 0;\n\treadonly pending: Node<readonly string[]>;\n\treadonly jobs: Node<ReadonlyMap<string, JobEnvelope<T>>>;\n\treadonly depth: Node<number>;\n\n\tconstructor(name: string, opts: JobQueueOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tthis._pending = reactiveList<string>([], { name: \"pending\" });\n\t\tthis._jobs = reactiveMap<string, JobEnvelope<T>>({ name: \"jobs\" });\n\t\tthis.pending = this._pending.items;\n\t\tthis.jobs = this._jobs.entries;\n\t\tthis.add(\"pending\", this.pending);\n\t\tthis.add(\"jobs\", this.jobs);\n\t\tthis.depth = derived([this.pending], ([snapshot]) => (snapshot as readonly string[]).length, {\n\t\t\tname: \"depth\",\n\t\t\tdescribeKind: \"derived\",\n\t\t\tmeta: messagingMeta(\"queue_depth\"),\n\t\t\tinitial: 0,\n\t\t});\n\t\tthis.add(\"depth\", this.depth);\n\t\tthis.addDisposer(keepalive(this.depth));\n\t}\n\n\tenqueue(payload: T, opts: { id?: string; metadata?: Record<string, unknown> } = {}): string {\n\t\tconst id = opts.id ?? `${this.name}-${++this._seq}`;\n\t\tif (this._jobs.get(id) !== undefined) {\n\t\t\tthrow new Error(`jobQueue(\"${this.name}\"): duplicate job id \"${id}\"`);\n\t\t}\n\t\tconst job: JobEnvelope<T> = {\n\t\t\tid,\n\t\t\tpayload,\n\t\t\tattempts: 0,\n\t\t\tmetadata: Object.freeze({ ...(opts.metadata ?? {}) }),\n\t\t\tstate: \"queued\",\n\t\t};\n\t\tthis._jobs.set(id, job);\n\t\tthis._pending.append(id);\n\t\treturn id;\n\t}\n\n\tclaim(limit = 1): readonly JobEnvelope<T>[] {\n\t\tconst max = requireNonNegativeInt(limit, \"job queue claim limit\");\n\t\tif (max === 0) return [];\n\t\tconst out: JobEnvelope<T>[] = [];\n\t\twhile (out.length < max) {\n\t\t\tconst ids = this.pending.cache as readonly string[];\n\t\t\tif (ids.length === 0) break;\n\t\t\tconst id = this._pending.pop(0);\n\t\t\tconst job = this._jobs.get(id);\n\t\t\tif (!job || job.state !== \"queued\") continue;\n\t\t\tconst inflight: JobEnvelope<T> = {\n\t\t\t\t...job,\n\t\t\t\tstate: \"inflight\",\n\t\t\t\tattempts: job.attempts + 1,\n\t\t\t};\n\t\t\tthis._jobs.set(id, inflight);\n\t\t\tout.push(inflight);\n\t\t}\n\t\treturn out;\n\t}\n\n\tack(id: string): boolean {\n\t\tconst job = this._jobs.get(id);\n\t\tif (!job || job.state !== \"inflight\") return false;\n\t\tthis._jobs.delete(id);\n\t\treturn true;\n\t}\n\n\tnack(id: string, opts: { requeue?: boolean } = {}): boolean {\n\t\tconst job = this._jobs.get(id);\n\t\tif (!job || job.state !== \"inflight\") return false;\n\t\tif (opts.requeue ?? true) {\n\t\t\tthis._jobs.set(id, { ...job, state: \"queued\" });\n\t\t\tthis._pending.append(id);\n\t\t\treturn true;\n\t\t}\n\t\tthis._jobs.delete(id);\n\t\treturn true;\n\t}\n}\n\nexport type JobFlowOptions = {\n\tgraph?: GraphOptions;\n\tstages?: readonly string[];\n\tmaxPerPump?: number;\n};\n\nexport class JobFlowGraph<T> extends Graph {\n\tprivate readonly _stageNames: readonly string[];\n\tprivate readonly _queues = new Map<string, JobQueueGraph<T>>();\n\tprivate readonly _completed;\n\treadonly completed: Node<readonly JobEnvelope<T>[]>;\n\treadonly completedCount: Node<number>;\n\n\tconstructor(name: string, opts: JobFlowOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\tconst stages = (opts.stages ?? [\"incoming\", \"processing\", \"done\"]).map((v) => v.trim());\n\t\tif (stages.length < 2) {\n\t\t\tthrow new Error(`jobFlow(\"${name}\"): requires at least 2 stages`);\n\t\t}\n\t\tconst unique = new Set(stages);\n\t\tif (unique.size !== stages.length) {\n\t\t\tthrow new Error(`jobFlow(\"${name}\"): stage names must be unique`);\n\t\t}\n\t\tthis._stageNames = Object.freeze([...stages]);\n\t\tfor (const stage of this._stageNames) {\n\t\t\tconst q = jobQueue<T>(`${name}-${stage}`);\n\t\t\tthis._queues.set(stage, q);\n\t\t\tthis.mount(stage, q);\n\t\t}\n\t\tthis._completed = reactiveLog<JobEnvelope<T>>([], { name: \"completed\" });\n\t\tthis.completed = this._completed.entries;\n\t\tthis.add(\"completed\", this.completed);\n\t\tthis.completedCount = derived(\n\t\t\t[this.completed],\n\t\t\t([snapshot]) => (snapshot as readonly JobEnvelope<T>[]).length,\n\t\t\t{\n\t\t\t\tname: \"completedCount\",\n\t\t\t\tdescribeKind: \"derived\",\n\t\t\t\tmeta: messagingMeta(\"job_flow_completed_count\"),\n\t\t\t\tinitial: 0,\n\t\t\t},\n\t\t);\n\t\tthis.add(\"completedCount\", this.completedCount);\n\t\tthis.addDisposer(keepalive(this.completedCount));\n\n\t\tconst maxPerPump = Math.max(\n\t\t\t1,\n\t\t\trequireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, \"job flow maxPerPump\"),\n\t\t);\n\t\tfor (let i = 0; i < this._stageNames.length; i += 1) {\n\t\t\tconst stage = this._stageNames[i] as string;\n\t\t\tconst current = this.queue(stage);\n\t\t\tconst next =\n\t\t\t\ti + 1 < this._stageNames.length ? this.queue(this._stageNames[i + 1] as string) : null;\n\t\t\tconst pump = node<unknown>(\n\t\t\t\t[current.pending],\n\t\t\t\t() => {\n\t\t\t\t\tlet moved = 0;\n\t\t\t\t\twhile (moved < maxPerPump) {\n\t\t\t\t\t\tconst claim = current.claim(1);\n\t\t\t\t\t\tif (claim.length === 0) break;\n\t\t\t\t\t\tconst job = claim[0] as JobEnvelope<T>;\n\t\t\t\t\t\tif (!job) break;\n\t\t\t\t\t\tif (next) {\n\t\t\t\t\t\t\tnext.enqueue(job.payload, {\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t...job.metadata,\n\t\t\t\t\t\t\t\t\tjob_flow_from: stage,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._completed.append(job);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent.ack(job.id);\n\t\t\t\t\t\tmoved += 1;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: `pump_${stage}`,\n\t\t\t\t\tdescribeKind: \"effect\",\n\t\t\t\t\tmeta: messagingMeta(\"job_flow_pump\"),\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.add(`pump_${stage}`, pump);\n\t\t\tthis.addDisposer(keepalive(pump));\n\t\t}\n\t}\n\n\tstages(): readonly string[] {\n\t\treturn this._stageNames;\n\t}\n\n\tqueue(stage: string): JobQueueGraph<T> {\n\t\tconst q = this._queues.get(stage);\n\t\tif (!q) throw new Error(`jobFlow(\"${this.name}\"): unknown stage \"${stage}\"`);\n\t\treturn q;\n\t}\n\n\tenqueue(payload: T, opts: { id?: string; metadata?: Record<string, unknown> } = {}): string {\n\t\treturn this.queue(this._stageNames[0] as string).enqueue(payload, opts);\n\t}\n\n\tretainedCompleted(): readonly JobEnvelope<T>[] {\n\t\treturn this.completed.cache as readonly JobEnvelope<T>[];\n\t}\n}\n\nexport type TopicBridgeOptions<TIn, TOut> = {\n\tgraph?: GraphOptions;\n\tcursor?: number;\n\tmaxPerPump?: number;\n\tmap?: (value: TIn) => TOut | undefined;\n};\n\nexport class TopicBridgeGraph<TIn, TOut = TIn> extends Graph {\n\tprivate readonly _sourceSub;\n\tprivate readonly _target;\n\treadonly bridgedCount: Node<number>;\n\n\tconstructor(\n\t\tname: string,\n\t\tsourceTopic: TopicGraph<TIn>,\n\t\ttargetTopic: TopicGraph<TOut>,\n\t\topts: TopicBridgeOptions<TIn, TOut> = {},\n\t) {\n\t\tsuper(name, opts.graph);\n\t\tthis._sourceSub = subscription<TIn>(`${name}-subscription`, sourceTopic, {\n\t\t\tcursor: opts.cursor,\n\t\t});\n\t\tthis._target = targetTopic;\n\t\tthis.mount(\"subscription\", this._sourceSub);\n\t\tthis.bridgedCount = state(0, {\n\t\t\tname: \"bridgedCount\",\n\t\t\tdescribeKind: \"state\",\n\t\t\tmeta: messagingMeta(\"topic_bridge_count\"),\n\t\t});\n\t\tthis.add(\"bridgedCount\", this.bridgedCount);\n\n\t\tconst maxPerPump = Math.max(\n\t\t\t1,\n\t\t\trequireNonNegativeInt(opts.maxPerPump ?? DEFAULT_MAX_PER_PUMP, \"topic bridge maxPerPump\"),\n\t\t);\n\t\tconst mapValue = opts.map ?? ((value: TIn) => value as unknown as TOut);\n\t\tconst pump = node<unknown>(\n\t\t\t[this._sourceSub.available],\n\t\t\t() => {\n\t\t\t\tconst available = this._sourceSub.pull(maxPerPump, { ack: true });\n\t\t\t\tif (available.length === 0) return;\n\t\t\t\tlet bridged = 0;\n\t\t\t\tfor (const value of available) {\n\t\t\t\t\tconst mapped = mapValue(value as TIn);\n\t\t\t\t\tif (mapped === undefined) continue;\n\t\t\t\t\tthis._target.publish(mapped);\n\t\t\t\t\tbridged += 1;\n\t\t\t\t}\n\t\t\t\tif (bridged > 0) {\n\t\t\t\t\tconst current = this.bridgedCount.cache as number;\n\t\t\t\t\tthis.bridgedCount.down([[DATA, current + bridged]]);\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"pump\",\n\t\t\t\tdescribeKind: \"effect\",\n\t\t\t\tmeta: messagingMeta(\"topic_bridge_pump\"),\n\t\t\t},\n\t\t);\n\t\tthis.add(\"pump\", pump);\n\t\tthis.addDisposer(keepalive(pump));\n\t}\n}\n\n// ── MessagingHubGraph ─────────────────────────────────────────────────────\n\nexport type MessagingHubOptions = {\n\tgraph?: GraphOptions;\n\t/**\n\t * Default `TopicOptions` applied to every topic created via `topic(name)`\n\t * without explicit options. Per-call opts override. Default: `{}`\n\t * (unbounded retention per topic unless `retainedLimit` is set per call).\n\t */\n\tdefaultTopicOptions?: TopicOptions;\n};\n\n/**\n * Lazy Pulsar-inspired topic registry. Manages a named set of {@link TopicGraph}\n * instances with retention + cursor semantics. Topics are created on first\n * access; `removeTopic(name)` unmounts and tears down via {@link Graph.remove}.\n *\n * **Relationship to `pubsub()` in `src/extra/pubsub.ts`:** `pubsub` is a\n * lightweight last-value state hub (no retention, no cursors). `MessagingHubGraph`\n * is the full messaging hub — retained message logs, cursor-based subscriptions,\n * and pattern-layer lifecycle management.\n *\n * @category patterns\n */\nexport class MessagingHubGraph extends Graph {\n\tprivate readonly _topics = new Map<string, TopicGraph<unknown>>();\n\tprivate _version = 0;\n\tprivate readonly _defaultTopicOptions: TopicOptions;\n\n\tconstructor(name: string, opts: MessagingHubOptions = {}) {\n\t\tsuper(name, opts.graph);\n\t\t// P8: shallow-copy caller-provided defaults so post-construction\n\t\t// mutations by the caller don't leak into every future `topic()` call.\n\t\tthis._defaultTopicOptions = { ...(opts.defaultTopicOptions ?? {}) };\n\t}\n\n\t/** Monotonic counter advancing on topic create/remove. */\n\tget version(): number {\n\t\treturn this._version;\n\t}\n\n\t/** Number of topics currently in the hub. */\n\tget size(): number {\n\t\treturn this._topics.size;\n\t}\n\n\t/** Checks topic existence without creating. */\n\thas(name: string): boolean {\n\t\treturn this._topics.has(name);\n\t}\n\n\t/** Iterator over topic names. */\n\ttopicNames(): IterableIterator<string> {\n\t\treturn this._topics.keys();\n\t}\n\n\t/**\n\t * Returns the {@link TopicGraph} for `name`, creating lazily on first call.\n\t * Subsequent calls with the same name return the same instance (options on\n\t * repeat calls are ignored — the topic is already configured).\n\t */\n\ttopic<T = unknown>(name: string, opts?: TopicOptions): TopicGraph<T> {\n\t\tlet t = this._topics.get(name) as TopicGraph<T> | undefined;\n\t\tif (t === undefined) {\n\t\t\tconst effective: TopicOptions = { ...this._defaultTopicOptions, ...(opts ?? {}) };\n\t\t\tt = new TopicGraph<T>(name, effective);\n\t\t\tthis._topics.set(name, t as TopicGraph<unknown>);\n\t\t\tthis.mount(name, t);\n\t\t\tthis._version += 1;\n\t\t}\n\t\treturn t;\n\t}\n\n\t/**\n\t * Publishes a value to the topic, lazily creating it on first publish.\n\t *\n\t * **Late-subscriber caveat:** the topic is created lazily, so subscribers\n\t * that attach AFTER a publish only see the retained window (governed by\n\t * `retainedLimit` on `TopicOptions` / `defaultTopicOptions`). If\n\t * `retainedLimit === 0` is set explicitly, early publishes are\n\t * effectively dropped — prefer an unset `retainedLimit` (unbounded\n\t * retention) or subscribe before publishing when late-subscribers matter.\n\t */\n\tpublish<T = unknown>(name: string, value: T): void {\n\t\tthis.topic<T>(name).publish(value);\n\t}\n\n\t/**\n\t * Bulk publish — issues all publishes inside one outer batch. New topics\n\t * are created on demand. No-op if `entries` yields nothing.\n\t *\n\t * **Iterable consumption (F6):** `entries` is consumed once (single-pass)\n\t * INSIDE the batch frame. If the iterator throws mid-way, the batch is\n\t * discarded and NO publishes are visible to subscribers (all-or-nothing).\n\t * Pass an array or `Set` for multi-shot callers.\n\t */\n\tpublishMany(entries: Iterable<[string, unknown]>): void {\n\t\t// P2: iterate inside batch — no `[...entries]` materialization so large\n\t\t// / infinite iterables don't OOM, and iterator throws are contained.\n\t\tbatch(() => {\n\t\t\tfor (const [name, value] of entries) {\n\t\t\t\tthis.topic(name).publish(value);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Creates a {@link SubscriptionGraph} over a named topic. The topic is\n\t * lazily created if missing. Subscription lifecycle is owned by the caller —\n\t * the hub does NOT mount the subscription.\n\t *\n\t * @param subName - Local name for the subscription graph.\n\t * @param topicName - Hub topic to subscribe to.\n\t * @param opts - `SubscriptionOptions` (initial cursor, etc.).\n\t */\n\tsubscribe<T = unknown>(\n\t\tsubName: string,\n\t\ttopicName: string,\n\t\topts?: SubscriptionOptions,\n\t): SubscriptionGraph<T> {\n\t\tconst t = this.topic<T>(topicName);\n\t\treturn new SubscriptionGraph<T>(subName, t, opts);\n\t}\n\n\t/**\n\t * Unmounts and tears down the topic's graph. Returns `true` if the topic\n\t * existed. Subscribers receive `TEARDOWN` via {@link Graph.remove}.\n\t */\n\tremoveTopic(name: string): boolean {\n\t\tif (!this._topics.has(name)) return false;\n\t\t// P1 / P3: Graph.remove first — if it throws, `_topics` must NOT still\n\t\t// hold the broken half-disposed topic (otherwise the next\n\t\t// `hub.topic(name)` returns the corrupted reference). Wrap in\n\t\t// try/finally so `_topics` / `_version` converge to a consistent state\n\t\t// regardless of whether `remove` throws. Mount-orphan safety is\n\t\t// preserved by removing before deleting.\n\t\ttry {\n\t\t\tthis.remove(name); // unmounts, drops edges, tears down\n\t\t} finally {\n\t\t\tthis._topics.delete(name);\n\t\t\tthis._version += 1;\n\t\t}\n\t\treturn true;\n\t}\n}\n\n/**\n * Creates a Pulsar-inspired topic graph (append-only retained stream + latest value).\n */\nexport function topic<T>(name: string, opts?: TopicOptions): TopicGraph<T> {\n\treturn new TopicGraph<T>(name, opts);\n}\n\n/**\n * Creates a lazy Pulsar-inspired messaging hub. Topics are created on first access\n * via `hub.topic(name)`; `hub.publish(name, value)` shortcuts through the registry.\n *\n * @example\n * ```ts\n * import { messagingHub } from \"@graphrefly/graphrefly-ts\";\n *\n * const hub = messagingHub(\"main\", { defaultTopicOptions: { retainedLimit: 256 } });\n * hub.publish(\"orders\", { id: 1 });\n * hub.publishMany([[\"shipments\", { id: 1 }], [\"orders\", { id: 2 }]]);\n * const sub = hub.subscribe(\"orders-worker\", \"orders\", { cursor: 0 });\n * ```\n */\nexport function messagingHub(name: string, opts?: MessagingHubOptions): MessagingHubGraph {\n\treturn new MessagingHubGraph(name, opts);\n}\n\n/**\n * Creates a cursor-based subscription graph over a topic.\n */\nexport function subscription<T>(\n\tname: string,\n\ttopicGraph: TopicGraph<T>,\n\topts?: SubscriptionOptions,\n): SubscriptionGraph<T> {\n\treturn new SubscriptionGraph<T>(name, topicGraph, opts);\n}\n\n/**\n * Creates a Pulsar-inspired job queue graph with claim/ack/nack workflow.\n */\nexport function jobQueue<T>(name: string, opts?: JobQueueOptions): JobQueueGraph<T> {\n\treturn new JobQueueGraph<T>(name, opts);\n}\n\n/**\n * Creates an autonomous multi-stage queue chain graph.\n */\nexport function jobFlow<T>(name: string, opts?: JobFlowOptions): JobFlowGraph<T> {\n\treturn new JobFlowGraph<T>(name, opts);\n}\n\n/**\n * Creates an autonomous cursor-based topic relay graph.\n */\nexport function topicBridge<TIn, TOut = TIn>(\n\tname: string,\n\tsourceTopic: TopicGraph<TIn>,\n\ttargetTopic: TopicGraph<TOut>,\n\topts?: TopicBridgeOptions<TIn, TOut>,\n): TopicBridgeGraph<TIn, TOut> {\n\treturn new TopicBridgeGraph<TIn, TOut>(name, sourceTopic, targetTopic, opts);\n}\n"],"mappings":"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","names":[]}