@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.
- package/LICENSE.md +26 -0
- package/README.md +129 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
- package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
- package/dist/_virtual/rolldown_runtime.cjs +29 -0
- package/dist/afs-metadata-context.cjs +20 -0
- package/dist/afs-metadata-context.d.cts +21 -0
- package/dist/afs-metadata-context.d.cts.map +1 -0
- package/dist/afs-metadata-context.d.mts +21 -0
- package/dist/afs-metadata-context.d.mts.map +1 -0
- package/dist/afs-metadata-context.mjs +18 -0
- package/dist/afs-metadata-context.mjs.map +1 -0
- package/dist/blocklet-hook.cjs +180 -0
- package/dist/blocklet-hook.d.cts +29 -0
- package/dist/blocklet-hook.d.cts.map +1 -0
- package/dist/blocklet-hook.d.mts +29 -0
- package/dist/blocklet-hook.d.mts.map +1 -0
- package/dist/blocklet-hook.mjs +178 -0
- package/dist/blocklet-hook.mjs.map +1 -0
- package/dist/changelog-schema.cjs +603 -0
- package/dist/changelog-schema.d.cts +395 -0
- package/dist/changelog-schema.d.cts.map +1 -0
- package/dist/changelog-schema.d.mts +395 -0
- package/dist/changelog-schema.d.mts.map +1 -0
- package/dist/changelog-schema.mjs +570 -0
- package/dist/changelog-schema.mjs.map +1 -0
- package/dist/changelog-write.cjs +80 -0
- package/dist/changelog-write.d.cts +70 -0
- package/dist/changelog-write.d.cts.map +1 -0
- package/dist/changelog-write.d.mts +70 -0
- package/dist/changelog-write.d.mts.map +1 -0
- package/dist/changelog-write.mjs +77 -0
- package/dist/changelog-write.mjs.map +1 -0
- package/dist/cid-byte-cache.cjs +126 -0
- package/dist/cid-byte-cache.d.cts +46 -0
- package/dist/cid-byte-cache.d.cts.map +1 -0
- package/dist/cid-byte-cache.d.mts +47 -0
- package/dist/cid-byte-cache.d.mts.map +1 -0
- package/dist/cid-byte-cache.mjs +125 -0
- package/dist/cid-byte-cache.mjs.map +1 -0
- package/dist/cid.cjs +68 -0
- package/dist/cid.d.cts +22 -0
- package/dist/cid.d.cts.map +1 -0
- package/dist/cid.d.mts +22 -0
- package/dist/cid.d.mts.map +1 -0
- package/dist/cid.mjs +65 -0
- package/dist/cid.mjs.map +1 -0
- package/dist/client.cjs +221 -0
- package/dist/client.d.cts +72 -0
- package/dist/client.d.cts.map +1 -0
- package/dist/client.d.mts +72 -0
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +220 -0
- package/dist/client.mjs.map +1 -0
- package/dist/cloudflare.cjs +510 -0
- package/dist/cloudflare.d.cts +307 -0
- package/dist/cloudflare.d.cts.map +1 -0
- package/dist/cloudflare.d.mts +308 -0
- package/dist/cloudflare.d.mts.map +1 -0
- package/dist/cloudflare.mjs +507 -0
- package/dist/cloudflare.mjs.map +1 -0
- package/dist/ctime-backfill.cjs +272 -0
- package/dist/ctime-backfill.d.cts +169 -0
- package/dist/ctime-backfill.d.cts.map +1 -0
- package/dist/ctime-backfill.d.mts +169 -0
- package/dist/ctime-backfill.d.mts.map +1 -0
- package/dist/ctime-backfill.mjs +267 -0
- package/dist/ctime-backfill.mjs.map +1 -0
- package/dist/d1-gc-queue.cjs +80 -0
- package/dist/d1-gc-queue.d.cts +59 -0
- package/dist/d1-gc-queue.d.cts.map +1 -0
- package/dist/d1-gc-queue.d.mts +59 -0
- package/dist/d1-gc-queue.d.mts.map +1 -0
- package/dist/d1-gc-queue.mjs +81 -0
- package/dist/d1-gc-queue.mjs.map +1 -0
- package/dist/d1-resolve-store.cjs +189 -0
- package/dist/d1-resolve-store.d.cts +93 -0
- package/dist/d1-resolve-store.d.cts.map +1 -0
- package/dist/d1-resolve-store.d.mts +93 -0
- package/dist/d1-resolve-store.d.mts.map +1 -0
- package/dist/d1-resolve-store.mjs +190 -0
- package/dist/d1-resolve-store.mjs.map +1 -0
- package/dist/d1-schema.cjs +361 -0
- package/dist/d1-schema.d.cts +237 -0
- package/dist/d1-schema.d.cts.map +1 -0
- package/dist/d1-schema.d.mts +237 -0
- package/dist/d1-schema.d.mts.map +1 -0
- package/dist/d1-schema.mjs +341 -0
- package/dist/d1-schema.mjs.map +1 -0
- package/dist/d1-share-store.cjs +0 -0
- package/dist/d1-share-store.d.cts +53 -0
- package/dist/d1-share-store.d.cts.map +1 -0
- package/dist/d1-share-store.d.mts +53 -0
- package/dist/d1-share-store.d.mts.map +1 -0
- package/dist/d1-share-store.mjs +0 -0
- package/dist/d1-share-store.mjs.map +1 -0
- package/dist/d1-tree-index.cjs +1098 -0
- package/dist/d1-tree-index.d.cts +203 -0
- package/dist/d1-tree-index.d.cts.map +1 -0
- package/dist/d1-tree-index.d.mts +203 -0
- package/dist/d1-tree-index.d.mts.map +1 -0
- package/dist/d1-tree-index.mjs +1094 -0
- package/dist/d1-tree-index.mjs.map +1 -0
- package/dist/data-backend.cjs +147 -0
- package/dist/data-backend.d.cts +30 -0
- package/dist/data-backend.d.cts.map +1 -0
- package/dist/data-backend.d.mts +30 -0
- package/dist/data-backend.d.mts.map +1 -0
- package/dist/data-backend.mjs +148 -0
- package/dist/data-backend.mjs.map +1 -0
- package/dist/dedup-backfill.cjs +278 -0
- package/dist/dedup-backfill.d.cts +165 -0
- package/dist/dedup-backfill.d.cts.map +1 -0
- package/dist/dedup-backfill.d.mts +165 -0
- package/dist/dedup-backfill.d.mts.map +1 -0
- package/dist/dedup-backfill.mjs +273 -0
- package/dist/dedup-backfill.mjs.map +1 -0
- package/dist/did-space-like.d.cts +2 -0
- package/dist/did-space-like.d.mts +2 -0
- package/dist/did-utils.cjs +44 -0
- package/dist/did-utils.d.cts +25 -0
- package/dist/did-utils.d.cts.map +1 -0
- package/dist/did-utils.d.mts +25 -0
- package/dist/did-utils.d.mts.map +1 -0
- package/dist/did-utils.mjs +43 -0
- package/dist/did-utils.mjs.map +1 -0
- package/dist/dirty-path-queue.cjs +31 -0
- package/dist/dirty-path-queue.d.cts +104 -0
- package/dist/dirty-path-queue.d.cts.map +1 -0
- package/dist/dirty-path-queue.d.mts +104 -0
- package/dist/dirty-path-queue.d.mts.map +1 -0
- package/dist/dirty-path-queue.mjs +31 -0
- package/dist/dirty-path-queue.mjs.map +1 -0
- package/dist/dirty-path-schema.cjs +142 -0
- package/dist/dirty-path-schema.d.cts +90 -0
- package/dist/dirty-path-schema.d.cts.map +1 -0
- package/dist/dirty-path-schema.d.mts +90 -0
- package/dist/dirty-path-schema.d.mts.map +1 -0
- package/dist/dirty-path-schema.mjs +136 -0
- package/dist/dirty-path-schema.mjs.map +1 -0
- package/dist/download-actions.cjs +43 -0
- package/dist/download-actions.mjs +40 -0
- package/dist/download-actions.mjs.map +1 -0
- package/dist/fs-object-store.cjs +153 -0
- package/dist/fs-object-store.d.cts +21 -0
- package/dist/fs-object-store.d.cts.map +1 -0
- package/dist/fs-object-store.d.mts +22 -0
- package/dist/fs-object-store.d.mts.map +1 -0
- package/dist/fs-object-store.mjs +153 -0
- package/dist/fs-object-store.mjs.map +1 -0
- package/dist/gc-queue.d.cts +43 -0
- package/dist/gc-queue.d.cts.map +1 -0
- package/dist/gc-queue.d.mts +43 -0
- package/dist/gc-queue.d.mts.map +1 -0
- package/dist/index.cjs +2712 -0
- package/dist/index.d.cts +504 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +505 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2537 -0
- package/dist/index.mjs.map +1 -0
- package/dist/inline-content-migration.cjs +212 -0
- package/dist/inline-content-migration.d.cts +110 -0
- package/dist/inline-content-migration.d.cts.map +1 -0
- package/dist/inline-content-migration.d.mts +111 -0
- package/dist/inline-content-migration.d.mts.map +1 -0
- package/dist/inline-content-migration.mjs +207 -0
- package/dist/inline-content-migration.mjs.map +1 -0
- package/dist/inline-content.cjs +145 -0
- package/dist/inline-content.d.cts +98 -0
- package/dist/inline-content.d.cts.map +1 -0
- package/dist/inline-content.d.mts +98 -0
- package/dist/inline-content.d.mts.map +1 -0
- package/dist/inline-content.mjs +137 -0
- package/dist/inline-content.mjs.map +1 -0
- package/dist/local-changelog.cjs +241 -0
- package/dist/local-changelog.d.cts +119 -0
- package/dist/local-changelog.d.cts.map +1 -0
- package/dist/local-changelog.d.mts +119 -0
- package/dist/local-changelog.d.mts.map +1 -0
- package/dist/local-changelog.mjs +240 -0
- package/dist/local-changelog.mjs.map +1 -0
- package/dist/local.cjs +435 -0
- package/dist/local.d.cts +254 -0
- package/dist/local.d.cts.map +1 -0
- package/dist/local.d.mts +254 -0
- package/dist/local.d.mts.map +1 -0
- package/dist/local.mjs +427 -0
- package/dist/local.mjs.map +1 -0
- package/dist/memory-gc-queue.cjs +36 -0
- package/dist/memory-gc-queue.d.cts +22 -0
- package/dist/memory-gc-queue.d.cts.map +1 -0
- package/dist/memory-gc-queue.d.mts +22 -0
- package/dist/memory-gc-queue.d.mts.map +1 -0
- package/dist/memory-gc-queue.mjs +36 -0
- package/dist/memory-gc-queue.mjs.map +1 -0
- package/dist/memory-tree-index.cjs +734 -0
- package/dist/memory-tree-index.d.cts +159 -0
- package/dist/memory-tree-index.d.cts.map +1 -0
- package/dist/memory-tree-index.d.mts +159 -0
- package/dist/memory-tree-index.d.mts.map +1 -0
- package/dist/memory-tree-index.mjs +735 -0
- package/dist/memory-tree-index.mjs.map +1 -0
- package/dist/metadata-db.cjs +562 -0
- package/dist/metadata-db.d.cts +102 -0
- package/dist/metadata-db.d.cts.map +1 -0
- package/dist/metadata-db.d.mts +102 -0
- package/dist/metadata-db.d.mts.map +1 -0
- package/dist/metadata-db.mjs +562 -0
- package/dist/metadata-db.mjs.map +1 -0
- package/dist/mime-utils.cjs +2 -0
- package/dist/mime-utils.d.cts +2 -0
- package/dist/mime-utils.d.mts +2 -0
- package/dist/mime-utils.mjs +3 -0
- package/dist/object-key.cjs +41 -0
- package/dist/object-key.d.cts +25 -0
- package/dist/object-key.d.cts.map +1 -0
- package/dist/object-key.d.mts +25 -0
- package/dist/object-key.d.mts.map +1 -0
- package/dist/object-key.mjs +40 -0
- package/dist/object-key.mjs.map +1 -0
- package/dist/packages/session/dist/index.cjs +788 -0
- package/dist/packages/session/dist/index.mjs +782 -0
- package/dist/packages/session/dist/index.mjs.map +1 -0
- package/dist/platform/r2/dist/types.d.cts +49 -0
- package/dist/platform/r2/dist/types.d.cts.map +1 -0
- package/dist/prefix-range.cjs +33 -0
- package/dist/prefix-range.d.cts +29 -0
- package/dist/prefix-range.d.cts.map +1 -0
- package/dist/prefix-range.d.mts +29 -0
- package/dist/prefix-range.d.mts.map +1 -0
- package/dist/prefix-range.mjs +33 -0
- package/dist/prefix-range.mjs.map +1 -0
- package/dist/prefixed-tree-index.cjs +238 -0
- package/dist/prefixed-tree-index.d.cts +85 -0
- package/dist/prefixed-tree-index.d.cts.map +1 -0
- package/dist/prefixed-tree-index.d.mts +85 -0
- package/dist/prefixed-tree-index.d.mts.map +1 -0
- package/dist/prefixed-tree-index.mjs +239 -0
- package/dist/prefixed-tree-index.mjs.map +1 -0
- package/dist/presign-signer.cjs +7 -0
- package/dist/presign-signer.d.cts +99 -0
- package/dist/presign-signer.d.cts.map +1 -0
- package/dist/presign-signer.d.mts +99 -0
- package/dist/presign-signer.d.mts.map +1 -0
- package/dist/presign-signer.mjs +7 -0
- package/dist/presign-signer.mjs.map +1 -0
- package/dist/providers/platform/r2/dist/index.d.mts +3 -0
- package/dist/providers/platform/r2/dist/types.d.mts +49 -0
- package/dist/providers/platform/r2/dist/types.d.mts.map +1 -0
- package/dist/reconcile.cjs +184 -0
- package/dist/reconcile.d.cts +26 -0
- package/dist/reconcile.d.cts.map +1 -0
- package/dist/reconcile.d.mts +26 -0
- package/dist/reconcile.d.mts.map +1 -0
- package/dist/reconcile.mjs +184 -0
- package/dist/reconcile.mjs.map +1 -0
- package/dist/reference-check.cjs +49 -0
- package/dist/reference-check.d.cts +10 -0
- package/dist/reference-check.d.cts.map +1 -0
- package/dist/reference-check.d.mts +10 -0
- package/dist/reference-check.d.mts.map +1 -0
- package/dist/reference-check.mjs +48 -0
- package/dist/reference-check.mjs.map +1 -0
- package/dist/remote-afs.cjs +681 -0
- package/dist/remote-afs.d.cts +236 -0
- package/dist/remote-afs.d.cts.map +1 -0
- package/dist/remote-afs.d.mts +236 -0
- package/dist/remote-afs.d.mts.map +1 -0
- package/dist/remote-afs.mjs +676 -0
- package/dist/remote-afs.mjs.map +1 -0
- package/dist/rename-guard.cjs +18 -0
- package/dist/rename-guard.mjs +18 -0
- package/dist/rename-guard.mjs.map +1 -0
- package/dist/resolve.cjs +260 -0
- package/dist/resolve.d.cts +113 -0
- package/dist/resolve.d.cts.map +1 -0
- package/dist/resolve.d.mts +113 -0
- package/dist/resolve.d.mts.map +1 -0
- package/dist/resolve.mjs +260 -0
- package/dist/resolve.mjs.map +1 -0
- package/dist/rsync-content.cjs +33 -0
- package/dist/rsync-content.mjs +33 -0
- package/dist/rsync-content.mjs.map +1 -0
- package/dist/rsync.cjs +400 -0
- package/dist/rsync.d.cts +157 -0
- package/dist/rsync.d.cts.map +1 -0
- package/dist/rsync.d.mts +157 -0
- package/dist/rsync.d.mts.map +1 -0
- package/dist/rsync.mjs +397 -0
- package/dist/rsync.mjs.map +1 -0
- package/dist/run-gc.cjs +57 -0
- package/dist/run-gc.d.cts +40 -0
- package/dist/run-gc.d.cts.map +1 -0
- package/dist/run-gc.d.mts +41 -0
- package/dist/run-gc.d.mts.map +1 -0
- package/dist/run-gc.mjs +57 -0
- package/dist/run-gc.mjs.map +1 -0
- package/dist/scope-id.cjs +70 -0
- package/dist/scope-id.d.cts +35 -0
- package/dist/scope-id.d.cts.map +1 -0
- package/dist/scope-id.d.mts +35 -0
- package/dist/scope-id.d.mts.map +1 -0
- package/dist/scope-id.mjs +68 -0
- package/dist/scope-id.mjs.map +1 -0
- package/dist/scope-migration-node.cjs +172 -0
- package/dist/scope-migration-node.d.cts +44 -0
- package/dist/scope-migration-node.d.cts.map +1 -0
- package/dist/scope-migration-node.d.mts +44 -0
- package/dist/scope-migration-node.d.mts.map +1 -0
- package/dist/scope-migration-node.mjs +171 -0
- package/dist/scope-migration-node.mjs.map +1 -0
- package/dist/scope-migration.cjs +155 -0
- package/dist/scope-migration.d.cts +65 -0
- package/dist/scope-migration.d.cts.map +1 -0
- package/dist/scope-migration.d.mts +65 -0
- package/dist/scope-migration.d.mts.map +1 -0
- package/dist/scope-migration.mjs +154 -0
- package/dist/scope-migration.mjs.map +1 -0
- package/dist/share-declaration.cjs +225 -0
- package/dist/share-declaration.d.cts +30 -0
- package/dist/share-declaration.d.cts.map +1 -0
- package/dist/share-declaration.d.mts +32 -0
- package/dist/share-declaration.d.mts.map +1 -0
- package/dist/share-declaration.mjs +221 -0
- package/dist/share-declaration.mjs.map +1 -0
- package/dist/share-hook.cjs +63 -0
- package/dist/share-hook.mjs +62 -0
- package/dist/share-hook.mjs.map +1 -0
- package/dist/share-resolve.cjs +176 -0
- package/dist/share-resolve.d.cts +36 -0
- package/dist/share-resolve.d.cts.map +1 -0
- package/dist/share-resolve.d.mts +36 -0
- package/dist/share-resolve.d.mts.map +1 -0
- package/dist/share-resolve.mjs +177 -0
- package/dist/share-resolve.mjs.map +1 -0
- package/dist/share-serve.cjs +145 -0
- package/dist/share-serve.d.cts +30 -0
- package/dist/share-serve.d.cts.map +1 -0
- package/dist/share-serve.d.mts +30 -0
- package/dist/share-serve.d.mts.map +1 -0
- package/dist/share-serve.mjs +144 -0
- package/dist/share-serve.mjs.map +1 -0
- package/dist/share-store.cjs +25 -0
- package/dist/share-store.d.cts +65 -0
- package/dist/share-store.d.cts.map +1 -0
- package/dist/share-store.d.mts +65 -0
- package/dist/share-store.d.mts.map +1 -0
- package/dist/share-store.mjs +25 -0
- package/dist/share-store.mjs.map +1 -0
- package/dist/share-virtual-path.cjs +102 -0
- package/dist/share-virtual-path.mjs +101 -0
- package/dist/share-virtual-path.mjs.map +1 -0
- package/dist/space-resolver.cjs +54 -0
- package/dist/space-resolver.d.cts +34 -0
- package/dist/space-resolver.d.cts.map +1 -0
- package/dist/space-resolver.d.mts +34 -0
- package/dist/space-resolver.d.mts.map +1 -0
- package/dist/space-resolver.mjs +55 -0
- package/dist/space-resolver.mjs.map +1 -0
- package/dist/sqlite-gc-queue.cjs +51 -0
- package/dist/sqlite-gc-queue.d.cts +22 -0
- package/dist/sqlite-gc-queue.d.cts.map +1 -0
- package/dist/sqlite-gc-queue.d.mts +22 -0
- package/dist/sqlite-gc-queue.d.mts.map +1 -0
- package/dist/sqlite-gc-queue.mjs +52 -0
- package/dist/sqlite-gc-queue.mjs.map +1 -0
- package/dist/sqlite-resolve-store.cjs +163 -0
- package/dist/sqlite-resolve-store.d.cts +50 -0
- package/dist/sqlite-resolve-store.d.cts.map +1 -0
- package/dist/sqlite-resolve-store.d.mts +50 -0
- package/dist/sqlite-resolve-store.d.mts.map +1 -0
- package/dist/sqlite-resolve-store.mjs +164 -0
- package/dist/sqlite-resolve-store.mjs.map +1 -0
- package/dist/sqlite-share-store.cjs +157 -0
- package/dist/sqlite-share-store.d.cts +31 -0
- package/dist/sqlite-share-store.d.cts.map +1 -0
- package/dist/sqlite-share-store.d.mts +31 -0
- package/dist/sqlite-share-store.d.mts.map +1 -0
- package/dist/sqlite-share-store.mjs +157 -0
- package/dist/sqlite-share-store.mjs.map +1 -0
- package/dist/sqlite-tree-index.cjs +901 -0
- package/dist/sqlite-tree-index.d.cts +107 -0
- package/dist/sqlite-tree-index.d.cts.map +1 -0
- package/dist/sqlite-tree-index.d.mts +107 -0
- package/dist/sqlite-tree-index.d.mts.map +1 -0
- package/dist/sqlite-tree-index.mjs +902 -0
- package/dist/sqlite-tree-index.mjs.map +1 -0
- package/dist/sync-engine.cjs +1324 -0
- package/dist/sync-engine.d.cts +473 -0
- package/dist/sync-engine.d.cts.map +1 -0
- package/dist/sync-engine.d.mts +473 -0
- package/dist/sync-engine.d.mts.map +1 -0
- package/dist/sync-engine.mjs +1315 -0
- package/dist/sync-engine.mjs.map +1 -0
- package/dist/sync-state.cjs +303 -0
- package/dist/sync-state.d.cts +224 -0
- package/dist/sync-state.d.cts.map +1 -0
- package/dist/sync-state.d.mts +224 -0
- package/dist/sync-state.d.mts.map +1 -0
- package/dist/sync-state.mjs +297 -0
- package/dist/sync-state.mjs.map +1 -0
- package/dist/timestamp.cjs +92 -0
- package/dist/timestamp.mjs +91 -0
- package/dist/timestamp.mjs.map +1 -0
- package/dist/transports/http.cjs +54 -0
- package/dist/transports/http.d.cts +26 -0
- package/dist/transports/http.d.cts.map +1 -0
- package/dist/transports/http.d.mts +26 -0
- package/dist/transports/http.d.mts.map +1 -0
- package/dist/transports/http.mjs +54 -0
- package/dist/transports/http.mjs.map +1 -0
- package/dist/transports/static.cjs +55 -0
- package/dist/transports/static.d.cts +28 -0
- package/dist/transports/static.d.cts.map +1 -0
- package/dist/transports/static.d.mts +28 -0
- package/dist/transports/static.d.mts.map +1 -0
- package/dist/transports/static.mjs +55 -0
- package/dist/transports/static.mjs.map +1 -0
- package/dist/transports/types.cjs +13 -0
- package/dist/transports/types.d.cts +72 -0
- package/dist/transports/types.d.cts.map +1 -0
- package/dist/transports/types.d.mts +72 -0
- package/dist/transports/types.d.mts.map +1 -0
- package/dist/transports/types.mjs +13 -0
- package/dist/transports/types.mjs.map +1 -0
- package/dist/transports/ws.cjs +207 -0
- package/dist/transports/ws.d.cts +47 -0
- package/dist/transports/ws.d.cts.map +1 -0
- package/dist/transports/ws.d.mts +47 -0
- package/dist/transports/ws.d.mts.map +1 -0
- package/dist/transports/ws.mjs +206 -0
- package/dist/transports/ws.mjs.map +1 -0
- package/dist/tree-index.cjs +333 -0
- package/dist/tree-index.d.cts +524 -0
- package/dist/tree-index.d.cts.map +1 -0
- package/dist/tree-index.d.mts +524 -0
- package/dist/tree-index.d.mts.map +1 -0
- package/dist/tree-index.mjs +322 -0
- package/dist/tree-index.mjs.map +1 -0
- package/dist/tree-query.cjs +655 -0
- package/dist/tree-query.d.cts +70 -0
- package/dist/tree-query.d.cts.map +1 -0
- package/dist/tree-query.d.mts +70 -0
- package/dist/tree-query.d.mts.map +1 -0
- package/dist/tree-query.mjs +648 -0
- package/dist/tree-query.mjs.map +1 -0
- package/dist/upload-actions.cjs +97 -0
- package/dist/upload-actions.d.cts +19 -0
- package/dist/upload-actions.d.cts.map +1 -0
- package/dist/upload-actions.d.mts +21 -0
- package/dist/upload-actions.d.mts.map +1 -0
- package/dist/upload-actions.mjs +90 -0
- package/dist/upload-actions.mjs.map +1 -0
- package/dist/upload-session-store.cjs +185 -0
- package/dist/upload-session-store.d.cts +99 -0
- package/dist/upload-session-store.d.cts.map +1 -0
- package/dist/upload-session-store.d.mts +99 -0
- package/dist/upload-session-store.d.mts.map +1 -0
- package/dist/upload-session-store.mjs +184 -0
- package/dist/upload-session-store.mjs.map +1 -0
- package/dist/url-normalize.cjs +61 -0
- package/dist/url-normalize.d.cts +33 -0
- package/dist/url-normalize.d.cts.map +1 -0
- package/dist/url-normalize.d.mts +33 -0
- package/dist/url-normalize.d.mts.map +1 -0
- package/dist/url-normalize.mjs +61 -0
- package/dist/url-normalize.mjs.map +1 -0
- package/dist/versioned-content-backends.cjs +155 -0
- package/dist/versioned-content-backends.d.cts +49 -0
- package/dist/versioned-content-backends.d.cts.map +1 -0
- package/dist/versioned-content-backends.d.mts +49 -0
- package/dist/versioned-content-backends.d.mts.map +1 -0
- package/dist/versioned-content-backends.mjs +154 -0
- package/dist/versioned-content-backends.mjs.map +1 -0
- package/dist/versioned-content-index.cjs +102 -0
- package/dist/versioned-content-index.d.cts +46 -0
- package/dist/versioned-content-index.d.cts.map +1 -0
- package/dist/versioned-content-index.d.mts +46 -0
- package/dist/versioned-content-index.d.mts.map +1 -0
- package/dist/versioned-content-index.mjs +103 -0
- package/dist/versioned-content-index.mjs.map +1 -0
- package/dist/versioned-content-store.cjs +121 -0
- package/dist/versioned-content-store.d.cts +90 -0
- package/dist/versioned-content-store.d.cts.map +1 -0
- package/dist/versioned-content-store.d.mts +90 -0
- package/dist/versioned-content-store.d.mts.map +1 -0
- package/dist/versioned-content-store.mjs +122 -0
- package/dist/versioned-content-store.mjs.map +1 -0
- package/dist/versioned-scope.cjs +39 -0
- package/dist/versioned-scope.d.cts +57 -0
- package/dist/versioned-scope.d.cts.map +1 -0
- package/dist/versioned-scope.d.mts +57 -0
- package/dist/versioned-scope.d.mts.map +1 -0
- package/dist/versioned-scope.mjs +37 -0
- package/dist/versioned-scope.mjs.map +1 -0
- package/migrations/0001_tree_entries.sql +17 -0
- package/migrations/0002_resolve_entries.sql +7 -0
- package/migrations/0003_entries_v2.sql +38 -0
- package/migrations/0004_gc_queue.sql +5 -0
- package/migrations/0006_resolve_enhance.sql +14 -0
- package/migrations/0007_resolve_created_at.sql +10 -0
- package/migrations/0008_changelog.sql +34 -0
- package/migrations/0009_device_sync_state.sql +29 -0
- package/migrations/0010_scope_meta.sql +33 -0
- package/migrations/0011_shares.sql +25 -0
- package/migrations/0012_scope_meta_file_count.sql +41 -0
- package/migrations/0013_scope_meta_total_bytes.sql +47 -0
- package/migrations/0014_rename_tables.sql +62 -0
- package/package.json +102 -0
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_changelog_schema = require('./changelog-schema.cjs');
|
|
3
|
+
const require_d1_schema = require('./d1-schema.cjs');
|
|
4
|
+
const require_changelog_write = require('./changelog-write.cjs');
|
|
5
|
+
const require_dirty_path_schema = require('./dirty-path-schema.cjs');
|
|
6
|
+
const require_rename_guard = require('./rename-guard.cjs');
|
|
7
|
+
let node_fs = require("node:fs");
|
|
8
|
+
let node_path = require("node:path");
|
|
9
|
+
|
|
10
|
+
//#region src/metadata-db.ts
|
|
11
|
+
/**
|
|
12
|
+
* MetadataDB — local SQLite index for DID Space files.
|
|
13
|
+
*
|
|
14
|
+
* Opened at: ~/.afs/spaces/{userDid}/_metadata.db
|
|
15
|
+
*
|
|
16
|
+
* Tables:
|
|
17
|
+
* entries — same schema as D1 (entries table in scalability-design §4.1)
|
|
18
|
+
* cid_cache — path → cid + mtime_ms for avoiding repeated hash computation
|
|
19
|
+
* sync_checkpoint — persistent sync state for resume-on-failure (Phase 3)
|
|
20
|
+
*
|
|
21
|
+
* SQLite tuning: WAL, cache_size 256 MB, mmap 1 GB, busy_timeout 30 s.
|
|
22
|
+
*/
|
|
23
|
+
const DB_FILENAME = "_metadata.db";
|
|
24
|
+
const SCHEMA_SQL = `
|
|
25
|
+
PRAGMA journal_mode = WAL;
|
|
26
|
+
PRAGMA synchronous = NORMAL;
|
|
27
|
+
PRAGMA cache_size = -262144;
|
|
28
|
+
PRAGMA mmap_size = 1073741824;
|
|
29
|
+
PRAGMA busy_timeout = 30000;
|
|
30
|
+
PRAGMA wal_autocheckpoint = 10000;
|
|
31
|
+
|
|
32
|
+
CREATE TABLE IF NOT EXISTS ds_entries (
|
|
33
|
+
scope TEXT NOT NULL,
|
|
34
|
+
path TEXT NOT NULL,
|
|
35
|
+
parent TEXT NOT NULL,
|
|
36
|
+
name TEXT NOT NULL,
|
|
37
|
+
kind TEXT NOT NULL DEFAULT 'file',
|
|
38
|
+
cid TEXT,
|
|
39
|
+
size INTEGER NOT NULL DEFAULT 0,
|
|
40
|
+
mime_type TEXT,
|
|
41
|
+
ctime INTEGER NOT NULL,
|
|
42
|
+
mtime INTEGER NOT NULL,
|
|
43
|
+
PRIMARY KEY (scope, path),
|
|
44
|
+
CHECK (LENGTH(path) <= 4096),
|
|
45
|
+
CHECK (LENGTH(name) <= 255),
|
|
46
|
+
CHECK (kind IN ('file', 'dir')),
|
|
47
|
+
CHECK (LENGTH(scope) <= 128)
|
|
48
|
+
) WITHOUT ROWID;
|
|
49
|
+
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_entries_children
|
|
51
|
+
ON ds_entries(scope, parent, name);
|
|
52
|
+
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_entries_mtime
|
|
54
|
+
ON ds_entries(scope, mtime DESC);
|
|
55
|
+
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_entries_kind
|
|
57
|
+
ON ds_entries(scope, kind);
|
|
58
|
+
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_entries_cid
|
|
60
|
+
ON ds_entries(cid) WHERE cid IS NOT NULL;
|
|
61
|
+
|
|
62
|
+
-- Ordered listChildren (did-space-sorting Phase 2): scope+parent equality,
|
|
63
|
+
-- mtime/ctime range order, name tiebreak — index-only ordered scans.
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_entries_parent_mtime
|
|
65
|
+
ON ds_entries(scope, parent, mtime, name);
|
|
66
|
+
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_entries_parent_ctime
|
|
68
|
+
ON ds_entries(scope, parent, ctime, name);
|
|
69
|
+
|
|
70
|
+
CREATE TABLE IF NOT EXISTS cid_cache (
|
|
71
|
+
path TEXT PRIMARY KEY,
|
|
72
|
+
cid TEXT NOT NULL,
|
|
73
|
+
size INTEGER NOT NULL,
|
|
74
|
+
mtime_ms INTEGER NOT NULL,
|
|
75
|
+
computed_at INTEGER NOT NULL
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
CREATE TABLE IF NOT EXISTS sync_checkpoint (
|
|
79
|
+
session_id TEXT PRIMARY KEY,
|
|
80
|
+
direction TEXT NOT NULL,
|
|
81
|
+
remote_url TEXT NOT NULL,
|
|
82
|
+
base_path TEXT NOT NULL,
|
|
83
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
84
|
+
diff_json TEXT NOT NULL,
|
|
85
|
+
completed TEXT NOT NULL DEFAULT '[]',
|
|
86
|
+
created_at INTEGER NOT NULL,
|
|
87
|
+
updated_at INTEGER NOT NULL
|
|
88
|
+
);
|
|
89
|
+
`;
|
|
90
|
+
var MetadataDB = class MetadataDB {
|
|
91
|
+
client;
|
|
92
|
+
dbPath;
|
|
93
|
+
constructor(client, dbPath) {
|
|
94
|
+
this.client = client;
|
|
95
|
+
this.dbPath = dbPath;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Internal: the raw libsql client, for `SQLiteTreeIndex` to run the same
|
|
99
|
+
* atomic batches / queries D1TreeIndex runs on D1 (shared `entries` +
|
|
100
|
+
* `changelog` tables). Kept package-internal — application code must go
|
|
101
|
+
* through AFS / the TreeIndex interface, never this client directly.
|
|
102
|
+
*/
|
|
103
|
+
get rawClient() {
|
|
104
|
+
return this.client;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Open (or create) _metadata.db in the given directory.
|
|
108
|
+
* Creates the directory if it does not exist.
|
|
109
|
+
*
|
|
110
|
+
* Executes the core schema (entries / cid_cache / sync_checkpoint) AND the
|
|
111
|
+
* Phase 2 changelog table DDL. Changelog DDL is imported from
|
|
112
|
+
* `changelog-schema.ts` so that D1, desktop SQLite, and the Swift/Kotlin
|
|
113
|
+
* runtimes share byte-identical statements (verified by the CI parity
|
|
114
|
+
* check).
|
|
115
|
+
*/
|
|
116
|
+
static async open(userDir) {
|
|
117
|
+
const dbPath = (0, node_path.join)(userDir, DB_FILENAME);
|
|
118
|
+
(0, node_fs.mkdirSync)((0, node_path.dirname)(dbPath), { recursive: true });
|
|
119
|
+
const { createClient } = await import("@libsql/client");
|
|
120
|
+
const statements = [
|
|
121
|
+
...SCHEMA_SQL.split(";").map((s) => s.trim()).filter((s) => s.length > 0),
|
|
122
|
+
require_changelog_schema.CHANGELOG_TABLE_SQL,
|
|
123
|
+
...require_changelog_schema.CHANGELOG_INDEX_SQL,
|
|
124
|
+
require_changelog_schema.SYNC_STATE_TABLE_SQL,
|
|
125
|
+
...require_changelog_schema.SYNC_STATE_INDEX_SQL,
|
|
126
|
+
require_changelog_schema.PREFIX_WATERMARK_TABLE_SQL,
|
|
127
|
+
require_dirty_path_schema.DIRTY_PATH_TABLE_SQL,
|
|
128
|
+
...require_dirty_path_schema.DIRTY_PATH_INDEX_SQL,
|
|
129
|
+
...require_dirty_path_schema.DIRTY_PATH_TRIGGER_SQL,
|
|
130
|
+
require_d1_schema.UPLOAD_SESSIONS_TABLE_SQL,
|
|
131
|
+
require_d1_schema.UPLOAD_SESSION_ENTRIES_TABLE_SQL,
|
|
132
|
+
...require_d1_schema.UPLOAD_SESSIONS_INDEX_SQL
|
|
133
|
+
];
|
|
134
|
+
async function tryOpen() {
|
|
135
|
+
const client$1 = createClient({ url: `file:${dbPath}` });
|
|
136
|
+
for (const [oldName, newName] of [
|
|
137
|
+
["entries", "ds_entries"],
|
|
138
|
+
["changelog", "ds_changelog"],
|
|
139
|
+
["gc_queue", "ds_gc_queue"],
|
|
140
|
+
["sync_state", "ds_sync_state"],
|
|
141
|
+
["prefix_watermark", "ds_prefix_watermark"],
|
|
142
|
+
["upload_sessions", "ds_upload_sessions"],
|
|
143
|
+
["upload_session_entries", "ds_upload_session_entries"],
|
|
144
|
+
["versioned_scopes", "ds_versioned_scopes"],
|
|
145
|
+
["scope_meta", "ds_scope_meta"],
|
|
146
|
+
["device_sync_state", "ds_device_sync_state"]
|
|
147
|
+
]) await require_rename_guard.renameLegacyTable(client$1, oldName, newName);
|
|
148
|
+
for (const stmt of statements) await client$1.execute(stmt);
|
|
149
|
+
const cols = await client$1.execute("SELECT name FROM pragma_table_info('ds_entries')");
|
|
150
|
+
const colNames = new Set(cols.rows.map((r) => String(r.name)));
|
|
151
|
+
if (!colNames.has("content")) try {
|
|
152
|
+
await client$1.execute(require_d1_schema.ENTRIES_INLINE_CONTENT_COLUMN_SQL);
|
|
153
|
+
} catch (err) {
|
|
154
|
+
if (!(err instanceof Error ? err.message : String(err)).includes("duplicate column name")) throw err;
|
|
155
|
+
}
|
|
156
|
+
if (!colNames.has("metadata")) try {
|
|
157
|
+
await client$1.execute(require_d1_schema.ENTRIES_METADATA_COLUMN_SQL);
|
|
158
|
+
} catch (err) {
|
|
159
|
+
if (!(err instanceof Error ? err.message : String(err)).includes("duplicate column name")) throw err;
|
|
160
|
+
}
|
|
161
|
+
if (!colNames.has("dedup_scope")) try {
|
|
162
|
+
await client$1.execute(require_d1_schema.ENTRIES_DEDUP_SCOPE_COLUMN_SQL);
|
|
163
|
+
} catch (err) {
|
|
164
|
+
if (!(err instanceof Error ? err.message : String(err)).includes("duplicate column name")) throw err;
|
|
165
|
+
}
|
|
166
|
+
if (!colNames.has("dedup_key")) try {
|
|
167
|
+
await client$1.execute(require_d1_schema.ENTRIES_DEDUP_KEY_COLUMN_SQL);
|
|
168
|
+
} catch (err) {
|
|
169
|
+
if (!(err instanceof Error ? err.message : String(err)).includes("duplicate column name")) throw err;
|
|
170
|
+
}
|
|
171
|
+
await client$1.execute(require_d1_schema.ENTRIES_DEDUP_INDEX_SQL);
|
|
172
|
+
if (!colNames.has("content_type")) try {
|
|
173
|
+
await client$1.execute(require_d1_schema.ENTRIES_CONTENT_TYPE_COLUMN_SQL);
|
|
174
|
+
} catch (err) {
|
|
175
|
+
if (!(err instanceof Error ? err.message : String(err)).includes("duplicate column name")) throw err;
|
|
176
|
+
}
|
|
177
|
+
await client$1.execute(require_d1_schema.ENTRIES_CONTENT_TYPE_INDEX_DROP_SQL);
|
|
178
|
+
await client$1.execute("SELECT COUNT(*) FROM ds_entries");
|
|
179
|
+
await client$1.execute("SELECT COUNT(*) FROM ds_changelog");
|
|
180
|
+
await client$1.execute("SELECT COUNT(*) FROM ds_sync_state");
|
|
181
|
+
await client$1.execute("SELECT COUNT(*) FROM ds_dirty_path");
|
|
182
|
+
return client$1;
|
|
183
|
+
}
|
|
184
|
+
let client;
|
|
185
|
+
try {
|
|
186
|
+
client = await tryOpen();
|
|
187
|
+
} catch (err) {
|
|
188
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
189
|
+
if (msg.includes("SQLITE_CORRUPT") || msg.includes("SQLITE_NOTADB") || msg.includes("database disk image is malformed") || msg.includes("file is not a database")) {
|
|
190
|
+
for (const suffix of [
|
|
191
|
+
"",
|
|
192
|
+
"-wal",
|
|
193
|
+
"-shm"
|
|
194
|
+
]) (0, node_fs.rmSync)(dbPath + suffix, { force: true });
|
|
195
|
+
client = await tryOpen();
|
|
196
|
+
} else throw err;
|
|
197
|
+
}
|
|
198
|
+
return new MetadataDB(client, dbPath);
|
|
199
|
+
}
|
|
200
|
+
/** Return all file entries (kind='file') for the given scope. */
|
|
201
|
+
async getFiles(scope, basePath) {
|
|
202
|
+
let sql;
|
|
203
|
+
let args;
|
|
204
|
+
if (basePath) {
|
|
205
|
+
const end = basePath.slice(0, -1) + String.fromCharCode(basePath.charCodeAt(basePath.length - 1) + 1);
|
|
206
|
+
sql = `SELECT * FROM ds_entries WHERE scope = ? AND kind = 'file' AND path >= ? AND path < ? ORDER BY path`;
|
|
207
|
+
args = [
|
|
208
|
+
scope,
|
|
209
|
+
basePath,
|
|
210
|
+
end
|
|
211
|
+
];
|
|
212
|
+
} else {
|
|
213
|
+
sql = `SELECT * FROM ds_entries WHERE scope = ? AND kind = 'file' ORDER BY path`;
|
|
214
|
+
args = [scope];
|
|
215
|
+
}
|
|
216
|
+
return (await this.client.execute({
|
|
217
|
+
sql,
|
|
218
|
+
args
|
|
219
|
+
})).rows.map(toEntryRow);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Read the current cid for (scope, path). Internal helper for atomic
|
|
223
|
+
* changelog writes — callers need the old_cid to populate the changelog
|
|
224
|
+
* row. Returns null if the row does not exist OR if its cid is null
|
|
225
|
+
* (directory row).
|
|
226
|
+
*/
|
|
227
|
+
async getCurrentCid(scope, path) {
|
|
228
|
+
const result = await this.client.execute({
|
|
229
|
+
sql: `SELECT cid FROM ds_entries WHERE scope = ? AND path = ?`,
|
|
230
|
+
args: [scope, path]
|
|
231
|
+
});
|
|
232
|
+
if (result.rows.length === 0) return null;
|
|
233
|
+
return result.rows[0][0] ?? null;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Upsert a single entry. Writes `entries` + `changelog` atomically via libsql batch.
|
|
237
|
+
*
|
|
238
|
+
* Directory rows (kind='dir') and rows with cid=null never produce a
|
|
239
|
+
* changelog entry — the changelog tracks file content mutations only.
|
|
240
|
+
*/
|
|
241
|
+
async upsertEntry(row, opts) {
|
|
242
|
+
require_changelog_write.validateDeviceId(opts.deviceId);
|
|
243
|
+
const oldCid = !opts.skipChangelog && row.kind === "file" ? await this.getCurrentCid(row.scope, row.path) : null;
|
|
244
|
+
const stmts = [{
|
|
245
|
+
sql: `INSERT OR REPLACE INTO ds_entries
|
|
246
|
+
(scope, path, parent, name, kind, cid, size, mime_type, ctime, mtime)
|
|
247
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
248
|
+
args: [
|
|
249
|
+
row.scope,
|
|
250
|
+
row.path,
|
|
251
|
+
row.parent,
|
|
252
|
+
row.name,
|
|
253
|
+
row.kind,
|
|
254
|
+
row.cid ?? null,
|
|
255
|
+
row.size,
|
|
256
|
+
row.mime_type ?? null,
|
|
257
|
+
row.ctime,
|
|
258
|
+
row.mtime
|
|
259
|
+
]
|
|
260
|
+
}];
|
|
261
|
+
if (!opts.skipChangelog && row.kind === "file" && row.cid) stmts.push({
|
|
262
|
+
sql: require_changelog_write.CHANGELOG_INSERT_SQL,
|
|
263
|
+
args: [
|
|
264
|
+
row.scope,
|
|
265
|
+
row.path,
|
|
266
|
+
"put",
|
|
267
|
+
row.cid,
|
|
268
|
+
oldCid,
|
|
269
|
+
row.size,
|
|
270
|
+
row.mtime,
|
|
271
|
+
opts.deviceId
|
|
272
|
+
]
|
|
273
|
+
});
|
|
274
|
+
await this.client.batch(stmts, "write");
|
|
275
|
+
}
|
|
276
|
+
/** Upsert multiple entries in a single atomic transaction. */
|
|
277
|
+
async upsertEntries(rows, opts) {
|
|
278
|
+
if (rows.length === 0) return;
|
|
279
|
+
require_changelog_write.validateDeviceId(opts.deviceId);
|
|
280
|
+
const oldCidMap = /* @__PURE__ */ new Map();
|
|
281
|
+
if (!opts.skipChangelog) {
|
|
282
|
+
const byScope = /* @__PURE__ */ new Map();
|
|
283
|
+
for (const r of rows) {
|
|
284
|
+
if (r.kind !== "file") continue;
|
|
285
|
+
const list = byScope.get(r.scope) ?? [];
|
|
286
|
+
list.push(r.path);
|
|
287
|
+
byScope.set(r.scope, list);
|
|
288
|
+
}
|
|
289
|
+
for (const [scope, paths] of byScope) {
|
|
290
|
+
if (paths.length === 0) continue;
|
|
291
|
+
const placeholders = paths.map(() => "?").join(",");
|
|
292
|
+
const result = await this.client.execute({
|
|
293
|
+
sql: `SELECT path, cid FROM ds_entries WHERE scope = ? AND path IN (${placeholders}) AND cid IS NOT NULL`,
|
|
294
|
+
args: [scope, ...paths]
|
|
295
|
+
});
|
|
296
|
+
for (const r of result.rows) {
|
|
297
|
+
const path = r[0];
|
|
298
|
+
const cid = r[1];
|
|
299
|
+
if (cid) oldCidMap.set(`${scope}\x00${path}`, cid);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const stmts = [];
|
|
304
|
+
for (const row of rows) {
|
|
305
|
+
stmts.push({
|
|
306
|
+
sql: `INSERT OR REPLACE INTO ds_entries
|
|
307
|
+
(scope, path, parent, name, kind, cid, size, mime_type, ctime, mtime)
|
|
308
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
309
|
+
args: [
|
|
310
|
+
row.scope,
|
|
311
|
+
row.path,
|
|
312
|
+
row.parent,
|
|
313
|
+
row.name,
|
|
314
|
+
row.kind,
|
|
315
|
+
row.cid ?? null,
|
|
316
|
+
row.size,
|
|
317
|
+
row.mime_type ?? null,
|
|
318
|
+
row.ctime,
|
|
319
|
+
row.mtime
|
|
320
|
+
]
|
|
321
|
+
});
|
|
322
|
+
if (!opts.skipChangelog && row.kind === "file" && row.cid) {
|
|
323
|
+
const oldCid = oldCidMap.get(`${row.scope}\x00${row.path}`) ?? null;
|
|
324
|
+
stmts.push({
|
|
325
|
+
sql: require_changelog_write.CHANGELOG_INSERT_SQL,
|
|
326
|
+
args: [
|
|
327
|
+
row.scope,
|
|
328
|
+
row.path,
|
|
329
|
+
"put",
|
|
330
|
+
row.cid,
|
|
331
|
+
oldCid,
|
|
332
|
+
row.size,
|
|
333
|
+
row.mtime,
|
|
334
|
+
opts.deviceId
|
|
335
|
+
]
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
await this.client.batch(stmts, "write");
|
|
340
|
+
}
|
|
341
|
+
/** Delete an entry by scope + path. Writes changelog delete row atomically. */
|
|
342
|
+
async deleteEntry(scope, path, opts) {
|
|
343
|
+
require_changelog_write.validateDeviceId(opts.deviceId);
|
|
344
|
+
const oldCid = opts.skipChangelog ? null : await this.getCurrentCid(scope, path);
|
|
345
|
+
const stmts = [{
|
|
346
|
+
sql: `DELETE FROM ds_entries WHERE scope = ? AND path = ?`,
|
|
347
|
+
args: [scope, path]
|
|
348
|
+
}];
|
|
349
|
+
if (!opts.skipChangelog && oldCid) stmts.push({
|
|
350
|
+
sql: require_changelog_write.CHANGELOG_INSERT_SQL,
|
|
351
|
+
args: [
|
|
352
|
+
scope,
|
|
353
|
+
path,
|
|
354
|
+
"delete",
|
|
355
|
+
null,
|
|
356
|
+
oldCid,
|
|
357
|
+
null,
|
|
358
|
+
Date.now(),
|
|
359
|
+
opts.deviceId
|
|
360
|
+
]
|
|
361
|
+
});
|
|
362
|
+
await this.client.batch(stmts, "write");
|
|
363
|
+
}
|
|
364
|
+
/** Delete all file entries for a scope whose paths are NOT in the given set. */
|
|
365
|
+
async deleteEntriesNotIn(scope, keepPaths, opts) {
|
|
366
|
+
require_changelog_write.validateDeviceId(opts.deviceId);
|
|
367
|
+
if (keepPaths.size === 0) {
|
|
368
|
+
let filesToLog = [];
|
|
369
|
+
if (!opts.skipChangelog) filesToLog = (await this.client.execute({
|
|
370
|
+
sql: `SELECT path, cid FROM ds_entries WHERE scope = ? AND kind = 'file' AND cid IS NOT NULL`,
|
|
371
|
+
args: [scope]
|
|
372
|
+
})).rows.map((r) => ({
|
|
373
|
+
path: r[0],
|
|
374
|
+
cid: r[1]
|
|
375
|
+
}));
|
|
376
|
+
const stmts$1 = [{
|
|
377
|
+
sql: `DELETE FROM ds_entries WHERE scope = ?`,
|
|
378
|
+
args: [scope]
|
|
379
|
+
}];
|
|
380
|
+
const now$1 = Date.now();
|
|
381
|
+
for (const row of filesToLog) stmts$1.push({
|
|
382
|
+
sql: require_changelog_write.CHANGELOG_INSERT_SQL,
|
|
383
|
+
args: [
|
|
384
|
+
scope,
|
|
385
|
+
row.path,
|
|
386
|
+
"delete",
|
|
387
|
+
null,
|
|
388
|
+
row.cid,
|
|
389
|
+
null,
|
|
390
|
+
now$1,
|
|
391
|
+
opts.deviceId
|
|
392
|
+
]
|
|
393
|
+
});
|
|
394
|
+
await this.client.batch(stmts$1, "write");
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
const result = await this.client.execute({
|
|
398
|
+
sql: `SELECT path, cid FROM ds_entries WHERE scope = ? AND kind = 'file'`,
|
|
399
|
+
args: [scope]
|
|
400
|
+
});
|
|
401
|
+
const toDelete = [];
|
|
402
|
+
for (const r of result.rows) {
|
|
403
|
+
const path = r[0];
|
|
404
|
+
const cid = r[1];
|
|
405
|
+
if (!keepPaths.has(path)) toDelete.push({
|
|
406
|
+
path,
|
|
407
|
+
cid
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
if (toDelete.length === 0) return;
|
|
411
|
+
const stmts = [];
|
|
412
|
+
const now = Date.now();
|
|
413
|
+
for (const row of toDelete) {
|
|
414
|
+
stmts.push({
|
|
415
|
+
sql: `DELETE FROM ds_entries WHERE scope = ? AND path = ?`,
|
|
416
|
+
args: [scope, row.path]
|
|
417
|
+
});
|
|
418
|
+
if (!opts.skipChangelog && row.cid) stmts.push({
|
|
419
|
+
sql: require_changelog_write.CHANGELOG_INSERT_SQL,
|
|
420
|
+
args: [
|
|
421
|
+
scope,
|
|
422
|
+
row.path,
|
|
423
|
+
"delete",
|
|
424
|
+
null,
|
|
425
|
+
row.cid,
|
|
426
|
+
null,
|
|
427
|
+
now,
|
|
428
|
+
opts.deviceId
|
|
429
|
+
]
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
await this.client.batch(stmts, "write");
|
|
433
|
+
}
|
|
434
|
+
/** Get CID cache entry for a filesystem path. Returns null on cache miss. */
|
|
435
|
+
async getCidCache(path) {
|
|
436
|
+
const result = await this.client.execute({
|
|
437
|
+
sql: `SELECT path, cid, size, mtime_ms, computed_at FROM cid_cache WHERE path = ?`,
|
|
438
|
+
args: [path]
|
|
439
|
+
});
|
|
440
|
+
if (result.rows.length === 0) return null;
|
|
441
|
+
return toCidCacheRow(result.rows[0]);
|
|
442
|
+
}
|
|
443
|
+
/** Set (insert or replace) a CID cache entry. */
|
|
444
|
+
async setCidCache(row) {
|
|
445
|
+
await this.client.execute({
|
|
446
|
+
sql: `INSERT OR REPLACE INTO cid_cache (path, cid, size, mtime_ms, computed_at)
|
|
447
|
+
VALUES (?, ?, ?, ?, ?)`,
|
|
448
|
+
args: [
|
|
449
|
+
row.path,
|
|
450
|
+
row.cid,
|
|
451
|
+
row.size,
|
|
452
|
+
row.mtime_ms,
|
|
453
|
+
row.computed_at
|
|
454
|
+
]
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Get the most recent active checkpoint for the given (direction, remoteUrl, basePath).
|
|
459
|
+
* Returns null when no active session exists.
|
|
460
|
+
*/
|
|
461
|
+
async getActiveCheckpoint(direction, remoteUrl, basePath) {
|
|
462
|
+
const result = await this.client.execute({
|
|
463
|
+
sql: `SELECT * FROM sync_checkpoint WHERE direction = ? AND remote_url = ? AND base_path = ? AND status = 'active' ORDER BY created_at DESC LIMIT 1`,
|
|
464
|
+
args: [
|
|
465
|
+
direction,
|
|
466
|
+
remoteUrl,
|
|
467
|
+
basePath
|
|
468
|
+
]
|
|
469
|
+
});
|
|
470
|
+
if (result.rows.length === 0) return null;
|
|
471
|
+
return toCheckpointRow(result.rows[0]);
|
|
472
|
+
}
|
|
473
|
+
/** Insert a new checkpoint record. */
|
|
474
|
+
async createCheckpoint(row) {
|
|
475
|
+
await this.client.execute({
|
|
476
|
+
sql: `INSERT INTO sync_checkpoint (session_id, direction, remote_url, base_path, status, diff_json, completed, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
477
|
+
args: [
|
|
478
|
+
row.session_id,
|
|
479
|
+
row.direction,
|
|
480
|
+
row.remote_url,
|
|
481
|
+
row.base_path,
|
|
482
|
+
row.status,
|
|
483
|
+
row.diff_json,
|
|
484
|
+
row.completed,
|
|
485
|
+
row.created_at,
|
|
486
|
+
row.updated_at
|
|
487
|
+
]
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
/** Update the completed paths list for an active checkpoint. */
|
|
491
|
+
async updateCheckpointCompleted(sessionId, completedPaths) {
|
|
492
|
+
await this.client.execute({
|
|
493
|
+
sql: `UPDATE sync_checkpoint SET completed = ?, updated_at = ? WHERE session_id = ?`,
|
|
494
|
+
args: [
|
|
495
|
+
JSON.stringify(completedPaths),
|
|
496
|
+
Date.now(),
|
|
497
|
+
sessionId
|
|
498
|
+
]
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
/** Mark a checkpoint as done. */
|
|
502
|
+
async completeCheckpoint(sessionId) {
|
|
503
|
+
await this.client.execute({
|
|
504
|
+
sql: `UPDATE sync_checkpoint SET status = 'done', updated_at = ? WHERE session_id = ?`,
|
|
505
|
+
args: [Date.now(), sessionId]
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
/** Get a checkpoint by session_id (for test assertions). */
|
|
509
|
+
async getCheckpoint(sessionId) {
|
|
510
|
+
const result = await this.client.execute({
|
|
511
|
+
sql: `SELECT * FROM sync_checkpoint WHERE session_id = ?`,
|
|
512
|
+
args: [sessionId]
|
|
513
|
+
});
|
|
514
|
+
if (result.rows.length === 0) return null;
|
|
515
|
+
return toCheckpointRow(result.rows[0]);
|
|
516
|
+
}
|
|
517
|
+
/** Close the database connection. */
|
|
518
|
+
close() {
|
|
519
|
+
this.client.close();
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
function toEntryRow(row) {
|
|
523
|
+
const r = row;
|
|
524
|
+
return {
|
|
525
|
+
scope: r.scope,
|
|
526
|
+
path: r.path,
|
|
527
|
+
parent: r.parent,
|
|
528
|
+
name: r.name,
|
|
529
|
+
kind: r.kind,
|
|
530
|
+
cid: r.cid,
|
|
531
|
+
size: r.size,
|
|
532
|
+
mime_type: r.mime_type,
|
|
533
|
+
ctime: r.ctime,
|
|
534
|
+
mtime: r.mtime
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
function toCidCacheRow(row) {
|
|
538
|
+
return {
|
|
539
|
+
path: row.path,
|
|
540
|
+
cid: row.cid,
|
|
541
|
+
size: row.size,
|
|
542
|
+
mtime_ms: row.mtime_ms,
|
|
543
|
+
computed_at: row.computed_at
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
function toCheckpointRow(row) {
|
|
547
|
+
const r = row;
|
|
548
|
+
return {
|
|
549
|
+
session_id: r.session_id,
|
|
550
|
+
direction: r.direction,
|
|
551
|
+
remote_url: r.remote_url,
|
|
552
|
+
base_path: r.base_path,
|
|
553
|
+
status: r.status,
|
|
554
|
+
diff_json: r.diff_json,
|
|
555
|
+
completed: r.completed,
|
|
556
|
+
created_at: r.created_at,
|
|
557
|
+
updated_at: r.updated_at
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
//#endregion
|
|
562
|
+
exports.MetadataDB = MetadataDB;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { PutOpts } from "./tree-index.cjs";
|
|
2
|
+
import * as _libsql_client3 from "@libsql/client";
|
|
3
|
+
|
|
4
|
+
//#region src/metadata-db.d.ts
|
|
5
|
+
interface EntryRow {
|
|
6
|
+
scope: string;
|
|
7
|
+
path: string;
|
|
8
|
+
parent: string;
|
|
9
|
+
name: string;
|
|
10
|
+
kind: "file" | "dir";
|
|
11
|
+
cid: string | null;
|
|
12
|
+
size: number;
|
|
13
|
+
mime_type: string | null;
|
|
14
|
+
ctime: number;
|
|
15
|
+
mtime: number;
|
|
16
|
+
}
|
|
17
|
+
interface CidCacheRow {
|
|
18
|
+
path: string;
|
|
19
|
+
cid: string;
|
|
20
|
+
size: number;
|
|
21
|
+
mtime_ms: number;
|
|
22
|
+
computed_at: number;
|
|
23
|
+
}
|
|
24
|
+
interface CheckpointRow {
|
|
25
|
+
session_id: string;
|
|
26
|
+
direction: string;
|
|
27
|
+
remote_url: string;
|
|
28
|
+
base_path: string;
|
|
29
|
+
status: string;
|
|
30
|
+
diff_json: string;
|
|
31
|
+
/** JSON-encoded string[] of completed file paths */
|
|
32
|
+
completed: string;
|
|
33
|
+
created_at: number;
|
|
34
|
+
updated_at: number;
|
|
35
|
+
}
|
|
36
|
+
declare class MetadataDB {
|
|
37
|
+
private client;
|
|
38
|
+
readonly dbPath: string;
|
|
39
|
+
private constructor();
|
|
40
|
+
/**
|
|
41
|
+
* Internal: the raw libsql client, for `SQLiteTreeIndex` to run the same
|
|
42
|
+
* atomic batches / queries D1TreeIndex runs on D1 (shared `entries` +
|
|
43
|
+
* `changelog` tables). Kept package-internal — application code must go
|
|
44
|
+
* through AFS / the TreeIndex interface, never this client directly.
|
|
45
|
+
*/
|
|
46
|
+
get rawClient(): _libsql_client3.Client;
|
|
47
|
+
/**
|
|
48
|
+
* Open (or create) _metadata.db in the given directory.
|
|
49
|
+
* Creates the directory if it does not exist.
|
|
50
|
+
*
|
|
51
|
+
* Executes the core schema (entries / cid_cache / sync_checkpoint) AND the
|
|
52
|
+
* Phase 2 changelog table DDL. Changelog DDL is imported from
|
|
53
|
+
* `changelog-schema.ts` so that D1, desktop SQLite, and the Swift/Kotlin
|
|
54
|
+
* runtimes share byte-identical statements (verified by the CI parity
|
|
55
|
+
* check).
|
|
56
|
+
*/
|
|
57
|
+
static open(userDir: string): Promise<MetadataDB>;
|
|
58
|
+
/** Return all file entries (kind='file') for the given scope. */
|
|
59
|
+
getFiles(scope: string, basePath?: string): Promise<EntryRow[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Read the current cid for (scope, path). Internal helper for atomic
|
|
62
|
+
* changelog writes — callers need the old_cid to populate the changelog
|
|
63
|
+
* row. Returns null if the row does not exist OR if its cid is null
|
|
64
|
+
* (directory row).
|
|
65
|
+
*/
|
|
66
|
+
private getCurrentCid;
|
|
67
|
+
/**
|
|
68
|
+
* Upsert a single entry. Writes `entries` + `changelog` atomically via libsql batch.
|
|
69
|
+
*
|
|
70
|
+
* Directory rows (kind='dir') and rows with cid=null never produce a
|
|
71
|
+
* changelog entry — the changelog tracks file content mutations only.
|
|
72
|
+
*/
|
|
73
|
+
upsertEntry(row: EntryRow, opts: PutOpts): Promise<void>;
|
|
74
|
+
/** Upsert multiple entries in a single atomic transaction. */
|
|
75
|
+
upsertEntries(rows: EntryRow[], opts: PutOpts): Promise<void>;
|
|
76
|
+
/** Delete an entry by scope + path. Writes changelog delete row atomically. */
|
|
77
|
+
deleteEntry(scope: string, path: string, opts: PutOpts): Promise<void>;
|
|
78
|
+
/** Delete all file entries for a scope whose paths are NOT in the given set. */
|
|
79
|
+
deleteEntriesNotIn(scope: string, keepPaths: Set<string>, opts: PutOpts): Promise<void>;
|
|
80
|
+
/** Get CID cache entry for a filesystem path. Returns null on cache miss. */
|
|
81
|
+
getCidCache(path: string): Promise<CidCacheRow | null>;
|
|
82
|
+
/** Set (insert or replace) a CID cache entry. */
|
|
83
|
+
setCidCache(row: CidCacheRow): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Get the most recent active checkpoint for the given (direction, remoteUrl, basePath).
|
|
86
|
+
* Returns null when no active session exists.
|
|
87
|
+
*/
|
|
88
|
+
getActiveCheckpoint(direction: string, remoteUrl: string, basePath: string): Promise<CheckpointRow | null>;
|
|
89
|
+
/** Insert a new checkpoint record. */
|
|
90
|
+
createCheckpoint(row: CheckpointRow): Promise<void>;
|
|
91
|
+
/** Update the completed paths list for an active checkpoint. */
|
|
92
|
+
updateCheckpointCompleted(sessionId: string, completedPaths: string[]): Promise<void>;
|
|
93
|
+
/** Mark a checkpoint as done. */
|
|
94
|
+
completeCheckpoint(sessionId: string): Promise<void>;
|
|
95
|
+
/** Get a checkpoint by session_id (for test assertions). */
|
|
96
|
+
getCheckpoint(sessionId: string): Promise<CheckpointRow | null>;
|
|
97
|
+
/** Close the database connection. */
|
|
98
|
+
close(): void;
|
|
99
|
+
}
|
|
100
|
+
//#endregion
|
|
101
|
+
export { CidCacheRow, EntryRow, MetadataDB };
|
|
102
|
+
//# sourceMappingURL=metadata-db.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-db.d.cts","names":[],"sources":["../src/metadata-db.ts"],"mappings":";;;;UA6CiB,QAAA;EACf,KAAA;EACA,IAAA;EACA,MAAA;EACA,IAAA;EACA,IAAA;EACA,GAAA;EACA,IAAA;EACA,SAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,GAAA;EACA,IAAA;EACA,QAAA;EACA,WAAA;AAAA;AAAA,UAGe,aAAA;EACf,UAAA;EACA,SAAA;EACA,UAAA;EACA,SAAA;EACA,MAAA;EACA,SAAA;EADA;EAGA,SAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,cA0GW,UAAA;EAAA,QACH,MAAA;EAAA,SACC,MAAA;EAAA,QAEF,WAAA,CAAA;;;;;;;MAWH,SAAA,CAAA,GAfiB,eAAA,CAeqB,MAAA;EAmOH;;;;;;;;;;EAAA,OArN1B,IAAA,CAAK,OAAA,WAAkB,OAAA,CAAQ,UAAA;EAmaX;EAvP3B,QAAA,CAAS,KAAA,UAAe,QAAA,YAAoB,OAAA,CAAQ,QAAA;EAiQrB;;;;;;EAAA,QAxOvB,aAAA;EAsSkC;;;;;;EAtR1C,WAAA,CAAY,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,OAAA,GAAU,OAAA;EAnO7C;EA+QE,aAAA,CAAc,IAAA,EAAM,QAAA,IAAY,IAAA,EAAM,OAAA,GAAU,OAAA;EAjQzC;EAqUP,WAAA,CAAY,KAAA,UAAe,IAAA,UAAc,IAAA,EAAM,OAAA,GAAU,OAAA;EArU3B;EA+V9B,kBAAA,CAAmB,KAAA,UAAe,SAAA,EAAW,GAAA,UAAa,IAAA,EAAM,OAAA,GAAU,OAAA;EAnL1E;EAuPA,WAAA,CAAY,IAAA,WAAe,OAAA,CAAQ,WAAA;EAvPX;EAiQxB,WAAA,CAAY,GAAA,EAAK,WAAA,GAAc,OAAA;EAjQqB;;;;EA+QpD,mBAAA,CACJ,SAAA,UACA,SAAA,UACA,QAAA,WACC,OAAA,CAAQ,aAAA;EA1O4B;EAoPjC,gBAAA,CAAiB,GAAA,EAAK,aAAA,GAAgB,OAAA;EApPK;EAsQ3C,yBAAA,CAA0B,SAAA,UAAmB,cAAA,aAA2B,OAAA;EA1NpD;EAkOpB,kBAAA,CAAmB,SAAA,WAAoB,OAAA;EAlOD;EA0OtC,aAAA,CAAc,SAAA,WAAoB,OAAA,CAAQ,aAAA;EA1OM;EAsPtD,KAAA,CAAA;AAAA"}
|