@graphrefly/ts 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/README.md +135 -0
  2. package/dist/adapters/index.cjs +105 -66
  3. package/dist/adapters/index.cjs.map +1 -1
  4. package/dist/adapters/index.d.cts +11 -136
  5. package/dist/adapters/index.d.ts +11 -136
  6. package/dist/adapters/index.js +27 -225
  7. package/dist/adapters/index.js.map +1 -1
  8. package/dist/adapters/observe-storage.d.cts +4 -4
  9. package/dist/adapters/observe-storage.d.ts +4 -4
  10. package/dist/adapters/observe-storage.js +1 -0
  11. package/dist/adapters/observe-storage.js.map +1 -1
  12. package/dist/adapters/react.cjs +166 -0
  13. package/dist/adapters/react.cjs.map +1 -0
  14. package/dist/adapters/react.d.cts +31 -0
  15. package/dist/adapters/react.d.ts +31 -0
  16. package/dist/adapters/react.js +51 -0
  17. package/dist/adapters/react.js.map +1 -0
  18. package/dist/adapters/solid.cjs +157 -0
  19. package/dist/adapters/solid.cjs.map +1 -0
  20. package/dist/adapters/solid.d.cts +26 -0
  21. package/dist/adapters/solid.d.ts +26 -0
  22. package/dist/adapters/solid.js +48 -0
  23. package/dist/adapters/solid.js.map +1 -0
  24. package/dist/adapters/svelte.cjs +148 -0
  25. package/dist/adapters/svelte.cjs.map +1 -0
  26. package/dist/adapters/svelte.d.cts +31 -0
  27. package/dist/adapters/svelte.d.ts +31 -0
  28. package/dist/adapters/svelte.js +46 -0
  29. package/dist/adapters/svelte.js.map +1 -0
  30. package/dist/adapters/vue.cjs +155 -0
  31. package/dist/adapters/vue.cjs.map +1 -0
  32. package/dist/adapters/vue.d.cts +26 -0
  33. package/dist/adapters/vue.d.ts +26 -0
  34. package/dist/adapters/vue.js +46 -0
  35. package/dist/adapters/vue.js.map +1 -0
  36. package/dist/agent-runtime-BesGDZcB.d.ts +555 -0
  37. package/dist/agent-runtime-DZTJ3C-p.d.cts +555 -0
  38. package/dist/agentic-memory-BmRCvh0d.d.ts +517 -0
  39. package/dist/agentic-memory-DfuVZ-lY.d.cts +517 -0
  40. package/dist/capability-admission-B0BzqAm5.d.cts +102 -0
  41. package/dist/capability-admission-g0mn9hpq.d.ts +102 -0
  42. package/dist/{chunk-JR4IKCR2.js → chunk-2747WN4Y.js} +5 -5
  43. package/dist/{chunk-2ILL7HQI.js → chunk-3JR3EDB2.js} +17 -17
  44. package/dist/{chunk-2ILL7HQI.js.map → chunk-3JR3EDB2.js.map} +1 -1
  45. package/dist/{chunk-GDL26N2T.js → chunk-3KN7NJDR.js} +2 -2
  46. package/dist/{chunk-DJC4CHLQ.js → chunk-43BKLFZU.js} +9 -9
  47. package/dist/chunk-6XAIOL3X.js +2407 -0
  48. package/dist/chunk-6XAIOL3X.js.map +1 -0
  49. package/dist/{chunk-SCRFRCGR.js → chunk-BSQGE5PS.js} +1 -1
  50. package/dist/{chunk-Y3ZLRGHC.js → chunk-CZNV3VXM.js} +16 -16
  51. package/dist/chunk-DGUM43GV.js +11 -0
  52. package/dist/chunk-DGUM43GV.js.map +1 -0
  53. package/dist/{chunk-JIMUDQN3.js → chunk-FBUU43PM.js} +2 -2
  54. package/dist/chunk-H75VXTGT.js +219 -0
  55. package/dist/chunk-H75VXTGT.js.map +1 -0
  56. package/dist/{chunk-RIIOUTGM.js → chunk-HKK2JD7Z.js} +12 -9
  57. package/dist/chunk-HKK2JD7Z.js.map +1 -0
  58. package/dist/{chunk-D6BG7U6A.js → chunk-IXZBUWSP.js} +3 -3
  59. package/dist/chunk-PC3BTTBE.js +3217 -0
  60. package/dist/chunk-PC3BTTBE.js.map +1 -0
  61. package/dist/chunk-QFY4AFY4.js +879 -0
  62. package/dist/chunk-QFY4AFY4.js.map +1 -0
  63. package/dist/{chunk-DK554R7P.js → chunk-S6HXABGL.js} +2 -1
  64. package/dist/chunk-S6HXABGL.js.map +1 -0
  65. package/dist/{chunk-PKVBHGBM.js → chunk-SS2A464I.js} +7 -7
  66. package/dist/chunk-UT3MHJCW.js +49 -0
  67. package/dist/chunk-UT3MHJCW.js.map +1 -0
  68. package/dist/{chunk-G4M3NHRJ.js → chunk-V7CIJE4B.js} +3 -3
  69. package/dist/{chunk-TEW47IVR.js → chunk-VPEFSDME.js} +2 -2
  70. package/dist/chunk-VTHLCFN4.js +368 -0
  71. package/dist/chunk-VTHLCFN4.js.map +1 -0
  72. package/dist/{chunk-SWTLEQL6.js → chunk-WQIA3GFB.js} +2 -2
  73. package/dist/chunk-WQIA3GFB.js.map +1 -0
  74. package/dist/{chunk-I3IHOHCJ.js → chunk-XKXWK2KP.js} +108 -64
  75. package/dist/chunk-XKXWK2KP.js.map +1 -0
  76. package/dist/{chunk-COHO25CZ.js → chunk-YDSIVHRR.js} +553 -7
  77. package/dist/chunk-YDSIVHRR.js.map +1 -0
  78. package/dist/chunk-YXMZ2N6J.js +1884 -0
  79. package/dist/chunk-YXMZ2N6J.js.map +1 -0
  80. package/dist/composition/index.cjs +102 -57
  81. package/dist/composition/index.cjs.map +1 -1
  82. package/dist/composition/index.d.cts +4 -4
  83. package/dist/composition/index.d.ts +4 -4
  84. package/dist/composition/index.js +6 -5
  85. package/dist/core/index.cjs +102 -57
  86. package/dist/core/index.cjs.map +1 -1
  87. package/dist/core/index.d.cts +2 -2
  88. package/dist/core/index.d.ts +2 -2
  89. package/dist/core/index.js +5 -4
  90. package/dist/cqrs/index.cjs.map +1 -1
  91. package/dist/cqrs/index.d.cts +4 -4
  92. package/dist/cqrs/index.d.ts +4 -4
  93. package/dist/cqrs/index.js +3 -2
  94. package/dist/cqrs/index.js.map +1 -1
  95. package/dist/cqrs/messaging.cjs +312 -0
  96. package/dist/cqrs/messaging.cjs.map +1 -0
  97. package/dist/cqrs/messaging.d.cts +57 -0
  98. package/dist/cqrs/messaging.d.ts +57 -0
  99. package/dist/cqrs/messaging.js +274 -0
  100. package/dist/cqrs/messaging.js.map +1 -0
  101. package/dist/cqrs/work-queue.cjs +329 -0
  102. package/dist/cqrs/work-queue.cjs.map +1 -0
  103. package/dist/cqrs/work-queue.d.cts +90 -0
  104. package/dist/cqrs/work-queue.d.ts +90 -0
  105. package/dist/cqrs/work-queue.js +292 -0
  106. package/dist/cqrs/work-queue.js.map +1 -0
  107. package/dist/data/index.cjs +19 -0
  108. package/dist/data/index.cjs.map +1 -0
  109. package/dist/data/index.d.cts +36 -0
  110. package/dist/data/index.d.ts +36 -0
  111. package/dist/data/index.js +1 -0
  112. package/dist/data/index.js.map +1 -0
  113. package/dist/data-structures/index.cjs +105 -57
  114. package/dist/data-structures/index.cjs.map +1 -1
  115. package/dist/data-structures/index.d.cts +8 -8
  116. package/dist/data-structures/index.d.ts +8 -8
  117. package/dist/data-structures/index.js +7 -6
  118. package/dist/{describe-BZb7AS2y.d.ts → describe-BpyJuWkw.d.ts} +1 -1
  119. package/dist/{describe-Ciu8SUnN.d.cts → describe-DYMw_l1C.d.cts} +1 -1
  120. package/dist/executors/work-queue.cjs +342 -0
  121. package/dist/executors/work-queue.cjs.map +1 -0
  122. package/dist/executors/work-queue.d.cts +90 -0
  123. package/dist/executors/work-queue.d.ts +90 -0
  124. package/dist/executors/work-queue.js +306 -0
  125. package/dist/executors/work-queue.js.map +1 -0
  126. package/dist/graph/index.cjs +112 -58
  127. package/dist/graph/index.cjs.map +1 -1
  128. package/dist/graph/index.d.cts +9 -9
  129. package/dist/graph/index.d.ts +9 -9
  130. package/dist/graph/index.js +18 -17
  131. package/dist/{graph-DfdF9zy4.d.ts → graph-D-1-SQeC.d.ts} +3 -3
  132. package/dist/{graph-s23RbbFO.d.cts → graph-DCEWh4T2.d.cts} +3 -3
  133. package/dist/{index-CAEmLCYF.d.cts → index-72VZC0-E.d.cts} +2 -2
  134. package/dist/{index-SnzZu3x7.d.ts → index-Bmxeu0nK.d.ts} +2 -2
  135. package/dist/index.cjs +112 -58
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.d.cts +11 -10
  138. package/dist/index.d.ts +11 -10
  139. package/dist/index.js +118 -113
  140. package/dist/inspection/boundary.cjs +98 -0
  141. package/dist/inspection/boundary.cjs.map +1 -0
  142. package/dist/inspection/boundary.d.cts +61 -0
  143. package/dist/inspection/boundary.d.ts +61 -0
  144. package/dist/inspection/boundary.js +75 -0
  145. package/dist/inspection/boundary.js.map +1 -0
  146. package/dist/{messages-BZqrGGm1.d.ts → messages-CAzUPPJM.d.cts} +10 -5
  147. package/dist/{messages-BZqrGGm1.d.cts → messages-CAzUPPJM.d.ts} +10 -5
  148. package/dist/messaging/index.cjs +744 -613
  149. package/dist/messaging/index.cjs.map +1 -1
  150. package/dist/messaging/index.d.cts +216 -160
  151. package/dist/messaging/index.d.ts +216 -160
  152. package/dist/messaging/index.js +19 -749
  153. package/dist/messaging/index.js.map +1 -1
  154. package/dist/operators/index.cjs +102 -57
  155. package/dist/operators/index.cjs.map +1 -1
  156. package/dist/operators/index.d.cts +6 -6
  157. package/dist/operators/index.d.ts +6 -6
  158. package/dist/operators/index.js +8 -7
  159. package/dist/orchestration/index.cjs +3333 -59
  160. package/dist/orchestration/index.cjs.map +1 -1
  161. package/dist/orchestration/index.d.cts +7 -4
  162. package/dist/orchestration/index.d.ts +7 -4
  163. package/dist/orchestration/index.js +49 -8
  164. package/dist/orchestration/index.js.map +1 -1
  165. package/dist/orchestration/messaging.cjs +314 -0
  166. package/dist/orchestration/messaging.cjs.map +1 -0
  167. package/dist/orchestration/messaging.d.cts +59 -0
  168. package/dist/orchestration/messaging.d.ts +59 -0
  169. package/dist/orchestration/messaging.js +276 -0
  170. package/dist/orchestration/messaging.js.map +1 -0
  171. package/dist/orchestration/work-queue.cjs +262 -0
  172. package/dist/orchestration/work-queue.cjs.map +1 -0
  173. package/dist/orchestration/work-queue.d.cts +85 -0
  174. package/dist/orchestration/work-queue.d.ts +85 -0
  175. package/dist/orchestration/work-queue.js +226 -0
  176. package/dist/orchestration/work-queue.js.map +1 -0
  177. package/dist/patterns/event-flow.cjs +447 -0
  178. package/dist/patterns/event-flow.cjs.map +1 -0
  179. package/dist/patterns/event-flow.d.cts +115 -0
  180. package/dist/patterns/event-flow.d.ts +115 -0
  181. package/dist/patterns/event-flow.js +14 -0
  182. package/dist/patterns/event-flow.js.map +1 -0
  183. package/dist/patterns/index.cjs +423 -18
  184. package/dist/patterns/index.cjs.map +1 -1
  185. package/dist/patterns/index.d.cts +8 -5
  186. package/dist/patterns/index.d.ts +8 -5
  187. package/dist/patterns/index.js +13 -4
  188. package/dist/{reactive-collection-Cb1II1Fi.d.ts → reactive-collection-BAmfrGjd.d.ts} +9 -9
  189. package/dist/{reactive-collection-BxBqtIOE.d.cts → reactive-collection-DNV0-gFi.d.cts} +9 -9
  190. package/dist/{reactive-collection-storage-D-KmjE0J.d.cts → reactive-collection-storage-BNEldDyi.d.cts} +5 -5
  191. package/dist/{reactive-collection-storage-BNiEc-Gd.d.ts → reactive-collection-storage-YZsAQsWK.d.ts} +5 -5
  192. package/dist/{reactive-map-D-g3dv8I.d.cts → reactive-map-DRD1LJ2H.d.cts} +6 -6
  193. package/dist/{reactive-map-BcB4KsQR.d.ts → reactive-map-EsDiCmJk.d.ts} +6 -6
  194. package/dist/render/index.d.cts +3 -3
  195. package/dist/render/index.d.ts +3 -3
  196. package/dist/render/index.js +1 -0
  197. package/dist/{semantic-memory-graph-BYoIlP35.d.cts → semantic-memory-graph-DKuNzuWw.d.cts} +2 -2
  198. package/dist/{semantic-memory-graph-CxyXLms3.d.ts → semantic-memory-graph-uwbwJdhe.d.ts} +2 -2
  199. package/dist/solutions/index.cjs +4478 -2
  200. package/dist/solutions/index.cjs.map +1 -1
  201. package/dist/solutions/index.d.cts +13 -519
  202. package/dist/solutions/index.d.ts +13 -519
  203. package/dist/solutions/index.js +90 -6
  204. package/dist/solutions/reactive-layout/browser/index.cjs +449 -0
  205. package/dist/solutions/reactive-layout/browser/index.cjs.map +1 -0
  206. package/dist/solutions/reactive-layout/browser/index.d.cts +44 -0
  207. package/dist/solutions/reactive-layout/browser/index.d.ts +44 -0
  208. package/dist/solutions/reactive-layout/browser/index.js +69 -0
  209. package/dist/solutions/reactive-layout/browser/index.js.map +1 -0
  210. package/dist/solutions/reactive-layout/index.cjs +4266 -0
  211. package/dist/solutions/reactive-layout/index.cjs.map +1 -0
  212. package/dist/solutions/reactive-layout/index.d.cts +581 -0
  213. package/dist/solutions/reactive-layout/index.d.ts +581 -0
  214. package/dist/solutions/reactive-layout/index.js +86 -0
  215. package/dist/solutions/reactive-layout/index.js.map +1 -0
  216. package/dist/solutions/reactive-layout/node-canvas/index.cjs +545 -0
  217. package/dist/solutions/reactive-layout/node-canvas/index.cjs.map +1 -0
  218. package/dist/solutions/reactive-layout/node-canvas/index.d.cts +54 -0
  219. package/dist/solutions/reactive-layout/node-canvas/index.d.ts +54 -0
  220. package/dist/solutions/reactive-layout/node-canvas/index.js +131 -0
  221. package/dist/solutions/reactive-layout/node-canvas/index.js.map +1 -0
  222. package/dist/solutions/reactive-layout/react-native/index.cjs +494 -0
  223. package/dist/solutions/reactive-layout/react-native/index.cjs.map +1 -0
  224. package/dist/solutions/reactive-layout/react-native/index.d.cts +51 -0
  225. package/dist/solutions/reactive-layout/react-native/index.d.ts +51 -0
  226. package/dist/solutions/reactive-layout/react-native/index.js +77 -0
  227. package/dist/solutions/reactive-layout/react-native/index.js.map +1 -0
  228. package/dist/solutions/reactive-layout/skia/index.cjs +547 -0
  229. package/dist/solutions/reactive-layout/skia/index.cjs.map +1 -0
  230. package/dist/solutions/reactive-layout/skia/index.d.cts +64 -0
  231. package/dist/solutions/reactive-layout/skia/index.d.ts +64 -0
  232. package/dist/solutions/reactive-layout/skia/index.js +70 -0
  233. package/dist/solutions/reactive-layout/skia/index.js.map +1 -0
  234. package/dist/solutions/work-item/actions.cjs +2164 -0
  235. package/dist/solutions/work-item/actions.cjs.map +1 -0
  236. package/dist/solutions/work-item/actions.d.cts +201 -0
  237. package/dist/solutions/work-item/actions.d.ts +201 -0
  238. package/dist/solutions/work-item/actions.js +1454 -0
  239. package/dist/solutions/work-item/actions.js.map +1 -0
  240. package/dist/solutions/work-item/scheduling.cjs +2454 -0
  241. package/dist/solutions/work-item/scheduling.cjs.map +1 -0
  242. package/dist/solutions/work-item/scheduling.d.cts +433 -0
  243. package/dist/solutions/work-item/scheduling.d.ts +433 -0
  244. package/dist/solutions/work-item/scheduling.js +32 -0
  245. package/dist/solutions/work-item/scheduling.js.map +1 -0
  246. package/dist/solutions/work-item/work-queue.cjs +306 -0
  247. package/dist/solutions/work-item/work-queue.cjs.map +1 -0
  248. package/dist/solutions/work-item/work-queue.d.cts +71 -0
  249. package/dist/solutions/work-item/work-queue.d.ts +71 -0
  250. package/dist/solutions/work-item/work-queue.js +270 -0
  251. package/dist/solutions/work-item/work-queue.js.map +1 -0
  252. package/dist/sources/browser.cjs +169 -57
  253. package/dist/sources/browser.cjs.map +1 -1
  254. package/dist/sources/browser.d.cts +33 -6
  255. package/dist/sources/browser.d.ts +33 -6
  256. package/dist/sources/browser.js +73 -6
  257. package/dist/sources/browser.js.map +1 -1
  258. package/dist/sources/index.cjs +102 -57
  259. package/dist/sources/index.cjs.map +1 -1
  260. package/dist/sources/index.d.cts +5 -5
  261. package/dist/sources/index.d.ts +5 -5
  262. package/dist/sources/index.js +6 -5
  263. package/dist/sources/node.cjs.map +1 -1
  264. package/dist/sources/node.d.cts +4 -4
  265. package/dist/sources/node.d.ts +4 -4
  266. package/dist/sources/node.js +2 -1
  267. package/dist/sources/node.js.map +1 -1
  268. package/dist/storage/browser.js +1 -0
  269. package/dist/storage/browser.js.map +1 -1
  270. package/dist/storage/index.d.cts +5 -5
  271. package/dist/storage/index.d.ts +5 -5
  272. package/dist/storage/index.js +5 -4
  273. package/dist/storage/node.js +1 -0
  274. package/dist/storage/node.js.map +1 -1
  275. package/dist/store-C-joM4gh.d.ts +123 -0
  276. package/dist/store-CNJwmT-h.d.cts +123 -0
  277. package/dist/testing/index.cjs +1 -0
  278. package/dist/testing/index.cjs.map +1 -1
  279. package/dist/testing/index.d.cts +1 -1
  280. package/dist/testing/index.d.ts +1 -1
  281. package/dist/testing/index.js +3 -2
  282. package/dist/{types-h12mNYbq.d.ts → types-BsJvElYZ.d.ts} +31 -31
  283. package/dist/{types-bNMSWKqF.d.cts → types-CcPIn7sy.d.cts} +31 -31
  284. package/dist/work-item-runtime-C3M79vE9.d.ts +228 -0
  285. package/dist/work-item-runtime-qaVgsL0T.d.cts +228 -0
  286. package/dist/work-queue/index.cjs +1132 -0
  287. package/dist/work-queue/index.cjs.map +1 -0
  288. package/dist/work-queue/index.d.cts +369 -0
  289. package/dist/work-queue/index.d.ts +369 -0
  290. package/dist/work-queue/index.js +1078 -0
  291. package/dist/work-queue/index.js.map +1 -0
  292. package/package.json +266 -2
  293. package/dist/chunk-COHO25CZ.js.map +0 -1
  294. package/dist/chunk-DK554R7P.js.map +0 -1
  295. package/dist/chunk-I3IHOHCJ.js.map +0 -1
  296. package/dist/chunk-RIIOUTGM.js.map +0 -1
  297. package/dist/chunk-SWTLEQL6.js.map +0 -1
  298. /package/dist/{chunk-JR4IKCR2.js.map → chunk-2747WN4Y.js.map} +0 -0
  299. /package/dist/{chunk-GDL26N2T.js.map → chunk-3KN7NJDR.js.map} +0 -0
  300. /package/dist/{chunk-DJC4CHLQ.js.map → chunk-43BKLFZU.js.map} +0 -0
  301. /package/dist/{chunk-SCRFRCGR.js.map → chunk-BSQGE5PS.js.map} +0 -0
  302. /package/dist/{chunk-Y3ZLRGHC.js.map → chunk-CZNV3VXM.js.map} +0 -0
  303. /package/dist/{chunk-JIMUDQN3.js.map → chunk-FBUU43PM.js.map} +0 -0
  304. /package/dist/{chunk-D6BG7U6A.js.map → chunk-IXZBUWSP.js.map} +0 -0
  305. /package/dist/{chunk-PKVBHGBM.js.map → chunk-SS2A464I.js.map} +0 -0
  306. /package/dist/{chunk-G4M3NHRJ.js.map → chunk-V7CIJE4B.js.map} +0 -0
  307. /package/dist/{chunk-TEW47IVR.js.map → chunk-VPEFSDME.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/browser.ts"],"sourcesContent":["/**\n * Browser-only passive storage backend (D103).\n *\n * Uses DOM IndexedDB to provide async byte storage, no graph methods.\n */\n\n/// <reference lib=\"dom\" />\n\nimport { type AppendLogStorageTier, appendLogStorage } from \"./append-log.js\";\nimport type { StorageBackend } from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { type KvStorageOptions, type KvStorageTier, kvStorage } from \"./kv.js\";\n\nexport type IndexedDbBackendSpec = {\n\tdbName: string;\n\tstoreName: string;\n\tversion?: number;\n};\n\nexport interface NamedIndexedDbBackend extends StorageBackend {\n\treadonly name: string;\n}\n\ntype IndexedDbError = DOMException | Error;\n\nconst KEY_SEPARATOR = \"\\u0000\";\n\nfunction isConstraintError(error: unknown): error is DOMException {\n\treturn error instanceof DOMException && error.name === \"ConstraintError\";\n}\n\nfunction validateKey(key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: key must be a string\");\n\t}\n\tif (key.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: key must not contain U+0000\");\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must be a string\");\n\t}\n\tif (prefix.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must not contain U+0000\");\n\t}\n\treturn prefix;\n}\n\nfunction decodeStoredBytes(raw: unknown): Uint8Array | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\tif (raw instanceof Uint8Array) return Uint8Array.from(raw);\n\tif (raw instanceof ArrayBuffer) return new Uint8Array(raw.slice(0));\n\tthrow new TypeError(\"indexedDbBackend: malformed stored bytes\");\n}\n\nfunction normalizeKeys(prefix: string, raw: unknown[]): string[] {\n\tconst out: string[] = [];\n\tfor (const key of raw) {\n\t\tif (typeof key !== \"string\") {\n\t\t\tthrow new TypeError(\"indexedDbBackend: stored key must be a string\");\n\t\t}\n\t\tif (key.includes(KEY_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"indexedDbBackend: malformed stored key\");\n\t\t}\n\t\tif (key.startsWith(prefix)) out.push(key);\n\t}\n\tout.sort();\n\treturn out;\n}\n\nfunction openDb(spec: IndexedDbBackendSpec, version = spec.version): Promise<IDBDatabase> {\n\treturn new Promise<IDBDatabase>((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\treject(new TypeError(\"indexedDbBackend: indexedDB is not available in this environment\"));\n\t\t\treturn;\n\t\t}\n\t\tconst req =\n\t\t\tversion === undefined ? indexedDB.open(spec.dbName) : indexedDB.open(spec.dbName, version);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(spec.storeName)) {\n\t\t\t\tdb.createObjectStore(spec.storeName);\n\t\t\t}\n\t\t};\n\t\treq.onblocked = () =>\n\t\t\treject(\n\t\t\t\tnew Error(\"indexedDbBackend: open blocked; close existing database connections and retry\"),\n\t\t\t);\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error ?? new TypeError(\"indexedDbBackend: open failed\"));\n\t});\n}\n\nfunction openDbWithStore(spec: IndexedDbBackendSpec): Promise<IDBDatabase> {\n\treturn openDb(spec).then((db) => {\n\t\tif (db.objectStoreNames.contains(spec.storeName)) return db;\n\t\tif (spec.version !== undefined) {\n\t\t\tdb.close();\n\t\t\tthrow new Error(\n\t\t\t\t`indexedDbBackend: object store \"${spec.storeName}\" is missing; bump the IndexedDB version to create it`,\n\t\t\t);\n\t\t}\n\t\tconst nextVersion = db.version + 1;\n\t\tdb.close();\n\t\treturn openDb(spec, nextVersion).then((upgraded) => {\n\t\t\tif (upgraded.objectStoreNames.contains(spec.storeName)) return upgraded;\n\t\t\tupgraded.close();\n\t\t\tthrow new Error(`indexedDbBackend: object store \"${spec.storeName}\" was not created`);\n\t\t});\n\t});\n}\n\nexport type IndexedDbKvOptions<T> = Omit<KvStorageOptions<T>, \"backend\">;\n\nexport interface IndexedDbAppendLogOptions<T> {\n\t/** Optional append-log key prefix. */\n\tprefix?: string;\n\t/** Optional payload codec before persistence. */\n\tcodec?: Codec<T>;\n}\n\n/**\n * Creates an IndexedDB backend for browser environments.\n *\n * All methods are async (`Promise`) and do not cross graph layer boundaries.\n */\nexport function indexedDbBackend(spec: IndexedDbBackendSpec): NamedIndexedDbBackend {\n\tlet dbCache: Promise<IDBDatabase> | undefined;\n\tconst db = (): Promise<IDBDatabase> => {\n\t\tif (dbCache !== undefined) return dbCache;\n\t\tconst attempt = openDbWithStore(spec);\n\t\tconst cached = attempt.catch((error) => {\n\t\t\tif (dbCache === cached) dbCache = undefined;\n\t\t\tthrow error;\n\t\t});\n\t\tdbCache = cached;\n\t\treturn dbCache;\n\t};\n\treturn {\n\t\tname: `idb:${spec.dbName}/${spec.storeName}`,\n\t\tget(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<Uint8Array | undefined>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.get(key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(decodeStoredBytes(req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: read failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: read transaction aborted\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => {\n\t\t\t\t\t\t\t\t/* read resolved already; no-op */\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tput(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.put(value, key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: write failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<boolean>((resolve, reject) => {\n\t\t\t\t\t\tlet requestOk = false;\n\t\t\t\t\t\tlet requestConflict = false;\n\t\t\t\t\t\tlet requestError: unknown;\n\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\tconst settle = (fn: () => void): void => {\n\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\tfn();\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.add(value, key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\trequestOk = true;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = (event) => {\n\t\t\t\t\t\t\t\tconst error = req.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\trequestConflict = true;\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\trequestError = error ?? new Error(\"indexedDbBackend: write-if-absent failed\");\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\ttx.oncomplete = () =>\n\t\t\t\t\t\t\t\tsettle(() => {\n\t\t\t\t\t\t\t\t\tif (requestConflict) {\n\t\t\t\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t\t\t\t} else if (requestOk) {\n\t\t\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent did not complete\"),\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\ttx.onabort = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\ttx.error ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction aborted\"),\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\ttx.onerror = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\terror ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction failed\"),\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} catch (error) {\n\t\t\t\t\t\t\tsettle(() => reject(error as IndexedDbError));\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.delete(key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: delete failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(prefix);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<readonly string[]>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.getAllKeys();\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(normalizeKeys(validatedPrefix, req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: list failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: list transaction aborted\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Creates an IndexedDB-backed KV storage tier.\n */\nexport function indexedDbKv<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbKvOptions<T> = {},\n): KvStorageTier<T> {\n\treturn kvStorage<T>({ backend: indexedDbBackend(spec), ...opts });\n}\n\n/**\n * Creates an IndexedDB-backed append-log storage tier.\n */\nexport function indexedDbAppendLog<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> {\n\tconst kv = kvStorage<T>({\n\t\tbackend: indexedDbBackend(spec),\n\t\tcodec: opts.codec,\n\t});\n\treturn appendLogStorage<T>({ kv, prefix: opts.prefix ?? \"append-log\" });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/storage/browser.ts"],"sourcesContent":["/**\n * Browser-only passive storage backend (D103).\n *\n * Uses DOM IndexedDB to provide async byte storage, no graph methods.\n */\n\n/// <reference lib=\"dom\" />\n\nimport { type AppendLogStorageTier, appendLogStorage } from \"./append-log.js\";\nimport type { StorageBackend } from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { type KvStorageOptions, type KvStorageTier, kvStorage } from \"./kv.js\";\n\nexport type IndexedDbBackendSpec = {\n\tdbName: string;\n\tstoreName: string;\n\tversion?: number;\n};\n\nexport interface NamedIndexedDbBackend extends StorageBackend {\n\treadonly name: string;\n}\n\ntype IndexedDbError = DOMException | Error;\n\nconst KEY_SEPARATOR = \"\\u0000\";\n\nfunction isConstraintError(error: unknown): error is DOMException {\n\treturn error instanceof DOMException && error.name === \"ConstraintError\";\n}\n\nfunction validateKey(key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: key must be a string\");\n\t}\n\tif (key.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: key must not contain U+0000\");\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must be a string\");\n\t}\n\tif (prefix.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must not contain U+0000\");\n\t}\n\treturn prefix;\n}\n\nfunction decodeStoredBytes(raw: unknown): Uint8Array | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\tif (raw instanceof Uint8Array) return Uint8Array.from(raw);\n\tif (raw instanceof ArrayBuffer) return new Uint8Array(raw.slice(0));\n\tthrow new TypeError(\"indexedDbBackend: malformed stored bytes\");\n}\n\nfunction normalizeKeys(prefix: string, raw: unknown[]): string[] {\n\tconst out: string[] = [];\n\tfor (const key of raw) {\n\t\tif (typeof key !== \"string\") {\n\t\t\tthrow new TypeError(\"indexedDbBackend: stored key must be a string\");\n\t\t}\n\t\tif (key.includes(KEY_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"indexedDbBackend: malformed stored key\");\n\t\t}\n\t\tif (key.startsWith(prefix)) out.push(key);\n\t}\n\tout.sort();\n\treturn out;\n}\n\nfunction openDb(spec: IndexedDbBackendSpec, version = spec.version): Promise<IDBDatabase> {\n\treturn new Promise<IDBDatabase>((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\treject(new TypeError(\"indexedDbBackend: indexedDB is not available in this environment\"));\n\t\t\treturn;\n\t\t}\n\t\tconst req =\n\t\t\tversion === undefined ? indexedDB.open(spec.dbName) : indexedDB.open(spec.dbName, version);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(spec.storeName)) {\n\t\t\t\tdb.createObjectStore(spec.storeName);\n\t\t\t}\n\t\t};\n\t\treq.onblocked = () =>\n\t\t\treject(\n\t\t\t\tnew Error(\"indexedDbBackend: open blocked; close existing database connections and retry\"),\n\t\t\t);\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error ?? new TypeError(\"indexedDbBackend: open failed\"));\n\t});\n}\n\nfunction openDbWithStore(spec: IndexedDbBackendSpec): Promise<IDBDatabase> {\n\treturn openDb(spec).then((db) => {\n\t\tif (db.objectStoreNames.contains(spec.storeName)) return db;\n\t\tif (spec.version !== undefined) {\n\t\t\tdb.close();\n\t\t\tthrow new Error(\n\t\t\t\t`indexedDbBackend: object store \"${spec.storeName}\" is missing; bump the IndexedDB version to create it`,\n\t\t\t);\n\t\t}\n\t\tconst nextVersion = db.version + 1;\n\t\tdb.close();\n\t\treturn openDb(spec, nextVersion).then((upgraded) => {\n\t\t\tif (upgraded.objectStoreNames.contains(spec.storeName)) return upgraded;\n\t\t\tupgraded.close();\n\t\t\tthrow new Error(`indexedDbBackend: object store \"${spec.storeName}\" was not created`);\n\t\t});\n\t});\n}\n\nexport type IndexedDbKvOptions<T> = Omit<KvStorageOptions<T>, \"backend\">;\n\nexport interface IndexedDbAppendLogOptions<T> {\n\t/** Optional append-log key prefix. */\n\tprefix?: string;\n\t/** Optional payload codec before persistence. */\n\tcodec?: Codec<T>;\n}\n\n/**\n * Creates an IndexedDB backend for browser environments.\n *\n * All methods are async (`Promise`) and do not cross graph layer boundaries.\n */\nexport function indexedDbBackend(spec: IndexedDbBackendSpec): NamedIndexedDbBackend {\n\tlet dbCache: Promise<IDBDatabase> | undefined;\n\tconst db = (): Promise<IDBDatabase> => {\n\t\tif (dbCache !== undefined) return dbCache;\n\t\tconst attempt = openDbWithStore(spec);\n\t\tconst cached = attempt.catch((error) => {\n\t\t\tif (dbCache === cached) dbCache = undefined;\n\t\t\tthrow error;\n\t\t});\n\t\tdbCache = cached;\n\t\treturn dbCache;\n\t};\n\treturn {\n\t\tname: `idb:${spec.dbName}/${spec.storeName}`,\n\t\tget(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<Uint8Array | undefined>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.get(key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(decodeStoredBytes(req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: read failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: read transaction aborted\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => {\n\t\t\t\t\t\t\t\t/* read resolved already; no-op */\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tput(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.put(value, key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: write failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<boolean>((resolve, reject) => {\n\t\t\t\t\t\tlet requestOk = false;\n\t\t\t\t\t\tlet requestConflict = false;\n\t\t\t\t\t\tlet requestError: unknown;\n\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\tconst settle = (fn: () => void): void => {\n\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\tfn();\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.add(value, key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\trequestOk = true;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = (event) => {\n\t\t\t\t\t\t\t\tconst error = req.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\trequestConflict = true;\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\trequestError = error ?? new Error(\"indexedDbBackend: write-if-absent failed\");\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\ttx.oncomplete = () =>\n\t\t\t\t\t\t\t\tsettle(() => {\n\t\t\t\t\t\t\t\t\tif (requestConflict) {\n\t\t\t\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t\t\t\t} else if (requestOk) {\n\t\t\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent did not complete\"),\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\ttx.onabort = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\ttx.error ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction aborted\"),\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\ttx.onerror = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\terror ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction failed\"),\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} catch (error) {\n\t\t\t\t\t\t\tsettle(() => reject(error as IndexedDbError));\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.delete(key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: delete failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(prefix);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<readonly string[]>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.getAllKeys();\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(normalizeKeys(validatedPrefix, req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: list failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: list transaction aborted\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Creates an IndexedDB-backed KV storage tier.\n */\nexport function indexedDbKv<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbKvOptions<T> = {},\n): KvStorageTier<T> {\n\treturn kvStorage<T>({ backend: indexedDbBackend(spec), ...opts });\n}\n\n/**\n * Creates an IndexedDB-backed append-log storage tier.\n */\nexport function indexedDbAppendLog<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> {\n\tconst kv = kvStorage<T>({\n\t\tbackend: indexedDbBackend(spec),\n\t\tcodec: opts.codec,\n\t});\n\treturn appendLogStorage<T>({ kv, prefix: opts.prefix ?? \"append-log\" });\n}\n"],"mappings":"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","names":[]}
@@ -4,13 +4,13 @@ import { b as ChangeLifecycle, S as StorageTimestampNs, N as NonNegativeDecimalI
4
4
  export { C as ChangeEnvelope, a as ChangeEnvelopeOptions, D as DecimalIntegerString, O as ObserveEventFrame, c as ObserveEventLogPage, d as assertChangeEnvelope, e as assertDecimalIntegerString, f as assertNonNegativeDecimalIntegerString, g as assertObserveEventFrame, h as bigIntToDecimalString, i as bigIntToNonNegativeDecimalString, j as changeEnvelopeCodec, k as decimalStringToBigInt, l as envelopeChange, m as isDecimalIntegerString, n as isNonNegativeDecimalIntegerString, o as nonNegativeDecimalStringToBigInt, p as nowNs, q as observeEventFrame, r as observeEventFrameCodec, s as readObserveEventLogPage } from '../observe-event-log-0SVsx7JG.cjs';
5
5
  import { C as Codec } from '../codec-BB7p8fJc.cjs';
6
6
  export { S as StrictJsonObject, a as StrictJsonScalar, b as StrictJsonValue, c as assertStrictJsonObject, d as assertStrictJsonValue, j as jsonCodec, e as jsonCodecFor, s as stableJsonString, g as strictJsonCodec, h as strictJsonCodecFor } from '../codec-BB7p8fJc.cjs';
7
- export { b as LoadReactiveCollectionStateOptions, R as REACTIVE_COLLECTION_CHANGE_FORMAT, d as REACTIVE_COLLECTION_FRAME_VERSION, e as REACTIVE_COLLECTION_SNAPSHOT_FORMAT, f as ReactiveCollectionChangeFrame, g as ReactiveCollectionRestoreState, h as ReactiveCollectionSnapshotFrame, i as ReactiveCollectionStorageKind, o as ReactiveIndexRestoreState, p as ReactiveListRestoreState, q as ReactiveLogRestoreState, r as ReactiveMapRestoreState, v as assertReactiveCollectionChangeFrame, w as assertReactiveCollectionSnapshotFrame, x as collectionSnapshotKey, y as loadReactiveIndexState, z as loadReactiveListState, A as loadReactiveLogState, B as loadReactiveMapState, D as reactiveCollectionChangeFrame, E as reactiveCollectionChangeFrameCodec, F as reactiveCollectionSnapshotFrame, G as reactiveCollectionSnapshotFrameCodec } from '../reactive-collection-BxBqtIOE.cjs';
7
+ export { b as LoadReactiveCollectionStateOptions, R as REACTIVE_COLLECTION_CHANGE_FORMAT, d as REACTIVE_COLLECTION_FRAME_VERSION, e as REACTIVE_COLLECTION_SNAPSHOT_FORMAT, f as ReactiveCollectionChangeFrame, g as ReactiveCollectionRestoreState, h as ReactiveCollectionSnapshotFrame, i as ReactiveCollectionStorageKind, o as ReactiveIndexRestoreState, p as ReactiveListRestoreState, q as ReactiveLogRestoreState, r as ReactiveMapRestoreState, v as assertReactiveCollectionChangeFrame, w as assertReactiveCollectionSnapshotFrame, x as collectionSnapshotKey, y as loadReactiveIndexState, z as loadReactiveListState, A as loadReactiveLogState, B as loadReactiveMapState, D as reactiveCollectionChangeFrame, E as reactiveCollectionChangeFrameCodec, F as reactiveCollectionSnapshotFrame, G as reactiveCollectionSnapshotFrameCodec } from '../reactive-collection-DNV0-gFi.cjs';
8
8
  export { R as ReadThroughErrorContext, a as ReadThroughLookupFact, b as ReadThroughLookupTier, c as ReadThroughMissContext, d as ReadThroughPromotionFact, T as TieredReadThroughOptions, e as TieredReadThroughResult, r as readThroughKv, t as tieredReadThrough } from '../read-through-B1CYPfq_.cjs';
9
- import '../types-bNMSWKqF.cjs';
10
- import '../messages-BZqrGGm1.cjs';
11
- import '../graph-s23RbbFO.cjs';
9
+ import '../types-CcPIn7sy.cjs';
10
+ import '../messages-CAzUPPJM.cjs';
11
+ import '../graph-DCEWh4T2.cjs';
12
12
  import '../core/index.cjs';
13
- import '../describe-Ciu8SUnN.cjs';
13
+ import '../describe-DYMw_l1C.cjs';
14
14
 
15
15
  /** Content-addressed KV access mode for D82 passive storage helpers. */
16
16
  type ContentAddressedMode = "read" | "write" | "read-write" | "read-strict";
@@ -4,13 +4,13 @@ import { b as ChangeLifecycle, S as StorageTimestampNs, N as NonNegativeDecimalI
4
4
  export { C as ChangeEnvelope, a as ChangeEnvelopeOptions, D as DecimalIntegerString, O as ObserveEventFrame, c as ObserveEventLogPage, d as assertChangeEnvelope, e as assertDecimalIntegerString, f as assertNonNegativeDecimalIntegerString, g as assertObserveEventFrame, h as bigIntToDecimalString, i as bigIntToNonNegativeDecimalString, j as changeEnvelopeCodec, k as decimalStringToBigInt, l as envelopeChange, m as isDecimalIntegerString, n as isNonNegativeDecimalIntegerString, o as nonNegativeDecimalStringToBigInt, p as nowNs, q as observeEventFrame, r as observeEventFrameCodec, s as readObserveEventLogPage } from '../observe-event-log-Dnm76owp.js';
5
5
  import { C as Codec } from '../codec-BB7p8fJc.js';
6
6
  export { S as StrictJsonObject, a as StrictJsonScalar, b as StrictJsonValue, c as assertStrictJsonObject, d as assertStrictJsonValue, j as jsonCodec, e as jsonCodecFor, s as stableJsonString, g as strictJsonCodec, h as strictJsonCodecFor } from '../codec-BB7p8fJc.js';
7
- export { b as LoadReactiveCollectionStateOptions, R as REACTIVE_COLLECTION_CHANGE_FORMAT, d as REACTIVE_COLLECTION_FRAME_VERSION, e as REACTIVE_COLLECTION_SNAPSHOT_FORMAT, f as ReactiveCollectionChangeFrame, g as ReactiveCollectionRestoreState, h as ReactiveCollectionSnapshotFrame, i as ReactiveCollectionStorageKind, o as ReactiveIndexRestoreState, p as ReactiveListRestoreState, q as ReactiveLogRestoreState, r as ReactiveMapRestoreState, v as assertReactiveCollectionChangeFrame, w as assertReactiveCollectionSnapshotFrame, x as collectionSnapshotKey, y as loadReactiveIndexState, z as loadReactiveListState, A as loadReactiveLogState, B as loadReactiveMapState, D as reactiveCollectionChangeFrame, E as reactiveCollectionChangeFrameCodec, F as reactiveCollectionSnapshotFrame, G as reactiveCollectionSnapshotFrameCodec } from '../reactive-collection-Cb1II1Fi.js';
7
+ export { b as LoadReactiveCollectionStateOptions, R as REACTIVE_COLLECTION_CHANGE_FORMAT, d as REACTIVE_COLLECTION_FRAME_VERSION, e as REACTIVE_COLLECTION_SNAPSHOT_FORMAT, f as ReactiveCollectionChangeFrame, g as ReactiveCollectionRestoreState, h as ReactiveCollectionSnapshotFrame, i as ReactiveCollectionStorageKind, o as ReactiveIndexRestoreState, p as ReactiveListRestoreState, q as ReactiveLogRestoreState, r as ReactiveMapRestoreState, v as assertReactiveCollectionChangeFrame, w as assertReactiveCollectionSnapshotFrame, x as collectionSnapshotKey, y as loadReactiveIndexState, z as loadReactiveListState, A as loadReactiveLogState, B as loadReactiveMapState, D as reactiveCollectionChangeFrame, E as reactiveCollectionChangeFrameCodec, F as reactiveCollectionSnapshotFrame, G as reactiveCollectionSnapshotFrameCodec } from '../reactive-collection-BAmfrGjd.js';
8
8
  export { R as ReadThroughErrorContext, a as ReadThroughLookupFact, b as ReadThroughLookupTier, c as ReadThroughMissContext, d as ReadThroughPromotionFact, T as TieredReadThroughOptions, e as TieredReadThroughResult, r as readThroughKv, t as tieredReadThrough } from '../read-through-DwyJhGs1.js';
9
- import '../types-h12mNYbq.js';
10
- import '../messages-BZqrGGm1.js';
11
- import '../graph-DfdF9zy4.js';
9
+ import '../types-BsJvElYZ.js';
10
+ import '../messages-CAzUPPJM.js';
11
+ import '../graph-D-1-SQeC.js';
12
12
  import '../core/index.js';
13
- import '../describe-BZb7AS2y.js';
13
+ import '../describe-BpyJuWkw.js';
14
14
 
15
15
  /** Content-addressed KV access mode for D82 passive storage helpers. */
16
16
  type ContentAddressedMode = "read" | "write" | "read-write" | "read-strict";
@@ -27,6 +27,10 @@ import {
27
27
  walFrameKey,
28
28
  walFramePrefix
29
29
  } from "../chunk-GTPCOEOZ.js";
30
+ import {
31
+ readThroughKv,
32
+ tieredReadThrough
33
+ } from "../chunk-Z2ANQ6JW.js";
30
34
  import {
31
35
  assertChangeEnvelope,
32
36
  assertDecimalIntegerString,
@@ -54,10 +58,6 @@ import {
54
58
  multiWriterAppendLogStorage,
55
59
  readAppendLogPage
56
60
  } from "../chunk-6PHB5CJS.js";
57
- import {
58
- readThroughKv,
59
- tieredReadThrough
60
- } from "../chunk-Z2ANQ6JW.js";
61
61
  import {
62
62
  dictKv,
63
63
  hasKvPutIfAbsent,
@@ -83,6 +83,7 @@ import {
83
83
  strictJsonCodec,
84
84
  strictJsonCodecFor
85
85
  } from "../chunk-4VLAQHZI.js";
86
+ import "../chunk-DGUM43GV.js";
86
87
  export {
87
88
  APPEND_LOG_SEQ_PAD,
88
89
  ContentAddressedMissError,
@@ -5,6 +5,7 @@ import {
5
5
  kvStorage
6
6
  } from "../chunk-DKP56CSW.js";
7
7
  import "../chunk-4VLAQHZI.js";
8
+ import "../chunk-DGUM43GV.js";
8
9
 
9
10
  // src/storage/node.ts
10
11
  import { randomBytes } from "crypto";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/node.ts"],"sourcesContent":["/**\n * Node-only passive storage backends (D103).\n *\n * Import from `@graphrefly/ts/storage/node`; the universal storage barrel stays browser-safe.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport {\n\tcloseSync,\n\tmkdirSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\tunlinkSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { basename, dirname, join } from \"node:path\";\nimport { type AppendLogStorageTier, appendLogStorage } from \"./append-log.js\";\nimport type { StorageBackend, StorageGeneration, StorageNamespaceOptions } from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { type KvStorageTier, kvStorage } from \"./kv.js\";\n\nexport interface FileBackendOptions extends StorageNamespaceOptions {\n\t/** File suffix used for stored byte blobs. Defaults to `.bin`. */\n\textension?: string;\n}\n\nexport interface FileKvOptions<T> extends FileBackendOptions {\n\tcodec?: Codec<T>;\n}\n\nexport interface FileAppendLogOptions<T> extends FileKvOptions<T> {\n\t/** Append-log key prefix. Defaults to `event-log`. */\n\tprefix?: string;\n}\n\nexport interface SqliteBackendOptions extends StorageNamespaceOptions {\n\t/** Table name used for passive byte storage. Defaults to `graphrefly_storage`. */\n\ttableName?: string;\n}\n\nexport interface SqliteKvOptions<T> extends SqliteBackendOptions {\n\tcodec?: Codec<T>;\n}\n\nexport interface SqliteAppendLogOptions<T> extends SqliteKvOptions<T> {\n\t/** Append-log key prefix. Defaults to `event-log`. */\n\tprefix?: string;\n}\n\nexport interface ClosableStorageBackend extends StorageBackend {\n\treadonly name: string;\n\tclose(): void;\n}\n\ntype SqliteDatabaseConstructor = new (path: string) => SqliteDatabase;\n\ninterface SqliteDatabase {\n\texec(sql: string): void;\n\tprepare(sql: string): SqliteStatement;\n\tclose(): void;\n}\n\ninterface SqliteStatement {\n\tget(...params: unknown[]): unknown;\n\trun(...params: unknown[]): unknown;\n\tall(...params: unknown[]): unknown[];\n}\n\nconst FILE_STEM_PREFIX = \"k-\";\nconst NAMESPACE_SEPARATOR = \"\\u0000\";\nconst SQLITE_GENERATION = Symbol(\"graphrefly.sqliteBackend.generation\");\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\nconst require = createRequire(\"/graphrefly-storage-node.js\");\n\ninterface SqliteGeneration {\n\treadonly [SQLITE_GENERATION]: readonly [\n\t\tstorageId: object,\n\t\tkey: string,\n\t\trowGeneration: number | null,\n\t\tepoch: number,\n\t];\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error as { code?: unknown }).code === code\n\t);\n}\n\nfunction keyToStem(key: string): string {\n\tlet out = \"\";\n\tfor (const ch of key) {\n\t\tif (/^[a-zA-Z0-9_-]$/.test(ch)) {\n\t\t\tout += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const byte of encoder.encode(ch)) out += `%${byte.toString(16).padStart(2, \"0\")}`;\n\t}\n\treturn out;\n}\n\nfunction stemToKey(stem: string): string | null {\n\tconst bytes: number[] = [];\n\tlet i = 0;\n\twhile (i < stem.length) {\n\t\tconst ch = stem[i]!;\n\t\tif (ch === \"%\" && i + 2 < stem.length) {\n\t\t\tconst hex = stem.slice(i + 1, i + 3);\n\t\t\tif (/^[0-9a-f]{2}$/i.test(hex)) {\n\t\t\t\tbytes.push(Number.parseInt(hex, 16));\n\t\t\t\ti += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tconst code = ch.charCodeAt(0);\n\t\tif (code > 0x7f) return null;\n\t\tbytes.push(code);\n\t\ti += 1;\n\t}\n\ttry {\n\t\treturn decoder.decode(new Uint8Array(bytes));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction validateExtension(extension: string): string {\n\tif (\n\t\textension.length < 2 ||\n\t\t!extension.startsWith(\".\") ||\n\t\textension.includes(\"..\") ||\n\t\t/[/\\\\\\0]/.test(extension) ||\n\t\t!/^[.A-Za-z0-9_-]+$/.test(extension)\n\t) {\n\t\tthrow new TypeError(\"fileBackend: extension must be a simple suffix such as .bin\");\n\t}\n\treturn extension;\n}\n\nfunction validateNamespace(label: string, namespace: string): string {\n\tif (typeof namespace !== \"string\") {\n\t\tthrow new TypeError(`${label}: namespace must be a string`);\n\t}\n\tif (namespace.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: namespace must not contain U+0000`);\n\t}\n\treturn namespace;\n}\n\nfunction validateLogicalKey(label: string, key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(`${label}: key must be a string`);\n\t}\n\tif (key.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: key must not contain U+0000`);\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(label: string, prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(`${label}: list prefix must be a string`);\n\t}\n\tif (prefix.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: list prefix must not contain U+0000`);\n\t}\n\treturn prefix;\n}\n\nfunction validateSqliteTableName(tableName: string): string {\n\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) {\n\t\tthrow new TypeError(\"sqliteBackend: tableName must be a simple SQLite identifier\");\n\t}\n\treturn tableName;\n}\n\nfunction sqliteGeneration(\n\tstorageId: object,\n\tkey: string,\n\trowGeneration: number | null,\n\tepoch: number,\n): SqliteGeneration {\n\treturn Object.freeze({\n\t\t[SQLITE_GENERATION]: Object.freeze([storageId, key, rowGeneration, epoch] as const),\n\t});\n}\n\nfunction readSqliteGeneration(\n\tgeneration: StorageGeneration,\n):\n\t| readonly [storageId: object, key: string, rowGeneration: number | null, epoch: number]\n\t| undefined {\n\tif (typeof generation !== \"object\" || generation === null) return undefined;\n\tconst maybe = generation as Partial<SqliteGeneration>;\n\tconst token = maybe[SQLITE_GENERATION];\n\tif (\n\t\tArray.isArray(token) &&\n\t\ttoken.length === 4 &&\n\t\ttypeof token[0] === \"object\" &&\n\t\ttoken[0] !== null &&\n\t\ttypeof token[1] === \"string\" &&\n\t\t(token[2] === null || typeof token[2] === \"number\") &&\n\t\ttypeof token[3] === \"number\"\n\t) {\n\t\treturn token as readonly [object, string, number | null, number];\n\t}\n\treturn undefined;\n}\n\nfunction sqliteChanges(result: unknown): number {\n\treturn typeof result === \"object\" &&\n\t\tresult !== null &&\n\t\t\"changes\" in result &&\n\t\ttypeof (result as { changes?: unknown }).changes === \"number\"\n\t\t? (result as { changes: number }).changes\n\t\t: 0;\n}\n\nfunction sqliteBytes(value: Uint8Array | ArrayBuffer): Uint8Array {\n\treturn Uint8Array.from(value instanceof Uint8Array ? value : new Uint8Array(value));\n}\n\nfunction loadSqliteDatabaseSync(): SqliteDatabaseConstructor {\n\ttry {\n\t\tconst DatabaseSync = (require(\"node:sqlite\") as { DatabaseSync?: unknown }).DatabaseSync;\n\t\tif (typeof DatabaseSync !== \"function\") {\n\t\t\tthrow new TypeError(\"DatabaseSync export is missing\");\n\t\t}\n\t\treturn DatabaseSync as SqliteDatabaseConstructor;\n\t} catch (error) {\n\t\tthrow new Error(\"sqliteBackend: node:sqlite is not available in this Node runtime\", {\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\n/** Node filesystem byte backend with atomic replace writes and D85 conditional create. */\nexport function fileBackend(dir: string, opts: FileBackendOptions = {}): StorageBackend {\n\tconst extension = validateExtension(opts.extension ?? \".bin\");\n\tconst namespace =\n\t\topts.namespace === undefined ? \"\" : validateNamespace(\"fileBackend\", opts.namespace);\n\tconst namespacePrefix = namespace.length > 0 ? `${namespace}${NAMESPACE_SEPARATOR}` : \"\";\n\tconst storageKey = (key: string) => `${namespacePrefix}${validateLogicalKey(\"fileBackend\", key)}`;\n\tconst pathFor = (key: string) =>\n\t\tjoin(dir, `${FILE_STEM_PREFIX}${keyToStem(storageKey(key))}${extension}`);\n\tconst keyFromFilename = (filename: string): string | null => {\n\t\tif (!filename.endsWith(extension)) return null;\n\t\tconst stem = filename.slice(0, -extension.length);\n\t\tif (!stem.startsWith(FILE_STEM_PREFIX)) return null;\n\t\tconst key = stemToKey(stem.slice(FILE_STEM_PREFIX.length));\n\t\tif (key === null || !key.startsWith(namespacePrefix)) return null;\n\t\tconst logical = key.slice(namespacePrefix.length);\n\t\tif (logical.includes(NAMESPACE_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"fileBackend: malformed stored key\");\n\t\t}\n\t\treturn logical;\n\t};\n\n\treturn {\n\t\tget(key) {\n\t\t\ttry {\n\t\t\t\treturn Uint8Array.from(readFileSync(pathFor(key)));\n\t\t\t} catch (error) {\n\t\t\t\tif (isErrno(error, \"ENOENT\")) return undefined;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\tput(key, value) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t\tconst filePath = pathFor(key);\n\t\t\tconst base = basename(filePath);\n\t\t\tconst parent = dirname(filePath);\n\t\t\tconst tmp = join(parent, `.${base}.${randomBytes(8).toString(\"hex\")}.tmp`);\n\t\t\ttry {\n\t\t\t\twriteFileSync(tmp, value);\n\t\t\t\trenameSync(tmp, filePath);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tunlinkSync(tmp);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore cleanup failures; the original write error is the useful one.\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t\tconst filePath = pathFor(key);\n\t\t\tlet fd: number | undefined;\n\t\t\ttry {\n\t\t\t\tfd = openSync(filePath, \"wx\");\n\t\t\t\twriteFileSync(fd, value);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tif (isErrno(error, \"EEXIST\")) return false;\n\t\t\t\tif (fd !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tunlinkSync(filePath);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Best effort cleanup of a partially-created file.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tif (fd !== undefined) closeSync(fd);\n\t\t\t}\n\t\t},\n\t\tdelete(key) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(pathFor(key));\n\t\t\t} catch (error) {\n\t\t\t\tif (!isErrno(error, \"ENOENT\")) throw error;\n\t\t\t}\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(\"fileBackend\", prefix);\n\t\t\tlet entries: string[];\n\t\t\ttry {\n\t\t\t\tentries = readdirSync(dir);\n\t\t\t} catch (error) {\n\t\t\t\tif (isErrno(error, \"ENOENT\")) return [];\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst keys: string[] = [];\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.startsWith(\".\")) continue;\n\t\t\t\tconst key = keyFromFilename(entry);\n\t\t\t\tif (key?.startsWith(validatedPrefix)) keys.push(key);\n\t\t\t}\n\t\t\treturn keys.sort();\n\t\t},\n\t};\n}\n\n/**\n * Create a typed KV tier over a Node filesystem backend (D106 passive storage).\n */\nexport function fileKv<T>(dir: string, opts: FileKvOptions<T> = {}): KvStorageTier<T> {\n\treturn kvStorage<T>({\n\t\tbackend: fileBackend(dir, opts),\n\t\tcodec: opts.codec,\n\t});\n}\n\n/**\n * Create an append-log tier over a Node filesystem backend (D106 passive storage).\n */\nexport function fileAppendLog<T>(\n\tdir: string,\n\topts: FileAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> {\n\treturn appendLogStorage<T>({\n\t\tkv: fileKv<T>(dir, opts),\n\t\tprefix: opts.prefix ?? \"event-log\",\n\t});\n}\n\n/**\n * Optional Node SQLite byte backend (D106 passive storage).\n *\n * Uses `node:sqlite` when the current Node runtime provides it; otherwise throws a clear\n * runtime error at construction time. The caller owns `close()`.\n */\nexport function sqliteBackend(\n\tpath: string,\n\topts: SqliteBackendOptions = {},\n): ClosableStorageBackend {\n\tconst table = validateSqliteTableName(opts.tableName ?? \"graphrefly_storage\");\n\tconst metaTable = validateSqliteTableName(`${table}_meta`);\n\tconst namespace =\n\t\topts.namespace === undefined ? \"\" : validateNamespace(\"sqliteBackend\", opts.namespace);\n\tconst DatabaseSync = loadSqliteDatabaseSync();\n\tconst namespacePrefix = namespace.length > 0 ? `${namespace}${NAMESPACE_SEPARATOR}` : \"\";\n\tconst storageKey = (key: string) =>\n\t\t`${namespacePrefix}${validateLogicalKey(\"sqliteBackend\", key)}`;\n\tconst storageId = Object.freeze({});\n\tconst logicalKey = (key: string): string | undefined => {\n\t\tif (typeof key !== \"string\") {\n\t\t\tthrow new TypeError(\"sqliteBackend: stored key is corrupt\");\n\t\t}\n\t\tif (!key.startsWith(namespacePrefix)) return undefined;\n\t\tconst logical = key.slice(namespacePrefix.length);\n\t\tif (logical.includes(NAMESPACE_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"sqliteBackend: malformed stored key\");\n\t\t}\n\t\treturn logical;\n\t};\n\tconst db = new DatabaseSync(path);\n\tdb.exec(\n\t\t`CREATE TABLE IF NOT EXISTS ${table} (k TEXT PRIMARY KEY, v BLOB NOT NULL, g INTEGER NOT NULL DEFAULT 0)`,\n\t);\n\tconst columns = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name?: string }>;\n\tif (!columns.some((column) => column.name === \"g\")) {\n\t\tdb.exec(`ALTER TABLE ${table} ADD COLUMN g INTEGER NOT NULL DEFAULT 0`);\n\t}\n\tdb.exec(`CREATE TABLE IF NOT EXISTS ${metaTable} (k TEXT PRIMARY KEY, v INTEGER NOT NULL)`);\n\tdb.exec(`\n\t\tCREATE TRIGGER IF NOT EXISTS ${table}_generation_insert\n\t\tAFTER INSERT ON ${table}\n\t\tBEGIN\n\t\t\tINSERT INTO ${metaTable} (k, v) VALUES (NEW.k, 1)\n\t\t\tON CONFLICT(k) DO UPDATE SET v = ${metaTable}.v + 1;\n\t\tEND\n\t`);\n\tdb.exec(`\n\t\tCREATE TRIGGER IF NOT EXISTS ${table}_generation_update\n\t\tAFTER UPDATE ON ${table}\n\t\tBEGIN\n\t\t\tINSERT INTO ${metaTable} (k, v) VALUES (NEW.k, 1)\n\t\t\tON CONFLICT(k) DO UPDATE SET v = ${metaTable}.v + 1;\n\t\tEND\n\t`);\n\tdb.exec(`\n\t\tCREATE TRIGGER IF NOT EXISTS ${table}_generation_delete\n\t\tAFTER DELETE ON ${table}\n\t\tBEGIN\n\t\t\tINSERT INTO ${metaTable} (k, v) VALUES (OLD.k, 1)\n\t\t\tON CONFLICT(k) DO UPDATE SET v = ${metaTable}.v + 1;\n\t\tEND\n\t`);\n\n\tconst keyEpoch = (key: string): number => {\n\t\tconst row = db.prepare(`SELECT v FROM ${metaTable} WHERE k = ?`).get(key) as\n\t\t\t| { v?: number }\n\t\t\t| undefined;\n\t\tconst value = row?.v ?? 0;\n\t\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n\t\t\tthrow new Error(\"sqliteBackend: per-key generation epoch is corrupt\");\n\t\t}\n\t\treturn value;\n\t};\n\tconst readRow = (\n\t\tkey: string,\n\t):\n\t\t| {\n\t\t\t\treadonly value: Uint8Array;\n\t\t\t\treadonly generation: number;\n\t\t }\n\t\t| undefined => {\n\t\tconst row = db.prepare(`SELECT v, g FROM ${table} WHERE k = ?`).get(storageKey(key)) as\n\t\t\t| { v?: Uint8Array | ArrayBuffer; g?: number }\n\t\t\t| undefined;\n\t\tif (row?.v === undefined) return undefined;\n\t\tconst generation = row.g;\n\t\tif (typeof generation !== \"number\" || !Number.isSafeInteger(generation) || generation < 0) {\n\t\t\tthrow new Error(\"sqliteBackend: row generation is corrupt\");\n\t\t}\n\t\treturn { value: sqliteBytes(row.v), generation };\n\t};\n\n\treturn {\n\t\tname: `sqlite:${path}/${table}`,\n\t\tget(key) {\n\t\t\treturn readRow(key)?.value;\n\t\t},\n\t\tput(key, value) {\n\t\t\tdb.prepare(\n\t\t\t\t`INSERT INTO ${table} (k, v, g) VALUES (?, ?, 0) ON CONFLICT(k) DO UPDATE SET v = excluded.v, g = ${table}.g + 1`,\n\t\t\t).run(storageKey(key), value);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tconst result = db\n\t\t\t\t.prepare(`INSERT OR IGNORE INTO ${table} (k, v, g) VALUES (?, ?, 0)`)\n\t\t\t\t.run(storageKey(key), value) as { changes?: number };\n\t\t\treturn sqliteChanges(result) === 1;\n\t\t},\n\t\tgetVersioned(key) {\n\t\t\tconst row = readRow(key);\n\t\t\tif (row === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"miss\",\n\t\t\t\t\tgeneration: sqliteGeneration(storageId, storageKey(key), null, keyEpoch(storageKey(key))),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"hit\",\n\t\t\t\tvalue: row.value,\n\t\t\t\tgeneration: sqliteGeneration(\n\t\t\t\t\tstorageId,\n\t\t\t\t\tstorageKey(key),\n\t\t\t\t\trow.generation,\n\t\t\t\t\tkeyEpoch(storageKey(key)),\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\tsetIfMatch(key, value, generation) {\n\t\t\tconst keyForStorage = storageKey(key);\n\t\t\tconst observed = readSqliteGeneration(generation);\n\t\t\tif (observed === undefined || observed[0] !== storageId || observed[1] !== keyForStorage) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (observed[2] === null) {\n\t\t\t\treturn (\n\t\t\t\t\tsqliteChanges(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.prepare(\n\t\t\t\t\t\t\t\t`INSERT INTO ${table} (k, v, g) SELECT ?, ?, 0 WHERE COALESCE((SELECT v FROM ${metaTable} WHERE k = ?), 0) = ? AND NOT EXISTS (SELECT 1 FROM ${table} WHERE k = ?)`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.run(keyForStorage, value, keyForStorage, observed[3], keyForStorage),\n\t\t\t\t\t) === 1\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\tsqliteChanges(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.prepare(\n\t\t\t\t\t\t\t`UPDATE ${table} SET v = ?, g = g + 1 WHERE k = ? AND g = ? AND COALESCE((SELECT v FROM ${metaTable} WHERE k = ?), 0) = ?`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.run(value, keyForStorage, observed[2], keyForStorage, observed[3]),\n\t\t\t\t) === 1\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tdb.prepare(`DELETE FROM ${table} WHERE k = ?`).run(storageKey(key));\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(\"sqliteBackend\", prefix);\n\t\t\tconst rows = db.prepare(`SELECT k FROM ${table} ORDER BY k`).all() as { k: string }[];\n\t\t\tconst out: string[] = [];\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst key = logicalKey(row.k);\n\t\t\t\tif (key?.startsWith(validatedPrefix)) out.push(key);\n\t\t\t}\n\t\t\treturn out.sort();\n\t\t},\n\t\tclose() {\n\t\t\tdb.close();\n\t\t},\n\t};\n}\n\n/**\n * Create a typed KV tier over an optional Node SQLite backend.\n */\nexport function sqliteKv<T>(\n\tpath: string,\n\topts: SqliteKvOptions<T> = {},\n): KvStorageTier<T> & { close(): void } {\n\tconst backend = sqliteBackend(path, opts);\n\tconst tier = kvStorage<T>({\n\t\tbackend,\n\t\tcodec: opts.codec,\n\t});\n\treturn Object.assign(tier, { close: () => backend.close() });\n}\n\n/**\n * Create an append-log tier over an optional Node SQLite backend.\n */\nexport function sqliteAppendLog<T>(\n\tpath: string,\n\topts: SqliteAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> & { close(): void } {\n\tconst kv = sqliteKv<T>(path, opts);\n\tconst log = appendLogStorage<T>({ kv, prefix: opts.prefix ?? \"event-log\" });\n\treturn Object.assign(log, { close: () => kv.close() });\n}\n"],"mappings":"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","names":["require"]}
1
+ {"version":3,"sources":["../../src/storage/node.ts"],"sourcesContent":["/**\n * Node-only passive storage backends (D103).\n *\n * Import from `@graphrefly/ts/storage/node`; the universal storage barrel stays browser-safe.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport {\n\tcloseSync,\n\tmkdirSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\tunlinkSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { basename, dirname, join } from \"node:path\";\nimport { type AppendLogStorageTier, appendLogStorage } from \"./append-log.js\";\nimport type { StorageBackend, StorageGeneration, StorageNamespaceOptions } from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { type KvStorageTier, kvStorage } from \"./kv.js\";\n\nexport interface FileBackendOptions extends StorageNamespaceOptions {\n\t/** File suffix used for stored byte blobs. Defaults to `.bin`. */\n\textension?: string;\n}\n\nexport interface FileKvOptions<T> extends FileBackendOptions {\n\tcodec?: Codec<T>;\n}\n\nexport interface FileAppendLogOptions<T> extends FileKvOptions<T> {\n\t/** Append-log key prefix. Defaults to `event-log`. */\n\tprefix?: string;\n}\n\nexport interface SqliteBackendOptions extends StorageNamespaceOptions {\n\t/** Table name used for passive byte storage. Defaults to `graphrefly_storage`. */\n\ttableName?: string;\n}\n\nexport interface SqliteKvOptions<T> extends SqliteBackendOptions {\n\tcodec?: Codec<T>;\n}\n\nexport interface SqliteAppendLogOptions<T> extends SqliteKvOptions<T> {\n\t/** Append-log key prefix. Defaults to `event-log`. */\n\tprefix?: string;\n}\n\nexport interface ClosableStorageBackend extends StorageBackend {\n\treadonly name: string;\n\tclose(): void;\n}\n\ntype SqliteDatabaseConstructor = new (path: string) => SqliteDatabase;\n\ninterface SqliteDatabase {\n\texec(sql: string): void;\n\tprepare(sql: string): SqliteStatement;\n\tclose(): void;\n}\n\ninterface SqliteStatement {\n\tget(...params: unknown[]): unknown;\n\trun(...params: unknown[]): unknown;\n\tall(...params: unknown[]): unknown[];\n}\n\nconst FILE_STEM_PREFIX = \"k-\";\nconst NAMESPACE_SEPARATOR = \"\\u0000\";\nconst SQLITE_GENERATION = Symbol(\"graphrefly.sqliteBackend.generation\");\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\nconst require = createRequire(\"/graphrefly-storage-node.js\");\n\ninterface SqliteGeneration {\n\treadonly [SQLITE_GENERATION]: readonly [\n\t\tstorageId: object,\n\t\tkey: string,\n\t\trowGeneration: number | null,\n\t\tepoch: number,\n\t];\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error as { code?: unknown }).code === code\n\t);\n}\n\nfunction keyToStem(key: string): string {\n\tlet out = \"\";\n\tfor (const ch of key) {\n\t\tif (/^[a-zA-Z0-9_-]$/.test(ch)) {\n\t\t\tout += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const byte of encoder.encode(ch)) out += `%${byte.toString(16).padStart(2, \"0\")}`;\n\t}\n\treturn out;\n}\n\nfunction stemToKey(stem: string): string | null {\n\tconst bytes: number[] = [];\n\tlet i = 0;\n\twhile (i < stem.length) {\n\t\tconst ch = stem[i]!;\n\t\tif (ch === \"%\" && i + 2 < stem.length) {\n\t\t\tconst hex = stem.slice(i + 1, i + 3);\n\t\t\tif (/^[0-9a-f]{2}$/i.test(hex)) {\n\t\t\t\tbytes.push(Number.parseInt(hex, 16));\n\t\t\t\ti += 3;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tconst code = ch.charCodeAt(0);\n\t\tif (code > 0x7f) return null;\n\t\tbytes.push(code);\n\t\ti += 1;\n\t}\n\ttry {\n\t\treturn decoder.decode(new Uint8Array(bytes));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction validateExtension(extension: string): string {\n\tif (\n\t\textension.length < 2 ||\n\t\t!extension.startsWith(\".\") ||\n\t\textension.includes(\"..\") ||\n\t\t/[/\\\\\\0]/.test(extension) ||\n\t\t!/^[.A-Za-z0-9_-]+$/.test(extension)\n\t) {\n\t\tthrow new TypeError(\"fileBackend: extension must be a simple suffix such as .bin\");\n\t}\n\treturn extension;\n}\n\nfunction validateNamespace(label: string, namespace: string): string {\n\tif (typeof namespace !== \"string\") {\n\t\tthrow new TypeError(`${label}: namespace must be a string`);\n\t}\n\tif (namespace.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: namespace must not contain U+0000`);\n\t}\n\treturn namespace;\n}\n\nfunction validateLogicalKey(label: string, key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(`${label}: key must be a string`);\n\t}\n\tif (key.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: key must not contain U+0000`);\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(label: string, prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(`${label}: list prefix must be a string`);\n\t}\n\tif (prefix.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: list prefix must not contain U+0000`);\n\t}\n\treturn prefix;\n}\n\nfunction validateSqliteTableName(tableName: string): string {\n\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) {\n\t\tthrow new TypeError(\"sqliteBackend: tableName must be a simple SQLite identifier\");\n\t}\n\treturn tableName;\n}\n\nfunction sqliteGeneration(\n\tstorageId: object,\n\tkey: string,\n\trowGeneration: number | null,\n\tepoch: number,\n): SqliteGeneration {\n\treturn Object.freeze({\n\t\t[SQLITE_GENERATION]: Object.freeze([storageId, key, rowGeneration, epoch] as const),\n\t});\n}\n\nfunction readSqliteGeneration(\n\tgeneration: StorageGeneration,\n):\n\t| readonly [storageId: object, key: string, rowGeneration: number | null, epoch: number]\n\t| undefined {\n\tif (typeof generation !== \"object\" || generation === null) return undefined;\n\tconst maybe = generation as Partial<SqliteGeneration>;\n\tconst token = maybe[SQLITE_GENERATION];\n\tif (\n\t\tArray.isArray(token) &&\n\t\ttoken.length === 4 &&\n\t\ttypeof token[0] === \"object\" &&\n\t\ttoken[0] !== null &&\n\t\ttypeof token[1] === \"string\" &&\n\t\t(token[2] === null || typeof token[2] === \"number\") &&\n\t\ttypeof token[3] === \"number\"\n\t) {\n\t\treturn token as readonly [object, string, number | null, number];\n\t}\n\treturn undefined;\n}\n\nfunction sqliteChanges(result: unknown): number {\n\treturn typeof result === \"object\" &&\n\t\tresult !== null &&\n\t\t\"changes\" in result &&\n\t\ttypeof (result as { changes?: unknown }).changes === \"number\"\n\t\t? (result as { changes: number }).changes\n\t\t: 0;\n}\n\nfunction sqliteBytes(value: Uint8Array | ArrayBuffer): Uint8Array {\n\treturn Uint8Array.from(value instanceof Uint8Array ? value : new Uint8Array(value));\n}\n\nfunction loadSqliteDatabaseSync(): SqliteDatabaseConstructor {\n\ttry {\n\t\tconst DatabaseSync = (require(\"node:sqlite\") as { DatabaseSync?: unknown }).DatabaseSync;\n\t\tif (typeof DatabaseSync !== \"function\") {\n\t\t\tthrow new TypeError(\"DatabaseSync export is missing\");\n\t\t}\n\t\treturn DatabaseSync as SqliteDatabaseConstructor;\n\t} catch (error) {\n\t\tthrow new Error(\"sqliteBackend: node:sqlite is not available in this Node runtime\", {\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\n/** Node filesystem byte backend with atomic replace writes and D85 conditional create. */\nexport function fileBackend(dir: string, opts: FileBackendOptions = {}): StorageBackend {\n\tconst extension = validateExtension(opts.extension ?? \".bin\");\n\tconst namespace =\n\t\topts.namespace === undefined ? \"\" : validateNamespace(\"fileBackend\", opts.namespace);\n\tconst namespacePrefix = namespace.length > 0 ? `${namespace}${NAMESPACE_SEPARATOR}` : \"\";\n\tconst storageKey = (key: string) => `${namespacePrefix}${validateLogicalKey(\"fileBackend\", key)}`;\n\tconst pathFor = (key: string) =>\n\t\tjoin(dir, `${FILE_STEM_PREFIX}${keyToStem(storageKey(key))}${extension}`);\n\tconst keyFromFilename = (filename: string): string | null => {\n\t\tif (!filename.endsWith(extension)) return null;\n\t\tconst stem = filename.slice(0, -extension.length);\n\t\tif (!stem.startsWith(FILE_STEM_PREFIX)) return null;\n\t\tconst key = stemToKey(stem.slice(FILE_STEM_PREFIX.length));\n\t\tif (key === null || !key.startsWith(namespacePrefix)) return null;\n\t\tconst logical = key.slice(namespacePrefix.length);\n\t\tif (logical.includes(NAMESPACE_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"fileBackend: malformed stored key\");\n\t\t}\n\t\treturn logical;\n\t};\n\n\treturn {\n\t\tget(key) {\n\t\t\ttry {\n\t\t\t\treturn Uint8Array.from(readFileSync(pathFor(key)));\n\t\t\t} catch (error) {\n\t\t\t\tif (isErrno(error, \"ENOENT\")) return undefined;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\tput(key, value) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t\tconst filePath = pathFor(key);\n\t\t\tconst base = basename(filePath);\n\t\t\tconst parent = dirname(filePath);\n\t\t\tconst tmp = join(parent, `.${base}.${randomBytes(8).toString(\"hex\")}.tmp`);\n\t\t\ttry {\n\t\t\t\twriteFileSync(tmp, value);\n\t\t\t\trenameSync(tmp, filePath);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tunlinkSync(tmp);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore cleanup failures; the original write error is the useful one.\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t\tconst filePath = pathFor(key);\n\t\t\tlet fd: number | undefined;\n\t\t\ttry {\n\t\t\t\tfd = openSync(filePath, \"wx\");\n\t\t\t\twriteFileSync(fd, value);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tif (isErrno(error, \"EEXIST\")) return false;\n\t\t\t\tif (fd !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tunlinkSync(filePath);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Best effort cleanup of a partially-created file.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tif (fd !== undefined) closeSync(fd);\n\t\t\t}\n\t\t},\n\t\tdelete(key) {\n\t\t\ttry {\n\t\t\t\tunlinkSync(pathFor(key));\n\t\t\t} catch (error) {\n\t\t\t\tif (!isErrno(error, \"ENOENT\")) throw error;\n\t\t\t}\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(\"fileBackend\", prefix);\n\t\t\tlet entries: string[];\n\t\t\ttry {\n\t\t\t\tentries = readdirSync(dir);\n\t\t\t} catch (error) {\n\t\t\t\tif (isErrno(error, \"ENOENT\")) return [];\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst keys: string[] = [];\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.startsWith(\".\")) continue;\n\t\t\t\tconst key = keyFromFilename(entry);\n\t\t\t\tif (key?.startsWith(validatedPrefix)) keys.push(key);\n\t\t\t}\n\t\t\treturn keys.sort();\n\t\t},\n\t};\n}\n\n/**\n * Create a typed KV tier over a Node filesystem backend (D106 passive storage).\n */\nexport function fileKv<T>(dir: string, opts: FileKvOptions<T> = {}): KvStorageTier<T> {\n\treturn kvStorage<T>({\n\t\tbackend: fileBackend(dir, opts),\n\t\tcodec: opts.codec,\n\t});\n}\n\n/**\n * Create an append-log tier over a Node filesystem backend (D106 passive storage).\n */\nexport function fileAppendLog<T>(\n\tdir: string,\n\topts: FileAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> {\n\treturn appendLogStorage<T>({\n\t\tkv: fileKv<T>(dir, opts),\n\t\tprefix: opts.prefix ?? \"event-log\",\n\t});\n}\n\n/**\n * Optional Node SQLite byte backend (D106 passive storage).\n *\n * Uses `node:sqlite` when the current Node runtime provides it; otherwise throws a clear\n * runtime error at construction time. The caller owns `close()`.\n */\nexport function sqliteBackend(\n\tpath: string,\n\topts: SqliteBackendOptions = {},\n): ClosableStorageBackend {\n\tconst table = validateSqliteTableName(opts.tableName ?? \"graphrefly_storage\");\n\tconst metaTable = validateSqliteTableName(`${table}_meta`);\n\tconst namespace =\n\t\topts.namespace === undefined ? \"\" : validateNamespace(\"sqliteBackend\", opts.namespace);\n\tconst DatabaseSync = loadSqliteDatabaseSync();\n\tconst namespacePrefix = namespace.length > 0 ? `${namespace}${NAMESPACE_SEPARATOR}` : \"\";\n\tconst storageKey = (key: string) =>\n\t\t`${namespacePrefix}${validateLogicalKey(\"sqliteBackend\", key)}`;\n\tconst storageId = Object.freeze({});\n\tconst logicalKey = (key: string): string | undefined => {\n\t\tif (typeof key !== \"string\") {\n\t\t\tthrow new TypeError(\"sqliteBackend: stored key is corrupt\");\n\t\t}\n\t\tif (!key.startsWith(namespacePrefix)) return undefined;\n\t\tconst logical = key.slice(namespacePrefix.length);\n\t\tif (logical.includes(NAMESPACE_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"sqliteBackend: malformed stored key\");\n\t\t}\n\t\treturn logical;\n\t};\n\tconst db = new DatabaseSync(path);\n\tdb.exec(\n\t\t`CREATE TABLE IF NOT EXISTS ${table} (k TEXT PRIMARY KEY, v BLOB NOT NULL, g INTEGER NOT NULL DEFAULT 0)`,\n\t);\n\tconst columns = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name?: string }>;\n\tif (!columns.some((column) => column.name === \"g\")) {\n\t\tdb.exec(`ALTER TABLE ${table} ADD COLUMN g INTEGER NOT NULL DEFAULT 0`);\n\t}\n\tdb.exec(`CREATE TABLE IF NOT EXISTS ${metaTable} (k TEXT PRIMARY KEY, v INTEGER NOT NULL)`);\n\tdb.exec(`\n\t\tCREATE TRIGGER IF NOT EXISTS ${table}_generation_insert\n\t\tAFTER INSERT ON ${table}\n\t\tBEGIN\n\t\t\tINSERT INTO ${metaTable} (k, v) VALUES (NEW.k, 1)\n\t\t\tON CONFLICT(k) DO UPDATE SET v = ${metaTable}.v + 1;\n\t\tEND\n\t`);\n\tdb.exec(`\n\t\tCREATE TRIGGER IF NOT EXISTS ${table}_generation_update\n\t\tAFTER UPDATE ON ${table}\n\t\tBEGIN\n\t\t\tINSERT INTO ${metaTable} (k, v) VALUES (NEW.k, 1)\n\t\t\tON CONFLICT(k) DO UPDATE SET v = ${metaTable}.v + 1;\n\t\tEND\n\t`);\n\tdb.exec(`\n\t\tCREATE TRIGGER IF NOT EXISTS ${table}_generation_delete\n\t\tAFTER DELETE ON ${table}\n\t\tBEGIN\n\t\t\tINSERT INTO ${metaTable} (k, v) VALUES (OLD.k, 1)\n\t\t\tON CONFLICT(k) DO UPDATE SET v = ${metaTable}.v + 1;\n\t\tEND\n\t`);\n\n\tconst keyEpoch = (key: string): number => {\n\t\tconst row = db.prepare(`SELECT v FROM ${metaTable} WHERE k = ?`).get(key) as\n\t\t\t| { v?: number }\n\t\t\t| undefined;\n\t\tconst value = row?.v ?? 0;\n\t\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n\t\t\tthrow new Error(\"sqliteBackend: per-key generation epoch is corrupt\");\n\t\t}\n\t\treturn value;\n\t};\n\tconst readRow = (\n\t\tkey: string,\n\t):\n\t\t| {\n\t\t\t\treadonly value: Uint8Array;\n\t\t\t\treadonly generation: number;\n\t\t }\n\t\t| undefined => {\n\t\tconst row = db.prepare(`SELECT v, g FROM ${table} WHERE k = ?`).get(storageKey(key)) as\n\t\t\t| { v?: Uint8Array | ArrayBuffer; g?: number }\n\t\t\t| undefined;\n\t\tif (row?.v === undefined) return undefined;\n\t\tconst generation = row.g;\n\t\tif (typeof generation !== \"number\" || !Number.isSafeInteger(generation) || generation < 0) {\n\t\t\tthrow new Error(\"sqliteBackend: row generation is corrupt\");\n\t\t}\n\t\treturn { value: sqliteBytes(row.v), generation };\n\t};\n\n\treturn {\n\t\tname: `sqlite:${path}/${table}`,\n\t\tget(key) {\n\t\t\treturn readRow(key)?.value;\n\t\t},\n\t\tput(key, value) {\n\t\t\tdb.prepare(\n\t\t\t\t`INSERT INTO ${table} (k, v, g) VALUES (?, ?, 0) ON CONFLICT(k) DO UPDATE SET v = excluded.v, g = ${table}.g + 1`,\n\t\t\t).run(storageKey(key), value);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tconst result = db\n\t\t\t\t.prepare(`INSERT OR IGNORE INTO ${table} (k, v, g) VALUES (?, ?, 0)`)\n\t\t\t\t.run(storageKey(key), value) as { changes?: number };\n\t\t\treturn sqliteChanges(result) === 1;\n\t\t},\n\t\tgetVersioned(key) {\n\t\t\tconst row = readRow(key);\n\t\t\tif (row === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"miss\",\n\t\t\t\t\tgeneration: sqliteGeneration(storageId, storageKey(key), null, keyEpoch(storageKey(key))),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"hit\",\n\t\t\t\tvalue: row.value,\n\t\t\t\tgeneration: sqliteGeneration(\n\t\t\t\t\tstorageId,\n\t\t\t\t\tstorageKey(key),\n\t\t\t\t\trow.generation,\n\t\t\t\t\tkeyEpoch(storageKey(key)),\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\tsetIfMatch(key, value, generation) {\n\t\t\tconst keyForStorage = storageKey(key);\n\t\t\tconst observed = readSqliteGeneration(generation);\n\t\t\tif (observed === undefined || observed[0] !== storageId || observed[1] !== keyForStorage) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (observed[2] === null) {\n\t\t\t\treturn (\n\t\t\t\t\tsqliteChanges(\n\t\t\t\t\t\tdb\n\t\t\t\t\t\t\t.prepare(\n\t\t\t\t\t\t\t\t`INSERT INTO ${table} (k, v, g) SELECT ?, ?, 0 WHERE COALESCE((SELECT v FROM ${metaTable} WHERE k = ?), 0) = ? AND NOT EXISTS (SELECT 1 FROM ${table} WHERE k = ?)`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.run(keyForStorage, value, keyForStorage, observed[3], keyForStorage),\n\t\t\t\t\t) === 1\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\tsqliteChanges(\n\t\t\t\t\tdb\n\t\t\t\t\t\t.prepare(\n\t\t\t\t\t\t\t`UPDATE ${table} SET v = ?, g = g + 1 WHERE k = ? AND g = ? AND COALESCE((SELECT v FROM ${metaTable} WHERE k = ?), 0) = ?`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.run(value, keyForStorage, observed[2], keyForStorage, observed[3]),\n\t\t\t\t) === 1\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tdb.prepare(`DELETE FROM ${table} WHERE k = ?`).run(storageKey(key));\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(\"sqliteBackend\", prefix);\n\t\t\tconst rows = db.prepare(`SELECT k FROM ${table} ORDER BY k`).all() as { k: string }[];\n\t\t\tconst out: string[] = [];\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst key = logicalKey(row.k);\n\t\t\t\tif (key?.startsWith(validatedPrefix)) out.push(key);\n\t\t\t}\n\t\t\treturn out.sort();\n\t\t},\n\t\tclose() {\n\t\t\tdb.close();\n\t\t},\n\t};\n}\n\n/**\n * Create a typed KV tier over an optional Node SQLite backend.\n */\nexport function sqliteKv<T>(\n\tpath: string,\n\topts: SqliteKvOptions<T> = {},\n): KvStorageTier<T> & { close(): void } {\n\tconst backend = sqliteBackend(path, opts);\n\tconst tier = kvStorage<T>({\n\t\tbackend,\n\t\tcodec: opts.codec,\n\t});\n\treturn Object.assign(tier, { close: () => backend.close() });\n}\n\n/**\n * Create an append-log tier over an optional Node SQLite backend.\n */\nexport function sqliteAppendLog<T>(\n\tpath: string,\n\topts: SqliteAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> & { close(): void } {\n\tconst kv = sqliteKv<T>(path, opts);\n\tconst log = appendLogStorage<T>({ kv, prefix: opts.prefix ?? \"event-log\" });\n\treturn Object.assign(log, { close: () => kv.close() });\n}\n"],"mappings":"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","names":["require"]}
@@ -0,0 +1,123 @@
1
+ import { N as Node } from './types-BsJvElYZ.js';
2
+
3
+ /**
4
+ * Framework-neutral store adapters.
5
+ *
6
+ * Focused framework bindings build on this tiny Node-facing layer without
7
+ * importing framework packages into the dependency-free adapters barrel
8
+ * (D125/D238).
9
+ */
10
+
11
+ /** A minimal readable store contract shared by Svelte/Nanostores-style adapters. */
12
+ interface ReadableStore<T> {
13
+ get(): T | undefined;
14
+ subscribe(run: (value: T | undefined) => void): () => void;
15
+ }
16
+ /** A minimal writable store contract over a clean-slate writable node. */
17
+ interface WritableStore<T> extends ReadableStore<T> {
18
+ set(value: T): void;
19
+ update(fn: (value: T | undefined) => T): void;
20
+ }
21
+ /** React `useSyncExternalStore`-compatible shape, without importing React. */
22
+ interface ExternalStore<T> {
23
+ getSnapshot(): T | undefined;
24
+ getServerSnapshot(): T | undefined;
25
+ subscribe(onStoreChange: () => void): () => void;
26
+ }
27
+ /** Object-of-nodes factory used by record subscription adapters. */
28
+ type NodeRecordFactory<K extends string, R extends Record<string, unknown>> = (key: K) => {
29
+ [P in keyof R]: Node<R[P]>;
30
+ };
31
+ /** Zustand-compatible store API over a caller-owned clean-slate state node. */
32
+ interface ZustandStoreApi<T extends object> {
33
+ getState(): T;
34
+ setState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean): void;
35
+ getInitialState(): T;
36
+ subscribe(listener: (state: T, prevState: T) => void): () => void;
37
+ destroy(): void;
38
+ }
39
+ /** Jotai-style atom facade over a caller-owned node. */
40
+ interface JotaiAtom<T> {
41
+ get(): T | undefined;
42
+ subscribe(callback: (value: T | undefined) => void): () => void;
43
+ readonly _node: Node<T>;
44
+ }
45
+ /** Writable Jotai-style atom facade over a caller-owned writable node. */
46
+ interface WritableJotaiAtom<T> extends JotaiAtom<T> {
47
+ set(value: T): void;
48
+ update(fn: (value: T | undefined) => T): void;
49
+ }
50
+ /** Nanostores-style atom facade over a caller-owned node. */
51
+ interface NanoAtom<T> {
52
+ get(): T | undefined;
53
+ subscribe(callback: (value: T | undefined) => void): () => void;
54
+ listen(callback: (value: T | undefined) => void): () => void;
55
+ readonly _node: Node<T>;
56
+ }
57
+ /** Writable Nanostores-style atom facade over a caller-owned writable node. */
58
+ interface WritableNanoAtom<T> extends NanoAtom<T> {
59
+ set(value: T): void;
60
+ update(fn: (value: T | undefined) => T): void;
61
+ }
62
+ /** TC39-Signals-style facade over a caller-owned node. */
63
+ interface SignalLike<T> {
64
+ get(): T | undefined;
65
+ subscribe(callback: (value: T | undefined) => void): () => void;
66
+ readonly _node: Node<T>;
67
+ }
68
+ /** Writable TC39-Signals-style facade over a caller-owned writable node. */
69
+ interface WritableSignalLike<T> extends SignalLike<T> {
70
+ set(value: T): void;
71
+ update(fn: (value: T | undefined) => T): void;
72
+ }
73
+ interface SubscribeValuesOptions<T> {
74
+ /** Emit the current cache snapshot immediately. `undefined` means SENTINEL/no DATA. */
75
+ immediate?: boolean;
76
+ /** Suppress synchronous push-on-subscribe/replay DATA. Useful for change-only store listeners. */
77
+ changesOnly?: boolean;
78
+ onError?: (error: unknown) => void;
79
+ onComplete?: () => void;
80
+ /** Custom cache reader for wrappers that keep their own snapshot object. */
81
+ getSnapshot?: () => T | undefined;
82
+ }
83
+ interface WritableNode<T> extends Node<T> {
84
+ set(value: T): void;
85
+ }
86
+ interface WritableStoreOptions<T> extends SubscribeValuesOptions<T> {
87
+ /** Override writes for adapters that need a framework-owned reducer. */
88
+ write?: (node: WritableNode<T>, value: T) => void;
89
+ }
90
+ /** Read a node cache without activating it. */
91
+ declare function nodeSnapshot<T>(node: Node<T>): T | undefined;
92
+ /**
93
+ * Subscribe to DATA values from a Node. Protocol internals stay below the adapter boundary:
94
+ * DATA drives value listeners, ERROR/COMPLETE route to optional lifecycle callbacks.
95
+ */
96
+ declare function subscribeNodeValues<T>(node: Node<T>, run: (value: T | undefined) => void, opts?: SubscribeValuesOptions<T>): () => void;
97
+ /** Build a Svelte/Nanostores-style readable store from a clean-slate Node. */
98
+ declare function readableStore<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): ReadableStore<T>;
99
+ /** Build a writable store over a StateNode or compatible clean-slate writable Node. */
100
+ declare function writableStore<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableStore<T>;
101
+ declare function writableStore<T>(node: Node<T>, opts: WritableStoreOptions<T> & {
102
+ write: (node: WritableNode<T>, value: T) => void;
103
+ }): WritableStore<T>;
104
+ /** Build the tiny shape React's `useSyncExternalStore` expects, without importing React. */
105
+ declare function externalStore<T>(node: Node<T>, opts?: Pick<SubscribeValuesOptions<T>, "getSnapshot" | "onError" | "onComplete">): ExternalStore<T>;
106
+ /** Build a framework-neutral keyed record store for focused framework record bindings. */
107
+ declare function recordReadableStore<K extends string, R extends Record<string, unknown>>(keysNode: Node<readonly K[]>, factory: NodeRecordFactory<K, R>, opts?: SubscribeValuesOptions<Record<K, R>>): ReadableStore<Record<K, R>>;
108
+ /** Build a Zustand-compatible StoreApi over a caller-owned clean-slate state node. */
109
+ declare function zustandStore<T extends object>(node: WritableNode<T>, initialState?: T, opts?: WritableStoreOptions<T>): ZustandStoreApi<T>;
110
+ declare function zustandStore<T extends object>(node: Node<T>, initialState: T | undefined, opts: WritableStoreOptions<T> & {
111
+ write: (node: WritableNode<T>, value: T) => void;
112
+ }): ZustandStoreApi<T>;
113
+ /** Build a Jotai-style atom facade over a caller-owned node. */
114
+ declare function jotaiAtom<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableJotaiAtom<T>;
115
+ declare function jotaiAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): JotaiAtom<T>;
116
+ /** Build a Nanostores-style atom facade over a caller-owned node. */
117
+ declare function nanoAtom<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableNanoAtom<T>;
118
+ declare function nanoAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): NanoAtom<T>;
119
+ /** Build a TC39-Signals-style facade over a caller-owned node. */
120
+ declare function signalFromNode<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableSignalLike<T>;
121
+ declare function signalFromNode<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): SignalLike<T>;
122
+
123
+ export { type ExternalStore as E, type JotaiAtom as J, type NanoAtom as N, type ReadableStore as R, type SignalLike as S, type WritableNode as W, type ZustandStoreApi as Z, type NodeRecordFactory as a, type SubscribeValuesOptions as b, type WritableJotaiAtom as c, type WritableNanoAtom as d, type WritableSignalLike as e, type WritableStore as f, type WritableStoreOptions as g, externalStore as h, nodeSnapshot as i, jotaiAtom as j, recordReadableStore as k, subscribeNodeValues as l, nanoAtom as n, readableStore as r, signalFromNode as s, writableStore as w, zustandStore as z };
@@ -0,0 +1,123 @@
1
+ import { N as Node } from './types-CcPIn7sy.cjs';
2
+
3
+ /**
4
+ * Framework-neutral store adapters.
5
+ *
6
+ * Focused framework bindings build on this tiny Node-facing layer without
7
+ * importing framework packages into the dependency-free adapters barrel
8
+ * (D125/D238).
9
+ */
10
+
11
+ /** A minimal readable store contract shared by Svelte/Nanostores-style adapters. */
12
+ interface ReadableStore<T> {
13
+ get(): T | undefined;
14
+ subscribe(run: (value: T | undefined) => void): () => void;
15
+ }
16
+ /** A minimal writable store contract over a clean-slate writable node. */
17
+ interface WritableStore<T> extends ReadableStore<T> {
18
+ set(value: T): void;
19
+ update(fn: (value: T | undefined) => T): void;
20
+ }
21
+ /** React `useSyncExternalStore`-compatible shape, without importing React. */
22
+ interface ExternalStore<T> {
23
+ getSnapshot(): T | undefined;
24
+ getServerSnapshot(): T | undefined;
25
+ subscribe(onStoreChange: () => void): () => void;
26
+ }
27
+ /** Object-of-nodes factory used by record subscription adapters. */
28
+ type NodeRecordFactory<K extends string, R extends Record<string, unknown>> = (key: K) => {
29
+ [P in keyof R]: Node<R[P]>;
30
+ };
31
+ /** Zustand-compatible store API over a caller-owned clean-slate state node. */
32
+ interface ZustandStoreApi<T extends object> {
33
+ getState(): T;
34
+ setState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean): void;
35
+ getInitialState(): T;
36
+ subscribe(listener: (state: T, prevState: T) => void): () => void;
37
+ destroy(): void;
38
+ }
39
+ /** Jotai-style atom facade over a caller-owned node. */
40
+ interface JotaiAtom<T> {
41
+ get(): T | undefined;
42
+ subscribe(callback: (value: T | undefined) => void): () => void;
43
+ readonly _node: Node<T>;
44
+ }
45
+ /** Writable Jotai-style atom facade over a caller-owned writable node. */
46
+ interface WritableJotaiAtom<T> extends JotaiAtom<T> {
47
+ set(value: T): void;
48
+ update(fn: (value: T | undefined) => T): void;
49
+ }
50
+ /** Nanostores-style atom facade over a caller-owned node. */
51
+ interface NanoAtom<T> {
52
+ get(): T | undefined;
53
+ subscribe(callback: (value: T | undefined) => void): () => void;
54
+ listen(callback: (value: T | undefined) => void): () => void;
55
+ readonly _node: Node<T>;
56
+ }
57
+ /** Writable Nanostores-style atom facade over a caller-owned writable node. */
58
+ interface WritableNanoAtom<T> extends NanoAtom<T> {
59
+ set(value: T): void;
60
+ update(fn: (value: T | undefined) => T): void;
61
+ }
62
+ /** TC39-Signals-style facade over a caller-owned node. */
63
+ interface SignalLike<T> {
64
+ get(): T | undefined;
65
+ subscribe(callback: (value: T | undefined) => void): () => void;
66
+ readonly _node: Node<T>;
67
+ }
68
+ /** Writable TC39-Signals-style facade over a caller-owned writable node. */
69
+ interface WritableSignalLike<T> extends SignalLike<T> {
70
+ set(value: T): void;
71
+ update(fn: (value: T | undefined) => T): void;
72
+ }
73
+ interface SubscribeValuesOptions<T> {
74
+ /** Emit the current cache snapshot immediately. `undefined` means SENTINEL/no DATA. */
75
+ immediate?: boolean;
76
+ /** Suppress synchronous push-on-subscribe/replay DATA. Useful for change-only store listeners. */
77
+ changesOnly?: boolean;
78
+ onError?: (error: unknown) => void;
79
+ onComplete?: () => void;
80
+ /** Custom cache reader for wrappers that keep their own snapshot object. */
81
+ getSnapshot?: () => T | undefined;
82
+ }
83
+ interface WritableNode<T> extends Node<T> {
84
+ set(value: T): void;
85
+ }
86
+ interface WritableStoreOptions<T> extends SubscribeValuesOptions<T> {
87
+ /** Override writes for adapters that need a framework-owned reducer. */
88
+ write?: (node: WritableNode<T>, value: T) => void;
89
+ }
90
+ /** Read a node cache without activating it. */
91
+ declare function nodeSnapshot<T>(node: Node<T>): T | undefined;
92
+ /**
93
+ * Subscribe to DATA values from a Node. Protocol internals stay below the adapter boundary:
94
+ * DATA drives value listeners, ERROR/COMPLETE route to optional lifecycle callbacks.
95
+ */
96
+ declare function subscribeNodeValues<T>(node: Node<T>, run: (value: T | undefined) => void, opts?: SubscribeValuesOptions<T>): () => void;
97
+ /** Build a Svelte/Nanostores-style readable store from a clean-slate Node. */
98
+ declare function readableStore<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): ReadableStore<T>;
99
+ /** Build a writable store over a StateNode or compatible clean-slate writable Node. */
100
+ declare function writableStore<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableStore<T>;
101
+ declare function writableStore<T>(node: Node<T>, opts: WritableStoreOptions<T> & {
102
+ write: (node: WritableNode<T>, value: T) => void;
103
+ }): WritableStore<T>;
104
+ /** Build the tiny shape React's `useSyncExternalStore` expects, without importing React. */
105
+ declare function externalStore<T>(node: Node<T>, opts?: Pick<SubscribeValuesOptions<T>, "getSnapshot" | "onError" | "onComplete">): ExternalStore<T>;
106
+ /** Build a framework-neutral keyed record store for focused framework record bindings. */
107
+ declare function recordReadableStore<K extends string, R extends Record<string, unknown>>(keysNode: Node<readonly K[]>, factory: NodeRecordFactory<K, R>, opts?: SubscribeValuesOptions<Record<K, R>>): ReadableStore<Record<K, R>>;
108
+ /** Build a Zustand-compatible StoreApi over a caller-owned clean-slate state node. */
109
+ declare function zustandStore<T extends object>(node: WritableNode<T>, initialState?: T, opts?: WritableStoreOptions<T>): ZustandStoreApi<T>;
110
+ declare function zustandStore<T extends object>(node: Node<T>, initialState: T | undefined, opts: WritableStoreOptions<T> & {
111
+ write: (node: WritableNode<T>, value: T) => void;
112
+ }): ZustandStoreApi<T>;
113
+ /** Build a Jotai-style atom facade over a caller-owned node. */
114
+ declare function jotaiAtom<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableJotaiAtom<T>;
115
+ declare function jotaiAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): JotaiAtom<T>;
116
+ /** Build a Nanostores-style atom facade over a caller-owned node. */
117
+ declare function nanoAtom<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableNanoAtom<T>;
118
+ declare function nanoAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): NanoAtom<T>;
119
+ /** Build a TC39-Signals-style facade over a caller-owned node. */
120
+ declare function signalFromNode<T>(node: WritableNode<T>, opts?: WritableStoreOptions<T>): WritableSignalLike<T>;
121
+ declare function signalFromNode<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): SignalLike<T>;
122
+
123
+ export { type ExternalStore as E, type JotaiAtom as J, type NanoAtom as N, type ReadableStore as R, type SignalLike as S, type WritableNode as W, type ZustandStoreApi as Z, type NodeRecordFactory as a, type SubscribeValuesOptions as b, type WritableJotaiAtom as c, type WritableNanoAtom as d, type WritableSignalLike as e, type WritableStore as f, type WritableStoreOptions as g, externalStore as h, nodeSnapshot as i, jotaiAtom as j, recordReadableStore as k, subscribeNodeValues as l, nanoAtom as n, readableStore as r, signalFromNode as s, writableStore as w, zustandStore as z };
@@ -36,6 +36,7 @@ var TIER = {
36
36
  START: TIER_START,
37
37
  PAUSE: TIER_CONTROL,
38
38
  RESUME: TIER_CONTROL,
39
+ PULL: TIER_CONTROL,
39
40
  DIRTY: TIER_NOTIFICATION,
40
41
  DATA: TIER_VALUE,
41
42
  RESOLVED: TIER_VALUE,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testing/index.ts","../../src/protocol/messages.ts","../../src/testing/assertions.ts"],"sourcesContent":["export {\n\tassertDirtyPrecedesTerminalData,\n\ttype MessageSequence,\n} from \"./assertions.js\";\n","/**\n * Wave-protocol message types and the tier const table.\n *\n * Canonical authority: ~/src/graphrefly/spec/rules.jsonl\n * R-msg-format, R-msg-closed-set, R-tier (D34), R-data-payload, R-sentinel.\n */\n\n/** Opaque pause-lock identifier (R-pause-lockset). */\nexport type LockId = string | symbol;\n\n/**\n * The CLOSED set of 10 message types (R-msg-closed-set / D9 + START handshake).\n * No open set, no user-defined custom types. Adding a type is a spec change.\n */\nexport type Message =\n\t| readonly [\"START\"]\n\t| readonly [\"DIRTY\"]\n\t| readonly [\"DATA\", unknown]\n\t| readonly [\"RESOLVED\"]\n\t| readonly [\"INVALIDATE\"]\n\t| readonly [\"COMPLETE\"]\n\t| readonly [\"ERROR\", unknown]\n\t| readonly [\"TEARDOWN\"]\n\t| readonly [\"PAUSE\", LockId]\n\t| readonly [\"RESUME\", LockId];\n\n/** One array of messages delivered in one call = one Wave (R-wave-boundary). */\nexport type Wave = readonly Message[];\n\n/** The message-type tag (the first tuple element). */\nexport type MessageType = Message[0];\n\n/**\n * SENTINEL = absence-of-DATA (R-sentinel / D16). TS representation is `undefined`.\n * Never a valid DATA payload; `null` IS a valid DATA value (domain-level absence).\n */\nexport const SENTINEL = undefined;\n\n/** R-data-payload: ERROR payloads must not collide with terminal metadata shorthand. */\nexport function isInvalidErrorPayload(v: unknown): boolean {\n\treturn v === SENTINEL || typeof v === \"boolean\";\n}\n\n/** R-data-payload / D78: host-language failures that collide with ctx.terminal shorthand become diagnostics. */\nexport function errorPayload(reason: unknown, fallback = \"error without a valid payload\"): unknown {\n\treturn isInvalidErrorPayload(reason) ? new Error(fallback) : reason;\n}\n\nexport const TIER_START = 0;\nexport const TIER_CONTROL = 1;\nexport const TIER_NOTIFICATION = 2;\nexport const TIER_VALUE = 3;\nexport const TIER_SETTLE = 4;\nexport const TIER_TERMINAL = 5;\nexport const TIER_TEARDOWN = 6;\n\n/**\n * Tier const table (R-tier / D34). Tiers below value dispatch immediately; value\n * and above are batch-deferred. This is a compile-time const table (D18), not runtime config.\n */\nconst TIER: Record<MessageType, number> = {\n\tSTART: TIER_START,\n\tPAUSE: TIER_CONTROL,\n\tRESUME: TIER_CONTROL,\n\tDIRTY: TIER_NOTIFICATION,\n\tDATA: TIER_VALUE,\n\tRESOLVED: TIER_VALUE,\n\tINVALIDATE: TIER_SETTLE,\n\tCOMPLETE: TIER_TERMINAL,\n\tERROR: TIER_TERMINAL,\n\tTEARDOWN: TIER_TEARDOWN,\n};\n\nexport function messageTier(t: MessageType): number {\n\treturn TIER[t];\n}\n\n/** Value and above are deferred inside a batch (DATA/RESOLVED/INVALIDATE/terminal/teardown). */\nexport function isDeferredTier(t: MessageType): boolean {\n\treturn TIER[t] >= TIER_VALUE;\n}\n\n/** Value-tier messages (DATA/RESOLVED) occupy the tier-3 slot. */\nexport function isValueTier(t: MessageType): boolean {\n\treturn TIER[t] === TIER_VALUE;\n}\n\n/** The pause buffer holds the settle slice only: value-tier DATA/RESOLVED plus INVALIDATE. */\nexport function isPauseBufferedTier(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier === TIER_VALUE || tier === TIER_SETTLE;\n}\n\n/**\n * A TERMINAL message = tier 5 (COMPLETE | ERROR), R-tier / D34. Detected via the CENTRAL tier\n * table, NOT a per-variant `=== \"COMPLETE\" || === \"ERROR\"` check — so terminal routing stays\n * driven by the one const table (feedback_use_tier_for_signal_routing); discriminate COMPLETE vs\n * ERROR within the tier by the message type only where the handling actually differs.\n */\nexport function isTerminal(t: MessageType): boolean {\n\treturn TIER[t] === TIER_TERMINAL;\n}\n\n/**\n * ctx.up carries control tiers only (R-ctx-up / DR-5): DIRTY, PAUSE, RESUME,\n * INVALIDATE, TEARDOWN. DATA/RESOLVED (tier 3) and COMPLETE/ERROR (tier 5) are\n * down-only.\n */\nexport function isUpAllowed(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier !== TIER_VALUE && tier !== TIER_TERMINAL;\n}\n","/**\n * Public testing assertions for clean-slate GraphReFly message streams.\n *\n * These helpers validate captured protocol output; they do not participate in propagation.\n */\n\nimport { isValueTier, type Message, type Wave } from \"../protocol/messages.js\";\n\n/** Captured subscriber messages grouped by wave. START/replay handshake messages occupy one wave. */\nexport type MessageSequence = readonly Wave[];\n\n/**\n * Assert that observed tier-3 settlements (DATA/RESOLVED) are preceded by DIRTY.\n *\n * This encodes R-dirty-before-data for wave-framed subscriber traces. The leading\n * START push-on-subscribe/replay handshake wave is exempt because cached/replay DATA is\n * advertised to a new subscriber without opening a propagation wave.\n */\nexport function assertDirtyPrecedesTerminalData(messages: MessageSequence): void {\n\tfor (let waveIndex = 0; waveIndex < messages.length; waveIndex += 1) {\n\t\tconst wave = messages[waveIndex];\n\t\tlet handshake = false;\n\t\tlet openedByDirty = false;\n\n\t\tfor (let msgIndex = 0; msgIndex < wave.length; msgIndex += 1) {\n\t\t\tconst msg = wave[msgIndex] as Message;\n\t\t\tconst type = msg[0];\n\n\t\t\tif (msgIndex === 0 && type === \"START\") {\n\t\t\t\thandshake = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (handshake && type === \"DATA\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thandshake = false;\n\n\t\t\tif (type === \"DIRTY\") {\n\t\t\t\topenedByDirty = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isValueTier(type)) {\n\t\t\t\tif (!openedByDirty) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`assertDirtyPrecedesTerminalData: ${type} at wave ${waveIndex}, index ${msgIndex} arrived without a preceding DIRTY in the same wave (R-dirty-before-data). Wave: ${describeWave(wave, msgIndex)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\topenedByDirty = false;\n\t\t}\n\t}\n}\n\nfunction describeWave(wave: Wave, around: number): string {\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < wave.length; i += 1) {\n\t\tparts.push(`${i === around ? \"-> \" : \" \"}[${wave[i]?.[0] ?? \"?\"}]`);\n\t}\n\treturn parts.join(\", \");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACgDO,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAM7B,IAAM,OAAoC;AAAA,EACzC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AACX;AAYO,SAAS,YAAY,GAAyB;AACpD,SAAO,KAAK,CAAC,MAAM;AACpB;;;ACnEO,SAAS,gCAAgC,UAAiC;AAChF,WAAS,YAAY,GAAG,YAAY,SAAS,QAAQ,aAAa,GAAG;AACpE,UAAM,OAAO,SAAS,SAAS;AAC/B,QAAI,YAAY;AAChB,QAAI,gBAAgB;AAEpB,aAAS,WAAW,GAAG,WAAW,KAAK,QAAQ,YAAY,GAAG;AAC7D,YAAM,MAAM,KAAK,QAAQ;AACzB,YAAM,OAAO,IAAI,CAAC;AAElB,UAAI,aAAa,KAAK,SAAS,SAAS;AACvC,oBAAY;AACZ;AAAA,MACD;AAEA,UAAI,aAAa,SAAS,QAAQ;AACjC;AAAA,MACD;AACA,kBAAY;AAEZ,UAAI,SAAS,SAAS;AACrB,wBAAgB;AAChB;AAAA,MACD;AAEA,UAAI,YAAY,IAAI,GAAG;AACtB,YAAI,CAAC,eAAe;AACnB,gBAAM,IAAI;AAAA,YACT,oCAAoC,IAAI,YAAY,SAAS,WAAW,QAAQ,oFAAoF,aAAa,MAAM,QAAQ,CAAC;AAAA,UACjM;AAAA,QACD;AACA;AAAA,MACD;AAEA,sBAAgB;AAAA,IACjB;AAAA,EACD;AACD;AAEA,SAAS,aAAa,MAAY,QAAwB;AACzD,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACxC,UAAM,KAAK,GAAG,MAAM,SAAS,QAAQ,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG;AAAA,EACrE;AACA,SAAO,MAAM,KAAK,IAAI;AACvB;","names":[]}
