@optimystic/db-core 0.21.0 → 0.24.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.
Files changed (185) hide show
  1. package/README.md +336 -336
  2. package/dist/src/btree/btree.d.ts +2 -1
  3. package/dist/src/btree/btree.d.ts.map +1 -1
  4. package/dist/src/btree/btree.js +1 -1
  5. package/dist/src/btree/btree.js.map +1 -1
  6. package/dist/src/chain/chain.d.ts +1 -1
  7. package/dist/src/chain/chain.d.ts.map +1 -1
  8. package/dist/src/chain/chain.js +1 -1
  9. package/dist/src/chain/chain.js.map +1 -1
  10. package/dist/src/cluster/structs.d.ts +39 -1
  11. package/dist/src/cluster/structs.d.ts.map +1 -1
  12. package/dist/src/cluster/structs.js +24 -0
  13. package/dist/src/cluster/structs.js.map +1 -1
  14. package/dist/src/collection/collection.d.ts +20 -1
  15. package/dist/src/collection/collection.d.ts.map +1 -1
  16. package/dist/src/collection/collection.js +31 -4
  17. package/dist/src/collection/collection.js.map +1 -1
  18. package/dist/src/collections/diary/diary.d.ts.map +1 -1
  19. package/dist/src/collections/diary/diary.js +2 -1
  20. package/dist/src/collections/diary/diary.js.map +1 -1
  21. package/dist/src/collections/diary/struct.js +1 -1
  22. package/dist/src/collections/diary/struct.js.map +1 -1
  23. package/dist/src/collections/tree/collection-trunk.js +1 -1
  24. package/dist/src/collections/tree/collection-trunk.js.map +1 -1
  25. package/dist/src/collections/tree/struct.d.ts +1 -1
  26. package/dist/src/collections/tree/struct.d.ts.map +1 -1
  27. package/dist/src/collections/tree/struct.js +2 -1
  28. package/dist/src/collections/tree/struct.js.map +1 -1
  29. package/dist/src/collections/tree/tree.d.ts +5 -0
  30. package/dist/src/collections/tree/tree.d.ts.map +1 -1
  31. package/dist/src/collections/tree/tree.js +7 -0
  32. package/dist/src/collections/tree/tree.js.map +1 -1
  33. package/dist/src/log/log.d.ts +1 -1
  34. package/dist/src/log/log.d.ts.map +1 -1
  35. package/dist/src/log/log.js +2 -2
  36. package/dist/src/log/log.js.map +1 -1
  37. package/dist/src/network/i-peer-network.d.ts +16 -0
  38. package/dist/src/network/i-peer-network.d.ts.map +1 -1
  39. package/dist/src/network/struct.d.ts +39 -2
  40. package/dist/src/network/struct.d.ts.map +1 -1
  41. package/dist/src/network/struct.js +18 -0
  42. package/dist/src/network/struct.js.map +1 -1
  43. package/dist/src/testing/test-transactor.d.ts +95 -8
  44. package/dist/src/testing/test-transactor.d.ts.map +1 -1
  45. package/dist/src/testing/test-transactor.js +133 -12
  46. package/dist/src/testing/test-transactor.js.map +1 -1
  47. package/dist/src/transaction/coordinator.d.ts.map +1 -1
  48. package/dist/src/transaction/coordinator.js +2 -1
  49. package/dist/src/transaction/coordinator.js.map +1 -1
  50. package/dist/src/transaction/transaction.d.ts +1 -1
  51. package/dist/src/transaction/transaction.js +1 -1
  52. package/dist/src/transactor/network-transactor.d.ts.map +1 -1
  53. package/dist/src/transactor/network-transactor.js +57 -18
  54. package/dist/src/transactor/network-transactor.js.map +1 -1
  55. package/dist/src/transactor/transactor-source.d.ts.map +1 -1
  56. package/dist/src/transactor/transactor-source.js +25 -2
  57. package/dist/src/transactor/transactor-source.js.map +1 -1
  58. package/dist/src/transform/cache-source.js +1 -1
  59. package/dist/src/transform/cache-source.js.map +1 -1
  60. package/dist/src/transform/helpers.d.ts +6 -1
  61. package/dist/src/transform/helpers.d.ts.map +1 -1
  62. package/dist/src/transform/helpers.js +7 -6
  63. package/dist/src/transform/helpers.js.map +1 -1
  64. package/dist/src/transform/tracker.d.ts.map +1 -1
  65. package/dist/src/transform/tracker.js +2 -1
  66. package/dist/src/transform/tracker.js.map +1 -1
  67. package/package.json +1 -1
  68. package/src/btree/btree.ts +2 -1
  69. package/src/chain/chain.ts +2 -1
  70. package/src/cluster/membership.ts +85 -85
  71. package/src/cluster/structs.ts +43 -4
  72. package/src/cohort-topic/addressing.ts +120 -120
  73. package/src/cohort-topic/antidos/bootstrap-evidence-envelope.ts +253 -253
  74. package/src/cohort-topic/antidos/bootstrap-evidence.ts +106 -106
  75. package/src/cohort-topic/antidos/index.ts +5 -5
  76. package/src/cohort-topic/antidos/rate-limiter.ts +210 -210
  77. package/src/cohort-topic/antidos/replay-guard.ts +146 -146
  78. package/src/cohort-topic/antidos/topic-budget.ts +160 -160
  79. package/src/cohort-topic/antiflood/index.ts +2 -2
  80. package/src/cohort-topic/antiflood/invariants.ts +108 -108
  81. package/src/cohort-topic/antiflood/jitter.ts +117 -117
  82. package/src/cohort-topic/coldstart.ts +237 -237
  83. package/src/cohort-topic/dmax.ts +88 -88
  84. package/src/cohort-topic/gossip/bus.ts +254 -254
  85. package/src/cohort-topic/gossip/index.ts +3 -3
  86. package/src/cohort-topic/gossip/records.ts +45 -45
  87. package/src/cohort-topic/gossip/view.ts +91 -91
  88. package/src/cohort-topic/index.ts +20 -20
  89. package/src/cohort-topic/load/barometer.ts +134 -134
  90. package/src/cohort-topic/load/index.ts +1 -1
  91. package/src/cohort-topic/member-engine.ts +430 -430
  92. package/src/cohort-topic/membership/index.ts +3 -3
  93. package/src/cohort-topic/membership/publisher.ts +163 -163
  94. package/src/cohort-topic/membership/source.ts +41 -41
  95. package/src/cohort-topic/membership/verifier.ts +461 -461
  96. package/src/cohort-topic/ports.ts +157 -157
  97. package/src/cohort-topic/promotion.ts +405 -405
  98. package/src/cohort-topic/registration/bytes.ts +37 -37
  99. package/src/cohort-topic/registration/handoff.ts +154 -154
  100. package/src/cohort-topic/registration/index.ts +6 -6
  101. package/src/cohort-topic/registration/renewal.ts +495 -495
  102. package/src/cohort-topic/registration/sharding.ts +61 -61
  103. package/src/cohort-topic/registration/store.ts +81 -81
  104. package/src/cohort-topic/registration/types.ts +91 -91
  105. package/src/cohort-topic/ring-hash.ts +50 -50
  106. package/src/cohort-topic/service.ts +416 -416
  107. package/src/cohort-topic/sig/index.ts +2 -2
  108. package/src/cohort-topic/sig/payloads.ts +59 -59
  109. package/src/cohort-topic/sig/threshold.ts +64 -64
  110. package/src/cohort-topic/tiers.ts +74 -74
  111. package/src/cohort-topic/traffic.ts +233 -233
  112. package/src/cohort-topic/walk.ts +326 -326
  113. package/src/cohort-topic/willingness.ts +237 -237
  114. package/src/cohort-topic/wire/codec.ts +216 -216
  115. package/src/cohort-topic/wire/index.ts +18 -18
  116. package/src/cohort-topic/wire/payloads.ts +126 -126
  117. package/src/cohort-topic/wire/primitives.ts +188 -188
  118. package/src/cohort-topic/wire/types.ts +475 -475
  119. package/src/cohort-topic/wire/validate.ts +512 -512
  120. package/src/collection/collection-type-registry.ts +37 -37
  121. package/src/collection/collection.ts +32 -4
  122. package/src/collections/diary/diary.ts +68 -67
  123. package/src/collections/diary/struct.ts +1 -1
  124. package/src/collections/tree/collection-trunk.ts +1 -1
  125. package/src/collections/tree/readme.md +4 -0
  126. package/src/collections/tree/struct.ts +3 -1
  127. package/src/collections/tree/tree.ts +320 -312
  128. package/src/log/log.ts +2 -2
  129. package/src/matchmaking/capability-filter.ts +45 -45
  130. package/src/matchmaking/config.ts +98 -98
  131. package/src/matchmaking/index.ts +21 -21
  132. package/src/matchmaking/multi-cohort-seeker.ts +234 -234
  133. package/src/matchmaking/provider.ts +123 -123
  134. package/src/matchmaking/query-eval.ts +105 -105
  135. package/src/matchmaking/seeker-walk.ts +127 -127
  136. package/src/matchmaking/seeker.ts +86 -86
  137. package/src/matchmaking/topic-anchor.ts +90 -90
  138. package/src/matchmaking/voting-quorum.ts +394 -394
  139. package/src/matchmaking/wire.ts +603 -603
  140. package/src/network/i-peer-network.ts +17 -0
  141. package/src/network/stale-failure.ts +43 -43
  142. package/src/network/struct.ts +41 -2
  143. package/src/network/types.ts +37 -37
  144. package/src/reactivity/backfill.ts +220 -220
  145. package/src/reactivity/backpressure.ts +191 -191
  146. package/src/reactivity/checkpoint.ts +308 -308
  147. package/src/reactivity/config.ts +172 -172
  148. package/src/reactivity/dedupe.ts +132 -132
  149. package/src/reactivity/forwarder.ts +87 -87
  150. package/src/reactivity/index.ts +34 -34
  151. package/src/reactivity/notification.ts +123 -123
  152. package/src/reactivity/policy.ts +79 -79
  153. package/src/reactivity/push-state.ts +310 -310
  154. package/src/reactivity/recover.ts +153 -153
  155. package/src/reactivity/replay-buffer.ts +141 -141
  156. package/src/reactivity/resume.ts +549 -549
  157. package/src/reactivity/rotation.ts +415 -415
  158. package/src/reactivity/subscriber.ts +132 -132
  159. package/src/reactivity/subscription.ts +66 -66
  160. package/src/reactivity/topic-anchor.ts +71 -71
  161. package/src/reactivity/verify.ts +73 -73
  162. package/src/reactivity/wire-validate.ts +13 -13
  163. package/src/reactivity/wire.ts +224 -224
  164. package/src/testing/async-wait.ts +65 -65
  165. package/src/testing/index.ts +2 -2
  166. package/src/testing/test-transactor.ts +638 -489
  167. package/src/transaction/coordinator.ts +2 -1
  168. package/src/transaction/errors.ts +91 -91
  169. package/src/transaction/operations-hash.ts +196 -196
  170. package/src/transaction/read-dependency-collector.ts +78 -78
  171. package/src/transaction/transaction.ts +1 -1
  172. package/src/transactor/change-notifier.ts +80 -80
  173. package/src/transactor/index.ts +5 -5
  174. package/src/transactor/network-transactor.ts +58 -19
  175. package/src/transactor/transactor-source.ts +25 -2
  176. package/src/transform/atomic-proxy.ts +92 -92
  177. package/src/transform/cache-source.ts +1 -1
  178. package/src/transform/helpers.ts +159 -158
  179. package/src/transform/tracker.ts +2 -1
  180. package/src/utility/backoff.ts +95 -95
  181. package/src/utility/batch-coordinator.ts +191 -191
  182. package/dist/src/transaction/context.d.ts +0 -60
  183. package/dist/src/transaction/context.d.ts.map +0 -1
  184. package/dist/src/transaction/context.js +0 -91
  185. package/dist/src/transaction/context.js.map +0 -1
