@aigne/afs-did-space 1.12.0-beta.5

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 (510) hide show
  1. package/LICENSE.md +26 -0
  2. package/README.md +129 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  4. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  5. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  6. package/dist/afs-metadata-context.cjs +20 -0
  7. package/dist/afs-metadata-context.d.cts +21 -0
  8. package/dist/afs-metadata-context.d.cts.map +1 -0
  9. package/dist/afs-metadata-context.d.mts +21 -0
  10. package/dist/afs-metadata-context.d.mts.map +1 -0
  11. package/dist/afs-metadata-context.mjs +18 -0
  12. package/dist/afs-metadata-context.mjs.map +1 -0
  13. package/dist/blocklet-hook.cjs +180 -0
  14. package/dist/blocklet-hook.d.cts +29 -0
  15. package/dist/blocklet-hook.d.cts.map +1 -0
  16. package/dist/blocklet-hook.d.mts +29 -0
  17. package/dist/blocklet-hook.d.mts.map +1 -0
  18. package/dist/blocklet-hook.mjs +178 -0
  19. package/dist/blocklet-hook.mjs.map +1 -0
  20. package/dist/changelog-schema.cjs +603 -0
  21. package/dist/changelog-schema.d.cts +395 -0
  22. package/dist/changelog-schema.d.cts.map +1 -0
  23. package/dist/changelog-schema.d.mts +395 -0
  24. package/dist/changelog-schema.d.mts.map +1 -0
  25. package/dist/changelog-schema.mjs +570 -0
  26. package/dist/changelog-schema.mjs.map +1 -0
  27. package/dist/changelog-write.cjs +80 -0
  28. package/dist/changelog-write.d.cts +70 -0
  29. package/dist/changelog-write.d.cts.map +1 -0
  30. package/dist/changelog-write.d.mts +70 -0
  31. package/dist/changelog-write.d.mts.map +1 -0
  32. package/dist/changelog-write.mjs +77 -0
  33. package/dist/changelog-write.mjs.map +1 -0
  34. package/dist/cid-byte-cache.cjs +126 -0
  35. package/dist/cid-byte-cache.d.cts +46 -0
  36. package/dist/cid-byte-cache.d.cts.map +1 -0
  37. package/dist/cid-byte-cache.d.mts +47 -0
  38. package/dist/cid-byte-cache.d.mts.map +1 -0
  39. package/dist/cid-byte-cache.mjs +125 -0
  40. package/dist/cid-byte-cache.mjs.map +1 -0
  41. package/dist/cid.cjs +68 -0
  42. package/dist/cid.d.cts +22 -0
  43. package/dist/cid.d.cts.map +1 -0
  44. package/dist/cid.d.mts +22 -0
  45. package/dist/cid.d.mts.map +1 -0
  46. package/dist/cid.mjs +65 -0
  47. package/dist/cid.mjs.map +1 -0
  48. package/dist/client.cjs +221 -0
  49. package/dist/client.d.cts +72 -0
  50. package/dist/client.d.cts.map +1 -0
  51. package/dist/client.d.mts +72 -0
  52. package/dist/client.d.mts.map +1 -0
  53. package/dist/client.mjs +220 -0
  54. package/dist/client.mjs.map +1 -0
  55. package/dist/cloudflare.cjs +510 -0
  56. package/dist/cloudflare.d.cts +307 -0
  57. package/dist/cloudflare.d.cts.map +1 -0
  58. package/dist/cloudflare.d.mts +308 -0
  59. package/dist/cloudflare.d.mts.map +1 -0
  60. package/dist/cloudflare.mjs +507 -0
  61. package/dist/cloudflare.mjs.map +1 -0
  62. package/dist/ctime-backfill.cjs +272 -0
  63. package/dist/ctime-backfill.d.cts +169 -0
  64. package/dist/ctime-backfill.d.cts.map +1 -0
  65. package/dist/ctime-backfill.d.mts +169 -0
  66. package/dist/ctime-backfill.d.mts.map +1 -0
  67. package/dist/ctime-backfill.mjs +267 -0
  68. package/dist/ctime-backfill.mjs.map +1 -0
  69. package/dist/d1-gc-queue.cjs +80 -0
  70. package/dist/d1-gc-queue.d.cts +59 -0
  71. package/dist/d1-gc-queue.d.cts.map +1 -0
  72. package/dist/d1-gc-queue.d.mts +59 -0
  73. package/dist/d1-gc-queue.d.mts.map +1 -0
  74. package/dist/d1-gc-queue.mjs +81 -0
  75. package/dist/d1-gc-queue.mjs.map +1 -0
  76. package/dist/d1-resolve-store.cjs +189 -0
  77. package/dist/d1-resolve-store.d.cts +93 -0
  78. package/dist/d1-resolve-store.d.cts.map +1 -0
  79. package/dist/d1-resolve-store.d.mts +93 -0
  80. package/dist/d1-resolve-store.d.mts.map +1 -0
  81. package/dist/d1-resolve-store.mjs +190 -0
  82. package/dist/d1-resolve-store.mjs.map +1 -0
  83. package/dist/d1-schema.cjs +361 -0
  84. package/dist/d1-schema.d.cts +237 -0
  85. package/dist/d1-schema.d.cts.map +1 -0
  86. package/dist/d1-schema.d.mts +237 -0
  87. package/dist/d1-schema.d.mts.map +1 -0
  88. package/dist/d1-schema.mjs +341 -0
  89. package/dist/d1-schema.mjs.map +1 -0
  90. package/dist/d1-share-store.cjs +0 -0
  91. package/dist/d1-share-store.d.cts +53 -0
  92. package/dist/d1-share-store.d.cts.map +1 -0
  93. package/dist/d1-share-store.d.mts +53 -0
  94. package/dist/d1-share-store.d.mts.map +1 -0
  95. package/dist/d1-share-store.mjs +0 -0
  96. package/dist/d1-share-store.mjs.map +1 -0
  97. package/dist/d1-tree-index.cjs +1098 -0
  98. package/dist/d1-tree-index.d.cts +203 -0
  99. package/dist/d1-tree-index.d.cts.map +1 -0
  100. package/dist/d1-tree-index.d.mts +203 -0
  101. package/dist/d1-tree-index.d.mts.map +1 -0
  102. package/dist/d1-tree-index.mjs +1094 -0
  103. package/dist/d1-tree-index.mjs.map +1 -0
  104. package/dist/data-backend.cjs +147 -0
  105. package/dist/data-backend.d.cts +30 -0
  106. package/dist/data-backend.d.cts.map +1 -0
  107. package/dist/data-backend.d.mts +30 -0
  108. package/dist/data-backend.d.mts.map +1 -0
  109. package/dist/data-backend.mjs +148 -0
  110. package/dist/data-backend.mjs.map +1 -0
  111. package/dist/dedup-backfill.cjs +278 -0
  112. package/dist/dedup-backfill.d.cts +165 -0
  113. package/dist/dedup-backfill.d.cts.map +1 -0
  114. package/dist/dedup-backfill.d.mts +165 -0
  115. package/dist/dedup-backfill.d.mts.map +1 -0
  116. package/dist/dedup-backfill.mjs +273 -0
  117. package/dist/dedup-backfill.mjs.map +1 -0
  118. package/dist/did-space-like.d.cts +2 -0
  119. package/dist/did-space-like.d.mts +2 -0
  120. package/dist/did-utils.cjs +44 -0
  121. package/dist/did-utils.d.cts +25 -0
  122. package/dist/did-utils.d.cts.map +1 -0
  123. package/dist/did-utils.d.mts +25 -0
  124. package/dist/did-utils.d.mts.map +1 -0
  125. package/dist/did-utils.mjs +43 -0
  126. package/dist/did-utils.mjs.map +1 -0
  127. package/dist/dirty-path-queue.cjs +31 -0
  128. package/dist/dirty-path-queue.d.cts +104 -0
  129. package/dist/dirty-path-queue.d.cts.map +1 -0
  130. package/dist/dirty-path-queue.d.mts +104 -0
  131. package/dist/dirty-path-queue.d.mts.map +1 -0
  132. package/dist/dirty-path-queue.mjs +31 -0
  133. package/dist/dirty-path-queue.mjs.map +1 -0
  134. package/dist/dirty-path-schema.cjs +142 -0
  135. package/dist/dirty-path-schema.d.cts +90 -0
  136. package/dist/dirty-path-schema.d.cts.map +1 -0
  137. package/dist/dirty-path-schema.d.mts +90 -0
  138. package/dist/dirty-path-schema.d.mts.map +1 -0
  139. package/dist/dirty-path-schema.mjs +136 -0
  140. package/dist/dirty-path-schema.mjs.map +1 -0
  141. package/dist/download-actions.cjs +43 -0
  142. package/dist/download-actions.mjs +40 -0
  143. package/dist/download-actions.mjs.map +1 -0
  144. package/dist/fs-object-store.cjs +153 -0
  145. package/dist/fs-object-store.d.cts +21 -0
  146. package/dist/fs-object-store.d.cts.map +1 -0
  147. package/dist/fs-object-store.d.mts +22 -0
  148. package/dist/fs-object-store.d.mts.map +1 -0
  149. package/dist/fs-object-store.mjs +153 -0
  150. package/dist/fs-object-store.mjs.map +1 -0
  151. package/dist/gc-queue.d.cts +43 -0
  152. package/dist/gc-queue.d.cts.map +1 -0
  153. package/dist/gc-queue.d.mts +43 -0
  154. package/dist/gc-queue.d.mts.map +1 -0
  155. package/dist/index.cjs +2712 -0
  156. package/dist/index.d.cts +504 -0
  157. package/dist/index.d.cts.map +1 -0
  158. package/dist/index.d.mts +505 -0
  159. package/dist/index.d.mts.map +1 -0
  160. package/dist/index.mjs +2537 -0
  161. package/dist/index.mjs.map +1 -0
  162. package/dist/inline-content-migration.cjs +212 -0
  163. package/dist/inline-content-migration.d.cts +110 -0
  164. package/dist/inline-content-migration.d.cts.map +1 -0
  165. package/dist/inline-content-migration.d.mts +111 -0
  166. package/dist/inline-content-migration.d.mts.map +1 -0
  167. package/dist/inline-content-migration.mjs +207 -0
  168. package/dist/inline-content-migration.mjs.map +1 -0
  169. package/dist/inline-content.cjs +145 -0
  170. package/dist/inline-content.d.cts +98 -0
  171. package/dist/inline-content.d.cts.map +1 -0
  172. package/dist/inline-content.d.mts +98 -0
  173. package/dist/inline-content.d.mts.map +1 -0
  174. package/dist/inline-content.mjs +137 -0
  175. package/dist/inline-content.mjs.map +1 -0
  176. package/dist/local-changelog.cjs +241 -0
  177. package/dist/local-changelog.d.cts +119 -0
  178. package/dist/local-changelog.d.cts.map +1 -0
  179. package/dist/local-changelog.d.mts +119 -0
  180. package/dist/local-changelog.d.mts.map +1 -0
  181. package/dist/local-changelog.mjs +240 -0
  182. package/dist/local-changelog.mjs.map +1 -0
  183. package/dist/local.cjs +435 -0
  184. package/dist/local.d.cts +254 -0
  185. package/dist/local.d.cts.map +1 -0
  186. package/dist/local.d.mts +254 -0
  187. package/dist/local.d.mts.map +1 -0
  188. package/dist/local.mjs +427 -0
  189. package/dist/local.mjs.map +1 -0
  190. package/dist/memory-gc-queue.cjs +36 -0
  191. package/dist/memory-gc-queue.d.cts +22 -0
  192. package/dist/memory-gc-queue.d.cts.map +1 -0
  193. package/dist/memory-gc-queue.d.mts +22 -0
  194. package/dist/memory-gc-queue.d.mts.map +1 -0
  195. package/dist/memory-gc-queue.mjs +36 -0
  196. package/dist/memory-gc-queue.mjs.map +1 -0
  197. package/dist/memory-tree-index.cjs +734 -0
  198. package/dist/memory-tree-index.d.cts +159 -0
  199. package/dist/memory-tree-index.d.cts.map +1 -0
  200. package/dist/memory-tree-index.d.mts +159 -0
  201. package/dist/memory-tree-index.d.mts.map +1 -0
  202. package/dist/memory-tree-index.mjs +735 -0
  203. package/dist/memory-tree-index.mjs.map +1 -0
  204. package/dist/metadata-db.cjs +562 -0
  205. package/dist/metadata-db.d.cts +102 -0
  206. package/dist/metadata-db.d.cts.map +1 -0
  207. package/dist/metadata-db.d.mts +102 -0
  208. package/dist/metadata-db.d.mts.map +1 -0
  209. package/dist/metadata-db.mjs +562 -0
  210. package/dist/metadata-db.mjs.map +1 -0
  211. package/dist/mime-utils.cjs +2 -0
  212. package/dist/mime-utils.d.cts +2 -0
  213. package/dist/mime-utils.d.mts +2 -0
  214. package/dist/mime-utils.mjs +3 -0
  215. package/dist/object-key.cjs +41 -0
  216. package/dist/object-key.d.cts +25 -0
  217. package/dist/object-key.d.cts.map +1 -0
  218. package/dist/object-key.d.mts +25 -0
  219. package/dist/object-key.d.mts.map +1 -0
  220. package/dist/object-key.mjs +40 -0
  221. package/dist/object-key.mjs.map +1 -0
  222. package/dist/packages/session/dist/index.cjs +788 -0
  223. package/dist/packages/session/dist/index.mjs +782 -0
  224. package/dist/packages/session/dist/index.mjs.map +1 -0
  225. package/dist/platform/r2/dist/types.d.cts +49 -0
  226. package/dist/platform/r2/dist/types.d.cts.map +1 -0
  227. package/dist/prefix-range.cjs +33 -0
  228. package/dist/prefix-range.d.cts +29 -0
  229. package/dist/prefix-range.d.cts.map +1 -0
  230. package/dist/prefix-range.d.mts +29 -0
  231. package/dist/prefix-range.d.mts.map +1 -0
  232. package/dist/prefix-range.mjs +33 -0
  233. package/dist/prefix-range.mjs.map +1 -0
  234. package/dist/prefixed-tree-index.cjs +238 -0
  235. package/dist/prefixed-tree-index.d.cts +85 -0
  236. package/dist/prefixed-tree-index.d.cts.map +1 -0
  237. package/dist/prefixed-tree-index.d.mts +85 -0
  238. package/dist/prefixed-tree-index.d.mts.map +1 -0
  239. package/dist/prefixed-tree-index.mjs +239 -0
  240. package/dist/prefixed-tree-index.mjs.map +1 -0
  241. package/dist/presign-signer.cjs +7 -0
  242. package/dist/presign-signer.d.cts +99 -0
  243. package/dist/presign-signer.d.cts.map +1 -0
  244. package/dist/presign-signer.d.mts +99 -0
  245. package/dist/presign-signer.d.mts.map +1 -0
  246. package/dist/presign-signer.mjs +7 -0
  247. package/dist/presign-signer.mjs.map +1 -0
  248. package/dist/providers/platform/r2/dist/index.d.mts +3 -0
  249. package/dist/providers/platform/r2/dist/types.d.mts +49 -0
  250. package/dist/providers/platform/r2/dist/types.d.mts.map +1 -0
  251. package/dist/reconcile.cjs +184 -0
  252. package/dist/reconcile.d.cts +26 -0
  253. package/dist/reconcile.d.cts.map +1 -0
  254. package/dist/reconcile.d.mts +26 -0
  255. package/dist/reconcile.d.mts.map +1 -0
  256. package/dist/reconcile.mjs +184 -0
  257. package/dist/reconcile.mjs.map +1 -0
  258. package/dist/reference-check.cjs +49 -0
  259. package/dist/reference-check.d.cts +10 -0
  260. package/dist/reference-check.d.cts.map +1 -0
  261. package/dist/reference-check.d.mts +10 -0
  262. package/dist/reference-check.d.mts.map +1 -0
  263. package/dist/reference-check.mjs +48 -0
  264. package/dist/reference-check.mjs.map +1 -0
  265. package/dist/remote-afs.cjs +681 -0
  266. package/dist/remote-afs.d.cts +236 -0
  267. package/dist/remote-afs.d.cts.map +1 -0
  268. package/dist/remote-afs.d.mts +236 -0
  269. package/dist/remote-afs.d.mts.map +1 -0
  270. package/dist/remote-afs.mjs +676 -0
  271. package/dist/remote-afs.mjs.map +1 -0
  272. package/dist/rename-guard.cjs +18 -0
  273. package/dist/rename-guard.mjs +18 -0
  274. package/dist/rename-guard.mjs.map +1 -0
  275. package/dist/resolve.cjs +260 -0
  276. package/dist/resolve.d.cts +113 -0
  277. package/dist/resolve.d.cts.map +1 -0
  278. package/dist/resolve.d.mts +113 -0
  279. package/dist/resolve.d.mts.map +1 -0
  280. package/dist/resolve.mjs +260 -0
  281. package/dist/resolve.mjs.map +1 -0
  282. package/dist/rsync-content.cjs +33 -0
  283. package/dist/rsync-content.mjs +33 -0
  284. package/dist/rsync-content.mjs.map +1 -0
  285. package/dist/rsync.cjs +400 -0
  286. package/dist/rsync.d.cts +157 -0
  287. package/dist/rsync.d.cts.map +1 -0
  288. package/dist/rsync.d.mts +157 -0
  289. package/dist/rsync.d.mts.map +1 -0
  290. package/dist/rsync.mjs +397 -0
  291. package/dist/rsync.mjs.map +1 -0
  292. package/dist/run-gc.cjs +57 -0
  293. package/dist/run-gc.d.cts +40 -0
  294. package/dist/run-gc.d.cts.map +1 -0
  295. package/dist/run-gc.d.mts +41 -0
  296. package/dist/run-gc.d.mts.map +1 -0
  297. package/dist/run-gc.mjs +57 -0
  298. package/dist/run-gc.mjs.map +1 -0
  299. package/dist/scope-id.cjs +70 -0
  300. package/dist/scope-id.d.cts +35 -0
  301. package/dist/scope-id.d.cts.map +1 -0
  302. package/dist/scope-id.d.mts +35 -0
  303. package/dist/scope-id.d.mts.map +1 -0
  304. package/dist/scope-id.mjs +68 -0
  305. package/dist/scope-id.mjs.map +1 -0
  306. package/dist/scope-migration-node.cjs +172 -0
  307. package/dist/scope-migration-node.d.cts +44 -0
  308. package/dist/scope-migration-node.d.cts.map +1 -0
  309. package/dist/scope-migration-node.d.mts +44 -0
  310. package/dist/scope-migration-node.d.mts.map +1 -0
  311. package/dist/scope-migration-node.mjs +171 -0
  312. package/dist/scope-migration-node.mjs.map +1 -0
  313. package/dist/scope-migration.cjs +155 -0
  314. package/dist/scope-migration.d.cts +65 -0
  315. package/dist/scope-migration.d.cts.map +1 -0
  316. package/dist/scope-migration.d.mts +65 -0
  317. package/dist/scope-migration.d.mts.map +1 -0
  318. package/dist/scope-migration.mjs +154 -0
  319. package/dist/scope-migration.mjs.map +1 -0
  320. package/dist/share-declaration.cjs +225 -0
  321. package/dist/share-declaration.d.cts +30 -0
  322. package/dist/share-declaration.d.cts.map +1 -0
  323. package/dist/share-declaration.d.mts +32 -0
  324. package/dist/share-declaration.d.mts.map +1 -0
  325. package/dist/share-declaration.mjs +221 -0
  326. package/dist/share-declaration.mjs.map +1 -0
  327. package/dist/share-hook.cjs +63 -0
  328. package/dist/share-hook.mjs +62 -0
  329. package/dist/share-hook.mjs.map +1 -0
  330. package/dist/share-resolve.cjs +176 -0
  331. package/dist/share-resolve.d.cts +36 -0
  332. package/dist/share-resolve.d.cts.map +1 -0
  333. package/dist/share-resolve.d.mts +36 -0
  334. package/dist/share-resolve.d.mts.map +1 -0
  335. package/dist/share-resolve.mjs +177 -0
  336. package/dist/share-resolve.mjs.map +1 -0
  337. package/dist/share-serve.cjs +145 -0
  338. package/dist/share-serve.d.cts +30 -0
  339. package/dist/share-serve.d.cts.map +1 -0
  340. package/dist/share-serve.d.mts +30 -0
  341. package/dist/share-serve.d.mts.map +1 -0
  342. package/dist/share-serve.mjs +144 -0
  343. package/dist/share-serve.mjs.map +1 -0
  344. package/dist/share-store.cjs +25 -0
  345. package/dist/share-store.d.cts +65 -0
  346. package/dist/share-store.d.cts.map +1 -0
  347. package/dist/share-store.d.mts +65 -0
  348. package/dist/share-store.d.mts.map +1 -0
  349. package/dist/share-store.mjs +25 -0
  350. package/dist/share-store.mjs.map +1 -0
  351. package/dist/share-virtual-path.cjs +102 -0
  352. package/dist/share-virtual-path.mjs +101 -0
  353. package/dist/share-virtual-path.mjs.map +1 -0
  354. package/dist/space-resolver.cjs +54 -0
  355. package/dist/space-resolver.d.cts +34 -0
  356. package/dist/space-resolver.d.cts.map +1 -0
  357. package/dist/space-resolver.d.mts +34 -0
  358. package/dist/space-resolver.d.mts.map +1 -0
  359. package/dist/space-resolver.mjs +55 -0
  360. package/dist/space-resolver.mjs.map +1 -0
  361. package/dist/sqlite-gc-queue.cjs +51 -0
  362. package/dist/sqlite-gc-queue.d.cts +22 -0
  363. package/dist/sqlite-gc-queue.d.cts.map +1 -0
  364. package/dist/sqlite-gc-queue.d.mts +22 -0
  365. package/dist/sqlite-gc-queue.d.mts.map +1 -0
  366. package/dist/sqlite-gc-queue.mjs +52 -0
  367. package/dist/sqlite-gc-queue.mjs.map +1 -0
  368. package/dist/sqlite-resolve-store.cjs +163 -0
  369. package/dist/sqlite-resolve-store.d.cts +50 -0
  370. package/dist/sqlite-resolve-store.d.cts.map +1 -0
  371. package/dist/sqlite-resolve-store.d.mts +50 -0
  372. package/dist/sqlite-resolve-store.d.mts.map +1 -0
  373. package/dist/sqlite-resolve-store.mjs +164 -0
  374. package/dist/sqlite-resolve-store.mjs.map +1 -0
  375. package/dist/sqlite-share-store.cjs +157 -0
  376. package/dist/sqlite-share-store.d.cts +31 -0
  377. package/dist/sqlite-share-store.d.cts.map +1 -0
  378. package/dist/sqlite-share-store.d.mts +31 -0
  379. package/dist/sqlite-share-store.d.mts.map +1 -0
  380. package/dist/sqlite-share-store.mjs +157 -0
  381. package/dist/sqlite-share-store.mjs.map +1 -0
  382. package/dist/sqlite-tree-index.cjs +901 -0
  383. package/dist/sqlite-tree-index.d.cts +107 -0
  384. package/dist/sqlite-tree-index.d.cts.map +1 -0
  385. package/dist/sqlite-tree-index.d.mts +107 -0
  386. package/dist/sqlite-tree-index.d.mts.map +1 -0
  387. package/dist/sqlite-tree-index.mjs +902 -0
  388. package/dist/sqlite-tree-index.mjs.map +1 -0
  389. package/dist/sync-engine.cjs +1324 -0
  390. package/dist/sync-engine.d.cts +473 -0
  391. package/dist/sync-engine.d.cts.map +1 -0
  392. package/dist/sync-engine.d.mts +473 -0
  393. package/dist/sync-engine.d.mts.map +1 -0
  394. package/dist/sync-engine.mjs +1315 -0
  395. package/dist/sync-engine.mjs.map +1 -0
  396. package/dist/sync-state.cjs +303 -0
  397. package/dist/sync-state.d.cts +224 -0
  398. package/dist/sync-state.d.cts.map +1 -0
  399. package/dist/sync-state.d.mts +224 -0
  400. package/dist/sync-state.d.mts.map +1 -0
  401. package/dist/sync-state.mjs +297 -0
  402. package/dist/sync-state.mjs.map +1 -0
  403. package/dist/timestamp.cjs +92 -0
  404. package/dist/timestamp.mjs +91 -0
  405. package/dist/timestamp.mjs.map +1 -0
  406. package/dist/transports/http.cjs +54 -0
  407. package/dist/transports/http.d.cts +26 -0
  408. package/dist/transports/http.d.cts.map +1 -0
  409. package/dist/transports/http.d.mts +26 -0
  410. package/dist/transports/http.d.mts.map +1 -0
  411. package/dist/transports/http.mjs +54 -0
  412. package/dist/transports/http.mjs.map +1 -0
  413. package/dist/transports/static.cjs +55 -0
  414. package/dist/transports/static.d.cts +28 -0
  415. package/dist/transports/static.d.cts.map +1 -0
  416. package/dist/transports/static.d.mts +28 -0
  417. package/dist/transports/static.d.mts.map +1 -0
  418. package/dist/transports/static.mjs +55 -0
  419. package/dist/transports/static.mjs.map +1 -0
  420. package/dist/transports/types.cjs +13 -0
  421. package/dist/transports/types.d.cts +72 -0
  422. package/dist/transports/types.d.cts.map +1 -0
  423. package/dist/transports/types.d.mts +72 -0
  424. package/dist/transports/types.d.mts.map +1 -0
  425. package/dist/transports/types.mjs +13 -0
  426. package/dist/transports/types.mjs.map +1 -0
  427. package/dist/transports/ws.cjs +207 -0
  428. package/dist/transports/ws.d.cts +47 -0
  429. package/dist/transports/ws.d.cts.map +1 -0
  430. package/dist/transports/ws.d.mts +47 -0
  431. package/dist/transports/ws.d.mts.map +1 -0
  432. package/dist/transports/ws.mjs +206 -0
  433. package/dist/transports/ws.mjs.map +1 -0
  434. package/dist/tree-index.cjs +333 -0
  435. package/dist/tree-index.d.cts +524 -0
  436. package/dist/tree-index.d.cts.map +1 -0
  437. package/dist/tree-index.d.mts +524 -0
  438. package/dist/tree-index.d.mts.map +1 -0
  439. package/dist/tree-index.mjs +322 -0
  440. package/dist/tree-index.mjs.map +1 -0
  441. package/dist/tree-query.cjs +655 -0
  442. package/dist/tree-query.d.cts +70 -0
  443. package/dist/tree-query.d.cts.map +1 -0
  444. package/dist/tree-query.d.mts +70 -0
  445. package/dist/tree-query.d.mts.map +1 -0
  446. package/dist/tree-query.mjs +648 -0
  447. package/dist/tree-query.mjs.map +1 -0
  448. package/dist/upload-actions.cjs +97 -0
  449. package/dist/upload-actions.d.cts +19 -0
  450. package/dist/upload-actions.d.cts.map +1 -0
  451. package/dist/upload-actions.d.mts +21 -0
  452. package/dist/upload-actions.d.mts.map +1 -0
  453. package/dist/upload-actions.mjs +90 -0
  454. package/dist/upload-actions.mjs.map +1 -0
  455. package/dist/upload-session-store.cjs +185 -0
  456. package/dist/upload-session-store.d.cts +99 -0
  457. package/dist/upload-session-store.d.cts.map +1 -0
  458. package/dist/upload-session-store.d.mts +99 -0
  459. package/dist/upload-session-store.d.mts.map +1 -0
  460. package/dist/upload-session-store.mjs +184 -0
  461. package/dist/upload-session-store.mjs.map +1 -0
  462. package/dist/url-normalize.cjs +61 -0
  463. package/dist/url-normalize.d.cts +33 -0
  464. package/dist/url-normalize.d.cts.map +1 -0
  465. package/dist/url-normalize.d.mts +33 -0
  466. package/dist/url-normalize.d.mts.map +1 -0
  467. package/dist/url-normalize.mjs +61 -0
  468. package/dist/url-normalize.mjs.map +1 -0
  469. package/dist/versioned-content-backends.cjs +155 -0
  470. package/dist/versioned-content-backends.d.cts +49 -0
  471. package/dist/versioned-content-backends.d.cts.map +1 -0
  472. package/dist/versioned-content-backends.d.mts +49 -0
  473. package/dist/versioned-content-backends.d.mts.map +1 -0
  474. package/dist/versioned-content-backends.mjs +154 -0
  475. package/dist/versioned-content-backends.mjs.map +1 -0
  476. package/dist/versioned-content-index.cjs +102 -0
  477. package/dist/versioned-content-index.d.cts +46 -0
  478. package/dist/versioned-content-index.d.cts.map +1 -0
  479. package/dist/versioned-content-index.d.mts +46 -0
  480. package/dist/versioned-content-index.d.mts.map +1 -0
  481. package/dist/versioned-content-index.mjs +103 -0
  482. package/dist/versioned-content-index.mjs.map +1 -0
  483. package/dist/versioned-content-store.cjs +121 -0
  484. package/dist/versioned-content-store.d.cts +90 -0
  485. package/dist/versioned-content-store.d.cts.map +1 -0
  486. package/dist/versioned-content-store.d.mts +90 -0
  487. package/dist/versioned-content-store.d.mts.map +1 -0
  488. package/dist/versioned-content-store.mjs +122 -0
  489. package/dist/versioned-content-store.mjs.map +1 -0
  490. package/dist/versioned-scope.cjs +39 -0
  491. package/dist/versioned-scope.d.cts +57 -0
  492. package/dist/versioned-scope.d.cts.map +1 -0
  493. package/dist/versioned-scope.d.mts +57 -0
  494. package/dist/versioned-scope.d.mts.map +1 -0
  495. package/dist/versioned-scope.mjs +37 -0
  496. package/dist/versioned-scope.mjs.map +1 -0
  497. package/migrations/0001_tree_entries.sql +17 -0
  498. package/migrations/0002_resolve_entries.sql +7 -0
  499. package/migrations/0003_entries_v2.sql +38 -0
  500. package/migrations/0004_gc_queue.sql +5 -0
  501. package/migrations/0006_resolve_enhance.sql +14 -0
  502. package/migrations/0007_resolve_created_at.sql +10 -0
  503. package/migrations/0008_changelog.sql +34 -0
  504. package/migrations/0009_device_sync_state.sql +29 -0
  505. package/migrations/0010_scope_meta.sql +33 -0
  506. package/migrations/0011_shares.sql +25 -0
  507. package/migrations/0012_scope_meta_file_count.sql +41 -0
  508. package/migrations/0013_scope_meta_total_bytes.sql +47 -0
  509. package/migrations/0014_rename_tables.sql +62 -0
  510. package/package.json +102 -0