1
+ {"version":3,"sources":["../../src/testing/index.ts","../../src/protocol/messages.ts","../../src/testing/assertions.ts"],"sourcesContent":["export {\n\tassertDirtyPrecedesTerminalData,\n\ttype MessageSequence,\n} from \"./assertions.js\";\n","/**\n * Wave-protocol message types and the tier const table.\n *\n * Canonical authority: ~/src/graphrefly/spec/rules.jsonl\n * R-msg-format, R-msg-closed-set, R-tier (D34), R-data-payload, R-sentinel.\n */\n\n/** Opaque pause-lock / pull identifier (R-pause-lockset, R-pull). */\nexport type LockId = string | symbol;\n\n/** Explicit pull demand payload (D269/D272). Params are holder-visible context, never DATA-up. */\nexport interface PullDemand {\n\treadonly pullId: LockId;\n\treadonly params?: unknown;\n}\n\n/**\n * The CLOSED set of 11 message types (R-msg-closed-set / D9 + D269 + START handshake).\n * No open set, no user-defined custom types. Adding a type is a spec change.\n */\nexport type Message =\n\t| readonly [\"START\"]\n\t| readonly [\"DIRTY\"]\n\t| readonly [\"DATA\", unknown]\n\t| readonly [\"RESOLVED\"]\n\t| readonly [\"INVALIDATE\"]\n\t| readonly [\"COMPLETE\"]\n\t| readonly [\"ERROR\", unknown]\n\t| readonly [\"TEARDOWN\"]\n\t| readonly [\"PAUSE\", LockId]\n\t| readonly [\"RESUME\", LockId]\n\t| readonly [\"PULL\", PullDemand];\n\n/** One array of messages delivered in one call = one Wave (R-wave-boundary). */\nexport type Wave = readonly Message[];\n\n/** The message-type tag (the first tuple element). */\nexport type MessageType = Message[0];\n\n/**\n * SENTINEL = absence-of-DATA (R-sentinel / D16). TS representation is `undefined`.\n * Never a valid DATA payload; `null` IS a valid DATA value (domain-level absence).\n */\nexport const SENTINEL = undefined;\n\n/** R-data-payload: ERROR payloads must not collide with terminal metadata shorthand. */\nexport function isInvalidErrorPayload(v: unknown): boolean {\n\treturn v === SENTINEL || typeof v === \"boolean\";\n}\n\n/** R-data-payload / D78: host-language failures that collide with ctx.terminal shorthand become diagnostics. */\nexport function errorPayload(reason: unknown, fallback = \"error without a valid payload\"): unknown {\n\treturn isInvalidErrorPayload(reason) ? new Error(fallback) : reason;\n}\n\nexport const TIER_START = 0;\nexport const TIER_CONTROL = 1;\nexport const TIER_NOTIFICATION = 2;\nexport const TIER_VALUE = 3;\nexport const TIER_SETTLE = 4;\nexport const TIER_TERMINAL = 5;\nexport const TIER_TEARDOWN = 6;\n\n/**\n * Tier const table (R-tier / D34). Tiers below value dispatch immediately; value\n * and above are batch-deferred. This is a compile-time const table (D18), not runtime config.\n */\nconst TIER: Record<MessageType, number> = {\n\tSTART: TIER_START,\n\tPAUSE: TIER_CONTROL,\n\tRESUME: TIER_CONTROL,\n\tPULL: TIER_CONTROL,\n\tDIRTY: TIER_NOTIFICATION,\n\tDATA: TIER_VALUE,\n\tRESOLVED: TIER_VALUE,\n\tINVALIDATE: TIER_SETTLE,\n\tCOMPLETE: TIER_TERMINAL,\n\tERROR: TIER_TERMINAL,\n\tTEARDOWN: TIER_TEARDOWN,\n};\n\nexport function messageTier(t: MessageType): number {\n\treturn TIER[t];\n}\n\n/** Value and above are deferred inside a batch (DATA/RESOLVED/INVALIDATE/terminal/teardown). */\nexport function isDeferredTier(t: MessageType): boolean {\n\treturn TIER[t] >= TIER_VALUE;\n}\n\n/** Value-tier messages (DATA/RESOLVED) occupy the tier-3 slot. */\nexport function isValueTier(t: MessageType): boolean {\n\treturn TIER[t] === TIER_VALUE;\n}\n\n/** The pause buffer holds the settle slice only: value-tier DATA/RESOLVED plus INVALIDATE. */\nexport function isPauseBufferedTier(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier === TIER_VALUE || tier === TIER_SETTLE;\n}\n\n/**\n * A TERMINAL message = tier 5 (COMPLETE | ERROR), R-tier / D34. Detected via the CENTRAL tier\n * table, NOT a per-variant `=== \"COMPLETE\" || === \"ERROR\"` check — so terminal routing stays\n * driven by the one const table (feedback_use_tier_for_signal_routing); discriminate COMPLETE vs\n * ERROR within the tier by the message type only where the handling actually differs.\n */\nexport function isTerminal(t: MessageType): boolean {\n\treturn TIER[t] === TIER_TERMINAL;\n}\n\n/**\n * ctx.up carries control/demand tiers only (R-ctx-up / D269): DIRTY, PAUSE, RESUME, PULL,\n * INVALIDATE, TEARDOWN. DATA/RESOLVED (tier 3) and COMPLETE/ERROR (tier 5) are\n * down-only.\n */\nexport function isUpAllowed(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier !== TIER_VALUE && tier !== TIER_TERMINAL;\n}\n","/**\n * Public testing assertions for clean-slate GraphReFly message streams.\n *\n * These helpers validate captured protocol output; they do not participate in propagation.\n */\n\nimport { isValueTier, type Message, type Wave } from \"../protocol/messages.js\";\n\n/** Captured subscriber messages grouped by wave. START/replay handshake messages occupy one wave. */\nexport type MessageSequence = readonly Wave[];\n\n/**\n * Assert that observed tier-3 settlements (DATA/RESOLVED) are preceded by DIRTY.\n *\n * This encodes R-dirty-before-data for wave-framed subscriber traces. The leading\n * START push-on-subscribe/replay handshake wave is exempt because cached/replay DATA is\n * advertised to a new subscriber without opening a propagation wave.\n */\nexport function assertDirtyPrecedesTerminalData(messages: MessageSequence): void {\n\tfor (let waveIndex = 0; waveIndex < messages.length; waveIndex += 1) {\n\t\tconst wave = messages[waveIndex];\n\t\tlet handshake = false;\n\t\tlet openedByDirty = false;\n\n\t\tfor (let msgIndex = 0; msgIndex < wave.length; msgIndex += 1) {\n\t\t\tconst msg = wave[msgIndex] as Message;\n\t\t\tconst type = msg[0];\n\n\t\t\tif (msgIndex === 0 && type === \"START\") {\n\t\t\t\thandshake = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (handshake && type === \"DATA\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thandshake = false;\n\n\t\t\tif (type === \"DIRTY\") {\n\t\t\t\topenedByDirty = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isValueTier(type)) {\n\t\t\t\tif (!openedByDirty) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`assertDirtyPrecedesTerminalData: ${type} at wave ${waveIndex}, index ${msgIndex} arrived without a preceding DIRTY in the same wave (R-dirty-before-data). Wave: ${describeWave(wave, msgIndex)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\topenedByDirty = false;\n\t\t}\n\t}\n}\n\nfunction describeWave(wave: Wave, around: number): string {\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < wave.length; i += 1) {\n\t\tparts.push(`${i === around ? \"-> \" : \" \"}[${wave[i]?.[0] ?? \"?\"}]`);\n\t}\n\treturn parts.join(\", \");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuDO,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAM7B,IAAM,OAAoC;AAAA,EACzC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AACX;AAYO,SAAS,YAAY,GAAyB;AACpD,SAAO,KAAK,CAAC,MAAM;AACpB;;;AC3EO,SAAS,gCAAgC,UAAiC;AAChF,WAAS,YAAY,GAAG,YAAY,SAAS,QAAQ,aAAa,GAAG;AACpE,UAAM,OAAO,SAAS,SAAS;AAC/B,QAAI,YAAY;AAChB,QAAI,gBAAgB;AAEpB,aAAS,WAAW,GAAG,WAAW,KAAK,QAAQ,YAAY,GAAG;AAC7D,YAAM,MAAM,KAAK,QAAQ;AACzB,YAAM,OAAO,IAAI,CAAC;AAElB,UAAI,aAAa,KAAK,SAAS,SAAS;AACvC,oBAAY;AACZ;AAAA,MACD;AAEA,UAAI,aAAa,SAAS,QAAQ;AACjC;AAAA,MACD;AACA,kBAAY;AAEZ,UAAI,SAAS,SAAS;AACrB,wBAAgB;AAChB;AAAA,MACD;AAEA,UAAI,YAAY,IAAI,GAAG;AACtB,YAAI,CAAC,eAAe;AACnB,gBAAM,IAAI;AAAA,YACT,oCAAoC,IAAI,YAAY,SAAS,WAAW,QAAQ,oFAAoF,aAAa,MAAM,QAAQ,CAAC;AAAA,UACjM;AAAA,QACD;AACA;AAAA,MACD;AAEA,sBAAgB;AAAA,IACjB;AAAA,EACD;AACD;AAEA,SAAS,aAAa,MAAY,QAAwB;AACzD,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACxC,UAAM,KAAK,GAAG,MAAM,SAAS,QAAQ,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG;AAAA,EACrE;AACA,SAAO,MAAM,KAAK,IAAI;AACvB;","names":[]}
@@ -1,4 +1,4 @@
1
- import { W as Wave } from '../messages-BZqrGGm1.cjs';
1
+ import { W as Wave } from '../messages-CAzUPPJM.cjs';
2
2
 
3
3
  /**
4
4
  * Public testing assertions for clean-slate GraphReFly message streams.