@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,118 @@
|
|
|
1
|
+
import { type Hex } from "viem";
|
|
2
|
+
import type { ReplicaRegistrationEvidence } from "./dpv2.js";
|
|
3
|
+
declare const abi: readonly [{
|
|
4
|
+
readonly name: "dataPoints";
|
|
5
|
+
readonly type: "function";
|
|
6
|
+
readonly stateMutability: "view";
|
|
7
|
+
readonly inputs: readonly [{
|
|
8
|
+
readonly type: "address";
|
|
9
|
+
readonly name: "ownerAddress";
|
|
10
|
+
}, {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly name: "scope";
|
|
13
|
+
}];
|
|
14
|
+
readonly outputs: readonly [{
|
|
15
|
+
readonly type: "tuple";
|
|
16
|
+
readonly components: readonly [{
|
|
17
|
+
readonly type: "bytes32";
|
|
18
|
+
readonly name: "id";
|
|
19
|
+
}, {
|
|
20
|
+
readonly type: "address";
|
|
21
|
+
readonly name: "owner";
|
|
22
|
+
}, {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly name: "scope";
|
|
25
|
+
}, {
|
|
26
|
+
readonly type: "uint8";
|
|
27
|
+
readonly name: "status";
|
|
28
|
+
}, {
|
|
29
|
+
readonly type: "uint256";
|
|
30
|
+
readonly name: "currentVersion";
|
|
31
|
+
}, {
|
|
32
|
+
readonly type: "bytes32";
|
|
33
|
+
readonly name: "currentCommitment";
|
|
34
|
+
}, {
|
|
35
|
+
readonly type: "uint256";
|
|
36
|
+
readonly name: "createdAt";
|
|
37
|
+
}, {
|
|
38
|
+
readonly type: "uint256";
|
|
39
|
+
readonly name: "modifiedAt";
|
|
40
|
+
}, {
|
|
41
|
+
readonly type: "uint256";
|
|
42
|
+
readonly name: "totalAccesses";
|
|
43
|
+
}];
|
|
44
|
+
}];
|
|
45
|
+
}, {
|
|
46
|
+
readonly name: "currentVersion";
|
|
47
|
+
readonly type: "function";
|
|
48
|
+
readonly stateMutability: "view";
|
|
49
|
+
readonly inputs: readonly [{
|
|
50
|
+
readonly type: "address";
|
|
51
|
+
readonly name: "ownerAddress";
|
|
52
|
+
}, {
|
|
53
|
+
readonly type: "string";
|
|
54
|
+
readonly name: "scope";
|
|
55
|
+
}];
|
|
56
|
+
readonly outputs: readonly [{
|
|
57
|
+
readonly type: "uint256";
|
|
58
|
+
}];
|
|
59
|
+
}, {
|
|
60
|
+
readonly name: "dataCommitment";
|
|
61
|
+
readonly type: "function";
|
|
62
|
+
readonly stateMutability: "view";
|
|
63
|
+
readonly inputs: readonly [{
|
|
64
|
+
readonly type: "address";
|
|
65
|
+
readonly name: "ownerAddress";
|
|
66
|
+
}, {
|
|
67
|
+
readonly type: "string";
|
|
68
|
+
readonly name: "scope";
|
|
69
|
+
}, {
|
|
70
|
+
readonly type: "uint256";
|
|
71
|
+
readonly name: "version_";
|
|
72
|
+
}];
|
|
73
|
+
readonly outputs: readonly [{
|
|
74
|
+
readonly type: "bytes32";
|
|
75
|
+
}];
|
|
76
|
+
}];
|
|
77
|
+
/** A viem PublicClient satisfies this port. RPC errors must propagate, not become zero. */
|
|
78
|
+
export interface ReplicaEvidenceRpc {
|
|
79
|
+
getChainId(): Promise<number>;
|
|
80
|
+
getBlock(input: {
|
|
81
|
+
blockTag: "finalized";
|
|
82
|
+
} | {
|
|
83
|
+
blockNumber: bigint;
|
|
84
|
+
}): Promise<{
|
|
85
|
+
number: bigint | null;
|
|
86
|
+
hash: Hex | null;
|
|
87
|
+
timestamp: bigint;
|
|
88
|
+
}>;
|
|
89
|
+
readContract(input: {
|
|
90
|
+
address: Hex;
|
|
91
|
+
abi: typeof abi;
|
|
92
|
+
functionName: "currentVersion" | "dataCommitment" | "dataPoints";
|
|
93
|
+
args: readonly [Hex, string] | readonly [Hex, string, bigint];
|
|
94
|
+
blockNumber: bigint;
|
|
95
|
+
}): Promise<unknown>;
|
|
96
|
+
}
|
|
97
|
+
/** Every failure is retryable by transport workers. No error is evidence of absence. */
|
|
98
|
+
export declare class ReplicaEvidenceUnavailableError extends Error {
|
|
99
|
+
readonly retryable = true;
|
|
100
|
+
constructor(cause: unknown);
|
|
101
|
+
}
|
|
102
|
+
/** Independent finalized commitment verification replaces Gateway HEAD proof verification.
|
|
103
|
+
* The configured RPC/chain/registry are trusted; the Gateway is not trusted to supply hashes.
|
|
104
|
+
* Gateway omission or optimistic head mutations can delay progress; only finalized slot facts quarantine.
|
|
105
|
+
*/
|
|
106
|
+
export declare function createReplicaEvidenceAdapter(deps: {
|
|
107
|
+
owner: Hex;
|
|
108
|
+
registry: Hex;
|
|
109
|
+
chainId: number;
|
|
110
|
+
rpc: ReplicaEvidenceRpc;
|
|
111
|
+
gatewayUrl: string;
|
|
112
|
+
fetch?: typeof globalThis.fetch;
|
|
113
|
+
now?: () => number;
|
|
114
|
+
/** Includes ordinary chain finality lag; default 30 minutes. Never use latest as fallback. */
|
|
115
|
+
maxFinalizedAgeSeconds?: number;
|
|
116
|
+
}): (scope: string, version: number) => Promise<ReplicaRegistrationEvidence>;
|
|
117
|
+
export {};
|
|
118
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/replication/evidence.ts"],"names":[],"mappings":"AACA,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AAK7D,QAAA,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIP,CAAC;AAEH,2FAA2F;AAC3F,MAAM,WAAW,kBAAkB;IACjC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,QAAQ,CACN,KAAK,EAAE;QAAE,QAAQ,EAAE,WAAW,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,YAAY,CAAC,KAAK,EAAE;QAClB,OAAO,EAAE,GAAG,CAAC;QACb,GAAG,EAAE,OAAO,GAAG,CAAC;QAChB,YAAY,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,CAAC;QACjE,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9D,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtB;AAED,wFAAwF;AACxF,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,QAAQ,CAAC,SAAS,QAAQ;gBACd,KAAK,EAAE,OAAO;CAI3B;AA+BD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,GAAG,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,kBAAkB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,8FAA8F;IAC9F,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAwK3E"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { encodeAbiParameters, keccak256, parseAbi } from "viem";
|
|
3
|
+
const bytes32 = z.string().regex(/^0x[0-9a-fA-F]{64}$/);
|
|
4
|
+
const address = z.string().regex(/^0x[0-9a-fA-F]{40}$/);
|
|
5
|
+
const zero = `0x${"0".repeat(64)}`;
|
|
6
|
+
const abi = parseAbi([
|
|
7
|
+
"function dataPoints(address ownerAddress, string scope) view returns ((bytes32 id, address owner, string scope, uint8 status, uint256 currentVersion, bytes32 currentCommitment, uint256 createdAt, uint256 modifiedAt, uint256 totalAccesses))",
|
|
8
|
+
"function currentVersion(address ownerAddress, string scope) view returns (uint256)",
|
|
9
|
+
"function dataCommitment(address ownerAddress, string scope, uint256 version_) view returns (bytes32)",
|
|
10
|
+
]);
|
|
11
|
+
/** Every failure is retryable by transport workers. No error is evidence of absence. */
|
|
12
|
+
export class ReplicaEvidenceUnavailableError extends Error {
|
|
13
|
+
retryable = true;
|
|
14
|
+
constructor(cause) {
|
|
15
|
+
super("replica finalized evidence unavailable", { cause });
|
|
16
|
+
this.name = "ReplicaEvidenceUnavailableError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const uint256 = z
|
|
20
|
+
.bigint()
|
|
21
|
+
.min(0n)
|
|
22
|
+
.max((1n << 256n) - 1n);
|
|
23
|
+
const dataPointInfoSchema = z.object({
|
|
24
|
+
id: bytes32,
|
|
25
|
+
owner: address,
|
|
26
|
+
scope: z.string(),
|
|
27
|
+
status: z.number().int().min(0).max(3),
|
|
28
|
+
currentVersion: uint256,
|
|
29
|
+
currentCommitment: bytes32,
|
|
30
|
+
createdAt: uint256,
|
|
31
|
+
modifiedAt: uint256,
|
|
32
|
+
totalAccesses: uint256,
|
|
33
|
+
});
|
|
34
|
+
const statuses = ["None", "Active", "Inactive", "Unavailable"];
|
|
35
|
+
const headSchema = z.object({
|
|
36
|
+
id: bytes32,
|
|
37
|
+
ownerAddress: address,
|
|
38
|
+
scope: z.string().min(1),
|
|
39
|
+
expectedVersion: z.string().regex(/^[1-9][0-9]*$/),
|
|
40
|
+
// Gateway uses active/inactive/unavailable. A deleted alias also refuses serving.
|
|
41
|
+
state: z.enum(["active", "inactive", "unavailable", "deleted"]).optional(),
|
|
42
|
+
dataHash: bytes32,
|
|
43
|
+
metadataHash: bytes32,
|
|
44
|
+
deletedAt: z.string().datetime({ offset: true }).nullable().optional(),
|
|
45
|
+
});
|
|
46
|
+
/** Independent finalized commitment verification replaces Gateway HEAD proof verification.
|
|
47
|
+
* The configured RPC/chain/registry are trusted; the Gateway is not trusted to supply hashes.
|
|
48
|
+
* Gateway omission or optimistic head mutations can delay progress; only finalized slot facts quarantine.
|
|
49
|
+
*/
|
|
50
|
+
export function createReplicaEvidenceAdapter(deps) {
|
|
51
|
+
return async (scope, version) => {
|
|
52
|
+
try {
|
|
53
|
+
address.parse(deps.owner);
|
|
54
|
+
address.parse(deps.registry);
|
|
55
|
+
const maxAge = deps.maxFinalizedAgeSeconds ?? 1800;
|
|
56
|
+
if (!Number.isSafeInteger(deps.chainId) ||
|
|
57
|
+
deps.chainId <= 0 ||
|
|
58
|
+
/^0x0{40}$/i.test(deps.registry) ||
|
|
59
|
+
!scope ||
|
|
60
|
+
!Number.isSafeInteger(version) ||
|
|
61
|
+
version < 1 ||
|
|
62
|
+
!Number.isFinite(maxAge) ||
|
|
63
|
+
maxAge <= 0)
|
|
64
|
+
throw new Error("invalid evidence configuration");
|
|
65
|
+
const base = new URL(deps.gatewayUrl);
|
|
66
|
+
if (base.protocol !== "https:" && base.protocol !== "http:")
|
|
67
|
+
throw new Error("invalid Gateway URL");
|
|
68
|
+
if ((await deps.rpc.getChainId()) !== deps.chainId)
|
|
69
|
+
throw new Error("wrong chain");
|
|
70
|
+
const block = await deps.rpc.getBlock({ blockTag: "finalized" });
|
|
71
|
+
if (typeof block.number !== "bigint" ||
|
|
72
|
+
block.number < 0n ||
|
|
73
|
+
!bytes32.safeParse(block.hash).success ||
|
|
74
|
+
typeof block.timestamp !== "bigint" ||
|
|
75
|
+
block.timestamp < 0n)
|
|
76
|
+
throw new Error("missing finalized block");
|
|
77
|
+
const checkFreshness = () => {
|
|
78
|
+
const age = (deps.now ?? Date.now)() / 1000 - Number(block.timestamp);
|
|
79
|
+
if (!Number.isFinite(age) || age < -60 || age > maxAge)
|
|
80
|
+
throw new Error("stale finalized block");
|
|
81
|
+
};
|
|
82
|
+
checkFreshness();
|
|
83
|
+
const id = keccak256(encodeAbiParameters([{ type: "address" }, { type: "string" }], [deps.owner, scope]));
|
|
84
|
+
const [currentVersion, commitment, rawInfo] = await Promise.all([
|
|
85
|
+
deps.rpc.readContract({
|
|
86
|
+
address: deps.registry,
|
|
87
|
+
abi,
|
|
88
|
+
functionName: "currentVersion",
|
|
89
|
+
args: [deps.owner, scope],
|
|
90
|
+
blockNumber: block.number,
|
|
91
|
+
}),
|
|
92
|
+
deps.rpc.readContract({
|
|
93
|
+
address: deps.registry,
|
|
94
|
+
abi,
|
|
95
|
+
functionName: "dataCommitment",
|
|
96
|
+
args: [deps.owner, scope, BigInt(version)],
|
|
97
|
+
blockNumber: block.number,
|
|
98
|
+
}),
|
|
99
|
+
deps.rpc.readContract({
|
|
100
|
+
address: deps.registry,
|
|
101
|
+
abi,
|
|
102
|
+
functionName: "dataPoints",
|
|
103
|
+
args: [deps.owner, scope],
|
|
104
|
+
blockNumber: block.number,
|
|
105
|
+
}),
|
|
106
|
+
]);
|
|
107
|
+
if (typeof currentVersion !== "bigint" ||
|
|
108
|
+
currentVersion < 0n ||
|
|
109
|
+
currentVersion > (1n << 256n) - 1n ||
|
|
110
|
+
!bytes32.safeParse(commitment).success ||
|
|
111
|
+
currentVersion < BigInt(version) !==
|
|
112
|
+
(commitment.toLowerCase() === zero))
|
|
113
|
+
throw new Error("invalid registry result");
|
|
114
|
+
const info = dataPointInfoSchema.parse(rawInfo);
|
|
115
|
+
if (info.id.toLowerCase() !== id ||
|
|
116
|
+
info.currentVersion !== currentVersion)
|
|
117
|
+
throw new Error("inconsistent registry identity/version");
|
|
118
|
+
if (currentVersion === 0n) {
|
|
119
|
+
// The contract computes id even for a missing mapping; all stored fields are default.
|
|
120
|
+
if (!/^0x0{40}$/i.test(info.owner) ||
|
|
121
|
+
info.scope !== "" ||
|
|
122
|
+
info.status !== 0 ||
|
|
123
|
+
info.currentCommitment.toLowerCase() !== zero ||
|
|
124
|
+
info.createdAt !== 0n ||
|
|
125
|
+
info.modifiedAt !== 0n ||
|
|
126
|
+
info.totalAccesses !== 0n)
|
|
127
|
+
throw new Error("invalid absent registry row");
|
|
128
|
+
}
|
|
129
|
+
else if (info.owner.toLowerCase() !== deps.owner.toLowerCase() ||
|
|
130
|
+
info.scope !== scope ||
|
|
131
|
+
(currentVersion === BigInt(version) &&
|
|
132
|
+
info.currentCommitment.toLowerCase() !==
|
|
133
|
+
commitment.toLowerCase()))
|
|
134
|
+
throw new Error("inconsistent registry row");
|
|
135
|
+
base.pathname = `${base.pathname.replace(/\/$/, "")}/v1/data/${id}`;
|
|
136
|
+
base.search = "?includeDeleted=true";
|
|
137
|
+
base.hash = "";
|
|
138
|
+
const response = await (deps.fetch ?? globalThis.fetch)(base.toString());
|
|
139
|
+
let head = null;
|
|
140
|
+
if (response.status === 404) {
|
|
141
|
+
// A missing deployment/route is not the Gateway's precise unknown-head response.
|
|
142
|
+
z.object({ error: z.literal("Data point not found") }).parse(await response.json());
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
if (!response.ok && response.status !== 410)
|
|
146
|
+
throw new Error(`Gateway HTTP ${response.status}`);
|
|
147
|
+
const envelope = z
|
|
148
|
+
.object({ data: headSchema })
|
|
149
|
+
.parse(await response.json());
|
|
150
|
+
const row = envelope.data;
|
|
151
|
+
// Validate all identity fields independently; never infer scope/owner from the requested URL.
|
|
152
|
+
if (row.id.toLowerCase() !== id ||
|
|
153
|
+
row.ownerAddress.toLowerCase() !== deps.owner.toLowerCase() ||
|
|
154
|
+
row.scope !== scope)
|
|
155
|
+
throw new Error("Gateway identity mismatch");
|
|
156
|
+
if (response.status === 410 && !row.deletedAt)
|
|
157
|
+
throw new Error("unbound Gateway tombstone");
|
|
158
|
+
head = {
|
|
159
|
+
owner: deps.owner,
|
|
160
|
+
scope: row.scope,
|
|
161
|
+
version: row.expectedVersion,
|
|
162
|
+
dataHash: row.dataHash.toLowerCase(),
|
|
163
|
+
metadataHash: row.metadataHash.toLowerCase(),
|
|
164
|
+
deleted: row.deletedAt != null ||
|
|
165
|
+
(row.state !== undefined && row.state !== "active"),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// A number-pinned read must still match the finalized hash after all I/O.
|
|
169
|
+
const pinned = await deps.rpc.getBlock({ blockNumber: block.number });
|
|
170
|
+
if (pinned.number !== block.number ||
|
|
171
|
+
pinned.hash !== block.hash ||
|
|
172
|
+
pinned.timestamp !== block.timestamp)
|
|
173
|
+
throw new Error("finalized block changed");
|
|
174
|
+
checkFreshness();
|
|
175
|
+
return {
|
|
176
|
+
head,
|
|
177
|
+
chain: {
|
|
178
|
+
owner: deps.owner,
|
|
179
|
+
scope,
|
|
180
|
+
version: String(version),
|
|
181
|
+
currentVersion: currentVersion.toString(),
|
|
182
|
+
status: statuses[info.status],
|
|
183
|
+
commitment: commitment,
|
|
184
|
+
chainId: deps.chainId,
|
|
185
|
+
registry: deps.registry,
|
|
186
|
+
blockNumber: block.number,
|
|
187
|
+
blockHash: block.hash,
|
|
188
|
+
blockTimestamp: block.timestamp,
|
|
189
|
+
},
|
|
190
|
+
pending: false,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (cause) {
|
|
194
|
+
throw new ReplicaEvidenceUnavailableError(cause);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/replication/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Hex } from "viem";
|
|
2
|
+
/** Scheduling hints only. Every wake still requires independent finalized evidence. */
|
|
3
|
+
export interface ReplicaFinalityHints {
|
|
4
|
+
head(): Promise<bigint>;
|
|
5
|
+
}
|
|
6
|
+
export declare function createReplicaFinalityHints(deps: {
|
|
7
|
+
rpc: {
|
|
8
|
+
getBlock(input: {
|
|
9
|
+
blockTag: "finalized";
|
|
10
|
+
}): Promise<{
|
|
11
|
+
number: bigint | null;
|
|
12
|
+
hash?: Hex | null;
|
|
13
|
+
}>;
|
|
14
|
+
};
|
|
15
|
+
}): ReplicaFinalityHints;
|
|
16
|
+
//# sourceMappingURL=finality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finality.d.ts","sourceRoot":"","sources":["../../src/replication/finality.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEhC,uFAAuF;AACvF,MAAM,WAAW,oBAAoB;IACnC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE;QACH,QAAQ,CAAC,KAAK,EAAE;YACd,QAAQ,EAAE,WAAW,CAAC;SACvB,GAAG,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC;KAC3D,CAAC;CACH,GAAG,oBAAoB,CASvB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function createReplicaFinalityHints(deps) {
|
|
2
|
+
return {
|
|
3
|
+
async head() {
|
|
4
|
+
const block = await deps.rpc.getBlock({ blockTag: "finalized" });
|
|
5
|
+
if (block.number === null || block.number < 0n)
|
|
6
|
+
throw new Error("missing finalized scheduling head");
|
|
7
|
+
return block.number;
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=finality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finality.js","sourceRoot":"","sources":["../../src/replication/finality.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,0BAA0B,CAAC,IAM1C;IACC,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;YACjE,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;gBAC5C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC,MAAM,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Executable profile vectors shared with future receiver and Lite consumers. */
|
|
2
|
+
import type { DeclarationBinding, ReplicaOperation, RecordOperation } from "./envelope.js";
|
|
3
|
+
export declare const binding: DeclarationBinding;
|
|
4
|
+
export declare const identity: {
|
|
5
|
+
owner: string;
|
|
6
|
+
sourceId: string;
|
|
7
|
+
connectionId: string;
|
|
8
|
+
methodId: string;
|
|
9
|
+
generation: 1;
|
|
10
|
+
};
|
|
11
|
+
export declare const registration: ReplicaOperation;
|
|
12
|
+
export declare function upsert(operationId: string, counter: number, text?: string, writerId?: string): RecordOperation & {
|
|
13
|
+
kind: "upsert";
|
|
14
|
+
};
|
|
15
|
+
export declare const mutableVectors: readonly RecordOperation[];
|
|
16
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/replication/fixtures.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,OAAO,EAAE,kBAOrB,CAAC;AACF,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAC;AACF,eAAO,MAAM,YAAY,EAAE,gBAI1B,CAAC;AACF,wBAAgB,MAAM,CACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,SAAc,EAClB,QAAQ,SAAa,GACpB,eAAe,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAWtC;AACD,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAapD,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const binding = {
|
|
2
|
+
digest: `sha256:${"a".repeat(64)}`,
|
|
3
|
+
version: "1.0.0",
|
|
4
|
+
stream: "messages",
|
|
5
|
+
semantics: "mutable_state",
|
|
6
|
+
primaryKey: ["id"],
|
|
7
|
+
schemaDigest: `sha256:${"b".repeat(64)}`,
|
|
8
|
+
};
|
|
9
|
+
export const identity = {
|
|
10
|
+
owner: "owner-a",
|
|
11
|
+
sourceId: "https://example.test/source",
|
|
12
|
+
connectionId: "connection-a",
|
|
13
|
+
methodId: "export",
|
|
14
|
+
generation: 1,
|
|
15
|
+
};
|
|
16
|
+
export const registration = {
|
|
17
|
+
...identity,
|
|
18
|
+
kind: "connection-register",
|
|
19
|
+
revision: { counter: 1, writerId: "device-a", operationId: "register" },
|
|
20
|
+
};
|
|
21
|
+
export function upsert(operationId, counter, text = operationId, writerId = "device-a") {
|
|
22
|
+
return {
|
|
23
|
+
...identity,
|
|
24
|
+
kind: "upsert",
|
|
25
|
+
declaration: binding,
|
|
26
|
+
recordKey: "same-key",
|
|
27
|
+
emittedAt: "2026-10-20T00:00:00Z",
|
|
28
|
+
data: { id: "same-key", text },
|
|
29
|
+
blobs: [],
|
|
30
|
+
revision: { counter, writerId, operationId },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export const mutableVectors = [
|
|
34
|
+
upsert("a", 2, "offline A"),
|
|
35
|
+
upsert("b", 2, "offline B", "device-b"),
|
|
36
|
+
{
|
|
37
|
+
...identity,
|
|
38
|
+
kind: "delete",
|
|
39
|
+
declaration: binding,
|
|
40
|
+
recordKey: "same-key",
|
|
41
|
+
emittedAt: "2026-10-20T00:00:00Z",
|
|
42
|
+
deletedAt: "2026-10-20T00:00:00Z",
|
|
43
|
+
revision: { counter: 3, writerId: "device-a", operationId: "delete" },
|
|
44
|
+
},
|
|
45
|
+
upsert("resurrect", 4),
|
|
46
|
+
];
|
|
47
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/replication/fixtures.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,OAAO,GAAuB;IACzC,MAAM,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;IAClC,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,UAAU;IAClB,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,CAAC,IAAI,CAAC;IAClB,YAAY,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;CACzC,CAAC;AACF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,6BAA6B;IACvC,YAAY,EAAE,cAAc;IAC5B,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,CAAU;CACvB,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C,GAAG,QAAQ;IACX,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE;CACxE,CAAC;AACF,MAAM,UAAU,MAAM,CACpB,WAAmB,EACnB,OAAe,EACf,IAAI,GAAG,WAAW,EAClB,QAAQ,GAAG,UAAU;IAErB,OAAO;QACL,GAAG,QAAQ;QACX,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,sBAAsB;QACjC,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;QAC9B,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE;KAC7C,CAAC;AACJ,CAAC;AACD,MAAM,CAAC,MAAM,cAAc,GAA+B;IACxD,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC;IAC3B,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC;IACvC;QACE,GAAG,QAAQ;QACX,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,sBAAsB;QACjC,SAAS,EAAE,sBAAsB;QACjC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE;KACtE;IACD,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;CACvB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { DeclarationSnapshot } from "../pdpp/types.js";
|
|
2
|
+
import { type DeclarationBinding, type EnvelopeExpectation } from "./envelope.js";
|
|
3
|
+
import type { MergeContext } from "./merge-plan.js";
|
|
4
|
+
import type { ReplicaEnvironment } from "./writer-identity.js";
|
|
5
|
+
/**
|
|
6
|
+
* The signed partition environment of a chain. `undefined` for any other
|
|
7
|
+
* chain: replication then does not start, because a guessed environment
|
|
8
|
+
* would put this device in a partition no peer shares.
|
|
9
|
+
*/
|
|
10
|
+
export declare function replicaEnvironmentForChain(chainId: number): ReplicaEnvironment | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* The owner as every replica statement and operation carries it. Hosts hold
|
|
13
|
+
* checksummed addresses; the partition compares exact strings.
|
|
14
|
+
*/
|
|
15
|
+
export declare function replicaPartitionOwner(address: string): string;
|
|
16
|
+
/** A stream's JSON Schema; `null` when the stream declares none. */
|
|
17
|
+
export type ReplicaStreamSchema = Record<string, unknown> | null;
|
|
18
|
+
/** One bound stream, with the schema its operations validate against. */
|
|
19
|
+
export interface RetainedReplicaDeclaration {
|
|
20
|
+
sourceId: string;
|
|
21
|
+
binding: DeclarationBinding;
|
|
22
|
+
schema: ReplicaStreamSchema;
|
|
23
|
+
}
|
|
24
|
+
/** The `schemaDigest` a binding carries for a stream schema. */
|
|
25
|
+
export declare function replicaSchemaDigest(schema: ReplicaStreamSchema): string;
|
|
26
|
+
/**
|
|
27
|
+
* One binding per declared stream of each retained declaration: the exact
|
|
28
|
+
* document digest and version, the stream's semantics and primary key, and a
|
|
29
|
+
* digest of its JSON Schema (`null` when it declares none). Throws when a
|
|
30
|
+
* stream cannot be bound; the host then does not start replication.
|
|
31
|
+
*
|
|
32
|
+
* A changed set is a rebinding (`rebinding.ts`): `beginBaseline` records a
|
|
33
|
+
* new binding generation and keeps trusting the older bindings.
|
|
34
|
+
*/
|
|
35
|
+
export declare function replicaDeclarationBindings(snapshots: readonly DeclarationSnapshot[]): RetainedReplicaDeclaration[];
|
|
36
|
+
/**
|
|
37
|
+
* The bindings this boot writes under (`current`, for `beginBaseline`) and
|
|
38
|
+
* the trusted set every replication check uses: `current` plus every binding
|
|
39
|
+
* the database retained in an earlier generation (`history`, from
|
|
40
|
+
* `declarationHistory()`). Own operations still in flight and peers that have
|
|
41
|
+
* not upgraded yet write under those older bindings; trusting only `current`
|
|
42
|
+
* would refuse them. A history entry without a schema, or whose schema does
|
|
43
|
+
* not match its digest, is not trusted, so its operations wait.
|
|
44
|
+
*/
|
|
45
|
+
export declare function replicaDeclarationContext(owner: string, snapshots: readonly DeclarationSnapshot[], history?: readonly (Omit<RetainedReplicaDeclaration, "schema"> & {
|
|
46
|
+
schema?: ReplicaStreamSchema;
|
|
47
|
+
})[]): {
|
|
48
|
+
current: RetainedReplicaDeclaration[];
|
|
49
|
+
expected: EnvelopeExpectation;
|
|
50
|
+
declarations: MergeContext["declarations"];
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=host-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-config.d.ts","sourceRoot":"","sources":["../../src/replication/host-config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ/D;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GACd,kBAAkB,GAAG,SAAS,CAEhC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI7D;AAKD,oEAAoE;AACpE,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAEjE,yEAAyE;AACzE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAEvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,SAAS,mBAAmB,EAAE,GACxC,0BAA0B,EAAE,CAiB9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,mBAAmB,EAAE,EACzC,OAAO,GAAE,SAAS,CAAC,IAAI,CAAC,0BAA0B,EAAE,QAAQ,CAAC,GAAG;IAC9D,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,CAAC,EAAO,GACR;IACD,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACtC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;CAC5C,CA6CA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What both hosts derive the same way before replication starts (host
|
|
3
|
+
* contract §4.1). Desktop and the phone must agree on every value here, or
|
|
4
|
+
* each refuses the other's batches, so the derivations live in core.
|
|
5
|
+
*/
|
|
6
|
+
import { sha256, stringToBytes } from "viem";
|
|
7
|
+
import { compileRecordSchema } from "../storage/pdpp-records/schema.js";
|
|
8
|
+
import { canonicalJson, declarationBindingSchema, } from "./envelope.js";
|
|
9
|
+
/** Vana mainnet carries prod data; Moksha carries dev. */
|
|
10
|
+
const ENVIRONMENT_BY_CHAIN = {
|
|
11
|
+
1480: "prod",
|
|
12
|
+
14800: "dev",
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The signed partition environment of a chain. `undefined` for any other
|
|
16
|
+
* chain: replication then does not start, because a guessed environment
|
|
17
|
+
* would put this device in a partition no peer shares.
|
|
18
|
+
*/
|
|
19
|
+
export function replicaEnvironmentForChain(chainId) {
|
|
20
|
+
return ENVIRONMENT_BY_CHAIN[chainId];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The owner as every replica statement and operation carries it. Hosts hold
|
|
24
|
+
* checksummed addresses; the partition compares exact strings.
|
|
25
|
+
*/
|
|
26
|
+
export function replicaPartitionOwner(address) {
|
|
27
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(address))
|
|
28
|
+
throw new TypeError("invalid replica owner address");
|
|
29
|
+
return address.toLowerCase();
|
|
30
|
+
}
|
|
31
|
+
const sha256Text = (text) => `sha256:${sha256(stringToBytes(text)).slice(2)}`;
|
|
32
|
+
/** The `schemaDigest` a binding carries for a stream schema. */
|
|
33
|
+
export function replicaSchemaDigest(schema) {
|
|
34
|
+
return sha256Text(canonicalJson(schema));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* One binding per declared stream of each retained declaration: the exact
|
|
38
|
+
* document digest and version, the stream's semantics and primary key, and a
|
|
39
|
+
* digest of its JSON Schema (`null` when it declares none). Throws when a
|
|
40
|
+
* stream cannot be bound; the host then does not start replication.
|
|
41
|
+
*
|
|
42
|
+
* A changed set is a rebinding (`rebinding.ts`): `beginBaseline` records a
|
|
43
|
+
* new binding generation and keeps trusting the older bindings.
|
|
44
|
+
*/
|
|
45
|
+
export function replicaDeclarationBindings(snapshots) {
|
|
46
|
+
return [...snapshots]
|
|
47
|
+
.sort((a, b) => (a.source_id < b.source_id ? -1 : 1))
|
|
48
|
+
.flatMap((snapshot) => snapshot.streams.map((stream) => ({
|
|
49
|
+
sourceId: snapshot.source_id,
|
|
50
|
+
binding: declarationBindingSchema.parse({
|
|
51
|
+
digest: `sha256:${snapshot.digest}`,
|
|
52
|
+
version: snapshot.version,
|
|
53
|
+
stream: stream.name,
|
|
54
|
+
semantics: stream.semantics ?? "mutable_state",
|
|
55
|
+
primaryKey: stream.primary_key,
|
|
56
|
+
schemaDigest: replicaSchemaDigest(stream.schema ?? null),
|
|
57
|
+
}),
|
|
58
|
+
schema: stream.schema ?? null,
|
|
59
|
+
})));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The bindings this boot writes under (`current`, for `beginBaseline`) and
|
|
63
|
+
* the trusted set every replication check uses: `current` plus every binding
|
|
64
|
+
* the database retained in an earlier generation (`history`, from
|
|
65
|
+
* `declarationHistory()`). Own operations still in flight and peers that have
|
|
66
|
+
* not upgraded yet write under those older bindings; trusting only `current`
|
|
67
|
+
* would refuse them. A history entry without a schema, or whose schema does
|
|
68
|
+
* not match its digest, is not trusted, so its operations wait.
|
|
69
|
+
*/
|
|
70
|
+
export function replicaDeclarationContext(owner, snapshots, history = []) {
|
|
71
|
+
const current = replicaDeclarationBindings(snapshots);
|
|
72
|
+
const trusted = new Map();
|
|
73
|
+
for (const { schema, ...entry } of [...current, ...history])
|
|
74
|
+
if (schema !== undefined &&
|
|
75
|
+
replicaSchemaDigest(schema) === entry.binding.schemaDigest)
|
|
76
|
+
trusted.set(canonicalJson([entry.sourceId, entry.binding]), {
|
|
77
|
+
...entry,
|
|
78
|
+
schema,
|
|
79
|
+
});
|
|
80
|
+
const entries = [...trusted.values()];
|
|
81
|
+
const validators = new Map();
|
|
82
|
+
// The same rule as the resource server: a stream without a schema states
|
|
83
|
+
// no shape to check.
|
|
84
|
+
const validatorFor = (entry) => {
|
|
85
|
+
let validate = validators.get(entry.binding.schemaDigest);
|
|
86
|
+
if (!validate) {
|
|
87
|
+
const compiled = entry.schema
|
|
88
|
+
? compileRecordSchema(entry.schema)
|
|
89
|
+
: undefined;
|
|
90
|
+
validate = (data) => (compiled ? compiled(data) === true : true);
|
|
91
|
+
validators.set(entry.binding.schemaDigest, validate);
|
|
92
|
+
}
|
|
93
|
+
return validate;
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
current,
|
|
97
|
+
expected: {
|
|
98
|
+
owner,
|
|
99
|
+
declarations: entries.map(({ sourceId, binding }) => ({
|
|
100
|
+
sourceId,
|
|
101
|
+
binding,
|
|
102
|
+
})),
|
|
103
|
+
},
|
|
104
|
+
declarations: entries.map((entry) => ({
|
|
105
|
+
sourceId: entry.sourceId,
|
|
106
|
+
binding: entry.binding,
|
|
107
|
+
validateData: validatorFor(entry),
|
|
108
|
+
})),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=host-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-config.js","sourceRoot":"","sources":["../../src/replication/host-config.ts"],"names":[],"mappings":"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"}
|