@opendatalabs/personal-server-ts-core 1.34.2 → 1.35.1
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/dist/additions/durable.d.ts +32 -2
- package/dist/additions/durable.d.ts.map +1 -1
- package/dist/additions/durable.js +237 -88
- package/dist/additions/durable.js.map +1 -1
- package/dist/additions/version-inventory.d.ts +4 -0
- package/dist/additions/version-inventory.d.ts.map +1 -1
- package/dist/additions/version-inventory.js +11 -1
- package/dist/additions/version-inventory.js.map +1 -1
- package/dist/api/index.d.ts +18 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +172 -4
- package/dist/api/index.js.map +1 -1
- package/dist/api/oura-collection-requirements.d.ts +16 -0
- package/dist/api/oura-collection-requirements.d.ts.map +1 -0
- package/dist/api/oura-collection-requirements.js +70 -0
- package/dist/api/oura-collection-requirements.js.map +1 -0
- package/dist/api/scope-upload-batches.d.ts +18 -0
- package/dist/api/scope-upload-batches.d.ts.map +1 -0
- package/dist/api/scope-upload-batches.js +71 -0
- package/dist/api/scope-upload-batches.js.map +1 -0
- package/dist/api/scope-uploads.d.ts +112 -0
- package/dist/api/scope-uploads.d.ts.map +1 -0
- package/dist/api/scope-uploads.js +369 -0
- package/dist/api/scope-uploads.js.map +1 -0
- package/dist/client.d.ts +70 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/contracts/data.d.ts +8 -0
- package/dist/contracts/data.d.ts.map +1 -1
- package/dist/contracts/data.js +31 -1
- package/dist/contracts/data.js.map +1 -1
- package/dist/contracts/grants.d.ts.map +1 -1
- package/dist/contracts/grants.js +3 -0
- package/dist/contracts/grants.js.map +1 -1
- package/dist/contracts/index.d.ts +3 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +3 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/oura-collection-requirements.d.ts +17 -0
- package/dist/contracts/oura-collection-requirements.d.ts.map +1 -0
- package/dist/contracts/oura-collection-requirements.js +49 -0
- package/dist/contracts/oura-collection-requirements.js.map +1 -0
- package/dist/legacy-projection/bindings.d.ts +1 -7
- package/dist/legacy-projection/bindings.d.ts.map +1 -1
- package/dist/legacy-projection/bindings.js +162 -28
- package/dist/legacy-projection/bindings.js.map +1 -1
- package/dist/legacy-projection/index.d.ts +6 -5
- package/dist/legacy-projection/index.d.ts.map +1 -1
- package/dist/legacy-projection/index.js +9 -21
- package/dist/legacy-projection/index.js.map +1 -1
- package/dist/legacy-projection/oura-browser-bindings.d.ts +2 -0
- package/dist/legacy-projection/oura-browser-bindings.d.ts.map +1 -1
- package/dist/legacy-projection/oura-browser-bindings.js +2 -0
- package/dist/legacy-projection/oura-browser-bindings.js.map +1 -1
- package/dist/legacy-projection/strava-browser-bindings.d.ts +3 -0
- package/dist/legacy-projection/strava-browser-bindings.d.ts.map +1 -0
- package/dist/legacy-projection/strava-browser-bindings.js +32 -0
- package/dist/legacy-projection/strava-browser-bindings.js.map +1 -0
- package/dist/legacy-projection/types.d.ts +44 -12
- package/dist/legacy-projection/types.d.ts.map +1 -1
- package/dist/mcp/connection-api.d.ts +11 -1
- package/dist/mcp/connection-api.d.ts.map +1 -1
- package/dist/mcp/connection-api.js +94 -9
- package/dist/mcp/connection-api.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +19 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/store.d.ts +10 -1
- package/dist/mcp/store.d.ts.map +1 -1
- package/dist/mcp/store.js +51 -0
- package/dist/mcp/store.js.map +1 -1
- package/dist/mcp/tools.d.ts +52 -2
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +395 -11
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts +36 -2
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js +12 -0
- package/dist/mcp/types.js.map +1 -1
- package/dist/mcp/write-client.d.ts +81 -0
- package/dist/mcp/write-client.d.ts.map +1 -0
- package/dist/mcp/write-client.js +140 -0
- package/dist/mcp/write-client.js.map +1 -0
- package/dist/oura/history-policy.d.ts +12 -0
- package/dist/oura/history-policy.d.ts.map +1 -0
- package/dist/oura/history-policy.js +54 -0
- package/dist/oura/history-policy.js.map +1 -0
- package/dist/oura/index.d.ts +51 -0
- package/dist/oura/index.d.ts.map +1 -0
- package/dist/oura/index.js +315 -0
- package/dist/oura/index.js.map +1 -0
- package/dist/pdpp/approval.d.ts +1 -1
- package/dist/pdpp/approval.d.ts.map +1 -1
- package/dist/pdpp/approval.js +29 -10
- package/dist/pdpp/approval.js.map +1 -1
- package/dist/pdpp/declaration-limits.d.ts +7 -0
- package/dist/pdpp/declaration-limits.d.ts.map +1 -0
- package/dist/pdpp/declaration-limits.js +7 -0
- package/dist/pdpp/declaration-limits.js.map +1 -0
- package/dist/pdpp/declaration.d.ts +2 -1
- package/dist/pdpp/declaration.d.ts.map +1 -1
- package/dist/pdpp/declaration.js +2 -1
- package/dist/pdpp/declaration.js.map +1 -1
- package/dist/pdpp/index.d.ts +3 -2
- package/dist/pdpp/index.d.ts.map +1 -1
- package/dist/pdpp/index.js +3 -2
- package/dist/pdpp/index.js.map +1 -1
- package/dist/pdpp/issuance.d.ts.map +1 -1
- package/dist/pdpp/issuance.js +6 -2
- package/dist/pdpp/issuance.js.map +1 -1
- package/dist/pdpp/resolve.d.ts +12 -1
- package/dist/pdpp/resolve.d.ts.map +1 -1
- package/dist/pdpp/resolve.js +156 -58
- package/dist/pdpp/resolve.js.map +1 -1
- package/dist/pdpp/selection.d.ts +30 -1
- package/dist/pdpp/selection.d.ts.map +1 -1
- package/dist/pdpp/selection.js +77 -26
- package/dist/pdpp/selection.js.map +1 -1
- package/dist/pdpp/time.d.ts +39 -0
- package/dist/pdpp/time.d.ts.map +1 -0
- package/dist/pdpp/time.js +173 -0
- package/dist/pdpp/time.js.map +1 -0
- package/dist/pdpp/tokens.d.ts.map +1 -1
- package/dist/pdpp/tokens.js +4 -2
- package/dist/pdpp/tokens.js.map +1 -1
- package/dist/pdpp/types.d.ts +18 -2
- package/dist/pdpp/types.d.ts.map +1 -1
- package/dist/pdpp/types.js +7 -0
- package/dist/pdpp/types.js.map +1 -1
- package/dist/policy/reserved-scopes.d.ts +7 -0
- package/dist/policy/reserved-scopes.d.ts.map +1 -1
- package/dist/policy/reserved-scopes.js +12 -1
- package/dist/policy/reserved-scopes.js.map +1 -1
- package/dist/ports/index.d.ts +85 -1
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/pdpp-auth.d.ts +17 -27
- package/dist/ports/pdpp-auth.d.ts.map +1 -1
- package/dist/ports/pdpp-auth.js +14 -28
- package/dist/ports/pdpp-auth.js.map +1 -1
- package/dist/publication/publish.d.ts +96 -0
- package/dist/publication/publish.d.ts.map +1 -0
- package/dist/publication/publish.js +261 -0
- package/dist/publication/publish.js.map +1 -0
- package/dist/replication/completion.d.ts +20 -0
- package/dist/replication/completion.d.ts.map +1 -0
- package/dist/replication/completion.js +73 -0
- package/dist/replication/completion.js.map +1 -0
- package/dist/replication/coordinator-state.d.ts +29 -0
- package/dist/replication/coordinator-state.d.ts.map +1 -0
- package/dist/replication/coordinator-state.js +88 -0
- package/dist/replication/coordinator-state.js.map +1 -0
- package/dist/replication/coordinator-state.test-utils.d.ts +32 -0
- package/dist/replication/coordinator-state.test-utils.d.ts.map +1 -0
- package/dist/replication/coordinator-state.test-utils.js +113 -0
- package/dist/replication/coordinator-state.test-utils.js.map +1 -0
- package/dist/replication/coordinator.d.ts +264 -0
- package/dist/replication/coordinator.d.ts.map +1 -0
- package/dist/replication/coordinator.js +499 -0
- package/dist/replication/coordinator.js.map +1 -0
- package/dist/replication/copies.d.ts +126 -0
- package/dist/replication/copies.d.ts.map +1 -0
- package/dist/replication/copies.js +437 -0
- package/dist/replication/copies.js.map +1 -0
- package/dist/replication/copy-promotion.d.ts +132 -0
- package/dist/replication/copy-promotion.d.ts.map +1 -0
- package/dist/replication/copy-promotion.js +126 -0
- package/dist/replication/copy-promotion.js.map +1 -0
- package/dist/replication/door.d.ts +33 -0
- package/dist/replication/door.d.ts.map +1 -0
- package/dist/replication/door.js +10 -0
- package/dist/replication/door.js.map +1 -0
- package/dist/replication/dpv2.d.ts +141 -0
- package/dist/replication/dpv2.d.ts.map +1 -0
- package/dist/replication/dpv2.js +320 -0
- package/dist/replication/dpv2.js.map +1 -0
- package/dist/replication/effects.d.ts +68 -0
- package/dist/replication/effects.d.ts.map +1 -0
- package/dist/replication/effects.js +89 -0
- package/dist/replication/effects.js.map +1 -0
- package/dist/replication/engine.d.ts +378 -0
- package/dist/replication/engine.d.ts.map +1 -0
- package/dist/replication/engine.js +3197 -0
- package/dist/replication/engine.js.map +1 -0
- package/dist/replication/envelope.d.ts +481 -0
- package/dist/replication/envelope.d.ts.map +1 -0
- package/dist/replication/envelope.js +192 -0
- package/dist/replication/envelope.js.map +1 -0
- package/dist/replication/evidence.d.ts +118 -0
- package/dist/replication/evidence.d.ts.map +1 -0
- package/dist/replication/evidence.js +198 -0
- package/dist/replication/evidence.js.map +1 -0
- package/dist/replication/finality.d.ts +16 -0
- package/dist/replication/finality.d.ts.map +1 -0
- package/dist/replication/finality.js +11 -0
- package/dist/replication/finality.js.map +1 -0
- package/dist/replication/fixtures.d.ts +16 -0
- package/dist/replication/fixtures.d.ts.map +1 -0
- package/dist/replication/fixtures.js +47 -0
- package/dist/replication/fixtures.js.map +1 -0
- package/dist/replication/host-config.d.ts +52 -0
- package/dist/replication/host-config.d.ts.map +1 -0
- package/dist/replication/host-config.js +111 -0
- package/dist/replication/host-config.js.map +1 -0
- package/dist/replication/host-driver.d.ts +95 -0
- package/dist/replication/host-driver.d.ts.map +1 -0
- package/dist/replication/host-driver.js +202 -0
- package/dist/replication/host-driver.js.map +1 -0
- package/dist/replication/host-ports.d.ts +48 -0
- package/dist/replication/host-ports.d.ts.map +1 -0
- package/dist/replication/host-ports.js +69 -0
- package/dist/replication/host-ports.js.map +1 -0
- package/dist/replication/identity.d.ts +13 -0
- package/dist/replication/identity.d.ts.map +1 -0
- package/dist/replication/identity.js +22 -0
- package/dist/replication/identity.js.map +1 -0
- package/dist/replication/limits.d.ts +124 -0
- package/dist/replication/limits.d.ts.map +1 -0
- package/dist/replication/limits.js +182 -0
- package/dist/replication/limits.js.map +1 -0
- package/dist/replication/merge-plan.d.ts +92 -0
- package/dist/replication/merge-plan.d.ts.map +1 -0
- package/dist/replication/merge-plan.js +229 -0
- package/dist/replication/merge-plan.js.map +1 -0
- package/dist/replication/namespace.d.ts +4 -0
- package/dist/replication/namespace.d.ts.map +1 -0
- package/dist/replication/namespace.js +7 -0
- package/dist/replication/namespace.js.map +1 -0
- package/dist/replication/outcome.d.ts +178 -0
- package/dist/replication/outcome.d.ts.map +1 -0
- package/dist/replication/outcome.js +83 -0
- package/dist/replication/outcome.js.map +1 -0
- package/dist/replication/payload.d.ts +39 -0
- package/dist/replication/payload.d.ts.map +1 -0
- package/dist/replication/payload.js +137 -0
- package/dist/replication/payload.js.map +1 -0
- package/dist/replication/preparation.d.ts +42 -0
- package/dist/replication/preparation.d.ts.map +1 -0
- package/dist/replication/preparation.js +118 -0
- package/dist/replication/preparation.js.map +1 -0
- package/dist/replication/rebaseline.d.ts +33 -0
- package/dist/replication/rebaseline.d.ts.map +1 -0
- package/dist/replication/rebaseline.js +40 -0
- package/dist/replication/rebaseline.js.map +1 -0
- package/dist/replication/rebinding.d.ts +43 -0
- package/dist/replication/rebinding.d.ts.map +1 -0
- package/dist/replication/rebinding.js +52 -0
- package/dist/replication/rebinding.js.map +1 -0
- package/dist/replication/receive.d.ts +57 -0
- package/dist/replication/receive.d.ts.map +1 -0
- package/dist/replication/receive.js +114 -0
- package/dist/replication/receive.js.map +1 -0
- package/dist/replication/record-reducer.d.ts +16 -0
- package/dist/replication/record-reducer.d.ts.map +1 -0
- package/dist/replication/record-reducer.js +52 -0
- package/dist/replication/record-reducer.js.map +1 -0
- package/dist/replication/revision.d.ts +24 -0
- package/dist/replication/revision.d.ts.map +1 -0
- package/dist/replication/revision.js +35 -0
- package/dist/replication/revision.js.map +1 -0
- package/dist/replication/roster.d.ts +53 -0
- package/dist/replication/roster.d.ts.map +1 -0
- package/dist/replication/roster.js +115 -0
- package/dist/replication/roster.js.map +1 -0
- package/dist/replication/schedule.d.ts +73 -0
- package/dist/replication/schedule.d.ts.map +1 -0
- package/dist/replication/schedule.js +182 -0
- package/dist/replication/schedule.js.map +1 -0
- package/dist/replication/stream.d.ts +73 -0
- package/dist/replication/stream.d.ts.map +1 -0
- package/dist/replication/stream.js +542 -0
- package/dist/replication/stream.js.map +1 -0
- package/dist/replication/transport.d.ts +236 -0
- package/dist/replication/transport.d.ts.map +1 -0
- package/dist/replication/transport.js +440 -0
- package/dist/replication/transport.js.map +1 -0
- package/dist/replication/visibility-engine.d.ts +337 -0
- package/dist/replication/visibility-engine.d.ts.map +1 -0
- package/dist/replication/visibility-engine.js +602 -0
- package/dist/replication/visibility-engine.js.map +1 -0
- package/dist/replication/visibility-policy.d.ts +26 -0
- package/dist/replication/visibility-policy.d.ts.map +1 -0
- package/dist/replication/visibility-policy.js +33 -0
- package/dist/replication/visibility-policy.js.map +1 -0
- package/dist/replication/writer-identity-store.d.ts +100 -0
- package/dist/replication/writer-identity-store.d.ts.map +1 -0
- package/dist/replication/writer-identity-store.js +218 -0
- package/dist/replication/writer-identity-store.js.map +1 -0
- package/dist/replication/writer-identity.d.ts +252 -0
- package/dist/replication/writer-identity.d.ts.map +1 -0
- package/dist/replication/writer-identity.js +281 -0
- package/dist/replication/writer-identity.js.map +1 -0
- package/dist/replication/writer-identity.test-utils.d.ts +24 -0
- package/dist/replication/writer-identity.test-utils.d.ts.map +1 -0
- package/dist/replication/writer-identity.test-utils.js +86 -0
- package/dist/replication/writer-identity.test-utils.js.map +1 -0
- package/dist/schemas/server-config.d.ts +13 -0
- package/dist/schemas/server-config.d.ts.map +1 -1
- package/dist/schemas/server-config.js +24 -0
- package/dist/schemas/server-config.js.map +1 -1
- package/dist/storage/adapters/index.d.ts +3 -1
- package/dist/storage/adapters/index.d.ts.map +1 -1
- package/dist/storage/adapters/index.js +2 -0
- package/dist/storage/adapters/index.js.map +1 -1
- package/dist/storage/adapters/interface.d.ts +18 -1
- package/dist/storage/adapters/interface.d.ts.map +1 -1
- package/dist/storage/adapters/interface.js +13 -1
- package/dist/storage/adapters/interface.js.map +1 -1
- package/dist/storage/adapters/sdk.d.ts +2 -1
- package/dist/storage/adapters/sdk.d.ts.map +1 -1
- package/dist/storage/adapters/sdk.js +21 -3
- package/dist/storage/adapters/sdk.js.map +1 -1
- package/dist/storage/adapters/vana-audience.d.ts +17 -5
- package/dist/storage/adapters/vana-audience.d.ts.map +1 -1
- package/dist/storage/adapters/vana-audience.js +24 -9
- package/dist/storage/adapters/vana-audience.js.map +1 -1
- package/dist/storage/adapters/vana.d.ts +2 -2
- package/dist/storage/adapters/vana.d.ts.map +1 -1
- package/dist/storage/adapters/vana.js +30 -22
- package/dist/storage/adapters/vana.js.map +1 -1
- package/dist/storage/canonical-legacy-projection.d.ts +1 -1
- package/dist/storage/canonical-legacy-projection.d.ts.map +1 -1
- package/dist/storage/canonical-legacy-projection.js +13 -15
- package/dist/storage/canonical-legacy-projection.js.map +1 -1
- package/dist/storage/legacy-projection.d.ts.map +1 -1
- package/dist/storage/legacy-projection.js +16 -1
- package/dist/storage/legacy-projection.js.map +1 -1
- package/dist/storage/legacy-scope-coverage-exceptions.d.ts +5 -0
- package/dist/storage/legacy-scope-coverage-exceptions.d.ts.map +1 -1
- package/dist/storage/legacy-scope-coverage-exceptions.js +4 -0
- package/dist/storage/legacy-scope-coverage-exceptions.js.map +1 -1
- package/dist/storage/legacy-scope-coverage.d.ts.map +1 -1
- package/dist/storage/legacy-scope-coverage.js +14 -1
- package/dist/storage/legacy-scope-coverage.js.map +1 -1
- package/dist/storage/legacy-scope-entity-keys.d.ts +14 -1
- package/dist/storage/legacy-scope-entity-keys.d.ts.map +1 -1
- package/dist/storage/legacy-scope-entity-keys.js +18 -1
- package/dist/storage/legacy-scope-entity-keys.js.map +1 -1
- package/dist/storage/legacy-scope-view.d.ts +57 -5
- package/dist/storage/legacy-scope-view.d.ts.map +1 -1
- package/dist/storage/legacy-scope-view.js +644 -318
- package/dist/storage/legacy-scope-view.js.map +1 -1
- package/dist/storage/pdpp-records/cursor.d.ts +47 -2
- package/dist/storage/pdpp-records/cursor.d.ts.map +1 -1
- package/dist/storage/pdpp-records/cursor.js +7 -0
- package/dist/storage/pdpp-records/cursor.js.map +1 -1
- package/dist/storage/pdpp-records/enforcement.d.ts +3 -16
- package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -1
- package/dist/storage/pdpp-records/enforcement.js +40 -13
- package/dist/storage/pdpp-records/enforcement.js.map +1 -1
- package/dist/storage/pdpp-records/index.d.ts +2 -0
- package/dist/storage/pdpp-records/index.d.ts.map +1 -1
- package/dist/storage/pdpp-records/index.js +1 -0
- package/dist/storage/pdpp-records/index.js.map +1 -1
- package/dist/storage/pdpp-records/interface.d.ts +8 -1
- package/dist/storage/pdpp-records/interface.d.ts.map +1 -1
- package/dist/storage/pdpp-records/list-page.d.ts +35 -0
- package/dist/storage/pdpp-records/list-page.d.ts.map +1 -0
- package/dist/storage/pdpp-records/list-page.js +106 -0
- package/dist/storage/pdpp-records/list-page.js.map +1 -0
- package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -1
- package/dist/storage/pdpp-records/memory-store.js +95 -99
- package/dist/storage/pdpp-records/memory-store.js.map +1 -1
- package/dist/storage/pdpp-records/portable.d.ts +3 -0
- package/dist/storage/pdpp-records/portable.d.ts.map +1 -1
- package/dist/storage/pdpp-records/portable.js +3 -0
- package/dist/storage/pdpp-records/portable.js.map +1 -1
- package/dist/storage/pdpp-records/replication-journal.d.ts +20 -0
- package/dist/storage/pdpp-records/replication-journal.d.ts.map +1 -0
- package/dist/storage/pdpp-records/replication-journal.js +2 -0
- package/dist/storage/pdpp-records/replication-journal.js.map +1 -0
- package/dist/storage/pdpp-records/stream-declaration.d.ts +0 -2
- package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -1
- package/dist/storage/pdpp-records/stream-declaration.js +0 -9
- package/dist/storage/pdpp-records/stream-declaration.js.map +1 -1
- package/dist/storage/pdpp-records/sync-selection.d.ts +4 -0
- package/dist/storage/pdpp-records/sync-selection.d.ts.map +1 -0
- package/dist/storage/pdpp-records/sync-selection.js +37 -0
- package/dist/storage/pdpp-records/sync-selection.js.map +1 -0
- package/dist/storage/pdpp-records/types.d.ts +64 -0
- package/dist/storage/pdpp-records/types.d.ts.map +1 -1
- package/dist/storage/pdpp-records/types.js.map +1 -1
- package/dist/sync/delete-data-port.d.ts +15 -0
- package/dist/sync/delete-data-port.d.ts.map +1 -1
- package/dist/sync/delete-data-port.js +19 -7
- package/dist/sync/delete-data-port.js.map +1 -1
- package/dist/sync/index.d.ts +2 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/pending-blob-deletions.d.ts +18 -2
- package/dist/sync/pending-blob-deletions.d.ts.map +1 -1
- package/dist/sync/pending-blob-deletions.js +69 -23
- package/dist/sync/pending-blob-deletions.js.map +1 -1
- package/dist/sync/workers/delete.d.ts.map +1 -1
- package/dist/sync/workers/delete.js +332 -142
- package/dist/sync/workers/delete.js.map +1 -1
- package/dist/sync/workers/download.d.ts.map +1 -1
- package/dist/sync/workers/download.js +53 -5
- package/dist/sync/workers/download.js.map +1 -1
- package/dist/sync/workers/upload.d.ts +24 -5
- package/dist/sync/workers/upload.d.ts.map +1 -1
- package/dist/sync/workers/upload.js +160 -275
- package/dist/sync/workers/upload.js.map +1 -1
- package/dist/test-utils/memory-storage.d.ts.map +1 -1
- package/dist/test-utils/memory-storage.js +17 -2
- package/dist/test-utils/memory-storage.js.map +1 -1
- package/package.json +24 -2
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The host side of replication scheduling (host contract §4.4).
|
|
3
|
+
*
|
|
4
|
+
* A host owns only *when* to step: one timer at the coordinator's `nextWake`
|
|
5
|
+
* and explicit triggers (foreground, local write, network back, "Sync now").
|
|
6
|
+
* Retries, backoff, deadlines and phase order stay in the coordinator. This
|
|
7
|
+
* driver adds no semantic scheduling; it only turns `nextWake` into one timer,
|
|
8
|
+
* keeps steps single-flight and drains the running step on stop.
|
|
9
|
+
*
|
|
10
|
+
* Browser-safe: Node (`packages/server`) and PS-Lite use the same driver.
|
|
11
|
+
*/
|
|
12
|
+
import { type ProgressReport, type ReplicaBudget } from "./coordinator.js";
|
|
13
|
+
/** Never step more often than this from the timer alone. */
|
|
14
|
+
export declare const REPLICA_WAKE_MIN_MS = 1000;
|
|
15
|
+
/** Idle cadence: also the delay when the coordinator reports no deadline. */
|
|
16
|
+
export declare const REPLICA_WAKE_MAX_MS: number;
|
|
17
|
+
/** Delay after a step that threw (a bug or a closed store, never a verdict). */
|
|
18
|
+
export declare const REPLICA_STEP_ERROR_DELAY_MS = 60000;
|
|
19
|
+
/**
|
|
20
|
+
* A committed local write steps within this window. Writes inside the window
|
|
21
|
+
* share its one step, so a connector run steps at most once per window
|
|
22
|
+
* instead of once per page.
|
|
23
|
+
*/
|
|
24
|
+
export declare const REPLICA_LOCAL_WRITE_DEBOUNCE_MS = 2000;
|
|
25
|
+
/** One finite step. Node's transport worker and PS-Lite's runtime implement it. */
|
|
26
|
+
export interface ReplicationStepper {
|
|
27
|
+
step(input: {
|
|
28
|
+
budget: ReplicaBudget;
|
|
29
|
+
signal: AbortSignal;
|
|
30
|
+
}): Promise<ProgressReport>;
|
|
31
|
+
/** Host-observed dependency change, e.g. `mapping:<connection>`. */
|
|
32
|
+
onDependencyChanged?(key: string): unknown;
|
|
33
|
+
}
|
|
34
|
+
export interface ReplicationTimers {
|
|
35
|
+
now(): number;
|
|
36
|
+
setTimeout(run: () => void, ms: number): unknown;
|
|
37
|
+
clearTimeout(handle: unknown): void;
|
|
38
|
+
}
|
|
39
|
+
export interface ReplicationDriverStatus {
|
|
40
|
+
state: "stopped" | "running" | "stopping";
|
|
41
|
+
stepping: boolean;
|
|
42
|
+
lastStepAt?: number;
|
|
43
|
+
nextWakeAt?: number;
|
|
44
|
+
/** Counts from the last finished step; full entries go to `onReport`. */
|
|
45
|
+
last?: {
|
|
46
|
+
receipts: number;
|
|
47
|
+
waits: number;
|
|
48
|
+
problems: number;
|
|
49
|
+
quarantines: number;
|
|
50
|
+
unsupported: number;
|
|
51
|
+
};
|
|
52
|
+
lastError?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ReplicationDriver {
|
|
55
|
+
/** Idempotent. Steps once now, then follows `nextWake`. */
|
|
56
|
+
start(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Request a step now. Single-flight: while a step runs, this returns that
|
|
59
|
+
* step's report and runs one more step after it, so a write committed
|
|
60
|
+
* during the step is not left for the idle timer.
|
|
61
|
+
*/
|
|
62
|
+
trigger(): Promise<ProgressReport | undefined>;
|
|
63
|
+
/** Forward a dependency change to the stepper, then trigger. */
|
|
64
|
+
wake(key: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* A local write committed (or may have: a rolled-back write may call it
|
|
67
|
+
* too). Steps within the debounce window. The window starts at the first
|
|
68
|
+
* write after the last debounced step and is not extended by later writes,
|
|
69
|
+
* so continuous writes cannot postpone the step.
|
|
70
|
+
*/
|
|
71
|
+
localWrite(): void;
|
|
72
|
+
status(): ReplicationDriverStatus;
|
|
73
|
+
/**
|
|
74
|
+
* Stop scheduling, abort the running step and wait at most `graceMs` for
|
|
75
|
+
* it to settle. Resolves true when nothing is still running.
|
|
76
|
+
*/
|
|
77
|
+
stop(graceMs: number): Promise<boolean>;
|
|
78
|
+
}
|
|
79
|
+
/** The timer delay for a coordinator `nextWake`, clamped to [1 s, 15 min]. */
|
|
80
|
+
export declare function replicaWakeDelay(nextWake: number | undefined, now: number): number;
|
|
81
|
+
export declare function createReplicationDriver(input: {
|
|
82
|
+
stepper: ReplicationStepper;
|
|
83
|
+
budget: ReplicaBudget;
|
|
84
|
+
/**
|
|
85
|
+
* Abort a step that runs longer than this. The coordinator settles the
|
|
86
|
+
* running attempt as a retry; checkpoints already committed stay.
|
|
87
|
+
*/
|
|
88
|
+
deadlineMs?: number;
|
|
89
|
+
timers?: ReplicationTimers;
|
|
90
|
+
onReport?: (report: ProgressReport) => void;
|
|
91
|
+
onError?: (error: unknown) => void;
|
|
92
|
+
/** Positive milliseconds; defaults to REPLICA_LOCAL_WRITE_DEBOUNCE_MS. */
|
|
93
|
+
localWriteDebounceMs?: number;
|
|
94
|
+
}): ReplicationDriver;
|
|
95
|
+
//# sourceMappingURL=host-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-driver.d.ts","sourceRoot":"","sources":["../../src/replication/host-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAE1B,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAC/C,gFAAgF;AAChF,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAClD;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAErD,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,EAAE,aAAa,CAAC;QACtB,MAAM,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5B,oEAAoE;IACpE,mBAAmB,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,IAAI,MAAM,CAAC;IACd,UAAU,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACjD,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,KAAK,IAAI,IAAI,CAAC;IACd;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC/C,gEAAgE;IAChE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;;OAKG;IACH,UAAU,IAAI,IAAI,CAAC;IACnB,MAAM,IAAI,uBAAuB,CAAC;IAClC;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AASD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,MAAM,GACV,MAAM,CAMR;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,iBAAiB,CAsKpB"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The host side of replication scheduling (host contract §4.4).
|
|
3
|
+
*
|
|
4
|
+
* A host owns only *when* to step: one timer at the coordinator's `nextWake`
|
|
5
|
+
* and explicit triggers (foreground, local write, network back, "Sync now").
|
|
6
|
+
* Retries, backoff, deadlines and phase order stay in the coordinator. This
|
|
7
|
+
* driver adds no semantic scheduling; it only turns `nextWake` into one timer,
|
|
8
|
+
* keeps steps single-flight and drains the running step on stop.
|
|
9
|
+
*
|
|
10
|
+
* Browser-safe: Node (`packages/server`) and PS-Lite use the same driver.
|
|
11
|
+
*/
|
|
12
|
+
import { validateReplicaStep, } from "./coordinator.js";
|
|
13
|
+
/** Never step more often than this from the timer alone. */
|
|
14
|
+
export const REPLICA_WAKE_MIN_MS = 1_000;
|
|
15
|
+
/** Idle cadence: also the delay when the coordinator reports no deadline. */
|
|
16
|
+
export const REPLICA_WAKE_MAX_MS = 15 * 60_000;
|
|
17
|
+
/** Delay after a step that threw (a bug or a closed store, never a verdict). */
|
|
18
|
+
export const REPLICA_STEP_ERROR_DELAY_MS = 60_000;
|
|
19
|
+
/**
|
|
20
|
+
* A committed local write steps within this window. Writes inside the window
|
|
21
|
+
* share its one step, so a connector run steps at most once per window
|
|
22
|
+
* instead of once per page.
|
|
23
|
+
*/
|
|
24
|
+
export const REPLICA_LOCAL_WRITE_DEBOUNCE_MS = 2_000;
|
|
25
|
+
const defaultTimers = {
|
|
26
|
+
now: () => Date.now(),
|
|
27
|
+
setTimeout: (run, ms) => globalThis.setTimeout(run, ms),
|
|
28
|
+
clearTimeout: (handle) => globalThis.clearTimeout(handle),
|
|
29
|
+
};
|
|
30
|
+
/** The timer delay for a coordinator `nextWake`, clamped to [1 s, 15 min]. */
|
|
31
|
+
export function replicaWakeDelay(nextWake, now) {
|
|
32
|
+
if (nextWake === undefined)
|
|
33
|
+
return REPLICA_WAKE_MAX_MS;
|
|
34
|
+
return Math.min(REPLICA_WAKE_MAX_MS, Math.max(REPLICA_WAKE_MIN_MS, nextWake - now));
|
|
35
|
+
}
|
|
36
|
+
export function createReplicationDriver(input) {
|
|
37
|
+
const timers = input.timers ?? defaultTimers;
|
|
38
|
+
// Reject an invalid host budget at construction, not on the first timer.
|
|
39
|
+
validateReplicaStep({ now: 0, budget: input.budget });
|
|
40
|
+
if (input.deadlineMs !== undefined &&
|
|
41
|
+
(!Number.isSafeInteger(input.deadlineMs) || input.deadlineMs < 1))
|
|
42
|
+
throw new RangeError("invalid replication step deadline");
|
|
43
|
+
const debounceMs = input.localWriteDebounceMs ?? REPLICA_LOCAL_WRITE_DEBOUNCE_MS;
|
|
44
|
+
if (!Number.isSafeInteger(debounceMs) || debounceMs < 1)
|
|
45
|
+
throw new RangeError("invalid replication local-write debounce");
|
|
46
|
+
/** The pending debounced local-write step, separate from the wake timer. */
|
|
47
|
+
let writeTimer;
|
|
48
|
+
let state = "stopped";
|
|
49
|
+
let timer;
|
|
50
|
+
let nextWakeAt;
|
|
51
|
+
let running;
|
|
52
|
+
let controller;
|
|
53
|
+
let deadline;
|
|
54
|
+
let again = false;
|
|
55
|
+
let lastStepAt;
|
|
56
|
+
let last;
|
|
57
|
+
let lastError;
|
|
58
|
+
/** The wake delay the running step chose; read by `settle`. */
|
|
59
|
+
let nextDelay = REPLICA_WAKE_MAX_MS;
|
|
60
|
+
function arm(delay) {
|
|
61
|
+
if (timer !== undefined)
|
|
62
|
+
timers.clearTimeout(timer);
|
|
63
|
+
timer = undefined;
|
|
64
|
+
nextWakeAt = undefined;
|
|
65
|
+
if (state !== "running")
|
|
66
|
+
return;
|
|
67
|
+
nextWakeAt = timers.now() + delay;
|
|
68
|
+
timer = timers.setTimeout(() => {
|
|
69
|
+
timer = undefined;
|
|
70
|
+
void trigger();
|
|
71
|
+
}, delay);
|
|
72
|
+
}
|
|
73
|
+
async function run() {
|
|
74
|
+
const step = (controller = new AbortController());
|
|
75
|
+
deadline =
|
|
76
|
+
input.deadlineMs === undefined
|
|
77
|
+
? undefined
|
|
78
|
+
: timers.setTimeout(() => step.abort(new DOMException("replication step deadline", "TimeoutError")), input.deadlineMs);
|
|
79
|
+
nextDelay = REPLICA_WAKE_MAX_MS;
|
|
80
|
+
try {
|
|
81
|
+
const report = await input.stepper.step({
|
|
82
|
+
budget: input.budget,
|
|
83
|
+
signal: step.signal,
|
|
84
|
+
});
|
|
85
|
+
lastStepAt = timers.now();
|
|
86
|
+
lastError = undefined;
|
|
87
|
+
last = {
|
|
88
|
+
receipts: report.receipts.length,
|
|
89
|
+
waits: report.waits.length,
|
|
90
|
+
problems: report.problems.length,
|
|
91
|
+
quarantines: report.quarantines.length,
|
|
92
|
+
unsupported: report.unsupported.length,
|
|
93
|
+
};
|
|
94
|
+
nextDelay = replicaWakeDelay(report.nextWake, timers.now());
|
|
95
|
+
input.onReport?.(report);
|
|
96
|
+
return report;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
100
|
+
nextDelay = REPLICA_STEP_ERROR_DELAY_MS;
|
|
101
|
+
input.onError?.(error);
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Runs after `trigger` has assigned `running`, so a stepper that throws
|
|
107
|
+
* before its first await still clears it. Doing this inside `run` would
|
|
108
|
+
* clear `running` first and then have `trigger` overwrite it with a settled
|
|
109
|
+
* promise, leaving the driver stalled for good.
|
|
110
|
+
*/
|
|
111
|
+
function settle() {
|
|
112
|
+
if (deadline !== undefined)
|
|
113
|
+
timers.clearTimeout(deadline);
|
|
114
|
+
deadline = undefined;
|
|
115
|
+
controller = undefined;
|
|
116
|
+
running = undefined;
|
|
117
|
+
if (state === "running") {
|
|
118
|
+
if (again) {
|
|
119
|
+
again = false;
|
|
120
|
+
void trigger();
|
|
121
|
+
}
|
|
122
|
+
else
|
|
123
|
+
arm(nextDelay);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function trigger() {
|
|
127
|
+
if (state !== "running")
|
|
128
|
+
return Promise.resolve(undefined);
|
|
129
|
+
if (running) {
|
|
130
|
+
again = true;
|
|
131
|
+
return running;
|
|
132
|
+
}
|
|
133
|
+
if (timer !== undefined)
|
|
134
|
+
timers.clearTimeout(timer);
|
|
135
|
+
timer = undefined;
|
|
136
|
+
nextWakeAt = undefined;
|
|
137
|
+
const current = run();
|
|
138
|
+
running = current;
|
|
139
|
+
void current.then(settle, settle);
|
|
140
|
+
return current;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
start() {
|
|
144
|
+
if (state !== "stopped")
|
|
145
|
+
return;
|
|
146
|
+
state = "running";
|
|
147
|
+
void trigger();
|
|
148
|
+
},
|
|
149
|
+
trigger,
|
|
150
|
+
wake(key) {
|
|
151
|
+
input.stepper.onDependencyChanged?.(key);
|
|
152
|
+
void trigger();
|
|
153
|
+
},
|
|
154
|
+
localWrite() {
|
|
155
|
+
if (state !== "running" || writeTimer !== undefined)
|
|
156
|
+
return;
|
|
157
|
+
writeTimer = timers.setTimeout(() => {
|
|
158
|
+
writeTimer = undefined;
|
|
159
|
+
void trigger();
|
|
160
|
+
}, debounceMs);
|
|
161
|
+
},
|
|
162
|
+
status: () => ({
|
|
163
|
+
state,
|
|
164
|
+
stepping: running !== undefined,
|
|
165
|
+
...(lastStepAt !== undefined && { lastStepAt }),
|
|
166
|
+
...(nextWakeAt !== undefined && { nextWakeAt }),
|
|
167
|
+
...(last && { last }),
|
|
168
|
+
...(lastError !== undefined && { lastError }),
|
|
169
|
+
}),
|
|
170
|
+
async stop(graceMs) {
|
|
171
|
+
if (!Number.isFinite(graceMs) || graceMs < 0)
|
|
172
|
+
throw new RangeError("invalid replication stop grace");
|
|
173
|
+
if (state === "stopped")
|
|
174
|
+
return running === undefined;
|
|
175
|
+
state = "stopping";
|
|
176
|
+
again = false;
|
|
177
|
+
if (timer !== undefined)
|
|
178
|
+
timers.clearTimeout(timer);
|
|
179
|
+
timer = undefined;
|
|
180
|
+
if (writeTimer !== undefined)
|
|
181
|
+
timers.clearTimeout(writeTimer);
|
|
182
|
+
writeTimer = undefined;
|
|
183
|
+
nextWakeAt = undefined;
|
|
184
|
+
const current = running;
|
|
185
|
+
controller?.abort(new DOMException("replication stopped", "AbortError"));
|
|
186
|
+
let settled = current === undefined;
|
|
187
|
+
if (current) {
|
|
188
|
+
let grace;
|
|
189
|
+
settled = await Promise.race([
|
|
190
|
+
current.then(() => true),
|
|
191
|
+
new Promise((resolve) => {
|
|
192
|
+
grace = timers.setTimeout(() => resolve(false), graceMs);
|
|
193
|
+
}),
|
|
194
|
+
]);
|
|
195
|
+
timers.clearTimeout(grace);
|
|
196
|
+
}
|
|
197
|
+
state = "stopped";
|
|
198
|
+
return settled;
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=host-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-driver.js","sourceRoot":"","sources":["../../src/replication/host-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type GatewayClient } from "@opendatalabs/vana-sdk/browser";
|
|
2
|
+
import type { DeclarationSnapshot } from "../pdpp/types.js";
|
|
3
|
+
import type { DataPointFeedPort } from "../ports/index.js";
|
|
4
|
+
import type { ServerConfig } from "../schemas/server-config.js";
|
|
5
|
+
import type { ServerSigner } from "../signing/index.js";
|
|
6
|
+
import type { BoundedStorageAdapter } from "../storage/adapters/interface.js";
|
|
7
|
+
import { type ReplicaTransportPort } from "./dpv2.js";
|
|
8
|
+
import { replicaDeclarationContext } from "./host-config.js";
|
|
9
|
+
import { type ReplicaRosterPort } from "./roster.js";
|
|
10
|
+
import type { ReplicaEnvironment } from "./writer-identity.js";
|
|
11
|
+
/** The network side of replication: carrier and roster. */
|
|
12
|
+
export interface ReplicationNetworkPorts {
|
|
13
|
+
transport: ReplicaTransportPort;
|
|
14
|
+
roster: ReplicaRosterPort;
|
|
15
|
+
}
|
|
16
|
+
/** DPv2 on Vana storage and the gateway, with finalized RPC evidence. */
|
|
17
|
+
export declare function createReplicationNetworkPorts(input: {
|
|
18
|
+
config: Pick<ServerConfig, "gateway">;
|
|
19
|
+
owner: `0x${string}`;
|
|
20
|
+
masterKey: Uint8Array;
|
|
21
|
+
storage: BoundedStorageAdapter;
|
|
22
|
+
gateway: Pick<GatewayClient, "registerDataPoint">;
|
|
23
|
+
feed: DataPointFeedPort;
|
|
24
|
+
signer: Pick<ServerSigner, "signAddData">;
|
|
25
|
+
}): ReplicationNetworkPorts;
|
|
26
|
+
/** A host's replication partition, or why replication cannot run this boot. */
|
|
27
|
+
export type ReplicationHostPlan = {
|
|
28
|
+
state: "ready";
|
|
29
|
+
/** The owner as the partition compares it (lowercase). */
|
|
30
|
+
owner: `0x${string}`;
|
|
31
|
+
environment: ReplicaEnvironment;
|
|
32
|
+
context: ReturnType<typeof replicaDeclarationContext>;
|
|
33
|
+
} | {
|
|
34
|
+
state: "blocked";
|
|
35
|
+
reason: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The partition and declaration bindings for one owner. A chain without a
|
|
39
|
+
* signed environment, no retained declarations or a stream that cannot be
|
|
40
|
+
* bound blocks replication: the first baseline freezes the binding set, so
|
|
41
|
+
* an empty or guessed one would never match a peer.
|
|
42
|
+
*/
|
|
43
|
+
export declare function planReplicationHost(input: {
|
|
44
|
+
owner: string;
|
|
45
|
+
chainId: number;
|
|
46
|
+
declarations: readonly DeclarationSnapshot[];
|
|
47
|
+
}): ReplicationHostPlan;
|
|
48
|
+
//# sourceMappingURL=host-ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-ports.d.ts","sourceRoot":"","sources":["../../src/replication/host-ports.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,yBAAyB,EAG1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,2DAA2D;AAC3D,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,oBAAoB,CAAC;IAChC,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,yEAAyE;AACzE,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACtC,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;IACtB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IAClD,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;CAC3C,GAAG,uBAAuB,CAwB1B;AAED,+EAA+E;AAC/E,MAAM,MAAM,mBAAmB,GAC3B;IACE,KAAK,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;CACvD,GACD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC9C,GAAG,mBAAmB,CAoBtB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every replication host builds the same way before its first step:
|
|
3
|
+
* the partition it joins, the declarations it binds and the network ports
|
|
4
|
+
* it talks to (host contract §4.1, §4.2). Node and PS-Lite both assemble
|
|
5
|
+
* replication here and differ only in their storage adapter and persistence.
|
|
6
|
+
*/
|
|
7
|
+
import { createPublicClient, http } from "viem";
|
|
8
|
+
import { getChainConfig, } from "@opendatalabs/vana-sdk/browser";
|
|
9
|
+
import { createDpv2ReplicaTransport, } from "./dpv2.js";
|
|
10
|
+
import { createReplicaEvidenceAdapter } from "./evidence.js";
|
|
11
|
+
import { createReplicaFinalityHints } from "./finality.js";
|
|
12
|
+
import { replicaDeclarationContext, replicaEnvironmentForChain, replicaPartitionOwner, } from "./host-config.js";
|
|
13
|
+
import { createGatewayReplicaRoster, } from "./roster.js";
|
|
14
|
+
/** DPv2 on Vana storage and the gateway, with finalized RPC evidence. */
|
|
15
|
+
export function createReplicationNetworkPorts(input) {
|
|
16
|
+
const { gateway } = input.config;
|
|
17
|
+
const chain = getChainConfig(gateway.chainId);
|
|
18
|
+
if (!chain)
|
|
19
|
+
throw new Error(`no RPC for chain ${gateway.chainId}`);
|
|
20
|
+
const rpc = createPublicClient({ chain, transport: http() });
|
|
21
|
+
return {
|
|
22
|
+
transport: createDpv2ReplicaTransport({
|
|
23
|
+
owner: input.owner,
|
|
24
|
+
masterKey: input.masterKey,
|
|
25
|
+
storage: input.storage,
|
|
26
|
+
gateway: input.gateway,
|
|
27
|
+
feed: input.feed,
|
|
28
|
+
signer: input.signer,
|
|
29
|
+
finality: createReplicaFinalityHints({ rpc }),
|
|
30
|
+
evidence: createReplicaEvidenceAdapter({
|
|
31
|
+
owner: input.owner,
|
|
32
|
+
registry: gateway.contracts.dataRegistry,
|
|
33
|
+
chainId: gateway.chainId,
|
|
34
|
+
rpc: rpc,
|
|
35
|
+
gatewayUrl: gateway.url,
|
|
36
|
+
}),
|
|
37
|
+
}),
|
|
38
|
+
roster: createGatewayReplicaRoster({ gatewayUrl: gateway.url }),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The partition and declaration bindings for one owner. A chain without a
|
|
43
|
+
* signed environment, no retained declarations or a stream that cannot be
|
|
44
|
+
* bound blocks replication: the first baseline freezes the binding set, so
|
|
45
|
+
* an empty or guessed one would never match a peer.
|
|
46
|
+
*/
|
|
47
|
+
export function planReplicationHost(input) {
|
|
48
|
+
const environment = replicaEnvironmentForChain(input.chainId);
|
|
49
|
+
if (!environment)
|
|
50
|
+
return { state: "blocked", reason: `unsupported_chain:${input.chainId}` };
|
|
51
|
+
if (input.declarations.length === 0)
|
|
52
|
+
return { state: "blocked", reason: "no_retained_declarations" };
|
|
53
|
+
try {
|
|
54
|
+
const owner = replicaPartitionOwner(input.owner);
|
|
55
|
+
return {
|
|
56
|
+
state: "ready",
|
|
57
|
+
owner,
|
|
58
|
+
environment,
|
|
59
|
+
context: replicaDeclarationContext(owner, input.declarations),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return {
|
|
64
|
+
state: "blocked",
|
|
65
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=host-ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-ports.js","sourceRoot":"","sources":["../../src/replication/host-ports.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AAC1D,OAAO,EACL,cAAc,GAEf,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EACL,0BAA0B,GAE3B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,GAE3B,MAAM,aAAa,CAAC;AASrB,yEAAyE;AACzE,MAAM,UAAU,6BAA6B,CAAC,KAQ7C;IACC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,OAAO;QACL,SAAS,EAAE,0BAA0B,CAAC;YACpC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,0BAA0B,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7C,QAAQ,EAAE,4BAA4B,CAAC;gBACrC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,YAAmB;gBAC/C,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,GAAG,EAAE,GAAgE;gBACrE,UAAU,EAAE,OAAO,CAAC,GAAG;aACxB,CAAC;SACH,CAAC;QACF,MAAM,EAAE,0BAA0B,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAInC;IACC,MAAM,WAAW,GAAG,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC,WAAW;QACd,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,qBAAqB,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IAC5E,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAkB,CAAC;QAClE,OAAO;YACL,KAAK,EAAE,OAAO;YACd,KAAK;YACL,WAAW;YACX,OAAO,EAAE,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC;SAC9D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ConnectionIdentity {
|
|
2
|
+
owner: string;
|
|
3
|
+
sourceId: string;
|
|
4
|
+
connectionId: string;
|
|
5
|
+
}
|
|
6
|
+
/** Verified local mapping, supplied by the host; never inferred from source alone. */
|
|
7
|
+
export interface LocalConnectionMapping extends ConnectionIdentity {
|
|
8
|
+
localInstanceId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function connectionKey(identity: ConnectionIdentity): string;
|
|
11
|
+
/** Local instance handles carry no replicated grant or token authority. */
|
|
12
|
+
export declare function resolveLocalInstance(identity: ConnectionIdentity, mappings: readonly LocalConnectionMapping[]): string | undefined;
|
|
13
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/replication/identity.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,sFAAsF;AACtF,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAMlE;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,SAAS,sBAAsB,EAAE,GAC1C,MAAM,GAAG,SAAS,CAkBpB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function connectionKey(identity) {
|
|
2
|
+
return JSON.stringify([
|
|
3
|
+
identity.owner,
|
|
4
|
+
identity.sourceId,
|
|
5
|
+
identity.connectionId,
|
|
6
|
+
]);
|
|
7
|
+
}
|
|
8
|
+
/** Local instance handles carry no replicated grant or token authority. */
|
|
9
|
+
export function resolveLocalInstance(identity, mappings) {
|
|
10
|
+
const matches = mappings.filter((entry) => connectionKey(entry) === connectionKey(identity));
|
|
11
|
+
const handles = new Set(matches.map((entry) => entry.localInstanceId));
|
|
12
|
+
if (handles.size > 1)
|
|
13
|
+
throw new Error("ambiguous local connection mapping");
|
|
14
|
+
const handle = matches[0]?.localInstanceId;
|
|
15
|
+
if (handle !== undefined &&
|
|
16
|
+
mappings.some((entry) => entry.localInstanceId === handle &&
|
|
17
|
+
connectionKey(entry) !== connectionKey(identity))) {
|
|
18
|
+
throw new Error("local instance maps independent connections together");
|
|
19
|
+
}
|
|
20
|
+
return handle;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/replication/identity.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,aAAa,CAAC,QAA4B;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,QAAQ,CAAC,KAAK;QACd,QAAQ,CAAC,QAAQ;QACjB,QAAQ,CAAC,YAAY;KACtB,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB,CAClC,QAA4B,EAC5B,QAA2C;IAE3C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,QAAQ,CAAC,CAC5D,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;IAC3C,IACE,MAAM,KAAK,SAAS;QACpB,QAAQ,CAAC,IAAI,CACX,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,eAAe,KAAK,MAAM;YAChC,aAAa,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,QAAQ,CAAC,CACnD,EACD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export declare const REPLICA_MAX_FRAGMENTS = 100000;
|
|
2
|
+
/** vana-storage DEFAULT_MAX_BLOB_SIZE. Compare the actual encrypted request. */
|
|
3
|
+
export declare const REPLICA_MAX_BLOB_BYTES: number;
|
|
4
|
+
/** Per-fragment framing allowance used by the #500 aggregate ciphertext check. */
|
|
5
|
+
export declare const REPLICA_FRAGMENT_OVERHEAD_BYTES = 4096;
|
|
6
|
+
/** Same source-write bounds used by the Node PDPP routes. */
|
|
7
|
+
export declare const REPLICA_SOURCE_MAX_BLOB_BYTES: number;
|
|
8
|
+
export declare const REPLICA_SOURCE_MAX_RECORD_JSON_BYTES: number;
|
|
9
|
+
/** Node capture's persisted batch target and operation count. */
|
|
10
|
+
export declare const REPLICA_BATCH_TARGET_BYTES: number;
|
|
11
|
+
export declare const REPLICA_BATCH_OPERATION_LIMIT = 10000;
|
|
12
|
+
/** Node prepares 4 MiB payload chunks before #500 encryption overhead. */
|
|
13
|
+
export declare const REPLICA_DEFAULT_FRAGMENT_BYTES: number;
|
|
14
|
+
export declare const REPLICA_MAX_OPERATIONS = 10000;
|
|
15
|
+
/** One retained evidence row is created for each manifest fragment. */
|
|
16
|
+
export declare const REPLICA_MAX_EVIDENCE_ROWS = 100000;
|
|
17
|
+
export declare const REPLICA_LIMITS_VERSION = 2;
|
|
18
|
+
/**
|
|
19
|
+
* Operation metadata can repeat the record key and carries declaration-bound
|
|
20
|
+
* source/method identifiers. Bound that overhead by a second ingest body plus
|
|
21
|
+
* the largest retained declaration and fixed replication fields.
|
|
22
|
+
*/
|
|
23
|
+
export declare const REPLICA_MAX_OPERATION_ENVELOPE_BYTES: number;
|
|
24
|
+
/** The payload-level header is fixed apart from its retained declaration IDs. */
|
|
25
|
+
export declare const REPLICA_MAX_PAYLOAD_ENVELOPE_BYTES: number;
|
|
26
|
+
export declare const REPLICA_MAX_SINGLE_OPERATION_BYTES: number;
|
|
27
|
+
/**
|
|
28
|
+
* The first operation may exceed the target, then later operations may fill
|
|
29
|
+
* the target; otherwise every operation fits the target and count is binding.
|
|
30
|
+
*/
|
|
31
|
+
export declare const REPLICA_MAX_TOTAL_BYTES: number;
|
|
32
|
+
/** Each streamed operation is bounded by the admitted payload that contains it. */
|
|
33
|
+
export declare const REPLICA_MAX_OPERATION_BYTES: number;
|
|
34
|
+
/** A blob cannot exceed the actual Node source write cap. */
|
|
35
|
+
export declare const REPLICA_MAX_SINGLE_BLOB_BYTES: number;
|
|
36
|
+
/** Base64 blob bytes are part of totalBytes, so their sum cannot exceed it. */
|
|
37
|
+
export declare const REPLICA_MAX_BLOB_TOTAL_BYTES: number;
|
|
38
|
+
/**
|
|
39
|
+
* The maximum encrypted fragment bytes for a payload of `totalBytes` and
|
|
40
|
+
* `count` fragments: base64 payload bytes plus #500's per-fragment framing.
|
|
41
|
+
*/
|
|
42
|
+
export declare function replicaFramedBytesBound(totalBytes: number, count: number): number;
|
|
43
|
+
/** Maximum declared encrypted bytes for an honest payload and 100,000 fragments. */
|
|
44
|
+
export declare const REPLICA_MAX_AGGREGATE_CIPHERTEXT_BYTES: number;
|
|
45
|
+
/** Four live representations: ciphertext, plaintext, parsed JSON and decoded bytes. */
|
|
46
|
+
export declare const REPLICA_LIVE_COPY_FACTOR = 4;
|
|
47
|
+
/** The retained JSON string plus its parsed operation tree. */
|
|
48
|
+
export declare const REPLICA_ENVELOPE_LIVE_COPY_FACTOR = 2;
|
|
49
|
+
/** 100 MiB #500 per-object cap × four copies = 400 MiB, below this budget. */
|
|
50
|
+
export declare const REPLICA_DEFAULT_BYTE_BUDGET_BYTES: number;
|
|
51
|
+
export interface ReplicaResourceLimits {
|
|
52
|
+
maxSourceBlobBytes: number;
|
|
53
|
+
maxRecordJsonBytes: number;
|
|
54
|
+
maxManifestCiphertextBytes: number;
|
|
55
|
+
maxFragmentCiphertextBytes: number;
|
|
56
|
+
maxAggregateCiphertextBytes: number;
|
|
57
|
+
maxFragments: number;
|
|
58
|
+
maxEvidenceRows: number;
|
|
59
|
+
maxTotalBytes: number;
|
|
60
|
+
maxOperations: number;
|
|
61
|
+
maxOperationBytes: number;
|
|
62
|
+
maxSingleBlobBytes: number;
|
|
63
|
+
maxBlobTotalBytes: number;
|
|
64
|
+
}
|
|
65
|
+
export declare const REPLICA_DEFAULT_LIMITS: ReplicaResourceLimits;
|
|
66
|
+
export declare function replicaResourceLimits(overrides?: Partial<ReplicaResourceLimits>): ReplicaResourceLimits;
|
|
67
|
+
export interface DeclaredReplicaManifest {
|
|
68
|
+
totalBytes: number;
|
|
69
|
+
digest?: string;
|
|
70
|
+
owner?: string;
|
|
71
|
+
fragments: readonly {
|
|
72
|
+
bytes: number;
|
|
73
|
+
}[];
|
|
74
|
+
}
|
|
75
|
+
export type ResourceRefusal = {
|
|
76
|
+
kind: "resource_unsupported";
|
|
77
|
+
limit: string;
|
|
78
|
+
limitsVersion: number;
|
|
79
|
+
} | {
|
|
80
|
+
kind: "resource_busy";
|
|
81
|
+
requestedBytes: number;
|
|
82
|
+
availableBytes: number;
|
|
83
|
+
};
|
|
84
|
+
/** Reservation ledger shared by concurrently running replication steps. */
|
|
85
|
+
export declare class ReplicaByteBudget {
|
|
86
|
+
readonly maxBytes: number;
|
|
87
|
+
private reservedBytes;
|
|
88
|
+
private readonly reservations;
|
|
89
|
+
constructor(maxBytes: number);
|
|
90
|
+
get reserved(): number;
|
|
91
|
+
reserve(bytes: number, group?: object): (() => void) | ResourceRefusal;
|
|
92
|
+
}
|
|
93
|
+
declare const admissionBrand: unique symbol;
|
|
94
|
+
export interface Admission {
|
|
95
|
+
readonly [admissionBrand]: true;
|
|
96
|
+
readonly admissionId: string;
|
|
97
|
+
readonly repositoryId: string;
|
|
98
|
+
readonly owner: string;
|
|
99
|
+
readonly manifestDigest: string;
|
|
100
|
+
readonly payloadBytes: number;
|
|
101
|
+
readonly limitsVersion: number;
|
|
102
|
+
reserveObject(ciphertextBytes: number, reservationGroup?: object): (() => void) | ResourceRefusal;
|
|
103
|
+
reserveEnvelope(jsonBytes: number, reservationGroup?: object): (() => void) | ResourceRefusal;
|
|
104
|
+
}
|
|
105
|
+
export type AdmissionResult = Admission | ResourceRefusal;
|
|
106
|
+
export declare class ReplicaResourceLimitError extends Error {
|
|
107
|
+
readonly limit: string;
|
|
108
|
+
readonly actual: number;
|
|
109
|
+
readonly maximum: number;
|
|
110
|
+
readonly code = "replica_resource_limit_exceeded";
|
|
111
|
+
constructor(limit: string, actual: number, maximum: number);
|
|
112
|
+
}
|
|
113
|
+
export declare class ReplicaResourceBusyError extends Error {
|
|
114
|
+
readonly code = "resource_busy";
|
|
115
|
+
constructor();
|
|
116
|
+
}
|
|
117
|
+
/** Check manifest-declared totals and issue an object-reservation capability. */
|
|
118
|
+
export declare function admit(manifest: DeclaredReplicaManifest, budget: ReplicaByteBudget, identity: {
|
|
119
|
+
repositoryId: string;
|
|
120
|
+
owner: string;
|
|
121
|
+
manifestDigest: string;
|
|
122
|
+
}, limits?: ReplicaResourceLimits): AdmissionResult;
|
|
123
|
+
export {};
|
|
124
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/replication/limits.ts"],"names":[],"mappings":"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"}
|