@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,22 @@
|
|
|
1
|
+
import { GcQueue } from "./gc-queue.cjs";
|
|
2
|
+
import { Client } from "@libsql/client";
|
|
3
|
+
|
|
4
|
+
//#region src/sqlite-gc-queue.d.ts
|
|
5
|
+
declare class SqliteGcQueue implements GcQueue {
|
|
6
|
+
private readonly client;
|
|
7
|
+
constructor(client: Client);
|
|
8
|
+
ensureTable(): Promise<void>;
|
|
9
|
+
enqueue(cids: string[]): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Enqueue with an explicit `queued_at` — used by the conformance suite to
|
|
12
|
+
* exercise the grace boundary deterministically. Not part of `GcQueue`.
|
|
13
|
+
*/
|
|
14
|
+
enqueueAt(cids: string[], queuedAt: number): Promise<void>;
|
|
15
|
+
fetchCandidates(limit?: number, graceMs?: number): Promise<Array<{
|
|
16
|
+
cid: string;
|
|
17
|
+
}>>;
|
|
18
|
+
remove(cid: string): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { SqliteGcQueue };
|
|
22
|
+
//# sourceMappingURL=sqlite-gc-queue.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-gc-queue.d.cts","names":[],"sources":["../src/sqlite-gc-queue.ts"],"mappings":";;;;cAiBa,aAAA,YAAyB,OAAA;EAAA,iBACP,MAAA;cAAA,MAAA,EAAQ,MAAA;EAE/B,WAAA,CAAA,GAAe,OAAA;EAef,OAAA,CAAQ,IAAA,aAAiB,OAAA;EAlBY;;;;EA2BrC,SAAA,CAAU,IAAA,YAAgB,QAAA,WAAmB,OAAA;EAS7C,eAAA,CAAgB,KAAA,WAAa,OAAA,YAA6B,OAAA,CAAQ,KAAA;IAAQ,GAAA;EAAA;EAS1E,MAAA,CAAO,GAAA,WAAc,OAAA;AAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { GcQueue } from "./gc-queue.mjs";
|
|
2
|
+
import { Client } from "@libsql/client";
|
|
3
|
+
|
|
4
|
+
//#region src/sqlite-gc-queue.d.ts
|
|
5
|
+
declare class SqliteGcQueue implements GcQueue {
|
|
6
|
+
private readonly client;
|
|
7
|
+
constructor(client: Client);
|
|
8
|
+
ensureTable(): Promise<void>;
|
|
9
|
+
enqueue(cids: string[]): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Enqueue with an explicit `queued_at` — used by the conformance suite to
|
|
12
|
+
* exercise the grace boundary deterministically. Not part of `GcQueue`.
|
|
13
|
+
*/
|
|
14
|
+
enqueueAt(cids: string[], queuedAt: number): Promise<void>;
|
|
15
|
+
fetchCandidates(limit?: number, graceMs?: number): Promise<Array<{
|
|
16
|
+
cid: string;
|
|
17
|
+
}>>;
|
|
18
|
+
remove(cid: string): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { SqliteGcQueue };
|
|
22
|
+
//# sourceMappingURL=sqlite-gc-queue.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-gc-queue.d.mts","names":[],"sources":["../src/sqlite-gc-queue.ts"],"mappings":";;;;cAiBa,aAAA,YAAyB,OAAA;EAAA,iBACP,MAAA;cAAA,MAAA,EAAQ,MAAA;EAE/B,WAAA,CAAA,GAAe,OAAA;EAef,OAAA,CAAQ,IAAA,aAAiB,OAAA;EAlBY;;;;EA2BrC,SAAA,CAAU,IAAA,YAAgB,QAAA,WAAmB,OAAA;EAS7C,eAAA,CAAgB,KAAA,WAAa,OAAA,YAA6B,OAAA,CAAQ,KAAA;IAAQ,GAAA;EAAA;EAS1E,MAAA,CAAO,GAAA,WAAc,OAAA;AAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { GC_QUEUE_INDEX_SQL } from "./d1-schema.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/sqlite-gc-queue.ts
|
|
4
|
+
/** Default grace matches `D1GCQueue` (2h) for cross-impl parity. `runGc` always
|
|
5
|
+
* overrides with the canonical 7d, so this default is never relied upon. */
|
|
6
|
+
const DEFAULT_GRACE_MS = 7200 * 1e3;
|
|
7
|
+
var SqliteGcQueue = class {
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
async ensureTable() {
|
|
12
|
+
await this.client.execute(`CREATE TABLE IF NOT EXISTS ds_gc_queue (
|
|
13
|
+
cid TEXT NOT NULL,
|
|
14
|
+
queued_at INTEGER NOT NULL,
|
|
15
|
+
PRIMARY KEY (cid)
|
|
16
|
+
)`);
|
|
17
|
+
for (const sql of GC_QUEUE_INDEX_SQL) await this.client.execute(sql);
|
|
18
|
+
}
|
|
19
|
+
async enqueue(cids) {
|
|
20
|
+
if (cids.length === 0) return;
|
|
21
|
+
await this.enqueueAt(cids, Date.now());
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Enqueue with an explicit `queued_at` — used by the conformance suite to
|
|
25
|
+
* exercise the grace boundary deterministically. Not part of `GcQueue`.
|
|
26
|
+
*/
|
|
27
|
+
async enqueueAt(cids, queuedAt) {
|
|
28
|
+
if (cids.length === 0) return;
|
|
29
|
+
const stmts = cids.map((cid) => ({
|
|
30
|
+
sql: "INSERT INTO ds_gc_queue (cid, queued_at) VALUES (?, ?) ON CONFLICT DO NOTHING",
|
|
31
|
+
args: [cid, queuedAt]
|
|
32
|
+
}));
|
|
33
|
+
await this.client.batch(stmts, "write");
|
|
34
|
+
}
|
|
35
|
+
async fetchCandidates(limit = 500, graceMs = DEFAULT_GRACE_MS) {
|
|
36
|
+
if (limit === 0) return [];
|
|
37
|
+
return (await this.client.execute({
|
|
38
|
+
sql: "SELECT cid FROM ds_gc_queue WHERE queued_at <= ? LIMIT ?",
|
|
39
|
+
args: [Date.now() - graceMs, limit]
|
|
40
|
+
})).rows.map((r) => ({ cid: r.cid }));
|
|
41
|
+
}
|
|
42
|
+
async remove(cid) {
|
|
43
|
+
await this.client.execute({
|
|
44
|
+
sql: "DELETE FROM ds_gc_queue WHERE cid = ?",
|
|
45
|
+
args: [cid]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { SqliteGcQueue };
|
|
52
|
+
//# sourceMappingURL=sqlite-gc-queue.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-gc-queue.mjs","names":[],"sources":["../src/sqlite-gc-queue.ts"],"sourcesContent":["/**\n * SqliteGcQueue — `GcQueue` over the Node `_metadata.db` libsql client.\n *\n * Mirrors `D1GCQueue`'s queue methods (same `gc_queue (cid, queued_at)` schema)\n * but uses the libsql API (`execute`/`batch`) instead of D1's\n * `prepare().bind()`. Pure storage — no reference method (design §4.4); liveness\n * is `referencedAnywhereLibsql` over the same `_metadata.db`.\n */\n\nimport type { InValue, Client as LibsqlClient } from \"@libsql/client\";\nimport { GC_QUEUE_INDEX_SQL } from \"./d1-schema.js\";\nimport type { GcQueue } from \"./gc-queue.js\";\n\n/** Default grace matches `D1GCQueue` (2h) for cross-impl parity. `runGc` always\n * overrides with the canonical 7d, so this default is never relied upon. */\nconst DEFAULT_GRACE_MS = 2 * 60 * 60 * 1000;\n\nexport class SqliteGcQueue implements GcQueue {\n constructor(private readonly client: LibsqlClient) {}\n\n async ensureTable(): Promise<void> {\n await this.client.execute(\n `CREATE TABLE IF NOT EXISTS ds_gc_queue (\n cid TEXT NOT NULL,\n queued_at INTEGER NOT NULL,\n PRIMARY KEY (cid)\n )`,\n );\n // Index the grace-boundary predicate (`queued_at <= ?`) so the sweep range-\n // seeks instead of full-scanning the queue. Node has no migration runner —\n // this guard runs on every `_metadata.db` open, so existing DBs gain the\n // index on next daemon restart (idempotent). Single-source DDL from d1-schema.\n for (const sql of GC_QUEUE_INDEX_SQL) await this.client.execute(sql);\n }\n\n async enqueue(cids: string[]): Promise<void> {\n if (cids.length === 0) return;\n await this.enqueueAt(cids, Date.now());\n }\n\n /**\n * Enqueue with an explicit `queued_at` — used by the conformance suite to\n * exercise the grace boundary deterministically. Not part of `GcQueue`.\n */\n async enqueueAt(cids: string[], queuedAt: number): Promise<void> {\n if (cids.length === 0) return;\n const stmts = cids.map((cid) => ({\n sql: \"INSERT INTO ds_gc_queue (cid, queued_at) VALUES (?, ?) ON CONFLICT DO NOTHING\",\n args: [cid, queuedAt] as InValue[],\n }));\n await this.client.batch(stmts, \"write\");\n }\n\n async fetchCandidates(limit = 500, graceMs = DEFAULT_GRACE_MS): Promise<Array<{ cid: string }>> {\n if (limit === 0) return [];\n const result = await this.client.execute({\n sql: \"SELECT cid FROM ds_gc_queue WHERE queued_at <= ? LIMIT ?\",\n args: [Date.now() - graceMs, limit],\n });\n return result.rows.map((r) => ({ cid: r.cid as string }));\n }\n\n async remove(cid: string): Promise<void> {\n await this.client.execute({ sql: \"DELETE FROM ds_gc_queue WHERE cid = ?\", args: [cid] });\n }\n}\n"],"mappings":";;;;;AAeA,MAAM,mBAAmB,OAAc;AAEvC,IAAa,gBAAb,MAA8C;CAC5C,YAAY,AAAiB,QAAsB;EAAtB;;CAE7B,MAAM,cAA6B;AACjC,QAAM,KAAK,OAAO,QAChB;;;;UAKD;AAKD,OAAK,MAAM,OAAO,mBAAoB,OAAM,KAAK,OAAO,QAAQ,IAAI;;CAGtE,MAAM,QAAQ,MAA+B;AAC3C,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,KAAK,UAAU,MAAM,KAAK,KAAK,CAAC;;;;;;CAOxC,MAAM,UAAU,MAAgB,UAAiC;AAC/D,MAAI,KAAK,WAAW,EAAG;EACvB,MAAM,QAAQ,KAAK,KAAK,SAAS;GAC/B,KAAK;GACL,MAAM,CAAC,KAAK,SAAS;GACtB,EAAE;AACH,QAAM,KAAK,OAAO,MAAM,OAAO,QAAQ;;CAGzC,MAAM,gBAAgB,QAAQ,KAAK,UAAU,kBAAmD;AAC9F,MAAI,UAAU,EAAG,QAAO,EAAE;AAK1B,UAJe,MAAM,KAAK,OAAO,QAAQ;GACvC,KAAK;GACL,MAAM,CAAC,KAAK,KAAK,GAAG,SAAS,MAAM;GACpC,CAAC,EACY,KAAK,KAAK,OAAO,EAAE,KAAK,EAAE,KAAe,EAAE;;CAG3D,MAAM,OAAO,KAA4B;AACvC,QAAM,KAAK,OAAO,QAAQ;GAAE,KAAK;GAAyC,MAAM,CAAC,IAAI;GAAE,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
const require_d1_schema = require('./d1-schema.cjs');
|
|
2
|
+
const require_prefix_range = require('./prefix-range.cjs');
|
|
3
|
+
const require_rename_guard = require('./rename-guard.cjs');
|
|
4
|
+
|
|
5
|
+
//#region src/sqlite-resolve-store.ts
|
|
6
|
+
/** Extract the owner/kind index columns from a JSON value (mirrors D1ResolveStore). */
|
|
7
|
+
function extractIndexFields(value) {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = JSON.parse(value);
|
|
10
|
+
return {
|
|
11
|
+
owner: typeof parsed.owner === "string" ? parsed.owner : null,
|
|
12
|
+
kind: typeof parsed.type === "string" ? parsed.type : null
|
|
13
|
+
};
|
|
14
|
+
} catch {
|
|
15
|
+
return {
|
|
16
|
+
owner: null,
|
|
17
|
+
kind: null
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
var SqliteResolveStore = class {
|
|
22
|
+
ready;
|
|
23
|
+
constructor(dbPath) {
|
|
24
|
+
this.ready = (async () => {
|
|
25
|
+
const { createClient } = await import("@libsql/client");
|
|
26
|
+
const client = createClient({ url: `file:${dbPath}` });
|
|
27
|
+
await require_rename_guard.renameLegacyTable(client, "resolve_entries", "ds_resolve_entries");
|
|
28
|
+
await client.batch([require_d1_schema.RESOLVE_ENTRIES_TABLE_SQL, ...require_d1_schema.RESOLVE_ENTRIES_INDEX_SQL].map((sql) => ({
|
|
29
|
+
sql,
|
|
30
|
+
args: []
|
|
31
|
+
})), "write");
|
|
32
|
+
return client;
|
|
33
|
+
})();
|
|
34
|
+
}
|
|
35
|
+
/** Release the libsql client (DID-Space close / daemon shutdown). */
|
|
36
|
+
async close() {
|
|
37
|
+
(await this.ready.catch(() => void 0))?.close();
|
|
38
|
+
}
|
|
39
|
+
async get(key) {
|
|
40
|
+
const { rows } = await (await this.ready).execute({
|
|
41
|
+
sql: "SELECT value FROM ds_resolve_entries WHERE key = ?",
|
|
42
|
+
args: [key]
|
|
43
|
+
});
|
|
44
|
+
return rows[0] ? String(rows[0].value) : null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Batch get (issue #808) — one `WHERE key IN (...)` query for several keys, so
|
|
48
|
+
* the Node serve path collapses `resolve/blocklet/<host>` + `resolve/domain/
|
|
49
|
+
* <host>` into a single round trip too (parity with the CF D1 store). Missing
|
|
50
|
+
* keys are absent from the map; deduped so a repeated key doesn't widen the list.
|
|
51
|
+
*/
|
|
52
|
+
async getMany(keys) {
|
|
53
|
+
const out = /* @__PURE__ */ new Map();
|
|
54
|
+
const unique = [...new Set(keys)];
|
|
55
|
+
if (unique.length === 0) return out;
|
|
56
|
+
const client = await this.ready;
|
|
57
|
+
const placeholders = unique.map(() => "?").join(",");
|
|
58
|
+
const { rows } = await client.execute({
|
|
59
|
+
sql: `SELECT key, value FROM ds_resolve_entries WHERE key IN (${placeholders})`,
|
|
60
|
+
args: unique
|
|
61
|
+
});
|
|
62
|
+
for (const row of rows) out.set(String(row.key), String(row.value));
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
async put(key, value) {
|
|
66
|
+
const client = await this.ready;
|
|
67
|
+
const strValue = typeof value === "string" ? value : new TextDecoder().decode(value);
|
|
68
|
+
const { owner, kind } = extractIndexFields(strValue);
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
await client.execute({
|
|
71
|
+
sql: `INSERT INTO ds_resolve_entries (key, value, owner, kind, updated_at, created_at) VALUES (?, ?, ?, ?, ?, ?)
|
|
72
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value, owner = excluded.owner, kind = excluded.kind, updated_at = excluded.updated_at`,
|
|
73
|
+
args: [
|
|
74
|
+
key,
|
|
75
|
+
strValue,
|
|
76
|
+
owner,
|
|
77
|
+
kind,
|
|
78
|
+
now,
|
|
79
|
+
now
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async delete(key) {
|
|
84
|
+
await (await this.ready).execute({
|
|
85
|
+
sql: "DELETE FROM ds_resolve_entries WHERE key = ?",
|
|
86
|
+
args: [key]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async list(options) {
|
|
90
|
+
const { sql, args, limit } = this.rangeQuery("SELECT key FROM ds_resolve_entries", options);
|
|
91
|
+
const { rows } = await (await this.ready).execute({
|
|
92
|
+
sql,
|
|
93
|
+
args
|
|
94
|
+
});
|
|
95
|
+
const hasMore = rows.length > limit;
|
|
96
|
+
const selected = hasMore ? rows.slice(0, limit) : rows;
|
|
97
|
+
return {
|
|
98
|
+
keys: selected.map((r) => ({ name: String(r.key) })),
|
|
99
|
+
list_complete: !hasMore,
|
|
100
|
+
cursor: hasMore && selected.length > 0 ? String(selected[selected.length - 1].key) : void 0
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async listWithValues(options) {
|
|
104
|
+
const { sql, args, limit } = this.rangeQuery("SELECT key, value FROM ds_resolve_entries", options);
|
|
105
|
+
const { rows } = await (await this.ready).execute({
|
|
106
|
+
sql,
|
|
107
|
+
args
|
|
108
|
+
});
|
|
109
|
+
const hasMore = rows.length > limit;
|
|
110
|
+
const selected = hasMore ? rows.slice(0, limit) : rows;
|
|
111
|
+
return {
|
|
112
|
+
entries: selected.map((r) => ({
|
|
113
|
+
key: String(r.key),
|
|
114
|
+
value: String(r.value)
|
|
115
|
+
})),
|
|
116
|
+
list_complete: !hasMore,
|
|
117
|
+
cursor: hasMore && selected.length > 0 ? String(selected[selected.length - 1].key) : void 0
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** Like listWithValues but also returns created_at/updated_at (DIDSpaceResolver fast path). */
|
|
121
|
+
async listWithTimestamps(options) {
|
|
122
|
+
const { sql, args, limit } = this.rangeQuery("SELECT key, value, created_at, updated_at FROM ds_resolve_entries", options);
|
|
123
|
+
const { rows } = await (await this.ready).execute({
|
|
124
|
+
sql,
|
|
125
|
+
args
|
|
126
|
+
});
|
|
127
|
+
const hasMore = rows.length > limit;
|
|
128
|
+
const selected = hasMore ? rows.slice(0, limit) : rows;
|
|
129
|
+
return {
|
|
130
|
+
entries: selected.map((r) => ({
|
|
131
|
+
key: String(r.key),
|
|
132
|
+
value: String(r.value),
|
|
133
|
+
created_at: r.created_at == null ? null : Number(r.created_at),
|
|
134
|
+
updated_at: r.updated_at == null ? null : Number(r.updated_at)
|
|
135
|
+
})),
|
|
136
|
+
list_complete: !hasMore,
|
|
137
|
+
cursor: hasMore && selected.length > 0 ? String(selected[selected.length - 1].key) : void 0
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Build a prefix-range + cursor + limit query (shared by list/listWithValues/…). */
|
|
141
|
+
rangeQuery(select, options) {
|
|
142
|
+
const prefix = options?.prefix ?? "";
|
|
143
|
+
const limit = options?.limit && options.limit > 0 ? options.limit : 1e3;
|
|
144
|
+
const cursor = options?.cursor;
|
|
145
|
+
const [lo, hi] = require_prefix_range.prefixRange(prefix);
|
|
146
|
+
const args = [lo, hi];
|
|
147
|
+
let sql = `${select} WHERE key >= ? AND key < ?`;
|
|
148
|
+
if (cursor) {
|
|
149
|
+
sql += " AND key > ?";
|
|
150
|
+
args.push(cursor);
|
|
151
|
+
}
|
|
152
|
+
sql += " ORDER BY key LIMIT ?";
|
|
153
|
+
args.push(limit + 1);
|
|
154
|
+
return {
|
|
155
|
+
sql,
|
|
156
|
+
args,
|
|
157
|
+
limit
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
//#endregion
|
|
163
|
+
exports.SqliteResolveStore = SqliteResolveStore;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { KeyValueStore, KeyValueStoreListWithValuesResult } from "@aigne/afs-kv";
|
|
2
|
+
|
|
3
|
+
//#region src/sqlite-resolve-store.d.ts
|
|
4
|
+
/** `@aigne/afs-kv` re-exports neither of these, so alias locally (KeyValueStore.list shape). */
|
|
5
|
+
type ListOptions = {
|
|
6
|
+
prefix?: string;
|
|
7
|
+
cursor?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
};
|
|
10
|
+
type ListResult = {
|
|
11
|
+
keys: Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
}>;
|
|
14
|
+
list_complete: boolean;
|
|
15
|
+
cursor?: string;
|
|
16
|
+
};
|
|
17
|
+
declare class SqliteResolveStore implements KeyValueStore {
|
|
18
|
+
private readonly ready;
|
|
19
|
+
constructor(dbPath: string);
|
|
20
|
+
/** Release the libsql client (DID-Space close / daemon shutdown). */
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
get(key: string): Promise<string | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Batch get (issue #808) — one `WHERE key IN (...)` query for several keys, so
|
|
25
|
+
* the Node serve path collapses `resolve/blocklet/<host>` + `resolve/domain/
|
|
26
|
+
* <host>` into a single round trip too (parity with the CF D1 store). Missing
|
|
27
|
+
* keys are absent from the map; deduped so a repeated key doesn't widen the list.
|
|
28
|
+
*/
|
|
29
|
+
getMany(keys: string[]): Promise<Map<string, string | null>>;
|
|
30
|
+
put(key: string, value: string | ArrayBuffer): Promise<void>;
|
|
31
|
+
delete(key: string): Promise<void>;
|
|
32
|
+
list(options?: ListOptions): Promise<ListResult>;
|
|
33
|
+
listWithValues(options?: ListOptions): Promise<KeyValueStoreListWithValuesResult>;
|
|
34
|
+
/** Like listWithValues but also returns created_at/updated_at (DIDSpaceResolver fast path). */
|
|
35
|
+
listWithTimestamps(options?: ListOptions): Promise<{
|
|
36
|
+
entries: Array<{
|
|
37
|
+
key: string;
|
|
38
|
+
value: string;
|
|
39
|
+
created_at: number | null;
|
|
40
|
+
updated_at: number | null;
|
|
41
|
+
}>;
|
|
42
|
+
list_complete: boolean;
|
|
43
|
+
cursor?: string;
|
|
44
|
+
}>;
|
|
45
|
+
/** Build a prefix-range + cursor + limit query (shared by list/listWithValues/…). */
|
|
46
|
+
private rangeQuery;
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { SqliteResolveStore };
|
|
50
|
+
//# sourceMappingURL=sqlite-resolve-store.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-resolve-store.d.cts","names":[],"sources":["../src/sqlite-resolve-store.ts"],"mappings":";;;;KA4BK,WAAA;EAAgB,MAAA;EAAiB,MAAA;EAAiB,KAAA;AAAA;AAAA,KAClD,UAAA;EACH,IAAA,EAAM,KAAA;IAAQ,IAAA;EAAA;EACd,aAAA;EACA,MAAA;AAAA;AAAA,cAeW,kBAAA,YAA8B,aAAA;EAAA,iBACxB,KAAA;cAEL,MAAA;EAmFyC;EAjE/C,KAAA,CAAA,GAAS,OAAA;EAKT,GAAA,CAAI,GAAA,WAAc,OAAA;EA+Eb;;;;;;EAhEL,OAAA,CAAQ,IAAA,aAAiB,OAAA,CAAQ,GAAA;EAcjC,GAAA,CAAI,GAAA,UAAa,KAAA,WAAgB,WAAA,GAAc,OAAA;EAY/C,MAAA,CAAO,GAAA,WAAc,OAAA;EAKrB,IAAA,CAAK,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,UAAA;EAcrC,cAAA,CAAe,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iCAAA;EA5D/C;EA8EA,kBAAA,CAAmB,OAAA,GAAU,WAAA,GAAc,OAAA;IAC/C,OAAA,EAAS,KAAA;MACP,GAAA;MACA,KAAA;MACA,UAAA;MACA,UAAA;IAAA;IAEF,aAAA;IACA,MAAA;EAAA;EAzDmD;EAAA,QAiF7C,UAAA;AAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { KeyValueStore, KeyValueStoreListWithValuesResult } from "@aigne/afs-kv";
|
|
2
|
+
|
|
3
|
+
//#region src/sqlite-resolve-store.d.ts
|
|
4
|
+
/** `@aigne/afs-kv` re-exports neither of these, so alias locally (KeyValueStore.list shape). */
|
|
5
|
+
type ListOptions = {
|
|
6
|
+
prefix?: string;
|
|
7
|
+
cursor?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
};
|
|
10
|
+
type ListResult = {
|
|
11
|
+
keys: Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
}>;
|
|
14
|
+
list_complete: boolean;
|
|
15
|
+
cursor?: string;
|
|
16
|
+
};
|
|
17
|
+
declare class SqliteResolveStore implements KeyValueStore {
|
|
18
|
+
private readonly ready;
|
|
19
|
+
constructor(dbPath: string);
|
|
20
|
+
/** Release the libsql client (DID-Space close / daemon shutdown). */
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
get(key: string): Promise<string | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Batch get (issue #808) — one `WHERE key IN (...)` query for several keys, so
|
|
25
|
+
* the Node serve path collapses `resolve/blocklet/<host>` + `resolve/domain/
|
|
26
|
+
* <host>` into a single round trip too (parity with the CF D1 store). Missing
|
|
27
|
+
* keys are absent from the map; deduped so a repeated key doesn't widen the list.
|
|
28
|
+
*/
|
|
29
|
+
getMany(keys: string[]): Promise<Map<string, string | null>>;
|
|
30
|
+
put(key: string, value: string | ArrayBuffer): Promise<void>;
|
|
31
|
+
delete(key: string): Promise<void>;
|
|
32
|
+
list(options?: ListOptions): Promise<ListResult>;
|
|
33
|
+
listWithValues(options?: ListOptions): Promise<KeyValueStoreListWithValuesResult>;
|
|
34
|
+
/** Like listWithValues but also returns created_at/updated_at (DIDSpaceResolver fast path). */
|
|
35
|
+
listWithTimestamps(options?: ListOptions): Promise<{
|
|
36
|
+
entries: Array<{
|
|
37
|
+
key: string;
|
|
38
|
+
value: string;
|
|
39
|
+
created_at: number | null;
|
|
40
|
+
updated_at: number | null;
|
|
41
|
+
}>;
|
|
42
|
+
list_complete: boolean;
|
|
43
|
+
cursor?: string;
|
|
44
|
+
}>;
|
|
45
|
+
/** Build a prefix-range + cursor + limit query (shared by list/listWithValues/…). */
|
|
46
|
+
private rangeQuery;
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { SqliteResolveStore };
|
|
50
|
+
//# sourceMappingURL=sqlite-resolve-store.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-resolve-store.d.mts","names":[],"sources":["../src/sqlite-resolve-store.ts"],"mappings":";;;;KA4BK,WAAA;EAAgB,MAAA;EAAiB,MAAA;EAAiB,KAAA;AAAA;AAAA,KAClD,UAAA;EACH,IAAA,EAAM,KAAA;IAAQ,IAAA;EAAA;EACd,aAAA;EACA,MAAA;AAAA;AAAA,cAeW,kBAAA,YAA8B,aAAA;EAAA,iBACxB,KAAA;cAEL,MAAA;EAmFyC;EAjE/C,KAAA,CAAA,GAAS,OAAA;EAKT,GAAA,CAAI,GAAA,WAAc,OAAA;EA+Eb;;;;;;EAhEL,OAAA,CAAQ,IAAA,aAAiB,OAAA,CAAQ,GAAA;EAcjC,GAAA,CAAI,GAAA,UAAa,KAAA,WAAgB,WAAA,GAAc,OAAA;EAY/C,MAAA,CAAO,GAAA,WAAc,OAAA;EAKrB,IAAA,CAAK,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,UAAA;EAcrC,cAAA,CAAe,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,iCAAA;EA5D/C;EA8EA,kBAAA,CAAmB,OAAA,GAAU,WAAA,GAAc,OAAA;IAC/C,OAAA,EAAS,KAAA;MACP,GAAA;MACA,KAAA;MACA,UAAA;MACA,UAAA;IAAA;IAEF,aAAA;IACA,MAAA;EAAA;EAzDmD;EAAA,QAiF7C,UAAA;AAAA"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { RESOLVE_ENTRIES_INDEX_SQL, RESOLVE_ENTRIES_TABLE_SQL } from "./d1-schema.mjs";
|
|
2
|
+
import { prefixRange } from "./prefix-range.mjs";
|
|
3
|
+
import { renameLegacyTable } from "./rename-guard.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/sqlite-resolve-store.ts
|
|
6
|
+
/** Extract the owner/kind index columns from a JSON value (mirrors D1ResolveStore). */
|
|
7
|
+
function extractIndexFields(value) {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = JSON.parse(value);
|
|
10
|
+
return {
|
|
11
|
+
owner: typeof parsed.owner === "string" ? parsed.owner : null,
|
|
12
|
+
kind: typeof parsed.type === "string" ? parsed.type : null
|
|
13
|
+
};
|
|
14
|
+
} catch {
|
|
15
|
+
return {
|
|
16
|
+
owner: null,
|
|
17
|
+
kind: null
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
var SqliteResolveStore = class {
|
|
22
|
+
ready;
|
|
23
|
+
constructor(dbPath) {
|
|
24
|
+
this.ready = (async () => {
|
|
25
|
+
const { createClient } = await import("@libsql/client");
|
|
26
|
+
const client = createClient({ url: `file:${dbPath}` });
|
|
27
|
+
await renameLegacyTable(client, "resolve_entries", "ds_resolve_entries");
|
|
28
|
+
await client.batch([RESOLVE_ENTRIES_TABLE_SQL, ...RESOLVE_ENTRIES_INDEX_SQL].map((sql) => ({
|
|
29
|
+
sql,
|
|
30
|
+
args: []
|
|
31
|
+
})), "write");
|
|
32
|
+
return client;
|
|
33
|
+
})();
|
|
34
|
+
}
|
|
35
|
+
/** Release the libsql client (DID-Space close / daemon shutdown). */
|
|
36
|
+
async close() {
|
|
37
|
+
(await this.ready.catch(() => void 0))?.close();
|
|
38
|
+
}
|
|
39
|
+
async get(key) {
|
|
40
|
+
const { rows } = await (await this.ready).execute({
|
|
41
|
+
sql: "SELECT value FROM ds_resolve_entries WHERE key = ?",
|
|
42
|
+
args: [key]
|
|
43
|
+
});
|
|
44
|
+
return rows[0] ? String(rows[0].value) : null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Batch get (issue #808) — one `WHERE key IN (...)` query for several keys, so
|
|
48
|
+
* the Node serve path collapses `resolve/blocklet/<host>` + `resolve/domain/
|
|
49
|
+
* <host>` into a single round trip too (parity with the CF D1 store). Missing
|
|
50
|
+
* keys are absent from the map; deduped so a repeated key doesn't widen the list.
|
|
51
|
+
*/
|
|
52
|
+
async getMany(keys) {
|
|
53
|
+
const out = /* @__PURE__ */ new Map();
|
|
54
|
+
const unique = [...new Set(keys)];
|
|
55
|
+
if (unique.length === 0) return out;
|
|
56
|
+
const client = await this.ready;
|
|
57
|
+
const placeholders = unique.map(() => "?").join(",");
|
|
58
|
+
const { rows } = await client.execute({
|
|
59
|
+
sql: `SELECT key, value FROM ds_resolve_entries WHERE key IN (${placeholders})`,
|
|
60
|
+
args: unique
|
|
61
|
+
});
|
|
62
|
+
for (const row of rows) out.set(String(row.key), String(row.value));
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
async put(key, value) {
|
|
66
|
+
const client = await this.ready;
|
|
67
|
+
const strValue = typeof value === "string" ? value : new TextDecoder().decode(value);
|
|
68
|
+
const { owner, kind } = extractIndexFields(strValue);
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
await client.execute({
|
|
71
|
+
sql: `INSERT INTO ds_resolve_entries (key, value, owner, kind, updated_at, created_at) VALUES (?, ?, ?, ?, ?, ?)
|
|
72
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value, owner = excluded.owner, kind = excluded.kind, updated_at = excluded.updated_at`,
|
|
73
|
+
args: [
|
|
74
|
+
key,
|
|
75
|
+
strValue,
|
|
76
|
+
owner,
|
|
77
|
+
kind,
|
|
78
|
+
now,
|
|
79
|
+
now
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async delete(key) {
|
|
84
|
+
await (await this.ready).execute({
|
|
85
|
+
sql: "DELETE FROM ds_resolve_entries WHERE key = ?",
|
|
86
|
+
args: [key]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async list(options) {
|
|
90
|
+
const { sql, args, limit } = this.rangeQuery("SELECT key FROM ds_resolve_entries", options);
|
|
91
|
+
const { rows } = await (await this.ready).execute({
|
|
92
|
+
sql,
|
|
93
|
+
args
|
|
94
|
+
});
|
|
95
|
+
const hasMore = rows.length > limit;
|
|
96
|
+
const selected = hasMore ? rows.slice(0, limit) : rows;
|
|
97
|
+
return {
|
|
98
|
+
keys: selected.map((r) => ({ name: String(r.key) })),
|
|
99
|
+
list_complete: !hasMore,
|
|
100
|
+
cursor: hasMore && selected.length > 0 ? String(selected[selected.length - 1].key) : void 0
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async listWithValues(options) {
|
|
104
|
+
const { sql, args, limit } = this.rangeQuery("SELECT key, value FROM ds_resolve_entries", options);
|
|
105
|
+
const { rows } = await (await this.ready).execute({
|
|
106
|
+
sql,
|
|
107
|
+
args
|
|
108
|
+
});
|
|
109
|
+
const hasMore = rows.length > limit;
|
|
110
|
+
const selected = hasMore ? rows.slice(0, limit) : rows;
|
|
111
|
+
return {
|
|
112
|
+
entries: selected.map((r) => ({
|
|
113
|
+
key: String(r.key),
|
|
114
|
+
value: String(r.value)
|
|
115
|
+
})),
|
|
116
|
+
list_complete: !hasMore,
|
|
117
|
+
cursor: hasMore && selected.length > 0 ? String(selected[selected.length - 1].key) : void 0
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** Like listWithValues but also returns created_at/updated_at (DIDSpaceResolver fast path). */
|
|
121
|
+
async listWithTimestamps(options) {
|
|
122
|
+
const { sql, args, limit } = this.rangeQuery("SELECT key, value, created_at, updated_at FROM ds_resolve_entries", options);
|
|
123
|
+
const { rows } = await (await this.ready).execute({
|
|
124
|
+
sql,
|
|
125
|
+
args
|
|
126
|
+
});
|
|
127
|
+
const hasMore = rows.length > limit;
|
|
128
|
+
const selected = hasMore ? rows.slice(0, limit) : rows;
|
|
129
|
+
return {
|
|
130
|
+
entries: selected.map((r) => ({
|
|
131
|
+
key: String(r.key),
|
|
132
|
+
value: String(r.value),
|
|
133
|
+
created_at: r.created_at == null ? null : Number(r.created_at),
|
|
134
|
+
updated_at: r.updated_at == null ? null : Number(r.updated_at)
|
|
135
|
+
})),
|
|
136
|
+
list_complete: !hasMore,
|
|
137
|
+
cursor: hasMore && selected.length > 0 ? String(selected[selected.length - 1].key) : void 0
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** Build a prefix-range + cursor + limit query (shared by list/listWithValues/…). */
|
|
141
|
+
rangeQuery(select, options) {
|
|
142
|
+
const prefix = options?.prefix ?? "";
|
|
143
|
+
const limit = options?.limit && options.limit > 0 ? options.limit : 1e3;
|
|
144
|
+
const cursor = options?.cursor;
|
|
145
|
+
const [lo, hi] = prefixRange(prefix);
|
|
146
|
+
const args = [lo, hi];
|
|
147
|
+
let sql = `${select} WHERE key >= ? AND key < ?`;
|
|
148
|
+
if (cursor) {
|
|
149
|
+
sql += " AND key > ?";
|
|
150
|
+
args.push(cursor);
|
|
151
|
+
}
|
|
152
|
+
sql += " ORDER BY key LIMIT ?";
|
|
153
|
+
args.push(limit + 1);
|
|
154
|
+
return {
|
|
155
|
+
sql,
|
|
156
|
+
args,
|
|
157
|
+
limit
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
//#endregion
|
|
163
|
+
export { SqliteResolveStore };
|
|
164
|
+
//# sourceMappingURL=sqlite-resolve-store.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-resolve-store.mjs","names":[],"sources":["../src/sqlite-resolve-store.ts"],"sourcesContent":["/**\n * SqliteResolveStore — libsql (Node daemon) implementation of the resolve-table\n * KeyValueStore. Hand-written sibling of `D1ResolveStore`, exactly as\n * `SqliteShareStore` mirrors `D1ShareStore`.\n *\n * The local backend used an in-memory `MemoryKeyValueStore` for `resolver`,\n * which is ephemeral and per-instance — so blocklet publish/resolve (and any\n * other resolve entry) didn't survive across DID-Space instances or daemon\n * restarts on Node, while CF persisted them in D1. This restores symmetry:\n * resolve is a DID-Space capability with a persistent store on BOTH backends.\n *\n * Like `_shares.db`, the resolve table is a DAEMON-GLOBAL single registry (one\n * `{rootPath}/_resolve.db`, NOT a per-space `_metadata.db`): the\n * `blocklet/<id> → owner` (and `domain/<host> → …`) reverse lookups are\n * caller-less, so one global registry is needed — exactly like CF's single\n * shared D1. Owner isolation rides the entry `owner` column / value JSON.\n *\n * The libsql client is opened lazily (dynamic import) so this file never pulls\n * `@libsql/client` into the CF/browser bundle (same discipline as metadata-db.ts).\n */\n\nimport type { KeyValueStore, KeyValueStoreListWithValuesResult } from \"@aigne/afs-kv\";\nimport type { InValue, Client as LibsqlClient } from \"@libsql/client\";\nimport { RESOLVE_ENTRIES_INDEX_SQL, RESOLVE_ENTRIES_TABLE_SQL } from \"./d1-schema.js\";\nimport { prefixRange } from \"./prefix-range.js\";\nimport { renameLegacyTable } from \"./rename-guard.js\";\n\n/** `@aigne/afs-kv` re-exports neither of these, so alias locally (KeyValueStore.list shape). */\ntype ListOptions = { prefix?: string; cursor?: string; limit?: number };\ntype ListResult = {\n keys: Array<{ name: string }>;\n list_complete: boolean;\n cursor?: string;\n};\n\n/** Extract the owner/kind index columns from a JSON value (mirrors D1ResolveStore). */\nfunction extractIndexFields(value: string): { owner: string | null; kind: string | null } {\n try {\n const parsed = JSON.parse(value);\n const owner = typeof parsed.owner === \"string\" ? parsed.owner : null;\n const kind = typeof parsed.type === \"string\" ? parsed.type : null;\n return { owner, kind };\n } catch {\n return { owner: null, kind: null };\n }\n}\n\nexport class SqliteResolveStore implements KeyValueStore {\n private readonly ready: Promise<LibsqlClient>;\n\n constructor(dbPath: string) {\n this.ready = (async () => {\n const { createClient } = await import(\"@libsql/client\");\n const client = createClient({ url: `file:${dbPath}` });\n // Upgrade guard: rename old unprefixed table before CREATE TABLE IF NOT EXISTS.\n await renameLegacyTable(client, \"resolve_entries\", \"ds_resolve_entries\");\n await client.batch(\n [RESOLVE_ENTRIES_TABLE_SQL, ...RESOLVE_ENTRIES_INDEX_SQL].map((sql) => ({\n sql,\n args: [] as InValue[],\n })),\n \"write\",\n );\n return client;\n })();\n }\n\n /** Release the libsql client (DID-Space close / daemon shutdown). */\n async close(): Promise<void> {\n const client = await this.ready.catch(() => undefined);\n client?.close();\n }\n\n async get(key: string): Promise<string | null> {\n const client = await this.ready;\n const { rows } = await client.execute({\n sql: \"SELECT value FROM ds_resolve_entries WHERE key = ?\",\n args: [key],\n });\n return rows[0] ? String(rows[0].value) : null;\n }\n\n /**\n * Batch get (issue #808) — one `WHERE key IN (...)` query for several keys, so\n * the Node serve path collapses `resolve/blocklet/<host>` + `resolve/domain/\n * <host>` into a single round trip too (parity with the CF D1 store). Missing\n * keys are absent from the map; deduped so a repeated key doesn't widen the list.\n */\n async getMany(keys: string[]): Promise<Map<string, string | null>> {\n const out = new Map<string, string | null>();\n const unique = [...new Set(keys)];\n if (unique.length === 0) return out;\n const client = await this.ready;\n const placeholders = unique.map(() => \"?\").join(\",\");\n const { rows } = await client.execute({\n sql: `SELECT key, value FROM ds_resolve_entries WHERE key IN (${placeholders})`,\n args: unique as InValue[],\n });\n for (const row of rows) out.set(String(row.key), String(row.value));\n return out;\n }\n\n async put(key: string, value: string | ArrayBuffer): Promise<void> {\n const client = await this.ready;\n const strValue = typeof value === \"string\" ? value : new TextDecoder().decode(value);\n const { owner, kind } = extractIndexFields(strValue);\n const now = Date.now();\n await client.execute({\n sql: `INSERT INTO ds_resolve_entries (key, value, owner, kind, updated_at, created_at) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value, owner = excluded.owner, kind = excluded.kind, updated_at = excluded.updated_at`,\n args: [key, strValue, owner, kind, now, now],\n });\n }\n\n async delete(key: string): Promise<void> {\n const client = await this.ready;\n await client.execute({ sql: \"DELETE FROM ds_resolve_entries WHERE key = ?\", args: [key] });\n }\n\n async list(options?: ListOptions): Promise<ListResult> {\n const { sql, args, limit } = this.rangeQuery(\"SELECT key FROM ds_resolve_entries\", options);\n const client = await this.ready;\n const { rows } = await client.execute({ sql, args });\n const hasMore = rows.length > limit;\n const selected = hasMore ? rows.slice(0, limit) : rows;\n return {\n keys: selected.map((r) => ({ name: String(r.key) })),\n list_complete: !hasMore,\n cursor:\n hasMore && selected.length > 0 ? String(selected[selected.length - 1]!.key) : undefined,\n };\n }\n\n async listWithValues(options?: ListOptions): Promise<KeyValueStoreListWithValuesResult> {\n const { sql, args, limit } = this.rangeQuery(\n \"SELECT key, value FROM ds_resolve_entries\",\n options,\n );\n const client = await this.ready;\n const { rows } = await client.execute({ sql, args });\n const hasMore = rows.length > limit;\n const selected = hasMore ? rows.slice(0, limit) : rows;\n return {\n entries: selected.map((r) => ({ key: String(r.key), value: String(r.value) })),\n list_complete: !hasMore,\n cursor:\n hasMore && selected.length > 0 ? String(selected[selected.length - 1]!.key) : undefined,\n };\n }\n\n /** Like listWithValues but also returns created_at/updated_at (DIDSpaceResolver fast path). */\n async listWithTimestamps(options?: ListOptions): Promise<{\n entries: Array<{\n key: string;\n value: string;\n created_at: number | null;\n updated_at: number | null;\n }>;\n list_complete: boolean;\n cursor?: string;\n }> {\n const { sql, args, limit } = this.rangeQuery(\n \"SELECT key, value, created_at, updated_at FROM ds_resolve_entries\",\n options,\n );\n const client = await this.ready;\n const { rows } = await client.execute({ sql, args });\n const hasMore = rows.length > limit;\n const selected = hasMore ? rows.slice(0, limit) : rows;\n return {\n entries: selected.map((r) => ({\n key: String(r.key),\n value: String(r.value),\n created_at: r.created_at == null ? null : Number(r.created_at),\n updated_at: r.updated_at == null ? null : Number(r.updated_at),\n })),\n list_complete: !hasMore,\n cursor:\n hasMore && selected.length > 0 ? String(selected[selected.length - 1]!.key) : undefined,\n };\n }\n\n /** Build a prefix-range + cursor + limit query (shared by list/listWithValues/…). */\n private rangeQuery(\n select: string,\n options?: ListOptions,\n ): { sql: string; args: InValue[]; limit: number } {\n const prefix = options?.prefix ?? \"\";\n const limit = options?.limit && options.limit > 0 ? options.limit : 1000;\n const cursor = options?.cursor;\n const [lo, hi] = prefixRange(prefix);\n const args: InValue[] = [lo, hi];\n let sql = `${select} WHERE key >= ? AND key < ?`;\n if (cursor) {\n sql += \" AND key > ?\";\n args.push(cursor);\n }\n sql += \" ORDER BY key LIMIT ?\";\n args.push(limit + 1);\n return { sql, args, limit };\n }\n}\n"],"mappings":"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"}
|