@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,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactivity — recover RPC envelope (`docs/reactivity.md` §Backfill RPC, §Resume, §Wire formats).
|
|
3
|
+
*
|
|
4
|
+
* The db-p2p recover transport runs **one** request-reply protocol
|
|
5
|
+
* (`/optimystic/reactivity/1.0.0/recover`) carrying either a backfill or a resume exchange. Rather than
|
|
6
|
+
* disambiguate two payload shapes structurally off the wire, this module owns an explicit discriminated
|
|
7
|
+
* wrapper so the `kind` discriminant is authoritative: a `kind: "backfill"` frame MUST carry a `backfill`
|
|
8
|
+
* body and no `resume` body (and vice-versa). db-core owns every reactivity wire codec, so the envelope
|
|
9
|
+
* lives here next to the {@link import("./backfill.js").BackfillV1} / {@link import("./resume.js").ResumeV1}
|
|
10
|
+
* payloads it wraps and reuses their per-message validators for the inner branches.
|
|
11
|
+
*
|
|
12
|
+
* **Reply-only `"rotated"` kind.** A subscriber only ever *asks* for a backfill or a resume, so
|
|
13
|
+
* {@link RecoverKind} (the request discriminant) is the narrower `"backfill" | "resume"`. A *reply*,
|
|
14
|
+
* however, may carry a third kind — `"rotated"`, the drain-window {@link RotationRedirectV1} a serving
|
|
15
|
+
* cohort hands a request that arrived at an outgoing tail after it rotated (`docs/reactivity.md` §Tail
|
|
16
|
+
* rotation). The recover reply is the only reactivity surface a subscriber reaches a serving cohort on (a
|
|
17
|
+
* fresh subscribe rides generic cohort-topic `service.register`, whose walk only understands tier-`Promoted`,
|
|
18
|
+
* never a topic redirect), so the redirect rides the recover reply rather than registration.
|
|
19
|
+
*
|
|
20
|
+
* **Forward-compat (fail-closed).** A decoder that predates the `"rotated"` kind rejects it outright — its
|
|
21
|
+
* `kind` narrower only admits `backfill`/`resume` — so an older peer cannot misread a redirect; it simply
|
|
22
|
+
* treats the reply as malformed (no reply / decode failure) and the subscriber falls back to a chain read,
|
|
23
|
+
* which is always safe. A redirect is therefore an *optional optimization* a newer serving cohort offers,
|
|
24
|
+
* never a correctness dependency.
|
|
25
|
+
*
|
|
26
|
+
* Wire conventions match the rest of reactivity: JSON, byte fields base64url, `v: 1`, per-message
|
|
27
|
+
* structural validation on decode (a `kind`/branch mismatch is `failWire`).
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import {
|
|
31
|
+
decodeCohortMessage,
|
|
32
|
+
encodeCohortMessage,
|
|
33
|
+
DEFAULT_MAX_MESSAGE_BYTES,
|
|
34
|
+
} from "../cohort-topic/wire/codec.js";
|
|
35
|
+
import { asObject, failWire, requireV1 } from "./wire-validate.js";
|
|
36
|
+
import { validateBackfillV1, validateBackfillReplyV1, type BackfillV1, type BackfillReplyV1 } from "./backfill.js";
|
|
37
|
+
import { validateResumeV1, validateResumeReplyV1, type ResumeV1, type ResumeReplyV1 } from "./resume.js";
|
|
38
|
+
import { validateRotationRedirectV1, type RotationRedirectV1 } from "./rotation.js";
|
|
39
|
+
|
|
40
|
+
/** The recover RPC **request** discriminant: which of the two recovery exchanges a subscriber asks for. */
|
|
41
|
+
export type RecoverKind = "backfill" | "resume";
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The recover RPC **reply** discriminant. A superset of {@link RecoverKind}: a reply may additionally be a
|
|
45
|
+
* `"rotated"` {@link RotationRedirectV1} (a subscriber never *asks* for a redirect, so the request kind
|
|
46
|
+
* stays narrower).
|
|
47
|
+
*/
|
|
48
|
+
export type RecoverReplyKind = RecoverKind | "rotated";
|
|
49
|
+
|
|
50
|
+
/** A subscriber's recover request — exactly one of {@link backfill} / {@link resume}, per {@link kind}. */
|
|
51
|
+
export interface RecoverRequestV1 {
|
|
52
|
+
v: 1;
|
|
53
|
+
kind: RecoverKind;
|
|
54
|
+
/** Present iff `kind === "backfill"`. */
|
|
55
|
+
backfill?: BackfillV1;
|
|
56
|
+
/** Present iff `kind === "resume"`. */
|
|
57
|
+
resume?: ResumeV1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The cohort's recover reply — exactly one of {@link backfillReply} / {@link resumeReply} / {@link rotated},
|
|
62
|
+
* per {@link kind}.
|
|
63
|
+
*/
|
|
64
|
+
export interface RecoverReplyV1 {
|
|
65
|
+
v: 1;
|
|
66
|
+
kind: RecoverReplyKind;
|
|
67
|
+
/** Present iff `kind === "backfill"`. */
|
|
68
|
+
backfillReply?: BackfillReplyV1;
|
|
69
|
+
/** Present iff `kind === "resume"`. */
|
|
70
|
+
resumeReply?: ResumeReplyV1;
|
|
71
|
+
/** Present iff `kind === "rotated"` — the drain-window redirect to the rotated tree. */
|
|
72
|
+
rotated?: RotationRedirectV1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Narrow `obj.kind` to a {@link RecoverKind} (request side), throwing on any other value. */
|
|
76
|
+
function reqKind(obj: Record<string, unknown>, what: string): RecoverKind {
|
|
77
|
+
const kind = obj["kind"];
|
|
78
|
+
if (kind !== "backfill" && kind !== "resume") {
|
|
79
|
+
failWire(`${what}: field "kind" must be "backfill" or "resume"`);
|
|
80
|
+
}
|
|
81
|
+
return kind;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Narrow `obj.kind` to a {@link RecoverReplyKind} (reply side — also admits `"rotated"`). */
|
|
85
|
+
function reqReplyKind(obj: Record<string, unknown>, what: string): RecoverReplyKind {
|
|
86
|
+
const kind = obj["kind"];
|
|
87
|
+
if (kind !== "backfill" && kind !== "resume" && kind !== "rotated") {
|
|
88
|
+
failWire(`${what}: field "kind" must be "backfill", "resume", or "rotated"`);
|
|
89
|
+
}
|
|
90
|
+
return kind;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Reject a frame carrying `branch`, the body that does not belong to the declared `kind`. */
|
|
94
|
+
function rejectStrayBranch(obj: Record<string, unknown>, branch: string, what: string): void {
|
|
95
|
+
if (obj[branch] !== undefined) {
|
|
96
|
+
failWire(`${what}: a "${branch}" body is present but does not match the declared kind`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Narrow an already-parsed value to {@link RecoverRequestV1}, throwing on any defect or kind/branch mismatch. */
|
|
101
|
+
export function validateRecoverRequestV1(value: unknown): RecoverRequestV1 {
|
|
102
|
+
const what = "RecoverRequestV1";
|
|
103
|
+
const obj = asObject(value, what);
|
|
104
|
+
requireV1(obj, what);
|
|
105
|
+
const kind = reqKind(obj, what);
|
|
106
|
+
if (kind === "backfill") {
|
|
107
|
+
rejectStrayBranch(obj, "resume", what);
|
|
108
|
+
return { v: 1, kind, backfill: validateBackfillV1(obj["backfill"]) };
|
|
109
|
+
}
|
|
110
|
+
rejectStrayBranch(obj, "backfill", what);
|
|
111
|
+
return { v: 1, kind, resume: validateResumeV1(obj["resume"]) };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Narrow an already-parsed value to {@link RecoverReplyV1}, throwing on any defect or kind/branch mismatch. */
|
|
115
|
+
export function validateRecoverReplyV1(value: unknown): RecoverReplyV1 {
|
|
116
|
+
const what = "RecoverReplyV1";
|
|
117
|
+
const obj = asObject(value, what);
|
|
118
|
+
requireV1(obj, what);
|
|
119
|
+
const kind = reqReplyKind(obj, what);
|
|
120
|
+
if (kind === "backfill") {
|
|
121
|
+
rejectStrayBranch(obj, "resumeReply", what);
|
|
122
|
+
rejectStrayBranch(obj, "rotated", what);
|
|
123
|
+
return { v: 1, kind, backfillReply: validateBackfillReplyV1(obj["backfillReply"]) };
|
|
124
|
+
}
|
|
125
|
+
if (kind === "resume") {
|
|
126
|
+
rejectStrayBranch(obj, "backfillReply", what);
|
|
127
|
+
rejectStrayBranch(obj, "rotated", what);
|
|
128
|
+
return { v: 1, kind, resumeReply: validateResumeReplyV1(obj["resumeReply"]) };
|
|
129
|
+
}
|
|
130
|
+
rejectStrayBranch(obj, "backfillReply", what);
|
|
131
|
+
rejectStrayBranch(obj, "resumeReply", what);
|
|
132
|
+
return { v: 1, kind, rotated: validateRotationRedirectV1(obj["rotated"]) };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Encode a {@link RecoverRequestV1} as a length-prefixed UTF-8 JSON frame. */
|
|
136
|
+
export function encodeRecoverRequestV1(msg: RecoverRequestV1, maxMessageBytes: number = DEFAULT_MAX_MESSAGE_BYTES): Uint8Array {
|
|
137
|
+
return encodeCohortMessage(validateRecoverRequestV1(msg), maxMessageBytes);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Decode a length-prefixed {@link RecoverRequestV1} frame. */
|
|
141
|
+
export function decodeRecoverRequestV1(bytes: Uint8Array, maxMessageBytes?: number): RecoverRequestV1 {
|
|
142
|
+
return validateRecoverRequestV1(decodeCohortMessage(bytes, maxMessageBytes));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Encode a {@link RecoverReplyV1} as a length-prefixed UTF-8 JSON frame. */
|
|
146
|
+
export function encodeRecoverReplyV1(msg: RecoverReplyV1, maxMessageBytes: number = DEFAULT_MAX_MESSAGE_BYTES): Uint8Array {
|
|
147
|
+
return encodeCohortMessage(validateRecoverReplyV1(msg), maxMessageBytes);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Decode a length-prefixed {@link RecoverReplyV1} frame. */
|
|
151
|
+
export function decodeRecoverReplyV1(bytes: Uint8Array, maxMessageBytes?: number): RecoverReplyV1 {
|
|
152
|
+
return validateRecoverReplyV1(decodeCohortMessage(bytes, maxMessageBytes));
|
|
153
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactivity — replay window (`docs/reactivity.md` §Replay window).
|
|
3
|
+
*
|
|
4
|
+
* Each forwarder and the tail cohort keep a per-collection ring buffer of the last `W` notifications
|
|
5
|
+
* (default 256). Entries are gossiped across the cohort ({@link ReplayBuffer.serialize} /
|
|
6
|
+
* {@link ReplayBuffer.merge}) so **any** cohort member — not just the primary — can serve a replay if
|
|
7
|
+
* the primary is unavailable. This buffer is the substrate the backfill/resume ticket reads from; this
|
|
8
|
+
* ticket owns its construction, ring semantics, gossip replication, and the any-member-serves property.
|
|
9
|
+
*
|
|
10
|
+
* The ring is keyed by revision, not by insertion slot, so a retransmit that arrives out of order (the
|
|
11
|
+
* recovery case the dedupe window admits) lands at its correct revision. Capacity `W` bounds the number
|
|
12
|
+
* of *distinct revisions* retained; the lowest revision is dropped when a new one overflows the ring.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { W_DEFAULT } from "./config.js";
|
|
16
|
+
import type { NotificationV1 } from "./wire.js";
|
|
17
|
+
|
|
18
|
+
/** One replay-buffer entry: the full signed notification plus its local receive time. */
|
|
19
|
+
export interface RevisionEntry {
|
|
20
|
+
readonly revision: number;
|
|
21
|
+
/** The full signed notification (retains the original threshold signature; backfills verify end-to-end). */
|
|
22
|
+
readonly payload: NotificationV1;
|
|
23
|
+
/** Unix ms. */
|
|
24
|
+
readonly receivedAt: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Serializable replay-buffer state for intra-cohort gossip replication. */
|
|
28
|
+
export interface ReplayBufferStateV1 {
|
|
29
|
+
readonly capacity: number;
|
|
30
|
+
readonly entries: readonly RevisionEntry[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** A per-collection ring buffer of the last `W` notifications, gossip-replicated across the cohort. */
|
|
34
|
+
export interface ReplayBuffer {
|
|
35
|
+
/** Configured ring capacity `W`. */
|
|
36
|
+
readonly capacity: number;
|
|
37
|
+
/** Number of distinct revisions currently retained. */
|
|
38
|
+
readonly size: number;
|
|
39
|
+
/** Lowest retained revision, or `undefined` when empty. */
|
|
40
|
+
readonly lowRevision: number | undefined;
|
|
41
|
+
/** Highest retained revision, or `undefined` when empty. */
|
|
42
|
+
readonly highRevision: number | undefined;
|
|
43
|
+
/** Append (or replace, on a retransmit) the entry for its revision, evicting the lowest on overflow. */
|
|
44
|
+
append(entry: RevisionEntry): void;
|
|
45
|
+
/** The entry for `revision`, or `undefined` if not in the window. */
|
|
46
|
+
get(revision: number): RevisionEntry | undefined;
|
|
47
|
+
/** Entries with `from <= revision <= to`, ascending — the intersection with the window. */
|
|
48
|
+
range(from: number, to: number): RevisionEntry[];
|
|
49
|
+
/** All retained entries, ascending by revision. */
|
|
50
|
+
entries(): RevisionEntry[];
|
|
51
|
+
/** Snapshot for gossip. */
|
|
52
|
+
serialize(): ReplayBufferStateV1;
|
|
53
|
+
/** Merge another member's gossiped buffer (newer `receivedAt` wins a per-revision tie). */
|
|
54
|
+
merge(state: ReplayBufferStateV1): void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
class RingReplayBuffer implements ReplayBuffer {
|
|
58
|
+
readonly capacity: number;
|
|
59
|
+
/** revision → entry; trimmed to the highest `capacity` revisions. */
|
|
60
|
+
private readonly byRevision = new Map<number, RevisionEntry>();
|
|
61
|
+
private readonly onEvict?: (entry: RevisionEntry) => void;
|
|
62
|
+
|
|
63
|
+
constructor(capacity: number, onEvict?: (entry: RevisionEntry) => void) {
|
|
64
|
+
if (!Number.isInteger(capacity) || capacity < 1) {
|
|
65
|
+
throw new RangeError(`reactivity replay buffer: capacity must be an integer >= 1, got ${capacity}`);
|
|
66
|
+
}
|
|
67
|
+
this.capacity = capacity;
|
|
68
|
+
this.onEvict = onEvict;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
get size(): number {
|
|
72
|
+
return this.byRevision.size;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get lowRevision(): number | undefined {
|
|
76
|
+
return this.size === 0 ? undefined : Math.min(...this.byRevision.keys());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
get highRevision(): number | undefined {
|
|
80
|
+
return this.size === 0 ? undefined : Math.max(...this.byRevision.keys());
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
append(entry: RevisionEntry): void {
|
|
84
|
+
this.byRevision.set(entry.revision, entry);
|
|
85
|
+
this.trim();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
get(revision: number): RevisionEntry | undefined {
|
|
89
|
+
return this.byRevision.get(revision);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
range(from: number, to: number): RevisionEntry[] {
|
|
93
|
+
// Iterate the retained entries (≤ capacity) rather than every integer in `[from, to]`: a backfill
|
|
94
|
+
// request carries a subscriber-supplied range that may be arbitrarily wide, so a per-integer scan
|
|
95
|
+
// would be an unbounded loop on attacker-controlled input. The intersection with the window is
|
|
96
|
+
// bounded by `capacity` regardless.
|
|
97
|
+
return this.entries().filter((e) => e.revision >= from && e.revision <= to);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
entries(): RevisionEntry[] {
|
|
101
|
+
return [...this.byRevision.values()].sort((a, b) => a.revision - b.revision);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
serialize(): ReplayBufferStateV1 {
|
|
105
|
+
return { capacity: this.capacity, entries: this.entries() };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
merge(state: ReplayBufferStateV1): void {
|
|
109
|
+
for (const entry of state.entries) {
|
|
110
|
+
const existing = this.byRevision.get(entry.revision);
|
|
111
|
+
// Per-revision convergence: the freshest receiver's copy wins (they carry the same end-to-end
|
|
112
|
+
// signature, so this only breaks ties on `receivedAt`, never trusts a forged payload).
|
|
113
|
+
if (existing === undefined || entry.receivedAt > existing.receivedAt) {
|
|
114
|
+
this.byRevision.set(entry.revision, entry);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
this.trim();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Evict the lowest revisions until at most `capacity` distinct revisions remain. */
|
|
121
|
+
private trim(): void {
|
|
122
|
+
while (this.byRevision.size > this.capacity) {
|
|
123
|
+
const lowest = Math.min(...this.byRevision.keys());
|
|
124
|
+
const evicted = this.byRevision.get(lowest)!;
|
|
125
|
+
this.byRevision.delete(lowest);
|
|
126
|
+
// Hand the retired revision to the (optional) observer — the rolling parent checkpoint
|
|
127
|
+
// (`docs/reactivity.md` §Parent checkpoint summaries) feeds on exactly these evictions so its
|
|
128
|
+
// span tracks the window immediately below the ring's low edge.
|
|
129
|
+
this.onEvict?.(evicted);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Build a {@link ReplayBuffer} with capacity `W` (default {@link W_DEFAULT}). `onEvict`, when supplied, is
|
|
136
|
+
* invoked with each entry retired from the ring's low edge (the {@link PushState} wires it to the rolling
|
|
137
|
+
* checkpoint so revisions leaving the replay window roll into the parent-checkpoint summary).
|
|
138
|
+
*/
|
|
139
|
+
export function createReplayBuffer(capacity: number = W_DEFAULT, onEvict?: (entry: RevisionEntry) => void): ReplayBuffer {
|
|
140
|
+
return new RingReplayBuffer(capacity, onEvict);
|
|
141
|
+
}
|