@@ -0,0 +1,43 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ let zod = require("zod");
3
+
4
+ //#region src/download-actions.ts
5
+ /**
6
+ * download-actions.ts — arg schema + constants for the DID Space download-plane
7
+ * `prepare-download` action (design §7.2 / §7.4 / §10). Mirrors
8
+ * `upload-actions.ts`; the action HANDLER lives on `DIDSpaceProvider` (decorators
9
+ * must register on the class), so this module holds only the validation shape +
10
+ * resource bounds, unit-testable in isolation.
11
+ */
12
+ /**
13
+ * Download-plane action names (design §15 decision 1). Kept SEPARATE from
14
+ * `UPLOAD_ACTIONS` — the catalogue iterates `[...UPLOAD_ACTIONS,
15
+ * ...DOWNLOAD_ACTIONS]`; download actions are never folded into the upload list.
16
+ */
17
+ const DOWNLOAD_ACTIONS = ["prepare-download"];
18
+ /**
19
+ * Max entries per `prepare-download` (design §7.4 / Finding 5). The afs-rpc body
20
+ * cap (24MB) would otherwise admit ~350k cids → ~350k SigV4 signs — the CPU bomb
21
+ * this plane exists to kill. 256 aligns with the client download batch and is a
22
+ * HARD cap, unlike `PrepareUploadArgsSchema` which has `.min(1)` but NO `.max()`
23
+ * (the gap this must not copy). Over-limit → whole request `AFS_VALIDATION_ERROR`.
24
+ */
25
+ const DOWNLOAD_MAX_ENTRIES = 256;
26
+ /**
27
+ * Default presigned-GET TTL (design §8.3). A SHORT TTL bounds the bearer GET
28
+ * exposure window. `PRESIGN_MAX_EXPIRES_SEC` (7d) is only the signer's
29
+ * upper-bound *validation* value — NEVER the default; passing 7d would
30
+ * needlessly widen the exposure window for no benefit.
31
+ */
32
+ const DOWNLOAD_GRANT_TTL_SEC = 7200;
33
+ const prepareDownloadEntry = zod.z.object({
34
+ cid: zod.z.string(),
35
+ path: zod.z.string().optional()
36
+ });
37
+ const PrepareDownloadArgsSchema = zod.z.object({ entries: zod.z.array(prepareDownloadEntry).min(1).max(DOWNLOAD_MAX_ENTRIES) });
38
+
39
+ //#endregion
40
+ exports.DOWNLOAD_ACTIONS = DOWNLOAD_ACTIONS;
41
+ exports.DOWNLOAD_GRANT_TTL_SEC = DOWNLOAD_GRANT_TTL_SEC;
42
+ exports.DOWNLOAD_MAX_ENTRIES = DOWNLOAD_MAX_ENTRIES;
43
+ exports.PrepareDownloadArgsSchema = PrepareDownloadArgsSchema;
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/download-actions.ts
4
+ /**
5
+ * download-actions.ts — arg schema + constants for the DID Space download-plane
6
+ * `prepare-download` action (design §7.2 / §7.4 / §10). Mirrors
7
+ * `upload-actions.ts`; the action HANDLER lives on `DIDSpaceProvider` (decorators
8
+ * must register on the class), so this module holds only the validation shape +
9
+ * resource bounds, unit-testable in isolation.
10
+ */
11
+ /**
12
+ * Download-plane action names (design §15 decision 1). Kept SEPARATE from
13
+ * `UPLOAD_ACTIONS` — the catalogue iterates `[...UPLOAD_ACTIONS,
14
+ * ...DOWNLOAD_ACTIONS]`; download actions are never folded into the upload list.
15
+ */
16
+ const DOWNLOAD_ACTIONS = ["prepare-download"];
17
+ /**
18
+ * Max entries per `prepare-download` (design §7.4 / Finding 5). The afs-rpc body
19
+ * cap (24MB) would otherwise admit ~350k cids → ~350k SigV4 signs — the CPU bomb
20
+ * this plane exists to kill. 256 aligns with the client download batch and is a
21
+ * HARD cap, unlike `PrepareUploadArgsSchema` which has `.min(1)` but NO `.max()`
22
+ * (the gap this must not copy). Over-limit → whole request `AFS_VALIDATION_ERROR`.
23
+ */
24
+ const DOWNLOAD_MAX_ENTRIES = 256;
25
+ /**
26
+ * Default presigned-GET TTL (design §8.3). A SHORT TTL bounds the bearer GET
27
+ * exposure window. `PRESIGN_MAX_EXPIRES_SEC` (7d) is only the signer's
28
+ * upper-bound *validation* value — NEVER the default; passing 7d would
29
+ * needlessly widen the exposure window for no benefit.
30
+ */
31
+ const DOWNLOAD_GRANT_TTL_SEC = 7200;
32
+ const prepareDownloadEntry = z.object({
33
+ cid: z.string(),
34
+ path: z.string().optional()
35
+ });
36
+ const PrepareDownloadArgsSchema = z.object({ entries: z.array(prepareDownloadEntry).min(1).max(DOWNLOAD_MAX_ENTRIES) });
37
+
38
+ //#endregion
39
+ export { DOWNLOAD_ACTIONS, DOWNLOAD_GRANT_TTL_SEC, DOWNLOAD_MAX_ENTRIES, PrepareDownloadArgsSchema };
40
+ //# sourceMappingURL=download-actions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-actions.mjs","names":[],"sources":["../src/download-actions.ts"],"sourcesContent":["/**\n * download-actions.ts — arg schema + constants for the DID Space download-plane\n * `prepare-download` action (design §7.2 / §7.4 / §10). Mirrors\n * `upload-actions.ts`; the action HANDLER lives on `DIDSpaceProvider` (decorators\n * must register on the class), so this module holds only the validation shape +\n * resource bounds, unit-testable in isolation.\n */\n\nimport { z } from \"zod\";\n\n/**\n * Download-plane action names (design §15 decision 1). Kept SEPARATE from\n * `UPLOAD_ACTIONS` — the catalogue iterates `[...UPLOAD_ACTIONS,\n * ...DOWNLOAD_ACTIONS]`; download actions are never folded into the upload list.\n */\nexport const DOWNLOAD_ACTIONS = [\"prepare-download\"] as const;\n\n/**\n * Max entries per `prepare-download` (design §7.4 / Finding 5). The afs-rpc body\n * cap (24MB) would otherwise admit ~350k cids → ~350k SigV4 signs — the CPU bomb\n * this plane exists to kill. 256 aligns with the client download batch and is a\n * HARD cap, unlike `PrepareUploadArgsSchema` which has `.min(1)` but NO `.max()`\n * (the gap this must not copy). Over-limit → whole request `AFS_VALIDATION_ERROR`.\n */\nexport const DOWNLOAD_MAX_ENTRIES = 256;\n\n/**\n * Default presigned-GET TTL (design §8.3). A SHORT TTL bounds the bearer GET\n * exposure window. `PRESIGN_MAX_EXPIRES_SEC` (7d) is only the signer's\n * upper-bound *validation* value — NEVER the default; passing 7d would\n * needlessly widen the exposure window for no benefit.\n */\nexport const DOWNLOAD_GRANT_TTL_SEC = 2 * 60 * 60; // 2h\n\nconst prepareDownloadEntry = z.object({\n cid: z.string(),\n // `path` is for error context / logging ONLY — it never participates in\n // authorization (authorization looks at whether the cid is referenced, §7.2).\n path: z.string().optional(),\n});\n\nexport const PrepareDownloadArgsSchema = z.object({\n entries: z.array(prepareDownloadEntry).min(1).max(DOWNLOAD_MAX_ENTRIES),\n});\n\nexport type PrepareDownloadArgs = z.infer<typeof PrepareDownloadArgsSchema>;\n"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAa,mBAAmB,CAAC,mBAAmB;;;;;;;;AASpD,MAAa,uBAAuB;;;;;;;AAQpC,MAAa,yBAAyB;AAEtC,MAAM,uBAAuB,EAAE,OAAO;CACpC,KAAK,EAAE,QAAQ;CAGf,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;AAEF,MAAa,4BAA4B,EAAE,OAAO,EAChD,SAAS,EAAE,MAAM,qBAAqB,CAAC,IAAI,EAAE,CAAC,IAAI,qBAAqB,EACxE,CAAC"}
@@ -0,0 +1,153 @@
1
+ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
+ let node_path = require("node:path");
3
+ let node_fs_promises = require("node:fs/promises");
4
+
5
+ //#region src/fs-object-store.ts
6
+ /**
7
+ * FsObjectStore — a node-fs `ObjectStore` for the Node DID-Space backend.
8
+ *
9
+ * Stores content-addressed blobs at `{spaceDir}/objects/{cid}` (key verbatim —
10
+ * `DIDSpaceProvider.objectKey()` passes `objects/{cid}`, no key translation).
11
+ * Each user space has its own directory, so cross-user isolation is structural:
12
+ * knowing a cid never reaches another user's blob (the cid resolves under THIS
13
+ * space's dir only). Path-traversal keys (`..`, absolute escapes) resolve
14
+ * outside the space dir and are rejected (read→null, write→throw, delete→noop).
15
+ *
16
+ * Lives in the did-space package (not r2) so the r2 package keeps zero node-fs
17
+ * dependency (design §2.B).
18
+ */
19
+ /** True if any `/`- or `\`-delimited segment of `key` is exactly `..`. */
20
+ function hasDotDotSegment(key) {
21
+ return key.split(/[\\/]/).includes("..");
22
+ }
23
+ var FsObjectStore = class {
24
+ root;
25
+ constructor(spaceDir) {
26
+ this.root = (0, node_path.resolve)(spaceDir);
27
+ }
28
+ /**
29
+ * Resolve a store key to an absolute path, rejecting any key that escapes the
30
+ * space dir (path traversal). Returns null when the key is unsafe.
31
+ */
32
+ safePath(key) {
33
+ if (typeof key !== "string" || key.length === 0) return null;
34
+ const full = (0, node_path.resolve)(this.root, key);
35
+ if (full !== this.root && !full.startsWith(this.root + node_path.sep)) return null;
36
+ return full;
37
+ }
38
+ async toBytes(value) {
39
+ if (typeof value === "string") return new TextEncoder().encode(value);
40
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
41
+ const reader = value.getReader();
42
+ const chunks = [];
43
+ let total = 0;
44
+ for (;;) {
45
+ const { done, value: chunk } = await reader.read();
46
+ if (done) break;
47
+ if (chunk) {
48
+ chunks.push(chunk);
49
+ total += chunk.length;
50
+ }
51
+ }
52
+ const merged = new Uint8Array(total);
53
+ let offset = 0;
54
+ for (const c of chunks) {
55
+ merged.set(c, offset);
56
+ offset += c.length;
57
+ }
58
+ return merged;
59
+ }
60
+ async get(key) {
61
+ const full = this.safePath(key);
62
+ if (!full) return null;
63
+ let bytes;
64
+ let uploaded;
65
+ try {
66
+ bytes = await (0, node_fs_promises.readFile)(full);
67
+ uploaded = (await (0, node_fs_promises.stat)(full)).mtime;
68
+ } catch {
69
+ return null;
70
+ }
71
+ const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
72
+ return {
73
+ key,
74
+ size: bytes.byteLength,
75
+ uploaded,
76
+ async text() {
77
+ return new TextDecoder().decode(bytes);
78
+ },
79
+ async arrayBuffer() {
80
+ return ab;
81
+ }
82
+ };
83
+ }
84
+ async put(key, value) {
85
+ const full = this.safePath(key);
86
+ if (!full) throw new Error(`FsObjectStore: unsafe key '${key}'`);
87
+ const bytes = await this.toBytes(value);
88
+ await (0, node_fs_promises.mkdir)((0, node_path.dirname)(full), { recursive: true });
89
+ await (0, node_fs_promises.writeFile)(full, bytes);
90
+ }
91
+ async list(options) {
92
+ const prefix = options?.prefix ?? "";
93
+ const limit = options?.limit ?? 1e3;
94
+ const keys = [];
95
+ const walk = async (dir, rel) => {
96
+ let entries;
97
+ try {
98
+ entries = await (0, node_fs_promises.readdir)(dir, { withFileTypes: true });
99
+ } catch {
100
+ return;
101
+ }
102
+ for (const ent of entries) {
103
+ const childRel = rel ? `${rel}/${ent.name}` : ent.name;
104
+ if (ent.isDirectory()) await walk((0, node_path.join)(dir, ent.name), childRel);
105
+ else if (ent.isFile()) keys.push(childRel);
106
+ }
107
+ };
108
+ await walk(this.root, "");
109
+ let matched = keys.filter((k) => k.startsWith(prefix)).sort();
110
+ if (options?.cursor) {
111
+ const idx = matched.indexOf(options.cursor);
112
+ if (idx >= 0) matched = matched.slice(idx + 1);
113
+ }
114
+ const truncated = matched.length > limit;
115
+ const selected = truncated ? matched.slice(0, limit) : matched;
116
+ return {
117
+ objects: await Promise.all(selected.map(async (key) => {
118
+ const s = await (0, node_fs_promises.stat)((0, node_path.join)(this.root, key));
119
+ return {
120
+ key,
121
+ size: s.size,
122
+ uploaded: s.mtime
123
+ };
124
+ })),
125
+ truncated,
126
+ cursor: truncated ? selected[selected.length - 1] : void 0
127
+ };
128
+ }
129
+ async head(key) {
130
+ const full = this.safePath(key);
131
+ if (!full) return null;
132
+ try {
133
+ const s = await (0, node_fs_promises.stat)(full);
134
+ if (!s.isFile()) return null;
135
+ return {
136
+ key,
137
+ size: s.size,
138
+ uploaded: s.mtime
139
+ };
140
+ } catch {
141
+ return null;
142
+ }
143
+ }
144
+ async delete(key) {
145
+ if (hasDotDotSegment(key)) return;
146
+ const full = this.safePath(key);
147
+ if (!full) return;
148
+ await (0, node_fs_promises.rm)(full, { force: true });
149
+ }
150
+ };
151
+
152
+ //#endregion
153
+ exports.FsObjectStore = FsObjectStore;
@@ -0,0 +1,21 @@
1
+ import { ObjectStore, ObjectStoreHeadResult, ObjectStoreListOptions, ObjectStoreListResult, ObjectStoreObject } from "./platform/r2/dist/types.cjs";
2
+
3
+ //#region src/fs-object-store.d.ts
4
+ declare class FsObjectStore implements ObjectStore {
5
+ private readonly root;
6
+ constructor(spaceDir: string);
7
+ /**
8
+ * Resolve a store key to an absolute path, rejecting any key that escapes the
9
+ * space dir (path traversal). Returns null when the key is unsafe.
10
+ */
11
+ private safePath;
12
+ private toBytes;
13
+ get(key: string): Promise<ObjectStoreObject | null>;
14
+ put(key: string, value: string | ArrayBuffer | ReadableStream): Promise<void>;
15
+ list(options?: ObjectStoreListOptions): Promise<ObjectStoreListResult>;
16
+ head(key: string): Promise<ObjectStoreHeadResult | null>;
17
+ delete(key: string): Promise<void>;
18
+ }
19
+ //#endregion
20
+ export { FsObjectStore };
21
+ //# sourceMappingURL=fs-object-store.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-object-store.d.cts","names":[],"sources":["../src/fs-object-store.ts"],"mappings":";;;cA+Ba,aAAA,YAAyB,WAAA;EAAA,iBACnB,IAAA;cAEL,QAAA;EAHwB;;;;EAAA,QAW5B,QAAA;EAAA,QAOM,OAAA;EAwBR,GAAA,CAAI,GAAA,WAAc,OAAA,CAAQ,iBAAA;EA0B1B,GAAA,CAAI,GAAA,UAAa,KAAA,WAAgB,WAAA,GAAc,cAAA,GAAiB,OAAA;EAQhE,IAAA,CAAK,OAAA,GAAU,sBAAA,GAAyB,OAAA,CAAQ,qBAAA;EA6ChD,IAAA,CAAK,GAAA,WAAc,OAAA,CAAQ,qBAAA;EAY3B,MAAA,CAAO,GAAA,WAAc,OAAA;AAAA"}
@@ -0,0 +1,22 @@
1
+ import { ObjectStore, ObjectStoreHeadResult, ObjectStoreListOptions, ObjectStoreListResult, ObjectStoreObject } from "./providers/platform/r2/dist/types.mjs";
2
+ import "./providers/platform/r2/dist/index.mjs";
3
+
4
+ //#region src/fs-object-store.d.ts
5
+ declare class FsObjectStore implements ObjectStore {
6
+ private readonly root;
7
+ constructor(spaceDir: string);
8
+ /**
9
+ * Resolve a store key to an absolute path, rejecting any key that escapes the
10
+ * space dir (path traversal). Returns null when the key is unsafe.
11
+ */
12
+ private safePath;
13
+ private toBytes;
14
+ get(key: string): Promise<ObjectStoreObject | null>;
15
+ put(key: string, value: string | ArrayBuffer | ReadableStream): Promise<void>;
16
+ list(options?: ObjectStoreListOptions): Promise<ObjectStoreListResult>;
17
+ head(key: string): Promise<ObjectStoreHeadResult | null>;
18
+ delete(key: string): Promise<void>;
19
+ }
20
+ //#endregion
21
+ export { FsObjectStore };
22
+ //# sourceMappingURL=fs-object-store.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-object-store.d.mts","names":[],"sources":["../src/fs-object-store.ts"],"mappings":";;;;cA+Ba,aAAA,YAAyB,WAAA;EAAA,iBACnB,IAAA;cAEL,QAAA;EAkIe;;;;EAAA,QA1HnB,QAAA;EAAA,QAOM,OAAA;EAwBR,GAAA,CAAI,GAAA,WAAc,OAAA,CAAQ,iBAAA;EA0B1B,GAAA,CAAI,GAAA,UAAa,KAAA,WAAgB,WAAA,GAAc,cAAA,GAAiB,OAAA;EAQhE,IAAA,CAAK,OAAA,GAAU,sBAAA,GAAyB,OAAA,CAAQ,qBAAA;EA6ChD,IAAA,CAAK,GAAA,WAAc,OAAA,CAAQ,qBAAA;EAY3B,MAAA,CAAO,GAAA,WAAc,OAAA;AAAA"}
@@ -0,0 +1,153 @@
1
+ import { dirname, join, resolve, sep } from "node:path";
2
+ import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
3
+
4
+ //#region src/fs-object-store.ts
5
+ /**
6
+ * FsObjectStore — a node-fs `ObjectStore` for the Node DID-Space backend.
7
+ *
8
+ * Stores content-addressed blobs at `{spaceDir}/objects/{cid}` (key verbatim —
9
+ * `DIDSpaceProvider.objectKey()` passes `objects/{cid}`, no key translation).
10
+ * Each user space has its own directory, so cross-user isolation is structural:
11
+ * knowing a cid never reaches another user's blob (the cid resolves under THIS
12
+ * space's dir only). Path-traversal keys (`..`, absolute escapes) resolve
13
+ * outside the space dir and are rejected (read→null, write→throw, delete→noop).
14
+ *
15
+ * Lives in the did-space package (not r2) so the r2 package keeps zero node-fs
16
+ * dependency (design §2.B).
17
+ */
18
+ /** True if any `/`- or `\`-delimited segment of `key` is exactly `..`. */
19
+ function hasDotDotSegment(key) {
20
+ return key.split(/[\\/]/).includes("..");
21
+ }
22
+ var FsObjectStore = class {
23
+ root;
24
+ constructor(spaceDir) {
25
+ this.root = resolve(spaceDir);
26
+ }
27
+ /**
28
+ * Resolve a store key to an absolute path, rejecting any key that escapes the
29
+ * space dir (path traversal). Returns null when the key is unsafe.
30
+ */
31
+ safePath(key) {
32
+ if (typeof key !== "string" || key.length === 0) return null;
33
+ const full = resolve(this.root, key);
34
+ if (full !== this.root && !full.startsWith(this.root + sep)) return null;
35
+ return full;
36
+ }
37
+ async toBytes(value) {
38
+ if (typeof value === "string") return new TextEncoder().encode(value);
39
+ if (value instanceof ArrayBuffer) return new Uint8Array(value);
40
+ const reader = value.getReader();
41
+ const chunks = [];
42
+ let total = 0;
43
+ for (;;) {
44
+ const { done, value: chunk } = await reader.read();
45
+ if (done) break;
46
+ if (chunk) {
47
+ chunks.push(chunk);
48
+ total += chunk.length;
49
+ }
50
+ }
51
+ const merged = new Uint8Array(total);
52
+ let offset = 0;
53
+ for (const c of chunks) {
54
+ merged.set(c, offset);
55
+ offset += c.length;
56
+ }
57
+ return merged;
58
+ }
59
+ async get(key) {
60
+ const full = this.safePath(key);
61
+ if (!full) return null;
62
+ let bytes;
63
+ let uploaded;
64
+ try {
65
+ bytes = await readFile(full);
66
+ uploaded = (await stat(full)).mtime;
67
+ } catch {
68
+ return null;
69
+ }
70
+ const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
71
+ return {
72
+ key,
73
+ size: bytes.byteLength,
74
+ uploaded,
75
+ async text() {
76
+ return new TextDecoder().decode(bytes);
77
+ },
78
+ async arrayBuffer() {
79
+ return ab;
80
+ }
81
+ };
82
+ }
83
+ async put(key, value) {
84
+ const full = this.safePath(key);
85
+ if (!full) throw new Error(`FsObjectStore: unsafe key '${key}'`);
86
+ const bytes = await this.toBytes(value);
87
+ await mkdir(dirname(full), { recursive: true });
88
+ await writeFile(full, bytes);
89
+ }
90
+ async list(options) {
91
+ const prefix = options?.prefix ?? "";
92
+ const limit = options?.limit ?? 1e3;
93
+ const keys = [];
94
+ const walk = async (dir, rel) => {
95
+ let entries;
96
+ try {
97
+ entries = await readdir(dir, { withFileTypes: true });
98
+ } catch {
99
+ return;
100
+ }
101
+ for (const ent of entries) {
102
+ const childRel = rel ? `${rel}/${ent.name}` : ent.name;
103
+ if (ent.isDirectory()) await walk(join(dir, ent.name), childRel);
104
+ else if (ent.isFile()) keys.push(childRel);
105
+ }
106
+ };
107
+ await walk(this.root, "");
108
+ let matched = keys.filter((k) => k.startsWith(prefix)).sort();
109
+ if (options?.cursor) {
110
+ const idx = matched.indexOf(options.cursor);
111
+ if (idx >= 0) matched = matched.slice(idx + 1);
112
+ }
113
+ const truncated = matched.length > limit;
114
+ const selected = truncated ? matched.slice(0, limit) : matched;
115
+ return {
116
+ objects: await Promise.all(selected.map(async (key) => {
117
+ const s = await stat(join(this.root, key));
118
+ return {
119
+ key,
120
+ size: s.size,
121
+ uploaded: s.mtime
122
+ };
123
+ })),
124
+ truncated,
125
+ cursor: truncated ? selected[selected.length - 1] : void 0
126
+ };
127
+ }
128
+ async head(key) {
129
+ const full = this.safePath(key);
130
+ if (!full) return null;
131
+ try {
132
+ const s = await stat(full);
133
+ if (!s.isFile()) return null;
134
+ return {
135
+ key,
136
+ size: s.size,
137
+ uploaded: s.mtime
138
+ };
139
+ } catch {
140
+ return null;
141
+ }
142
+ }
143
+ async delete(key) {
144
+ if (hasDotDotSegment(key)) return;
145
+ const full = this.safePath(key);
146
+ if (!full) return;
147
+ await rm(full, { force: true });
148
+ }
149
+ };
150
+
151
+ //#endregion
152
+ export { FsObjectStore };
153
+ //# sourceMappingURL=fs-object-store.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-object-store.mjs","names":[],"sources":["../src/fs-object-store.ts"],"sourcesContent":["/**\n * FsObjectStore — a node-fs `ObjectStore` for the Node DID-Space backend.\n *\n * Stores content-addressed blobs at `{spaceDir}/objects/{cid}` (key verbatim —\n * `DIDSpaceProvider.objectKey()` passes `objects/{cid}`, no key translation).\n * Each user space has its own directory, so cross-user isolation is structural:\n * knowing a cid never reaches another user's blob (the cid resolves under THIS\n * space's dir only). Path-traversal keys (`..`, absolute escapes) resolve\n * outside the space dir and are rejected (read→null, write→throw, delete→noop).\n *\n * Lives in the did-space package (not r2) so the r2 package keeps zero node-fs\n * dependency (design §2.B).\n */\n\n// biome-ignore lint/style/noRestrictedImports: provider internal — FsObjectStore is the Node-only storage primitive (CLAUDE.md provider-internal exception)\nimport { mkdir, readdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\n// biome-ignore lint/style/noRestrictedImports: provider internal — physical object-store path layout\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport type {\n ObjectStore,\n ObjectStoreHeadResult,\n ObjectStoreListOptions,\n ObjectStoreListResult,\n ObjectStoreObject,\n} from \"@aigne/afs-r2\";\n\n/** True if any `/`- or `\\`-delimited segment of `key` is exactly `..`. */\nfunction hasDotDotSegment(key: string): boolean {\n return key.split(/[\\\\/]/).includes(\"..\");\n}\n\nexport class FsObjectStore implements ObjectStore {\n private readonly root: string;\n\n constructor(spaceDir: string) {\n this.root = resolve(spaceDir);\n }\n\n /**\n * Resolve a store key to an absolute path, rejecting any key that escapes the\n * space dir (path traversal). Returns null when the key is unsafe.\n */\n private safePath(key: string): string | null {\n if (typeof key !== \"string\" || key.length === 0) return null;\n const full = resolve(this.root, key);\n if (full !== this.root && !full.startsWith(this.root + sep)) return null;\n return full;\n }\n\n private async toBytes(value: string | ArrayBuffer | ReadableStream): Promise<Uint8Array> {\n if (typeof value === \"string\") return new TextEncoder().encode(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n // ReadableStream\n const reader = (value as ReadableStream<Uint8Array>).getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value: chunk } = await reader.read();\n if (done) break;\n if (chunk) {\n chunks.push(chunk);\n total += chunk.length;\n }\n }\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) {\n merged.set(c, offset);\n offset += c.length;\n }\n return merged;\n }\n\n async get(key: string): Promise<ObjectStoreObject | null> {\n const full = this.safePath(key);\n if (!full) return null;\n let bytes: Buffer;\n let uploaded: Date;\n try {\n bytes = await readFile(full);\n uploaded = (await stat(full)).mtime;\n } catch {\n return null;\n }\n // Copy into a standalone ArrayBuffer slice (Buffer may be a pooled view).\n const ab = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n return {\n key,\n size: bytes.byteLength,\n uploaded,\n async text() {\n return new TextDecoder().decode(bytes);\n },\n async arrayBuffer() {\n return ab as ArrayBuffer;\n },\n };\n }\n\n async put(key: string, value: string | ArrayBuffer | ReadableStream): Promise<void> {\n const full = this.safePath(key);\n if (!full) throw new Error(`FsObjectStore: unsafe key '${key}'`);\n const bytes = await this.toBytes(value);\n await mkdir(dirname(full), { recursive: true });\n await writeFile(full, bytes);\n }\n\n async list(options?: ObjectStoreListOptions): Promise<ObjectStoreListResult> {\n const prefix = options?.prefix ?? \"\";\n const limit = options?.limit ?? 1000;\n\n // Walk every file under the space dir, key = path relative to root (POSIX-style).\n const keys: string[] = [];\n const walk = async (dir: string, rel: string): Promise<void> => {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const ent of entries) {\n const childRel = rel ? `${rel}/${ent.name}` : ent.name;\n if (ent.isDirectory()) {\n await walk(join(dir, ent.name), childRel);\n } else if (ent.isFile()) {\n keys.push(childRel);\n }\n }\n };\n await walk(this.root, \"\");\n\n let matched = keys.filter((k) => k.startsWith(prefix)).sort();\n if (options?.cursor) {\n const idx = matched.indexOf(options.cursor);\n if (idx >= 0) matched = matched.slice(idx + 1);\n }\n const truncated = matched.length > limit;\n const selected = truncated ? matched.slice(0, limit) : matched;\n\n const objects = await Promise.all(\n selected.map(async (key) => {\n const s = await stat(join(this.root, key));\n return { key, size: s.size, uploaded: s.mtime };\n }),\n );\n return {\n objects,\n truncated,\n cursor: truncated ? selected[selected.length - 1] : undefined,\n };\n }\n\n async head(key: string): Promise<ObjectStoreHeadResult | null> {\n const full = this.safePath(key);\n if (!full) return null;\n try {\n const s = await stat(full);\n if (!s.isFile()) return null;\n return { key, size: s.size, uploaded: s.mtime };\n } catch {\n return null;\n }\n }\n\n async delete(key: string): Promise<void> {\n // Defense-in-depth layer 3 (design §4.5): reject any `..` path segment.\n // `safePath` only blocks keys that escape the space root, but a\n // root-INTERNAL traversal like `objects/../_metadata.db` resolves to\n // `{root}/_metadata.db` — still inside root, so safePath would allow it and\n // delete would destroy the index. A real cid never contains `..`, so this\n // only ever fires on a poisoned GC-queue row.\n if (hasDotDotSegment(key)) return;\n const full = this.safePath(key);\n if (!full) return;\n await rm(full, { force: true });\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ //#region src/gc-queue.d.ts
2
+ /**
3
+ * GcQueue — pure-storage interface for the deferred object-GC queue (design §4.4).
4
+ *
5
+ * The queue holds CIDs whose backing object MIGHT be reclaimable, with the
6
+ * time they were enqueued. It is **storage only** — it has NO reference/liveness
7
+ * method. Liveness is decided separately by `referencedAnywhere` (see
8
+ * `reference-check.ts`) and applied by `runGc`. This split keeps the sweeper
9
+ * storage-agnostic and stops the queue from re-introducing the legacy three-way
10
+ * `isReferenced` (which would pin every overwritten cid forever, §0.2).
11
+ *
12
+ * Schema (unchanged across runtimes):
13
+ * gc_queue (cid TEXT PRIMARY KEY, queued_at INTEGER)
14
+ *
15
+ * Impls: `D1GCQueue` (Cloudflare D1), `SqliteGcQueue` (Node `_metadata.db`),
16
+ * `MemoryGcQueue` (testing). All three pass the shared conformance suite.
17
+ */
18
+ interface GcQueue {
19
+ /** Create the `gc_queue` table if absent. Idempotent. */
20
+ ensureTable(): Promise<void>;
21
+ /** Enqueue CIDs for deferred GC. Idempotent — duplicates are ignored. Empty array is a no-op. */
22
+ enqueue(cids: string[]): Promise<void>;
23
+ /**
24
+ * Fetch candidate CIDs whose grace period has expired (enqueued more than
25
+ * `graceMs` ago). `runGc` always passes `graceMs` explicitly (canonical 7d) —
26
+ * an impl's own default is never relied upon (design §4.4).
27
+ */
28
+ fetchCandidates(limit?: number, graceMs?: number): Promise<Array<{
29
+ cid: string;
30
+ }>>;
31
+ /** Remove a CID from the queue (after its object was deleted, or it was kept). */
32
+ remove(cid: string): Promise<void>;
33
+ /**
34
+ * Remove MANY CIDs in one backend round trip (afs-rpc-batch P3 write-
35
+ * dequeue: a batch write re-references its cids — rescuing them from a
36
+ * pending GC must not cost one subrequest per cid on CF). Optional:
37
+ * callers fall back to per-cid `remove`.
38
+ */
39
+ removeMany?(cids: string[]): Promise<void>;
40
+ }
41
+ //#endregion
42
+ export { GcQueue };
43
+ //# sourceMappingURL=gc-queue.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc-queue.d.cts","names":[],"sources":["../src/gc-queue.ts"],"mappings":";;AAgBA;;;;;;;;;;;;;;;UAAiB,OAAA;EAYf;EAVA,WAAA,IAAe,OAAA;EAUiB;EAPhC,OAAA,CAAQ,IAAA,aAAiB,OAAA;EAOkC;;;;;EAA3D,eAAA,CAAgB,KAAA,WAAgB,OAAA,YAAmB,OAAA,CAAQ,KAAA;IAAQ,GAAA;EAAA;EAW/B;EARpC,MAAA,CAAO,GAAA,WAAc,OAAA;;;;;;;EAQrB,UAAA,EAAY,IAAA,aAAiB,OAAA;AAAA"}
@@ -0,0 +1,43 @@
1
+ //#region src/gc-queue.d.ts
2
+ /**
3
+ * GcQueue — pure-storage interface for the deferred object-GC queue (design §4.4).
4
+ *
5
+ * The queue holds CIDs whose backing object MIGHT be reclaimable, with the
6
+ * time they were enqueued. It is **storage only** — it has NO reference/liveness
7
+ * method. Liveness is decided separately by `referencedAnywhere` (see
8
+ * `reference-check.ts`) and applied by `runGc`. This split keeps the sweeper
9
+ * storage-agnostic and stops the queue from re-introducing the legacy three-way
10
+ * `isReferenced` (which would pin every overwritten cid forever, §0.2).
11
+ *
12
+ * Schema (unchanged across runtimes):
13
+ * gc_queue (cid TEXT PRIMARY KEY, queued_at INTEGER)
14
+ *
15
+ * Impls: `D1GCQueue` (Cloudflare D1), `SqliteGcQueue` (Node `_metadata.db`),
16
+ * `MemoryGcQueue` (testing). All three pass the shared conformance suite.
17
+ */
18
+ interface GcQueue {
19
+ /** Create the `gc_queue` table if absent. Idempotent. */
20
+ ensureTable(): Promise<void>;
21
+ /** Enqueue CIDs for deferred GC. Idempotent — duplicates are ignored. Empty array is a no-op. */
22
+ enqueue(cids: string[]): Promise<void>;
23
+ /**
24
+ * Fetch candidate CIDs whose grace period has expired (enqueued more than
25
+ * `graceMs` ago). `runGc` always passes `graceMs` explicitly (canonical 7d) —
26
+ * an impl's own default is never relied upon (design §4.4).
27
+ */
28
+ fetchCandidates(limit?: number, graceMs?: number): Promise<Array<{
29
+ cid: string;
30
+ }>>;
31
+ /** Remove a CID from the queue (after its object was deleted, or it was kept). */
32
+ remove(cid: string): Promise<void>;
33
+ /**
34
+ * Remove MANY CIDs in one backend round trip (afs-rpc-batch P3 write-
35
+ * dequeue: a batch write re-references its cids — rescuing them from a
36
+ * pending GC must not cost one subrequest per cid on CF). Optional:
37
+ * callers fall back to per-cid `remove`.
38
+ */
39
+ removeMany?(cids: string[]): Promise<void>;
40
+ }
41
+ //#endregion
42
+ export { GcQueue };
43
+ //# sourceMappingURL=gc-queue.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc-queue.d.mts","names":[],"sources":["../src/gc-queue.ts"],"mappings":";;AAgBA;;;;;;;;;;;;;;;UAAiB,OAAA;EAYf;EAVA,WAAA,IAAe,OAAA;EAUiB;EAPhC,OAAA,CAAQ,IAAA,aAAiB,OAAA;EAOkC;;;;;EAA3D,eAAA,CAAgB,KAAA,WAAgB,OAAA,YAAmB,OAAA,CAAQ,KAAA;IAAQ,GAAA;EAAA;EAW/B;EARpC,MAAA,CAAO,GAAA,WAAc,OAAA;;;;;;;EAQrB,UAAA,EAAY,IAAA,aAAiB,OAAA;AAAA"}