@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
package/src/log/log.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { sha256 } from 'multiformats/hashes/sha2'
2
- import { Chain, entryAt } from "../index.js";
2
+ import { Chain, entryAt } from "../chain/chain.js";
3
3
  import { nameof } from "../utility/nameof.js";
4
4
  import type { IBlock, BlockId, ActionId, CollectionId, ChainPath, ActionRev, ActionContext, ChainInitOptions, BlockStore, ReadDependency } from "../index.js";
5
5
  import type { ChainDataNode } from '../chain/chain-nodes.js';
6
6
  import type { LogEntry, ActionEntry, DisputeResolutionProof, InvalidationEntry, RevertedBlock } from "./index.js";
7
- import { LogDataBlockType, LogHeaderBlockType } from "./index.js";
7
+ import { LogDataBlockType, LogHeaderBlockType } from "./struct.js";
8
8
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
9
9
  import type { GetFromResult } from './struct.js';
10
10
 
@@ -1,45 +1,45 @@
1
- /**
2
- * Matchmaking — cohort-side capability-filter evaluation (db-core, pure).
3
- *
4
- * Per `docs/matchmaking.md` §Capability filter: the filter is evaluated **locally at the cohort** and
5
- * is **advisory only** — it biases which providers the cohort returns but is never admission. The
6
- * seeker re-validates the returned set (`registrationSig`) and escalates if the filter matches too
7
- * little (§Edge cases 4). A pathological filter that matches almost nothing is therefore acceptable.
8
- *
9
- * Semantics (`docs/matchmaking.md` §Capability filter / §Wire formats):
10
- * - `must` — every tag must be present in the provider's `capabilities`.
11
- * - `mustNot` — no tag may be present in the provider's `capabilities`.
12
- * - `minBudget` — when set, the provider's `capacityBudget` must be `>= minBudget`.
13
- *
14
- * An absent filter matches every provider.
15
- */
16
-
17
- import type { CapabilityFilter } from "./wire.js";
18
-
19
- /** The provider attributes a {@link CapabilityFilter} is evaluated against. */
20
- export interface FilterableProvider {
21
- readonly capabilities: readonly string[];
22
- readonly capacityBudget: number;
23
- }
24
-
25
- /** True iff `p` satisfies `f` (`must` ⊆ caps, `mustNot` ∩ caps = ∅, `capacityBudget >= minBudget`). */
26
- export function matchesFilter(p: FilterableProvider, f: CapabilityFilter | undefined): boolean {
27
- if (f === undefined) {
28
- return true;
29
- }
30
- const caps = new Set(p.capabilities);
31
- for (const tag of f.must) {
32
- if (!caps.has(tag)) {
33
- return false;
34
- }
35
- }
36
- for (const tag of f.mustNot) {
37
- if (caps.has(tag)) {
38
- return false;
39
- }
40
- }
41
- if (f.minBudget !== undefined && p.capacityBudget < f.minBudget) {
42
- return false;
43
- }
44
- return true;
45
- }
1
+ /**
2
+ * Matchmaking — cohort-side capability-filter evaluation (db-core, pure).
3
+ *
4
+ * Per `docs/matchmaking.md` §Capability filter: the filter is evaluated **locally at the cohort** and
5
+ * is **advisory only** — it biases which providers the cohort returns but is never admission. The
6
+ * seeker re-validates the returned set (`registrationSig`) and escalates if the filter matches too
7
+ * little (§Edge cases 4). A pathological filter that matches almost nothing is therefore acceptable.
8
+ *
9
+ * Semantics (`docs/matchmaking.md` §Capability filter / §Wire formats):
10
+ * - `must` — every tag must be present in the provider's `capabilities`.
11
+ * - `mustNot` — no tag may be present in the provider's `capabilities`.
12
+ * - `minBudget` — when set, the provider's `capacityBudget` must be `>= minBudget`.
13
+ *
14
+ * An absent filter matches every provider.
15
+ */
16
+
17
+ import type { CapabilityFilter } from "./wire.js";
18
+
19
+ /** The provider attributes a {@link CapabilityFilter} is evaluated against. */
20
+ export interface FilterableProvider {
21
+ readonly capabilities: readonly string[];
22
+ readonly capacityBudget: number;
23
+ }
24
+
25
+ /** True iff `p` satisfies `f` (`must` ⊆ caps, `mustNot` ∩ caps = ∅, `capacityBudget >= minBudget`). */
26
+ export function matchesFilter(p: FilterableProvider, f: CapabilityFilter | undefined): boolean {
27
+ if (f === undefined) {
28
+ return true;
29
+ }
30
+ const caps = new Set(p.capabilities);
31
+ for (const tag of f.must) {
32
+ if (!caps.has(tag)) {
33
+ return false;
34
+ }
35
+ }
36
+ for (const tag of f.mustNot) {
37
+ if (caps.has(tag)) {
38
+ return false;
39
+ }
40
+ }
41
+ if (f.minBudget !== undefined && p.capacityBudget < f.minBudget) {
42
+ return false;
43
+ }
44
+ return true;
45
+ }
@@ -1,98 +1,98 @@
1
- /**
2
- * Matchmaking — configuration defaults.
3
- *
4
- * Transcribed from `docs/matchmaking.md` §Configuration. This module owns the matchmaking config
5
- * surface: the **wire/TTL** constants (provider/seeker TTLs, the query limit, the seeker renew grace,
6
- * the aggregate-count minimum tier) AND the seeker **hang-out tuning** rows (`patience_*`,
7
- * `filter_accept_ratio_initial`, `contention_factor_cap`, `requery_interval_ms`, `mean_want_count`)
8
- * consumed by the {@link import("./seeker-walk.js").decide} engine and the db-p2p seeker-walk client.
9
- *
10
- * The TTL/limit constants are wire-stable and do **not** depend on simulator findings; the hang-out
11
- * rows DO (folded via `fold-simulator-findings-into-design-docs`) — they carry the simulator-validated
12
- * defaults (`contention_factor_cap = 4.0`, `mean_want_count = 3`, …; see `docs/matchmaking.md`
13
- * §Configuration "Defaults validated by simulator"). The `push_*` rows belong to the arrival-push
14
- * path (a separate slice) and are intentionally not modeled here.
15
- */
16
-
17
- import type { NodeProfile } from "../cohort-topic/tiers.js";
18
-
19
- /** Provider registration TTL on a Core node (ms). */
20
- export const PROVIDER_TTL_CORE_MS = 90_000;
21
- /** Provider registration TTL on an Edge node (ms). */
22
- export const PROVIDER_TTL_EDGE_MS = 60_000;
23
- /** Seeker registration TTL (ms) — short, since seekers normally don't wait long. */
24
- export const SEEKER_TTL_MS = 10_000;
25
- /** Documented seeker-TTL range (ms); `SEEKER_TTL_MS` sits inside it. */
26
- export const SEEKER_TTL_MIN_MS = 5_000;
27
- export const SEEKER_TTL_MAX_MS = 15_000;
28
- /** Max entries returned in a single `QueryV1` reply. */
29
- export const QUERY_LIMIT_MAX = 256;
30
- /** Grace window a seeker may keep querying after its TTL expires (ms). */
31
- export const SEEKER_RENEW_GRACE_MS = 5_000;
32
- /** Root cohorts produce aggregate counts only when tree depth ≥ this. */
33
- export const AGGREGATE_COUNT_MINIMUM_TIER = 1;
34
-
35
- // --- Seeker hang-out tuning (simulator-folded; consumed by seeker-walk.ts + the walk client) ---
36
-
37
- /** Fallback `patienceMs` when a caller does not specify it per-task (ms). */
38
- export const PATIENCE_DEFAULT_MS = 10_000;
39
- /** Fraction of remaining patience spent at one tier before considering escalation (1.0 = spend it all here). */
40
- export const PATIENCE_PER_TIER_FRACTION = 1.0;
41
- /** Starting estimate for `filterAcceptRatio`, refined per walk from observed query yields. */
42
- export const FILTER_ACCEPT_RATIO_INITIAL = 1.0;
43
- /** Upper bound on the contention multiplier in the hang-out decision (simulator-validated global scalar). */
44
- export const CONTENTION_FACTOR_CAP = 4.0;
45
- /** Mean `wantCount` assumed for competing seekers in the contention estimate (small constant; simulator value). */
46
- export const MEAN_WANT_COUNT_DEFAULT = 3;
47
- /** How often a hanging-out seeker re-issues `QueryV1` on the non-push (poll) path (ms). */
48
- export const REQUERY_INTERVAL_MS = 1_000;
49
- /** Window the seeker's primary batches fresh matchable arrivals before flushing one push (ms; arrival-push path). */
50
- export const PUSH_COALESCE_MS = 250;
51
- /** Sparse fallback `QueryV1` cadence for a push-aware hanging-out seeker (ms; arrival-push path). */
52
- export const PUSH_SAFETY_POLL_MS = 5_000;
53
-
54
- /**
55
- * The seeker hang-out decision tuning (`docs/matchmaking.md` §Hang-out vs. continue / §Configuration).
56
- * `meanWantCount` lives here because {@link import("./seeker-walk.js").SeekerDecisionInputs} carries it
57
- * per-call (it may be learned), but the default is this constant.
58
- */
59
- export interface HangOutConfig {
60
- /** Clamp on the contention multiplier; protects against pathological `queriesPerMin / arrivalsPerMin`. */
61
- readonly contentionFactorCap: number;
62
- /** Hang-out poll cadence on the non-push path. */
63
- readonly requeryIntervalMs: number;
64
- }
65
-
66
- /** The default hang-out decision config (simulator-validated). */
67
- export const DEFAULT_HANG_OUT_CONFIG: HangOutConfig = {
68
- contentionFactorCap: CONTENTION_FACTOR_CAP,
69
- requeryIntervalMs: REQUERY_INTERVAL_MS,
70
- };
71
-
72
- /** The full matchmaking config, with the documented defaults. */
73
- export interface MatchmakingConfig {
74
- readonly providerTtlCoreMs: number;
75
- readonly providerTtlEdgeMs: number;
76
- readonly seekerTtlMs: number;
77
- readonly queryLimitMax: number;
78
- readonly seekerRenewGraceMs: number;
79
- readonly aggregateCountMinimumTier: number;
80
- }
81
-
82
- /** The default matchmaking config (this ticket's slice). */
83
- export const DEFAULT_MATCHMAKING_CONFIG: MatchmakingConfig = {
84
- providerTtlCoreMs: PROVIDER_TTL_CORE_MS,
85
- providerTtlEdgeMs: PROVIDER_TTL_EDGE_MS,
86
- seekerTtlMs: SEEKER_TTL_MS,
87
- queryLimitMax: QUERY_LIMIT_MAX,
88
- seekerRenewGraceMs: SEEKER_RENEW_GRACE_MS,
89
- aggregateCountMinimumTier: AGGREGATE_COUNT_MINIMUM_TIER,
90
- };
91
-
92
- /**
93
- * Provider TTL for a node profile: Core nodes hold registrations for `PROVIDER_TTL_CORE_MS`, Edge
94
- * nodes for the shorter `PROVIDER_TTL_EDGE_MS` (`docs/matchmaking.md` §Provider registration).
95
- */
96
- export function providerTtlForProfile(profile: NodeProfile, config: MatchmakingConfig = DEFAULT_MATCHMAKING_CONFIG): number {
97
- return profile.kind === "edge" ? config.providerTtlEdgeMs : config.providerTtlCoreMs;
98
- }
1
+ /**
2
+ * Matchmaking — configuration defaults.
3
+ *
4
+ * Transcribed from `docs/matchmaking.md` §Configuration. This module owns the matchmaking config
5
+ * surface: the **wire/TTL** constants (provider/seeker TTLs, the query limit, the seeker renew grace,
6
+ * the aggregate-count minimum tier) AND the seeker **hang-out tuning** rows (`patience_*`,
7
+ * `filter_accept_ratio_initial`, `contention_factor_cap`, `requery_interval_ms`, `mean_want_count`)
8
+ * consumed by the {@link import("./seeker-walk.js").decide} engine and the db-p2p seeker-walk client.
9
+ *
10
+ * The TTL/limit constants are wire-stable and do **not** depend on simulator findings; the hang-out
11
+ * rows DO (folded via `fold-simulator-findings-into-design-docs`) — they carry the simulator-validated
12
+ * defaults (`contention_factor_cap = 4.0`, `mean_want_count = 3`, …; see `docs/matchmaking.md`
13
+ * §Configuration "Defaults validated by simulator"). The `push_*` rows belong to the arrival-push
14
+ * path (a separate slice) and are intentionally not modeled here.
15
+ */
16
+
17
+ import type { NodeProfile } from "../cohort-topic/tiers.js";
18
+
19
+ /** Provider registration TTL on a Core node (ms). */
20
+ export const PROVIDER_TTL_CORE_MS = 90_000;
21
+ /** Provider registration TTL on an Edge node (ms). */
22
+ export const PROVIDER_TTL_EDGE_MS = 60_000;
23
+ /** Seeker registration TTL (ms) — short, since seekers normally don't wait long. */
24
+ export const SEEKER_TTL_MS = 10_000;
25
+ /** Documented seeker-TTL range (ms); `SEEKER_TTL_MS` sits inside it. */
26
+ export const SEEKER_TTL_MIN_MS = 5_000;
27
+ export const SEEKER_TTL_MAX_MS = 15_000;
28
+ /** Max entries returned in a single `QueryV1` reply. */
29
+ export const QUERY_LIMIT_MAX = 256;
30
+ /** Grace window a seeker may keep querying after its TTL expires (ms). */
31
+ export const SEEKER_RENEW_GRACE_MS = 5_000;
32
+ /** Root cohorts produce aggregate counts only when tree depth ≥ this. */
33
+ export const AGGREGATE_COUNT_MINIMUM_TIER = 1;
34
+
35
+ // --- Seeker hang-out tuning (simulator-folded; consumed by seeker-walk.ts + the walk client) ---
36
+
37
+ /** Fallback `patienceMs` when a caller does not specify it per-task (ms). */
38
+ export const PATIENCE_DEFAULT_MS = 10_000;
39
+ /** Fraction of remaining patience spent at one tier before considering escalation (1.0 = spend it all here). */
40
+ export const PATIENCE_PER_TIER_FRACTION = 1.0;
41
+ /** Starting estimate for `filterAcceptRatio`, refined per walk from observed query yields. */
42
+ export const FILTER_ACCEPT_RATIO_INITIAL = 1.0;
43
+ /** Upper bound on the contention multiplier in the hang-out decision (simulator-validated global scalar). */
44
+ export const CONTENTION_FACTOR_CAP = 4.0;
45
+ /** Mean `wantCount` assumed for competing seekers in the contention estimate (small constant; simulator value). */
46
+ export const MEAN_WANT_COUNT_DEFAULT = 3;
47
+ /** How often a hanging-out seeker re-issues `QueryV1` on the non-push (poll) path (ms). */
48
+ export const REQUERY_INTERVAL_MS = 1_000;
49
+ /** Window the seeker's primary batches fresh matchable arrivals before flushing one push (ms; arrival-push path). */
50
+ export const PUSH_COALESCE_MS = 250;
51
+ /** Sparse fallback `QueryV1` cadence for a push-aware hanging-out seeker (ms; arrival-push path). */
52
+ export const PUSH_SAFETY_POLL_MS = 5_000;
53
+
54
+ /**
55
+ * The seeker hang-out decision tuning (`docs/matchmaking.md` §Hang-out vs. continue / §Configuration).
56
+ * `meanWantCount` lives here because {@link import("./seeker-walk.js").SeekerDecisionInputs} carries it
57
+ * per-call (it may be learned), but the default is this constant.
58
+ */
59
+ export interface HangOutConfig {
60
+ /** Clamp on the contention multiplier; protects against pathological `queriesPerMin / arrivalsPerMin`. */
61
+ readonly contentionFactorCap: number;
62
+ /** Hang-out poll cadence on the non-push path. */
63
+ readonly requeryIntervalMs: number;
64
+ }
65
+
66
+ /** The default hang-out decision config (simulator-validated). */
67
+ export const DEFAULT_HANG_OUT_CONFIG: HangOutConfig = {
68
+ contentionFactorCap: CONTENTION_FACTOR_CAP,
69
+ requeryIntervalMs: REQUERY_INTERVAL_MS,
70
+ };
71
+
72
+ /** The full matchmaking config, with the documented defaults. */
73
+ export interface MatchmakingConfig {
74
+ readonly providerTtlCoreMs: number;
75
+ readonly providerTtlEdgeMs: number;
76
+ readonly seekerTtlMs: number;
77
+ readonly queryLimitMax: number;
78
+ readonly seekerRenewGraceMs: number;
79
+ readonly aggregateCountMinimumTier: number;
80
+ }
81
+
82
+ /** The default matchmaking config (this ticket's slice). */
83
+ export const DEFAULT_MATCHMAKING_CONFIG: MatchmakingConfig = {
84
+ providerTtlCoreMs: PROVIDER_TTL_CORE_MS,
85
+ providerTtlEdgeMs: PROVIDER_TTL_EDGE_MS,
86
+ seekerTtlMs: SEEKER_TTL_MS,
87
+ queryLimitMax: QUERY_LIMIT_MAX,
88
+ seekerRenewGraceMs: SEEKER_RENEW_GRACE_MS,
89
+ aggregateCountMinimumTier: AGGREGATE_COUNT_MINIMUM_TIER,
90
+ };
91
+
92
+ /**
93
+ * Provider TTL for a node profile: Core nodes hold registrations for `PROVIDER_TTL_CORE_MS`, Edge
94
+ * nodes for the shorter `PROVIDER_TTL_EDGE_MS` (`docs/matchmaking.md` §Provider registration).
95
+ */
96
+ export function providerTtlForProfile(profile: NodeProfile, config: MatchmakingConfig = DEFAULT_MATCHMAKING_CONFIG): number {
97
+ return profile.kind === "edge" ? config.providerTtlEdgeMs : config.providerTtlCoreMs;
98
+ }
@@ -1,21 +1,21 @@
1
- /**
2
- * Matchmaking — the directory application of the cohort-topic substrate.
3
- *
4
- * See `docs/matchmaking.md`. The db-core layer owns the transport-agnostic pieces: wire codecs +
5
- * seeker-side entry re-validation, the stable topic-anchor derivation, configuration, both
6
- * registration roles' decision/state (provider attach/renew/self-throttle; seeker short-TTL
7
- * registration), the cohort-side capability filter + pure query evaluation, and the seeker
8
- * hang-out-vs-continue decision engine. The db-p2p layer wires these to the cohort-topic substrate
9
- * (managers, the cohort query handler, the seeker walk client).
10
- */
11
-
12
- export * from "./config.js";
13
- export * from "./topic-anchor.js";
14
- export * from "./wire.js";
15
- export * from "./provider.js";
16
- export * from "./seeker.js";
17
- export * from "./capability-filter.js";
18
- export * from "./query-eval.js";
19
- export * from "./seeker-walk.js";
20
- export * from "./multi-cohort-seeker.js";
21
- export * from "./voting-quorum.js";
1
+ /**
2
+ * Matchmaking — the directory application of the cohort-topic substrate.
3
+ *
4
+ * See `docs/matchmaking.md`. The db-core layer owns the transport-agnostic pieces: wire codecs +
5
+ * seeker-side entry re-validation, the stable topic-anchor derivation, configuration, both
6
+ * registration roles' decision/state (provider attach/renew/self-throttle; seeker short-TTL
7
+ * registration), the cohort-side capability filter + pure query evaluation, and the seeker
8
+ * hang-out-vs-continue decision engine. The db-p2p layer wires these to the cohort-topic substrate
9
+ * (managers, the cohort query handler, the seeker walk client).
10
+ */
11
+
12
+ export * from "./config.js";
13
+ export * from "./topic-anchor.js";
14
+ export * from "./wire.js";
15
+ export * from "./provider.js";
16
+ export * from "./seeker.js";
17
+ export * from "./capability-filter.js";
18
+ export * from "./query-eval.js";
19
+ export * from "./seeker-walk.js";
20
+ export * from "./multi-cohort-seeker.js";
21
+ export * from "./voting-quorum.js";