@opendatalabs/personal-server-ts-core 1.34.1 → 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 +19 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +185 -13
- 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 +89 -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 +17 -9
- 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/data-point-feed.d.ts.map +1 -1
- package/dist/sync/data-point-feed.js +4 -1
- package/dist/sync/data-point-feed.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/scope-deletions.d.ts +2 -0
- package/dist/sync/scope-deletions.d.ts.map +1 -1
- package/dist/sync/scope-deletions.js +60 -19
- package/dist/sync/scope-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
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import { type ByteBudget } from "./budget.js";
|
|
2
2
|
import { type GatewayClient } from "@opendatalabs/vana-sdk/browser";
|
|
3
3
|
import type { StorageAdapter } from "../storage/adapters/interface.js";
|
|
4
|
+
import { type FencedPublicationPort, NeedsFencedPublicationError } from "../publication/publish.js";
|
|
4
5
|
import type { ServerSigner } from "../signing/signer.js";
|
|
5
6
|
import { type VersionToFold } from "./first-added.js";
|
|
6
7
|
import { type AdditionsSummary } from "./summary.js";
|
|
7
|
-
import { type VersionInventoryClient } from "./version-inventory.js";
|
|
8
|
+
import { type VersionInventory, type VersionInventoryClient } from "./version-inventory.js";
|
|
8
9
|
export declare const ADDITIONS_SUMMARY_SCOPE = "vana.system.additions";
|
|
9
10
|
/** The separate hash namespace cannot collide with a literal source suffix. */
|
|
10
11
|
export declare function additionsLedgerScope(scope: string): string;
|
|
12
|
+
export type AdditionsRecoveryCode = "compressed_packet" | "decrypt_failed" | "data_hash_mismatch" | "metadata_hash_mismatch" | "invalid_envelope" | "unsupported_source_data" | "replay_failed" | "checkpoint_search_exhausted" | "budget_exceeded" | "cancelled";
|
|
13
|
+
export interface AdditionsRecoveryDiagnostic {
|
|
14
|
+
scope: string;
|
|
15
|
+
version: string;
|
|
16
|
+
code: AdditionsRecoveryCode;
|
|
17
|
+
}
|
|
18
|
+
/** Fixed operator codes only: never retain payloads or raw exception text. */
|
|
19
|
+
export declare class AdditionsRecoveryError extends Error {
|
|
20
|
+
readonly code: AdditionsRecoveryCode;
|
|
21
|
+
constructor(code: AdditionsRecoveryCode, message?: string);
|
|
22
|
+
}
|
|
11
23
|
export interface DurableAdditionsOptions {
|
|
24
|
+
/** Transient operator observation; never persisted in ledgers or summaries. */
|
|
25
|
+
onRecoveryDiagnostic?: (event: AdditionsRecoveryDiagnostic) => void;
|
|
12
26
|
ownerAddress: string;
|
|
13
27
|
/** Include chain and Gateway origin. A service instance belongs to one owner/network. */
|
|
14
28
|
network: string;
|
|
@@ -17,7 +31,11 @@ export interface DurableAdditionsOptions {
|
|
|
17
31
|
masterKey: Uint8Array;
|
|
18
32
|
signer: Pick<ServerSigner, "signAddData">;
|
|
19
33
|
gateway: Pick<GatewayClient, "registerDataPoint">;
|
|
20
|
-
|
|
34
|
+
fencedPublication?: FencedPublicationPort;
|
|
35
|
+
/** Summaries remain behind; hosts can expose the retryable recovery reason. */
|
|
36
|
+
onPublicationBlocked?: (error: NeedsFencedPublicationError) => void;
|
|
37
|
+
/** Full PS source replay defaults remain unlimited; checkpoint discovery is capped.
|
|
38
|
+
* Bounded hosts must also supply boundedWork. */
|
|
21
39
|
byteBudget?: number;
|
|
22
40
|
/** Host operations must cancel and settle all work before returning on abort.
|
|
23
41
|
* Crypto must enforce a plaintext limit before decompression/allocation.
|
|
@@ -56,6 +74,18 @@ export interface DurableAdditionsService {
|
|
|
56
74
|
signal?: AbortSignal;
|
|
57
75
|
}): Promise<void>;
|
|
58
76
|
}
|
|
77
|
+
/** Reuse only a commitment still visible after the current registry deletion boundary. */
|
|
78
|
+
export declare function findCheckpointRegistration(snapshot: VersionInventory, version: string, commitment: {
|
|
79
|
+
dataHash: string;
|
|
80
|
+
metadataHash: string;
|
|
81
|
+
}): {
|
|
82
|
+
expectedVersion: string;
|
|
83
|
+
dataHash: string;
|
|
84
|
+
metadataHash: string;
|
|
85
|
+
status: string;
|
|
86
|
+
addedAt: string;
|
|
87
|
+
isTombstone: boolean;
|
|
88
|
+
} | undefined;
|
|
59
89
|
/**
|
|
60
90
|
* Revalidates commitments, rather than trusting a numeric watermark or a local
|
|
61
91
|
* mutex. Persisted lost/lower-prefix writes are repaired from the next inventory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable.d.ts","sourceRoot":"","sources":["../../src/additions/durable.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,
|
|
1
|
+
{"version":3,"file":"durable.d.ts","sourceRoot":"","sources":["../../src/additions/durable.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { AdditionsBudget, AdditionsBudgetExceeded as BudgetExceeded, } from "./budget.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import {
|
|
4
|
-
import { createDataFileEnvelope, DataFileEnvelopeSchema, decryptWithPassword, deriveScopeKey,
|
|
3
|
+
import { keccak256, stringToHex } from "viem";
|
|
4
|
+
import { createDataFileEnvelope, DataFileEnvelopeSchema, decryptWithPassword, deriveScopeKey, } from "@opendatalabs/vana-sdk/browser";
|
|
5
|
+
import { publishVersion, NeedsFencedPublicationError, } from "../publication/publish.js";
|
|
6
|
+
import { computeDataPointId } from "../sync/data-point-id.js";
|
|
5
7
|
import { foldVersion, extractRecordKeys, readScopeFirstSeenLedger, } from "./first-added.js";
|
|
6
8
|
import { summarizeAdditions, ADDITIONS_SUMMARY_MAX_BYTES, } from "./summary.js";
|
|
7
9
|
import { fingerprintVersionInventory, } from "./version-inventory.js";
|
|
@@ -33,14 +35,28 @@ export function additionsLedgerScope(scope) {
|
|
|
33
35
|
? literal
|
|
34
36
|
: `vana.system.additions-hash.${keccak256(stringToHex(scope)).slice(2)}`;
|
|
35
37
|
}
|
|
38
|
+
/** Fixed operator codes only: never retain payloads or raw exception text. */
|
|
39
|
+
export class AdditionsRecoveryError extends Error {
|
|
40
|
+
code;
|
|
41
|
+
constructor(code, message = code) {
|
|
42
|
+
super(message);
|
|
43
|
+
this.code = code;
|
|
44
|
+
this.name = "AdditionsRecoveryError";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
36
47
|
class InaccessibleLedger extends Error {
|
|
37
48
|
}
|
|
49
|
+
class CheckpointSearchExceeded extends BudgetExceeded {
|
|
50
|
+
}
|
|
51
|
+
const CHECKPOINT_READ_LIMIT = 256;
|
|
38
52
|
class BoundedWorkUnavailable extends Error {
|
|
39
53
|
}
|
|
40
54
|
class ReadBudget extends AdditionsBudget {
|
|
41
55
|
limited;
|
|
56
|
+
checkpoints;
|
|
42
57
|
constructor(options, parent) {
|
|
43
58
|
super(options.byteBudget, options.timeBudgetMs, options.signal, parent);
|
|
59
|
+
this.checkpoints = parent?.checkpoints ?? { reads: 0, rejected: new Map() };
|
|
44
60
|
this.limited =
|
|
45
61
|
options.byteBudget !== undefined || options.timeBudgetMs !== undefined;
|
|
46
62
|
}
|
|
@@ -81,6 +97,33 @@ function sameInventory(a, b) {
|
|
|
81
97
|
function settled(slot) {
|
|
82
98
|
return slot.status === "confirmed" || slot.status === "finalized";
|
|
83
99
|
}
|
|
100
|
+
function eligible(slot) {
|
|
101
|
+
return (!slot.isTombstone &&
|
|
102
|
+
["confirmed", "finalized", "pending", "submitting"].includes(slot.status));
|
|
103
|
+
}
|
|
104
|
+
function sourceWindow(snapshot) {
|
|
105
|
+
const end = BigInt(snapshot.head?.expectedVersion ?? "0");
|
|
106
|
+
const rows = snapshot.versions.filter((slot) => BigInt(slot.expectedVersion) <= end);
|
|
107
|
+
const after = BigInt(rows.filter((slot) => slot.isTombstone && settled(slot)).at(-1)
|
|
108
|
+
?.expectedVersion ?? "0");
|
|
109
|
+
return {
|
|
110
|
+
end,
|
|
111
|
+
after,
|
|
112
|
+
relevant: rows.filter((slot) => BigInt(slot.expectedVersion) > after),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Reuse only a commitment still visible after the current registry deletion boundary. */
|
|
116
|
+
export function findCheckpointRegistration(snapshot, version, commitment) {
|
|
117
|
+
if (!snapshot.head || snapshot.head.deletedAt !== null)
|
|
118
|
+
return undefined;
|
|
119
|
+
const { end, after } = sourceWindow(snapshot);
|
|
120
|
+
if (BigInt(version) > end || BigInt(version) <= after)
|
|
121
|
+
return undefined;
|
|
122
|
+
return snapshot.versions.find((row) => row.expectedVersion === version &&
|
|
123
|
+
eligible(row) &&
|
|
124
|
+
row.dataHash.toLowerCase() === commitment.dataHash.toLowerCase() &&
|
|
125
|
+
row.metadataHash.toLowerCase() === commitment.metadataHash.toLowerCase());
|
|
126
|
+
}
|
|
84
127
|
function sourceData(data) {
|
|
85
128
|
if (data === null || typeof data !== "object" || Array.isArray(data))
|
|
86
129
|
return null;
|
|
@@ -105,14 +148,31 @@ export function createDurableAdditions(options) {
|
|
|
105
148
|
if (!budget.limited)
|
|
106
149
|
budget.check(encrypted.byteLength);
|
|
107
150
|
const password = hex(deriveScopeKey(options.masterKey, scope));
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
151
|
+
let plaintext;
|
|
152
|
+
try {
|
|
153
|
+
plaintext =
|
|
154
|
+
budget.limited && options.boundedWork
|
|
155
|
+
? await options.boundedWork.decrypt(encrypted, password, budget)
|
|
156
|
+
: await decryptWithPassword(encrypted, password);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error instanceof AdditionsRecoveryError ||
|
|
160
|
+
error instanceof BudgetExceeded ||
|
|
161
|
+
budget.signal?.aborted)
|
|
162
|
+
throw error;
|
|
163
|
+
throw new AdditionsRecoveryError("decrypt_failed");
|
|
164
|
+
}
|
|
111
165
|
budget.check(plaintext.byteLength);
|
|
112
166
|
if (keccak256(plaintext).toLowerCase() !== slot.dataHash.toLowerCase())
|
|
113
|
-
throw new
|
|
167
|
+
throw new AdditionsRecoveryError("data_hash_mismatch", "Additions content commitment mismatch");
|
|
114
168
|
budget.check(plaintext.byteLength * 3);
|
|
115
|
-
|
|
169
|
+
let envelope;
|
|
170
|
+
try {
|
|
171
|
+
envelope = DataFileEnvelopeSchema.parse(JSON.parse(new TextDecoder().decode(plaintext)));
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
throw new AdditionsRecoveryError("invalid_envelope");
|
|
175
|
+
}
|
|
116
176
|
const metadataHash = keccak256(stringToHex(JSON.stringify({
|
|
117
177
|
scope,
|
|
118
178
|
collectedAt: envelope.collectedAt,
|
|
@@ -121,7 +181,7 @@ export function createDurableAdditions(options) {
|
|
|
121
181
|
if (envelope.scope !== scope ||
|
|
122
182
|
!Number.isFinite(Date.parse(envelope.collectedAt)) ||
|
|
123
183
|
metadataHash.toLowerCase() !== slot.metadataHash.toLowerCase())
|
|
124
|
-
throw new
|
|
184
|
+
throw new AdditionsRecoveryError("metadata_hash_mismatch", "Additions metadata commitment mismatch");
|
|
125
185
|
budget.check();
|
|
126
186
|
return envelope;
|
|
127
187
|
}
|
|
@@ -132,27 +192,61 @@ export function createDurableAdditions(options) {
|
|
|
132
192
|
const head = snapshot.head;
|
|
133
193
|
if (!head || head.deletedAt !== null)
|
|
134
194
|
return null;
|
|
135
|
-
const slot = snapshot
|
|
136
|
-
!row.isTombstone &&
|
|
137
|
-
row.dataHash === head.dataHash &&
|
|
138
|
-
row.metadataHash === head.metadataHash);
|
|
195
|
+
const slot = findCheckpointRegistration(snapshot, head.expectedVersion, head);
|
|
139
196
|
if (!slot)
|
|
140
197
|
throw new Error("Additions head missing from inventory");
|
|
141
198
|
return { snapshot, envelope: await readEnvelope(scope, slot, budget) };
|
|
142
199
|
}
|
|
143
|
-
async function readDocument(scope, budget) {
|
|
200
|
+
async function readDocument(scope, budget, source, search) {
|
|
201
|
+
const { relevant, after } = sourceWindow(source);
|
|
144
202
|
const systemScope = additionsLedgerScope(scope);
|
|
145
203
|
const snapshot = await inventory.list(systemScope, budget.readOptions);
|
|
146
204
|
if (!snapshot.head || snapshot.head.deletedAt !== null)
|
|
147
205
|
return null;
|
|
148
|
-
|
|
149
|
-
|
|
206
|
+
// Same visibility as source recovery: only settled tombstones at or below the head delete history.
|
|
207
|
+
const boundary = snapshot.versions
|
|
208
|
+
.filter((row) => row.isTombstone &&
|
|
209
|
+
settled(row) &&
|
|
210
|
+
BigInt(row.expectedVersion) <=
|
|
211
|
+
BigInt(snapshot.head.expectedVersion))
|
|
212
|
+
.at(-1)?.expectedVersion ?? "0";
|
|
150
213
|
let inaccessible = false;
|
|
151
|
-
|
|
214
|
+
const sourceFingerprint = fingerprintVersionInventory(source);
|
|
215
|
+
for (let index = snapshot.versions.length - 1; index >= 0; index--) {
|
|
216
|
+
budget.check();
|
|
217
|
+
const slot = snapshot.versions[index];
|
|
152
218
|
if (BigInt(slot.expectedVersion) <= BigInt(boundary) ||
|
|
153
219
|
BigInt(slot.expectedVersion) > BigInt(snapshot.head.expectedVersion) ||
|
|
154
|
-
slot.
|
|
220
|
+
(search && BigInt(slot.expectedVersion) >= BigInt(search.before)) ||
|
|
221
|
+
!eligible(slot))
|
|
222
|
+
continue;
|
|
223
|
+
const identity = JSON.stringify([
|
|
224
|
+
systemScope,
|
|
225
|
+
slot.expectedVersion,
|
|
226
|
+
slot.dataHash.toLowerCase(),
|
|
227
|
+
slot.metadataHash.toLowerCase(),
|
|
228
|
+
sourceFingerprint,
|
|
229
|
+
]);
|
|
230
|
+
const rejected = budget.checkpoints.rejected.get(identity);
|
|
231
|
+
if (rejected !== undefined) {
|
|
232
|
+
inaccessible ||= rejected === "inaccessible";
|
|
155
233
|
continue;
|
|
234
|
+
}
|
|
235
|
+
if (budget.checkpoints.reads >= CHECKPOINT_READ_LIMIT) {
|
|
236
|
+
try {
|
|
237
|
+
options.onRecoveryDiagnostic?.({
|
|
238
|
+
scope,
|
|
239
|
+
version: slot.expectedVersion,
|
|
240
|
+
code: "checkpoint_search_exhausted",
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
/* Observation cannot alter recovery. */
|
|
245
|
+
}
|
|
246
|
+
throw new CheckpointSearchExceeded("Retained checkpoint search exhausted");
|
|
247
|
+
}
|
|
248
|
+
budget.check(identity.length * 2 + 64);
|
|
249
|
+
budget.checkpoints.reads++;
|
|
156
250
|
let envelope;
|
|
157
251
|
try {
|
|
158
252
|
envelope = await readEnvelope(systemScope, slot, budget);
|
|
@@ -161,25 +255,38 @@ export function createDurableAdditions(options) {
|
|
|
161
255
|
if (error instanceof BudgetExceeded || budget.signal?.aborted)
|
|
162
256
|
throw error;
|
|
163
257
|
inaccessible = true;
|
|
258
|
+
budget.checkpoints.rejected.set(identity, "inaccessible");
|
|
164
259
|
continue;
|
|
165
260
|
}
|
|
166
261
|
const parsed = documentSchema.safeParse(envelope.data);
|
|
167
262
|
if (!parsed.success ||
|
|
168
263
|
parsed.data.owner !== owner ||
|
|
169
264
|
parsed.data.network !== options.network ||
|
|
170
|
-
parsed.data.scope !== scope)
|
|
265
|
+
parsed.data.scope !== scope) {
|
|
266
|
+
budget.checkpoints.rejected.set(identity, "invalid");
|
|
171
267
|
continue;
|
|
268
|
+
}
|
|
172
269
|
const ledger = parsed.data.ledger === null
|
|
173
270
|
? null
|
|
174
271
|
: readScopeFirstSeenLedger(parsed.data.ledger);
|
|
175
|
-
if (parsed.data.ledger !== null && (!ledger || ledger.scope !== scope))
|
|
272
|
+
if (parsed.data.ledger !== null && (!ledger || ledger.scope !== scope)) {
|
|
273
|
+
budget.checkpoints.rejected.set(identity, "invalid");
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const candidate = { ...parsed.data, ledger };
|
|
277
|
+
if (candidate.slots.length > relevant.length ||
|
|
278
|
+
!candidate.slots.every((row, i) => eligible(relevant[i]) && sameCommitment(row, relevant[i])) ||
|
|
279
|
+
candidate.through !==
|
|
280
|
+
(candidate.slots.at(-1)?.expectedVersion ?? String(after))) {
|
|
281
|
+
budget.checkpoints.rejected.set(identity, "invalid");
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (search && candidate.slots.length <= search.longerThan)
|
|
176
285
|
continue;
|
|
177
286
|
return {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
? { repairHead: true }
|
|
182
|
-
: {}),
|
|
287
|
+
document: candidate,
|
|
288
|
+
publicationVersion: slot.expectedVersion,
|
|
289
|
+
repairHead: slot.expectedVersion !== snapshot.head.expectedVersion,
|
|
183
290
|
};
|
|
184
291
|
}
|
|
185
292
|
if (inaccessible)
|
|
@@ -194,9 +301,7 @@ export function createDurableAdditions(options) {
|
|
|
194
301
|
const proof = await options.boundedWork.publish(scope, data, budget);
|
|
195
302
|
budget.check();
|
|
196
303
|
const check = await inventory.list(scope, budget.readOptions);
|
|
197
|
-
const slot = check
|
|
198
|
-
row.dataHash === proof.dataHash &&
|
|
199
|
-
row.metadataHash === proof.metadataHash);
|
|
304
|
+
const slot = findCheckpointRegistration(check, proof.expectedVersion, proof);
|
|
200
305
|
if (!slot)
|
|
201
306
|
throw new Error("Bounded checkpoint registration was replaced");
|
|
202
307
|
const envelope = await readEnvelope(scope, slot, budget);
|
|
@@ -207,38 +312,34 @@ export function createDurableAdditions(options) {
|
|
|
207
312
|
return;
|
|
208
313
|
}
|
|
209
314
|
const snapshot = await inventory.list(scope, budget.readOptions);
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
collectedAt: envelope.collectedAt,
|
|
218
|
-
sizeBytes: encrypted.byteLength,
|
|
219
|
-
})));
|
|
220
|
-
await storageAdapter.upload(`${scope}/${version}`, encrypted);
|
|
221
|
-
const signature = await options.signer.signAddData({
|
|
222
|
-
ownerAddress: getAddress(owner),
|
|
223
|
-
scope,
|
|
224
|
-
dataHash,
|
|
225
|
-
metadataHash,
|
|
226
|
-
expectedVersion: version,
|
|
227
|
-
});
|
|
228
|
-
await options.gateway.registerDataPoint({
|
|
315
|
+
const toHead = (state) => state.head
|
|
316
|
+
? {
|
|
317
|
+
...state.head,
|
|
318
|
+
id: computeDataPointId(owner, scope),
|
|
319
|
+
}
|
|
320
|
+
: null;
|
|
321
|
+
const proof = await publishVersion({
|
|
229
322
|
ownerAddress: owner,
|
|
230
|
-
scope,
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
323
|
+
envelope: createDataFileEnvelope(scope, new Date().toISOString(), data),
|
|
324
|
+
preferredVersion: BigInt(snapshot.versions.at(-1)?.expectedVersion ?? "0") + 1n,
|
|
325
|
+
masterKey: options.masterKey,
|
|
326
|
+
storageAdapter,
|
|
327
|
+
signer: options.signer,
|
|
328
|
+
gateway: options.gateway,
|
|
329
|
+
fencedPublication: options.fencedPublication,
|
|
330
|
+
head: toHead(snapshot),
|
|
331
|
+
readHead: async () => toHead(await inventory.list(scope, budget.readOptions)),
|
|
332
|
+
// Rebuilding an explicitly deleted system document is a deliberate re-add.
|
|
333
|
+
acknowledgedDeletionVersion: snapshot.head?.deletedAt
|
|
334
|
+
? BigInt(snapshot.head.expectedVersion)
|
|
335
|
+
: undefined,
|
|
336
|
+
}).catch((error) => {
|
|
337
|
+
if (error instanceof NeedsFencedPublicationError)
|
|
338
|
+
options.onPublicationBlocked?.(error);
|
|
339
|
+
throw error;
|
|
235
340
|
});
|
|
236
|
-
// A concurrent upload can replace the bytes at this shared version key
|
|
237
|
-
// independently of registration. Never claim durability without checking.
|
|
238
341
|
const check = await inventory.list(scope, budget.readOptions);
|
|
239
|
-
const registered = check
|
|
240
|
-
slot.dataHash === dataHash &&
|
|
241
|
-
slot.metadataHash === metadataHash);
|
|
342
|
+
const registered = findCheckpointRegistration(check, String(proof.version), proof);
|
|
242
343
|
if (!registered)
|
|
243
344
|
throw new Error("Concurrent additions publication replaced the registration");
|
|
244
345
|
await readEnvelope(scope, registered, budget);
|
|
@@ -273,28 +374,19 @@ export function createDurableAdditions(options) {
|
|
|
273
374
|
: "complete",
|
|
274
375
|
};
|
|
275
376
|
}
|
|
276
|
-
const end =
|
|
277
|
-
|
|
278
|
-
const boundary = rows
|
|
279
|
-
.filter((slot) => slot.isTombstone && settled(slot))
|
|
280
|
-
.at(-1);
|
|
281
|
-
const after = BigInt(boundary?.expectedVersion ?? "0");
|
|
282
|
-
const relevant = rows.filter((slot) => BigInt(slot.expectedVersion) > after);
|
|
283
|
-
let existing = null;
|
|
377
|
+
const { end, after, relevant } = sourceWindow(snapshot);
|
|
378
|
+
let checkpoint = null;
|
|
284
379
|
let inaccessibleExisting = false;
|
|
285
380
|
try {
|
|
286
|
-
|
|
381
|
+
checkpoint = await readDocument(scope, budget, snapshot);
|
|
287
382
|
}
|
|
288
383
|
catch (error) {
|
|
289
384
|
if (error instanceof BudgetExceeded || budget.signal?.aborted)
|
|
290
385
|
throw error;
|
|
291
386
|
inaccessibleExisting = true;
|
|
292
387
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
existing.slots.every((slot, i) => sameCommitment(slot, relevant[i])) &&
|
|
296
|
-
existing.through ===
|
|
297
|
-
(existing.slots.at(-1)?.expectedVersion ?? String(after));
|
|
388
|
+
let existing = checkpoint?.document ?? null;
|
|
389
|
+
const prefixValid = existing !== null;
|
|
298
390
|
let ledger = prefixValid ? existing.ledger : null;
|
|
299
391
|
const folded = prefixValid ? relevant.slice(0, existing.slots.length) : [];
|
|
300
392
|
let currentTotal = prefixValid ? existing.currentTotal : 0;
|
|
@@ -309,6 +401,7 @@ export function createDurableAdditions(options) {
|
|
|
309
401
|
coverage = "partial";
|
|
310
402
|
expected = BigInt(slot.expectedVersion) + 1n;
|
|
311
403
|
}
|
|
404
|
+
const sourceCoverage = coverage;
|
|
312
405
|
const checkpointBytes = (candidate, count) => 128 * 1024 +
|
|
313
406
|
128 *
|
|
314
407
|
new TextEncoder().encode(JSON.stringify({
|
|
@@ -320,23 +413,20 @@ export function createDurableAdditions(options) {
|
|
|
320
413
|
through,
|
|
321
414
|
currentTotal,
|
|
322
415
|
})).byteLength;
|
|
323
|
-
|
|
416
|
+
while (folded.length < relevant.length) {
|
|
417
|
+
const slot = relevant[folded.length];
|
|
418
|
+
let unitBudget = budget;
|
|
324
419
|
try {
|
|
325
420
|
// Keep publication capacity in the same owner-wide allowance. Exhaustion
|
|
326
421
|
// of the child leaves the already-folded prefix publishable.
|
|
327
|
-
|
|
422
|
+
unitBudget = budget.limited
|
|
328
423
|
? budget.excluding(checkpointBytes(ledger, folded.length))
|
|
329
424
|
: budget;
|
|
330
425
|
unitBudget.check();
|
|
331
426
|
if (BigInt(slot.expectedVersion) !== BigInt(through) + 1n)
|
|
332
427
|
coverage = "partial";
|
|
333
428
|
// Mutable slots are provisional; failed/unknown slots cannot advance the prefix.
|
|
334
|
-
if (slot
|
|
335
|
-
!["confirmed", "finalized", "pending", "submitting"].includes(slot.status)) {
|
|
336
|
-
coverage = "partial";
|
|
337
|
-
break;
|
|
338
|
-
}
|
|
339
|
-
if (slot.isTombstone) {
|
|
429
|
+
if (!eligible(slot)) {
|
|
340
430
|
coverage = "partial";
|
|
341
431
|
break;
|
|
342
432
|
}
|
|
@@ -362,14 +452,14 @@ export function createDurableAdditions(options) {
|
|
|
362
452
|
metadata === slot.metadataHash) {
|
|
363
453
|
const data = sourceData(inMemory.data.data);
|
|
364
454
|
if (!data)
|
|
365
|
-
throw new
|
|
455
|
+
throw new AdditionsRecoveryError("unsupported_source_data");
|
|
366
456
|
version = { scope, collectedAt: inMemory.data.collectedAt, data };
|
|
367
457
|
}
|
|
368
458
|
else {
|
|
369
459
|
const envelope = await readEnvelope(scope, slot, unitBudget);
|
|
370
460
|
const data = sourceData(envelope.data);
|
|
371
461
|
if (!data)
|
|
372
|
-
throw new
|
|
462
|
+
throw new AdditionsRecoveryError("unsupported_source_data");
|
|
373
463
|
version = { scope, collectedAt: envelope.collectedAt, data };
|
|
374
464
|
}
|
|
375
465
|
const hadBaseline = ledger !== null && ledger.baseline !== null;
|
|
@@ -391,8 +481,61 @@ export function createDurableAdditions(options) {
|
|
|
391
481
|
through = slot.expectedVersion;
|
|
392
482
|
}
|
|
393
483
|
catch (error) {
|
|
484
|
+
// Normal advancement needs one checkpoint, not the complete publication
|
|
485
|
+
// history. Search older evidence only when replay cannot advance, keeping
|
|
486
|
+
// the bytes reserved for publishing our best verified source prefix.
|
|
487
|
+
if (checkpoint && !budget.signal?.aborted) {
|
|
488
|
+
const searchBudget = budget.limited
|
|
489
|
+
? budget.excluding(checkpointBytes(ledger, folded.length))
|
|
490
|
+
: budget;
|
|
491
|
+
try {
|
|
492
|
+
const fallback = await readDocument(scope, searchBudget, snapshot, {
|
|
493
|
+
before: checkpoint.publicationVersion,
|
|
494
|
+
longerThan: folded.length,
|
|
495
|
+
});
|
|
496
|
+
if (fallback) {
|
|
497
|
+
checkpoint = fallback;
|
|
498
|
+
existing = fallback.document;
|
|
499
|
+
ledger = existing.ledger;
|
|
500
|
+
currentTotal = existing.currentTotal;
|
|
501
|
+
through = existing.through;
|
|
502
|
+
folded.splice(0, folded.length, ...relevant.slice(0, existing.slots.length));
|
|
503
|
+
coverage = sourceCoverage;
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
catch (failure) {
|
|
508
|
+
// Keep the verified prefix and its publication reserve, but expose
|
|
509
|
+
// a bounded search that could not finish as retryable coverage.
|
|
510
|
+
if (failure instanceof BudgetExceeded)
|
|
511
|
+
error = failure;
|
|
512
|
+
else if (searchBudget.signal?.aborted)
|
|
513
|
+
error = new BudgetExceeded("Checkpoint fallback allowance exhausted");
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
try {
|
|
517
|
+
options.onRecoveryDiagnostic?.({
|
|
518
|
+
scope,
|
|
519
|
+
version: slot.expectedVersion,
|
|
520
|
+
code: error instanceof BudgetExceeded ||
|
|
521
|
+
(unitBudget.signal?.aborted &&
|
|
522
|
+
unitBudget.signal.reason instanceof DOMException &&
|
|
523
|
+
unitBudget.signal.reason.name === "TimeoutError")
|
|
524
|
+
? "budget_exceeded"
|
|
525
|
+
: budget.signal?.aborted
|
|
526
|
+
? "cancelled"
|
|
527
|
+
: error instanceof AdditionsRecoveryError
|
|
528
|
+
? error.code
|
|
529
|
+
: "replay_failed",
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
/* Observation cannot alter recovery. */
|
|
534
|
+
}
|
|
394
535
|
coverage =
|
|
395
|
-
error instanceof BudgetExceeded ||
|
|
536
|
+
error instanceof BudgetExceeded ||
|
|
537
|
+
budget.signal?.aborted ||
|
|
538
|
+
unitBudget.signal?.aborted
|
|
396
539
|
? "behind"
|
|
397
540
|
: "partial";
|
|
398
541
|
break;
|
|
@@ -428,7 +571,8 @@ export function createDurableAdditions(options) {
|
|
|
428
571
|
if (((!existing && !inaccessibleExisting) ||
|
|
429
572
|
prefixValid ||
|
|
430
573
|
coverage === "complete") &&
|
|
431
|
-
|
|
574
|
+
(checkpoint?.repairHead ||
|
|
575
|
+
JSON.stringify(document) !== JSON.stringify(existing))) {
|
|
432
576
|
// A write failure affects durability, never hides the verified in-memory result.
|
|
433
577
|
try {
|
|
434
578
|
await publish(additionsLedgerScope(scope), { ...document }, budget);
|
|
@@ -558,11 +702,10 @@ export function createDurableAdditions(options) {
|
|
|
558
702
|
if (proof &&
|
|
559
703
|
keccak256(new TextEncoder().encode(JSON.stringify(proof.envelope))) !== head.dataHash)
|
|
560
704
|
return;
|
|
561
|
-
const previous = await readDocument(version.scope, budget)
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
const startsFresh = BigInt(head.expectedVersion) === BigInt(boundary) + 1n;
|
|
705
|
+
const previous = (await readDocument(version.scope, budget, snapshot))
|
|
706
|
+
?.document;
|
|
707
|
+
const { after } = sourceWindow(snapshot);
|
|
708
|
+
const startsFresh = BigInt(head.expectedVersion) === after + 1n;
|
|
566
709
|
if (!startsFresh &&
|
|
567
710
|
(!previous ||
|
|
568
711
|
BigInt(previous.through) + 1n !== BigInt(head.expectedVersion)))
|
|
@@ -576,9 +719,15 @@ export function createDurableAdditions(options) {
|
|
|
576
719
|
/* Next reader retries. */
|
|
577
720
|
}
|
|
578
721
|
},
|
|
579
|
-
async deleteScope(scope) {
|
|
722
|
+
async deleteScope(scope, deletion) {
|
|
723
|
+
deletion?.signal?.throwIfAborted();
|
|
724
|
+
options.signal?.throwIfAborted();
|
|
580
725
|
if (isSystemScope(scope))
|
|
581
726
|
return;
|
|
727
|
+
// Lite owns a separate bounded registry/journal deleter. This core host
|
|
728
|
+
// only has ordinary cleanup and must not silently use it for durableOnly.
|
|
729
|
+
if (deletion?.durableOnly)
|
|
730
|
+
throw new Error("Bounded additions deletion is unavailable");
|
|
582
731
|
if (!options.deleteSystemScope)
|
|
583
732
|
throw new Error("Durable additions deletion is unavailable");
|
|
584
733
|
await options.deleteSystemScope(additionsLedgerScope(scope));
|