@@ -1,79 +1,79 @@
1
- /**
2
- * Reactivity — per-cohort Edge/Core policy (`docs/reactivity.md` §Per-cohort policy).
3
- *
4
- * Reactivity is **T3 (luxury)** at the cohort-topic layer. Two consequences are enforced here, the
5
- * authoritative home for the reactivity producer-side policy:
6
- *
7
- * 1. **Edge nodes never serve as reactivity forwarders** — only as subscribers. A T3 *consumer* is fine
8
- * on Edge (a phone wants notifications); a T3 *producer* is off in the Edge profile. The willingness
9
- * check ({@link import("../cohort-topic/willingness.js")}) already declines T3 admission on an Edge
10
- * node because `edgeProfile().willingTiers` excludes {@link Tier.T3}; this module adds the *reactivity*
11
- * gate at the point a node decides whether to instantiate a {@link PushState} / become a forwarder, so
12
- * the decision is explicit and testable rather than implicit in cohort admission.
13
- * 2. **`delta_max` is Edge 0 / Core 4096** — the authoritative plumbing the origination ticket only
14
- * *consumed*. Re-exported here from {@link import("./config.js")} so the policy surface is singular.
15
- *
16
- * The per-cohort topic budget (`topics_max`) bounds the collections a cohort serves; reactivity needs no
17
- * admission policy beyond the cohort-topic default, so it is not re-implemented here.
18
- */
19
-
20
- import { Tier, type NodeProfile } from "../cohort-topic/tiers.js";
21
- import { deltaMaxForProfile } from "./config.js";
22
- import { PushState, type PushStateInit } from "./push-state.js";
23
-
24
- /**
25
- * Whether a node with `profile` may serve as a reactivity **forwarder** (T3 producer). `true` only when
26
- * the profile is willing to forward T3 — Core by default, an operator-narrowable Core, never Edge.
27
- * Equivalent to `profile.willingTiers.has(Tier.T3)`: Edge's willing set is `{T0, T1}`, so this is `false`
28
- * on every Edge node and on a Core node an operator has restricted away from T3.
29
- */
30
- export function mayServeAsReactivityForwarder(profile: NodeProfile): boolean {
31
- return profile.willingTiers.has(Tier.T3);
32
- }
33
-
34
- /** A subscriber-only node (Edge, or a Core narrowed off T3) attempted to instantiate a reactivity forwarder. */
35
- export class ReactivityForwarderForbiddenError extends Error {
36
- constructor(readonly profileKind: NodeProfile["kind"]) {
37
- super(`reactivity: a ${profileKind} node that does not forward T3 cannot instantiate a forwarder (subscriber-only)`);
38
- this.name = "ReactivityForwarderForbiddenError";
39
- }
40
- }
41
-
42
- /**
43
- * Instantiate a forwarder {@link PushState} **only if** `profile` may forward T3. Returns `undefined` for a
44
- * subscriber-only node (Edge, or a Core narrowed off T3) — the caller does not become a forwarder, leaving
45
- * it a pure subscriber. This is the explicit gate the §Per-cohort policy "Edge nodes never serve as
46
- * reactivity forwarders" rule names; a node consults it before allocating any per-collection push state.
47
- */
48
- export function instantiateForwarderPushState(profile: NodeProfile, init: PushStateInit): PushState | undefined {
49
- return mayServeAsReactivityForwarder(profile) ? new PushState(init) : undefined;
50
- }
51
-
52
- /**
53
- * Like {@link instantiateForwarderPushState} but **throws** {@link ReactivityForwarderForbiddenError} on a
54
- * subscriber-only node, for call sites that treat an Edge forwarder attempt as a programming error rather
55
- * than a silent no-op (e.g. a host wiring that should never route forwarder duty to an Edge node).
56
- */
57
- export function requireForwarderPushState(profile: NodeProfile, init: PushStateInit): PushState {
58
- if (!mayServeAsReactivityForwarder(profile)) {
59
- throw new ReactivityForwarderForbiddenError(profile.kind);
60
- }
61
- return new PushState(init);
62
- }
63
-
64
- /**
65
- * The effective reactivity producer policy for a node profile: whether it may forward, and its `delta_max`
66
- * budget (Edge 0 — reject inbound `delta`, re-read the chain; Core 4096). The single struct a host reads to
67
- * configure reactivity on a node (`docs/reactivity.md` §Per-cohort policy, §Delta payloads).
68
- */
69
- export interface ReactivityNodePolicy {
70
- /** Whether this node may instantiate a forwarder / become a T3 producer. */
71
- readonly mayForward: boolean;
72
- /** `delta_max` (bytes): Core 4096, Edge 0 (declines deltas). */
73
- readonly deltaMaxBytes: number;
74
- }
75
-
76
- /** Resolve the {@link ReactivityNodePolicy} for a profile (forwarder eligibility + `delta_max`). */
77
- export function reactivityNodePolicy(profile: NodeProfile): ReactivityNodePolicy {
78
- return { mayForward: mayServeAsReactivityForwarder(profile), deltaMaxBytes: deltaMaxForProfile(profile) };
79
- }
1
+ /**
2
+ * Reactivity — per-cohort Edge/Core policy (`docs/reactivity.md` §Per-cohort policy).
3
+ *
4
+ * Reactivity is **T3 (luxury)** at the cohort-topic layer. Two consequences are enforced here, the
5
+ * authoritative home for the reactivity producer-side policy:
6
+ *
7
+ * 1. **Edge nodes never serve as reactivity forwarders** — only as subscribers. A T3 *consumer* is fine
8
+ * on Edge (a phone wants notifications); a T3 *producer* is off in the Edge profile. The willingness
9
+ * check ({@link import("../cohort-topic/willingness.js")}) already declines T3 admission on an Edge
10
+ * node because `edgeProfile().willingTiers` excludes {@link Tier.T3}; this module adds the *reactivity*
11
+ * gate at the point a node decides whether to instantiate a {@link PushState} / become a forwarder, so
12
+ * the decision is explicit and testable rather than implicit in cohort admission.
13
+ * 2. **`delta_max` is Edge 0 / Core 4096** — the authoritative plumbing the origination ticket only
14
+ * *consumed*. Re-exported here from {@link import("./config.js")} so the policy surface is singular.
15
+ *
16
+ * The per-cohort topic budget (`topics_max`) bounds the collections a cohort serves; reactivity needs no
17
+ * admission policy beyond the cohort-topic default, so it is not re-implemented here.
18
+ */
19
+
20
+ import { Tier, type NodeProfile } from "../cohort-topic/tiers.js";
21
+ import { deltaMaxForProfile } from "./config.js";
22
+ import { PushState, type PushStateInit } from "./push-state.js";
23
+
24
+ /**
25
+ * Whether a node with `profile` may serve as a reactivity **forwarder** (T3 producer). `true` only when
26
+ * the profile is willing to forward T3 — Core by default, an operator-narrowable Core, never Edge.
27
+ * Equivalent to `profile.willingTiers.has(Tier.T3)`: Edge's willing set is `{T0, T1}`, so this is `false`
28
+ * on every Edge node and on a Core node an operator has restricted away from T3.
29
+ */
30
+ export function mayServeAsReactivityForwarder(profile: NodeProfile): boolean {
31
+ return profile.willingTiers.has(Tier.T3);
32
+ }
33
+
34
+ /** A subscriber-only node (Edge, or a Core narrowed off T3) attempted to instantiate a reactivity forwarder. */
35
+ export class ReactivityForwarderForbiddenError extends Error {
36
+ constructor(readonly profileKind: NodeProfile["kind"]) {
37
+ super(`reactivity: a ${profileKind} node that does not forward T3 cannot instantiate a forwarder (subscriber-only)`);
38
+ this.name = "ReactivityForwarderForbiddenError";
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Instantiate a forwarder {@link PushState} **only if** `profile` may forward T3. Returns `undefined` for a
44
+ * subscriber-only node (Edge, or a Core narrowed off T3) — the caller does not become a forwarder, leaving
45
+ * it a pure subscriber. This is the explicit gate the §Per-cohort policy "Edge nodes never serve as
46
+ * reactivity forwarders" rule names; a node consults it before allocating any per-collection push state.
47
+ */
48
+ export function instantiateForwarderPushState(profile: NodeProfile, init: PushStateInit): PushState | undefined {
49
+ return mayServeAsReactivityForwarder(profile) ? new PushState(init) : undefined;
50
+ }
51
+
52
+ /**
53
+ * Like {@link instantiateForwarderPushState} but **throws** {@link ReactivityForwarderForbiddenError} on a
54
+ * subscriber-only node, for call sites that treat an Edge forwarder attempt as a programming error rather
55
+ * than a silent no-op (e.g. a host wiring that should never route forwarder duty to an Edge node).
56
+ */
57
+ export function requireForwarderPushState(profile: NodeProfile, init: PushStateInit): PushState {
58
+ if (!mayServeAsReactivityForwarder(profile)) {
59
+ throw new ReactivityForwarderForbiddenError(profile.kind);
60
+ }
61
+ return new PushState(init);
62
+ }
63
+
64
+ /**
65
+ * The effective reactivity producer policy for a node profile: whether it may forward, and its `delta_max`
66
+ * budget (Edge 0 — reject inbound `delta`, re-read the chain; Core 4096). The single struct a host reads to
67
+ * configure reactivity on a node (`docs/reactivity.md` §Per-cohort policy, §Delta payloads).
68
+ */
69
+ export interface ReactivityNodePolicy {
70
+ /** Whether this node may instantiate a forwarder / become a T3 producer. */
71
+ readonly mayForward: boolean;
72
+ /** `delta_max` (bytes): Core 4096, Edge 0 (declines deltas). */
73
+ readonly deltaMaxBytes: number;
74
+ }
75
+
76
+ /** Resolve the {@link ReactivityNodePolicy} for a profile (forwarder eligibility + `delta_max`). */
77
+ export function reactivityNodePolicy(profile: NodeProfile): ReactivityNodePolicy {
78
+ return { mayForward: mayServeAsReactivityForwarder(profile), deltaMaxBytes: deltaMaxForProfile(profile) };
79
+ }