@opendatalabs/personal-server-ts-core 1.34.2 → 1.35.0
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 +316 -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,182 @@
|
|
|
1
|
+
/** Protocol limits shared by replication senders, admission, and stream readers. */
|
|
2
|
+
import { MAX_DECLARATION_BYTES } from "../pdpp/declaration-limits.js";
|
|
3
|
+
export const REPLICA_MAX_FRAGMENTS = 100_000;
|
|
4
|
+
/** vana-storage DEFAULT_MAX_BLOB_SIZE. Compare the actual encrypted request. */
|
|
5
|
+
export const REPLICA_MAX_BLOB_BYTES = 100 * 1024 * 1024;
|
|
6
|
+
/** Per-fragment framing allowance used by the #500 aggregate ciphertext check. */
|
|
7
|
+
export const REPLICA_FRAGMENT_OVERHEAD_BYTES = 4096;
|
|
8
|
+
/** Same source-write bounds used by the Node PDPP routes. */
|
|
9
|
+
export const REPLICA_SOURCE_MAX_BLOB_BYTES = 512 * 1024 * 1024;
|
|
10
|
+
export const REPLICA_SOURCE_MAX_RECORD_JSON_BYTES = 512 * 1024 * 1024;
|
|
11
|
+
/** Node capture's persisted batch target and operation count. */
|
|
12
|
+
export const REPLICA_BATCH_TARGET_BYTES = 32 * 1024 * 1024;
|
|
13
|
+
export const REPLICA_BATCH_OPERATION_LIMIT = 10_000;
|
|
14
|
+
/** Node prepares 4 MiB payload chunks before #500 encryption overhead. */
|
|
15
|
+
export const REPLICA_DEFAULT_FRAGMENT_BYTES = 4 * 1024 * 1024;
|
|
16
|
+
export const REPLICA_MAX_OPERATIONS = REPLICA_BATCH_OPERATION_LIMIT;
|
|
17
|
+
/** One retained evidence row is created for each manifest fragment. */
|
|
18
|
+
export const REPLICA_MAX_EVIDENCE_ROWS = REPLICA_MAX_FRAGMENTS;
|
|
19
|
+
export const REPLICA_LIMITS_VERSION = 2;
|
|
20
|
+
/**
|
|
21
|
+
* Operation metadata can repeat the record key and carries declaration-bound
|
|
22
|
+
* source/method identifiers. Bound that overhead by a second ingest body plus
|
|
23
|
+
* the largest retained declaration and fixed replication fields.
|
|
24
|
+
*/
|
|
25
|
+
export const REPLICA_MAX_OPERATION_ENVELOPE_BYTES = REPLICA_SOURCE_MAX_RECORD_JSON_BYTES + MAX_DECLARATION_BYTES + 64 * 1024;
|
|
26
|
+
/** The payload-level header is fixed apart from its retained declaration IDs. */
|
|
27
|
+
export const REPLICA_MAX_PAYLOAD_ENVELOPE_BYTES = 2 * MAX_DECLARATION_BYTES + 64 * 1024;
|
|
28
|
+
export const REPLICA_MAX_SINGLE_OPERATION_BYTES = 4 * Math.ceil(REPLICA_SOURCE_MAX_BLOB_BYTES / 3) +
|
|
29
|
+
REPLICA_SOURCE_MAX_RECORD_JSON_BYTES +
|
|
30
|
+
REPLICA_MAX_OPERATION_ENVELOPE_BYTES;
|
|
31
|
+
/**
|
|
32
|
+
* The first operation may exceed the target, then later operations may fill
|
|
33
|
+
* the target; otherwise every operation fits the target and count is binding.
|
|
34
|
+
*/
|
|
35
|
+
export const REPLICA_MAX_TOTAL_BYTES = Math.max(REPLICA_BATCH_TARGET_BYTES + REPLICA_MAX_SINGLE_OPERATION_BYTES, REPLICA_BATCH_OPERATION_LIMIT * REPLICA_BATCH_TARGET_BYTES) + REPLICA_MAX_PAYLOAD_ENVELOPE_BYTES;
|
|
36
|
+
/** Each streamed operation is bounded by the admitted payload that contains it. */
|
|
37
|
+
export const REPLICA_MAX_OPERATION_BYTES = REPLICA_MAX_TOTAL_BYTES;
|
|
38
|
+
/** A blob cannot exceed the actual Node source write cap. */
|
|
39
|
+
export const REPLICA_MAX_SINGLE_BLOB_BYTES = REPLICA_SOURCE_MAX_BLOB_BYTES;
|
|
40
|
+
/** Base64 blob bytes are part of totalBytes, so their sum cannot exceed it. */
|
|
41
|
+
export const REPLICA_MAX_BLOB_TOTAL_BYTES = REPLICA_MAX_TOTAL_BYTES;
|
|
42
|
+
/**
|
|
43
|
+
* The maximum encrypted fragment bytes for a payload of `totalBytes` and
|
|
44
|
+
* `count` fragments: base64 payload bytes plus #500's per-fragment framing.
|
|
45
|
+
*/
|
|
46
|
+
export function replicaFramedBytesBound(totalBytes, count) {
|
|
47
|
+
return (4 * Math.ceil(totalBytes / 3) +
|
|
48
|
+
count * (4 + REPLICA_FRAGMENT_OVERHEAD_BYTES));
|
|
49
|
+
}
|
|
50
|
+
/** Maximum declared encrypted bytes for an honest payload and 100,000 fragments. */
|
|
51
|
+
export const REPLICA_MAX_AGGREGATE_CIPHERTEXT_BYTES = 4 * Math.ceil(REPLICA_MAX_TOTAL_BYTES / 3) +
|
|
52
|
+
REPLICA_MAX_FRAGMENTS * (4 + REPLICA_FRAGMENT_OVERHEAD_BYTES);
|
|
53
|
+
/** Four live representations: ciphertext, plaintext, parsed JSON and decoded bytes. */
|
|
54
|
+
export const REPLICA_LIVE_COPY_FACTOR = 4;
|
|
55
|
+
/** The retained JSON string plus its parsed operation tree. */
|
|
56
|
+
export const REPLICA_ENVELOPE_LIVE_COPY_FACTOR = 2;
|
|
57
|
+
/** 100 MiB #500 per-object cap × four copies = 400 MiB, below this budget. */
|
|
58
|
+
export const REPLICA_DEFAULT_BYTE_BUDGET_BYTES = 512 * 1024 * 1024;
|
|
59
|
+
export const REPLICA_DEFAULT_LIMITS = Object.freeze({
|
|
60
|
+
maxSourceBlobBytes: REPLICA_SOURCE_MAX_BLOB_BYTES,
|
|
61
|
+
maxRecordJsonBytes: REPLICA_SOURCE_MAX_RECORD_JSON_BYTES,
|
|
62
|
+
maxManifestCiphertextBytes: REPLICA_MAX_BLOB_BYTES,
|
|
63
|
+
maxFragmentCiphertextBytes: REPLICA_MAX_BLOB_BYTES,
|
|
64
|
+
maxAggregateCiphertextBytes: REPLICA_MAX_AGGREGATE_CIPHERTEXT_BYTES,
|
|
65
|
+
maxFragments: REPLICA_MAX_FRAGMENTS,
|
|
66
|
+
maxEvidenceRows: REPLICA_MAX_EVIDENCE_ROWS,
|
|
67
|
+
maxTotalBytes: REPLICA_MAX_TOTAL_BYTES,
|
|
68
|
+
maxOperations: REPLICA_MAX_OPERATIONS,
|
|
69
|
+
maxOperationBytes: REPLICA_MAX_OPERATION_BYTES,
|
|
70
|
+
maxSingleBlobBytes: REPLICA_MAX_SINGLE_BLOB_BYTES,
|
|
71
|
+
maxBlobTotalBytes: REPLICA_MAX_BLOB_TOTAL_BYTES,
|
|
72
|
+
});
|
|
73
|
+
export function replicaResourceLimits(overrides = {}) {
|
|
74
|
+
return Object.freeze({ ...REPLICA_DEFAULT_LIMITS, ...overrides });
|
|
75
|
+
}
|
|
76
|
+
/** Reservation ledger shared by concurrently running replication steps. */
|
|
77
|
+
export class ReplicaByteBudget {
|
|
78
|
+
maxBytes;
|
|
79
|
+
reservedBytes = 0;
|
|
80
|
+
reservations = new Map();
|
|
81
|
+
constructor(maxBytes) {
|
|
82
|
+
this.maxBytes = maxBytes;
|
|
83
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
|
|
84
|
+
throw new RangeError("invalid replication byte budget");
|
|
85
|
+
}
|
|
86
|
+
get reserved() {
|
|
87
|
+
return this.reservedBytes;
|
|
88
|
+
}
|
|
89
|
+
reserve(bytes, group = {}) {
|
|
90
|
+
if (!Number.isSafeInteger(bytes) || bytes < 0)
|
|
91
|
+
throw new RangeError("invalid replication reservation");
|
|
92
|
+
const availableBytes = this.maxBytes - this.reservedBytes;
|
|
93
|
+
const groupBytes = this.reservations.get(group) ?? 0;
|
|
94
|
+
if (bytes > availableBytes && groupBytes !== this.reservedBytes)
|
|
95
|
+
return { kind: "resource_busy", requestedBytes: bytes, availableBytes };
|
|
96
|
+
const nextReservedBytes = this.reservedBytes + bytes;
|
|
97
|
+
const nextGroupBytes = groupBytes + bytes;
|
|
98
|
+
if (!Number.isSafeInteger(nextReservedBytes) ||
|
|
99
|
+
!Number.isSafeInteger(nextGroupBytes))
|
|
100
|
+
throw new RangeError("replication reservation exhausted");
|
|
101
|
+
this.reservedBytes = nextReservedBytes;
|
|
102
|
+
this.reservations.set(group, nextGroupBytes);
|
|
103
|
+
let released = false;
|
|
104
|
+
return () => {
|
|
105
|
+
if (released)
|
|
106
|
+
return;
|
|
107
|
+
released = true;
|
|
108
|
+
this.reservedBytes -= bytes;
|
|
109
|
+
const remaining = (this.reservations.get(group) ?? 0) - bytes;
|
|
110
|
+
if (remaining === 0)
|
|
111
|
+
this.reservations.delete(group);
|
|
112
|
+
else
|
|
113
|
+
this.reservations.set(group, remaining);
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const admissionBrand = Symbol("ReplicaAdmission");
|
|
118
|
+
export class ReplicaResourceLimitError extends Error {
|
|
119
|
+
limit;
|
|
120
|
+
actual;
|
|
121
|
+
maximum;
|
|
122
|
+
code = "replica_resource_limit_exceeded";
|
|
123
|
+
constructor(limit, actual, maximum) {
|
|
124
|
+
super("replica resource limit exceeded");
|
|
125
|
+
this.limit = limit;
|
|
126
|
+
this.actual = actual;
|
|
127
|
+
this.maximum = maximum;
|
|
128
|
+
this.name = "ReplicaResourceLimitError";
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export class ReplicaResourceBusyError extends Error {
|
|
132
|
+
code = "resource_busy";
|
|
133
|
+
constructor() {
|
|
134
|
+
super("replica object reservation is busy");
|
|
135
|
+
this.name = "ReplicaResourceBusyError";
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Check manifest-declared totals and issue an object-reservation capability. */
|
|
139
|
+
export function admit(manifest, budget, identity, limits = REPLICA_DEFAULT_LIMITS) {
|
|
140
|
+
if (manifest.fragments.length > limits.maxEvidenceRows)
|
|
141
|
+
return unsupported("retained_evidence_rows");
|
|
142
|
+
if (manifest.fragments.length > limits.maxFragments)
|
|
143
|
+
return unsupported("fragment_count");
|
|
144
|
+
if (manifest.fragments.some((fragment) => fragment.bytes > limits.maxFragmentCiphertextBytes))
|
|
145
|
+
return unsupported("fragment_ciphertext_bytes");
|
|
146
|
+
const ciphertextBytes = manifest.fragments.reduce((total, fragment) => total + fragment.bytes, 0);
|
|
147
|
+
if (!Number.isSafeInteger(ciphertextBytes) ||
|
|
148
|
+
ciphertextBytes > limits.maxAggregateCiphertextBytes ||
|
|
149
|
+
ciphertextBytes >
|
|
150
|
+
replicaFramedBytesBound(manifest.totalBytes, manifest.fragments.length))
|
|
151
|
+
return unsupported("aggregate_ciphertext_bytes");
|
|
152
|
+
if (!Number.isSafeInteger(manifest.totalBytes) ||
|
|
153
|
+
manifest.totalBytes < 1 ||
|
|
154
|
+
manifest.totalBytes > limits.maxTotalBytes)
|
|
155
|
+
return unsupported("total_bytes");
|
|
156
|
+
const reservationGroup = {};
|
|
157
|
+
return Object.freeze({
|
|
158
|
+
[admissionBrand]: true,
|
|
159
|
+
admissionId: `${identity.repositoryId}:${identity.owner}:${identity.manifestDigest}`,
|
|
160
|
+
...identity,
|
|
161
|
+
payloadBytes: manifest.totalBytes,
|
|
162
|
+
limitsVersion: REPLICA_LIMITS_VERSION,
|
|
163
|
+
reserveObject(ciphertextBytes, group = {}) {
|
|
164
|
+
if (!Number.isSafeInteger(ciphertextBytes) || ciphertextBytes < 0)
|
|
165
|
+
throw new RangeError("invalid replica object size");
|
|
166
|
+
return budget.reserve(ciphertextBytes * REPLICA_LIVE_COPY_FACTOR, group);
|
|
167
|
+
},
|
|
168
|
+
reserveEnvelope(jsonBytes, group = reservationGroup) {
|
|
169
|
+
if (!Number.isSafeInteger(jsonBytes) || jsonBytes < 0)
|
|
170
|
+
throw new RangeError("invalid replica envelope size");
|
|
171
|
+
return budget.reserve(jsonBytes * REPLICA_ENVELOPE_LIVE_COPY_FACTOR, group);
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function unsupported(limit) {
|
|
176
|
+
return {
|
|
177
|
+
kind: "resource_unsupported",
|
|
178
|
+
limit,
|
|
179
|
+
limitsVersion: REPLICA_LIMITS_VERSION,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/replication/limits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { DeclarationBinding, RecordOperation, ReplicaOperation } from "./envelope.js";
|
|
2
|
+
/** Provisional decisions: revise this profile here, then update the pinned vectors. */
|
|
3
|
+
export declare const REPLICA_POLICY: {
|
|
4
|
+
readonly mutableOrder: "lamport-writer-operation";
|
|
5
|
+
readonly retainLosers: true;
|
|
6
|
+
readonly laterUpsertResurrects: true;
|
|
7
|
+
readonly declarationVersions: "same-shape-versions-merge-by-revision";
|
|
8
|
+
readonly carriedDeclarations: "same-shape-versions-trusted-by-key";
|
|
9
|
+
readonly appendOnlyConflict: "quarantine-until-separately-authorized-repair";
|
|
10
|
+
readonly authorization: "single-issuer-data-and-connection-evidence-only";
|
|
11
|
+
};
|
|
12
|
+
export interface MergeContext {
|
|
13
|
+
owner: string;
|
|
14
|
+
/** Retained, digest-verified declarations. Validation must use that exact schema. */
|
|
15
|
+
declarations: readonly {
|
|
16
|
+
sourceId: string;
|
|
17
|
+
binding: DeclarationBinding;
|
|
18
|
+
validateData: (data: Record<string, unknown>) => boolean;
|
|
19
|
+
}[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Every reason a plan issue can carry. Hosts branch on these strings, so a new
|
|
23
|
+
* reason is a profile change. The last group is added by the Node receiver to
|
|
24
|
+
* its own copy of the plan; `visibility-engine.ts` states those decisions as
|
|
25
|
+
* typed projection fields instead.
|
|
26
|
+
*/
|
|
27
|
+
export type MergeIssueReason = "wrong_owner" | "operation_id_equivocation" | "connection_deleted" | "incompatible_connection_binding" | "missing_connection_registration" | "invalid_generation_reset" | "missing_generation_reset" | "old_generation" | "missing_declaration" | "incompatible_declaration" | "append_only_delete" | "invalid_record_data" | "incompatible_record_declaration" | "append_only_content_conflict" | "missing_local_connection" | "missing_or_invalid_blob" | "unverified_completion" | "incompatible_completion_declaration";
|
|
28
|
+
export interface MergeIssue {
|
|
29
|
+
reason: MergeIssueReason;
|
|
30
|
+
operations: ReplicaOperation[];
|
|
31
|
+
}
|
|
32
|
+
export interface MergedRecord {
|
|
33
|
+
identity: {
|
|
34
|
+
owner: string;
|
|
35
|
+
sourceId: string;
|
|
36
|
+
connectionId: string;
|
|
37
|
+
generation: number;
|
|
38
|
+
stream: string;
|
|
39
|
+
recordKey: string;
|
|
40
|
+
};
|
|
41
|
+
winner: RecordOperation | null;
|
|
42
|
+
losers: RecordOperation[];
|
|
43
|
+
quarantined: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface ReplicaMergePlan {
|
|
46
|
+
records: MergedRecord[];
|
|
47
|
+
conflicts: MergeIssue[];
|
|
48
|
+
rejected: MergeIssue[];
|
|
49
|
+
pending: MergeIssue[];
|
|
50
|
+
suppressed: MergeIssue[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* An operation pending on its declaration (missing or incompatible) never
|
|
54
|
+
* applies, so it neither certifies nor withdraws a stream's completion.
|
|
55
|
+
*/
|
|
56
|
+
export declare const declarationWait: (reason: MergeIssueReason) => reason is "missing_declaration" | "incompatible_declaration";
|
|
57
|
+
/** How a device treats the binding an operation carries (`resolveDeclaration`). */
|
|
58
|
+
export type DeclarationResolution<T> = {
|
|
59
|
+
status: "retained";
|
|
60
|
+
declaration: T;
|
|
61
|
+
} | {
|
|
62
|
+
status: "compatible";
|
|
63
|
+
} | {
|
|
64
|
+
status: "incompatible";
|
|
65
|
+
} | {
|
|
66
|
+
status: "missing";
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* A retained binding validates its operations against its own schema. A
|
|
70
|
+
* binding this device does not retain, but with the shape
|
|
71
|
+
* (`declarationShape`) of a retained binding of the same source, is
|
|
72
|
+
* compatible: another version of a stream this device already trusts, which
|
|
73
|
+
* a peer of the same owner wrote under and signed into its batch. Its schema
|
|
74
|
+
* is not known here, so its operations validate by primary key only. A
|
|
75
|
+
* binding of a retained stream with another shape is incompatible and never
|
|
76
|
+
* applies. Any other binding is missing: it names a stream this device does
|
|
77
|
+
* not declare yet, and its operations wait.
|
|
78
|
+
*/
|
|
79
|
+
export declare function resolveDeclaration<T extends {
|
|
80
|
+
sourceId: string;
|
|
81
|
+
binding: DeclarationBinding;
|
|
82
|
+
}>(declarations: readonly T[], sourceId: string, binding: DeclarationBinding): DeclarationResolution<T>;
|
|
83
|
+
/**
|
|
84
|
+
* Recompute from the complete retained operation set, including lifecycle evidence.
|
|
85
|
+
* The host must retain losers, conflicts, pending operations and tombstones across calls.
|
|
86
|
+
* This is the full-history oracle: `evaluate` in `visibility-engine.ts` derives
|
|
87
|
+
* the projection from it, and every bounded engine is tested against it.
|
|
88
|
+
* This converges; it cannot establish which offline scrape is freshest upstream.
|
|
89
|
+
* No I/O, local history version allocation, grant copying, or repair authorization.
|
|
90
|
+
*/
|
|
91
|
+
export declare function planReplicaMerge(context: MergeContext, input: readonly ReplicaOperation[]): ReplicaMergePlan;
|
|
92
|
+
//# sourceMappingURL=merge-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-plan.d.ts","sourceRoot":"","sources":["../../src/replication/merge-plan.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAIvB,uFAAuF;AACvF,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,YAAY,EAAE,SAAS;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,kBAAkB,CAAC;QAC5B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;KAC1D,EAAE,CAAC;CACL;AACD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,2BAA2B,GAC3B,oBAAoB,GACpB,iCAAiC,GACjC,iCAAiC,GACjC,0BAA0B,GAC1B,0BAA0B,GAC1B,gBAAgB,GAChB,qBAAqB,GACrB,0BAA0B,GAC1B,oBAAoB,GACpB,qBAAqB,GACrB,iCAAiC,GACjC,8BAA8B,GAE9B,0BAA0B,GAC1B,yBAAyB,GACzB,uBAAuB,GACvB,qCAAqC,CAAC;AAC1C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,gBAAgB,iEACmB,CAAC;AAE5E,mFAAmF;AACnF,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAC/B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,CAAC,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,EAE3D,YAAY,EAAE,SAAS,CAAC,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,GAC1B,qBAAqB,CAAC,CAAC,CAAC,CAe1B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,SAAS,gBAAgB,EAAE,GACjC,gBAAgB,CAiNlB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { computeRecordKeyFromData } from "../storage/pdpp-records/record-key.js";
|
|
2
|
+
import { canonicalJson, declarationShape, replicaOperationSchema, } from "./envelope.js";
|
|
3
|
+
import { connectionKey } from "./identity.js";
|
|
4
|
+
import { compareRevisions } from "./revision.js";
|
|
5
|
+
/** Provisional decisions: revise this profile here, then update the pinned vectors. */
|
|
6
|
+
export const REPLICA_POLICY = {
|
|
7
|
+
mutableOrder: "lamport-writer-operation",
|
|
8
|
+
retainLosers: true,
|
|
9
|
+
laterUpsertResurrects: true,
|
|
10
|
+
declarationVersions: "same-shape-versions-merge-by-revision",
|
|
11
|
+
carriedDeclarations: "same-shape-versions-trusted-by-key",
|
|
12
|
+
appendOnlyConflict: "quarantine-until-separately-authorized-repair",
|
|
13
|
+
authorization: "single-issuer-data-and-connection-evidence-only",
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* An operation pending on its declaration (missing or incompatible) never
|
|
17
|
+
* applies, so it neither certifies nor withdraws a stream's completion.
|
|
18
|
+
*/
|
|
19
|
+
export const declarationWait = (reason) => reason === "missing_declaration" || reason === "incompatible_declaration";
|
|
20
|
+
/**
|
|
21
|
+
* A retained binding validates its operations against its own schema. A
|
|
22
|
+
* binding this device does not retain, but with the shape
|
|
23
|
+
* (`declarationShape`) of a retained binding of the same source, is
|
|
24
|
+
* compatible: another version of a stream this device already trusts, which
|
|
25
|
+
* a peer of the same owner wrote under and signed into its batch. Its schema
|
|
26
|
+
* is not known here, so its operations validate by primary key only. A
|
|
27
|
+
* binding of a retained stream with another shape is incompatible and never
|
|
28
|
+
* applies. Any other binding is missing: it names a stream this device does
|
|
29
|
+
* not declare yet, and its operations wait.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveDeclaration(declarations, sourceId, binding) {
|
|
32
|
+
const stream = declarations.filter((entry) => entry.sourceId === sourceId && entry.binding.stream === binding.stream);
|
|
33
|
+
const exact = stream.find((entry) => canonicalJson(entry.binding) === canonicalJson(binding));
|
|
34
|
+
if (exact)
|
|
35
|
+
return { status: "retained", declaration: exact };
|
|
36
|
+
if (!stream.length)
|
|
37
|
+
return { status: "missing" };
|
|
38
|
+
return stream.some((entry) => declarationShape(entry.binding) === declarationShape(binding))
|
|
39
|
+
? { status: "compatible" }
|
|
40
|
+
: { status: "incompatible" };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Recompute from the complete retained operation set, including lifecycle evidence.
|
|
44
|
+
* The host must retain losers, conflicts, pending operations and tombstones across calls.
|
|
45
|
+
* This is the full-history oracle: `evaluate` in `visibility-engine.ts` derives
|
|
46
|
+
* the projection from it, and every bounded engine is tested against it.
|
|
47
|
+
* This converges; it cannot establish which offline scrape is freshest upstream.
|
|
48
|
+
* No I/O, local history version allocation, grant copying, or repair authorization.
|
|
49
|
+
*/
|
|
50
|
+
export function planReplicaMerge(context, input) {
|
|
51
|
+
const result = {
|
|
52
|
+
records: [],
|
|
53
|
+
conflicts: [],
|
|
54
|
+
rejected: [],
|
|
55
|
+
pending: [],
|
|
56
|
+
suppressed: [],
|
|
57
|
+
};
|
|
58
|
+
const issue = (bucket, reason, operations) => bucket.push({ reason, operations });
|
|
59
|
+
const byId = new Map();
|
|
60
|
+
/** Every owned operation, equivocated variants included. */
|
|
61
|
+
const evidence = [];
|
|
62
|
+
for (const raw of input) {
|
|
63
|
+
const operation = replicaOperationSchema.parse(raw);
|
|
64
|
+
if (operation.owner !== context.owner) {
|
|
65
|
+
issue(result.rejected, "wrong_owner", [operation]);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const id = canonicalJson([
|
|
69
|
+
operation.revision.writerId,
|
|
70
|
+
operation.revision.operationId,
|
|
71
|
+
]);
|
|
72
|
+
evidence.push(operation);
|
|
73
|
+
const variants = byId.get(id) ?? new Map();
|
|
74
|
+
variants.set(canonicalJson(operation), operation);
|
|
75
|
+
byId.set(id, variants);
|
|
76
|
+
}
|
|
77
|
+
const blockedConnections = new Set();
|
|
78
|
+
const operations = [];
|
|
79
|
+
for (const variants of byId.values()) {
|
|
80
|
+
if (variants.size > 1) {
|
|
81
|
+
const colliding = [...variants.values()];
|
|
82
|
+
issue(result.conflicts, "operation_id_equivocation", colliding);
|
|
83
|
+
for (const operation of colliding)
|
|
84
|
+
blockedConnections.add(connectionKey(operation));
|
|
85
|
+
}
|
|
86
|
+
else
|
|
87
|
+
operations.push([...variants.values()][0]);
|
|
88
|
+
}
|
|
89
|
+
const connections = new Map();
|
|
90
|
+
for (const operation of operations) {
|
|
91
|
+
const key = connectionKey(operation);
|
|
92
|
+
const list = connections.get(key) ?? [];
|
|
93
|
+
list.push(operation);
|
|
94
|
+
connections.set(key, list);
|
|
95
|
+
}
|
|
96
|
+
// A logical id cannot be rebound to another producer, even when its source
|
|
97
|
+
// differs. Equivocated variants still count as source evidence: dropping
|
|
98
|
+
// them must not make a source-binding conflict disappear (#426).
|
|
99
|
+
for (const entries of connections.values()) {
|
|
100
|
+
const first = entries[0];
|
|
101
|
+
const sources = new Set(evidence
|
|
102
|
+
.filter((op) => op.connectionId === first.connectionId)
|
|
103
|
+
.map((op) => op.sourceId));
|
|
104
|
+
if (sources.size > 1)
|
|
105
|
+
blockedConnections.add(connectionKey(first));
|
|
106
|
+
}
|
|
107
|
+
for (const [key, entries] of connections) {
|
|
108
|
+
if (entries.some((op) => op.kind === "connection-delete")) {
|
|
109
|
+
issue(result.suppressed, "connection_deleted", entries);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const methods = new Set(entries.map((op) => op.methodId));
|
|
113
|
+
if (blockedConnections.has(key) || methods.size !== 1) {
|
|
114
|
+
issue(result.conflicts, "incompatible_connection_binding", entries);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (!entries.some((op) => op.kind === "connection-register")) {
|
|
118
|
+
issue(result.pending, "missing_connection_registration", entries);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const resets = entries.filter((op) => op.kind === "connection-reset");
|
|
122
|
+
if (resets.some((op) => op.generation !== op.previousGeneration + 1)) {
|
|
123
|
+
issue(result.conflicts, "invalid_generation_reset", entries);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const generation = Math.max(1, ...resets.map((op) => op.generation));
|
|
127
|
+
const generations = new Set([1, ...resets.map((op) => op.generation)]);
|
|
128
|
+
if (generations.size !== generation) {
|
|
129
|
+
issue(result.pending, "missing_generation_reset", entries);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const records = new Map();
|
|
133
|
+
for (const operation of entries) {
|
|
134
|
+
if (operation.kind !== "upsert" && operation.kind !== "delete")
|
|
135
|
+
continue;
|
|
136
|
+
if (operation.generation < generation) {
|
|
137
|
+
issue(result.suppressed, "old_generation", [operation]);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (operation.generation > generation) {
|
|
141
|
+
issue(result.pending, "missing_generation_reset", [operation]);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const resolved = resolveDeclaration(context.declarations, operation.sourceId, operation.declaration);
|
|
145
|
+
if (resolved.status === "missing" || resolved.status === "incompatible") {
|
|
146
|
+
issue(result.pending, `${resolved.status}_declaration`, [operation]);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const validateData = resolved.status === "retained"
|
|
150
|
+
? resolved.declaration.validateData
|
|
151
|
+
: () => true;
|
|
152
|
+
if (operation.kind === "delete" &&
|
|
153
|
+
operation.declaration.semantics === "append_only") {
|
|
154
|
+
issue(result.rejected, "append_only_delete", [operation]);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (operation.kind === "upsert") {
|
|
158
|
+
let valid = false;
|
|
159
|
+
try {
|
|
160
|
+
valid =
|
|
161
|
+
computeRecordKeyFromData(operation.data, operation.declaration.primaryKey) === operation.recordKey && validateData(operation.data);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
/* Invalid data/key cannot enter winner selection. */
|
|
165
|
+
}
|
|
166
|
+
if (!valid) {
|
|
167
|
+
issue(result.rejected, "invalid_record_data", [operation]);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const recordId = canonicalJson([
|
|
172
|
+
operation.declaration.stream,
|
|
173
|
+
operation.recordKey,
|
|
174
|
+
]);
|
|
175
|
+
const list = records.get(recordId) ?? [];
|
|
176
|
+
list.push(operation);
|
|
177
|
+
records.set(recordId, list);
|
|
178
|
+
}
|
|
179
|
+
for (const candidates of records.values()) {
|
|
180
|
+
candidates.sort((a, b) => compareRevisions(a.revision, b.revision));
|
|
181
|
+
const first = candidates[0];
|
|
182
|
+
// Versions of one declared stream are one record (a rebinding); only a
|
|
183
|
+
// changed shape makes the same record key name two records.
|
|
184
|
+
const shapes = new Set(candidates.map((op) => declarationShape(op.declaration)));
|
|
185
|
+
const content = new Set(candidates.map((op) => canonicalJson(op.kind === "upsert" ? { data: op.data, blobs: op.blobs } : null)));
|
|
186
|
+
const quarantined = shapes.size > 1 ||
|
|
187
|
+
(first.declaration.semantics === "append_only" && content.size > 1);
|
|
188
|
+
if (quarantined)
|
|
189
|
+
issue(result.conflicts, shapes.size > 1
|
|
190
|
+
? "incompatible_record_declaration"
|
|
191
|
+
: "append_only_content_conflict", candidates);
|
|
192
|
+
result.records.push({
|
|
193
|
+
identity: {
|
|
194
|
+
owner: first.owner,
|
|
195
|
+
sourceId: first.sourceId,
|
|
196
|
+
connectionId: first.connectionId,
|
|
197
|
+
generation,
|
|
198
|
+
stream: first.declaration.stream,
|
|
199
|
+
recordKey: first.recordKey,
|
|
200
|
+
},
|
|
201
|
+
winner: quarantined ? null : candidates[candidates.length - 1],
|
|
202
|
+
losers: quarantined ? candidates : candidates.slice(0, -1),
|
|
203
|
+
quarantined,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Normalize every output, including diagnostics; replay multiplicity is unobservable.
|
|
208
|
+
for (const bucket of [
|
|
209
|
+
result.conflicts,
|
|
210
|
+
result.rejected,
|
|
211
|
+
result.pending,
|
|
212
|
+
result.suppressed,
|
|
213
|
+
]) {
|
|
214
|
+
const unique = new Map();
|
|
215
|
+
for (const entry of bucket) {
|
|
216
|
+
entry.operations = [
|
|
217
|
+
...new Map(entry.operations.map((op) => [canonicalJson(op), op])).values(),
|
|
218
|
+
].sort((a, b) => compareText(canonicalJson(a), canonicalJson(b)));
|
|
219
|
+
unique.set(canonicalJson(entry), entry);
|
|
220
|
+
}
|
|
221
|
+
bucket.splice(0, bucket.length, ...[...unique.values()].sort((a, b) => compareText(canonicalJson(a), canonicalJson(b))));
|
|
222
|
+
}
|
|
223
|
+
result.records.sort((a, b) => compareText(canonicalJson(a.identity), canonicalJson(b.identity)));
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
function compareText(a, b) {
|
|
227
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=merge-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-plan.js","sourceRoot":"","sources":["../../src/replication/merge-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/replication/namespace.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AACtD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKrD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Dedicated SDK-compatible source name; never a legacy source or permission. */
|
|
2
|
+
export const REPLICA_SCOPE_PREFIX = "pdpp_replica_v1";
|
|
3
|
+
export function isReplicaScope(scope) {
|
|
4
|
+
return (scope === REPLICA_SCOPE_PREFIX ||
|
|
5
|
+
scope.startsWith(`${REPLICA_SCOPE_PREFIX}.`));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/replication/namespace.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AACtD,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,CACL,KAAK,KAAK,oBAAoB;QAC9B,KAAK,CAAC,UAAU,CAAC,GAAG,oBAAoB,GAAG,CAAC,CAC7C,CAAC;AACJ,CAAC"}
|