@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,510 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_blocklet_hook = require('./blocklet-hook.cjs');
|
|
3
|
+
const require_cid = require('./cid.cjs');
|
|
4
|
+
const require_did_utils = require('./did-utils.cjs');
|
|
5
|
+
require('./mime-utils.cjs');
|
|
6
|
+
const require_inline_content = require('./inline-content.cjs');
|
|
7
|
+
const require_share_declaration = require('./share-declaration.cjs');
|
|
8
|
+
const require_share_hook = require('./share-hook.cjs');
|
|
9
|
+
const require_upload_session_store = require('./upload-session-store.cjs');
|
|
10
|
+
const require_cid_byte_cache = require('./cid-byte-cache.cjs');
|
|
11
|
+
const require_d1_gc_queue = require('./d1-gc-queue.cjs');
|
|
12
|
+
const require_d1_resolve_store = require('./d1-resolve-store.cjs');
|
|
13
|
+
const require_object_key = require('./object-key.cjs');
|
|
14
|
+
const require_d1_tree_index = require('./d1-tree-index.cjs');
|
|
15
|
+
const require_prefixed_tree_index = require('./prefixed-tree-index.cjs');
|
|
16
|
+
const require_resolve = require('./resolve.cjs');
|
|
17
|
+
const require_scope_id = require('./scope-id.cjs');
|
|
18
|
+
const require_index = require('./index.cjs');
|
|
19
|
+
let _aigne_afs = require("@aigne/afs");
|
|
20
|
+
let _aigne_afs_provider_utils = require("@aigne/afs-provider-utils");
|
|
21
|
+
|
|
22
|
+
//#region src/cloudflare.ts
|
|
23
|
+
/**
|
|
24
|
+
* CloudflareDIDSpace — Cloudflare backend for DID-scoped storage.
|
|
25
|
+
*
|
|
26
|
+
* Composes DIDSpaceProvider (files via R2 + D1 TreeIndex) per app,
|
|
27
|
+
* with logical isolation (separate D1 scope per user+app DID).
|
|
28
|
+
*
|
|
29
|
+
* Same interface as local DIDSpace for 100% compatibility.
|
|
30
|
+
*
|
|
31
|
+
* Usage:
|
|
32
|
+
* const space = new CloudflareDIDSpace({ userDid: "did:abt:z1...", objectStore, indexDb });
|
|
33
|
+
* const afs = await space.getInstanceSpace({ instanceDid: "z1app", role: "system" });
|
|
34
|
+
* await afs.write("/hello.txt", { content: "hello" });
|
|
35
|
+
*/
|
|
36
|
+
/** provider:did-space structured logger (debug self-guards; off by default). */
|
|
37
|
+
const log = (0, _aigne_afs.nsLog)("provider:did-space");
|
|
38
|
+
var CloudflareDIDSpace = class {
|
|
39
|
+
/** Real normalizeId(DID) — identity, returned to callers (NOT a storage key). */
|
|
40
|
+
userDid;
|
|
41
|
+
/**
|
|
42
|
+
* Storage scope — `deriveScope(userDid, secret)` when de-id is on, else the
|
|
43
|
+
* plaintext `userDid`. Every D1 storage/query key uses this, never `userDid`.
|
|
44
|
+
* Named `_scope` to avoid colliding with the `get scope()` accessor (README §4.1).
|
|
45
|
+
*/
|
|
46
|
+
_scope;
|
|
47
|
+
objectStore;
|
|
48
|
+
indexDb;
|
|
49
|
+
_resolver;
|
|
50
|
+
/** Optional ShareResolver for .share reconcile hook (Phase 0.4) */
|
|
51
|
+
shareResolver;
|
|
52
|
+
/** Read replica opt-in for read-serving paths only — see options doc. */
|
|
53
|
+
useReplica;
|
|
54
|
+
/** upload-limits Phase 5 per-scope byte quota (0 = off, the opt-in default). */
|
|
55
|
+
maxBytesPerScope;
|
|
56
|
+
/**
|
|
57
|
+
* Instance space cache keyed by (role, useReplica) — same shape as `local.ts`
|
|
58
|
+
* `instanceSpaces`. Without it, `getInstanceSpace` returns a fresh `AFS`
|
|
59
|
+
* (and fresh `EventBus`) every call, so propBind subscribe (registered on
|
|
60
|
+
* AFS_A at session start) and the agent's subsequent write (executing on
|
|
61
|
+
* AFS_B for that exec) cross different buses — the write's `afs:write`
|
|
62
|
+
* event never reaches the subscriber, so the live patch silently drops and
|
|
63
|
+
* the user only sees the new value after a manual page reload (Layer 2
|
|
64
|
+
* staleness on staging). Bounded by the lifetime of this DID-Space (per
|
|
65
|
+
* caller in the resolver), the same memory budget the resolver already
|
|
66
|
+
* spends on `spaces`.
|
|
67
|
+
*/
|
|
68
|
+
instanceSpaces = /* @__PURE__ */ new Map();
|
|
69
|
+
/**
|
|
70
|
+
* User-space cache keyed by (accessMode, useReplica) — the getUserSpace
|
|
71
|
+
* counterpart of {@link instanceSpaces}. Without it, every `getUserSpace()`
|
|
72
|
+
* builds a fresh `AFS` and re-runs `AFS.mount()`'s async provider health check
|
|
73
|
+
* (a root `stat` → `countChildren` + list). Blocklet serve calls getUserSpace
|
|
74
|
+
* once PER stage (reader / afsRoot), so a cold page paid that root enumeration
|
|
75
|
+
* 3× (issue #808 #4). Caching the handle reuses the mounted provider; data
|
|
76
|
+
* reads stay fresh (path→cid D1 lookups are never cached), so zero staleness.
|
|
77
|
+
*/
|
|
78
|
+
userSpaces = /* @__PURE__ */ new Map();
|
|
79
|
+
/** Shared GC queue instance — created once per CloudflareDIDSpace instance */
|
|
80
|
+
gcQueue;
|
|
81
|
+
/** Injected presigned-PUT signer (upload plane). Undefined → no grant capability. */
|
|
82
|
+
signer;
|
|
83
|
+
constructor(options) {
|
|
84
|
+
require_did_utils.validateId(options.userDid);
|
|
85
|
+
this.userDid = require_did_utils.normalizeId(options.userDid);
|
|
86
|
+
this._scope = options.scopeHmacSecret ? require_scope_id.deriveScope(this.userDid, options.scopeHmacSecret) : this.userDid;
|
|
87
|
+
this.objectStore = new require_cid_byte_cache.CachingObjectStore(options.objectStore, new require_cid_byte_cache.CidByteCache());
|
|
88
|
+
this.indexDb = options.indexDb;
|
|
89
|
+
this.gcQueue = new require_d1_gc_queue.D1GCQueue(options.indexDb);
|
|
90
|
+
this.shareResolver = options.shareResolver;
|
|
91
|
+
this.useReplica = options.useReplica ?? false;
|
|
92
|
+
this.maxBytesPerScope = options.maxBytesPerScope ?? 0;
|
|
93
|
+
this.signer = options.signer;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Construct a D1TreeIndex for this scope with the per-scope byte quota
|
|
97
|
+
* (upload-limits Phase 5) always injected — so every write path enforces it
|
|
98
|
+
* uniformly without each call site remembering to thread it. 0 = quota off.
|
|
99
|
+
*/
|
|
100
|
+
makeTreeIndex(opts) {
|
|
101
|
+
return new require_d1_tree_index.D1TreeIndex(this.indexDb, this._scope, {
|
|
102
|
+
...opts,
|
|
103
|
+
maxBytesPerScope: this.maxBytesPerScope
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The injected presigned-PUT signer, or undefined when no R2 signer
|
|
108
|
+
* credentials are configured. The seam through which `prepare-upload` (P2)
|
|
109
|
+
* mints upload grants; also the capability signal clients use to decide
|
|
110
|
+
* grant-path vs batchWrite fallback (§15 decision 7/8).
|
|
111
|
+
*/
|
|
112
|
+
get presignSigner() {
|
|
113
|
+
return this.signer;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Upload-plane deps for the user-facing `DIDSpaceProvider` (design §7): the
|
|
117
|
+
* injected signer (CF mints grants; absent → fallback), a D1-backed session
|
|
118
|
+
* store, and the de-identified storage scope written into `upload_sessions`.
|
|
119
|
+
* Only the user space gets these — `/instance` (installer) + config don't.
|
|
120
|
+
*/
|
|
121
|
+
uploadDeps() {
|
|
122
|
+
return {
|
|
123
|
+
signer: this.signer,
|
|
124
|
+
uploadSessionStore: new require_upload_session_store.D1UploadSessionStore(this.indexDb),
|
|
125
|
+
uploadScope: this._scope
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get an isolated AFS instance for a blocklet instance under this DID Space,
|
|
130
|
+
* scoped by role (system = installer-side data, user = caller-side data).
|
|
131
|
+
*
|
|
132
|
+
* Layout (PrefixedTreeIndex prefix relative to `entries.scope = userDid`):
|
|
133
|
+
* role:"system" → blocklets/{instanceDid}/system/ (content tree, mounted at `/`)
|
|
134
|
+
* role:"user" → blocklets/{instanceDid}/user/ (content tree, mounted at `/`)
|
|
135
|
+
* config → blocklets/{instanceDid}/config/ (sibling fragment, getConfigSpace)
|
|
136
|
+
*
|
|
137
|
+
* /files-prefix-removal: content tree is the role root (no `files/` wrapper);
|
|
138
|
+
* config is a sibling fragment (invisible to `/instance`); vault removed.
|
|
139
|
+
*
|
|
140
|
+
* did-space-composition Phase 2 (symmetric with the local backend): the user
|
|
141
|
+
* fragment is a SINGLE `user` subtree. Per-user isolation comes from scope =
|
|
142
|
+
* caller's userDid (the resolver hands back a CloudflareDIDSpace scoped to the
|
|
143
|
+
* caller), so a `users/{userDid}` path segment would be redundant. `userDid`
|
|
144
|
+
* is @deprecated for this call and ignored for the path.
|
|
145
|
+
*
|
|
146
|
+
* Cached per (instanceDid, role, useReplica) — first caller's accessMode
|
|
147
|
+
* wins for that triple (mirrors local.ts). See `instanceSpaces` for the
|
|
148
|
+
* live-update rationale.
|
|
149
|
+
*/
|
|
150
|
+
async getInstanceSpace(opts) {
|
|
151
|
+
log.debug({
|
|
152
|
+
message: "getInstanceSpace",
|
|
153
|
+
instanceDid: opts.instanceDid,
|
|
154
|
+
role: opts.role
|
|
155
|
+
});
|
|
156
|
+
require_did_utils.validateId(opts.instanceDid);
|
|
157
|
+
if (opts.role !== "system" && opts.role !== "user") throw new Error(`getInstanceSpace: invalid role "${opts.role}"`);
|
|
158
|
+
if (opts.role === "user" && opts.userDid != null) require_did_utils.validateId(opts.userDid);
|
|
159
|
+
const bareInstanceId = require_did_utils.normalizeId(opts.instanceDid);
|
|
160
|
+
const useReplica = opts.consistency === "primary" ? false : this.useReplica;
|
|
161
|
+
const cacheKey = `${bareInstanceId}::${opts.role}::${useReplica ? "r" : "p"}`;
|
|
162
|
+
const cached = this.instanceSpaces.get(cacheKey);
|
|
163
|
+
if (cached) return cached;
|
|
164
|
+
const subtree = opts.role === "system" ? `blocklets/${bareInstanceId}/system` : `blocklets/${bareInstanceId}/user`;
|
|
165
|
+
const accessMode = opts.accessMode ?? "readwrite";
|
|
166
|
+
const afs = new _aigne_afs.AFS();
|
|
167
|
+
const baseTreeIndex = this.makeTreeIndex({
|
|
168
|
+
useReplica,
|
|
169
|
+
inlineCache: "on"
|
|
170
|
+
});
|
|
171
|
+
const fileProvider = new require_index.DIDSpaceProvider({
|
|
172
|
+
did: bareInstanceId,
|
|
173
|
+
objectStore: this.objectStore,
|
|
174
|
+
treeIndex: new require_prefixed_tree_index.PrefixedTreeIndex(baseTreeIndex, `${subtree}/`),
|
|
175
|
+
name: "content",
|
|
176
|
+
accessMode,
|
|
177
|
+
gcQueue: this.gcQueue,
|
|
178
|
+
...opts.role === "user" ? {
|
|
179
|
+
shareTreePrefix: `${subtree}/`,
|
|
180
|
+
...this.shareResolver ? {
|
|
181
|
+
shareResolver: this.shareResolver,
|
|
182
|
+
shareOwnerDid: this._scope
|
|
183
|
+
} : {},
|
|
184
|
+
blockletResolver: this.resolver,
|
|
185
|
+
blockletOwnerDid: this.userDid
|
|
186
|
+
} : {},
|
|
187
|
+
...opts.role === "user" ? this.uploadDeps() : {}
|
|
188
|
+
});
|
|
189
|
+
await afs.mount(fileProvider, "/", { skipHealthCheck: true });
|
|
190
|
+
this.instanceSpaces.set(cacheKey, afs);
|
|
191
|
+
return afs;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Runtime-internal config fragment (`blocklets/<i>/config/`, mounted at
|
|
195
|
+
* `/`). Mirrors local `getConfigSpace`. Invisible to `/instance`; holds
|
|
196
|
+
* per-instance machine state like `mounts.toml`.
|
|
197
|
+
*/
|
|
198
|
+
async getConfigSpace(instanceDid) {
|
|
199
|
+
require_did_utils.validateId(instanceDid);
|
|
200
|
+
const bareInstanceId = require_did_utils.normalizeId(instanceDid);
|
|
201
|
+
const afs = new _aigne_afs.AFS();
|
|
202
|
+
const baseTreeIndex = this.makeTreeIndex({
|
|
203
|
+
useReplica: this.useReplica,
|
|
204
|
+
inlineCache: "on"
|
|
205
|
+
});
|
|
206
|
+
const configProvider = new require_index.DIDSpaceProvider({
|
|
207
|
+
did: bareInstanceId,
|
|
208
|
+
objectStore: this.objectStore,
|
|
209
|
+
treeIndex: new require_prefixed_tree_index.PrefixedTreeIndex(baseTreeIndex, `blocklets/${bareInstanceId}/config/`),
|
|
210
|
+
name: "config",
|
|
211
|
+
accessMode: "readwrite",
|
|
212
|
+
gcQueue: this.gcQueue
|
|
213
|
+
});
|
|
214
|
+
await afs.mount(configProvider, "/", { skipHealthCheck: true });
|
|
215
|
+
return afs;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* List all instance DIDs that have storage in this user's space.
|
|
219
|
+
*
|
|
220
|
+
* Enumerates entries under the `blocklets/<instanceDid>/...` prefix and
|
|
221
|
+
* returns the distinct instance-DID segment. This mirrors the local
|
|
222
|
+
* backend's `listApps`, which enumerates `{userDir}/blocklets/*`. Legacy
|
|
223
|
+
* top-level `getAppSpace` segments are NOT enumerated — that layout is
|
|
224
|
+
* deprecated and removed in P4.
|
|
225
|
+
*/
|
|
226
|
+
async listApps() {
|
|
227
|
+
const result = await this.makeTreeIndex({ useReplica: this.useReplica }).list("", { limit: 1e3 });
|
|
228
|
+
const apps = /* @__PURE__ */ new Set();
|
|
229
|
+
for (const entry of result.entries) {
|
|
230
|
+
const parts = entry.path.split("/");
|
|
231
|
+
if (parts[0] === "blocklets" && parts[1]) apps.add(parts[1]);
|
|
232
|
+
}
|
|
233
|
+
return [...apps];
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Contract alias (分叉 A, observability Phase 2) for the whole-space root.
|
|
237
|
+
* Delegates to {@link getUserSpace}; satisfies `DIDSpaceLike.getSpaceRoot`
|
|
238
|
+
* without renaming the existing CF method. Defaults readonly via getUserSpace.
|
|
239
|
+
*/
|
|
240
|
+
async getSpaceRoot(options) {
|
|
241
|
+
return this.getUserSpace(options);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get an AFS instance scoped to the user's entire DID Space.
|
|
245
|
+
* No appDid sub-partitioning.
|
|
246
|
+
*/
|
|
247
|
+
async getUserSpace(options) {
|
|
248
|
+
log.debug({
|
|
249
|
+
message: "getUserSpace",
|
|
250
|
+
userDid: this.userDid
|
|
251
|
+
});
|
|
252
|
+
const accessMode = options?.accessMode ?? "readonly";
|
|
253
|
+
const cacheKey = `${accessMode}::${this.useReplica ? "r" : "p"}`;
|
|
254
|
+
const cached = this.userSpaces.get(cacheKey);
|
|
255
|
+
if (cached) return cached;
|
|
256
|
+
const afs = new _aigne_afs.AFS();
|
|
257
|
+
const provider = new require_index.DIDSpaceProvider({
|
|
258
|
+
did: this.userDid,
|
|
259
|
+
objectStore: this.objectStore,
|
|
260
|
+
treeIndex: this.makeTreeIndex({
|
|
261
|
+
useReplica: this.useReplica,
|
|
262
|
+
inlineCache: "on"
|
|
263
|
+
}),
|
|
264
|
+
name: "did-space-user",
|
|
265
|
+
accessMode,
|
|
266
|
+
shareResolver: this.shareResolver,
|
|
267
|
+
blockletResolver: this.resolver,
|
|
268
|
+
blockletOwnerDid: this.userDid,
|
|
269
|
+
...this.uploadDeps()
|
|
270
|
+
});
|
|
271
|
+
await afs.mount(provider, "/", { skipHealthCheck: true });
|
|
272
|
+
this.userSpaces.set(cacheKey, afs);
|
|
273
|
+
return afs;
|
|
274
|
+
}
|
|
275
|
+
get resolver() {
|
|
276
|
+
if (!this._resolver) this._resolver = new require_resolve.DIDSpaceResolver(new require_d1_resolve_store.D1ResolveStore(this.indexDb, { useReplica: this.useReplica }));
|
|
277
|
+
return this._resolver;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Expose the underlying storage scope — used by worker handlers for
|
|
281
|
+
* cid-permission queries. MUST return the derived scope (not the plaintext
|
|
282
|
+
* DID) so the worker's `entries.scope` lookups match what was written.
|
|
283
|
+
*/
|
|
284
|
+
get scope() {
|
|
285
|
+
return this._scope;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Direct write path for the Worker HTTP handler (Task 2.4b).
|
|
289
|
+
*
|
|
290
|
+
* Bypasses the generic `afs.write()` path because `AFSWriteEntryPayload` has
|
|
291
|
+
* no `deviceId`/`skipChangelog` field — the `PutOpts` cannot be smuggled
|
|
292
|
+
* through the public AFS API. The Worker handler therefore constructs a
|
|
293
|
+
* `CloudflareDIDSpace` and calls this method directly, passing the per-
|
|
294
|
+
* request `deviceId` read from the `X-Device-Id` header.
|
|
295
|
+
*
|
|
296
|
+
* Semantics mirror `DIDSpaceProvider.writeHandler`:
|
|
297
|
+
* 1. Compute the content-addressed CID from the payload bytes.
|
|
298
|
+
* 2. R2 put `objects/{cid}` if not already stored (head-check for dedup).
|
|
299
|
+
* 3. `treeIndex.put` — atomic `entries` + `changelog` write (Task 2.4a).
|
|
300
|
+
* 4. Enqueue the previous CID (if any) onto the GC queue for deferred
|
|
301
|
+
* cleanup. Enqueuing an overwritten CID is a no-op if the CID is still
|
|
302
|
+
* referenced by another row (the GC job's reference check handles it).
|
|
303
|
+
*
|
|
304
|
+
* Path conventions:
|
|
305
|
+
* - `afsPath` is an AFS-style path WITH leading slash (e.g. `/foo.json`
|
|
306
|
+
* or `/blocklets/z1abc/index.html`).
|
|
307
|
+
* - The leading slash is stripped before `treeIndex.put`; the remainder is
|
|
308
|
+
* stored verbatim under `entries.scope = this._scope` (the derived storage
|
|
309
|
+
* scope when de-id is on, else the plaintext DID). This matches the
|
|
310
|
+
* `getUserSpace()` layout (no appDid sub-partition) that blocklet publish
|
|
311
|
+
* and general user-space CRUD share.
|
|
312
|
+
*
|
|
313
|
+
* Returns `{ cid, oldCid }`. `oldCid` is present only when an existing row
|
|
314
|
+
* was overwritten; the caller can treat its presence as "something was
|
|
315
|
+
* replaced" for change-tracking. `seq` is not returned — Task 2.4a's
|
|
316
|
+
* `treeIndex.put` does not expose the changelog's AUTOINCREMENT `seq`, and
|
|
317
|
+
* adding a separate SELECT round trip here is wasted work for the current
|
|
318
|
+
* sync path (which only cares about cid + oldCid).
|
|
319
|
+
*
|
|
320
|
+
* No event dispatch is performed (Decision 3A round 5): CloudflareDIDSpace
|
|
321
|
+
* has no event bus reference, the Worker runtime is request/response with
|
|
322
|
+
* no long-lived subscriber, and the sync protocol polls `changelog` rows
|
|
323
|
+
* by `seq` rather than reacting to transient event fan-out.
|
|
324
|
+
*/
|
|
325
|
+
async internalWrite(afsPath, content, opts) {
|
|
326
|
+
let bytes;
|
|
327
|
+
let storeValue;
|
|
328
|
+
if (content instanceof Uint8Array) {
|
|
329
|
+
bytes = content;
|
|
330
|
+
storeValue = bytes.buffer;
|
|
331
|
+
} else if (content instanceof ArrayBuffer) {
|
|
332
|
+
bytes = new Uint8Array(content);
|
|
333
|
+
storeValue = content;
|
|
334
|
+
} else {
|
|
335
|
+
bytes = new TextEncoder().encode(content);
|
|
336
|
+
storeValue = content;
|
|
337
|
+
}
|
|
338
|
+
const cid = await require_cid.computeCID(bytes);
|
|
339
|
+
const objectKey = require_object_key.objectKeyForCid(cid);
|
|
340
|
+
const treePath = afsPath.replace(/^\/+/, "");
|
|
341
|
+
if (require_share_declaration.isShareReservedPath(afsPath)) throw new _aigne_afs.AFSForbiddenError(afsPath, "share-path-reserved");
|
|
342
|
+
await require_share_hook.applyShareWriteHook({
|
|
343
|
+
afsPath,
|
|
344
|
+
treePath,
|
|
345
|
+
bytes,
|
|
346
|
+
cid,
|
|
347
|
+
ownerDid: this._scope,
|
|
348
|
+
resolver: this.shareResolver,
|
|
349
|
+
phase: "pre-io"
|
|
350
|
+
});
|
|
351
|
+
if (!await this.objectStore.head(objectKey)) await this.objectStore.put(objectKey, storeValue);
|
|
352
|
+
const now = Date.now();
|
|
353
|
+
const mimeType = (0, _aigne_afs_provider_utils.detectMimeType)(afsPath) ?? void 0;
|
|
354
|
+
const treeIndex = this.makeTreeIndex({ inlineCache: "on" });
|
|
355
|
+
const entry = {
|
|
356
|
+
cid,
|
|
357
|
+
size: bytes.length,
|
|
358
|
+
mtime: now,
|
|
359
|
+
ctime: now,
|
|
360
|
+
mimeType
|
|
361
|
+
};
|
|
362
|
+
const inlineText = require_inline_content.decodeInlineText(bytes, mimeType);
|
|
363
|
+
if (inlineText !== null) entry.content = inlineText;
|
|
364
|
+
const { oldCid } = await treeIndex.put(treePath, entry, opts);
|
|
365
|
+
await this.gcQueue.remove(cid);
|
|
366
|
+
if (oldCid && oldCid !== cid) await this.gcQueue.enqueue([oldCid]);
|
|
367
|
+
await require_share_hook.applyShareWriteHook({
|
|
368
|
+
afsPath,
|
|
369
|
+
treePath,
|
|
370
|
+
bytes,
|
|
371
|
+
cid,
|
|
372
|
+
ownerDid: this._scope,
|
|
373
|
+
resolver: this.shareResolver,
|
|
374
|
+
phase: "post-io"
|
|
375
|
+
});
|
|
376
|
+
await require_blocklet_hook.applyBlockletWriteHook({
|
|
377
|
+
afsPath,
|
|
378
|
+
treePath,
|
|
379
|
+
bytes,
|
|
380
|
+
ownerDid: this.userDid,
|
|
381
|
+
resolver: this.resolver,
|
|
382
|
+
purgeCachesForDomains: typeof caches !== "undefined" ? async (domains) => {
|
|
383
|
+
const cfCaches = caches;
|
|
384
|
+
for (const domain of domains) {
|
|
385
|
+
const rootKey = new Request(`https://${domain}/`, { method: "GET" });
|
|
386
|
+
await cfCaches.default.delete(rootKey);
|
|
387
|
+
}
|
|
388
|
+
} : void 0
|
|
389
|
+
});
|
|
390
|
+
return oldCid === void 0 ? { cid } : {
|
|
391
|
+
cid,
|
|
392
|
+
oldCid
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Read the current entry's cid + mtime + last-write deviceId for an
|
|
397
|
+
* If-Match precondition check (Task 3.3).
|
|
398
|
+
*
|
|
399
|
+
* Used by `_createSpaceHandler` BEFORE issuing a write when the client
|
|
400
|
+
* sends `If-Match: <cid>` for optimistic concurrency control. The
|
|
401
|
+
* handler compares the returned `cid` to the header value and returns
|
|
402
|
+
* 409 (with the full snapshot below) on mismatch, or 412 if the row
|
|
403
|
+
* doesn't exist (first-create with If-Match).
|
|
404
|
+
*
|
|
405
|
+
* The query joins `entries` (cid + mtime authoritative) with the most
|
|
406
|
+
* recent put row in `changelog` (device_id of last writer). Both
|
|
407
|
+
* indices used (`PRIMARY KEY (scope, path)` on entries +
|
|
408
|
+
* `idx_changelog_scope_seq` on changelog) keep this O(log n).
|
|
409
|
+
*
|
|
410
|
+
* `deviceId` is `null` when the entry was written via the blocklet
|
|
411
|
+
* exemption path (skipChangelog = true) — there's no changelog row to
|
|
412
|
+
* read the device id from. The handler exposes `null` to clients in
|
|
413
|
+
* the 409 body.
|
|
414
|
+
*
|
|
415
|
+
* Returns `null` when no entry exists at this path.
|
|
416
|
+
*/
|
|
417
|
+
async getCurrentEntry(afsPath) {
|
|
418
|
+
const treePath = afsPath.replace(/^\/+/, "");
|
|
419
|
+
const row = await this.indexDb.prepare(`SELECT
|
|
420
|
+
e.cid AS cid,
|
|
421
|
+
e.mtime AS mtime,
|
|
422
|
+
(SELECT device_id FROM ds_changelog
|
|
423
|
+
WHERE scope = ? AND path = ? AND op = 'put'
|
|
424
|
+
ORDER BY seq DESC LIMIT 1) AS device_id
|
|
425
|
+
FROM ds_entries e
|
|
426
|
+
WHERE e.scope = ? AND e.path = ? AND e.kind = 'file'`).bind(this._scope, treePath, this._scope, treePath).first();
|
|
427
|
+
if (!row || row.cid === null) return null;
|
|
428
|
+
return {
|
|
429
|
+
cid: row.cid,
|
|
430
|
+
mtime: row.mtime,
|
|
431
|
+
deviceId: row.device_id
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Read the changelog `seq` of the most recent write by `(scope, path,
|
|
436
|
+
* deviceId)` (Task 3.3).
|
|
437
|
+
*
|
|
438
|
+
* The Worker handler calls this AFTER `internalWrite/internalDelete`
|
|
439
|
+
* to recover the seq of the row just inserted, so the PUT/DELETE
|
|
440
|
+
* response can echo `{cid, seq}` for the client.
|
|
441
|
+
*
|
|
442
|
+
* The triple WHERE clause (scope + path + device_id) is the safety
|
|
443
|
+
* mechanism for concurrent writers: each writer is guaranteed to have
|
|
444
|
+
* a unique `device_id` (validated by the Worker handler's strict
|
|
445
|
+
* format regex BEFORE we get here), so even if two PUTs on the same
|
|
446
|
+
* path race, each call's getLastSeq sees ONLY its own write — never
|
|
447
|
+
* the other writer's.
|
|
448
|
+
*
|
|
449
|
+
* Returns `0` when no row matches (impossible if called immediately
|
|
450
|
+
* after a successful internalWrite, but defensive against
|
|
451
|
+
* skipChangelog = true callers — blocklet exempt PUTs have no
|
|
452
|
+
* changelog row at all and the handler should NOT call this for them).
|
|
453
|
+
*/
|
|
454
|
+
async getLastSeq(afsPath, deviceId) {
|
|
455
|
+
const treePath = afsPath.replace(/^\/+/, "");
|
|
456
|
+
return (await this.indexDb.prepare(`SELECT MAX(seq) AS seq FROM ds_changelog
|
|
457
|
+
WHERE scope = ? AND path = ? AND device_id = ?`).bind(this._scope, treePath, deviceId).first())?.seq ?? 0;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Direct delete path for the Worker HTTP handler (Task 2.4b).
|
|
461
|
+
*
|
|
462
|
+
* Semantics mirror `DIDSpaceProvider.deleteHandler`:
|
|
463
|
+
* 1. Read the current entry (for GC enqueue of the soon-to-be-orphaned CID).
|
|
464
|
+
* 2. `treeIndex.delete` — atomic `entries` delete + `changelog` delete row
|
|
465
|
+
* (Task 2.4a's `INSERT INTO ds_changelog SELECT ... FROM ds_entries` pattern
|
|
466
|
+
* captures the old CID in-batch).
|
|
467
|
+
* 3. Enqueue the old CID for GC. Enqueueing is safe even under races —
|
|
468
|
+
* the GC job's `isReferenced` check skips CIDs still referenced by
|
|
469
|
+
* other rows.
|
|
470
|
+
*
|
|
471
|
+
* Returns an empty object (no `seq` for the same reason as `internalWrite`).
|
|
472
|
+
* Callers that need to know whether anything was actually deleted can rely
|
|
473
|
+
* on the absence of an `AFSNotFoundError` — Task 2.4b's handler converts
|
|
474
|
+
* that to a 404 response.
|
|
475
|
+
*/
|
|
476
|
+
async internalDelete(afsPath, opts) {
|
|
477
|
+
const treePath = afsPath.replace(/^\/+/, "");
|
|
478
|
+
const treeIndex = this.makeTreeIndex();
|
|
479
|
+
if (require_share_declaration.isShareReservedPath(afsPath)) throw new _aigne_afs.AFSForbiddenError(afsPath, "share-path-reserved");
|
|
480
|
+
const entry = await treeIndex.get(treePath, { includeContent: false });
|
|
481
|
+
if (!entry) return { deleted: false };
|
|
482
|
+
await this.gcQueue.enqueue([entry.cid]);
|
|
483
|
+
await treeIndex.delete(treePath, opts);
|
|
484
|
+
await require_share_hook.applyShareDeleteHook({
|
|
485
|
+
afsPath,
|
|
486
|
+
treePath,
|
|
487
|
+
ownerDid: this._scope,
|
|
488
|
+
resolver: this.shareResolver
|
|
489
|
+
});
|
|
490
|
+
await require_blocklet_hook.applyBlockletDeleteHook({
|
|
491
|
+
afsPath,
|
|
492
|
+
treePath,
|
|
493
|
+
ownerDid: this.userDid,
|
|
494
|
+
resolver: this.resolver
|
|
495
|
+
});
|
|
496
|
+
return { deleted: true };
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Clean up resources. Drops the cached instance-space map so retained AFS
|
|
500
|
+
* instances are GC-eligible alongside this DID-Space.
|
|
501
|
+
*/
|
|
502
|
+
close() {
|
|
503
|
+
this.instanceSpaces.clear();
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
//#endregion
|
|
508
|
+
exports.CloudflareDIDSpace = CloudflareDIDSpace;
|
|
509
|
+
exports.normalizeId = require_did_utils.normalizeId;
|
|
510
|
+
exports.validateId = require_did_utils.validateId;
|