@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,782 @@
|
|
|
1
|
+
import { makeNsLog } from "@aigne/afs";
|
|
2
|
+
import { joinURL } from "ufo";
|
|
3
|
+
|
|
4
|
+
//#region ../../../packages/session/dist/index.mjs
|
|
5
|
+
/**
|
|
6
|
+
* Binary sidecar — carry raw bytes alongside a JSON envelope.
|
|
7
|
+
*
|
|
8
|
+
* Wire format for a message that contains a Uint8Array value:
|
|
9
|
+
* [Binary frame: reqId=N, payload=raw bytes]
|
|
10
|
+
* [JSON frame: reqId=N, payload=JSON with {__afs_binary_ref:true,size:N} marker]
|
|
11
|
+
*
|
|
12
|
+
* Ordering: the Binary frame MUST immediately precede the JSON frame with
|
|
13
|
+
* the same reqId. WebSocket preserves message order, so receivers can
|
|
14
|
+
* buffer the last-seen Binary by reqId and splice it in when the matching
|
|
15
|
+
* JSON arrives.
|
|
16
|
+
*
|
|
17
|
+
* Only one binary slot per message is supported today — large reads/writes
|
|
18
|
+
* put the bytes at `result.data.content` / `params.payload.content`. If we
|
|
19
|
+
* ever need multi-slot, extend the marker with an index and have the binary
|
|
20
|
+
* frame carry a length-prefixed table.
|
|
21
|
+
*
|
|
22
|
+
* Marker key is intentionally rare (`__afs_binary_ref`) to avoid colliding
|
|
23
|
+
* with user payload keys. `isBinaryMarker` also requires `size: number` so
|
|
24
|
+
* a stray `{__afs_binary_ref: true}` in user data without a numeric size
|
|
25
|
+
* still won't be mistaken for a marker.
|
|
26
|
+
*/
|
|
27
|
+
const BINARY_MARKER_KEY = "__afs_binary_ref";
|
|
28
|
+
function isBinaryMarker(v) {
|
|
29
|
+
if (typeof v !== "object" || v === null) return false;
|
|
30
|
+
const o = v;
|
|
31
|
+
return o[BINARY_MARKER_KEY] === true && typeof o.size === "number";
|
|
32
|
+
}
|
|
33
|
+
function toUint8(value) {
|
|
34
|
+
if (value instanceof Uint8Array) return value;
|
|
35
|
+
if (value instanceof ArrayBuffer) return new Uint8Array(value);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Walk a value and replace the first node for which `replace` returns a
|
|
40
|
+
* non-null value. Identity-preserving: if nothing changed, returns the
|
|
41
|
+
* original reference — so the no-binary path allocates nothing.
|
|
42
|
+
*/
|
|
43
|
+
function walkReplaceFirst(value, replace) {
|
|
44
|
+
let done = false;
|
|
45
|
+
const walk = (v) => {
|
|
46
|
+
if (done) return v;
|
|
47
|
+
const replaced = replace(v);
|
|
48
|
+
if (replaced !== null) {
|
|
49
|
+
done = true;
|
|
50
|
+
return replaced;
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(v)) {
|
|
53
|
+
let changed = false;
|
|
54
|
+
let out = null;
|
|
55
|
+
for (let i = 0; i < v.length; i++) {
|
|
56
|
+
const nv = walk(v[i]);
|
|
57
|
+
if (nv !== v[i]) {
|
|
58
|
+
if (!changed) {
|
|
59
|
+
out = v.slice();
|
|
60
|
+
changed = true;
|
|
61
|
+
}
|
|
62
|
+
out[i] = nv;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return changed ? out : v;
|
|
66
|
+
}
|
|
67
|
+
if (v && typeof v === "object") {
|
|
68
|
+
let changed = false;
|
|
69
|
+
let out = null;
|
|
70
|
+
for (const [k, inner] of Object.entries(v)) {
|
|
71
|
+
const nv = walk(inner);
|
|
72
|
+
if (nv !== inner) {
|
|
73
|
+
if (!changed) {
|
|
74
|
+
out = { ...v };
|
|
75
|
+
changed = true;
|
|
76
|
+
}
|
|
77
|
+
out[k] = nv;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return changed ? out : v;
|
|
81
|
+
}
|
|
82
|
+
return v;
|
|
83
|
+
};
|
|
84
|
+
return walk(value);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Walk a message object and extract the first Uint8Array / ArrayBuffer
|
|
88
|
+
* value found (depth-first, keys in insertion order). Replaces the value
|
|
89
|
+
* with a `{__afs_binary_ref:true,size:N}` marker. Returns the cleaned
|
|
90
|
+
* message plus the extracted bytes (if any).
|
|
91
|
+
*
|
|
92
|
+
* Pure — does not mutate the input.
|
|
93
|
+
*/
|
|
94
|
+
function extractBinary(message) {
|
|
95
|
+
let extracted;
|
|
96
|
+
const next = walkReplaceFirst(message, (v) => {
|
|
97
|
+
const bytes = toUint8(v);
|
|
98
|
+
if (!bytes) return null;
|
|
99
|
+
extracted = bytes;
|
|
100
|
+
return {
|
|
101
|
+
[BINARY_MARKER_KEY]: true,
|
|
102
|
+
size: bytes.byteLength
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
return extracted ? {
|
|
106
|
+
message: next,
|
|
107
|
+
binary: extracted
|
|
108
|
+
} : { message };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Walk a value and replace the first `{__afs_binary_ref:true,size:N}`
|
|
112
|
+
* marker with the given Uint8Array. Returns a new value if a marker was
|
|
113
|
+
* found, or the original reference if not.
|
|
114
|
+
*/
|
|
115
|
+
function injectBinary(value, binary) {
|
|
116
|
+
return walkReplaceFirst(value, (v) => isBinaryMarker(v) ? binary : null);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Protocol constants
|
|
120
|
+
*/
|
|
121
|
+
const HEADER_SIZE = 9;
|
|
122
|
+
const MAX_PAYLOAD_SIZE = 16 * 1024 * 1024;
|
|
123
|
+
const CHUNK_SIZE = 64 * 1024;
|
|
124
|
+
const MAX_JSON_DEPTH = 100;
|
|
125
|
+
const MAX_JSON_SIZE = MAX_PAYLOAD_SIZE;
|
|
126
|
+
const MAX_UINT32 = 4294967295;
|
|
127
|
+
/**
|
|
128
|
+
* Frame types
|
|
129
|
+
*/
|
|
130
|
+
let FrameType = /* @__PURE__ */ function(FrameType) {
|
|
131
|
+
FrameType[FrameType["JSON"] = 1] = "JSON";
|
|
132
|
+
FrameType[FrameType["Binary"] = 2] = "Binary";
|
|
133
|
+
return FrameType;
|
|
134
|
+
}({});
|
|
135
|
+
/**
|
|
136
|
+
* Protocol errors
|
|
137
|
+
*/
|
|
138
|
+
var ProtocolError = class extends Error {
|
|
139
|
+
constructor(code, message) {
|
|
140
|
+
super(message);
|
|
141
|
+
this.code = code;
|
|
142
|
+
this.name = "ProtocolError";
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
var PayloadTooLargeError = class extends ProtocolError {
|
|
146
|
+
constructor(size) {
|
|
147
|
+
super("payload_too_large", `Payload size ${size} exceeds maximum ${MAX_PAYLOAD_SIZE}`);
|
|
148
|
+
this.name = "PayloadTooLargeError";
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
var InvalidPayloadError = class extends ProtocolError {
|
|
152
|
+
constructor(message) {
|
|
153
|
+
super("invalid_payload", message);
|
|
154
|
+
this.name = "InvalidPayloadError";
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
var InvalidFrameTypeError = class extends ProtocolError {
|
|
158
|
+
constructor(type) {
|
|
159
|
+
super("invalid_frame_type", `Invalid frame type: 0x${type.toString(16).padStart(2, "0")}`);
|
|
160
|
+
this.name = "InvalidFrameTypeError";
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
var InvalidReqIdError = class extends ProtocolError {
|
|
164
|
+
constructor(reqId) {
|
|
165
|
+
super("invalid_req_id", `Invalid request ID: ${reqId} (must be 0-${MAX_UINT32})`);
|
|
166
|
+
this.name = "InvalidReqIdError";
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
var IncompleteFrameError = class extends ProtocolError {
|
|
170
|
+
constructor(message) {
|
|
171
|
+
super("incomplete_frame", message);
|
|
172
|
+
this.name = "IncompleteFrameError";
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Validates frame type.
|
|
177
|
+
*/
|
|
178
|
+
function isValidFrameType(type) {
|
|
179
|
+
return type === FrameType.JSON || type === FrameType.Binary;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Encodes a frame with the given type, request ID, and payload.
|
|
183
|
+
*
|
|
184
|
+
* Frame structure (big-endian):
|
|
185
|
+
* - Length (4 bytes): payload length
|
|
186
|
+
* - Type (1 byte): frame type
|
|
187
|
+
* - ReqId (4 bytes): request ID
|
|
188
|
+
* - Payload (variable): actual data
|
|
189
|
+
*
|
|
190
|
+
* @param type Frame type (JSON or Binary)
|
|
191
|
+
* @param reqId Request ID (0 for events, >0 for request/response)
|
|
192
|
+
* @param payload The payload data
|
|
193
|
+
* @returns Encoded frame as Uint8Array
|
|
194
|
+
*/
|
|
195
|
+
function encodeFrame(type, reqId, payload) {
|
|
196
|
+
if (payload == null) throw new InvalidPayloadError("Payload cannot be null or undefined");
|
|
197
|
+
if (payload.length > MAX_PAYLOAD_SIZE) throw new PayloadTooLargeError(payload.length);
|
|
198
|
+
if (!isValidFrameType(type)) throw new InvalidFrameTypeError(type);
|
|
199
|
+
if (reqId < 0 || reqId > MAX_UINT32 || !Number.isInteger(reqId)) throw new InvalidReqIdError(reqId);
|
|
200
|
+
const frame = new Uint8Array(HEADER_SIZE + payload.length);
|
|
201
|
+
const view = new DataView(frame.buffer, frame.byteOffset);
|
|
202
|
+
view.setUint32(0, payload.length);
|
|
203
|
+
view.setUint8(4, type);
|
|
204
|
+
view.setUint32(5, reqId);
|
|
205
|
+
frame.set(payload, HEADER_SIZE);
|
|
206
|
+
return frame;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Decodes a frame from a buffer.
|
|
210
|
+
*
|
|
211
|
+
* @param buffer The buffer containing the frame data
|
|
212
|
+
* @returns Object containing the decoded frame and any remaining bytes
|
|
213
|
+
* @throws IncompleteFrameError if buffer doesn't contain a complete frame
|
|
214
|
+
* @throws InvalidFrameTypeError if frame type is invalid
|
|
215
|
+
* @throws PayloadTooLargeError if payload length exceeds maximum
|
|
216
|
+
*/
|
|
217
|
+
function decodeFrame(buffer) {
|
|
218
|
+
if (buffer.length < HEADER_SIZE) throw new IncompleteFrameError(`Buffer too small: ${buffer.length} bytes, need at least ${HEADER_SIZE}`);
|
|
219
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset);
|
|
220
|
+
const length = view.getUint32(0);
|
|
221
|
+
const type = view.getUint8(4);
|
|
222
|
+
const reqId = view.getUint32(5);
|
|
223
|
+
if (length > MAX_PAYLOAD_SIZE) throw new PayloadTooLargeError(length);
|
|
224
|
+
if (!isValidFrameType(type)) throw new InvalidFrameTypeError(type);
|
|
225
|
+
const totalSize = HEADER_SIZE + length;
|
|
226
|
+
if (buffer.length < totalSize) throw new IncompleteFrameError(`Incomplete frame: have ${buffer.length} bytes, need ${totalSize}`);
|
|
227
|
+
const payload = buffer.slice(HEADER_SIZE, totalSize);
|
|
228
|
+
const remaining = buffer.slice(totalSize);
|
|
229
|
+
return {
|
|
230
|
+
frame: {
|
|
231
|
+
type,
|
|
232
|
+
reqId,
|
|
233
|
+
payload
|
|
234
|
+
},
|
|
235
|
+
remaining
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Error thrown when pending buffer exceeds maximum size
|
|
240
|
+
*/
|
|
241
|
+
var BufferOverflowError = class extends ProtocolError {
|
|
242
|
+
constructor(size, maxSize) {
|
|
243
|
+
super("buffer_overflow", `Pending buffer size ${size} exceeds maximum ${maxSize}`);
|
|
244
|
+
this.name = "BufferOverflowError";
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* Streaming frame decoder that handles:
|
|
249
|
+
* - Partial frames across multiple pushes (拆包)
|
|
250
|
+
* - Multiple frames in single push (粘包)
|
|
251
|
+
* - Buffer overflow protection (security)
|
|
252
|
+
*/
|
|
253
|
+
var FrameDecoder = class {
|
|
254
|
+
buffer = new Uint8Array(0);
|
|
255
|
+
maxPendingSize;
|
|
256
|
+
constructor(options) {
|
|
257
|
+
this.maxPendingSize = options?.maxPendingSize ?? MAX_PAYLOAD_SIZE + HEADER_SIZE;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Push data into the decoder and return any complete frames.
|
|
261
|
+
*
|
|
262
|
+
* @param data New data to append to buffer
|
|
263
|
+
* @returns Array of complete frames (may be empty)
|
|
264
|
+
* @throws InvalidFrameTypeError if frame type is invalid
|
|
265
|
+
* @throws PayloadTooLargeError if payload exceeds maximum
|
|
266
|
+
* @throws BufferOverflowError if pending buffer exceeds maximum
|
|
267
|
+
*/
|
|
268
|
+
push(data) {
|
|
269
|
+
if (data.length === 0) return [];
|
|
270
|
+
const newBuffer = new Uint8Array(this.buffer.length + data.length);
|
|
271
|
+
newBuffer.set(this.buffer, 0);
|
|
272
|
+
newBuffer.set(data, this.buffer.length);
|
|
273
|
+
this.buffer = newBuffer;
|
|
274
|
+
if (this.buffer.length > this.maxPendingSize) throw new BufferOverflowError(this.buffer.length, this.maxPendingSize);
|
|
275
|
+
const frames = [];
|
|
276
|
+
while (this.buffer.length >= HEADER_SIZE) {
|
|
277
|
+
const payloadLength = new DataView(this.buffer.buffer, this.buffer.byteOffset).getUint32(0);
|
|
278
|
+
if (payloadLength > MAX_PAYLOAD_SIZE) throw new PayloadTooLargeError(payloadLength);
|
|
279
|
+
const totalFrameSize = HEADER_SIZE + payloadLength;
|
|
280
|
+
if (this.buffer.length < totalFrameSize) break;
|
|
281
|
+
const { frame, remaining } = decodeFrame(this.buffer);
|
|
282
|
+
frames.push(frame);
|
|
283
|
+
this.buffer = remaining;
|
|
284
|
+
}
|
|
285
|
+
return frames;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Reset the decoder state, discarding any buffered data.
|
|
289
|
+
*/
|
|
290
|
+
reset() {
|
|
291
|
+
this.buffer = new Uint8Array(0);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get the current pending buffer size.
|
|
295
|
+
*/
|
|
296
|
+
get pendingSize() {
|
|
297
|
+
return this.buffer.length;
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
/**
|
|
301
|
+
* Error for invalid message structure
|
|
302
|
+
*/
|
|
303
|
+
var InvalidMessageError = class extends ProtocolError {
|
|
304
|
+
constructor(message) {
|
|
305
|
+
super("invalid_message", message);
|
|
306
|
+
this.name = "InvalidMessageError";
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
/**
|
|
310
|
+
* Error for JSON parsing failures
|
|
311
|
+
*/
|
|
312
|
+
var ParseError = class extends ProtocolError {
|
|
313
|
+
constructor(message) {
|
|
314
|
+
super("parse_error", `Parse error: ${message}`);
|
|
315
|
+
this.name = "ParseError";
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* Error for depth limit exceeded
|
|
320
|
+
*/
|
|
321
|
+
var DepthLimitExceededError = class extends ProtocolError {
|
|
322
|
+
constructor() {
|
|
323
|
+
super("depth_limit_exceeded", `JSON depth limit exceeded (max ${MAX_JSON_DEPTH})`);
|
|
324
|
+
this.name = "DepthLimitExceededError";
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
/**
|
|
328
|
+
* Error for message too large
|
|
329
|
+
*/
|
|
330
|
+
var MessageTooLargeError = class extends ProtocolError {
|
|
331
|
+
constructor(size) {
|
|
332
|
+
super("message_too_large", `Message too large: ${size} bytes (max ${MAX_JSON_SIZE})`);
|
|
333
|
+
this.name = "MessageTooLargeError";
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
/**
|
|
337
|
+
* Dangerous keys that should be filtered for security
|
|
338
|
+
*/
|
|
339
|
+
const DANGEROUS_KEYS = new Set([
|
|
340
|
+
"__proto__",
|
|
341
|
+
"constructor",
|
|
342
|
+
"prototype"
|
|
343
|
+
]);
|
|
344
|
+
/**
|
|
345
|
+
* Recursively filter dangerous keys from an object
|
|
346
|
+
*/
|
|
347
|
+
function filterDangerousKeys(obj, depth = 0) {
|
|
348
|
+
if (depth > MAX_JSON_DEPTH) throw new DepthLimitExceededError();
|
|
349
|
+
if (obj === null || typeof obj !== "object") return obj;
|
|
350
|
+
if (Array.isArray(obj)) return obj.map((item) => filterDangerousKeys(item, depth + 1));
|
|
351
|
+
const filtered = {};
|
|
352
|
+
for (const [key, value] of Object.entries(obj)) if (!DANGEROUS_KEYS.has(key)) filtered[key] = filterDangerousKeys(value, depth + 1);
|
|
353
|
+
return filtered;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Calculate depth of a JSON object
|
|
357
|
+
*/
|
|
358
|
+
function calculateDepth(obj, depth = 0) {
|
|
359
|
+
if (depth > MAX_JSON_DEPTH) return depth;
|
|
360
|
+
if (obj === null || typeof obj !== "object") return depth;
|
|
361
|
+
let maxDepth = depth;
|
|
362
|
+
if (Array.isArray(obj)) for (const item of obj) {
|
|
363
|
+
maxDepth = Math.max(maxDepth, calculateDepth(item, depth + 1));
|
|
364
|
+
if (maxDepth > MAX_JSON_DEPTH) return maxDepth;
|
|
365
|
+
}
|
|
366
|
+
else for (const value of Object.values(obj)) {
|
|
367
|
+
maxDepth = Math.max(maxDepth, calculateDepth(value, depth + 1));
|
|
368
|
+
if (maxDepth > MAX_JSON_DEPTH) return maxDepth;
|
|
369
|
+
}
|
|
370
|
+
return maxDepth;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Serialize a message to JSON bytes.
|
|
374
|
+
*
|
|
375
|
+
* @param message The message to serialize
|
|
376
|
+
* @returns UTF-8 encoded JSON bytes
|
|
377
|
+
* @throws InvalidMessageError if message is invalid
|
|
378
|
+
*/
|
|
379
|
+
function serializeMessage(message) {
|
|
380
|
+
if (!message || typeof message !== "object" || !("type" in message)) throw new InvalidMessageError("Invalid message: missing type");
|
|
381
|
+
const { type } = message;
|
|
382
|
+
if (type === "request") {
|
|
383
|
+
const req = message;
|
|
384
|
+
if (!req.id) throw new InvalidMessageError("Invalid request: missing id");
|
|
385
|
+
if (!req.method) throw new InvalidMessageError("Invalid request: missing method");
|
|
386
|
+
}
|
|
387
|
+
const clean = {};
|
|
388
|
+
for (const [key, value] of Object.entries(message)) if (value !== void 0) clean[key] = value;
|
|
389
|
+
const json = JSON.stringify(clean);
|
|
390
|
+
return new TextEncoder().encode(json);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Deserialize JSON bytes to a message.
|
|
394
|
+
*
|
|
395
|
+
* @param data UTF-8 encoded JSON bytes
|
|
396
|
+
* @returns Parsed message
|
|
397
|
+
* @throws ParseError if JSON is invalid
|
|
398
|
+
* @throws InvalidMessageError if message structure is invalid
|
|
399
|
+
* @throws DepthLimitExceededError if JSON is too deeply nested
|
|
400
|
+
* @throws MessageTooLargeError if message exceeds size limit
|
|
401
|
+
*/
|
|
402
|
+
function deserializeMessage(data) {
|
|
403
|
+
if (data.length > MAX_JSON_SIZE) throw new MessageTooLargeError(data.length);
|
|
404
|
+
let parsed;
|
|
405
|
+
try {
|
|
406
|
+
const json = new TextDecoder().decode(data);
|
|
407
|
+
parsed = JSON.parse(json);
|
|
408
|
+
} catch (e) {
|
|
409
|
+
throw new ParseError(e instanceof Error ? e.message : "Invalid JSON");
|
|
410
|
+
}
|
|
411
|
+
if (!parsed || typeof parsed !== "object") throw new InvalidMessageError("Invalid message: not an object");
|
|
412
|
+
if (calculateDepth(parsed) > MAX_JSON_DEPTH) throw new DepthLimitExceededError();
|
|
413
|
+
const filtered = filterDangerousKeys(parsed);
|
|
414
|
+
if (!("type" in filtered) || typeof filtered.type !== "string") throw new InvalidMessageError("Invalid message: missing type");
|
|
415
|
+
const { type } = filtered;
|
|
416
|
+
if (type !== "request" && type !== "response" && type !== "event") throw new InvalidMessageError(`Invalid message type: ${type}`);
|
|
417
|
+
return filtered;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Bounded buffer for sidecar Binary frames awaiting their JSON sibling.
|
|
421
|
+
*
|
|
422
|
+
* A single logical binary payload may arrive as multiple consecutive Binary
|
|
423
|
+
* frames (§6.4 chunking: each chunk ≤ 64 KB). All chunks for a reqId are
|
|
424
|
+
* accumulated and concatenated before being handed to the JSON handler.
|
|
425
|
+
*
|
|
426
|
+
* Three failure modes we defend against:
|
|
427
|
+
* 1. Orphaned Binary frames (peer sent Binary but then the connection died,
|
|
428
|
+
* or the JSON never arrives for some reason) — capped by MAX_PENDING so
|
|
429
|
+
* a malicious/broken peer can't pin unbounded memory on us.
|
|
430
|
+
* 2. Concurrent inflight requests — up to MAX_PENDING distinct reqIds may
|
|
431
|
+
* have pending binary chunks at any time; oldest is evicted if exceeded.
|
|
432
|
+
* 3. A single reqId reused to accumulate unbounded bytes (#821). MAX_PENDING
|
|
433
|
+
* only bounds the number of DISTINCT reqIds, so a peer reusing ONE reqId
|
|
434
|
+
* could grow a single entry without limit → OOM. maxBytesPerReqId caps the
|
|
435
|
+
* accumulated bytes per reqId; a logical binary payload must never exceed
|
|
436
|
+
* MAX_PAYLOAD_SIZE, so once an entry crosses the cap it is evicted whole.
|
|
437
|
+
*/
|
|
438
|
+
const MAX_PENDING = 16;
|
|
439
|
+
var PendingBinaryBuffer = class {
|
|
440
|
+
map = /* @__PURE__ */ new Map();
|
|
441
|
+
logger;
|
|
442
|
+
maxBytesPerReqId;
|
|
443
|
+
constructor(logger, options) {
|
|
444
|
+
this.logger = logger;
|
|
445
|
+
this.maxBytesPerReqId = options?.maxBytesPerReqId ?? MAX_PAYLOAD_SIZE;
|
|
446
|
+
}
|
|
447
|
+
set(reqId, payload) {
|
|
448
|
+
const existing = this.map.get(reqId);
|
|
449
|
+
if (existing !== void 0) {
|
|
450
|
+
if (existing.bytes + payload.byteLength > this.maxBytesPerReqId) {
|
|
451
|
+
this.map.delete(reqId);
|
|
452
|
+
this.logger?.warn("pendingBinary per-reqId byte cap exceeded — evicted entry", {
|
|
453
|
+
reqId,
|
|
454
|
+
attempted: existing.bytes + payload.byteLength,
|
|
455
|
+
limit: this.maxBytesPerReqId
|
|
456
|
+
});
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
existing.chunks.push(payload);
|
|
460
|
+
existing.bytes += payload.byteLength;
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
if (payload.byteLength > this.maxBytesPerReqId) {
|
|
464
|
+
this.logger?.warn("pendingBinary per-reqId byte cap exceeded — dropped frame", {
|
|
465
|
+
reqId,
|
|
466
|
+
attempted: payload.byteLength,
|
|
467
|
+
limit: this.maxBytesPerReqId
|
|
468
|
+
});
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
if (this.map.size >= MAX_PENDING) {
|
|
472
|
+
const oldestKey = this.map.keys().next().value;
|
|
473
|
+
if (oldestKey !== void 0) {
|
|
474
|
+
this.map.delete(oldestKey);
|
|
475
|
+
this.logger?.warn("pendingBinary buffer full — evicted oldest", {
|
|
476
|
+
evicted: oldestKey,
|
|
477
|
+
limit: MAX_PENDING
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
this.map.set(reqId, {
|
|
482
|
+
chunks: [payload],
|
|
483
|
+
bytes: payload.byteLength
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
take(reqId) {
|
|
487
|
+
const entry = this.map.get(reqId);
|
|
488
|
+
if (entry === void 0) return void 0;
|
|
489
|
+
this.map.delete(reqId);
|
|
490
|
+
const { chunks } = entry;
|
|
491
|
+
if (chunks.length === 0) return new Uint8Array(0);
|
|
492
|
+
if (chunks.length === 1) return chunks[0];
|
|
493
|
+
const result = new Uint8Array(entry.bytes);
|
|
494
|
+
let offset = 0;
|
|
495
|
+
for (const chunk of chunks) {
|
|
496
|
+
result.set(chunk, offset);
|
|
497
|
+
offset += chunk.byteLength;
|
|
498
|
+
}
|
|
499
|
+
return result;
|
|
500
|
+
}
|
|
501
|
+
clear() {
|
|
502
|
+
this.map.clear();
|
|
503
|
+
}
|
|
504
|
+
get size() {
|
|
505
|
+
return this.map.size;
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
/**
|
|
509
|
+
* Bidirectional RPC handler.
|
|
510
|
+
*
|
|
511
|
+
* Manages outgoing requests (send + wait for response) and
|
|
512
|
+
* identifies incoming responses for matching.
|
|
513
|
+
*/
|
|
514
|
+
var RPCHandler = class {
|
|
515
|
+
nextId;
|
|
516
|
+
idIncrement;
|
|
517
|
+
timeout;
|
|
518
|
+
pending = /* @__PURE__ */ new Map();
|
|
519
|
+
constructor(options = {}) {
|
|
520
|
+
this.nextId = options.startId ?? 2;
|
|
521
|
+
this.idIncrement = options.idIncrement ?? 2;
|
|
522
|
+
this.timeout = options.timeout ?? 3e4;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Send a request via transport and wait for the matching response.
|
|
526
|
+
*/
|
|
527
|
+
async sendRequest(transport, method, params) {
|
|
528
|
+
if (!transport.connected) throw new Error("Transport not connected");
|
|
529
|
+
const id = String(this.nextId);
|
|
530
|
+
this.nextId += this.idIncrement;
|
|
531
|
+
if (this.nextId > 4294967294) this.nextId = this.idIncrement === 2 ? this.nextId % 2 === 0 ? 2 : 1 : 1;
|
|
532
|
+
const request = {
|
|
533
|
+
type: "request",
|
|
534
|
+
id,
|
|
535
|
+
method,
|
|
536
|
+
params
|
|
537
|
+
};
|
|
538
|
+
return new Promise((resolve, reject) => {
|
|
539
|
+
const timer = setTimeout(() => {
|
|
540
|
+
this.pending.delete(id);
|
|
541
|
+
reject(/* @__PURE__ */ new Error(`RPC timeout: ${method} (id=${id})`));
|
|
542
|
+
}, this.timeout);
|
|
543
|
+
this.pending.set(id, {
|
|
544
|
+
resolve: (response) => {
|
|
545
|
+
if (response.error) {
|
|
546
|
+
const errObj = response.error;
|
|
547
|
+
const isStructured = typeof errObj === "object" && errObj !== null;
|
|
548
|
+
const message = isStructured ? errObj.message || JSON.stringify(errObj) : String(errObj);
|
|
549
|
+
const err = new Error(message);
|
|
550
|
+
if (isStructured) {
|
|
551
|
+
const code = errObj.code;
|
|
552
|
+
const details = errObj.details;
|
|
553
|
+
if (typeof code === "string") Object.defineProperty(err, "code", {
|
|
554
|
+
value: code,
|
|
555
|
+
enumerable: false,
|
|
556
|
+
configurable: true,
|
|
557
|
+
writable: false
|
|
558
|
+
});
|
|
559
|
+
if (details !== void 0) Object.defineProperty(err, "details", {
|
|
560
|
+
value: details,
|
|
561
|
+
enumerable: false,
|
|
562
|
+
configurable: true,
|
|
563
|
+
writable: false
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
reject(err);
|
|
567
|
+
} else resolve(response.result);
|
|
568
|
+
},
|
|
569
|
+
reject,
|
|
570
|
+
timer
|
|
571
|
+
});
|
|
572
|
+
const reqIdNum = Number.parseInt(id, 10);
|
|
573
|
+
const { message: cleanRequest, binary } = extractBinary(request);
|
|
574
|
+
const send = async () => {
|
|
575
|
+
if (binary) for (let offset = 0; offset < binary.byteLength; offset += CHUNK_SIZE) await transport.send({
|
|
576
|
+
type: FrameType.Binary,
|
|
577
|
+
reqId: reqIdNum,
|
|
578
|
+
payload: binary.subarray(offset, Math.min(offset + CHUNK_SIZE, binary.byteLength))
|
|
579
|
+
});
|
|
580
|
+
await transport.send({
|
|
581
|
+
type: FrameType.JSON,
|
|
582
|
+
reqId: reqIdNum,
|
|
583
|
+
payload: serializeMessage(cleanRequest)
|
|
584
|
+
});
|
|
585
|
+
};
|
|
586
|
+
send().catch((err) => {
|
|
587
|
+
clearTimeout(timer);
|
|
588
|
+
this.pending.delete(id);
|
|
589
|
+
reject(err);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Try to handle a frame as a response to a pending request.
|
|
595
|
+
* Returns true if it was a response we were waiting for, false otherwise.
|
|
596
|
+
*
|
|
597
|
+
* Callers must splice any sidecar Binary frame into the message before
|
|
598
|
+
* calling — by the time we see a `Response`, its result is final.
|
|
599
|
+
*/
|
|
600
|
+
handleResponse(response) {
|
|
601
|
+
const pending = this.pending.get(response.id);
|
|
602
|
+
if (!pending) return false;
|
|
603
|
+
clearTimeout(pending.timer);
|
|
604
|
+
this.pending.delete(response.id);
|
|
605
|
+
pending.resolve(response);
|
|
606
|
+
return true;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Reject all pending requests (e.g., on disconnect).
|
|
610
|
+
*/
|
|
611
|
+
rejectAll(error) {
|
|
612
|
+
for (const [_id, pending] of this.pending) {
|
|
613
|
+
clearTimeout(pending.timer);
|
|
614
|
+
pending.reject(error);
|
|
615
|
+
}
|
|
616
|
+
this.pending.clear();
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Number of pending requests.
|
|
620
|
+
*/
|
|
621
|
+
get pendingCount() {
|
|
622
|
+
return this.pending.size;
|
|
623
|
+
}
|
|
624
|
+
};
|
|
625
|
+
/**
|
|
626
|
+
* Protocol version
|
|
627
|
+
*/
|
|
628
|
+
const PROTOCOL_VERSION = "1.0";
|
|
629
|
+
const log$2 = makeNsLog("session");
|
|
630
|
+
const log$1 = makeNsLog("session");
|
|
631
|
+
/**
|
|
632
|
+
* SessionClient — provider-side session participant.
|
|
633
|
+
*
|
|
634
|
+
* Connects to a SessionHost, attaches with a namespace + manifest,
|
|
635
|
+
* and handles incoming AFS requests by routing them to provider instances.
|
|
636
|
+
*/
|
|
637
|
+
const log = makeNsLog("session");
|
|
638
|
+
/**
|
|
639
|
+
* Error for WebSocket operations
|
|
640
|
+
*/
|
|
641
|
+
var WebSocketError = class extends Error {
|
|
642
|
+
constructor(code, message) {
|
|
643
|
+
super(message);
|
|
644
|
+
this.code = code;
|
|
645
|
+
this.name = "WebSocketError";
|
|
646
|
+
}
|
|
647
|
+
};
|
|
648
|
+
/**
|
|
649
|
+
* Encode an auth token for safe transport inside a
|
|
650
|
+
* `Sec-WebSocket-Protocol` subprotocol name. Per RFC 6455, subprotocol
|
|
651
|
+
* names must be RFC 2616 tokens — alphanumerics and a small set of
|
|
652
|
+
* punctuation. Hex encoding guarantees the value survives the wire
|
|
653
|
+
* unchanged regardless of the original token's characters.
|
|
654
|
+
*/
|
|
655
|
+
function encodeBearerToken(raw) {
|
|
656
|
+
return Buffer.from(raw, "utf8").toString("hex");
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* WebSocket client transport (uses browser WebSocket API).
|
|
660
|
+
*/
|
|
661
|
+
var ClientWebSocketTransport = class {
|
|
662
|
+
ws;
|
|
663
|
+
decoder = new FrameDecoder();
|
|
664
|
+
handlers = /* @__PURE__ */ new Map();
|
|
665
|
+
_connected = false;
|
|
666
|
+
constructor(ws) {
|
|
667
|
+
this.ws = ws;
|
|
668
|
+
this._connected = ws.readyState === WebSocket.OPEN;
|
|
669
|
+
this.setupHandlers();
|
|
670
|
+
}
|
|
671
|
+
setupHandlers() {
|
|
672
|
+
this.ws.onmessage = (event) => {
|
|
673
|
+
try {
|
|
674
|
+
const data = event.data instanceof ArrayBuffer ? new Uint8Array(event.data) : typeof event.data === "string" ? new TextEncoder().encode(event.data) : new Uint8Array(event.data);
|
|
675
|
+
const frames = this.decoder.push(data);
|
|
676
|
+
for (const frame of frames) this.emit("frame", frame);
|
|
677
|
+
} catch (error) {
|
|
678
|
+
this.emit("error", error);
|
|
679
|
+
}
|
|
680
|
+
};
|
|
681
|
+
this.ws.onclose = () => {
|
|
682
|
+
this._connected = false;
|
|
683
|
+
this.emit("close");
|
|
684
|
+
};
|
|
685
|
+
this.ws.onerror = () => {
|
|
686
|
+
this.emit("error", /* @__PURE__ */ new Error("WebSocket error"));
|
|
687
|
+
};
|
|
688
|
+
this.ws.onopen = () => {
|
|
689
|
+
this._connected = true;
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
async send(frame) {
|
|
693
|
+
if (!this._connected) throw new WebSocketError("not_connected", "Transport is not connected");
|
|
694
|
+
const encoded = encodeFrame(frame.type, frame.reqId, frame.payload);
|
|
695
|
+
this.ws.send(encoded);
|
|
696
|
+
}
|
|
697
|
+
async close() {
|
|
698
|
+
if (this._connected) {
|
|
699
|
+
this.ws.close();
|
|
700
|
+
this._connected = false;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
on(event, handler) {
|
|
704
|
+
if (!this.handlers.has(event)) this.handlers.set(event, /* @__PURE__ */ new Set());
|
|
705
|
+
this.handlers.get(event).add(handler);
|
|
706
|
+
}
|
|
707
|
+
off(event, handler) {
|
|
708
|
+
this.handlers.get(event)?.delete(handler);
|
|
709
|
+
}
|
|
710
|
+
emit(event, ...args) {
|
|
711
|
+
const handlers = this.handlers.get(event);
|
|
712
|
+
if (handlers) for (const handler of handlers) handler(...args);
|
|
713
|
+
}
|
|
714
|
+
get connected() {
|
|
715
|
+
return this._connected;
|
|
716
|
+
}
|
|
717
|
+
};
|
|
718
|
+
/**
|
|
719
|
+
* WebSocket client implementation.
|
|
720
|
+
*/
|
|
721
|
+
var WebSocketClient = class {
|
|
722
|
+
ws = null;
|
|
723
|
+
transport = null;
|
|
724
|
+
host;
|
|
725
|
+
port;
|
|
726
|
+
authToken;
|
|
727
|
+
handlers = /* @__PURE__ */ new Map();
|
|
728
|
+
constructor(options = {}) {
|
|
729
|
+
this.host = options.host || "localhost";
|
|
730
|
+
this.port = options.port || 9999;
|
|
731
|
+
this.authToken = options.authToken;
|
|
732
|
+
}
|
|
733
|
+
async connect() {
|
|
734
|
+
return new Promise((resolve, reject) => {
|
|
735
|
+
const url = `ws://${this.host}:${this.port}`;
|
|
736
|
+
const protocols = this.authToken ? [`bearer.${encodeBearerToken(this.authToken)}`] : void 0;
|
|
737
|
+
this.ws = protocols ? new WebSocket(url, protocols) : new WebSocket(url);
|
|
738
|
+
this.ws.binaryType = "arraybuffer";
|
|
739
|
+
this.ws.onopen = () => {
|
|
740
|
+
this.transport = new ClientWebSocketTransport(this.ws);
|
|
741
|
+
this.transport.on("frame", (frame) => this.emit("frame", frame));
|
|
742
|
+
this.transport.on("error", (error) => this.emit("error", error));
|
|
743
|
+
this.transport.on("close", () => this.emit("close"));
|
|
744
|
+
resolve();
|
|
745
|
+
};
|
|
746
|
+
this.ws.onerror = () => {
|
|
747
|
+
reject(new WebSocketError("connection_failed", "Failed to connect"));
|
|
748
|
+
};
|
|
749
|
+
this.ws.onclose = (event) => {
|
|
750
|
+
if (!this.transport) if (event.code === 1002 || event.code === 1008) reject(new WebSocketError("auth_failed", "Authentication failed"));
|
|
751
|
+
else reject(new WebSocketError("connection_failed", "Connection closed"));
|
|
752
|
+
};
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
async send(frame) {
|
|
756
|
+
if (!this.transport) throw new WebSocketError("not_connected", "Client is not connected");
|
|
757
|
+
return this.transport.send(frame);
|
|
758
|
+
}
|
|
759
|
+
async close() {
|
|
760
|
+
if (this.transport) await this.transport.close();
|
|
761
|
+
this.ws = null;
|
|
762
|
+
this.transport = null;
|
|
763
|
+
}
|
|
764
|
+
on(event, handler) {
|
|
765
|
+
if (!this.handlers.has(event)) this.handlers.set(event, /* @__PURE__ */ new Set());
|
|
766
|
+
this.handlers.get(event).add(handler);
|
|
767
|
+
}
|
|
768
|
+
off(event, handler) {
|
|
769
|
+
this.handlers.get(event)?.delete(handler);
|
|
770
|
+
}
|
|
771
|
+
emit(event, ...args) {
|
|
772
|
+
const handlers = this.handlers.get(event);
|
|
773
|
+
if (handlers) for (const handler of handlers) handler(...args);
|
|
774
|
+
}
|
|
775
|
+
get connected() {
|
|
776
|
+
return this.transport?.connected ?? false;
|
|
777
|
+
}
|
|
778
|
+
};
|
|
779
|
+
|
|
780
|
+
//#endregion
|
|
781
|
+
export { FrameType, PROTOCOL_VERSION, PendingBinaryBuffer, RPCHandler, WebSocketClient, deserializeMessage, injectBinary };
|
|
782
|
+
//# sourceMappingURL=index.mjs.map
|