@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,676 @@
1
+ import { computeCID } from "./cid.mjs";
2
+ import { isTextMime } from "./mime-utils.mjs";
3
+ import { AFSCompactedError, AFSConflictError, AFSNotFoundError, AFSValidationError } from "@aigne/afs";
4
+ import { encodePath, joinURL } from "ufo";
5
+
6
+ //#region src/remote-afs.ts
7
+ /**
8
+ * Loopback hosts that may be served over plain http (no HTTPS requirement).
9
+ * Covers `localhost`, the reserved `*.localhost` subdomains (RFC 6761 — always
10
+ * loopback, e.g. `aside.localhost:8787` for local multi-app dev where the
11
+ * subdomain selects the blocklet), and the IPv4/IPv6 loopback literals.
12
+ */
13
+ function isLoopbackHost(hostname) {
14
+ const h = hostname.toLowerCase().replace(/^\[|\]$/g, "");
15
+ return h === "localhost" || h.endsWith(".localhost") || h === "127.0.0.1" || h === "::1";
16
+ }
17
+ var RemoteUserSpaceAFS = class {
18
+ name = "remote-user-space";
19
+ baseUrl;
20
+ token;
21
+ constructor(options) {
22
+ const url = new URL(options.baseUrl);
23
+ if (url.protocol !== "https:" && !isLoopbackHost(url.hostname)) throw new Error(`HTTPS required for remote connections (got ${url.protocol}//${url.hostname})`);
24
+ this.baseUrl = options.baseUrl;
25
+ this.token = options.token;
26
+ }
27
+ apiUrl(path, params) {
28
+ const url = joinURL(this.baseUrl, "/api/space/", encodePath(path));
29
+ if (!params) return url;
30
+ return `${url}?${new URLSearchParams(params).toString()}`;
31
+ }
32
+ headers() {
33
+ return { Authorization: `Bearer ${this.token}` };
34
+ }
35
+ async handleResponse(res, path) {
36
+ if (res.ok) return res.json();
37
+ if (res.status === 404) throw new AFSNotFoundError(path);
38
+ if (res.status === 401) throw new Error("Authentication failed: check your access token");
39
+ if (res.status === 409) await this.handle409(res, path);
40
+ const errorMsg = await this.parseErrorBody(res);
41
+ throw new Error(`Remote AFS error at ${path}: ${errorMsg}`);
42
+ }
43
+ /**
44
+ * Parse a 409 response body and throw the appropriate AFS error:
45
+ * - `{ error: "if_match_failed", currentCid, currentMtime, currentDeviceId }` → AFSConflictError
46
+ * - `{ requireFullResync: true, compactedBelowSeq }` → AFSCompactedError
47
+ * - Otherwise → generic error
48
+ */
49
+ async handle409(res, path) {
50
+ let body;
51
+ try {
52
+ body = await res.json();
53
+ } catch {
54
+ throw new Error(`Remote AFS 409 at ${path}`);
55
+ }
56
+ if (body.requireFullResync === true) {
57
+ const seq = typeof body.compactedBelowSeq === "number" ? body.compactedBelowSeq : 0;
58
+ throw new AFSCompactedError(path, String(seq));
59
+ }
60
+ if (body.code === "AFS_CONFLICT" || body.error === "if_match_failed" || "currentCid" in body) throw new AFSConflictError(path, {
61
+ cid: typeof body.currentCid === "string" ? body.currentCid : null,
62
+ mtime: typeof body.currentMtime === "number" ? body.currentMtime : null,
63
+ deviceId: typeof body.currentDeviceId === "string" ? body.currentDeviceId : null
64
+ });
65
+ throw new Error(`Remote AFS 409 at ${path}: ${JSON.stringify(body)}`);
66
+ }
67
+ async parseErrorBody(res) {
68
+ try {
69
+ return (await res.json()).error || `HTTP ${res.status}`;
70
+ } catch {
71
+ return `HTTP ${res.status}`;
72
+ }
73
+ }
74
+ async list(path, options) {
75
+ const params = { op: "list" };
76
+ const normPath = path.startsWith("/") ? path.slice(1) : path;
77
+ const isChangelog = normPath === ".changelog" || normPath.startsWith(".changelog/");
78
+ if (options?.maxDepth === -1) {
79
+ if (isChangelog) throw new AFSValidationError(".changelog path does not support maxDepth=-1 (changelog uses cursor-based incremental access)");
80
+ if (options.limit !== void 0 && Number.isFinite(options.limit) || options.offset !== void 0 && Number.isFinite(options.offset) || options.cursor !== void 0) throw new AFSValidationError("list with maxDepth=-1 cannot be combined with cursor, limit, or offset");
81
+ }
82
+ if (options?.maxDepth !== void 0) params.maxDepth = String(options.maxDepth);
83
+ if (isChangelog && options?.cursor !== void 0) params.cursor = String(options.cursor);
84
+ if (!isChangelog) {
85
+ if (options?.limit !== void 0 && Number.isFinite(options.limit)) params.limit = String(options.limit);
86
+ if (options?.offset !== void 0 && Number.isFinite(options.offset)) params.offset = String(options.offset);
87
+ }
88
+ const res = await fetch(this.apiUrl(path, params), { headers: this.headers() });
89
+ return this.handleResponse(res, path);
90
+ }
91
+ async read(path) {
92
+ const normPath = path.startsWith("/") ? path.slice(1) : path;
93
+ if (normPath.startsWith(".objects/")) return this.readObject(path, normPath);
94
+ const res = await fetch(this.apiUrl(path), { headers: this.headers() });
95
+ if (!res.ok) return this.handleResponse(res, path);
96
+ const contentType = res.headers.get("Content-Type") || "";
97
+ if (!res.headers.has("X-AFS-Kind") && contentType.includes("application/json")) return res.json();
98
+ const meta = {};
99
+ const kind = res.headers.get("X-AFS-Kind");
100
+ const cid = res.headers.get("X-AFS-CID");
101
+ const size = res.headers.get("X-AFS-Size");
102
+ const mimeType = res.headers.get("X-AFS-MimeType");
103
+ const childrenCount = res.headers.get("X-AFS-ChildrenCount");
104
+ meta.kind = kind || "did-space:file";
105
+ if (cid) meta.cid = cid;
106
+ if (size) meta.size = Number(size);
107
+ if (mimeType) meta.mimeType = mimeType;
108
+ if (childrenCount != null) meta.childrenCount = Number(childrenCount);
109
+ const content = isTextMime(mimeType || (contentType.split(";")[0] ?? "").trim() || void 0) ? await res.text() : await res.arrayBuffer();
110
+ const createdAt = res.headers.get("X-AFS-CreatedAt");
111
+ const updatedAt = res.headers.get("X-AFS-UpdatedAt");
112
+ return { data: {
113
+ id: path,
114
+ path,
115
+ content,
116
+ meta,
117
+ createdAt: createdAt ? new Date(createdAt) : void 0,
118
+ updatedAt: updatedAt ? new Date(updatedAt) : void 0
119
+ } };
120
+ }
121
+ /**
122
+ * Task 1.3: read a content-addressed object by path `.objects/{cid}`.
123
+ * Calls `GET /api/space/.objects/{cid}`, reads raw bytes, then recomputes
124
+ * the CID to verify integrity before returning.
125
+ */
126
+ async readObject(path, normPath) {
127
+ const requestedCid = normPath.slice(9);
128
+ const res = await fetch(this.apiUrl(path), { headers: this.headers() });
129
+ if (!res.ok) return this.handleResponse(res, path);
130
+ const ab = await res.arrayBuffer();
131
+ const bytes = new Uint8Array(ab);
132
+ const actualCid = await computeCID(bytes);
133
+ if (actualCid !== requestedCid) throw new Error(`read .objects: CID mismatch (requested ${requestedCid}, got ${actualCid})`);
134
+ return { data: {
135
+ id: path,
136
+ path,
137
+ content: bytes,
138
+ meta: {
139
+ kind: "did-space:object",
140
+ cid: requestedCid,
141
+ size: bytes.length
142
+ }
143
+ } };
144
+ }
145
+ async write(path, payload) {
146
+ const content = payload.content;
147
+ const extra = payload.meta?.extra;
148
+ const extraHeaders = {};
149
+ if (extra) {
150
+ if (typeof extra.contentCid === "string") extraHeaders["X-Content-CID"] = extra.contentCid;
151
+ if (typeof extra.deviceId === "string") extraHeaders["X-Device-Id"] = extra.deviceId;
152
+ if (typeof extra.mtime === "number") extraHeaders["X-Mtime"] = String(extra.mtime);
153
+ if (typeof extra.ifMatch === "string") extraHeaders["If-Match"] = extra.ifMatch;
154
+ }
155
+ if (content instanceof ArrayBuffer || content instanceof Uint8Array) {
156
+ const body$1 = content instanceof Uint8Array ? content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength) : content;
157
+ const res$1 = await fetch(this.apiUrl(path), {
158
+ method: "PUT",
159
+ headers: {
160
+ ...this.headers(),
161
+ "Content-Type": "application/octet-stream",
162
+ ...extraHeaders
163
+ },
164
+ body: body$1
165
+ });
166
+ return this.handleResponse(res$1, path);
167
+ }
168
+ const isString = typeof content === "string";
169
+ const body = isString ? content : JSON.stringify(content);
170
+ const mimeType = isString ? "text/plain" : "application/json";
171
+ const res = await fetch(this.apiUrl(path), {
172
+ method: "PUT",
173
+ headers: {
174
+ ...this.headers(),
175
+ "Content-Type": mimeType,
176
+ ...extraHeaders
177
+ },
178
+ body
179
+ });
180
+ return this.handleResponse(res, path);
181
+ }
182
+ async delete(path, opts) {
183
+ const meta = opts?.meta;
184
+ const extraHeaders = {};
185
+ if (meta) {
186
+ if (typeof meta.deviceId === "string") extraHeaders["X-Device-Id"] = meta.deviceId;
187
+ if (typeof meta.mtime === "number") extraHeaders["X-Mtime"] = String(meta.mtime);
188
+ if (typeof meta.ifMatch === "string") extraHeaders["If-Match"] = meta.ifMatch;
189
+ }
190
+ const res = await fetch(this.apiUrl(path), {
191
+ method: "DELETE",
192
+ headers: {
193
+ ...this.headers(),
194
+ ...extraHeaders
195
+ }
196
+ });
197
+ return this.handleResponse(res, path);
198
+ }
199
+ };
200
+ /** Thrown when the server does not support the batch wire ops (old daemon). */
201
+ var BatchUnsupportedError = class extends Error {
202
+ constructor() {
203
+ super("server does not support batch wire ops");
204
+ this.name = "BatchUnsupportedError";
205
+ }
206
+ };
207
+ /**
208
+ * Envelope-level BATCH_OVER_BUDGET / PAYLOAD_TOO_LARGE — zero entries
209
+ * executed; the engine halves the chunk and retries (design §7.3). MUST NOT
210
+ * trip the capability-fallback memory.
211
+ */
212
+ var BatchOverBudgetError = class extends Error {
213
+ constructor(message) {
214
+ super(message);
215
+ this.name = "BatchOverBudgetError";
216
+ }
217
+ };
218
+ /**
219
+ * SyncCloudAFS over the afs-rpc wire (`POST /api/afs/rpc`) — the transport
220
+ * the production daemon/worker actually serve (the legacy `/api/space` REST
221
+ * server is gone; `RemoteUserSpaceAFS` above survives only for the
222
+ * export/import CLI against legacy hosts).
223
+ *
224
+ * Sync paths are fragment-root-relative; the wire allowlist admits only
225
+ * `/user/**` mutations, so every path is mapped through `/user` on the way
226
+ * out and stripped on the way back.
227
+ *
228
+ * Batch (P4): `batchWrite`/`batchDelete`/`batchRead` send one wire envelope
229
+ * each (wire-contract §9) and restore per-entry results to the single-op
230
+ * error types (`AFSConflictError` with the triple, `BATCH_TAIL_SKIPPED`
231
+ * passthrough). Capability fallback: the FIRST envelope answered with the
232
+ * old server's exact `Unsupported op 'batch…'` 400 marks this INSTANCE as
233
+ * batch-unsupported (`supportsBatch === false`) and throws
234
+ * {@link BatchUnsupportedError}; the engine then stays on the single-op
235
+ * path for the rest of the instance's life. Any other 400 (e.g.
236
+ * BATCH_OVER_BUDGET) does NOT trip the memory.
237
+ */
238
+ var RpcUserSpaceAFS = class {
239
+ name = "rpc-user-space";
240
+ baseUrl;
241
+ token;
242
+ blocklet;
243
+ sessionId;
244
+ extraHeaders;
245
+ /** null = unknown (no batch envelope sent yet); set on first evidence. */
246
+ batchSupported = null;
247
+ constructor(options) {
248
+ const url = new URL(options.baseUrl);
249
+ if (url.protocol !== "https:" && !isLoopbackHost(url.hostname)) throw new Error(`HTTPS required for remote connections (got ${url.protocol}//${url.hostname})`);
250
+ this.baseUrl = options.baseUrl;
251
+ this.token = options.token;
252
+ this.blocklet = options.blocklet;
253
+ this.sessionId = options.sessionId;
254
+ this.extraHeaders = options.extraHeaders ?? {};
255
+ }
256
+ /** Instance-scoped capability memory (per-server, design §7.1). */
257
+ get supportsBatch() {
258
+ return this.batchSupported;
259
+ }
260
+ wirePath(path) {
261
+ const p = path.startsWith("/") ? path : `/${path}`;
262
+ return `/user${p === "/" ? "" : p}`;
263
+ }
264
+ stripUser(path) {
265
+ return path.startsWith("/user/") ? path.slice(5) : path;
266
+ }
267
+ async rpc(body) {
268
+ const res = await fetch(joinURL(this.baseUrl, "/api/afs/rpc"), {
269
+ method: "POST",
270
+ headers: {
271
+ "content-type": "application/json",
272
+ Authorization: `Bearer ${this.token}`,
273
+ ...this.extraHeaders
274
+ },
275
+ body: JSON.stringify({
276
+ blocklet: this.blocklet,
277
+ ...this.sessionId ? { sessionId: this.sessionId } : {},
278
+ ...body
279
+ })
280
+ });
281
+ let json;
282
+ try {
283
+ json = await res.json();
284
+ } catch {
285
+ json = {
286
+ ok: false,
287
+ error: `non-JSON response (HTTP ${res.status})`
288
+ };
289
+ }
290
+ return {
291
+ status: res.status,
292
+ json
293
+ };
294
+ }
295
+ /** Map a non-OK single-op wire response onto the AFS error types. */
296
+ throwWireError(status, json, path) {
297
+ if (status === 404) throw new AFSNotFoundError(path);
298
+ if (status === 401) throw new Error("Authentication failed: check your access token");
299
+ if (status === 409) this.throwConflict(json, path);
300
+ if (json.requireFullResync === true) throw new AFSCompactedError(path, String(json.compactedBelowSeq ?? 0));
301
+ throw new Error(`afs-rpc error at ${path}: ${String(json.error ?? `HTTP ${status}`)}`);
302
+ }
303
+ /**
304
+ * 409 → AFSConflictError with the triple. Keyed on `code: "AFS_CONFLICT"`
305
+ * OR triple-field presence — NEVER the legacy `error === "if_match_failed"`
306
+ * string (the T4.1 存量 bug: the wire sends the stable code, see
307
+ * afs-rpc-wire.ts WIRE_ERROR_CODES.conflict; Swift's throwConflict already
308
+ * keys on the code).
309
+ */
310
+ throwConflict(json, path) {
311
+ if (json.code === "AFS_CONFLICT" || "currentCid" in json) throw new AFSConflictError(path, {
312
+ cid: typeof json.currentCid === "string" ? json.currentCid : null,
313
+ mtime: typeof json.currentMtime === "number" ? json.currentMtime : null,
314
+ deviceId: typeof json.currentDeviceId === "string" ? json.currentDeviceId : null
315
+ });
316
+ if (json.requireFullResync === true) throw new AFSCompactedError(path, String(json.compactedBelowSeq ?? 0));
317
+ throw new Error(`afs-rpc 409 at ${path}: ${JSON.stringify(json)}`);
318
+ }
319
+ async list(path, options) {
320
+ const opts = {};
321
+ if (options?.cursor !== void 0) opts.cursor = options.cursor;
322
+ if (options?.limit !== void 0 && Number.isFinite(options.limit)) opts.limit = options.limit;
323
+ if (options?.maxDepth !== void 0) opts.maxDepth = options.maxDepth;
324
+ const { status, json } = await this.rpc({
325
+ type: "list",
326
+ path: this.wirePath(path),
327
+ ...Object.keys(opts).length ? { options: opts } : {}
328
+ });
329
+ if (status !== 200 || json.ok !== true) this.throwWireError(status, json, path);
330
+ const data = json.data ?? [];
331
+ return {
332
+ data: data.map((e) => ({
333
+ ...e,
334
+ path: this.stripUser(String(e.path ?? ""))
335
+ })),
336
+ total: typeof json.total === "number" ? json.total : data.length,
337
+ meta: json.meta,
338
+ liveSeq: json.liveSeq
339
+ };
340
+ }
341
+ async read(path) {
342
+ const normPath = path.startsWith("/") ? path.slice(1) : path;
343
+ const isObject = normPath.startsWith(".objects/");
344
+ const { status, json } = await this.rpc({
345
+ type: "read",
346
+ path: this.wirePath(path)
347
+ });
348
+ if (status !== 200 || json.ok !== true) this.throwWireError(status, json, path);
349
+ const data = json.data ?? {};
350
+ let content = data.content;
351
+ if (data.encoding === "base64" && typeof content === "string") content = decodeBase64ToBytes(content);
352
+ if (isObject) {
353
+ const requestedCid = normPath.slice(9);
354
+ const bytes = content instanceof Uint8Array ? content : new TextEncoder().encode(String(content ?? ""));
355
+ const actualCid = await computeCID(bytes);
356
+ if (actualCid !== requestedCid) throw new Error(`read .objects: CID mismatch (requested ${requestedCid}, got ${actualCid})`);
357
+ content = bytes;
358
+ }
359
+ return { data: {
360
+ ...data,
361
+ path: this.stripUser(String(data.path ?? path)),
362
+ content
363
+ } };
364
+ }
365
+ async write(path, payload) {
366
+ const extra = payload.meta?.extra;
367
+ const content = payload.content;
368
+ const bytes = content instanceof Uint8Array ? content : content instanceof ArrayBuffer ? new Uint8Array(content) : new TextEncoder().encode(typeof content === "string" ? content : JSON.stringify(content));
369
+ const options = {};
370
+ const meta = {};
371
+ if (typeof extra?.deviceId === "string") meta.deviceId = extra.deviceId;
372
+ if (typeof extra?.mtime === "number") meta.mtime = extra.mtime;
373
+ if (Object.keys(meta).length) options.meta = meta;
374
+ if (typeof extra?.ifMatch === "string") options.ifMatch = extra.ifMatch;
375
+ const { extra: _extra, ...appMeta } = payload.meta ?? {};
376
+ const { status, json } = await this.rpc({
377
+ type: "write",
378
+ path: this.wirePath(path),
379
+ content: encodeBytesToBase64(bytes),
380
+ encoding: "base64",
381
+ ...appMeta && Object.keys(appMeta).length ? { meta: appMeta } : {},
382
+ ...Object.keys(options).length ? { options } : {}
383
+ });
384
+ if (status !== 200 || json.ok !== true) this.throwWireError(status, json, path);
385
+ return { data: json.data };
386
+ }
387
+ async delete(path, opts) {
388
+ const meta = opts?.meta;
389
+ const wireMeta = {};
390
+ if (typeof meta?.deviceId === "string") wireMeta.deviceId = meta.deviceId;
391
+ if (typeof meta?.mtime === "number") wireMeta.mtime = meta.mtime;
392
+ if (typeof meta?.ifMatch === "string") wireMeta.ifMatch = meta.ifMatch;
393
+ const { status, json } = await this.rpc({
394
+ type: "delete",
395
+ path: this.wirePath(path),
396
+ ...Object.keys(wireMeta).length ? { options: { meta: wireMeta } } : {}
397
+ });
398
+ if (status !== 200 || json.ok !== true) this.throwWireError(status, json, path);
399
+ return json.data;
400
+ }
401
+ /** Detect the old server's exact "unsupported batch op" 400 (design T4.2):
402
+ * ONLY this text trips the per-instance fallback memory. */
403
+ checkBatchUnsupported(status, json) {
404
+ if (status === 400 && typeof json.error === "string" && /Unsupported op 'batch/.test(json.error)) {
405
+ this.batchSupported = false;
406
+ throw new BatchUnsupportedError();
407
+ }
408
+ if (json.code === "BATCH_OVER_BUDGET" || json.code === "PAYLOAD_TOO_LARGE") throw new BatchOverBudgetError(String(json.error ?? json.code));
409
+ }
410
+ restoreBatchResults(rawResults, entryPaths) {
411
+ if (!Array.isArray(rawResults) || rawResults.length !== entryPaths.length) throw new Error(`afs-rpc batch: results length ${Array.isArray(rawResults) ? rawResults.length : "?"} != entries length ${entryPaths.length}`);
412
+ return rawResults.map((raw, i) => {
413
+ const r = raw ?? {};
414
+ const status = typeof r.status === "number" ? r.status : 500;
415
+ const ok = r.ok === true;
416
+ const out = {
417
+ path: entryPaths[i],
418
+ success: ok,
419
+ status
420
+ };
421
+ if (ok) {
422
+ out.data = r.data;
423
+ return out;
424
+ }
425
+ out.error = typeof r.error === "string" ? r.error : void 0;
426
+ out.code = typeof r.code === "string" ? r.code : void 0;
427
+ if (r.missing === true) out.missing = true;
428
+ if (status === 409 || out.code === "AFS_CONFLICT") out.conflict = {
429
+ currentCid: typeof r.currentCid === "string" ? r.currentCid : null,
430
+ currentMtime: typeof r.currentMtime === "number" ? r.currentMtime : null,
431
+ currentDeviceId: typeof r.currentDeviceId === "string" ? r.currentDeviceId : null
432
+ };
433
+ return out;
434
+ });
435
+ }
436
+ /**
437
+ * One wire envelope per call — entries in the CORE batch shape
438
+ * (`AFSBatchWriteEntry`: `content.content` bytes + `options.ifMatch` /
439
+ * `options.meta` provenance), paths fragment-relative.
440
+ */
441
+ async batchWrite(entries) {
442
+ const wireEntries = entries.map((e) => {
443
+ const payload = e.content?.content;
444
+ const bytes = payload instanceof Uint8Array ? payload : payload instanceof ArrayBuffer ? new Uint8Array(payload) : new TextEncoder().encode(typeof payload === "string" ? payload : JSON.stringify(payload ?? ""));
445
+ const options = e.options;
446
+ const meta = {};
447
+ if (typeof options?.meta?.deviceId === "string") meta.deviceId = options.meta.deviceId;
448
+ if (typeof options?.meta?.mtime === "number") meta.mtime = options.meta.mtime;
449
+ const wireOptions = {};
450
+ if (Object.keys(meta).length) wireOptions.meta = meta;
451
+ if (typeof options?.ifMatch === "string") wireOptions.ifMatch = options.ifMatch;
452
+ const appMeta = e.content?.meta;
453
+ return {
454
+ path: this.wirePath(e.path),
455
+ content: encodeBytesToBase64(bytes),
456
+ encoding: "base64",
457
+ ...appMeta && Object.keys(appMeta).length ? { meta: appMeta } : {},
458
+ ...Object.keys(wireOptions).length ? { options: wireOptions } : {}
459
+ };
460
+ });
461
+ const { status, json } = await this.rpc({
462
+ type: "batchWrite",
463
+ entries: wireEntries
464
+ });
465
+ this.checkBatchUnsupported(status, json);
466
+ if (status !== 200 || json.ok !== true) this.throwWireError(status, json, "batchWrite");
467
+ this.batchSupported = true;
468
+ return {
469
+ results: this.restoreBatchResults(json.results, entries.map((e) => e.path)),
470
+ succeeded: Number(json.succeeded ?? 0),
471
+ failed: Number(json.failed ?? 0)
472
+ };
473
+ }
474
+ /** Core-shaped delete entries (`options.meta.{ifMatch,deviceId,mtime}`). */
475
+ async batchDelete(entries) {
476
+ const wireEntries = entries.map((e) => {
477
+ const m = e.options?.meta;
478
+ const meta = {};
479
+ if (typeof m?.deviceId === "string") meta.deviceId = m.deviceId;
480
+ if (typeof m?.mtime === "number") meta.mtime = m.mtime;
481
+ if (typeof m?.ifMatch === "string") meta.ifMatch = m.ifMatch;
482
+ return {
483
+ path: this.wirePath(e.path),
484
+ ...Object.keys(meta).length ? { options: { meta } } : {}
485
+ };
486
+ });
487
+ const { status, json } = await this.rpc({
488
+ type: "batchDelete",
489
+ entries: wireEntries
490
+ });
491
+ this.checkBatchUnsupported(status, json);
492
+ if (status !== 200 || json.ok !== true) this.throwWireError(status, json, "batchDelete");
493
+ this.batchSupported = true;
494
+ return {
495
+ results: this.restoreBatchResults(json.results, entries.map((e) => e.path)),
496
+ succeeded: Number(json.succeeded ?? 0),
497
+ failed: Number(json.failed ?? 0)
498
+ };
499
+ }
500
+ /** Entries are absolute wire paths already (e.g. "/.objects/{cid}" reads). */
501
+ async batchRead(entries) {
502
+ const wireEntries = entries.map((e) => ({
503
+ path: this.wirePath(e.path),
504
+ ...e.optional ? { optional: true } : {}
505
+ }));
506
+ const { status, json } = await this.rpc({
507
+ type: "batchRead",
508
+ entries: wireEntries
509
+ });
510
+ this.checkBatchUnsupported(status, json);
511
+ if (status !== 200 || json.ok !== true) this.throwWireError(status, json, "batchRead");
512
+ this.batchSupported = true;
513
+ const results = this.restoreBatchResults(json.results, entries.map((e) => e.path));
514
+ for (const r of results) {
515
+ const content = r.data?.content;
516
+ if (r.data?.encoding === "base64" && typeof content === "string") r.data.content = decodeBase64ToBytes(content);
517
+ }
518
+ return {
519
+ results,
520
+ succeeded: Number(json.succeeded ?? 0),
521
+ failed: Number(json.failed ?? 0)
522
+ };
523
+ }
524
+ /**
525
+ * Probe whether the server's `/user` space advertises grant capability
526
+ * (P2 T2.5). Reads the `.actions` catalogue and checks the prepare-upload
527
+ * entry's `meta.grantCapability`. `false` on Node (fallback-only) or an old
528
+ * server with no upload actions → the engine stays on batchWrite.
529
+ */
530
+ async uploadGrantCapability() {
531
+ const { status, json } = await this.rpc({
532
+ type: "list",
533
+ path: this.wirePath("/.actions")
534
+ });
535
+ if (status !== 200 || json.ok !== true) return false;
536
+ return (json.data ?? []).find((e) => e.id === "prepare-upload")?.meta?.grantCapability === true;
537
+ }
538
+ /** Run a `/user/.actions/<name>` exec. Throws `BatchUnsupportedError` when the
539
+ * server lacks the action (old server) so the engine falls back. */
540
+ async execAction(name, args) {
541
+ const { status, json } = await this.rpc({
542
+ type: "exec",
543
+ path: this.wirePath(`/.actions/${name}`),
544
+ args
545
+ });
546
+ if (status === 404 || status === 501) throw new BatchUnsupportedError();
547
+ if (status !== 200 || json.ok !== true) throw new Error(`afs-rpc exec ${name} failed: ${String(json.error ?? json.message ?? status)}`);
548
+ return json.data ?? {};
549
+ }
550
+ async prepareUpload(entries) {
551
+ return await this.execAction("prepare-upload", {
552
+ entries,
553
+ strategy: "auto"
554
+ });
555
+ }
556
+ async commitUpload(sessionId, entries) {
557
+ const data = await this.execAction("commit-upload", {
558
+ sessionId,
559
+ entries
560
+ });
561
+ const results = (data.results ?? []).map((r) => commitResultToBatchEntry(r));
562
+ let okCount = 0;
563
+ for (const r of results) if (r.success) okCount++;
564
+ return {
565
+ results,
566
+ succeeded: Number(data.succeeded ?? okCount),
567
+ failed: Number(data.failed ?? results.length - okCount)
568
+ };
569
+ }
570
+ /** Abort a prepared session (staged objects → GC). No TS engine call site yet
571
+ * — the engine bails via BatchUnsupportedError on grant loss; exposed for
572
+ * protocol parity (Swift mirror) + a future P4 abort-on-timeout path. */
573
+ async abortUpload(sessionId) {
574
+ await this.execAction("abort-upload", { sessionId });
575
+ }
576
+ /** Out-of-band PUT of object bytes via a presigned grant. Returns the HTTP
577
+ * status (commit-after-200: the engine only commits entries that got 200). */
578
+ async uploadObject(grant, bytes) {
579
+ const res = await fetch(grant.url, {
580
+ method: grant.method,
581
+ headers: grant.signedHeaders,
582
+ body: bytes
583
+ });
584
+ if (!res.ok) await res.text().catch(() => void 0);
585
+ return res.status;
586
+ }
587
+ /**
588
+ * Probe whether the server's `/user` space advertises GET-grant capability
589
+ * (P2 T2.4). Reads the `.actions` catalogue and checks the prepare-download
590
+ * entry's INDEPENDENT `meta.downloadGrantCapability` (NOT the upload
591
+ * `grantCapability`). `false` on Node (fallback-only) or an old server → the
592
+ * engine stays on batchRead.
593
+ */
594
+ async downloadGrantCapability() {
595
+ const { status, json } = await this.rpc({
596
+ type: "list",
597
+ path: this.wirePath("/.actions")
598
+ });
599
+ if (status !== 200 || json.ok !== true) return false;
600
+ return (json.data ?? []).find((e) => e.id === "prepare-download")?.meta?.downloadGrantCapability === true;
601
+ }
602
+ /** Run `prepare-download` — mints GET grants for the referenced cids. Throws
603
+ * `BatchUnsupportedError` when the server lacks the action (old server). */
604
+ async prepareDownload(entries) {
605
+ return await this.execAction("prepare-download", { entries });
606
+ }
607
+ /**
608
+ * Out-of-band GET of object bytes via a presigned grant (content leaves R2
609
+ * directly — never through the Worker / base64). Returns the raw bytes on
610
+ * 200. A 401/403 means the grant was rejected (token lacks GetObject / bad
611
+ * signature) → throws {@link DownloadForbiddenError} so the engine flips the
612
+ * whole session to batchRead (runtime fallback-on-403, §7.3). Any other
613
+ * non-2xx (404 dangling / 5xx) throws a generic Error — the engine leaves the
614
+ * cid unfilled so the existing missing-object path handles it.
615
+ */
616
+ async downloadObject(grant) {
617
+ const res = await fetch(grant.url, { method: grant.method });
618
+ if (res.status === 401 || res.status === 403) {
619
+ await res.body?.cancel().catch(() => void 0);
620
+ throw new DownloadForbiddenError(res.status);
621
+ }
622
+ if (!res.ok) {
623
+ await res.body?.cancel().catch(() => void 0);
624
+ throw new Error(`downloadObject ${grant.method} failed: ${res.status}`);
625
+ }
626
+ return new Uint8Array(await res.arrayBuffer());
627
+ }
628
+ };
629
+ /**
630
+ * A presigned GET directly rejected the bearer (401/403) — the R2 token likely
631
+ * lacks GetObject or the signature is bad. Signals the engine to flip the whole
632
+ * sync session to batchRead and not keep hitting the same wall (§7.3).
633
+ */
634
+ var DownloadForbiddenError = class extends Error {
635
+ constructor(status) {
636
+ super(`download grant rejected by object store: ${status}`);
637
+ this.status = status;
638
+ this.name = "DownloadForbiddenError";
639
+ }
640
+ };
641
+ /** Map a commit-upload per-entry result (P2 shape) → the engine's RpcBatchEntryResult. */
642
+ function commitResultToBatchEntry(r) {
643
+ if (r.ok === true || typeof r.status === "number" && r.status === 200 && !r.code) {
644
+ const data = r.data;
645
+ return {
646
+ path: String(data?.path ?? ""),
647
+ success: true,
648
+ status: 200,
649
+ data: r.data
650
+ };
651
+ }
652
+ return {
653
+ path: String(r.path ?? ""),
654
+ success: false,
655
+ status: typeof r.status === "number" ? r.status : r.code === "AFS_CONFLICT" ? 409 : 500,
656
+ code: typeof r.code === "string" ? r.code : void 0,
657
+ error: typeof r.error === "string" ? r.error : void 0,
658
+ conflict: r.conflict
659
+ };
660
+ }
661
+ function encodeBytesToBase64(bytes) {
662
+ let binary = "";
663
+ const CHUNK = 32768;
664
+ for (let i = 0; i < bytes.length; i += CHUNK) binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
665
+ return btoa(binary);
666
+ }
667
+ function decodeBase64ToBytes(b64) {
668
+ const binary = atob(b64);
669
+ const bytes = new Uint8Array(binary.length);
670
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
671
+ return bytes;
672
+ }
673
+
674
+ //#endregion
675
+ export { BatchOverBudgetError, BatchUnsupportedError, DownloadForbiddenError, RemoteUserSpaceAFS, RpcUserSpaceAFS };
676
+ //# sourceMappingURL=remote-afs.mjs.map