@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
package/LICENSE.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Proprietary License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2025 ArcBlock, Inc. All Rights Reserved.
|
|
4
|
+
|
|
5
|
+
This software and associated documentation files (the "Software") are proprietary
|
|
6
|
+
and confidential. Unauthorized copying, modification, distribution, or use of
|
|
7
|
+
this Software, via any medium, is strictly prohibited.
|
|
8
|
+
|
|
9
|
+
The Software is provided for internal use only within ArcBlock, Inc. and its
|
|
10
|
+
authorized affiliates.
|
|
11
|
+
|
|
12
|
+
## No License Granted
|
|
13
|
+
|
|
14
|
+
No license, express or implied, is granted to any party for any purpose.
|
|
15
|
+
All rights are reserved by ArcBlock, Inc.
|
|
16
|
+
|
|
17
|
+
## Public Artifact Distribution
|
|
18
|
+
|
|
19
|
+
Portions of this Software may be released publicly under separate open-source
|
|
20
|
+
licenses (such as MIT License) through designated public repositories. Such
|
|
21
|
+
public releases are governed by their respective licenses and do not affect
|
|
22
|
+
the proprietary nature of this repository.
|
|
23
|
+
|
|
24
|
+
## Contact
|
|
25
|
+
|
|
26
|
+
For licensing inquiries, contact: legal@arcblock.io
|
package/README.md
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# @aigne/afs-did-space
|
|
2
|
+
|
|
3
|
+
DID-scoped 持久化存储 provider。一个 DID 对应一个 DID Space;service 在用户 DID Space 中只占一段 path 前缀。
|
|
4
|
+
|
|
5
|
+
## 三条不变约束(new code / new design must respect)
|
|
6
|
+
|
|
7
|
+
1. **DID Space 是 AFS first-class mount**
|
|
8
|
+
不是 REST 服务。`DIDSpaceProvider` 实现完整 AFS provider 协议(`@List/@Read/@Write/@Delete/@Stat/@Search/@Explain`),可以被 `afs.mount()`。Transport 可插拔(local FS / Cloudflare D1+R2 / WebSocket / HTTP / static read-only / in-memory)。
|
|
9
|
+
|
|
10
|
+
2. **Hosting 后端可插拔**
|
|
11
|
+
DID Space 主要承载 mutable runtime data(instance system + user data);也可以承载 immutable artifact(如 blocklet 代码——通过 `.share` 暴露 readonly URL)。ARC 不 care artifact host 在哪——pages.dev / S3 / DID Space share / 任何 AFS-compatible readonly endpoint 都行。CDN 是当前生产 default,**不是架构铁律**。
|
|
12
|
+
|
|
13
|
+
3. **一个 user = 一个 DID Space**
|
|
14
|
+
Service 在用户 DID Space 中只是 path 前缀。路径布局:
|
|
15
|
+
```
|
|
16
|
+
{principalDid}/blocklets/{instance-did}/system/... ← installer / instance-owned content
|
|
17
|
+
{principalDid}/blocklets/{instance-did}/user/... ← 该 principal 作为 caller 的 user-owned content
|
|
18
|
+
{principalDid}/blocklets/{instance-did}/config/mounts.toml ← runtime-internal config fragment
|
|
19
|
+
```
|
|
20
|
+
role 片段的内容树直接在 role 根;没有 `files/` 包装层,也没有 role-local `vault/` 片段(真实 vault 由 `@aigne/afs-vault` provider 承载)。`config/` 是 provider 内部 sibling,不出现在 blocklet 的 `/instance` 视图里。
|
|
21
|
+
同一个 principal 的 `system/` 与 `user/` 只是同一 DID Space 的两个 path-prefix view;installer 与真实 caller 可以由 `SpaceResolver` 选到不同 principal 的 DID Space。
|
|
22
|
+
|
|
23
|
+
> 概念权威见 [`docs/architecture/did-space.md`](../../../docs/architecture/did-space.md);活计划见 [`planning/did-integration/did-space-alignment/`](../../../planning/did-integration/did-space-alignment/)。
|
|
24
|
+
|
|
25
|
+
## 同步 transport:afs-rpc(mobile)+ 内容寻址后端(two-runtime 统一)
|
|
26
|
+
|
|
27
|
+
`mobile-didspace-transport` 计划(2026-06)把 DID Space sync 统一到两条不变量上:
|
|
28
|
+
|
|
29
|
+
1. **单一 transport = `POST /api/afs/rpc`**(共享 `createAfsRpcHandler @aigne/aos`,Node +
|
|
30
|
+
Cloudflare 同一份)。移动端 `RemoteDIDSpaceAFS`(Swift/Kotlin)用纯标准 AFS op
|
|
31
|
+
(list/read/stat/write/delete)同步——零私有 REST、读写对称。
|
|
32
|
+
- 鉴权:`Authorization: Bearer <login_token>`(写**必须** Bearer,cookie-only 写拒,防 CSRF)。
|
|
33
|
+
- 写面 allowlist:只允许已认证 caller 写**自己**的 `/user/**` 数据路径;`/instance`、`/space`、
|
|
34
|
+
root-scope、`.objects`/`.changelog` 虚拟路径一律拒。
|
|
35
|
+
- 字段位置:write `ifMatch` 走 `options.ifMatch`(顶层),`deviceId`/`mtime` 走 `options.meta`;
|
|
36
|
+
delete 三字段都在 `options.meta`。content 用 base64;`.objects/{cid}` 读后 client recompute CID 校验。
|
|
37
|
+
- 冲突:`AFS_CONFLICT` → HTTP 409(+ currentCid/mtime/deviceId)。超限:> 16MB → 413(旁路 deferred)。
|
|
38
|
+
- 契约权威:[`planning/did-integration/mobile-didspace-transport/wire-contract.md`](../../../planning/did-integration/mobile-didspace-transport/wire-contract.md)。
|
|
39
|
+
|
|
40
|
+
2. **单一 `DIDSpaceProvider`,两端只换注入的存储原语**:
|
|
41
|
+
- Cloudflare:`objectStore = R2`(按 user space 前缀 key 隔离)+ `treeIndex = D1TreeIndex`。
|
|
42
|
+
- Node:`objectStore = FsObjectStore`(`{userDir}/objects/{cid}`)+ `treeIndex = SQLiteTreeIndex`
|
|
43
|
+
(over `MetadataDB` libsql,与 `D1TreeIndex` 共享 `changelog-schema.ts` DDL + 同一 conformance suite)。
|
|
44
|
+
Node 后端因此从「裸 AFSFS verbatim 树」升级为**内容寻址**:`.objects/{cid}`、`.changelog`
|
|
45
|
+
增量、`maxDepth:-1` manifest、device-aware 写、ifMatch 全部可用。物理布局 = `objects/{cid}` +
|
|
46
|
+
`_metadata.db`(索引即 SoT),**不再有** verbatim 文件树。
|
|
47
|
+
|
|
48
|
+
mobile sync 把 aside app 建模为一个 blocklet,数据 = caller 的 `blocklets/<aside>/user/` 片段,经
|
|
49
|
+
`/user` 寻址(`aside.afsd.io` Host 解析,零硬编码 DID)。`/files` 与 `aside/` wrapper 均已去除。
|
|
50
|
+
|
|
51
|
+
## Usage
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { DIDSpace } from "@aigne/afs-did-space/local";
|
|
55
|
+
|
|
56
|
+
const space = new DIDSpace({
|
|
57
|
+
rootPath: "~/.afs/spaces",
|
|
58
|
+
userDid: "did:abt:z1...",
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const afs = await space.getInstanceSpace({
|
|
62
|
+
instanceDid: "did:abt:z1blocklet",
|
|
63
|
+
role: "system",
|
|
64
|
+
});
|
|
65
|
+
await afs.write("/hello.txt", { content: "hello" });
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Backends:
|
|
69
|
+
- `@aigne/afs-did-space/local` — `local.ts:DIDSpace`(文件系统 + SQLite)
|
|
70
|
+
- `@aigne/afs-did-space/cloudflare` — `cloudflare.ts:CloudflareDIDSpace`(D1 + R2)
|
|
71
|
+
- `RemoteUserSpaceAFS` — HTTP REST 客户端(**deprecated**,已被上文 afs-rpc transport 取代)
|
|
72
|
+
|
|
73
|
+
## Object GC(Model B — global pool + index-layer read-auth + global sweep)
|
|
74
|
+
|
|
75
|
+
内容寻址对象存在**一个全局池** `objects/{cid}`(跨用户去重)。跨用户/跨 blocklet
|
|
76
|
+
的读隔离由**索引层授权**强制:`readHandler` 在返回 `.objects/{cid}` 字节前先查
|
|
77
|
+
`treeIndex.isReferenced(cid)`(view-local:blocklet provider 是 prefix-local,
|
|
78
|
+
space-root 是 whole-scope),未引用 → `AFSNotFoundError`(404,不泄露存在性)。
|
|
79
|
+
|
|
80
|
+
两类引用检查(名字、scope、表都不同——见 design §3):
|
|
81
|
+
|
|
82
|
+
| 名字 | 问题 | scope | 表 |
|
|
83
|
+
|---|---|---|---|
|
|
84
|
+
| `TreeIndex.isReferenced(cid, pathPrefix?)` | "本 view 见过 cid 吗?"(**授权**) | view-local(prefix-local / whole-scope) | 三路 `entries.cid ∪ changelog.cid ∪ changelog.old_cid` |
|
|
85
|
+
| `referencedAnywhere{D1,Libsql}(conn, cid)` | "还有 LIVE 文件指向 cid 吗?"(**存活**) | scope-blind | **仅 `entries.cid`**(NOT changelog,Path Y §0.2) |
|
|
86
|
+
|
|
87
|
+
GC 流程:overwrite/delete 把旧 cid `enqueue` 到 `gc_queue (cid, queued_at)`;
|
|
88
|
+
写入时 `gcQueue.remove(writtenCid)` 反入队(关闭去重 re-reference race)。
|
|
89
|
+
`runGc()`(`run-gc.ts`,runtime-agnostic)每个候选:`assertValidCid` → **删除时刻
|
|
90
|
+
fresh** 重查 `referencedAnywhere` → `objectStore.delete(objectKeyForCid(cid))`。
|
|
91
|
+
单项 try/catch;crash 在 delete 与 remove 之间 → 下次幂等重试,绝不丢 live object。
|
|
92
|
+
poisoned row(`cid="../_metadata.db"`)被 `assertValidCid` 挡下,永不传给 delete。
|
|
93
|
+
|
|
94
|
+
Grace 默认 **7 天**(`DEFAULT_GC_GRACE_MS`),由 `runGc` 显式传给 `fetchCandidates`,
|
|
95
|
+
是 behind/offline 设备的唯一保护(§0.2/§7)。
|
|
96
|
+
|
|
97
|
+
触发:
|
|
98
|
+
- **Node**:`arc space gc [--grace <ms>] [--limit <n>]`(一次性扫,不需 daemon);
|
|
99
|
+
daemon 起 croner `0 * * * *`,`DIDSpace.close()` 停止它。
|
|
100
|
+
- **Cloudflare**:`initHost` 注册 `ScheduledTask { id:"didspace-gc", cron:"0 * * * *" }`,
|
|
101
|
+
wrangler `[triggers] crons`(每个 env 重声明——non-inheritable)驱动 `scheduled()`。
|
|
102
|
+
|
|
103
|
+
客户端契约(§4.7.2,gates GC go-live):`SyncEngine` 对 object-read 404 分类——
|
|
104
|
+
**superseded**(被同路径更晚的行取代)→ benign skip + 推进 cursor;**current**
|
|
105
|
+
(manifest / 增量最新 put / 冲突 winner)→ `CurrentObjectMissingError` 硬错误 +
|
|
106
|
+
cursor **pinned**(下次 sync 重访)。TS/Swift/Kotlin 三端 parity。
|
|
107
|
+
|
|
108
|
+
## Collection query(`/.actions/query`)
|
|
109
|
+
|
|
110
|
+
did-space 是 typed collection query 的参考引擎(afs-collection-query,2026-06)。
|
|
111
|
+
三个 TreeIndex backend(sqlite / memory / d1)lockstep 实现同一语义
|
|
112
|
+
(`src/tree-query.ts` 单源 SQL + JS executor;`test/tree-query-lockstep.test.ts`)。
|
|
113
|
+
|
|
114
|
+
- **声明门**:仅当 backing index 实现引擎时才在 `/.meta/.capabilities` 的
|
|
115
|
+
`standardActions` 声明(declare ⇒ execute)。声明块:`doc` + `groupBy` + `annotate`。
|
|
116
|
+
- **记录视图**:dir-per-record(`doc: "item.json"` join 子文档)或
|
|
117
|
+
file-per-record(无 doc,行内 content 即 record)。
|
|
118
|
+
- **where 方言**:leaf `{field, eq|in|notIn|contains|gte|lte}` / `{all:[...]}` /
|
|
119
|
+
扁平等值 map。字符串大小写不敏感;数字/布尔 type-strict(SQL 侧 json_type
|
|
120
|
+
门控,布尔 groupBy 经 `'[true]'/'[false]'` json_each 源保型);`notIn` 兜底桶
|
|
121
|
+
吃缺失/null;`contains` 要求数组字段;malformed JSON 记录折叠为 NULL record。
|
|
122
|
+
- **排序/分页**:orderBy 白名单字段 + keyset cursor v2(name tiebreak);
|
|
123
|
+
`total` 为 post-WHERE 精确计数;`count: true` 只回计数。
|
|
124
|
+
- **provider 约束**:单 orderBy 键、不支持 `text`——违反抛
|
|
125
|
+
`AFSValidationError`(绝不静默降级)。
|
|
126
|
+
|
|
127
|
+
## Conformance
|
|
128
|
+
|
|
129
|
+
每个 backend 跑 `runProviderTests()` 全套(21 测试套件)。新 backend 必须覆盖。
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
|
|
2
|
+
//#region \0@oxc-project+runtime@0.108.0/helpers/decorate.js
|
|
3
|
+
function __decorate(decorators, target, key, desc) {
|
|
4
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
5
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
6
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
7
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
exports.__decorate = __decorate;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region \0@oxc-project+runtime@0.108.0/helpers/decorate.js
|
|
2
|
+
function __decorate(decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { __decorate };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region rolldown:runtime
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
|
|
29
|
+
exports.__toESM = __toESM;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/afs-metadata-context.ts
|
|
3
|
+
const contextMap = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
/** Attach a metadata context to an AFS instance. Used by DIDSpace. */
|
|
5
|
+
function attachMetadataContext(afs, ctx) {
|
|
6
|
+
contextMap.set(afs, ctx);
|
|
7
|
+
}
|
|
8
|
+
/** Look up the metadata context for an AFS instance. Returns undefined if none. */
|
|
9
|
+
function getMetadataContext(afs) {
|
|
10
|
+
return contextMap.get(afs);
|
|
11
|
+
}
|
|
12
|
+
/** Detach context — exported for tests that want to simulate non-DIDSpace AFS. */
|
|
13
|
+
function detachMetadataContext(afs) {
|
|
14
|
+
contextMap.delete(afs);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.attachMetadataContext = attachMetadataContext;
|
|
19
|
+
exports.detachMetadataContext = detachMetadataContext;
|
|
20
|
+
exports.getMetadataContext = getMetadataContext;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { MetadataDB } from "./metadata-db.cjs";
|
|
2
|
+
import { AFS } from "@aigne/afs";
|
|
3
|
+
|
|
4
|
+
//#region src/afs-metadata-context.d.ts
|
|
5
|
+
interface AFSMetadataContext {
|
|
6
|
+
/** User-level MetadataDB (e.g. ~/.afs/spaces/{userDid}/_metadata.db) */
|
|
7
|
+
metadataDb: MetadataDB;
|
|
8
|
+
/** Root directory of the user's DID space (e.g. ~/.afs/spaces/{userDid}) */
|
|
9
|
+
userDir: string;
|
|
10
|
+
/** Scope used for entries rows — bare userDid */
|
|
11
|
+
scope: string;
|
|
12
|
+
}
|
|
13
|
+
/** Attach a metadata context to an AFS instance. Used by DIDSpace. */
|
|
14
|
+
declare function attachMetadataContext(afs: AFS, ctx: AFSMetadataContext): void;
|
|
15
|
+
/** Look up the metadata context for an AFS instance. Returns undefined if none. */
|
|
16
|
+
declare function getMetadataContext(afs: AFS): AFSMetadataContext | undefined;
|
|
17
|
+
/** Detach context — exported for tests that want to simulate non-DIDSpace AFS. */
|
|
18
|
+
declare function detachMetadataContext(afs: AFS): void;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { AFSMetadataContext, attachMetadataContext, detachMetadataContext, getMetadataContext };
|
|
21
|
+
//# sourceMappingURL=afs-metadata-context.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"afs-metadata-context.d.cts","names":[],"sources":["../src/afs-metadata-context.ts"],"mappings":";;;;UAaiB,kBAAA;EAMV;EAJL,UAAA,EAAY,UAAA;EAUE;EARd,OAAA;;EAEA,KAAA;AAAA;;iBAMc,qBAAA,CAAsB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,kBAAA;;iBAKrC,kBAAA,CAAmB,GAAA,EAAK,GAAA,GAAM,kBAAA;;iBAK9B,qBAAA,CAAsB,GAAA,EAAK,GAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { MetadataDB } from "./metadata-db.mjs";
|
|
2
|
+
import { AFS } from "@aigne/afs";
|
|
3
|
+
|
|
4
|
+
//#region src/afs-metadata-context.d.ts
|
|
5
|
+
interface AFSMetadataContext {
|
|
6
|
+
/** User-level MetadataDB (e.g. ~/.afs/spaces/{userDid}/_metadata.db) */
|
|
7
|
+
metadataDb: MetadataDB;
|
|
8
|
+
/** Root directory of the user's DID space (e.g. ~/.afs/spaces/{userDid}) */
|
|
9
|
+
userDir: string;
|
|
10
|
+
/** Scope used for entries rows — bare userDid */
|
|
11
|
+
scope: string;
|
|
12
|
+
}
|
|
13
|
+
/** Attach a metadata context to an AFS instance. Used by DIDSpace. */
|
|
14
|
+
declare function attachMetadataContext(afs: AFS, ctx: AFSMetadataContext): void;
|
|
15
|
+
/** Look up the metadata context for an AFS instance. Returns undefined if none. */
|
|
16
|
+
declare function getMetadataContext(afs: AFS): AFSMetadataContext | undefined;
|
|
17
|
+
/** Detach context — exported for tests that want to simulate non-DIDSpace AFS. */
|
|
18
|
+
declare function detachMetadataContext(afs: AFS): void;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { AFSMetadataContext, attachMetadataContext, detachMetadataContext, getMetadataContext };
|
|
21
|
+
//# sourceMappingURL=afs-metadata-context.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"afs-metadata-context.d.mts","names":[],"sources":["../src/afs-metadata-context.ts"],"mappings":";;;;UAaiB,kBAAA;EAMV;EAJL,UAAA,EAAY,UAAA;EAUE;EARd,OAAA;;EAEA,KAAA;AAAA;;iBAMc,qBAAA,CAAsB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,kBAAA;;iBAKrC,kBAAA,CAAmB,GAAA,EAAK,GAAA,GAAM,kBAAA;;iBAK9B,qBAAA,CAAsB,GAAA,EAAK,GAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/afs-metadata-context.ts
|
|
2
|
+
const contextMap = /* @__PURE__ */ new WeakMap();
|
|
3
|
+
/** Attach a metadata context to an AFS instance. Used by DIDSpace. */
|
|
4
|
+
function attachMetadataContext(afs, ctx) {
|
|
5
|
+
contextMap.set(afs, ctx);
|
|
6
|
+
}
|
|
7
|
+
/** Look up the metadata context for an AFS instance. Returns undefined if none. */
|
|
8
|
+
function getMetadataContext(afs) {
|
|
9
|
+
return contextMap.get(afs);
|
|
10
|
+
}
|
|
11
|
+
/** Detach context — exported for tests that want to simulate non-DIDSpace AFS. */
|
|
12
|
+
function detachMetadataContext(afs) {
|
|
13
|
+
contextMap.delete(afs);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { attachMetadataContext, detachMetadataContext, getMetadataContext };
|
|
18
|
+
//# sourceMappingURL=afs-metadata-context.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"afs-metadata-context.mjs","names":[],"sources":["../src/afs-metadata-context.ts"],"sourcesContent":["/**\n * AFS → MetadataDB context binding (Task 1.3).\n *\n * DIDSpace attaches metadata context to each AFS instance it creates so that\n * rsync.buildManifest() can default to the O(1) SQL path without explicit\n * `localMetadataDb` arguments from callers.\n *\n * Module-local WeakMap — no global singleton, no cross-test leakage.\n */\n\nimport type { AFS } from \"@aigne/afs\";\nimport type { MetadataDB } from \"./metadata-db.js\";\n\nexport interface AFSMetadataContext {\n /** User-level MetadataDB (e.g. ~/.afs/spaces/{userDid}/_metadata.db) */\n metadataDb: MetadataDB;\n /** Root directory of the user's DID space (e.g. ~/.afs/spaces/{userDid}) */\n userDir: string;\n /** Scope used for entries rows — bare userDid */\n scope: string;\n}\n\nconst contextMap = new WeakMap<AFS, AFSMetadataContext>();\n\n/** Attach a metadata context to an AFS instance. Used by DIDSpace. */\nexport function attachMetadataContext(afs: AFS, ctx: AFSMetadataContext): void {\n contextMap.set(afs, ctx);\n}\n\n/** Look up the metadata context for an AFS instance. Returns undefined if none. */\nexport function getMetadataContext(afs: AFS): AFSMetadataContext | undefined {\n return contextMap.get(afs);\n}\n\n/** Detach context — exported for tests that want to simulate non-DIDSpace AFS. */\nexport function detachMetadataContext(afs: AFS): void {\n contextMap.delete(afs);\n}\n"],"mappings":";AAsBA,MAAM,6BAAa,IAAI,SAAkC;;AAGzD,SAAgB,sBAAsB,KAAU,KAA+B;AAC7E,YAAW,IAAI,KAAK,IAAI;;;AAI1B,SAAgB,mBAAmB,KAA0C;AAC3E,QAAO,WAAW,IAAI,IAAI;;;AAI5B,SAAgB,sBAAsB,KAAgB;AACpD,YAAW,OAAO,IAAI"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
|
|
2
|
+
let _aigne_afs = require("@aigne/afs");
|
|
3
|
+
|
|
4
|
+
//#region src/blocklet-hook.ts
|
|
5
|
+
/**
|
|
6
|
+
* Blocklet publish/resolve write & delete hooks (#674 Phase 3, v2).
|
|
7
|
+
*
|
|
8
|
+
* AFS-native registration keyed on a PUBLISH MARKER, not `blocklet.yaml`:
|
|
9
|
+
* `arc deploy` writes `<blocklet-root>/.blocklet-publish.json` LAST (always —
|
|
10
|
+
* even for blocklets that have no `blocklet.yaml`, e.g. a plain `index.html`
|
|
11
|
+
* one), and that write registers the blocklet in the global resolve table under
|
|
12
|
+
* `resolve/blocklet/<id>`. The CF/Node serve path reads the table back to find
|
|
13
|
+
* the owner space + path. There is NO REST endpoint — registration rides the
|
|
14
|
+
* AFS write of the marker, mirroring how `.share` files reconcile.
|
|
15
|
+
*
|
|
16
|
+
* Why a marker and not `blocklet.yaml`: not every blocklet has a manifest, and
|
|
17
|
+
* the blocklet's identity at publish time is the target slug
|
|
18
|
+
* (`/user/blocklets/<slug>/`), which `arc deploy` already knows (manifest id
|
|
19
|
+
* else dir name). Keying on a publish-written marker (a) works for ALL blocklet
|
|
20
|
+
* shapes, (b) leaves the developer's files untouched (so a static blocklet stays
|
|
21
|
+
* a static blocklet — a synthesized manifest could flip its serve type), and
|
|
22
|
+
* (c) registers only on an explicit publish, not on any incidental manifest write.
|
|
23
|
+
*
|
|
24
|
+
* Contract (see planning/did-integration/blocklet-publish-resolve/design.md):
|
|
25
|
+
* marker : <blocklet-root>/.blocklet-publish.json = { "id": "<slug>", ... }
|
|
26
|
+
* register: resolve/blocklet/<id> → { owner, path, type:"blocklet", name:id }
|
|
27
|
+
* - owner = PLAINTEXT space-owner DID (so the reader can open the space)
|
|
28
|
+
* - path = the blocklet root (dir holding the marker), captured at write
|
|
29
|
+
* time — scope-absolute, so resolve replays it regardless of WHERE
|
|
30
|
+
* it was written (`/user/...` lands physically under
|
|
31
|
+
* `blocklets/<instance>/user/...` and we capture that real path)
|
|
32
|
+
* resolve : resolve/blocklet/<id> → { owner, path }
|
|
33
|
+
* serve : getUserSpace(owner) → createAfsBlockletReader(afs, path)
|
|
34
|
+
*
|
|
35
|
+
* All hooks are best-effort / fail-soft: a marker that doesn't parse or has no
|
|
36
|
+
* `id`, or a registration failure, MUST NOT break the underlying file write.
|
|
37
|
+
*
|
|
38
|
+
* #764 Phase 4 extends the marker with an optional `domains: string[]` (from
|
|
39
|
+
* the manifest's `sites[].domains`) that also registers `resolve/domain/<domain>`
|
|
40
|
+
* → { did, owner, path }. This is the ONE deliberate exception to fail-soft: a
|
|
41
|
+
* domain already owned by a different owner rejects the write loudly instead
|
|
42
|
+
* of silently overwriting — see `applyBlockletWriteHook`'s doc comment.
|
|
43
|
+
*/
|
|
44
|
+
const log = (0, _aigne_afs.makeNsLog)("provider:did-space:blocklet-hook");
|
|
45
|
+
/** The publish marker `arc deploy` writes (last) into a blocklet's DID-Space root. */
|
|
46
|
+
const BLOCKLET_PUBLISH_MARKER = ".blocklet-publish.json";
|
|
47
|
+
/**
|
|
48
|
+
* True if `afsPath`'s basename is the publish marker. Accepts a leading slash
|
|
49
|
+
* and any directory depth.
|
|
50
|
+
*/
|
|
51
|
+
function isBlockletPublishMarkerPath(afsPath) {
|
|
52
|
+
const p = afsPath.startsWith("/") ? afsPath.slice(1) : afsPath;
|
|
53
|
+
return p === BLOCKLET_PUBLISH_MARKER || p.endsWith(`/${BLOCKLET_PUBLISH_MARKER}`);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse a publish-marker payload and extract `{id, did, domains}`. Returns
|
|
57
|
+
* null on any failure (non-UTF-8, non-JSON, not an object, missing/blank
|
|
58
|
+
* `id`) — the caller treats null as "not registerable" and leaves the write
|
|
59
|
+
* untouched. A malformed `domains` field (not an array, or with non-string /
|
|
60
|
+
* empty elements) is NOT a parse failure — it is silently dropped down to
|
|
61
|
+
* only the valid string entries (empty result → field omitted), same
|
|
62
|
+
* fail-soft spirit as the rest of this parser.
|
|
63
|
+
*/
|
|
64
|
+
function parseBlockletPublishMarker(bytes) {
|
|
65
|
+
let text;
|
|
66
|
+
try {
|
|
67
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
68
|
+
} catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
let doc;
|
|
72
|
+
try {
|
|
73
|
+
doc = JSON.parse(text);
|
|
74
|
+
} catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
if (!doc || typeof doc !== "object" || Array.isArray(doc)) return null;
|
|
78
|
+
const record = doc;
|
|
79
|
+
const id = record.id;
|
|
80
|
+
if (typeof id !== "string" || id.length === 0) return null;
|
|
81
|
+
const did = typeof record.did === "string" && record.did.length > 0 ? record.did : void 0;
|
|
82
|
+
const domains = Array.isArray(record.domains) ? record.domains.filter((d) => typeof d === "string" && d.length > 0) : void 0;
|
|
83
|
+
const publishVersion = typeof record.publishVersion === "number" && Number.isFinite(record.publishVersion) ? record.publishVersion : void 0;
|
|
84
|
+
const hasWebCache = typeof record.hasWebCache === "boolean" ? record.hasWebCache : void 0;
|
|
85
|
+
return {
|
|
86
|
+
id,
|
|
87
|
+
did,
|
|
88
|
+
...domains && domains.length > 0 ? { domains } : {},
|
|
89
|
+
...publishVersion !== void 0 ? { publishVersion } : {},
|
|
90
|
+
...hasWebCache !== void 0 ? { hasWebCache } : {}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Blocklet root for a marker tree path: strip the trailing marker segment. */
|
|
94
|
+
function blockletDir(treePath) {
|
|
95
|
+
const norm = treePath.replace(/^\/+/, "");
|
|
96
|
+
const idx = norm.lastIndexOf("/");
|
|
97
|
+
return idx === -1 ? "" : norm.slice(0, idx);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* applyBlockletWriteHook — called AFTER a successful publish-marker write in any
|
|
101
|
+
* DID Space write path. Registers `resolve/blocklet/<id>` → {owner, path} and,
|
|
102
|
+
* when the marker declares `domains` (#764), `resolve/domain/<domain>` →
|
|
103
|
+
* {did, owner, path} for each.
|
|
104
|
+
*
|
|
105
|
+
* No-op when the resolver is absent, the path isn't the publish marker, or the
|
|
106
|
+
* marker has no usable `id`.
|
|
107
|
+
*
|
|
108
|
+
* Domain conflict is a DELIBERATE, SCOPED exception to this file's usual
|
|
109
|
+
* fail-soft rule: the user wants a domain claimed by a different owner to
|
|
110
|
+
* reject the publish loudly, not silently succeed into someone else's slot.
|
|
111
|
+
* The conflict check therefore runs OUTSIDE the fail-soft try/catch below —
|
|
112
|
+
* validate every domain BEFORE registering anything (so a conflict on one
|
|
113
|
+
* domain never leaves a partial registration), then register. A registration
|
|
114
|
+
* failure unrelated to a conflict (e.g. a transient resolver error) keeps the
|
|
115
|
+
* existing fail-soft contract: the marker write itself must not fail.
|
|
116
|
+
*/
|
|
117
|
+
async function applyBlockletWriteHook(params) {
|
|
118
|
+
if (!params.resolver || !isBlockletPublishMarkerPath(params.afsPath)) return;
|
|
119
|
+
const marker = parseBlockletPublishMarker(params.bytes);
|
|
120
|
+
if (!marker) return;
|
|
121
|
+
const { id, domains = [] } = marker;
|
|
122
|
+
const did = marker.did ?? `did:blocklet:${id}`;
|
|
123
|
+
const path = blockletDir(params.treePath);
|
|
124
|
+
const { resolver, ownerDid } = params;
|
|
125
|
+
const existingBlocklet = await resolver.resolveBlocklet(id);
|
|
126
|
+
if (existingBlocklet && existingBlocklet.owner !== ownerDid) throw new _aigne_afs.AFSAlreadyExistsError(id, `blocklet "${id}" is already registered to a different owner`);
|
|
127
|
+
for (const domain of domains) {
|
|
128
|
+
const existing = await resolver.resolveDomain(domain);
|
|
129
|
+
if (existing && existing.owner !== ownerDid) throw new _aigne_afs.AFSAlreadyExistsError(domain, `domain "${domain}" is already registered to a different owner`);
|
|
130
|
+
}
|
|
131
|
+
const { publishVersion, hasWebCache } = marker;
|
|
132
|
+
try {
|
|
133
|
+
await resolver.registerBlocklet(id, {
|
|
134
|
+
owner: ownerDid,
|
|
135
|
+
path,
|
|
136
|
+
type: "blocklet",
|
|
137
|
+
name: id,
|
|
138
|
+
...publishVersion !== void 0 ? { publishVersion } : {},
|
|
139
|
+
...hasWebCache !== void 0 ? { hasWebCache } : {}
|
|
140
|
+
});
|
|
141
|
+
for (const domain of domains) await resolver.registerDomain(domain, {
|
|
142
|
+
did,
|
|
143
|
+
owner: ownerDid,
|
|
144
|
+
path,
|
|
145
|
+
...publishVersion !== void 0 ? { publishVersion } : {},
|
|
146
|
+
...hasWebCache !== void 0 ? { hasWebCache } : {}
|
|
147
|
+
});
|
|
148
|
+
const stale = (await resolver.domainsForBlocklet(ownerDid, path)).filter((d) => !domains.includes(d));
|
|
149
|
+
for (const domain of stale) await resolver.unregisterDomain(domain);
|
|
150
|
+
if (params.purgeCachesForDomains && domains.length > 0) await params.purgeCachesForDomains(domains);
|
|
151
|
+
} catch (err) {
|
|
152
|
+
log.warn(`[blocklet-hook] registration for "${id}" failed: ${err instanceof Error ? err.message : err}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* applyBlockletDeleteHook — called AFTER a publish marker is deleted. Looks up
|
|
157
|
+
* the registered blocklet by (owner, path) and unregisters it, along with any
|
|
158
|
+
* domains registered for the same (owner, path) (#764). We key by path rather
|
|
159
|
+
* than re-parsing the marker because the delete path has no bytes; the
|
|
160
|
+
* (owner, path) pair uniquely identifies a published blocklet (one marker per
|
|
161
|
+
* root). No-op when nothing matches.
|
|
162
|
+
*/
|
|
163
|
+
async function applyBlockletDeleteHook(params) {
|
|
164
|
+
if (!params.resolver || !isBlockletPublishMarkerPath(params.afsPath)) return;
|
|
165
|
+
const path = blockletDir(params.treePath);
|
|
166
|
+
const { resolver, ownerDid } = params;
|
|
167
|
+
try {
|
|
168
|
+
const all = await resolver.listBlocklets();
|
|
169
|
+
for (const { id, entry } of all) if (entry.owner === ownerDid && entry.path === path) await resolver.unregisterBlocklet(id);
|
|
170
|
+
const domains = await resolver.domainsForBlocklet(ownerDid, path);
|
|
171
|
+
for (const domain of domains) await resolver.unregisterDomain(domain);
|
|
172
|
+
} catch (err) {
|
|
173
|
+
log.warn(`[blocklet-hook] unregister for path "${path}" failed: ${err instanceof Error ? err.message : err}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
//#endregion
|
|
178
|
+
exports.BLOCKLET_PUBLISH_MARKER = BLOCKLET_PUBLISH_MARKER;
|
|
179
|
+
exports.applyBlockletDeleteHook = applyBlockletDeleteHook;
|
|
180
|
+
exports.applyBlockletWriteHook = applyBlockletWriteHook;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/blocklet-hook.d.ts
|
|
2
|
+
/** The publish marker `arc deploy` writes (last) into a blocklet's DID-Space root. */
|
|
3
|
+
declare const BLOCKLET_PUBLISH_MARKER = ".blocklet-publish.json";
|
|
4
|
+
/** Shape of the publish marker payload. */
|
|
5
|
+
interface BlockletPublishMarker {
|
|
6
|
+
/** The blocklet slug — manifest `id` else the publish dir name. Resolve key. */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Full blocklet DID. Load-bearing for domain registration (#764) — see below. */
|
|
9
|
+
did?: string;
|
|
10
|
+
/** ISO publish timestamp (informational). */
|
|
11
|
+
publishedAt?: string;
|
|
12
|
+
/** Custom domains declared under `sites[].domains` in the manifest (#764). */
|
|
13
|
+
domains?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Monotonic timestamp (Date.now()) written by the CLI at publish time.
|
|
16
|
+
* Materialized into resolve entries; used by CF Worker edge-cache invalidation
|
|
17
|
+
* so that the cached page key changes on every publish (#1110).
|
|
18
|
+
*/
|
|
19
|
+
publishVersion?: number;
|
|
20
|
+
/**
|
|
21
|
+
* True when the published bundle includes pre-rendered `.web-cache/` content.
|
|
22
|
+
* Materialized into resolve entries so the CF Worker knows to do edge-caching
|
|
23
|
+
* without checking the blocklet files (#1110).
|
|
24
|
+
*/
|
|
25
|
+
hasWebCache?: boolean;
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { BLOCKLET_PUBLISH_MARKER, BlockletPublishMarker };
|
|
29
|
+
//# sourceMappingURL=blocklet-hook.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocklet-hook.d.cts","names":[],"sources":["../src/blocklet-hook.ts"],"mappings":";;cA8Ca,uBAAA;;UAGI,qBAAA;;EAEf,EAAA;;EAEA,GAAA;;EAEA,WAAA;;EAEA,OAAA;;;;;;EAMA,cAAA;;;;;;EAMA,WAAA;AAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/blocklet-hook.d.ts
|
|
2
|
+
/** The publish marker `arc deploy` writes (last) into a blocklet's DID-Space root. */
|
|
3
|
+
declare const BLOCKLET_PUBLISH_MARKER = ".blocklet-publish.json";
|
|
4
|
+
/** Shape of the publish marker payload. */
|
|
5
|
+
interface BlockletPublishMarker {
|
|
6
|
+
/** The blocklet slug — manifest `id` else the publish dir name. Resolve key. */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Full blocklet DID. Load-bearing for domain registration (#764) — see below. */
|
|
9
|
+
did?: string;
|
|
10
|
+
/** ISO publish timestamp (informational). */
|
|
11
|
+
publishedAt?: string;
|
|
12
|
+
/** Custom domains declared under `sites[].domains` in the manifest (#764). */
|
|
13
|
+
domains?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Monotonic timestamp (Date.now()) written by the CLI at publish time.
|
|
16
|
+
* Materialized into resolve entries; used by CF Worker edge-cache invalidation
|
|
17
|
+
* so that the cached page key changes on every publish (#1110).
|
|
18
|
+
*/
|
|
19
|
+
publishVersion?: number;
|
|
20
|
+
/**
|
|
21
|
+
* True when the published bundle includes pre-rendered `.web-cache/` content.
|
|
22
|
+
* Materialized into resolve entries so the CF Worker knows to do edge-caching
|
|
23
|
+
* without checking the blocklet files (#1110).
|
|
24
|
+
*/
|
|
25
|
+
hasWebCache?: boolean;
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { BLOCKLET_PUBLISH_MARKER, BlockletPublishMarker };
|
|
29
|
+
//# sourceMappingURL=blocklet-hook.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocklet-hook.d.mts","names":[],"sources":["../src/blocklet-hook.ts"],"mappings":";;cA8Ca,uBAAA;;UAGI,qBAAA;;EAEf,EAAA;;EAEA,GAAA;;EAEA,WAAA;;EAEA,OAAA;;;;;;EAMA,cAAA;;;;;;EAMA,WAAA;AAAA"}
|