@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,113 @@
1
+ import { KeyValueStore } from "@aigne/afs-kv";
2
+
3
+ //#region src/resolve.d.ts
4
+ interface ResolveEntry {
5
+ owner: string;
6
+ path: string;
7
+ type?: string;
8
+ name?: string;
9
+ routes?: Array<{
10
+ name: string;
11
+ site: string;
12
+ path: string;
13
+ source: string;
14
+ handler: string;
15
+ }>;
16
+ /** Whether this blocklet has pre-rendered .web-cache/ content. Set at publish time. */
17
+ hasWebCache?: boolean;
18
+ /** Monotonic timestamp (Date.now()) set by CLI at publish time. Used by DO cache invalidation. */
19
+ publishVersion?: number;
20
+ }
21
+ interface DomainResolveEntry {
22
+ did: string;
23
+ owner: string;
24
+ path: string;
25
+ blockletDid?: string;
26
+ blockletOwner?: string;
27
+ blockletPath?: string;
28
+ /** Materialized from blocklet ResolveEntry at publish/bind time. */
29
+ routes?: Array<{
30
+ name: string;
31
+ site: string;
32
+ path: string;
33
+ source: string;
34
+ handler: string;
35
+ }>;
36
+ /** Materialized from blocklet ResolveEntry at publish/bind time. */
37
+ hasWebCache?: boolean;
38
+ /** Materialized from blocklet ResolveEntry at publish/bind time. Used by DO cache invalidation. */
39
+ publishVersion?: number;
40
+ }
41
+ declare class DIDSpaceResolver {
42
+ private store;
43
+ constructor(store: KeyValueStore);
44
+ resolve(did: string): Promise<ResolveEntry | null>;
45
+ register(did: string, entry: ResolveEntry): Promise<void>;
46
+ unregister(did: string): Promise<void>;
47
+ resolveBlocklet(id: string): Promise<ResolveEntry | null>;
48
+ registerBlocklet(id: string, entry: ResolveEntry): Promise<void>;
49
+ unregisterBlocklet(id: string): Promise<void>;
50
+ /** List all registered blocklets (`resolve/blocklet/*`). */
51
+ listBlocklets(): Promise<Array<{
52
+ id: string;
53
+ entry: ResolveEntry;
54
+ }>>;
55
+ list(options?: {
56
+ type?: string;
57
+ }): Promise<Array<{
58
+ did: string;
59
+ entry: ResolveEntry;
60
+ createdAt?: number;
61
+ updatedAt?: number;
62
+ }>>;
63
+ /** Optimized: single query with timestamps via D1ResolveStore.listWithTimestamps */
64
+ private _listWithTimestamps;
65
+ /** Optimized: single query via listWithValues (no N+1) */
66
+ private _listOptimized;
67
+ /** Fallback: N+1 queries (list keys, then get each value) */
68
+ private _listFallback;
69
+ listDomains(): Promise<Array<{
70
+ domain: string;
71
+ entry: DomainResolveEntry;
72
+ }>>;
73
+ /** Optimized: single query via listWithValues */
74
+ private _listDomainsOptimized;
75
+ /** Fallback: N+1 queries */
76
+ private _listDomainsFallback;
77
+ resolveDomain(domain: string): Promise<DomainResolveEntry | null>;
78
+ /**
79
+ * Serve-path host resolution (issue #808): fetch `resolve/blocklet/<name>` and
80
+ * `resolve/domain/<name>` in ONE store round trip (D1 `IN(...)`) instead of the
81
+ * sequential `resolveBlocklet` → `resolveDomain` ladder. Blocklet wins (id
82
+ * key), falling back to the domain entry — identical priority, one fewer round
83
+ * trip. For a brand-domain host (the prod model), the id key always misses and
84
+ * the domain key hits, so this saves the domain lookup's whole round trip on
85
+ * EVERY request. Degrades to two concurrent `get()`s when the store can't
86
+ * batch. `validateId` mirrors `resolveBlocklet` (the sequential ladder runs it
87
+ * first, so an invalid id resolves to null there too — never reaching domain).
88
+ */
89
+ resolveBlockletOrDomain(name: string): Promise<{
90
+ source: "blocklet";
91
+ owner: string;
92
+ path: string;
93
+ } | {
94
+ source: "domain";
95
+ owner: string;
96
+ path: string;
97
+ did: string;
98
+ } | null>;
99
+ registerDomain(domain: string, entry: DomainResolveEntry): Promise<void>;
100
+ unregisterDomain(domain: string): Promise<void>;
101
+ /**
102
+ * Domains currently registered to this exact (owner, path) pair (#764 Phase
103
+ * 4a). Shared by the write hook's reconcile step (drop domains no longer in
104
+ * a redeploy's manifest) and the delete hook (drop all domains on unpublish)
105
+ * — same `listDomains()` + filter pattern `applyBlockletDeleteHook` already
106
+ * used inline for `resolve/blocklet/*`, factored out here since Phase 4
107
+ * needs it twice.
108
+ */
109
+ domainsForBlocklet(owner: string, path: string): Promise<string[]>;
110
+ }
111
+ //#endregion
112
+ export { DIDSpaceResolver, DomainResolveEntry, ResolveEntry };
113
+ //# sourceMappingURL=resolve.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.mts","names":[],"sources":["../src/resolve.ts"],"mappings":";;;UAIiB,YAAA;EACf,KAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA,GAAS,KAAA;IAAQ,IAAA;IAAc,IAAA;IAAc,IAAA;IAAc,MAAA;IAAgB,OAAA;EAAA;EAA1D;EAEjB,WAAA;EAF6C;EAI7C,cAAA;AAAA;AAAA,UAGe,kBAAA;EACf,GAAA;EACA,KAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EAEc;EAAd,MAAA,GAAS,KAAA;IAAQ,IAAA;IAAc,IAAA;IAAc,IAAA;IAAc,MAAA;IAAgB,OAAA;EAAA;EAAlE;EAET,WAAA;EAF+B;EAI/B,cAAA;AAAA;AAAA,cAGW,gBAAA;EAAA,QACS,KAAA;cAAA,KAAA,EAAO,aAAA;EAIrB,OAAA,CAAQ,GAAA,WAAc,OAAA,CAAQ,YAAA;EAK9B,QAAA,CAAS,GAAA,UAAa,KAAA,EAAO,YAAA,GAAe,OAAA;EAK5C,UAAA,CAAW,GAAA,WAAc,OAAA;EAkBzB,eAAA,CAAgB,EAAA,WAAa,OAAA,CAAQ,YAAA;EAMrC,gBAAA,CAAiB,EAAA,UAAY,KAAA,EAAO,YAAA,GAAe,OAAA;EAYnD,kBAAA,CAAmB,EAAA,WAAa,OAAA;EA9CF;EAoD9B,aAAA,CAAA,GAAiB,OAAA,CAAQ,KAAA;IAAQ,EAAA;IAAY,KAAA,EAAO,YAAA;EAAA;EAgCpD,IAAA,CAAK,OAAA;IACT,IAAA;EAAA,IACE,OAAA,CAAQ,KAAA;IAAQ,GAAA;IAAa,KAAA,EAAO,YAAA;IAAc,SAAA;IAAoB,SAAA;EAAA;EAAlC;EAAA,QAc1B,mBAAA;EAdV;EAAA,QA6CU,cAAA;EA6Ce;EAAA,QAxBf,aAAA;EAwBR,WAAA,CAAA,GAAe,OAAA,CAAQ,KAAA;IAAQ,MAAA;IAAgB,KAAA,EAAO,kBAAA;EAAA;EAwGK;EAAA,QAhGnD,qBAAA;EAkHyC;EAAA,QA/FzC,oBAAA;EAsBR,aAAA,CAAc,MAAA,WAAiB,OAAA,CAAQ,kBAAA;EArOzB;;;;;;;;;;;EAqPd,uBAAA,CACJ,IAAA,WACC,OAAA;IACG,MAAA;IAAoB,KAAA;IAAe,IAAA;EAAA;IACnC,MAAA;IAAkB,KAAA;IAAe,IAAA;IAAc,GAAA;EAAA;EAmC/C,cAAA,CAAe,MAAA,UAAgB,KAAA,EAAO,kBAAA,GAAqB,OAAA;EAK3D,gBAAA,CAAiB,MAAA,WAAiB,OAAA;EA3PL;;;;;;;;EAwQ7B,kBAAA,CAAmB,KAAA,UAAe,IAAA,WAAe,OAAA;AAAA"}
@@ -0,0 +1,260 @@
1
+ import { validateId } from "./did-utils.mjs";
2
+ import { AFSAlreadyExistsError } from "@aigne/afs";
3
+
4
+ //#region src/resolve.ts
5
+ var DIDSpaceResolver = class {
6
+ constructor(store) {
7
+ this.store = store;
8
+ }
9
+ async resolve(did) {
10
+ const raw = await this.store.get(`resolve/${did}`);
11
+ return raw ? JSON.parse(raw) : null;
12
+ }
13
+ async register(did, entry) {
14
+ validateId(did);
15
+ await this.store.put(`resolve/${did}`, JSON.stringify(entry));
16
+ }
17
+ async unregister(did) {
18
+ validateId(did);
19
+ await this.store.delete(`resolve/${did}`);
20
+ }
21
+ async resolveBlocklet(id) {
22
+ validateId(id);
23
+ const raw = await this.store.get(`resolve/blocklet/${id}`);
24
+ return raw ? JSON.parse(raw) : null;
25
+ }
26
+ async registerBlocklet(id, entry) {
27
+ validateId(id);
28
+ const existing = await this.resolveBlocklet(id);
29
+ if (existing && existing.owner !== entry.owner) throw new AFSAlreadyExistsError(id, `blocklet "${id}" is already registered to a different owner`);
30
+ await this.store.put(`resolve/blocklet/${id}`, JSON.stringify(entry));
31
+ }
32
+ async unregisterBlocklet(id) {
33
+ validateId(id);
34
+ await this.store.delete(`resolve/blocklet/${id}`);
35
+ }
36
+ /** List all registered blocklets (`resolve/blocklet/*`). */
37
+ async listBlocklets() {
38
+ const out = [];
39
+ if (this.store.listWithValues) {
40
+ const result$1 = await this.store.listWithValues({ prefix: "resolve/blocklet/" });
41
+ for (const { key, value } of result$1.entries) {
42
+ let entry;
43
+ try {
44
+ entry = JSON.parse(value);
45
+ } catch {
46
+ continue;
47
+ }
48
+ out.push({
49
+ id: key.slice(17),
50
+ entry
51
+ });
52
+ }
53
+ return out;
54
+ }
55
+ const result = await this.store.list({ prefix: "resolve/blocklet/" });
56
+ for (const { name } of result.keys) {
57
+ const raw = await this.store.get(name);
58
+ if (!raw) continue;
59
+ let entry;
60
+ try {
61
+ entry = JSON.parse(raw);
62
+ } catch {
63
+ continue;
64
+ }
65
+ out.push({
66
+ id: name.slice(17),
67
+ entry
68
+ });
69
+ }
70
+ return out;
71
+ }
72
+ async list(options) {
73
+ if ("listWithTimestamps" in this.store && typeof this.store.listWithTimestamps === "function") return this._listWithTimestamps(options);
74
+ if (this.store.listWithValues) return this._listOptimized(options);
75
+ return this._listFallback(options);
76
+ }
77
+ /** Optimized: single query with timestamps via D1ResolveStore.listWithTimestamps */
78
+ async _listWithTimestamps(options) {
79
+ const result = await this.store.listWithTimestamps({ prefix: "resolve/" });
80
+ const entries = [];
81
+ for (const { key, value, created_at, updated_at } of result.entries) {
82
+ if (key.startsWith("resolve/domain/") || key.startsWith("resolve/blocklet/")) continue;
83
+ let entry;
84
+ try {
85
+ entry = JSON.parse(value);
86
+ } catch {
87
+ continue;
88
+ }
89
+ if (options?.type !== void 0 && entry.type !== options.type) continue;
90
+ const did = key.slice(8);
91
+ entries.push({
92
+ did,
93
+ entry,
94
+ createdAt: created_at ?? void 0,
95
+ updatedAt: updated_at ?? void 0
96
+ });
97
+ }
98
+ return entries;
99
+ }
100
+ /** Optimized: single query via listWithValues (no N+1) */
101
+ async _listOptimized(options) {
102
+ const result = await this.store.listWithValues({ prefix: "resolve/" });
103
+ const entries = [];
104
+ for (const { key, value } of result.entries) {
105
+ if (key.startsWith("resolve/domain/") || key.startsWith("resolve/blocklet/")) continue;
106
+ let entry;
107
+ try {
108
+ entry = JSON.parse(value);
109
+ } catch {
110
+ continue;
111
+ }
112
+ if (options?.type !== void 0 && entry.type !== options.type) continue;
113
+ const did = key.slice(8);
114
+ entries.push({
115
+ did,
116
+ entry
117
+ });
118
+ }
119
+ return entries;
120
+ }
121
+ /** Fallback: N+1 queries (list keys, then get each value) */
122
+ async _listFallback(options) {
123
+ const result = await this.store.list({ prefix: "resolve/" });
124
+ const entries = [];
125
+ for (const { name } of result.keys) {
126
+ if (name.startsWith("resolve/domain/") || name.startsWith("resolve/blocklet/")) continue;
127
+ const raw = await this.store.get(name);
128
+ if (!raw) continue;
129
+ let entry;
130
+ try {
131
+ entry = JSON.parse(raw);
132
+ } catch {
133
+ continue;
134
+ }
135
+ if (options?.type !== void 0 && entry.type !== options.type) continue;
136
+ const did = name.slice(8);
137
+ entries.push({
138
+ did,
139
+ entry
140
+ });
141
+ }
142
+ return entries;
143
+ }
144
+ async listDomains() {
145
+ if (this.store.listWithValues) return this._listDomainsOptimized();
146
+ return this._listDomainsFallback();
147
+ }
148
+ /** Optimized: single query via listWithValues */
149
+ async _listDomainsOptimized() {
150
+ const result = await this.store.listWithValues({ prefix: "resolve/domain/" });
151
+ const entries = [];
152
+ for (const { key, value } of result.entries) {
153
+ let entry;
154
+ try {
155
+ entry = JSON.parse(value);
156
+ } catch {
157
+ continue;
158
+ }
159
+ const domain = key.slice(15);
160
+ entries.push({
161
+ domain,
162
+ entry
163
+ });
164
+ }
165
+ return entries;
166
+ }
167
+ /** Fallback: N+1 queries */
168
+ async _listDomainsFallback() {
169
+ const result = await this.store.list({ prefix: "resolve/domain/" });
170
+ const entries = [];
171
+ for (const { name } of result.keys) {
172
+ const raw = await this.store.get(name);
173
+ if (!raw) continue;
174
+ let entry;
175
+ try {
176
+ entry = JSON.parse(raw);
177
+ } catch {
178
+ continue;
179
+ }
180
+ const domain = name.slice(15);
181
+ entries.push({
182
+ domain,
183
+ entry
184
+ });
185
+ }
186
+ return entries;
187
+ }
188
+ async resolveDomain(domain) {
189
+ const raw = await this.store.get(`resolve/domain/${domain}`);
190
+ return raw ? JSON.parse(raw) : null;
191
+ }
192
+ /**
193
+ * Serve-path host resolution (issue #808): fetch `resolve/blocklet/<name>` and
194
+ * `resolve/domain/<name>` in ONE store round trip (D1 `IN(...)`) instead of the
195
+ * sequential `resolveBlocklet` → `resolveDomain` ladder. Blocklet wins (id
196
+ * key), falling back to the domain entry — identical priority, one fewer round
197
+ * trip. For a brand-domain host (the prod model), the id key always misses and
198
+ * the domain key hits, so this saves the domain lookup's whole round trip on
199
+ * EVERY request. Degrades to two concurrent `get()`s when the store can't
200
+ * batch. `validateId` mirrors `resolveBlocklet` (the sequential ladder runs it
201
+ * first, so an invalid id resolves to null there too — never reaching domain).
202
+ */
203
+ async resolveBlockletOrDomain(name) {
204
+ try {
205
+ validateId(name);
206
+ } catch {
207
+ return null;
208
+ }
209
+ const blockletKey = `resolve/blocklet/${name}`;
210
+ const domainKey = `resolve/domain/${name}`;
211
+ let blockletRaw;
212
+ let domainRaw;
213
+ if (this.store.getMany) {
214
+ const map = await this.store.getMany([blockletKey, domainKey]);
215
+ blockletRaw = map.get(blockletKey) ?? null;
216
+ domainRaw = map.get(domainKey) ?? null;
217
+ } else [blockletRaw, domainRaw] = await Promise.all([this.store.get(blockletKey), this.store.get(domainKey)]);
218
+ if (blockletRaw) {
219
+ const entry = JSON.parse(blockletRaw);
220
+ if (entry?.owner) return {
221
+ source: "blocklet",
222
+ owner: entry.owner,
223
+ path: entry.path ?? ""
224
+ };
225
+ }
226
+ if (domainRaw) {
227
+ const entry = JSON.parse(domainRaw);
228
+ if (entry?.owner) return {
229
+ source: "domain",
230
+ owner: entry.owner,
231
+ path: entry.path ?? "",
232
+ did: entry.did
233
+ };
234
+ }
235
+ return null;
236
+ }
237
+ async registerDomain(domain, entry) {
238
+ validateId(domain);
239
+ await this.store.put(`resolve/domain/${domain}`, JSON.stringify(entry));
240
+ }
241
+ async unregisterDomain(domain) {
242
+ validateId(domain);
243
+ await this.store.delete(`resolve/domain/${domain}`);
244
+ }
245
+ /**
246
+ * Domains currently registered to this exact (owner, path) pair (#764 Phase
247
+ * 4a). Shared by the write hook's reconcile step (drop domains no longer in
248
+ * a redeploy's manifest) and the delete hook (drop all domains on unpublish)
249
+ * — same `listDomains()` + filter pattern `applyBlockletDeleteHook` already
250
+ * used inline for `resolve/blocklet/*`, factored out here since Phase 4
251
+ * needs it twice.
252
+ */
253
+ async domainsForBlocklet(owner, path) {
254
+ return (await this.listDomains()).filter(({ entry }) => entry.owner === owner && entry.path === path).map(({ domain }) => domain);
255
+ }
256
+ };
257
+
258
+ //#endregion
259
+ export { DIDSpaceResolver };
260
+ //# sourceMappingURL=resolve.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.mjs","names":["result"],"sources":["../src/resolve.ts"],"sourcesContent":["import { AFSAlreadyExistsError } from \"@aigne/afs\";\nimport type { KeyValueStore } from \"@aigne/afs-kv\";\nimport { validateId } from \"./did-utils.js\";\n\nexport interface ResolveEntry {\n owner: string;\n path: string;\n type?: string;\n name?: string;\n routes?: Array<{ name: string; site: string; path: string; source: string; handler: string }>;\n /** Whether this blocklet has pre-rendered .web-cache/ content. Set at publish time. */\n hasWebCache?: boolean;\n /** Monotonic timestamp (Date.now()) set by CLI at publish time. Used by DO cache invalidation. */\n publishVersion?: number;\n}\n\nexport interface DomainResolveEntry {\n did: string;\n owner: string;\n path: string;\n blockletDid?: string;\n blockletOwner?: string;\n blockletPath?: string;\n /** Materialized from blocklet ResolveEntry at publish/bind time. */\n routes?: Array<{ name: string; site: string; path: string; source: string; handler: string }>;\n /** Materialized from blocklet ResolveEntry at publish/bind time. */\n hasWebCache?: boolean;\n /** Materialized from blocklet ResolveEntry at publish/bind time. Used by DO cache invalidation. */\n publishVersion?: number;\n}\n\nexport class DIDSpaceResolver {\n constructor(private store: KeyValueStore) {}\n\n // ── DID resolve ──\n\n async resolve(did: string): Promise<ResolveEntry | null> {\n const raw = await this.store.get(`resolve/${did}`);\n return raw ? JSON.parse(raw) : null;\n }\n\n async register(did: string, entry: ResolveEntry): Promise<void> {\n validateId(did);\n await this.store.put(`resolve/${did}`, JSON.stringify(entry));\n }\n\n async unregister(did: string): Promise<void> {\n validateId(did);\n await this.store.delete(`resolve/${did}`);\n }\n\n // ── Blocklet resolve (#674) ──\n //\n // A separate `resolve/blocklet/<id>` key namespace (parallel to\n // `resolve/domain/`) maps a blocklet's manifest id (`blocklet.yaml#id`,\n // globally unique) → its published location `{ owner, path }`. The CF serve\n // path reads this to reconstruct the owner space and read the blocklet's\n // files. Registration is driven by the blocklet write-hook (blocklet-hook.ts)\n // on `blocklet.yaml` writes — never a REST endpoint. `id` is validated with\n // the same rules as a DID id (no slashes / traversal), so the composed key\n // `resolve/blocklet/<id>` is always a single safe path segment under the\n // prefix. These entries are EXCLUDED from the generic `list()` above (like\n // domains) so website/blocklet namespaces never cross-contaminate.\n\n async resolveBlocklet(id: string): Promise<ResolveEntry | null> {\n validateId(id);\n const raw = await this.store.get(`resolve/blocklet/${id}`);\n return raw ? JSON.parse(raw) : null;\n }\n\n async registerBlocklet(id: string, entry: ResolveEntry): Promise<void> {\n validateId(id);\n const existing = await this.resolveBlocklet(id);\n if (existing && existing.owner !== entry.owner) {\n throw new AFSAlreadyExistsError(\n id,\n `blocklet \"${id}\" is already registered to a different owner`,\n );\n }\n await this.store.put(`resolve/blocklet/${id}`, JSON.stringify(entry));\n }\n\n async unregisterBlocklet(id: string): Promise<void> {\n validateId(id);\n await this.store.delete(`resolve/blocklet/${id}`);\n }\n\n /** List all registered blocklets (`resolve/blocklet/*`). */\n async listBlocklets(): Promise<Array<{ id: string; entry: ResolveEntry }>> {\n const out: Array<{ id: string; entry: ResolveEntry }> = [];\n if (this.store.listWithValues) {\n const result = await this.store.listWithValues({ prefix: \"resolve/blocklet/\" });\n for (const { key, value } of result.entries) {\n let entry: ResolveEntry;\n try {\n entry = JSON.parse(value);\n } catch {\n continue;\n }\n out.push({ id: key.slice(\"resolve/blocklet/\".length), entry });\n }\n return out;\n }\n const result = await this.store.list({ prefix: \"resolve/blocklet/\" });\n for (const { name } of result.keys) {\n const raw = await this.store.get(name);\n if (!raw) continue;\n let entry: ResolveEntry;\n try {\n entry = JSON.parse(raw);\n } catch {\n continue;\n }\n out.push({ id: name.slice(\"resolve/blocklet/\".length), entry });\n }\n return out;\n }\n\n // ── List resolve entries ──\n\n async list(options?: {\n type?: string;\n }): Promise<Array<{ did: string; entry: ResolveEntry; createdAt?: number; updatedAt?: number }>> {\n if (\n \"listWithTimestamps\" in this.store &&\n typeof (this.store as any).listWithTimestamps === \"function\"\n ) {\n return this._listWithTimestamps(options);\n }\n if (this.store.listWithValues) {\n return this._listOptimized(options);\n }\n return this._listFallback(options);\n }\n\n /** Optimized: single query with timestamps via D1ResolveStore.listWithTimestamps */\n private async _listWithTimestamps(options?: {\n type?: string;\n }): Promise<Array<{ did: string; entry: ResolveEntry; createdAt?: number; updatedAt?: number }>> {\n const result = await (this.store as any).listWithTimestamps({ prefix: \"resolve/\" });\n const entries: Array<{\n did: string;\n entry: ResolveEntry;\n createdAt?: number;\n updatedAt?: number;\n }> = [];\n for (const { key, value, created_at, updated_at } of result.entries) {\n if (key.startsWith(\"resolve/domain/\") || key.startsWith(\"resolve/blocklet/\")) continue;\n let entry: ResolveEntry;\n try {\n entry = JSON.parse(value);\n } catch {\n continue; // skip corrupted entries\n }\n if (options?.type !== undefined && entry.type !== options.type) continue;\n const did = key.slice(\"resolve/\".length);\n entries.push({\n did,\n entry,\n createdAt: created_at ?? undefined,\n updatedAt: updated_at ?? undefined,\n });\n }\n return entries;\n }\n\n /** Optimized: single query via listWithValues (no N+1) */\n private async _listOptimized(options?: {\n type?: string;\n }): Promise<Array<{ did: string; entry: ResolveEntry }>> {\n const result = await this.store.listWithValues!({ prefix: \"resolve/\" });\n const entries: Array<{ did: string; entry: ResolveEntry }> = [];\n for (const { key, value } of result.entries) {\n if (key.startsWith(\"resolve/domain/\") || key.startsWith(\"resolve/blocklet/\")) continue;\n let entry: ResolveEntry;\n try {\n entry = JSON.parse(value);\n } catch {\n continue; // skip corrupted entries\n }\n if (options?.type !== undefined && entry.type !== options.type) continue;\n const did = key.slice(\"resolve/\".length);\n entries.push({ did, entry });\n }\n return entries;\n }\n\n /** Fallback: N+1 queries (list keys, then get each value) */\n private async _listFallback(options?: {\n type?: string;\n }): Promise<Array<{ did: string; entry: ResolveEntry }>> {\n const result = await this.store.list({ prefix: \"resolve/\" });\n const entries: Array<{ did: string; entry: ResolveEntry }> = [];\n for (const { name } of result.keys) {\n if (name.startsWith(\"resolve/domain/\") || name.startsWith(\"resolve/blocklet/\")) continue;\n const raw = await this.store.get(name);\n if (!raw) continue;\n let entry: ResolveEntry;\n try {\n entry = JSON.parse(raw);\n } catch {\n continue; // skip corrupted entries\n }\n if (options?.type !== undefined && entry.type !== options.type) continue;\n const did = name.slice(\"resolve/\".length);\n entries.push({ did, entry });\n }\n return entries;\n }\n\n // ── List domain entries ──\n\n async listDomains(): Promise<Array<{ domain: string; entry: DomainResolveEntry }>> {\n if (this.store.listWithValues) {\n return this._listDomainsOptimized();\n }\n return this._listDomainsFallback();\n }\n\n /** Optimized: single query via listWithValues */\n private async _listDomainsOptimized(): Promise<\n Array<{ domain: string; entry: DomainResolveEntry }>\n > {\n const result = await this.store.listWithValues!({ prefix: \"resolve/domain/\" });\n const entries: Array<{ domain: string; entry: DomainResolveEntry }> = [];\n for (const { key, value } of result.entries) {\n let entry: DomainResolveEntry;\n try {\n entry = JSON.parse(value);\n } catch {\n continue; // skip corrupted entries\n }\n const domain = key.slice(\"resolve/domain/\".length);\n entries.push({ domain, entry });\n }\n return entries;\n }\n\n /** Fallback: N+1 queries */\n private async _listDomainsFallback(): Promise<\n Array<{ domain: string; entry: DomainResolveEntry }>\n > {\n const result = await this.store.list({ prefix: \"resolve/domain/\" });\n const entries: Array<{ domain: string; entry: DomainResolveEntry }> = [];\n for (const { name } of result.keys) {\n const raw = await this.store.get(name);\n if (!raw) continue;\n let entry: DomainResolveEntry;\n try {\n entry = JSON.parse(raw);\n } catch {\n continue; // skip corrupted entries\n }\n const domain = name.slice(\"resolve/domain/\".length);\n entries.push({ domain, entry });\n }\n return entries;\n }\n\n // ── Domain resolve ──\n\n async resolveDomain(domain: string): Promise<DomainResolveEntry | null> {\n const raw = await this.store.get(`resolve/domain/${domain}`);\n return raw ? JSON.parse(raw) : null;\n }\n\n /**\n * Serve-path host resolution (issue #808): fetch `resolve/blocklet/<name>` and\n * `resolve/domain/<name>` in ONE store round trip (D1 `IN(...)`) instead of the\n * sequential `resolveBlocklet` → `resolveDomain` ladder. Blocklet wins (id\n * key), falling back to the domain entry — identical priority, one fewer round\n * trip. For a brand-domain host (the prod model), the id key always misses and\n * the domain key hits, so this saves the domain lookup's whole round trip on\n * EVERY request. Degrades to two concurrent `get()`s when the store can't\n * batch. `validateId` mirrors `resolveBlocklet` (the sequential ladder runs it\n * first, so an invalid id resolves to null there too — never reaching domain).\n */\n async resolveBlockletOrDomain(\n name: string,\n ): Promise<\n | { source: \"blocklet\"; owner: string; path: string }\n | { source: \"domain\"; owner: string; path: string; did: string }\n | null\n > {\n try {\n validateId(name);\n } catch {\n return null;\n }\n const blockletKey = `resolve/blocklet/${name}`;\n const domainKey = `resolve/domain/${name}`;\n let blockletRaw: string | null;\n let domainRaw: string | null;\n if (this.store.getMany) {\n const map = await this.store.getMany([blockletKey, domainKey]);\n blockletRaw = map.get(blockletKey) ?? null;\n domainRaw = map.get(domainKey) ?? null;\n } else {\n [blockletRaw, domainRaw] = await Promise.all([\n this.store.get(blockletKey),\n this.store.get(domainKey),\n ]);\n }\n if (blockletRaw) {\n const entry = JSON.parse(blockletRaw) as ResolveEntry;\n if (entry?.owner) return { source: \"blocklet\", owner: entry.owner, path: entry.path ?? \"\" };\n }\n if (domainRaw) {\n const entry = JSON.parse(domainRaw) as DomainResolveEntry;\n if (entry?.owner) {\n return { source: \"domain\", owner: entry.owner, path: entry.path ?? \"\", did: entry.did };\n }\n }\n return null;\n }\n\n async registerDomain(domain: string, entry: DomainResolveEntry): Promise<void> {\n validateId(domain);\n await this.store.put(`resolve/domain/${domain}`, JSON.stringify(entry));\n }\n\n async unregisterDomain(domain: string): Promise<void> {\n validateId(domain);\n await this.store.delete(`resolve/domain/${domain}`);\n }\n\n /**\n * Domains currently registered to this exact (owner, path) pair (#764 Phase\n * 4a). Shared by the write hook's reconcile step (drop domains no longer in\n * a redeploy's manifest) and the delete hook (drop all domains on unpublish)\n * — same `listDomains()` + filter pattern `applyBlockletDeleteHook` already\n * used inline for `resolve/blocklet/*`, factored out here since Phase 4\n * needs it twice.\n */\n async domainsForBlocklet(owner: string, path: string): Promise<string[]> {\n const all = await this.listDomains();\n return all\n .filter(({ entry }) => entry.owner === owner && entry.path === path)\n .map(({ domain }) => domain);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+
2
+ //#region src/rsync-content.ts
3
+ /**
4
+ * Shared content-decoding helpers for rsync + local metadata sync.
5
+ *
6
+ * AFSFS returns binary files as base64 strings with `meta.contentType = "base64"`.
7
+ * Both rsync (CID computation, transfer) and the Task 1.3 metadata subscriber
8
+ * need to normalize that to raw bytes.
9
+ */
10
+ /** Normalize AFS read content to a form accepted by computeCID (string | Uint8Array). */
11
+ function toBytes(content) {
12
+ if (content instanceof Uint8Array) return content;
13
+ if (content instanceof ArrayBuffer) return new Uint8Array(content);
14
+ return String(content);
15
+ }
16
+ /**
17
+ * Decode AFSFS base64-encoded binary content to raw bytes.
18
+ * AFSFS returns binary files as base64 string with meta.contentType = "base64".
19
+ * All rsync + metadata-sync operations (CID computation, transfer) must use
20
+ * raw bytes or the original UTF-8 string.
21
+ */
22
+ function resolveAFSContent(content, meta) {
23
+ if (typeof content === "string" && meta?.contentType === "base64") {
24
+ const binaryStr = atob(content);
25
+ const bytes = new Uint8Array(binaryStr.length);
26
+ for (let i = 0; i < binaryStr.length; i++) bytes[i] = binaryStr.charCodeAt(i);
27
+ return bytes;
28
+ }
29
+ return toBytes(content);
30
+ }
31
+
32
+ //#endregion
33
+ exports.resolveAFSContent = resolveAFSContent;
@@ -0,0 +1,33 @@
1
+ //#region src/rsync-content.ts
2
+ /**
3
+ * Shared content-decoding helpers for rsync + local metadata sync.
4
+ *
5
+ * AFSFS returns binary files as base64 strings with `meta.contentType = "base64"`.
6
+ * Both rsync (CID computation, transfer) and the Task 1.3 metadata subscriber
7
+ * need to normalize that to raw bytes.
8
+ */
9
+ /** Normalize AFS read content to a form accepted by computeCID (string | Uint8Array). */
10
+ function toBytes(content) {
11
+ if (content instanceof Uint8Array) return content;
12
+ if (content instanceof ArrayBuffer) return new Uint8Array(content);
13
+ return String(content);
14
+ }
15
+ /**
16
+ * Decode AFSFS base64-encoded binary content to raw bytes.
17
+ * AFSFS returns binary files as base64 string with meta.contentType = "base64".
18
+ * All rsync + metadata-sync operations (CID computation, transfer) must use
19
+ * raw bytes or the original UTF-8 string.
20
+ */
21
+ function resolveAFSContent(content, meta) {
22
+ if (typeof content === "string" && meta?.contentType === "base64") {
23
+ const binaryStr = atob(content);
24
+ const bytes = new Uint8Array(binaryStr.length);
25
+ for (let i = 0; i < binaryStr.length; i++) bytes[i] = binaryStr.charCodeAt(i);
26
+ return bytes;
27
+ }
28
+ return toBytes(content);
29
+ }
30
+
31
+ //#endregion
32
+ export { resolveAFSContent };
33
+ //# sourceMappingURL=rsync-content.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsync-content.mjs","names":[],"sources":["../src/rsync-content.ts"],"sourcesContent":["/**\n * Shared content-decoding helpers for rsync + local metadata sync.\n *\n * AFSFS returns binary files as base64 strings with `meta.contentType = \"base64\"`.\n * Both rsync (CID computation, transfer) and the Task 1.3 metadata subscriber\n * need to normalize that to raw bytes.\n */\n\n/** Normalize AFS read content to a form accepted by computeCID (string | Uint8Array). */\nexport function toBytes(content: unknown): string | Uint8Array {\n if (content instanceof Uint8Array) return content;\n if (content instanceof ArrayBuffer) return new Uint8Array(content);\n return String(content);\n}\n\n/**\n * Decode AFSFS base64-encoded binary content to raw bytes.\n * AFSFS returns binary files as base64 string with meta.contentType = \"base64\".\n * All rsync + metadata-sync operations (CID computation, transfer) must use\n * raw bytes or the original UTF-8 string.\n */\nexport function resolveAFSContent(\n content: unknown,\n meta?: Record<string, unknown> | null,\n): string | Uint8Array {\n if (typeof content === \"string\" && meta?.contentType === \"base64\") {\n const binaryStr = atob(content);\n const bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) bytes[i] = binaryStr.charCodeAt(i);\n return bytes;\n }\n return toBytes(content);\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,QAAQ,SAAuC;AAC7D,KAAI,mBAAmB,WAAY,QAAO;AAC1C,KAAI,mBAAmB,YAAa,QAAO,IAAI,WAAW,QAAQ;AAClE,QAAO,OAAO,QAAQ;;;;;;;;AASxB,SAAgB,kBACd,SACA,MACqB;AACrB,KAAI,OAAO,YAAY,YAAY,MAAM,gBAAgB,UAAU;EACjE,MAAM,YAAY,KAAK,QAAQ;EAC/B,MAAM,QAAQ,IAAI,WAAW,UAAU,OAAO;AAC9C,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,IAAK,OAAM,KAAK,UAAU,WAAW,EAAE;AAC7E,SAAO;;AAET,QAAO,QAAQ,QAAQ"}