@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
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import { retryFromError, } from "./outcome.js";
|
|
2
|
+
import { settleReplicaWork, } from "./schedule.js";
|
|
3
|
+
const isPromiseLike = (value) => typeof value === "object" &&
|
|
4
|
+
value !== null &&
|
|
5
|
+
typeof value.then === "function";
|
|
6
|
+
/** Continue with `next` now when `value` is plain, after it when a promise. */
|
|
7
|
+
function then(value, next) {
|
|
8
|
+
return isPromiseLike(value) ? value.then(next) : next(value);
|
|
9
|
+
}
|
|
10
|
+
/** `try`/`catch` over a computation that may or may not be asynchronous. */
|
|
11
|
+
function recover(run, handle) {
|
|
12
|
+
let value;
|
|
13
|
+
try {
|
|
14
|
+
value = run();
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return handle(error);
|
|
18
|
+
}
|
|
19
|
+
return isPromiseLike(value) ? value.catch(handle) : value;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Await `start()` unless `signal` aborts first. After abort the caller sees a
|
|
23
|
+
* rejection at once, so it performs no further effect; the underlying call
|
|
24
|
+
* may still finish, and its value is dropped.
|
|
25
|
+
*/
|
|
26
|
+
export function abortable(signal, start) {
|
|
27
|
+
if (signal.aborted)
|
|
28
|
+
return Promise.reject(signal.reason ?? new DOMException("aborted", "AbortError"));
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const onAbort = () => reject(signal.reason ?? new DOMException("aborted", "AbortError"));
|
|
31
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
32
|
+
start().then((value) => {
|
|
33
|
+
signal.removeEventListener("abort", onAbort);
|
|
34
|
+
resolve(value);
|
|
35
|
+
}, (error) => {
|
|
36
|
+
signal.removeEventListener("abort", onAbort);
|
|
37
|
+
reject(error);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export const REPLICA_STEP_BYTES = 64 * 1024 * 1024;
|
|
42
|
+
export const REPLICA_REPORT_LIMIT = 256;
|
|
43
|
+
export const REPLICA_ATTEMPT_TIMEOUT_MS = 30_000;
|
|
44
|
+
/** Validate before storage, hints, selection or any other effect. */
|
|
45
|
+
export function validateReplicaStep(context) {
|
|
46
|
+
if (!context ||
|
|
47
|
+
typeof context !== "object" ||
|
|
48
|
+
!context.budget ||
|
|
49
|
+
typeof context.budget !== "object")
|
|
50
|
+
throw new RangeError("invalid replica step context");
|
|
51
|
+
if (!Number.isSafeInteger(context.now) || context.now < 0)
|
|
52
|
+
throw new RangeError("invalid replica step clock");
|
|
53
|
+
for (const value of [
|
|
54
|
+
context.budget.units,
|
|
55
|
+
context.budget.bytes === undefined
|
|
56
|
+
? REPLICA_STEP_BYTES
|
|
57
|
+
: context.budget.bytes,
|
|
58
|
+
])
|
|
59
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
60
|
+
throw new RangeError("invalid replica step budget");
|
|
61
|
+
}
|
|
62
|
+
export class ReplicaCoordinatorConflict extends Error {
|
|
63
|
+
constructor() {
|
|
64
|
+
super("replica coordinator ownership or revision changed");
|
|
65
|
+
this.name = "ReplicaCoordinatorConflict";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Thrown when a synchronous port is handed an asynchronous checkpoint. */
|
|
69
|
+
export class ReplicaAsyncCheckpointError extends Error {
|
|
70
|
+
constructor() {
|
|
71
|
+
super("asynchronous replica checkpoint under a synchronous state port");
|
|
72
|
+
this.name = "ReplicaAsyncCheckpointError";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const DEFAULT_QUANTUM = 50;
|
|
76
|
+
/** Bound on one hint read when no per-run deadline is configured. */
|
|
77
|
+
const HINT_TIMEOUT_MS = 2_000;
|
|
78
|
+
/**
|
|
79
|
+
* Selects due work fairly and turns phase verdicts into durable transitions.
|
|
80
|
+
* The host schedules step(); it never runs another semantic retry loop.
|
|
81
|
+
*/
|
|
82
|
+
export function createReplicaCoordinator(input) {
|
|
83
|
+
const coordinator = createAsyncReplicaCoordinator(input);
|
|
84
|
+
return {
|
|
85
|
+
step: coordinator.step,
|
|
86
|
+
onDependencyChanged(key, now) {
|
|
87
|
+
const woken = coordinator.onDependencyChanged(key, now);
|
|
88
|
+
if (isPromiseLike(woken))
|
|
89
|
+
throw new ReplicaAsyncCheckpointError();
|
|
90
|
+
return woken;
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The coordinator over handlers and a state port that may answer
|
|
96
|
+
* asynchronously. Plain values keep the synchronous path, so a synchronous
|
|
97
|
+
* host (Node) behaves exactly as under `createReplicaCoordinator`. With a
|
|
98
|
+
* synchronous port, an asynchronous checkpoint is refused inside its
|
|
99
|
+
* transaction, never committed half-done.
|
|
100
|
+
*/
|
|
101
|
+
export function createAsyncReplicaCoordinator(input) {
|
|
102
|
+
for (const value of [
|
|
103
|
+
input.perWriter ?? 1,
|
|
104
|
+
input.deadlineMs ?? REPLICA_ATTEMPT_TIMEOUT_MS,
|
|
105
|
+
input.hintRefreshMs ?? 2_000,
|
|
106
|
+
])
|
|
107
|
+
if (value === undefined || !Number.isSafeInteger(value) || value < 1)
|
|
108
|
+
throw new RangeError("invalid replica coordinator bound");
|
|
109
|
+
// A zero quantum leaves its phase idle (as on main); it is still finite.
|
|
110
|
+
for (const value of Object.values(input.quantum ?? {}))
|
|
111
|
+
if (value === undefined || !Number.isSafeInteger(value) || value < 0)
|
|
112
|
+
throw new RangeError("invalid replica coordinator bound");
|
|
113
|
+
// setTimeout clamps larger delays to 1ms on Node; never silently accept that.
|
|
114
|
+
if ((input.deadlineMs ?? REPLICA_ATTEMPT_TIMEOUT_MS) > 2_147_483_647)
|
|
115
|
+
throw new RangeError("invalid replica attempt timeout");
|
|
116
|
+
if (new Set(input.phases.map((phase) => phase.phase)).size !==
|
|
117
|
+
input.phases.length)
|
|
118
|
+
throw new RangeError("duplicate replica phase");
|
|
119
|
+
const quantum = (phase) => input.quantum?.[phase] ?? DEFAULT_QUANTUM;
|
|
120
|
+
/** Items whose run has not settled. A timed-out run blocks redispatch until it ends. */
|
|
121
|
+
const inflight = new Set();
|
|
122
|
+
let state = {
|
|
123
|
+
owner: "memory",
|
|
124
|
+
version: 0,
|
|
125
|
+
writers: {},
|
|
126
|
+
};
|
|
127
|
+
let stepping = false;
|
|
128
|
+
function interleave(phase, items) {
|
|
129
|
+
const groups = new Map();
|
|
130
|
+
for (const item of items) {
|
|
131
|
+
const group = groups.get(item.writer);
|
|
132
|
+
if (group)
|
|
133
|
+
group.push(item);
|
|
134
|
+
else
|
|
135
|
+
groups.set(item.writer, [item]);
|
|
136
|
+
}
|
|
137
|
+
const writers = [...groups.keys()];
|
|
138
|
+
const last = state.writers[phase];
|
|
139
|
+
const offset = last === undefined ? 0 : writers.indexOf(last) + 1;
|
|
140
|
+
const rotated = [...writers.slice(offset), ...writers.slice(0, offset)];
|
|
141
|
+
const ordered = [];
|
|
142
|
+
for (let round = 0; ordered.length < items.length; round++)
|
|
143
|
+
for (const writer of rotated) {
|
|
144
|
+
const item = groups.get(writer)[round];
|
|
145
|
+
if (item)
|
|
146
|
+
ordered.push(item);
|
|
147
|
+
}
|
|
148
|
+
return ordered;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Race `start` against the per-run deadline and the host's signal. On
|
|
152
|
+
* either, the inner signal aborts and the late result is dropped whole.
|
|
153
|
+
*/
|
|
154
|
+
async function bounded(start, signal, deadlineMs = input.deadlineMs ?? REPLICA_ATTEMPT_TIMEOUT_MS) {
|
|
155
|
+
const controller = new AbortController();
|
|
156
|
+
let timer;
|
|
157
|
+
let onAbort;
|
|
158
|
+
const racers = [
|
|
159
|
+
start(controller.signal).then((value) => ({ value })),
|
|
160
|
+
];
|
|
161
|
+
if (deadlineMs !== undefined)
|
|
162
|
+
racers.push(new Promise((resolve) => {
|
|
163
|
+
timer = setTimeout(() => {
|
|
164
|
+
controller.abort();
|
|
165
|
+
resolve("deadline");
|
|
166
|
+
}, deadlineMs);
|
|
167
|
+
}));
|
|
168
|
+
if (signal)
|
|
169
|
+
racers.push(new Promise((resolve) => {
|
|
170
|
+
onAbort = () => {
|
|
171
|
+
controller.abort(signal.reason);
|
|
172
|
+
resolve("aborted");
|
|
173
|
+
};
|
|
174
|
+
if (signal.aborted)
|
|
175
|
+
onAbort();
|
|
176
|
+
else
|
|
177
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
178
|
+
}));
|
|
179
|
+
try {
|
|
180
|
+
return await Promise.race(racers);
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
if (timer !== undefined)
|
|
184
|
+
clearTimeout(timer);
|
|
185
|
+
if (onAbort)
|
|
186
|
+
signal?.removeEventListener("abort", onAbort);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** `undefined`: the host aborted the step before this run settled. */
|
|
190
|
+
async function execute(handler, item, signal) {
|
|
191
|
+
const key = `${handler.phase}\0${item.id}`;
|
|
192
|
+
inflight.add(key);
|
|
193
|
+
let running;
|
|
194
|
+
const result = await bounded((inner) => {
|
|
195
|
+
running = handler
|
|
196
|
+
.run(item, inner)
|
|
197
|
+
.catch((error) => ({
|
|
198
|
+
outcome: retryFromError(error, "unknown"),
|
|
199
|
+
}))
|
|
200
|
+
.finally(() => inflight.delete(key));
|
|
201
|
+
return running;
|
|
202
|
+
}, signal);
|
|
203
|
+
if (result === "aborted") {
|
|
204
|
+
void running?.then((attempt) => attempt.release?.());
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
if (result === "deadline") {
|
|
208
|
+
void running?.then((attempt) => attempt.release?.());
|
|
209
|
+
return { outcome: { tag: "retry", problem: "deadline_exceeded" } };
|
|
210
|
+
}
|
|
211
|
+
return result.value;
|
|
212
|
+
}
|
|
213
|
+
// ------------------------------------------------------------- hints
|
|
214
|
+
let head;
|
|
215
|
+
let hintReadAt = Number.NEGATIVE_INFINITY;
|
|
216
|
+
let hintInFlight = false;
|
|
217
|
+
const hintRefreshMs = input.hintRefreshMs ?? 2_000;
|
|
218
|
+
/**
|
|
219
|
+
* Refresh the hint at most every hintRefreshMs, bounded by the deadline and
|
|
220
|
+
* the step signal. A failed, slow or hung read leaves no hint: waits then
|
|
221
|
+
* poll on their durable schedule. A read still in flight is never awaited
|
|
222
|
+
* again, so a hung hint cannot stall later steps.
|
|
223
|
+
*/
|
|
224
|
+
async function refreshHint(now, signal) {
|
|
225
|
+
const hint = input.hint;
|
|
226
|
+
if (!hint || hintInFlight || now - hintReadAt < hintRefreshMs)
|
|
227
|
+
return;
|
|
228
|
+
hintReadAt = now;
|
|
229
|
+
hintInFlight = true;
|
|
230
|
+
const read = await bounded((inner) => hint
|
|
231
|
+
.head(inner)
|
|
232
|
+
.then((value) => typeof value === "bigint" && value >= 0n ? value : undefined)
|
|
233
|
+
.catch(() => undefined)
|
|
234
|
+
.finally(() => (hintInFlight = false)), signal,
|
|
235
|
+
// A hint is optional: it is always bounded, with or without a run deadline.
|
|
236
|
+
input.deadlineMs ?? HINT_TIMEOUT_MS);
|
|
237
|
+
head = typeof read === "object" ? read.value : undefined;
|
|
238
|
+
}
|
|
239
|
+
const eligibility = (now) => ({
|
|
240
|
+
now,
|
|
241
|
+
head,
|
|
242
|
+
hintRefreshAt: input.hint ? hintReadAt + hintRefreshMs : undefined,
|
|
243
|
+
});
|
|
244
|
+
/**
|
|
245
|
+
* Persist one attempt. If its plan's transaction fails, persist the Retry
|
|
246
|
+
* that failure means instead (no plan). If even that fails, the step fails:
|
|
247
|
+
* the report never states an outcome the repository does not hold.
|
|
248
|
+
*/
|
|
249
|
+
function commit(handler, item, attempt, signal) {
|
|
250
|
+
const settle = (verdict) => settleReplicaWork(item.state, verdict, input.clock?.() ?? stepNow, {
|
|
251
|
+
backoff: input.backoff,
|
|
252
|
+
hints: input.hint !== undefined,
|
|
253
|
+
});
|
|
254
|
+
const advance = (value) => {
|
|
255
|
+
const position = input.phases.indexOf(handler);
|
|
256
|
+
const next = {
|
|
257
|
+
nextPhase: input.phases[(position + 1) % input.phases.length]?.phase,
|
|
258
|
+
writers: { ...state.writers, [handler.phase]: item.writer },
|
|
259
|
+
};
|
|
260
|
+
const checkpoint = (context) => {
|
|
261
|
+
const assertNotAborted = () => {
|
|
262
|
+
if (signal?.aborted)
|
|
263
|
+
throw signal.reason ?? new DOMException("aborted", "AbortError");
|
|
264
|
+
};
|
|
265
|
+
assertNotAborted();
|
|
266
|
+
return then(handler.commit(item, value, settle, context), (result) => {
|
|
267
|
+
// Still inside the durable state port's outer transaction. A plan
|
|
268
|
+
// may close the host lifetime; roll back its effects.
|
|
269
|
+
assertNotAborted();
|
|
270
|
+
return result;
|
|
271
|
+
});
|
|
272
|
+
};
|
|
273
|
+
const port = input.state;
|
|
274
|
+
if (port && "async" in port && port.async)
|
|
275
|
+
return port
|
|
276
|
+
.commit(state, next, async (context) => checkpoint(context))
|
|
277
|
+
.then((committed) => {
|
|
278
|
+
state = committed.state;
|
|
279
|
+
return committed.result;
|
|
280
|
+
});
|
|
281
|
+
if (port) {
|
|
282
|
+
const committed = port.commit(state, next, () => {
|
|
283
|
+
const result = checkpoint(undefined);
|
|
284
|
+
if (isPromiseLike(result)) {
|
|
285
|
+
// Never leave the refused checkpoint's rejection unobserved.
|
|
286
|
+
result.catch(() => undefined);
|
|
287
|
+
throw new ReplicaAsyncCheckpointError();
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
});
|
|
291
|
+
state = committed.state;
|
|
292
|
+
return committed.result;
|
|
293
|
+
}
|
|
294
|
+
return then(checkpoint(undefined), (result) => {
|
|
295
|
+
state = { ...state, ...next, version: state.version + 1 };
|
|
296
|
+
return result;
|
|
297
|
+
});
|
|
298
|
+
};
|
|
299
|
+
return recover(() => advance(attempt), (error) => {
|
|
300
|
+
if (signal?.aborted ||
|
|
301
|
+
!attempt.plan ||
|
|
302
|
+
error instanceof ReplicaCoordinatorConflict)
|
|
303
|
+
throw error;
|
|
304
|
+
return advance({
|
|
305
|
+
outcome: retryFromError(error, handler.commitProblem ?? "storage_failed"),
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
let stepNow = 0;
|
|
310
|
+
function record(report, phase, id, outcome) {
|
|
311
|
+
if (report.receipts.length +
|
|
312
|
+
report.waits.length +
|
|
313
|
+
report.problems.length +
|
|
314
|
+
report.quarantines.length +
|
|
315
|
+
report.unsupported.length >=
|
|
316
|
+
REPLICA_REPORT_LIMIT) {
|
|
317
|
+
report.diagnosticsTruncated = true;
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (outcome.tag === "progress")
|
|
321
|
+
report.receipts.push(outcome.receipt);
|
|
322
|
+
else if (outcome.tag === "wait")
|
|
323
|
+
report.waits.push({
|
|
324
|
+
id,
|
|
325
|
+
phase,
|
|
326
|
+
dependency: outcome.dependency,
|
|
327
|
+
...(outcome.dependency.kind === "registration_pending" && {
|
|
328
|
+
ageMs: Math.max(0, stepNow - outcome.dependency.since),
|
|
329
|
+
}),
|
|
330
|
+
});
|
|
331
|
+
else if (outcome.tag === "retry")
|
|
332
|
+
report.problems.push({
|
|
333
|
+
id,
|
|
334
|
+
phase,
|
|
335
|
+
problem: outcome.problem,
|
|
336
|
+
...(outcome.cause && { cause: outcome.cause }),
|
|
337
|
+
nextEligible: outcome.nextEligible,
|
|
338
|
+
});
|
|
339
|
+
else if (outcome.tag === "quarantine")
|
|
340
|
+
report.quarantines.push({ id, phase, proof: outcome.proof });
|
|
341
|
+
else
|
|
342
|
+
report.unsupported.push({ id, phase, admission: outcome.admission });
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
async step(context) {
|
|
346
|
+
validateReplicaStep(context);
|
|
347
|
+
if (stepping)
|
|
348
|
+
throw new ReplicaCoordinatorConflict();
|
|
349
|
+
stepping = true;
|
|
350
|
+
try {
|
|
351
|
+
const { now, signal, budget } = context;
|
|
352
|
+
// No in-memory cursor from a prior instance is authoritative.
|
|
353
|
+
if (input.state) {
|
|
354
|
+
const loaded = input.state.load();
|
|
355
|
+
state = isPromiseLike(loaded) ? await loaded : loaded;
|
|
356
|
+
}
|
|
357
|
+
const report = {
|
|
358
|
+
receipts: [],
|
|
359
|
+
waits: [],
|
|
360
|
+
problems: [],
|
|
361
|
+
quarantines: [],
|
|
362
|
+
unsupported: [],
|
|
363
|
+
nextWake: undefined,
|
|
364
|
+
};
|
|
365
|
+
stepNow = now;
|
|
366
|
+
let units = budget.units;
|
|
367
|
+
const stepBytes = budget.bytes ?? REPLICA_STEP_BYTES;
|
|
368
|
+
let bytes = stepBytes;
|
|
369
|
+
let deferred = false;
|
|
370
|
+
const aborted = () => signal?.aborted === true;
|
|
371
|
+
if (!aborted())
|
|
372
|
+
await refreshHint(now, signal);
|
|
373
|
+
// Selection reads the clock when it selects, so work a phase finished
|
|
374
|
+
// earlier in this step (settled at a later clock reading) is eligible.
|
|
375
|
+
const selection = () => eligibility(Math.max(now, input.clock?.() ?? now));
|
|
376
|
+
const first = Math.max(0, input.phases.findIndex((phase) => phase.phase === state.nextPhase));
|
|
377
|
+
const phases = [
|
|
378
|
+
...input.phases.slice(first),
|
|
379
|
+
...input.phases.slice(0, first),
|
|
380
|
+
];
|
|
381
|
+
// A finite budget reserves a fair share per phase before any phase may
|
|
382
|
+
// spend leftovers, so an early phase cannot take every unit.
|
|
383
|
+
const share = Math.max(1, Math.floor(units / Math.max(1, phases.length)));
|
|
384
|
+
const spent = new Map();
|
|
385
|
+
const ran = new Set();
|
|
386
|
+
const background = new Set(input.background ?? []);
|
|
387
|
+
const leftovers = [
|
|
388
|
+
...phases.filter((handler) => !background.has(handler.phase)),
|
|
389
|
+
...phases.filter((handler) => background.has(handler.phase)),
|
|
390
|
+
];
|
|
391
|
+
for (const pass of [0, 1]) {
|
|
392
|
+
for (const handler of pass === 0 ? phases : leftovers) {
|
|
393
|
+
const used = spent.get(handler.phase) ?? 0;
|
|
394
|
+
const cap = Math.min(quantum(handler.phase) - used, pass === 0 ? share : units, units);
|
|
395
|
+
let count = 0;
|
|
396
|
+
// Items deferred for bytes in this phase. Each one widens the next
|
|
397
|
+
// due() page by one, so an item that does not fit cannot hide the
|
|
398
|
+
// items behind it (another writer's work that fits). Bounded by the
|
|
399
|
+
// phase quantum, so a backlog of oversized items stays a bounded scan.
|
|
400
|
+
let skipped = 0;
|
|
401
|
+
// Refilled rounds: each due() call admits at most perWriter items per
|
|
402
|
+
// writer, so one writer's backlog cannot fill a phase's quantum.
|
|
403
|
+
while (count < cap && units > 0 && !aborted()) {
|
|
404
|
+
const selected = handler.due(selection(), {
|
|
405
|
+
total: cap - count + skipped,
|
|
406
|
+
perWriter: input.perWriter ?? 1,
|
|
407
|
+
after: state.writers[handler.phase],
|
|
408
|
+
});
|
|
409
|
+
const items = interleave(handler.phase, (isPromiseLike(selected) ? await selected : selected).filter((item) => {
|
|
410
|
+
const key = `${handler.phase}\0${item.id}`;
|
|
411
|
+
return (!inflight.has(key) &&
|
|
412
|
+
!ran.has(`${key}\0${item.part ?? ""}`));
|
|
413
|
+
}));
|
|
414
|
+
let admitted = 0;
|
|
415
|
+
let deferredHere = 0;
|
|
416
|
+
for (const item of items) {
|
|
417
|
+
if (count >= cap || units <= 0 || aborted())
|
|
418
|
+
break;
|
|
419
|
+
ran.add(`${handler.phase}\0${item.id}\0${item.part ?? ""}`);
|
|
420
|
+
if (item.bytes !== undefined &&
|
|
421
|
+
(!Number.isSafeInteger(item.bytes) || item.bytes < 0))
|
|
422
|
+
throw new RangeError("invalid replica item byte estimate");
|
|
423
|
+
// Under the omitted (default) budget an item larger than the
|
|
424
|
+
// whole step can never fit. It runs when no other item has
|
|
425
|
+
// charged bytes in this step, and spends the rest, as the
|
|
426
|
+
// unbounded default on main ran it. An explicit budget defers
|
|
427
|
+
// it until the host gives a budget it fits.
|
|
428
|
+
const alone = budget.bytes === undefined &&
|
|
429
|
+
item.bytes !== undefined &&
|
|
430
|
+
item.bytes > stepBytes &&
|
|
431
|
+
bytes === stepBytes;
|
|
432
|
+
if (item.bytes !== undefined && item.bytes > bytes && !alone) {
|
|
433
|
+
deferred = true;
|
|
434
|
+
deferredHere++;
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
admitted++;
|
|
438
|
+
count++;
|
|
439
|
+
units--;
|
|
440
|
+
if (alone)
|
|
441
|
+
bytes = 0;
|
|
442
|
+
else if (item.bytes !== undefined)
|
|
443
|
+
bytes -= item.bytes;
|
|
444
|
+
const attempt = await execute(handler, item, signal);
|
|
445
|
+
if (attempt === undefined)
|
|
446
|
+
break;
|
|
447
|
+
try {
|
|
448
|
+
// Abort can arrive between the winning run promise and this
|
|
449
|
+
// continuation. Discard/release before entering a checkpoint.
|
|
450
|
+
if (aborted())
|
|
451
|
+
break;
|
|
452
|
+
const outcome = commit(handler, item, attempt, signal);
|
|
453
|
+
record(report, handler.phase, item.id, isPromiseLike(outcome) ? await outcome : outcome);
|
|
454
|
+
}
|
|
455
|
+
finally {
|
|
456
|
+
attempt.release?.();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
skipped += deferredHere;
|
|
460
|
+
if (admitted)
|
|
461
|
+
continue;
|
|
462
|
+
// Nothing fit: look past the deferred items, within the bound.
|
|
463
|
+
if (!deferredHere || skipped > quantum(handler.phase))
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
466
|
+
spent.set(handler.phase, used + count);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
// The same eligibility as selection, read after this step's commits.
|
|
470
|
+
const after = eligibility(input.clock?.() ?? now);
|
|
471
|
+
let wake;
|
|
472
|
+
for (const handler of input.phases) {
|
|
473
|
+
const earliest = handler.earliest(after);
|
|
474
|
+
const next = isPromiseLike(earliest) ? await earliest : earliest;
|
|
475
|
+
if (next !== undefined && (wake === undefined || next < wake))
|
|
476
|
+
wake = next;
|
|
477
|
+
}
|
|
478
|
+
// Already due (e.g. the budget ran out) is reported as `now`.
|
|
479
|
+
report.nextWake = deferred
|
|
480
|
+
? now
|
|
481
|
+
: wake === undefined
|
|
482
|
+
? undefined
|
|
483
|
+
: Math.max(wake, now);
|
|
484
|
+
return report;
|
|
485
|
+
}
|
|
486
|
+
finally {
|
|
487
|
+
stepping = false;
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
onDependencyChanged(key, now) {
|
|
491
|
+
const counts = input.phases.map((handler) => handler.wake?.(key, now));
|
|
492
|
+
const sum = (values) => values.reduce((total, value) => total + (value ?? 0), 0);
|
|
493
|
+
return counts.some(isPromiseLike)
|
|
494
|
+
? Promise.all(counts).then(sum)
|
|
495
|
+
: sum(counts);
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/replication/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { type ReplicaEnvelope } from "./envelope.js";
|
|
2
|
+
import { type CopyDecision, type CopyDisposition, type FinalizedFact, type Hex } from "./copy-promotion.js";
|
|
3
|
+
import type { Predecessor } from "./transport.js";
|
|
4
|
+
import { type ReplicaEffect, type ReplicaEffectContext } from "./effects.js";
|
|
5
|
+
export declare const REPLICA_COPY_MIGRATION = "\nCREATE TABLE IF NOT EXISTS pdpp_replica_copies (\n id TEXT NOT NULL,\n copy_key TEXT NOT NULL,\n writer_id TEXT NOT NULL,\n batch_id TEXT NOT NULL,\n sequence INTEGER NOT NULL,\n previous_json TEXT,\n fragment_count INTEGER NOT NULL CHECK (fragment_count >= 1),\n fragment_commitments_json TEXT NOT NULL,\n envelope_digest TEXT NOT NULL,\n envelope_json TEXT NOT NULL,\n blobs_json TEXT NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('pending','confirmed','quarantined')),\n reason TEXT CHECK (reason IS NULL OR reason IN ('copy_conflict','finalized_conflict')),\n CHECK ((state = 'quarantined') = (reason IS NOT NULL)),\n PRIMARY KEY (id, copy_key)\n);\nCREATE TABLE IF NOT EXISTS pdpp_replica_copy_envelope_parts (\n id TEXT NOT NULL, copy_key TEXT NOT NULL, part INTEGER NOT NULL,\n json TEXT NOT NULL,\n PRIMARY KEY (id, copy_key, part)\n);\nCREATE TABLE IF NOT EXISTS pdpp_replica_copy_blob_parts (\n id TEXT NOT NULL, copy_key TEXT NOT NULL, part INTEGER NOT NULL,\n json TEXT NOT NULL,\n PRIMARY KEY (id, copy_key, part)\n);\nCREATE TABLE IF NOT EXISTS pdpp_replica_copy_rejects (\n id TEXT NOT NULL, reject_key TEXT NOT NULL, claimed_copy_key TEXT,\n reason TEXT NOT NULL, received_at INTEGER NOT NULL,\n PRIMARY KEY (id, reject_key)\n);\nCREATE TRIGGER IF NOT EXISTS pdpp_copy_rejects_no_update BEFORE UPDATE ON pdpp_replica_copy_rejects BEGIN SELECT RAISE(ABORT, 'copy rejects are append-only'); END;\nCREATE TRIGGER IF NOT EXISTS pdpp_copy_rejects_no_delete BEFORE DELETE ON pdpp_replica_copy_rejects BEGIN SELECT RAISE(ABORT, 'copy rejects are append-only'); END;\nCREATE TABLE IF NOT EXISTS pdpp_replica_finalized_facts (\n seq INTEGER PRIMARY KEY AUTOINCREMENT,\n chain_id INTEGER NOT NULL, registry TEXT NOT NULL, owner TEXT NOT NULL,\n scope TEXT NOT NULL, fragment_index INTEGER NOT NULL, id TEXT NOT NULL,\n slot_version TEXT NOT NULL DEFAULT '1', current_version TEXT NOT NULL, status TEXT NOT NULL, commitment TEXT NOT NULL,\n block_number TEXT NOT NULL, block_hash TEXT NOT NULL, eligible INTEGER NOT NULL,\n observed_at INTEGER NOT NULL\n);\nCREATE INDEX IF NOT EXISTS pdpp_finalized_facts_id ON pdpp_replica_finalized_facts(id, fragment_index, seq);\nCREATE INDEX IF NOT EXISTS pdpp_finalized_facts_scope ON pdpp_replica_finalized_facts(scope, seq);\nCREATE TRIGGER IF NOT EXISTS pdpp_finalized_facts_no_update BEFORE UPDATE ON pdpp_replica_finalized_facts BEGIN SELECT RAISE(ABORT, 'finalized facts are append-only'); END;\nCREATE TRIGGER IF NOT EXISTS pdpp_finalized_facts_no_delete BEFORE DELETE ON pdpp_replica_finalized_facts BEGIN SELECT RAISE(ABORT, 'finalized facts are append-only'); END;\nCREATE TABLE IF NOT EXISTS pdpp_replica_batch_disposition (\n id TEXT PRIMARY KEY,\n writer_id TEXT NOT NULL,\n sequence INTEGER NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('open','promoted','terminal')),\n promoted_copy_key TEXT,\n terminal_reason TEXT,\n CHECK ((state = 'promoted') = (promoted_copy_key IS NOT NULL)),\n CHECK ((state = 'terminal') = (terminal_reason IS NOT NULL))\n);\nCREATE INDEX IF NOT EXISTS pdpp_batch_disposition_writer ON pdpp_replica_batch_disposition(writer_id, sequence);\nCREATE TRIGGER IF NOT EXISTS pdpp_batch_disposition_absorbing BEFORE UPDATE ON pdpp_replica_batch_disposition\nWHEN OLD.state = 'terminal' OR (OLD.state = 'promoted' AND NEW.state = 'open')\nBEGIN SELECT RAISE(ABORT, 'batch disposition transitions are absorbing'); END;\nCREATE TABLE IF NOT EXISTS pdpp_replica_promotion_receipts (\n id TEXT PRIMARY KEY, copy_key TEXT NOT NULL, envelope_digest TEXT NOT NULL\n);\n";
|
|
6
|
+
/** One fragment of a copy, as verified at download (bytes hash to these). */
|
|
7
|
+
export interface CopyFragment {
|
|
8
|
+
dataHash: string;
|
|
9
|
+
metadataHash: string;
|
|
10
|
+
}
|
|
11
|
+
export interface StagedCopy {
|
|
12
|
+
id: string;
|
|
13
|
+
writer: string;
|
|
14
|
+
batch: string;
|
|
15
|
+
sequence: number;
|
|
16
|
+
previous: Predecessor | null;
|
|
17
|
+
/** The payload digest every fragment embeds (`sha256:<hex>`). */
|
|
18
|
+
envelopeDigest: string;
|
|
19
|
+
envelope: ReplicaEnvelope;
|
|
20
|
+
fragments: readonly CopyFragment[];
|
|
21
|
+
/** Verified pending custody the host already holds for (id, blobId). */
|
|
22
|
+
blobs: readonly {
|
|
23
|
+
blobId: string;
|
|
24
|
+
size: number;
|
|
25
|
+
}[];
|
|
26
|
+
}
|
|
27
|
+
export type CopyPromotion = {
|
|
28
|
+
kind: "promoted";
|
|
29
|
+
copyKey: Hex;
|
|
30
|
+
envelopeDigest: string;
|
|
31
|
+
replay: boolean;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "wait_predecessor";
|
|
34
|
+
predecessor: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: "terminal";
|
|
37
|
+
reason: string;
|
|
38
|
+
};
|
|
39
|
+
/** Precondition failures a caller can act on; never exception text. */
|
|
40
|
+
export declare class ReplicaCopyRefused extends Error {
|
|
41
|
+
readonly reason: string;
|
|
42
|
+
readonly code = "replica_copy_refused";
|
|
43
|
+
constructor(reason: string);
|
|
44
|
+
}
|
|
45
|
+
/** What a host supplies. Each hook is an effect in the caller's transaction. */
|
|
46
|
+
export interface ReplicaCopiesHost<C = ReplicaEffectContext> {
|
|
47
|
+
owner: string;
|
|
48
|
+
/** Import an envelope into canonical state (the receiver's import). */
|
|
49
|
+
importEnvelope(envelope: ReplicaEnvelope, blobs: StagedCopy["blobs"], id: string): ReplicaEffect<void, C>;
|
|
50
|
+
/** Withdraw a connection from every reader, in the caller's transaction. */
|
|
51
|
+
quarantineConnection(instance: string): ReplicaEffect<void, C>;
|
|
52
|
+
/**
|
|
53
|
+
* The single pending preview of a batch, keyed by id: at most one copy is
|
|
54
|
+
* ever `pending` (contract B), so the read side keeps its id key.
|
|
55
|
+
*/
|
|
56
|
+
preview: {
|
|
57
|
+
show(id: string, envelope: ReplicaEnvelope, blobsJson: string): ReplicaEffect<void, C>;
|
|
58
|
+
hide(id: string, state: "confirmed" | "quarantined"): ReplicaEffect<void, C>;
|
|
59
|
+
};
|
|
60
|
+
/** Drop pending custody bytes no retained copy still needs. */
|
|
61
|
+
releaseBytes(id: string, blobIds: readonly string[]): ReplicaEffect<void, C>;
|
|
62
|
+
/**
|
|
63
|
+
* Run `effect` so that a throw rolls back its writes alone (a savepoint)
|
|
64
|
+
* and rethrows.
|
|
65
|
+
*/
|
|
66
|
+
savepoint<T>(effect: ReplicaEffect<T, C>): ReplicaEffect<T, C>;
|
|
67
|
+
now(): number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A copy's envelope. Copies staged before the parts table keep it in
|
|
71
|
+
* `envelope_json`; later copies leave that empty and keep it in parts.
|
|
72
|
+
*/
|
|
73
|
+
export declare function replicaCopyEnvelope<C extends ReplicaEffectContext>(id: string, copyKey: string): ReplicaEffect<ReplicaEnvelope, C>;
|
|
74
|
+
export declare function replicaCopies<C extends ReplicaEffectContext>(host: ReplicaCopiesHost<C>): {
|
|
75
|
+
decide: (id: string, refetch: {
|
|
76
|
+
attempts: number;
|
|
77
|
+
budget: number;
|
|
78
|
+
}) => ReplicaEffect<CopyDecision, C>;
|
|
79
|
+
disposition: (id: string) => ReplicaEffect<CopyDisposition, C>;
|
|
80
|
+
copies(id: string): Generator<import("./effects.js").ReplicaOp<C>, {
|
|
81
|
+
copyKey: Hex;
|
|
82
|
+
state: "confirmed" | "pending" | "quarantined";
|
|
83
|
+
reason: "finalized_conflict" | "copy_conflict" | null;
|
|
84
|
+
envelopeDigest: string;
|
|
85
|
+
}[], unknown>;
|
|
86
|
+
/**
|
|
87
|
+
* Retain one valid copy (contract §3 "Stage copy", amendment C), then
|
|
88
|
+
* decide and apply the quarantine set. Returns the copy key and decision.
|
|
89
|
+
* An input failing a validity check is recorded as a reject only.
|
|
90
|
+
*/
|
|
91
|
+
stage(copy: StagedCopy, refetch: {
|
|
92
|
+
attempts: number;
|
|
93
|
+
budget: number;
|
|
94
|
+
}): ReplicaEffect<{
|
|
95
|
+
copyKey: Hex | undefined;
|
|
96
|
+
decision: CopyDecision;
|
|
97
|
+
}, C>;
|
|
98
|
+
/**
|
|
99
|
+
* Append a verified finalized fact for one registered slot (F2). A fact
|
|
100
|
+
* from another owner is refused (a diagnostic, never a fact). Returns
|
|
101
|
+
* true when it is new.
|
|
102
|
+
*/
|
|
103
|
+
recordFact(input: {
|
|
104
|
+
id: string;
|
|
105
|
+
scope: string;
|
|
106
|
+
fragmentIndex: number;
|
|
107
|
+
fact: FinalizedFact;
|
|
108
|
+
}): ReplicaEffect<boolean, C>;
|
|
109
|
+
/** Apply a non-promoting decision's durable effects (coordinator step). */
|
|
110
|
+
apply: (id: string, decision: CopyDecision) => ReplicaEffect<void, C>;
|
|
111
|
+
terminate: (id: string, reason: string) => ReplicaEffect<void, C>;
|
|
112
|
+
/**
|
|
113
|
+
* Promote one copy (contract §3, amendments E and F): re-decide and
|
|
114
|
+
* re-check the predecessor; import the copy under a savepoint; confirm
|
|
115
|
+
* it, quarantine the rest, record the disposition and the receipt. A
|
|
116
|
+
* replay of a completed promotion returns the original receipt and
|
|
117
|
+
* changes nothing. A bare promote (no key) is refused when more than one
|
|
118
|
+
* copy is retained.
|
|
119
|
+
*/
|
|
120
|
+
promote(input: {
|
|
121
|
+
id: string;
|
|
122
|
+
copyKey?: string;
|
|
123
|
+
}): ReplicaEffect<CopyPromotion, C>;
|
|
124
|
+
};
|
|
125
|
+
export type ReplicaCopiesEffects<C extends ReplicaEffectContext> = ReturnType<typeof replicaCopies<C>>;
|
|
126
|
+
//# sourceMappingURL=copies.d.ts.map
|