@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,184 @@
|
|
|
1
|
+
import { computeCID } from "./cid.mjs";
|
|
2
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { join, relative, sep } from "node:path";
|
|
4
|
+
|
|
5
|
+
//#region src/reconcile.ts
|
|
6
|
+
/**
|
|
7
|
+
* DIDSpace reconcile engine — Phase 2 (Task 2.2)
|
|
8
|
+
*
|
|
9
|
+
* Compares the local filesystem against _metadata.db and brings the index
|
|
10
|
+
* up to date without reading file content unless necessary.
|
|
11
|
+
*
|
|
12
|
+
* Algorithm (scalability-design §七):
|
|
13
|
+
* 1. Walk filesystem (stat only) — O(n) syscalls, no file reads
|
|
14
|
+
* 2. Read index from _metadata.db — single SQL query
|
|
15
|
+
* 3. Three-way compare per file:
|
|
16
|
+
* - NEW: in FS, not in DB → read file, computeCID, INSERT
|
|
17
|
+
* - MODIFIED: in both, mtime or size differ → re-read, computeCID, UPDATE
|
|
18
|
+
* - UNCHANGED: in both, mtime+size same → skip (CID cache hit)
|
|
19
|
+
* - DELETED: in DB, not in FS → DELETE from entries
|
|
20
|
+
* 4. Batch-update entries + cid_cache
|
|
21
|
+
*/
|
|
22
|
+
/** File names/patterns to exclude from reconcile */
|
|
23
|
+
const EXCLUDED_NAMES = new Set([
|
|
24
|
+
"_metadata.db",
|
|
25
|
+
"_metadata.db-wal",
|
|
26
|
+
"_metadata.db-shm"
|
|
27
|
+
]);
|
|
28
|
+
/** Directory names to skip entirely (they contain sensitive/internal data) */
|
|
29
|
+
const EXCLUDED_DIRS = new Set(["vault", "config"]);
|
|
30
|
+
function isExcluded(name) {
|
|
31
|
+
if (EXCLUDED_NAMES.has(name)) return true;
|
|
32
|
+
if (name.startsWith("data.db")) return true;
|
|
33
|
+
if (name.endsWith("-wal") || name.endsWith("-shm") || name.endsWith("-journal")) return true;
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
/** Convert an absolute filesystem path to a relative AFS-style path (no leading slash). */
|
|
37
|
+
function fsPathToRelative(rootPath, absPath) {
|
|
38
|
+
const rel = relative(rootPath, absPath);
|
|
39
|
+
return sep === "\\" ? rel.replace(/\\/g, "/") : rel;
|
|
40
|
+
}
|
|
41
|
+
function walkFs(rootPath, dir, depth) {
|
|
42
|
+
const results = [];
|
|
43
|
+
let entries;
|
|
44
|
+
try {
|
|
45
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
46
|
+
} catch {
|
|
47
|
+
return results;
|
|
48
|
+
}
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
if (entry.name.startsWith(".")) continue;
|
|
51
|
+
if (isExcluded(entry.name)) continue;
|
|
52
|
+
const absPath = join(dir, entry.name);
|
|
53
|
+
if (entry.isSymbolicLink()) continue;
|
|
54
|
+
if (entry.isDirectory()) {
|
|
55
|
+
if (EXCLUDED_DIRS.has(entry.name)) continue;
|
|
56
|
+
results.push(...walkFs(rootPath, absPath, depth + 1));
|
|
57
|
+
} else if (entry.isFile()) {
|
|
58
|
+
if (depth === 0) continue;
|
|
59
|
+
let st;
|
|
60
|
+
try {
|
|
61
|
+
st = statSync(absPath);
|
|
62
|
+
} catch {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
results.push({
|
|
66
|
+
absPath,
|
|
67
|
+
relPath: fsPathToRelative(rootPath, absPath),
|
|
68
|
+
size: st.size,
|
|
69
|
+
mtimeMs: Math.floor(st.mtimeMs)
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Derive the `parent` path for a given file/dir path (no leading slash convention).
|
|
77
|
+
*
|
|
78
|
+
* Examples:
|
|
79
|
+
* "appA/files/hello.txt" → "appA/files/"
|
|
80
|
+
* "appA/files/" → "appA/"
|
|
81
|
+
* "appA/" → ""
|
|
82
|
+
*/
|
|
83
|
+
function parentOf(path) {
|
|
84
|
+
const p = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
85
|
+
const idx = p.lastIndexOf("/");
|
|
86
|
+
if (idx < 0) return "";
|
|
87
|
+
return p.slice(0, idx + 1);
|
|
88
|
+
}
|
|
89
|
+
/** Derive the basename (name) from a path (no leading slash convention). */
|
|
90
|
+
function nameOf(path) {
|
|
91
|
+
const p = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
92
|
+
const idx = p.lastIndexOf("/");
|
|
93
|
+
return idx < 0 ? p : p.slice(idx + 1);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Reconcile the local filesystem against _metadata.db.
|
|
97
|
+
* Returns stats about the reconcile operation.
|
|
98
|
+
*/
|
|
99
|
+
async function reconcile(options) {
|
|
100
|
+
const { rootPath, scope, metadataDb } = options;
|
|
101
|
+
const start = Date.now();
|
|
102
|
+
const fsFiles = walkFs(rootPath, rootPath, 0);
|
|
103
|
+
const fsMap = /* @__PURE__ */ new Map();
|
|
104
|
+
for (const f of fsFiles) fsMap.set(f.relPath, {
|
|
105
|
+
size: f.size,
|
|
106
|
+
mtimeMs: f.mtimeMs,
|
|
107
|
+
absPath: f.absPath
|
|
108
|
+
});
|
|
109
|
+
const dbFiles = await metadataDb.getFiles(scope);
|
|
110
|
+
const dbMap = /* @__PURE__ */ new Map();
|
|
111
|
+
for (const row of dbFiles) dbMap.set(row.path, row);
|
|
112
|
+
const toUpsert = [];
|
|
113
|
+
const toDelete = [];
|
|
114
|
+
const now = Date.now();
|
|
115
|
+
let added = 0;
|
|
116
|
+
let modified = 0;
|
|
117
|
+
let unchanged = 0;
|
|
118
|
+
for (const [relPath, fsInfo] of fsMap) {
|
|
119
|
+
const dbEntry = dbMap.get(relPath);
|
|
120
|
+
if (!dbEntry) {
|
|
121
|
+
const cid = await computeCidWithCache(metadataDb, fsInfo.absPath, fsInfo.size, fsInfo.mtimeMs);
|
|
122
|
+
toUpsert.push({
|
|
123
|
+
scope,
|
|
124
|
+
path: relPath,
|
|
125
|
+
parent: parentOf(relPath),
|
|
126
|
+
name: nameOf(relPath),
|
|
127
|
+
kind: "file",
|
|
128
|
+
cid,
|
|
129
|
+
size: fsInfo.size,
|
|
130
|
+
mime_type: null,
|
|
131
|
+
ctime: now,
|
|
132
|
+
mtime: fsInfo.mtimeMs
|
|
133
|
+
});
|
|
134
|
+
added++;
|
|
135
|
+
} else if (fsInfo.size !== dbEntry.size || fsInfo.mtimeMs !== dbEntry.mtime) {
|
|
136
|
+
const cid = await computeCidWithCache(metadataDb, fsInfo.absPath, fsInfo.size, fsInfo.mtimeMs);
|
|
137
|
+
toUpsert.push({
|
|
138
|
+
...dbEntry,
|
|
139
|
+
cid,
|
|
140
|
+
size: fsInfo.size,
|
|
141
|
+
mtime: fsInfo.mtimeMs
|
|
142
|
+
});
|
|
143
|
+
modified++;
|
|
144
|
+
} else unchanged++;
|
|
145
|
+
}
|
|
146
|
+
for (const [dbPath] of dbMap) if (!fsMap.has(dbPath)) toDelete.push(dbPath);
|
|
147
|
+
const reconcileOpts = { deviceId: "desktop:default" };
|
|
148
|
+
if (toUpsert.length > 0) for (let i = 0; i < toUpsert.length; i += 500) await metadataDb.upsertEntries(toUpsert.slice(i, i + 500), reconcileOpts);
|
|
149
|
+
for (const path of toDelete) await metadataDb.deleteEntry(scope, path, reconcileOpts);
|
|
150
|
+
return {
|
|
151
|
+
added,
|
|
152
|
+
modified,
|
|
153
|
+
unchanged,
|
|
154
|
+
deleted: toDelete.length,
|
|
155
|
+
elapsed: Date.now() - start
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get CID for a file — use cid_cache if mtime+size match, else compute and cache.
|
|
160
|
+
*/
|
|
161
|
+
async function computeCidWithCache(metadataDb, absPath, size, mtimeMs) {
|
|
162
|
+
const cached = await metadataDb.getCidCache(absPath);
|
|
163
|
+
if (cached && cached.mtime_ms === mtimeMs && cached.size === size) return cached.cid;
|
|
164
|
+
let content;
|
|
165
|
+
try {
|
|
166
|
+
const buf = readFileSync(absPath);
|
|
167
|
+
content = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
168
|
+
} catch {
|
|
169
|
+
content = new Uint8Array(0);
|
|
170
|
+
}
|
|
171
|
+
const cid = await computeCID(content);
|
|
172
|
+
await metadataDb.setCidCache({
|
|
173
|
+
path: absPath,
|
|
174
|
+
cid,
|
|
175
|
+
size,
|
|
176
|
+
mtime_ms: mtimeMs,
|
|
177
|
+
computed_at: Date.now()
|
|
178
|
+
});
|
|
179
|
+
return cid;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//#endregion
|
|
183
|
+
export { reconcile };
|
|
184
|
+
//# sourceMappingURL=reconcile.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.mjs","names":[],"sources":["../src/reconcile.ts"],"sourcesContent":["/**\n * DIDSpace reconcile engine — Phase 2 (Task 2.2)\n *\n * Compares the local filesystem against _metadata.db and brings the index\n * up to date without reading file content unless necessary.\n *\n * Algorithm (scalability-design §七):\n * 1. Walk filesystem (stat only) — O(n) syscalls, no file reads\n * 2. Read index from _metadata.db — single SQL query\n * 3. Three-way compare per file:\n * - NEW: in FS, not in DB → read file, computeCID, INSERT\n * - MODIFIED: in both, mtime or size differ → re-read, computeCID, UPDATE\n * - UNCHANGED: in both, mtime+size same → skip (CID cache hit)\n * - DELETED: in DB, not in FS → DELETE from entries\n * 4. Batch-update entries + cid_cache\n */\n\n// biome-ignore lint/style/noRestrictedImports: reconcile is provider-internal Node-only code\nimport { readdirSync, readFileSync, statSync } from \"node:fs\";\n// biome-ignore lint/style/noRestrictedImports: reconcile is provider-internal Node-only code\nimport { join, relative, sep } from \"node:path\";\nimport { computeCID } from \"./cid.js\";\nimport type { EntryRow, MetadataDB } from \"./metadata-db.js\";\n\nexport interface ReconcileOptions {\n /** Root directory of the user's DID space (e.g. ~/.afs/spaces/{userDid}/) */\n rootPath: string;\n /** userDid used as scope in the entries table */\n scope: string;\n /** MetadataDB instance (already opened) */\n metadataDb: MetadataDB;\n}\n\nexport interface ReconcileStats {\n added: number;\n modified: number;\n unchanged: number;\n deleted: number;\n elapsed: number;\n}\n\n/** File names/patterns to exclude from reconcile */\nconst EXCLUDED_NAMES = new Set([\"_metadata.db\", \"_metadata.db-wal\", \"_metadata.db-shm\"]);\n\n/** Directory names to skip entirely (they contain sensitive/internal data) */\nconst EXCLUDED_DIRS = new Set([\"vault\", \"config\"]);\n\nfunction isExcluded(name: string): boolean {\n if (EXCLUDED_NAMES.has(name)) return true;\n // App SQLite database and its WAL/SHM journal files\n if (name.startsWith(\"data.db\")) return true;\n // SQLite temp files (any .db-wal, .db-shm, .db-journal)\n if (name.endsWith(\"-wal\") || name.endsWith(\"-shm\") || name.endsWith(\"-journal\")) return true;\n return false;\n}\n\n/** Convert an absolute filesystem path to a relative AFS-style path (no leading slash). */\nfunction fsPathToRelative(rootPath: string, absPath: string): string {\n const rel = relative(rootPath, absPath);\n // Normalize to forward slashes on Windows\n return sep === \"\\\\\" ? rel.replace(/\\\\/g, \"/\") : rel;\n}\n\n/**\n * Walk the filesystem rooted at `dir` and collect all regular files.\n * Does NOT follow symlinks (lstat is used implicitly via readdirSync withFileTypes).\n * Returns: Array of { absPath, relPath, size, mtimeMs }\n */\ninterface FsFile {\n absPath: string;\n relPath: string; // relative to rootPath, no leading slash\n size: number;\n mtimeMs: number;\n}\n\nfunction walkFs(rootPath: string, dir: string, depth: number): FsFile[] {\n // Safety: skip files directly under rootPath (depth 0 items are internal, e.g. _metadata.db)\n // Only index files inside app subdirectories (depth >= 1).\n const results: FsFile[] = [];\n\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith(\".\")) continue; // skip hidden files (.DS_Store, etc.)\n if (isExcluded(entry.name)) continue;\n\n const absPath = join(dir, entry.name);\n\n if (entry.isSymbolicLink()) {\n // Never follow symlinks — could escape rootPath\n continue;\n }\n\n if (entry.isDirectory()) {\n // Skip internal directories (vault, config) — they contain sensitive/non-synced data\n if (EXCLUDED_DIRS.has(entry.name)) continue;\n results.push(...walkFs(rootPath, absPath, depth + 1));\n } else if (entry.isFile()) {\n // Skip files at depth 0 (directly in rootPath — internal files)\n if (depth === 0) continue;\n\n let st: ReturnType<typeof statSync>;\n try {\n st = statSync(absPath);\n } catch {\n continue; // file disappeared between readdir and stat\n }\n\n results.push({\n absPath,\n relPath: fsPathToRelative(rootPath, absPath),\n size: st.size,\n mtimeMs: Math.floor(st.mtimeMs),\n });\n }\n }\n\n return results;\n}\n\n/**\n * Derive the `parent` path for a given file/dir path (no leading slash convention).\n *\n * Examples:\n * \"appA/files/hello.txt\" → \"appA/files/\"\n * \"appA/files/\" → \"appA/\"\n * \"appA/\" → \"\"\n */\nfunction parentOf(path: string): string {\n const p = path.endsWith(\"/\") ? path.slice(0, -1) : path;\n const idx = p.lastIndexOf(\"/\");\n if (idx < 0) return \"\";\n return p.slice(0, idx + 1);\n}\n\n/** Derive the basename (name) from a path (no leading slash convention). */\nfunction nameOf(path: string): string {\n const p = path.endsWith(\"/\") ? path.slice(0, -1) : path;\n const idx = p.lastIndexOf(\"/\");\n return idx < 0 ? p : p.slice(idx + 1);\n}\n\n/**\n * Reconcile the local filesystem against _metadata.db.\n * Returns stats about the reconcile operation.\n */\nexport async function reconcile(options: ReconcileOptions): Promise<ReconcileStats> {\n const { rootPath, scope, metadataDb } = options;\n const start = Date.now();\n\n // Step 1: Walk filesystem (stat only)\n const fsFiles = walkFs(rootPath, rootPath, 0);\n const fsMap = new Map<string, { size: number; mtimeMs: number; absPath: string }>();\n for (const f of fsFiles) {\n fsMap.set(f.relPath, { size: f.size, mtimeMs: f.mtimeMs, absPath: f.absPath });\n }\n\n // Step 2: Read current index\n const dbFiles = await metadataDb.getFiles(scope);\n const dbMap = new Map<string, EntryRow>();\n for (const row of dbFiles) {\n dbMap.set(row.path, row);\n }\n\n // Step 3: Three-way compare\n const toUpsert: EntryRow[] = [];\n const toDelete: string[] = [];\n const now = Date.now();\n\n let added = 0;\n let modified = 0;\n let unchanged = 0;\n\n for (const [relPath, fsInfo] of fsMap) {\n const dbEntry = dbMap.get(relPath);\n\n if (!dbEntry) {\n // NEW: compute CID and insert\n const cid = await computeCidWithCache(\n metadataDb,\n fsInfo.absPath,\n fsInfo.size,\n fsInfo.mtimeMs,\n );\n toUpsert.push({\n scope,\n path: relPath,\n parent: parentOf(relPath),\n name: nameOf(relPath),\n kind: \"file\",\n cid,\n size: fsInfo.size,\n mime_type: null,\n ctime: now,\n mtime: fsInfo.mtimeMs,\n });\n added++;\n } else if (fsInfo.size !== dbEntry.size || fsInfo.mtimeMs !== dbEntry.mtime) {\n // MODIFIED: re-read and recompute CID\n const cid = await computeCidWithCache(\n metadataDb,\n fsInfo.absPath,\n fsInfo.size,\n fsInfo.mtimeMs,\n );\n toUpsert.push({\n ...dbEntry,\n cid,\n size: fsInfo.size,\n mtime: fsInfo.mtimeMs,\n });\n modified++;\n } else {\n // UNCHANGED\n unchanged++;\n }\n }\n\n // DELETED: in DB but not in FS\n for (const [dbPath] of dbMap) {\n if (!fsMap.has(dbPath)) {\n toDelete.push(dbPath);\n }\n }\n\n // Step 4: Apply batch updates\n // Task 2.4a: reconcile is a desktop-side reconciliation loop, not a real\n // device write. Use the `desktop:default` sentinel deviceId — real per-device\n // tracking will land when the mobile polling scheduler (Task 3.x) introduces\n // actual device UUIDs.\n const reconcileOpts = { deviceId: \"desktop:default\" } as const;\n if (toUpsert.length > 0) {\n // Batch in chunks of 500 to avoid excessive statement count\n for (let i = 0; i < toUpsert.length; i += 500) {\n await metadataDb.upsertEntries(toUpsert.slice(i, i + 500), reconcileOpts);\n }\n }\n\n for (const path of toDelete) {\n await metadataDb.deleteEntry(scope, path, reconcileOpts);\n }\n\n return {\n added,\n modified,\n unchanged,\n deleted: toDelete.length,\n elapsed: Date.now() - start,\n };\n}\n\n/**\n * Get CID for a file — use cid_cache if mtime+size match, else compute and cache.\n */\nasync function computeCidWithCache(\n metadataDb: MetadataDB,\n absPath: string,\n size: number,\n mtimeMs: number,\n): Promise<string> {\n const cached = await metadataDb.getCidCache(absPath);\n if (cached && cached.mtime_ms === mtimeMs && cached.size === size) {\n return cached.cid;\n }\n\n // Cache miss — read file and compute CID\n let content: Uint8Array;\n try {\n const buf = readFileSync(absPath);\n content = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n } catch {\n // File disappeared between stat and read — return empty CID\n content = new Uint8Array(0);\n }\n\n const cid = await computeCID(content);\n\n // Update cache\n await metadataDb.setCidCache({\n path: absPath,\n cid,\n size,\n mtime_ms: mtimeMs,\n computed_at: Date.now(),\n });\n\n return cid;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/reference-check.ts
|
|
3
|
+
/** entries-only liveness UNION non-expired prepared upload-session refs. */
|
|
4
|
+
const REFERENCED_ANYWHERE_SQL = "SELECT 1 FROM ds_entries WHERE cid = ? UNION ALL SELECT 1 FROM ds_upload_session_entries e JOIN ds_upload_sessions s ON e.session_id = s.id WHERE e.cid = ? AND s.status = 'prepared' AND s.expires_at > ? LIMIT 1";
|
|
5
|
+
/** Fallback when the upload-session tables don't exist yet (old/partial DB). */
|
|
6
|
+
const ENTRIES_ONLY_SQL = "SELECT 1 FROM ds_entries WHERE cid = ? LIMIT 1";
|
|
7
|
+
/**
|
|
8
|
+
* True when the error is the upload-session tables being absent. On such a DB
|
|
9
|
+
* there are no prepared sessions anyway, so entries-only is the correct answer
|
|
10
|
+
* — keeps the GC sweep working on DBs predating migration 0108.
|
|
11
|
+
*/
|
|
12
|
+
function isMissingUploadTable(err) {
|
|
13
|
+
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
14
|
+
return msg.includes("no such table") && msg.includes("upload_session");
|
|
15
|
+
}
|
|
16
|
+
/** D1 backend (Cloudflare). */
|
|
17
|
+
async function referencedAnywhereD1(db, cid, nowMs = Date.now()) {
|
|
18
|
+
if (!cid) return false;
|
|
19
|
+
try {
|
|
20
|
+
return await db.prepare(REFERENCED_ANYWHERE_SQL).bind(cid, cid, nowMs).first() !== null;
|
|
21
|
+
} catch (err) {
|
|
22
|
+
if (!isMissingUploadTable(err)) throw err;
|
|
23
|
+
return await db.prepare(ENTRIES_ONLY_SQL).bind(cid).first() !== null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** libsql backend (Node `_metadata.db`). */
|
|
27
|
+
async function referencedAnywhereLibsql(client, cid, nowMs = Date.now()) {
|
|
28
|
+
if (!cid) return false;
|
|
29
|
+
try {
|
|
30
|
+
return (await client.execute({
|
|
31
|
+
sql: REFERENCED_ANYWHERE_SQL,
|
|
32
|
+
args: [
|
|
33
|
+
cid,
|
|
34
|
+
cid,
|
|
35
|
+
nowMs
|
|
36
|
+
]
|
|
37
|
+
})).rows.length > 0;
|
|
38
|
+
} catch (err) {
|
|
39
|
+
if (!isMissingUploadTable(err)) throw err;
|
|
40
|
+
return (await client.execute({
|
|
41
|
+
sql: ENTRIES_ONLY_SQL,
|
|
42
|
+
args: [cid]
|
|
43
|
+
})).rows.length > 0;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
exports.referencedAnywhereD1 = referencedAnywhereD1;
|
|
49
|
+
exports.referencedAnywhereLibsql = referencedAnywhereLibsql;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Client } from "@libsql/client";
|
|
2
|
+
|
|
3
|
+
//#region src/reference-check.d.ts
|
|
4
|
+
/** D1 backend (Cloudflare). */
|
|
5
|
+
declare function referencedAnywhereD1(db: D1Database, cid: string, nowMs?: number): Promise<boolean>;
|
|
6
|
+
/** libsql backend (Node `_metadata.db`). */
|
|
7
|
+
declare function referencedAnywhereLibsql(client: Client, cid: string, nowMs?: number): Promise<boolean>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { referencedAnywhereD1, referencedAnywhereLibsql };
|
|
10
|
+
//# sourceMappingURL=reference-check.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-check.d.cts","names":[],"sources":["../src/reference-check.ts"],"mappings":";;;;iBAmDsB,oBAAA,CACpB,EAAA,EAAI,UAAA,EACJ,GAAA,UACA,KAAA,YACC,OAAA;;iBAamB,wBAAA,CACpB,MAAA,EAAQ,MAAA,EACR,GAAA,UACA,KAAA,YACC,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Client } from "@libsql/client";
|
|
2
|
+
|
|
3
|
+
//#region src/reference-check.d.ts
|
|
4
|
+
/** D1 backend (Cloudflare). */
|
|
5
|
+
declare function referencedAnywhereD1(db: D1Database, cid: string, nowMs?: number): Promise<boolean>;
|
|
6
|
+
/** libsql backend (Node `_metadata.db`). */
|
|
7
|
+
declare function referencedAnywhereLibsql(client: Client, cid: string, nowMs?: number): Promise<boolean>;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { referencedAnywhereD1, referencedAnywhereLibsql };
|
|
10
|
+
//# sourceMappingURL=reference-check.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-check.d.mts","names":[],"sources":["../src/reference-check.ts"],"mappings":";;;;iBAmDsB,oBAAA,CACpB,EAAA,EAAI,UAAA,EACJ,GAAA,UACA,KAAA,YACC,OAAA;;iBAamB,wBAAA,CACpB,MAAA,EAAQ,MAAA,EACR,GAAA,UACA,KAAA,YACC,OAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/reference-check.ts
|
|
2
|
+
/** entries-only liveness UNION non-expired prepared upload-session refs. */
|
|
3
|
+
const REFERENCED_ANYWHERE_SQL = "SELECT 1 FROM ds_entries WHERE cid = ? UNION ALL SELECT 1 FROM ds_upload_session_entries e JOIN ds_upload_sessions s ON e.session_id = s.id WHERE e.cid = ? AND s.status = 'prepared' AND s.expires_at > ? LIMIT 1";
|
|
4
|
+
/** Fallback when the upload-session tables don't exist yet (old/partial DB). */
|
|
5
|
+
const ENTRIES_ONLY_SQL = "SELECT 1 FROM ds_entries WHERE cid = ? LIMIT 1";
|
|
6
|
+
/**
|
|
7
|
+
* True when the error is the upload-session tables being absent. On such a DB
|
|
8
|
+
* there are no prepared sessions anyway, so entries-only is the correct answer
|
|
9
|
+
* — keeps the GC sweep working on DBs predating migration 0108.
|
|
10
|
+
*/
|
|
11
|
+
function isMissingUploadTable(err) {
|
|
12
|
+
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
13
|
+
return msg.includes("no such table") && msg.includes("upload_session");
|
|
14
|
+
}
|
|
15
|
+
/** D1 backend (Cloudflare). */
|
|
16
|
+
async function referencedAnywhereD1(db, cid, nowMs = Date.now()) {
|
|
17
|
+
if (!cid) return false;
|
|
18
|
+
try {
|
|
19
|
+
return await db.prepare(REFERENCED_ANYWHERE_SQL).bind(cid, cid, nowMs).first() !== null;
|
|
20
|
+
} catch (err) {
|
|
21
|
+
if (!isMissingUploadTable(err)) throw err;
|
|
22
|
+
return await db.prepare(ENTRIES_ONLY_SQL).bind(cid).first() !== null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** libsql backend (Node `_metadata.db`). */
|
|
26
|
+
async function referencedAnywhereLibsql(client, cid, nowMs = Date.now()) {
|
|
27
|
+
if (!cid) return false;
|
|
28
|
+
try {
|
|
29
|
+
return (await client.execute({
|
|
30
|
+
sql: REFERENCED_ANYWHERE_SQL,
|
|
31
|
+
args: [
|
|
32
|
+
cid,
|
|
33
|
+
cid,
|
|
34
|
+
nowMs
|
|
35
|
+
]
|
|
36
|
+
})).rows.length > 0;
|
|
37
|
+
} catch (err) {
|
|
38
|
+
if (!isMissingUploadTable(err)) throw err;
|
|
39
|
+
return (await client.execute({
|
|
40
|
+
sql: ENTRIES_ONLY_SQL,
|
|
41
|
+
args: [cid]
|
|
42
|
+
})).rows.length > 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
export { referencedAnywhereD1, referencedAnywhereLibsql };
|
|
48
|
+
//# sourceMappingURL=reference-check.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-check.mjs","names":[],"sources":["../src/reference-check.ts"],"sourcesContent":["/**\n * reference-check.ts — scope-blind GC-liveness helper (design §4.4b + §9).\n *\n * Answers \"does a LIVE file anywhere — OR a non-expired in-flight upload —\n * point at this cid?\" for the `runGc` sweeper. Two UNION'd predicates:\n *\n * 1. `entries` only — counting changelog refs would pin every overwritten cid\n * forever (its own historical put/delete rows reference it). scope-blind:\n * under the global object pool (Model B) an object is shared across users,\n * so a live reference in ANY scope must keep it.\n * 2. non-expired `prepared` upload sessions (design §9 in-flight protection) —\n * bytes already uploaded but not yet committed must NOT be GC'd. This CANNOT\n * lean on the 7-day grace window: prepared TTL is hours (≪ grace), so a\n * just-uploaded object would fall inside the grace window and be deleted.\n * `expires_at > nowMs` uses a STRICT `>`: a session exactly at expiry is no\n * longer protected (it can be swept + reclaimed).\n *\n * `nowMs` is passed at CALL time (default `Date.now()`), never bound at\n * construction — a long-lived isolate must not capture a stale \"now\" that would\n * over-protect expired sessions (design §9 / tasks T1.4). `runGc` passes ONE\n * consistent sweep-time `nowMs` to every call so a sweep judges expiry uniformly.\n *\n * Do NOT reuse the legacy `D1GCQueue.isReferenced` here — it is the three-way\n * (entries ∪ changelog.cid ∪ changelog.old_cid) READ-AUTH check, a different\n * question (design §3).\n */\n\nimport type { Client as LibsqlClient } from \"@libsql/client\";\n\n/** entries-only liveness UNION non-expired prepared upload-session refs. */\nconst REFERENCED_ANYWHERE_SQL =\n \"SELECT 1 FROM ds_entries WHERE cid = ? \" +\n \"UNION ALL \" +\n \"SELECT 1 FROM ds_upload_session_entries e JOIN ds_upload_sessions s ON e.session_id = s.id \" +\n \"WHERE e.cid = ? AND s.status = 'prepared' AND s.expires_at > ? \" +\n \"LIMIT 1\";\n\n/** Fallback when the upload-session tables don't exist yet (old/partial DB). */\nconst ENTRIES_ONLY_SQL = \"SELECT 1 FROM ds_entries WHERE cid = ? LIMIT 1\";\n\n/**\n * True when the error is the upload-session tables being absent. On such a DB\n * there are no prepared sessions anyway, so entries-only is the correct answer\n * — keeps the GC sweep working on DBs predating migration 0108.\n */\nfunction isMissingUploadTable(err: unknown): boolean {\n const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();\n return msg.includes(\"no such table\") && msg.includes(\"upload_session\");\n}\n\n/** D1 backend (Cloudflare). */\nexport async function referencedAnywhereD1(\n db: D1Database,\n cid: string,\n nowMs: number = Date.now(),\n): Promise<boolean> {\n if (!cid) return false;\n try {\n const row = await db.prepare(REFERENCED_ANYWHERE_SQL).bind(cid, cid, nowMs).first();\n return row !== null;\n } catch (err) {\n if (!isMissingUploadTable(err)) throw err;\n const row = await db.prepare(ENTRIES_ONLY_SQL).bind(cid).first();\n return row !== null;\n }\n}\n\n/** libsql backend (Node `_metadata.db`). */\nexport async function referencedAnywhereLibsql(\n client: LibsqlClient,\n cid: string,\n nowMs: number = Date.now(),\n): Promise<boolean> {\n if (!cid) return false;\n try {\n const result = await client.execute({ sql: REFERENCED_ANYWHERE_SQL, args: [cid, cid, nowMs] });\n return result.rows.length > 0;\n } catch (err) {\n if (!isMissingUploadTable(err)) throw err;\n const result = await client.execute({ sql: ENTRIES_ONLY_SQL, args: [cid] });\n return result.rows.length > 0;\n }\n}\n"],"mappings":";;AA8BA,MAAM,0BACJ;;AAOF,MAAM,mBAAmB;;;;;;AAOzB,SAAS,qBAAqB,KAAuB;CACnD,MAAM,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,EAAE,aAAa;AAC5E,QAAO,IAAI,SAAS,gBAAgB,IAAI,IAAI,SAAS,iBAAiB;;;AAIxE,eAAsB,qBACpB,IACA,KACA,QAAgB,KAAK,KAAK,EACR;AAClB,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI;AAEF,SADY,MAAM,GAAG,QAAQ,wBAAwB,CAAC,KAAK,KAAK,KAAK,MAAM,CAAC,OAAO,KACpE;UACR,KAAK;AACZ,MAAI,CAAC,qBAAqB,IAAI,CAAE,OAAM;AAEtC,SADY,MAAM,GAAG,QAAQ,iBAAiB,CAAC,KAAK,IAAI,CAAC,OAAO,KACjD;;;;AAKnB,eAAsB,yBACpB,QACA,KACA,QAAgB,KAAK,KAAK,EACR;AAClB,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI;AAEF,UADe,MAAM,OAAO,QAAQ;GAAE,KAAK;GAAyB,MAAM;IAAC;IAAK;IAAK;IAAM;GAAE,CAAC,EAChF,KAAK,SAAS;UACrB,KAAK;AACZ,MAAI,CAAC,qBAAqB,IAAI,CAAE,OAAM;AAEtC,UADe,MAAM,OAAO,QAAQ;GAAE,KAAK;GAAkB,MAAM,CAAC,IAAI;GAAE,CAAC,EAC7D,KAAK,SAAS"}
|