@optimystic/db-core 0.13.5 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cluster/structs.d.ts +13 -0
- package/dist/src/cluster/structs.d.ts.map +1 -1
- package/dist/src/cohort-topic/addressing.d.ts +53 -0
- package/dist/src/cohort-topic/addressing.d.ts.map +1 -0
- package/dist/src/cohort-topic/addressing.js +95 -0
- package/dist/src/cohort-topic/addressing.js.map +1 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.d.ts +105 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.d.ts.map +1 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.js +197 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.js.map +1 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts +50 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts.map +1 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.js +62 -0
- package/dist/src/cohort-topic/antidos/bootstrap-evidence.js.map +1 -0
- package/dist/src/cohort-topic/antidos/index.d.ts +6 -0
- package/dist/src/cohort-topic/antidos/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/antidos/index.js +6 -0
- package/dist/src/cohort-topic/antidos/index.js.map +1 -0
- package/dist/src/cohort-topic/antidos/rate-limiter.d.ts +95 -0
- package/dist/src/cohort-topic/antidos/rate-limiter.d.ts.map +1 -0
- package/dist/src/cohort-topic/antidos/rate-limiter.js +146 -0
- package/dist/src/cohort-topic/antidos/rate-limiter.js.map +1 -0
- package/dist/src/cohort-topic/antidos/replay-guard.d.ts +37 -0
- package/dist/src/cohort-topic/antidos/replay-guard.d.ts.map +1 -0
- package/dist/src/cohort-topic/antidos/replay-guard.js +78 -0
- package/dist/src/cohort-topic/antidos/replay-guard.js.map +1 -0
- package/dist/src/cohort-topic/antidos/topic-budget.d.ts +50 -0
- package/dist/src/cohort-topic/antidos/topic-budget.d.ts.map +1 -0
- package/dist/src/cohort-topic/antidos/topic-budget.js +95 -0
- package/dist/src/cohort-topic/antidos/topic-budget.js.map +1 -0
- package/dist/src/cohort-topic/antiflood/index.d.ts +3 -0
- package/dist/src/cohort-topic/antiflood/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/antiflood/index.js +3 -0
- package/dist/src/cohort-topic/antiflood/index.js.map +1 -0
- package/dist/src/cohort-topic/antiflood/invariants.d.ts +70 -0
- package/dist/src/cohort-topic/antiflood/invariants.d.ts.map +1 -0
- package/dist/src/cohort-topic/antiflood/invariants.js +86 -0
- package/dist/src/cohort-topic/antiflood/invariants.js.map +1 -0
- package/dist/src/cohort-topic/antiflood/jitter.d.ts +65 -0
- package/dist/src/cohort-topic/antiflood/jitter.d.ts.map +1 -0
- package/dist/src/cohort-topic/antiflood/jitter.js +75 -0
- package/dist/src/cohort-topic/antiflood/jitter.js.map +1 -0
- package/dist/src/cohort-topic/coldstart.d.ts +117 -0
- package/dist/src/cohort-topic/coldstart.d.ts.map +1 -0
- package/dist/src/cohort-topic/coldstart.js +127 -0
- package/dist/src/cohort-topic/coldstart.js.map +1 -0
- package/dist/src/cohort-topic/dmax.d.ts +44 -0
- package/dist/src/cohort-topic/dmax.d.ts.map +1 -0
- package/dist/src/cohort-topic/dmax.js +70 -0
- package/dist/src/cohort-topic/dmax.js.map +1 -0
- package/dist/src/cohort-topic/gossip/bus.d.ts +85 -0
- package/dist/src/cohort-topic/gossip/bus.d.ts.map +1 -0
- package/dist/src/cohort-topic/gossip/bus.js +146 -0
- package/dist/src/cohort-topic/gossip/bus.js.map +1 -0
- package/dist/src/cohort-topic/gossip/index.d.ts +4 -0
- package/dist/src/cohort-topic/gossip/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/gossip/index.js +4 -0
- package/dist/src/cohort-topic/gossip/index.js.map +1 -0
- package/dist/src/cohort-topic/gossip/records.d.ts +12 -0
- package/dist/src/cohort-topic/gossip/records.d.ts.map +1 -0
- package/dist/src/cohort-topic/gossip/records.js +41 -0
- package/dist/src/cohort-topic/gossip/records.js.map +1 -0
- package/dist/src/cohort-topic/gossip/view.d.ts +39 -0
- package/dist/src/cohort-topic/gossip/view.d.ts.map +1 -0
- package/dist/src/cohort-topic/gossip/view.js +30 -0
- package/dist/src/cohort-topic/gossip/view.js.map +1 -0
- package/dist/src/cohort-topic/index.d.ts +21 -0
- package/dist/src/cohort-topic/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/index.js +21 -0
- package/dist/src/cohort-topic/index.js.map +1 -0
- package/dist/src/cohort-topic/load/barometer.d.ts +78 -0
- package/dist/src/cohort-topic/load/barometer.d.ts.map +1 -0
- package/dist/src/cohort-topic/load/barometer.js +93 -0
- package/dist/src/cohort-topic/load/barometer.js.map +1 -0
- package/dist/src/cohort-topic/load/index.d.ts +2 -0
- package/dist/src/cohort-topic/load/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/load/index.js +2 -0
- package/dist/src/cohort-topic/load/index.js.map +1 -0
- package/dist/src/cohort-topic/member-engine.d.ts +134 -0
- package/dist/src/cohort-topic/member-engine.d.ts.map +1 -0
- package/dist/src/cohort-topic/member-engine.js +264 -0
- package/dist/src/cohort-topic/member-engine.js.map +1 -0
- package/dist/src/cohort-topic/membership/index.d.ts +4 -0
- package/dist/src/cohort-topic/membership/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/membership/index.js +4 -0
- package/dist/src/cohort-topic/membership/index.js.map +1 -0
- package/dist/src/cohort-topic/membership/publisher.d.ts +82 -0
- package/dist/src/cohort-topic/membership/publisher.d.ts.map +1 -0
- package/dist/src/cohort-topic/membership/publisher.js +107 -0
- package/dist/src/cohort-topic/membership/publisher.js.map +1 -0
- package/dist/src/cohort-topic/membership/source.d.ts +31 -0
- package/dist/src/cohort-topic/membership/source.d.ts.map +1 -0
- package/dist/src/cohort-topic/membership/source.js +32 -0
- package/dist/src/cohort-topic/membership/source.js.map +1 -0
- package/dist/src/cohort-topic/membership/verifier.d.ts +96 -0
- package/dist/src/cohort-topic/membership/verifier.d.ts.map +1 -0
- package/dist/src/cohort-topic/membership/verifier.js +250 -0
- package/dist/src/cohort-topic/membership/verifier.js.map +1 -0
- package/dist/src/cohort-topic/ports.d.ts +149 -0
- package/dist/src/cohort-topic/ports.d.ts.map +1 -0
- package/dist/src/cohort-topic/ports.js +25 -0
- package/dist/src/cohort-topic/ports.js.map +1 -0
- package/dist/src/cohort-topic/promotion.d.ts +135 -0
- package/dist/src/cohort-topic/promotion.d.ts.map +1 -0
- package/dist/src/cohort-topic/promotion.js +269 -0
- package/dist/src/cohort-topic/promotion.js.map +1 -0
- package/dist/src/cohort-topic/registration/bytes.d.ts +16 -0
- package/dist/src/cohort-topic/registration/bytes.d.ts.map +1 -0
- package/dist/src/cohort-topic/registration/bytes.js +32 -0
- package/dist/src/cohort-topic/registration/bytes.js.map +1 -0
- package/dist/src/cohort-topic/registration/handoff.d.ts +69 -0
- package/dist/src/cohort-topic/registration/handoff.d.ts.map +1 -0
- package/dist/src/cohort-topic/registration/handoff.js +98 -0
- package/dist/src/cohort-topic/registration/handoff.js.map +1 -0
- package/dist/src/cohort-topic/registration/index.d.ts +7 -0
- package/dist/src/cohort-topic/registration/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/registration/index.js +7 -0
- package/dist/src/cohort-topic/registration/index.js.map +1 -0
- package/dist/src/cohort-topic/registration/renewal.d.ts +115 -0
- package/dist/src/cohort-topic/registration/renewal.d.ts.map +1 -0
- package/dist/src/cohort-topic/registration/renewal.js +306 -0
- package/dist/src/cohort-topic/registration/renewal.js.map +1 -0
- package/dist/src/cohort-topic/registration/sharding.d.ts +31 -0
- package/dist/src/cohort-topic/registration/sharding.d.ts.map +1 -0
- package/dist/src/cohort-topic/registration/sharding.js +48 -0
- package/dist/src/cohort-topic/registration/sharding.js.map +1 -0
- package/dist/src/cohort-topic/registration/store.d.ts +13 -0
- package/dist/src/cohort-topic/registration/store.d.ts.map +1 -0
- package/dist/src/cohort-topic/registration/store.js +72 -0
- package/dist/src/cohort-topic/registration/store.js.map +1 -0
- package/dist/src/cohort-topic/registration/types.d.ts +71 -0
- package/dist/src/cohort-topic/registration/types.d.ts.map +1 -0
- package/dist/src/cohort-topic/registration/types.js +27 -0
- package/dist/src/cohort-topic/registration/types.js.map +1 -0
- package/dist/src/cohort-topic/ring-hash.d.ts +27 -0
- package/dist/src/cohort-topic/ring-hash.d.ts.map +1 -0
- package/dist/src/cohort-topic/ring-hash.js +45 -0
- package/dist/src/cohort-topic/ring-hash.js.map +1 -0
- package/dist/src/cohort-topic/service.d.ts +157 -0
- package/dist/src/cohort-topic/service.d.ts.map +1 -0
- package/dist/src/cohort-topic/service.js +237 -0
- package/dist/src/cohort-topic/service.js.map +1 -0
- package/dist/src/cohort-topic/sig/index.d.ts +3 -0
- package/dist/src/cohort-topic/sig/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/sig/index.js +3 -0
- package/dist/src/cohort-topic/sig/index.js.map +1 -0
- package/dist/src/cohort-topic/sig/payloads.d.ts +25 -0
- package/dist/src/cohort-topic/sig/payloads.d.ts.map +1 -0
- package/dist/src/cohort-topic/sig/payloads.js +25 -0
- package/dist/src/cohort-topic/sig/payloads.js.map +1 -0
- package/dist/src/cohort-topic/sig/threshold.d.ts +33 -0
- package/dist/src/cohort-topic/sig/threshold.d.ts.map +1 -0
- package/dist/src/cohort-topic/sig/threshold.js +51 -0
- package/dist/src/cohort-topic/sig/threshold.js.map +1 -0
- package/dist/src/cohort-topic/tiers.d.ts +58 -0
- package/dist/src/cohort-topic/tiers.d.ts.map +1 -0
- package/dist/src/cohort-topic/tiers.js +49 -0
- package/dist/src/cohort-topic/tiers.js.map +1 -0
- package/dist/src/cohort-topic/traffic.d.ts +90 -0
- package/dist/src/cohort-topic/traffic.d.ts.map +1 -0
- package/dist/src/cohort-topic/traffic.js +146 -0
- package/dist/src/cohort-topic/traffic.js.map +1 -0
- package/dist/src/cohort-topic/walk.d.ts +123 -0
- package/dist/src/cohort-topic/walk.d.ts.map +1 -0
- package/dist/src/cohort-topic/walk.js +150 -0
- package/dist/src/cohort-topic/walk.js.map +1 -0
- package/dist/src/cohort-topic/willingness.d.ts +123 -0
- package/dist/src/cohort-topic/willingness.d.ts.map +1 -0
- package/dist/src/cohort-topic/willingness.js +143 -0
- package/dist/src/cohort-topic/willingness.js.map +1 -0
- package/dist/src/cohort-topic/wire/codec.d.ts +42 -0
- package/dist/src/cohort-topic/wire/codec.d.ts.map +1 -0
- package/dist/src/cohort-topic/wire/codec.js +163 -0
- package/dist/src/cohort-topic/wire/codec.js.map +1 -0
- package/dist/src/cohort-topic/wire/index.d.ts +6 -0
- package/dist/src/cohort-topic/wire/index.d.ts.map +1 -0
- package/dist/src/cohort-topic/wire/index.js +6 -0
- package/dist/src/cohort-topic/wire/index.js.map +1 -0
- package/dist/src/cohort-topic/wire/payloads.d.ts +38 -0
- package/dist/src/cohort-topic/wire/payloads.d.ts.map +1 -0
- package/dist/src/cohort-topic/wire/payloads.js +102 -0
- package/dist/src/cohort-topic/wire/payloads.js.map +1 -0
- package/dist/src/cohort-topic/wire/types.d.ts +304 -0
- package/dist/src/cohort-topic/wire/types.d.ts.map +1 -0
- package/dist/src/cohort-topic/wire/types.js +16 -0
- package/dist/src/cohort-topic/wire/types.js.map +1 -0
- package/dist/src/cohort-topic/wire/validate.d.ts +25 -0
- package/dist/src/cohort-topic/wire/validate.d.ts.map +1 -0
- package/dist/src/cohort-topic/wire/validate.js +427 -0
- package/dist/src/cohort-topic/wire/validate.js.map +1 -0
- package/dist/src/collection/collection.d.ts +58 -1
- package/dist/src/collection/collection.d.ts.map +1 -1
- package/dist/src/collection/collection.js +76 -0
- package/dist/src/collection/collection.js.map +1 -1
- package/dist/src/collections/tree/tree.d.ts +58 -2
- package/dist/src/collections/tree/tree.d.ts.map +1 -1
- package/dist/src/collections/tree/tree.js +59 -2
- package/dist/src/collections/tree/tree.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/log/log.d.ts +42 -4
- package/dist/src/log/log.d.ts.map +1 -1
- package/dist/src/log/log.js +71 -3
- package/dist/src/log/log.js.map +1 -1
- package/dist/src/log/struct.d.ts +122 -2
- package/dist/src/log/struct.d.ts.map +1 -1
- package/dist/src/log/struct.js.map +1 -1
- package/dist/src/matchmaking/capability-filter.d.ts +24 -0
- package/dist/src/matchmaking/capability-filter.d.ts.map +1 -0
- package/dist/src/matchmaking/capability-filter.js +37 -0
- package/dist/src/matchmaking/capability-filter.js.map +1 -0
- package/dist/src/matchmaking/config.d.ts +77 -0
- package/dist/src/matchmaking/config.d.ts.map +1 -0
- package/dist/src/matchmaking/config.js +69 -0
- package/dist/src/matchmaking/config.js.map +1 -0
- package/dist/src/matchmaking/index.d.ts +21 -0
- package/dist/src/matchmaking/index.d.ts.map +1 -0
- package/dist/src/matchmaking/index.js +21 -0
- package/dist/src/matchmaking/index.js.map +1 -0
- package/dist/src/matchmaking/multi-cohort-seeker.d.ts +133 -0
- package/dist/src/matchmaking/multi-cohort-seeker.d.ts.map +1 -0
- package/dist/src/matchmaking/multi-cohort-seeker.js +142 -0
- package/dist/src/matchmaking/multi-cohort-seeker.js.map +1 -0
- package/dist/src/matchmaking/provider.d.ts +70 -0
- package/dist/src/matchmaking/provider.d.ts.map +1 -0
- package/dist/src/matchmaking/provider.js +93 -0
- package/dist/src/matchmaking/provider.js.map +1 -0
- package/dist/src/matchmaking/query-eval.d.ts +53 -0
- package/dist/src/matchmaking/query-eval.d.ts.map +1 -0
- package/dist/src/matchmaking/query-eval.js +69 -0
- package/dist/src/matchmaking/query-eval.js.map +1 -0
- package/dist/src/matchmaking/seeker-walk.d.ts +95 -0
- package/dist/src/matchmaking/seeker-walk.d.ts.map +1 -0
- package/dist/src/matchmaking/seeker-walk.js +75 -0
- package/dist/src/matchmaking/seeker-walk.js.map +1 -0
- package/dist/src/matchmaking/seeker.d.ts +51 -0
- package/dist/src/matchmaking/seeker.d.ts.map +1 -0
- package/dist/src/matchmaking/seeker.js +62 -0
- package/dist/src/matchmaking/seeker.js.map +1 -0
- package/dist/src/matchmaking/topic-anchor.d.ts +54 -0
- package/dist/src/matchmaking/topic-anchor.d.ts.map +1 -0
- package/dist/src/matchmaking/topic-anchor.js +67 -0
- package/dist/src/matchmaking/topic-anchor.js.map +1 -0
- package/dist/src/matchmaking/voting-quorum.d.ts +233 -0
- package/dist/src/matchmaking/voting-quorum.d.ts.map +1 -0
- package/dist/src/matchmaking/voting-quorum.js +238 -0
- package/dist/src/matchmaking/voting-quorum.js.map +1 -0
- package/dist/src/matchmaking/wire.d.ts +259 -0
- package/dist/src/matchmaking/wire.d.ts.map +1 -0
- package/dist/src/matchmaking/wire.js +484 -0
- package/dist/src/matchmaking/wire.js.map +1 -0
- package/dist/src/network/i-repo.d.ts +9 -0
- package/dist/src/network/i-repo.d.ts.map +1 -1
- package/dist/src/network/repo-protocol.d.ts +3 -1
- package/dist/src/network/repo-protocol.d.ts.map +1 -1
- package/dist/src/network/struct.d.ts +23 -1
- package/dist/src/network/struct.d.ts.map +1 -1
- package/dist/src/reactivity/backfill.d.ts +118 -0
- package/dist/src/reactivity/backfill.d.ts.map +1 -0
- package/dist/src/reactivity/backfill.js +137 -0
- package/dist/src/reactivity/backfill.js.map +1 -0
- package/dist/src/reactivity/backpressure.d.ts +99 -0
- package/dist/src/reactivity/backpressure.d.ts.map +1 -0
- package/dist/src/reactivity/backpressure.js +153 -0
- package/dist/src/reactivity/backpressure.js.map +1 -0
- package/dist/src/reactivity/checkpoint.d.ts +165 -0
- package/dist/src/reactivity/checkpoint.d.ts.map +1 -0
- package/dist/src/reactivity/checkpoint.js +232 -0
- package/dist/src/reactivity/checkpoint.js.map +1 -0
- package/dist/src/reactivity/config.d.ts +131 -0
- package/dist/src/reactivity/config.d.ts.map +1 -0
- package/dist/src/reactivity/config.js +135 -0
- package/dist/src/reactivity/config.js.map +1 -0
- package/dist/src/reactivity/dedupe.d.ts +51 -0
- package/dist/src/reactivity/dedupe.d.ts.map +1 -0
- package/dist/src/reactivity/dedupe.js +90 -0
- package/dist/src/reactivity/dedupe.js.map +1 -0
- package/dist/src/reactivity/forwarder.d.ts +50 -0
- package/dist/src/reactivity/forwarder.d.ts.map +1 -0
- package/dist/src/reactivity/forwarder.js +52 -0
- package/dist/src/reactivity/forwarder.js.map +1 -0
- package/dist/src/reactivity/index.d.ts +34 -0
- package/dist/src/reactivity/index.d.ts.map +1 -0
- package/dist/src/reactivity/index.js +34 -0
- package/dist/src/reactivity/index.js.map +1 -0
- package/dist/src/reactivity/notification.d.ts +72 -0
- package/dist/src/reactivity/notification.d.ts.map +1 -0
- package/dist/src/reactivity/notification.js +92 -0
- package/dist/src/reactivity/notification.js.map +1 -0
- package/dist/src/reactivity/policy.d.ts +59 -0
- package/dist/src/reactivity/policy.d.ts.map +1 -0
- package/dist/src/reactivity/policy.js +64 -0
- package/dist/src/reactivity/policy.js.map +1 -0
- package/dist/src/reactivity/push-state.d.ts +140 -0
- package/dist/src/reactivity/push-state.d.ts.map +1 -0
- package/dist/src/reactivity/push-state.js +270 -0
- package/dist/src/reactivity/push-state.js.map +1 -0
- package/dist/src/reactivity/recover.d.ts +75 -0
- package/dist/src/reactivity/recover.d.ts.map +1 -0
- package/dist/src/reactivity/recover.js +105 -0
- package/dist/src/reactivity/recover.js.map +1 -0
- package/dist/src/reactivity/replay-buffer.d.ts +57 -0
- package/dist/src/reactivity/replay-buffer.d.ts.map +1 -0
- package/dist/src/reactivity/replay-buffer.js +88 -0
- package/dist/src/reactivity/replay-buffer.js.map +1 -0
- package/dist/src/reactivity/resume.d.ts +214 -0
- package/dist/src/reactivity/resume.d.ts.map +1 -0
- package/dist/src/reactivity/resume.js +358 -0
- package/dist/src/reactivity/resume.js.map +1 -0
- package/dist/src/reactivity/rotation.d.ts +283 -0
- package/dist/src/reactivity/rotation.d.ts.map +1 -0
- package/dist/src/reactivity/rotation.js +265 -0
- package/dist/src/reactivity/rotation.js.map +1 -0
- package/dist/src/reactivity/subscriber.d.ts +66 -0
- package/dist/src/reactivity/subscriber.d.ts.map +1 -0
- package/dist/src/reactivity/subscriber.js +75 -0
- package/dist/src/reactivity/subscriber.js.map +1 -0
- package/dist/src/reactivity/subscription.d.ts +52 -0
- package/dist/src/reactivity/subscription.d.ts.map +1 -0
- package/dist/src/reactivity/subscription.js +28 -0
- package/dist/src/reactivity/subscription.js.map +1 -0
- package/dist/src/reactivity/topic-anchor.d.ts +46 -0
- package/dist/src/reactivity/topic-anchor.d.ts.map +1 -0
- package/dist/src/reactivity/topic-anchor.js +61 -0
- package/dist/src/reactivity/topic-anchor.js.map +1 -0
- package/dist/src/reactivity/verify.d.ts +41 -0
- package/dist/src/reactivity/verify.d.ts.map +1 -0
- package/dist/src/reactivity/verify.js +48 -0
- package/dist/src/reactivity/verify.js.map +1 -0
- package/dist/src/reactivity/wire-validate.d.ts +28 -0
- package/dist/src/reactivity/wire-validate.d.ts.map +1 -0
- package/dist/src/reactivity/wire-validate.js +79 -0
- package/dist/src/reactivity/wire-validate.js.map +1 -0
- package/dist/src/reactivity/wire.d.ts +102 -0
- package/dist/src/reactivity/wire.d.ts.map +1 -0
- package/dist/src/reactivity/wire.js +129 -0
- package/dist/src/reactivity/wire.js.map +1 -0
- package/dist/src/transaction/coordinator.d.ts +9 -5
- package/dist/src/transaction/coordinator.d.ts.map +1 -1
- package/dist/src/transaction/coordinator.js +48 -25
- package/dist/src/transaction/coordinator.js.map +1 -1
- package/dist/src/transactor/change-notifier.d.ts +74 -0
- package/dist/src/transactor/change-notifier.d.ts.map +1 -0
- package/dist/src/transactor/change-notifier.js +4 -0
- package/dist/src/transactor/change-notifier.js.map +1 -0
- package/dist/src/transactor/index.d.ts +1 -0
- package/dist/src/transactor/index.d.ts.map +1 -1
- package/dist/src/transactor/index.js +1 -0
- package/dist/src/transactor/index.js.map +1 -1
- package/dist/src/transactor/network-transactor.d.ts +34 -2
- package/dist/src/transactor/network-transactor.d.ts.map +1 -1
- package/dist/src/transactor/network-transactor.js +113 -13
- package/dist/src/transactor/network-transactor.js.map +1 -1
- package/package.json +2 -2
- package/src/cluster/structs.ts +13 -0
- package/src/cohort-topic/addressing.ts +112 -0
- package/src/cohort-topic/antidos/bootstrap-evidence-envelope.ts +253 -0
- package/src/cohort-topic/antidos/bootstrap-evidence.ts +94 -0
- package/src/cohort-topic/antidos/index.ts +5 -0
- package/src/cohort-topic/antidos/rate-limiter.ts +210 -0
- package/src/cohort-topic/antidos/replay-guard.ts +109 -0
- package/src/cohort-topic/antidos/topic-budget.ts +145 -0
- package/src/cohort-topic/antiflood/index.ts +2 -0
- package/src/cohort-topic/antiflood/invariants.ts +108 -0
- package/src/cohort-topic/antiflood/jitter.ts +117 -0
- package/src/cohort-topic/coldstart.ts +204 -0
- package/src/cohort-topic/dmax.ts +88 -0
- package/src/cohort-topic/gossip/bus.ts +217 -0
- package/src/cohort-topic/gossip/index.ts +3 -0
- package/src/cohort-topic/gossip/records.ts +45 -0
- package/src/cohort-topic/gossip/view.ts +66 -0
- package/src/cohort-topic/index.ts +20 -0
- package/src/cohort-topic/load/barometer.ts +134 -0
- package/src/cohort-topic/load/index.ts +1 -0
- package/src/cohort-topic/member-engine.ts +409 -0
- package/src/cohort-topic/membership/index.ts +3 -0
- package/src/cohort-topic/membership/publisher.ts +171 -0
- package/src/cohort-topic/membership/source.ts +41 -0
- package/src/cohort-topic/membership/verifier.ts +345 -0
- package/src/cohort-topic/ports.ts +157 -0
- package/src/cohort-topic/promotion.ts +384 -0
- package/src/cohort-topic/registration/bytes.ts +37 -0
- package/src/cohort-topic/registration/handoff.ts +154 -0
- package/src/cohort-topic/registration/index.ts +6 -0
- package/src/cohort-topic/registration/renewal.ts +423 -0
- package/src/cohort-topic/registration/sharding.ts +61 -0
- package/src/cohort-topic/registration/store.ts +81 -0
- package/src/cohort-topic/registration/types.ts +76 -0
- package/src/cohort-topic/ring-hash.ts +50 -0
- package/src/cohort-topic/service.ts +390 -0
- package/src/cohort-topic/sig/index.ts +2 -0
- package/src/cohort-topic/sig/payloads.ts +39 -0
- package/src/cohort-topic/sig/threshold.ts +64 -0
- package/src/cohort-topic/tiers.ts +74 -0
- package/src/cohort-topic/traffic.ts +211 -0
- package/src/cohort-topic/walk.ts +255 -0
- package/src/cohort-topic/willingness.ts +237 -0
- package/src/cohort-topic/wire/codec.ts +204 -0
- package/src/cohort-topic/wire/index.ts +16 -0
- package/src/cohort-topic/wire/payloads.ts +117 -0
- package/src/cohort-topic/wire/types.ts +343 -0
- package/src/cohort-topic/wire/validate.ts +478 -0
- package/src/collection/collection.ts +93 -1
- package/src/collections/tree/tree.ts +84 -3
- package/src/index.ts +3 -0
- package/src/log/log.ts +86 -7
- package/src/log/struct.ts +126 -2
- package/src/matchmaking/capability-filter.ts +45 -0
- package/src/matchmaking/config.ts +98 -0
- package/src/matchmaking/index.ts +21 -0
- package/src/matchmaking/multi-cohort-seeker.ts +234 -0
- package/src/matchmaking/provider.ts +123 -0
- package/src/matchmaking/query-eval.ts +105 -0
- package/src/matchmaking/seeker-walk.ts +127 -0
- package/src/matchmaking/seeker.ts +86 -0
- package/src/matchmaking/topic-anchor.ts +90 -0
- package/src/matchmaking/voting-quorum.ts +394 -0
- package/src/matchmaking/wire.ts +680 -0
- package/src/network/i-repo.ts +9 -0
- package/src/network/repo-protocol.ts +3 -2
- package/src/network/struct.ts +24 -1
- package/src/reactivity/backfill.ts +220 -0
- package/src/reactivity/backpressure.ts +191 -0
- package/src/reactivity/checkpoint.ts +308 -0
- package/src/reactivity/config.ts +172 -0
- package/src/reactivity/dedupe.ts +132 -0
- package/src/reactivity/forwarder.ts +87 -0
- package/src/reactivity/index.ts +34 -0
- package/src/reactivity/notification.ts +123 -0
- package/src/reactivity/policy.ts +79 -0
- package/src/reactivity/push-state.ts +343 -0
- package/src/reactivity/recover.ts +153 -0
- package/src/reactivity/replay-buffer.ts +141 -0
- package/src/reactivity/resume.ts +549 -0
- package/src/reactivity/rotation.ts +415 -0
- package/src/reactivity/subscriber.ts +132 -0
- package/src/reactivity/subscription.ts +66 -0
- package/src/reactivity/topic-anchor.ts +71 -0
- package/src/reactivity/verify.ts +73 -0
- package/src/reactivity/wire-validate.ts +87 -0
- package/src/reactivity/wire.ts +224 -0
- package/src/transaction/coordinator.ts +53 -27
- package/src/transactor/change-notifier.ts +80 -0
- package/src/transactor/index.ts +1 -0
- package/src/transactor/network-transactor.ts +133 -15
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactivity — Resume RPC: classification, serving, and subscriber-side apply
|
|
3
|
+
* (`docs/reactivity.md` §Resume, §Parent checkpoint summaries, §Wire formats Resume).
|
|
4
|
+
*
|
|
5
|
+
* A subscriber waking from sleep sends one {@link ResumeV1} to its cached primary (or any cohort member).
|
|
6
|
+
* The serving cohort classifies the request against its **stacked** recovery windows — the `W`-deep replay
|
|
7
|
+
* ring sits on top of the `W_checkpoint`-span parent checkpoint immediately below it, so a single round
|
|
8
|
+
* trip recovers `W + W_checkpoint` revisions — and answers with one of four {@link ResumeReplyV1} variants
|
|
9
|
+
* (`docs/reactivity.md` §Replay window, the authoritative stacked semantics):
|
|
10
|
+
*
|
|
11
|
+
* - **Backfill** — `fromRevision` is within the replay ring (`fromRevision ≥ ringLow`). Returns the
|
|
12
|
+
* `[fromRevision, currentRevision]` slice + `currentRevision`. One RT.
|
|
13
|
+
* - **CheckpointWindow** — `fromRevision` is below the ring but within the parent checkpoint span
|
|
14
|
+
* (`chain low ≤ fromRevision < ringLow`). Returns an ordered, contiguous **chain** of
|
|
15
|
+
* {@link CheckpointSummary}s (`checkpoints`, low→high) + the ring's `recentEntries`. The subscriber
|
|
16
|
+
* verifies every link's endpoints, applies each link's merged digest, advances its contiguity head past
|
|
17
|
+
* the whole chain, then replays the recent entries deduped against `lastRevision`. One RT. The chain is a
|
|
18
|
+
* single link in steady state; a new tail that took over across a rotation serves a **two-link**
|
|
19
|
+
* `[inherited, rolling]` chain when a `fromRevision` below both the ring and the rolling checkpoint falls
|
|
20
|
+
* inside the inherited handoff window — so the full stacked range recovers in one reply regardless of
|
|
21
|
+
* where the new tail's own rolling checkpoint has formed (`docs/reactivity.md` §Tail rotation step 5 —
|
|
22
|
+
* "the new tail holds the old checkpoint").
|
|
23
|
+
* - **OutOfWindow** — older than even the checkpoint. Returns `currentTailId` + `currentRevision`; the
|
|
24
|
+
* subscriber falls back to a chain read, then a fresh subscribe.
|
|
25
|
+
* - **TailRotated** — the request's `latestKnownTailId` does not match the cohort's current tail (the
|
|
26
|
+
* subscriber slept across a rotation). Returns `newTailId` + `newRevisionAtRotation`; the subscriber
|
|
27
|
+
* re-registers under the new tail. This is checked **first**: a stale tail means the whole tree moved,
|
|
28
|
+
* so the lag-against-windows classification is moot. The rotation *lifecycle* is owned by
|
|
29
|
+
* [reactivity-rotation-backpressure-policy]; this module only **detects** the stale tail and emits the
|
|
30
|
+
* reply so resume composes with rotation.
|
|
31
|
+
*
|
|
32
|
+
* Wire conventions match the rest of reactivity: JSON, byte fields base64url, unix-ms timestamps, `v: 1`,
|
|
33
|
+
* per-message structural validation on decode. `ResumeV1` is signed by the subscriber's peer key
|
|
34
|
+
* (`signature`); replay protection rides the request envelope as elsewhere in the substrate.
|
|
35
|
+
*/
|
|
36
|
+
import { decodeCohortMessage, encodeCohortMessage, DEFAULT_MAX_MESSAGE_BYTES, } from "../cohort-topic/wire/codec.js";
|
|
37
|
+
import { asObject, b64urlField, failWire, reqFiniteNumber, reqIntInRange, reqString, requireV1, } from "./wire-validate.js";
|
|
38
|
+
import { validateCheckpointSummary, verifyCheckpointEndpoints } from "./checkpoint.js";
|
|
39
|
+
import { checkpointCovers } from "./rotation.js";
|
|
40
|
+
import { validateNotificationArray } from "./wire.js";
|
|
41
|
+
// --- validation ---
|
|
42
|
+
/** Narrow an already-parsed value to {@link ResumeV1}, throwing on any defect. */
|
|
43
|
+
export function validateResumeV1(value) {
|
|
44
|
+
const what = "ResumeV1";
|
|
45
|
+
const obj = asObject(value, what);
|
|
46
|
+
requireV1(obj, what);
|
|
47
|
+
return {
|
|
48
|
+
v: 1,
|
|
49
|
+
collectionId: b64urlField(reqString(obj, "collectionId", what), "collectionId", what),
|
|
50
|
+
fromRevision: reqIntInRange(obj, "fromRevision", what, 0),
|
|
51
|
+
latestKnownTailId: b64urlField(reqString(obj, "latestKnownTailId", what), "latestKnownTailId", what),
|
|
52
|
+
subscriberCoord: b64urlField(reqString(obj, "subscriberCoord", what), "subscriberCoord", what),
|
|
53
|
+
timestamp: reqFiniteNumber(obj, "timestamp", what),
|
|
54
|
+
signature: b64urlField(reqString(obj, "signature", what), "signature", what),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Narrow an already-parsed value to {@link ResumeReplyV1}, throwing on any defect. */
|
|
58
|
+
export function validateResumeReplyV1(value) {
|
|
59
|
+
const what = "ResumeReplyV1";
|
|
60
|
+
const obj = asObject(value, what);
|
|
61
|
+
requireV1(obj, what);
|
|
62
|
+
const result = obj["result"];
|
|
63
|
+
if (result !== "backfill" && result !== "checkpoint_window" && result !== "out_of_window" && result !== "tail_rotated") {
|
|
64
|
+
failWire(`${what}: field "result" must be one of backfill|checkpoint_window|out_of_window|tail_rotated`);
|
|
65
|
+
}
|
|
66
|
+
const out = { v: 1, result };
|
|
67
|
+
switch (result) {
|
|
68
|
+
case "backfill": {
|
|
69
|
+
out.entries = validateNotificationArray(obj["entries"], what);
|
|
70
|
+
out.currentRevision = reqIntInRange(obj, "currentRevision", what, 0);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case "checkpoint_window": {
|
|
74
|
+
out.checkpoints = validateCheckpointChain(obj["checkpoints"], `${what}.checkpoints`);
|
|
75
|
+
out.recentEntries = validateNotificationArray(obj["recentEntries"], what);
|
|
76
|
+
if (obj["currentRevision"] !== undefined) {
|
|
77
|
+
out.currentRevision = reqIntInRange(obj, "currentRevision", what, 0);
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case "out_of_window": {
|
|
82
|
+
out.currentTailId = b64urlField(reqString(obj, "currentTailId", what), "currentTailId", what);
|
|
83
|
+
out.currentRevision = reqIntInRange(obj, "currentRevision", what, 0);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case "tail_rotated": {
|
|
87
|
+
out.newTailId = b64urlField(reqString(obj, "newTailId", what), "newTailId", what);
|
|
88
|
+
out.newRevisionAtRotation = reqIntInRange(obj, "newRevisionAtRotation", what, 0);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validate a `checkpoint_window` reply's checkpoint chain: a **non-empty**, **ascending**, internally
|
|
96
|
+
* **contiguous** list of {@link CheckpointSummary}s sharing one `collectionId`. Each link is validated via
|
|
97
|
+
* {@link validateCheckpointSummary}, and for `i ≥ 1` the chain must satisfy
|
|
98
|
+
* `checkpoints[i].fromRevision === checkpoints[i-1].toRevision + 1` (a gapped, overlapping, or misordered
|
|
99
|
+
* chain is rejected). Runs on decode, so a malformed chain never reaches {@link applyResumeReply} over the
|
|
100
|
+
* wire.
|
|
101
|
+
*/
|
|
102
|
+
function validateCheckpointChain(value, what) {
|
|
103
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
104
|
+
failWire(`${what}: must be a non-empty array of checkpoint summaries`);
|
|
105
|
+
}
|
|
106
|
+
const chain = value.map((el, i) => validateCheckpointSummary(el, `${what}[${i}]`));
|
|
107
|
+
for (let i = 0; i < chain.length; i++) {
|
|
108
|
+
if (chain[i].collectionId !== chain[0].collectionId) {
|
|
109
|
+
failWire(`${what}: all checkpoints must share one collectionId`);
|
|
110
|
+
}
|
|
111
|
+
if (i >= 1 && chain[i].fromRevision !== chain[i - 1].toRevision + 1) {
|
|
112
|
+
failWire(`${what}: chain must be ascending and contiguous (checkpoints[${i}].fromRevision must equal checkpoints[${i - 1}].toRevision + 1)`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return chain;
|
|
116
|
+
}
|
|
117
|
+
// --- canonical signing payload ---
|
|
118
|
+
const utf8 = new TextEncoder();
|
|
119
|
+
/**
|
|
120
|
+
* Canonical signed byte image of a {@link ResumeV1} (every field except `signature`). Mirrors
|
|
121
|
+
* {@link import("./backfill.js").backfillSigningPayload}: an explicitly-ordered, type-tagged JSON array
|
|
122
|
+
* encoded as UTF-8. The `"ResumeV1"` tag means a resume image can never collide with the `"BackfillV1"`
|
|
123
|
+
* image. `subscriberCoord` is part of the image, so a verifier recomputes over whatever coordinate the
|
|
124
|
+
* request carries — the field order is the byte-for-byte contract between signer and verifier.
|
|
125
|
+
*/
|
|
126
|
+
export function resumeSigningPayload(body) {
|
|
127
|
+
return utf8.encode(JSON.stringify([
|
|
128
|
+
"ResumeV1",
|
|
129
|
+
body.v,
|
|
130
|
+
body.collectionId,
|
|
131
|
+
body.fromRevision,
|
|
132
|
+
body.latestKnownTailId,
|
|
133
|
+
body.subscriberCoord,
|
|
134
|
+
body.timestamp,
|
|
135
|
+
]));
|
|
136
|
+
}
|
|
137
|
+
// --- codecs (length-framed JSON, mirroring the rest of reactivity) ---
|
|
138
|
+
/** Encode a {@link ResumeV1} as a length-prefixed UTF-8 JSON frame. */
|
|
139
|
+
export function encodeResumeV1(msg, maxMessageBytes = DEFAULT_MAX_MESSAGE_BYTES) {
|
|
140
|
+
return encodeCohortMessage(validateResumeV1(msg), maxMessageBytes);
|
|
141
|
+
}
|
|
142
|
+
/** Decode a length-prefixed {@link ResumeV1} frame. */
|
|
143
|
+
export function decodeResumeV1(bytes, maxMessageBytes) {
|
|
144
|
+
return validateResumeV1(decodeCohortMessage(bytes, maxMessageBytes));
|
|
145
|
+
}
|
|
146
|
+
/** Encode a {@link ResumeReplyV1} as a length-prefixed UTF-8 JSON frame. */
|
|
147
|
+
export function encodeResumeReplyV1(msg, maxMessageBytes = DEFAULT_MAX_MESSAGE_BYTES) {
|
|
148
|
+
return encodeCohortMessage(validateResumeReplyV1(msg), maxMessageBytes);
|
|
149
|
+
}
|
|
150
|
+
/** Decode a length-prefixed {@link ResumeReplyV1} frame. */
|
|
151
|
+
export function decodeResumeReplyV1(bytes, maxMessageBytes) {
|
|
152
|
+
return validateResumeReplyV1(decodeCohortMessage(bytes, maxMessageBytes));
|
|
153
|
+
}
|
|
154
|
+
// --- serving-cohort classification ---
|
|
155
|
+
/** The rolling checkpoint's summary; non-undefined because the caller already proved it abuts the ring (so non-empty). */
|
|
156
|
+
function requireRollingSummary(rolling) {
|
|
157
|
+
const summary = rolling.summary();
|
|
158
|
+
if (summary === undefined) {
|
|
159
|
+
throw new Error("resumeCheckpointChain: rolling checkpoint abuts the ring yet produced no summary (invariant violation)");
|
|
160
|
+
}
|
|
161
|
+
return summary;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Build the served checkpoint chain for a `checkpoint_window` resume: the **shortest** contiguous low→high
|
|
165
|
+
* chain of {@link CheckpointSummary}s that both covers `fromRevision` and **abuts the ring's low edge**
|
|
166
|
+
* (`top.toRevision === ringLow − 1`), or `undefined` when no gap-free chain exists. Shared by
|
|
167
|
+
* {@link classifyResume} and {@link serveResume} so they cannot disagree about the served shape.
|
|
168
|
+
*
|
|
169
|
+
* Cases are evaluated in precedence order (this ordering preserves every existing classification test):
|
|
170
|
+
*
|
|
171
|
+
* - **A — rolling wins.** The rolling checkpoint abuts the ring (it is fed by ring eviction, so it always
|
|
172
|
+
* does) and covers `fromRevision`: the fresher, narrower single link `[rolling]`.
|
|
173
|
+
* - **B1 — inherited abuts the ring directly.** No new-tail rolling checkpoint has formed between the
|
|
174
|
+
* inherited handoff and the ring yet (the `12.51` abut case): the single link `[inherited]`.
|
|
175
|
+
* - **B2 — the bridge.** The inherited handoff abuts the new tail's rolling checkpoint, which abuts the
|
|
176
|
+
* ring: the two-link `[inherited, rolling]` chain spans inherited → rolling → ring with no gap.
|
|
177
|
+
*
|
|
178
|
+
* Any other shape (a gap below `fromRevision`, or a gap between the windows) returns `undefined` → the
|
|
179
|
+
* request falls to `out_of_window` (an honest chain read). `ringLow === undefined` (no live ring to abut /
|
|
180
|
+
* no `recentEntries`) also returns `undefined`.
|
|
181
|
+
*/
|
|
182
|
+
function resumeCheckpointChain(fromRevision, ringLow, rolling, inherited) {
|
|
183
|
+
if (ringLow === undefined) {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
const ringAbut = ringLow - 1;
|
|
187
|
+
// Case A — the rolling checkpoint wins (fresher, narrower). `toRevision === ringAbut` implies it is
|
|
188
|
+
// non-empty, so the summary is defined (asserted in requireRollingSummary).
|
|
189
|
+
if (rolling !== undefined && rolling.toRevision === ringAbut && rolling.covers(fromRevision)) {
|
|
190
|
+
return [requireRollingSummary(rolling)];
|
|
191
|
+
}
|
|
192
|
+
// Case B1 — the inherited handoff abuts the ring directly (the 12.51 abut case): a single link.
|
|
193
|
+
if (inherited !== undefined && inherited.toRevision === ringAbut && checkpointCovers(inherited, fromRevision)) {
|
|
194
|
+
return [inherited];
|
|
195
|
+
}
|
|
196
|
+
// Case B2 — the bridge: inherited abuts the rolling checkpoint, which abuts the ring. The two-link chain
|
|
197
|
+
// carries inherited → rolling → ring with no gap, and each link keeps its own already-correct merged
|
|
198
|
+
// digest (nothing is re-folded, so a per-collection override fold composes trivially).
|
|
199
|
+
if (inherited !== undefined &&
|
|
200
|
+
rolling !== undefined &&
|
|
201
|
+
rolling.toRevision === ringAbut &&
|
|
202
|
+
inherited.toRevision + 1 === rolling.fromRevision &&
|
|
203
|
+
checkpointCovers(inherited, fromRevision)) {
|
|
204
|
+
return [inherited, requireRollingSummary(rolling)];
|
|
205
|
+
}
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Classify a resume request against the serving cohort's stacked windows. The decision order is:
|
|
210
|
+
*
|
|
211
|
+
* 1. **tail_rotated** — `req.latestKnownTailId !== currentTailId`. A stale tail means the tree migrated,
|
|
212
|
+
* so the lag classification below is moot.
|
|
213
|
+
* 2. **backfill** — `fromRevision` is at/above the replay ring's low edge (within, or already current).
|
|
214
|
+
* 3. **checkpoint_window** — below the ring but a gap-free {@link resumeCheckpointChain} covers it: the
|
|
215
|
+
* rolling checkpoint (steady state), the inherited cross-rotation handoff (`docs/reactivity.md` §Tail
|
|
216
|
+
* rotation step 5 — "the new tail holds the old checkpoint"), or the two-link `[inherited, rolling]`
|
|
217
|
+
* bridge spanning both when the new tail's own rolling checkpoint has formed between the handoff and the
|
|
218
|
+
* ring.
|
|
219
|
+
* 4. **out_of_window** — older than even the deepest window, or a gap leaves no contiguous chain to the
|
|
220
|
+
* ring (a chain read), or every window is empty/absent.
|
|
221
|
+
*/
|
|
222
|
+
export function classifyResume(req, buffer, checkpoint, currentTailId, inherited) {
|
|
223
|
+
if (req.latestKnownTailId !== currentTailId) {
|
|
224
|
+
return "tail_rotated";
|
|
225
|
+
}
|
|
226
|
+
const low = buffer.lowRevision;
|
|
227
|
+
if (low !== undefined && req.fromRevision >= low) {
|
|
228
|
+
return "backfill";
|
|
229
|
+
}
|
|
230
|
+
return resumeCheckpointChain(req.fromRevision, low, checkpoint, inherited) !== undefined
|
|
231
|
+
? "checkpoint_window"
|
|
232
|
+
: "out_of_window";
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Serve a {@link ResumeV1} from a cohort's stacked windows, producing the classified {@link ResumeReplyV1}.
|
|
236
|
+
* Pure over the supplied snapshot — no I/O, no clock. A request whose `collectionId` does not match
|
|
237
|
+
* `expectedCollectionId` is rejected (a resume is collection-scoped).
|
|
238
|
+
*/
|
|
239
|
+
export function serveResume(req, deps) {
|
|
240
|
+
if (req.collectionId !== deps.expectedCollectionId) {
|
|
241
|
+
failWire(`serveResume: request collectionId does not match this cohort's collection`);
|
|
242
|
+
}
|
|
243
|
+
const result = classifyResume(req, deps.buffer, deps.checkpoint, deps.currentTailId, deps.inheritedCheckpoint);
|
|
244
|
+
switch (result) {
|
|
245
|
+
case "backfill": {
|
|
246
|
+
const high = deps.buffer.highRevision ?? deps.currentRevision;
|
|
247
|
+
const entries = deps.buffer.range(req.fromRevision, high).map((e) => e.payload);
|
|
248
|
+
return { v: 1, result, entries, currentRevision: deps.currentRevision };
|
|
249
|
+
}
|
|
250
|
+
case "checkpoint_window": {
|
|
251
|
+
// The contiguous chain the helper built — rolling alone, inherited alone, or the two-link bridge.
|
|
252
|
+
// classifyResume returned checkpoint_window iff this chain is present, so it is non-undefined here
|
|
253
|
+
// (the two calls share inputs, so they cannot disagree).
|
|
254
|
+
const chain = resumeCheckpointChain(req.fromRevision, deps.buffer.lowRevision, deps.checkpoint, deps.inheritedCheckpoint);
|
|
255
|
+
if (chain === undefined) {
|
|
256
|
+
throw new Error("serveResume: checkpoint_window classification produced no checkpoint chain (invariant violation)");
|
|
257
|
+
}
|
|
258
|
+
const recentEntries = deps.buffer.entries().map((e) => e.payload);
|
|
259
|
+
return { v: 1, result, checkpoints: chain, recentEntries, currentRevision: deps.currentRevision };
|
|
260
|
+
}
|
|
261
|
+
case "out_of_window":
|
|
262
|
+
return { v: 1, result, currentTailId: deps.currentTailId, currentRevision: deps.currentRevision };
|
|
263
|
+
case "tail_rotated":
|
|
264
|
+
return {
|
|
265
|
+
v: 1,
|
|
266
|
+
result,
|
|
267
|
+
newTailId: deps.currentTailId,
|
|
268
|
+
newRevisionAtRotation: deps.rotationRevision ?? deps.currentRevision,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Apply a {@link ResumeReplyV1} on the subscriber side, returning the {@link ResumeApplyOutcome}. Backfill
|
|
274
|
+
* and checkpoint-window entries re-enter through {@link ReactivitySubscriber.onNotification} (so they are
|
|
275
|
+
* verified, contiguity-checked, and deduped exactly like live notifications); the other variants escalate
|
|
276
|
+
* to the application via the supplied sinks. A checkpoint whose bracketing endpoints do not verify is
|
|
277
|
+
* **not** applied — the subscriber chain-reads instead (a forged checkpoint must never advance state).
|
|
278
|
+
*/
|
|
279
|
+
export async function applyResumeReply(reply, deps) {
|
|
280
|
+
switch (reply.result) {
|
|
281
|
+
case "backfill": {
|
|
282
|
+
for (const n of reply.entries ?? []) {
|
|
283
|
+
await deps.subscriber.onNotification(n);
|
|
284
|
+
}
|
|
285
|
+
return "backfilled";
|
|
286
|
+
}
|
|
287
|
+
case "checkpoint_window": {
|
|
288
|
+
const summaries = reply.checkpoints;
|
|
289
|
+
if (summaries === undefined || summaries.length === 0) {
|
|
290
|
+
failWire(`applyResumeReply: checkpoint_window reply is missing its checkpoint chain`);
|
|
291
|
+
}
|
|
292
|
+
// Low-edge guard on the **lowest** link: endpoint verification proves each link's bounds are *real*
|
|
293
|
+
// committed revisions, but not that the chain connects to the subscriber's contiguity head. If the
|
|
294
|
+
// lowest `fromRevision` sits above `lastRevision + 1` there is an un-summarized gap below the chain;
|
|
295
|
+
// rebaselining would silently skip those revisions. The honest cohort never sends such a reply
|
|
296
|
+
// (`classifyResume` only picks `checkpoint_window` when the chain covers `lastRevision + 1`), so a
|
|
297
|
+
// non-abutting low edge is a forged/buggy reply — chain-read rather than advance past a gap.
|
|
298
|
+
if (summaries[0].fromRevision > deps.subscriber.lastRevision + 1) {
|
|
299
|
+
deps.onChainRead?.(reply.currentTailId, reply.currentRevision);
|
|
300
|
+
return "checkpoint_untrusted";
|
|
301
|
+
}
|
|
302
|
+
// Intra-chain contiguity (defense in depth: the codec already checks every *decoded* reply, but an
|
|
303
|
+
// in-process reply may bypass the codec). A gap/overlap between links would skip or double revisions.
|
|
304
|
+
for (let i = 1; i < summaries.length; i++) {
|
|
305
|
+
if (summaries[i].fromRevision !== summaries[i - 1].toRevision + 1) {
|
|
306
|
+
deps.onChainRead?.(reply.currentTailId, reply.currentRevision);
|
|
307
|
+
return "checkpoint_untrusted";
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Verify EVERY link's bracketing endpoints **before applying anything** — a single forged link kills
|
|
311
|
+
// the whole reply, so nothing is delivered and `lastRevision` is unchanged (no partial advance).
|
|
312
|
+
for (const summary of summaries) {
|
|
313
|
+
const verdict = await verifyCheckpointEndpoints(summary, deps.verifier);
|
|
314
|
+
if (verdict !== "verified") {
|
|
315
|
+
deps.onChainRead?.(reply.currentTailId, reply.currentRevision);
|
|
316
|
+
return "checkpoint_untrusted";
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Apply in order: the application sees each link's merged-digest hint, then the contiguity head
|
|
320
|
+
// advances past that link. `rebaseline` is monotone, so the head lands at the top link's
|
|
321
|
+
// `toRevision`; the recent entries (immediately above it) then replay gap-free — any recent entry
|
|
322
|
+
// at/below the head dedupes (`docs/reactivity.md` §Parent checkpoint summaries).
|
|
323
|
+
for (const summary of summaries) {
|
|
324
|
+
deps.onCheckpointDigest?.(summary);
|
|
325
|
+
deps.subscriber.rebaseline(summary.toRevision);
|
|
326
|
+
}
|
|
327
|
+
for (const n of reply.recentEntries ?? []) {
|
|
328
|
+
await deps.subscriber.onNotification(n);
|
|
329
|
+
}
|
|
330
|
+
return "checkpoint_applied";
|
|
331
|
+
}
|
|
332
|
+
case "out_of_window": {
|
|
333
|
+
deps.onChainRead?.(reply.currentTailId, reply.currentRevision);
|
|
334
|
+
return "out_of_window";
|
|
335
|
+
}
|
|
336
|
+
case "tail_rotated": {
|
|
337
|
+
deps.onTailRotated?.(reply.newTailId ?? "", reply.newRevisionAtRotation ?? 0);
|
|
338
|
+
return "tail_rotated";
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
class MapStickyCohortHintCache {
|
|
343
|
+
byCollection = new Map();
|
|
344
|
+
get(collectionId) {
|
|
345
|
+
return this.byCollection.get(collectionId);
|
|
346
|
+
}
|
|
347
|
+
set(collectionId, hint) {
|
|
348
|
+
this.byCollection.set(collectionId, hint);
|
|
349
|
+
}
|
|
350
|
+
invalidate(collectionId) {
|
|
351
|
+
this.byCollection.delete(collectionId);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/** Build a {@link StickyCohortHintCache} (a plain per-collection map; sticky across reconnects). */
|
|
355
|
+
export function createStickyCohortHintCache() {
|
|
356
|
+
return new MapStickyCohortHintCache();
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/reactivity/resume.ts"],"names":[],"mappings":"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"}
|