@optimystic/db-core 0.22.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 (141) hide show
  1. package/README.md +336 -336
  2. package/dist/src/cluster/structs.d.ts +39 -1
  3. package/dist/src/cluster/structs.d.ts.map +1 -1
  4. package/dist/src/cluster/structs.js +24 -0
  5. package/dist/src/cluster/structs.js.map +1 -1
  6. package/dist/src/collection/collection.d.ts +17 -0
  7. package/dist/src/collection/collection.d.ts.map +1 -1
  8. package/dist/src/collection/collection.js +24 -2
  9. package/dist/src/collection/collection.js.map +1 -1
  10. package/dist/src/collections/tree/tree.d.ts +5 -0
  11. package/dist/src/collections/tree/tree.d.ts.map +1 -1
  12. package/dist/src/collections/tree/tree.js +7 -0
  13. package/dist/src/collections/tree/tree.js.map +1 -1
  14. package/dist/src/network/i-peer-network.d.ts +16 -0
  15. package/dist/src/network/i-peer-network.d.ts.map +1 -1
  16. package/dist/src/network/struct.d.ts +39 -2
  17. package/dist/src/network/struct.d.ts.map +1 -1
  18. package/dist/src/network/struct.js +18 -0
  19. package/dist/src/network/struct.js.map +1 -1
  20. package/dist/src/testing/test-transactor.d.ts +95 -8
  21. package/dist/src/testing/test-transactor.d.ts.map +1 -1
  22. package/dist/src/testing/test-transactor.js +121 -8
  23. package/dist/src/testing/test-transactor.js.map +1 -1
  24. package/dist/src/transaction/transaction.d.ts +1 -1
  25. package/dist/src/transaction/transaction.js +1 -1
  26. package/dist/src/transactor/network-transactor.d.ts.map +1 -1
  27. package/dist/src/transactor/network-transactor.js +48 -13
  28. package/dist/src/transactor/network-transactor.js.map +1 -1
  29. package/dist/src/transactor/transactor-source.d.ts.map +1 -1
  30. package/dist/src/transactor/transactor-source.js +25 -2
  31. package/dist/src/transactor/transactor-source.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/cluster/membership.ts +85 -85
  34. package/src/cluster/structs.ts +43 -4
  35. package/src/cohort-topic/addressing.ts +120 -120
  36. package/src/cohort-topic/antidos/bootstrap-evidence-envelope.ts +253 -253
  37. package/src/cohort-topic/antidos/bootstrap-evidence.ts +106 -106
  38. package/src/cohort-topic/antidos/index.ts +5 -5
  39. package/src/cohort-topic/antidos/rate-limiter.ts +210 -210
  40. package/src/cohort-topic/antidos/replay-guard.ts +146 -146
  41. package/src/cohort-topic/antidos/topic-budget.ts +160 -160
  42. package/src/cohort-topic/antiflood/index.ts +2 -2
  43. package/src/cohort-topic/antiflood/invariants.ts +108 -108
  44. package/src/cohort-topic/antiflood/jitter.ts +117 -117
  45. package/src/cohort-topic/coldstart.ts +237 -237
  46. package/src/cohort-topic/dmax.ts +88 -88
  47. package/src/cohort-topic/gossip/bus.ts +254 -254
  48. package/src/cohort-topic/gossip/index.ts +3 -3
  49. package/src/cohort-topic/gossip/records.ts +45 -45
  50. package/src/cohort-topic/gossip/view.ts +91 -91
  51. package/src/cohort-topic/index.ts +20 -20
  52. package/src/cohort-topic/load/barometer.ts +134 -134
  53. package/src/cohort-topic/load/index.ts +1 -1
  54. package/src/cohort-topic/member-engine.ts +430 -430
  55. package/src/cohort-topic/membership/index.ts +3 -3
  56. package/src/cohort-topic/membership/publisher.ts +163 -163
  57. package/src/cohort-topic/membership/source.ts +41 -41
  58. package/src/cohort-topic/membership/verifier.ts +461 -461
  59. package/src/cohort-topic/ports.ts +157 -157
  60. package/src/cohort-topic/promotion.ts +405 -405
  61. package/src/cohort-topic/registration/bytes.ts +37 -37
  62. package/src/cohort-topic/registration/handoff.ts +154 -154
  63. package/src/cohort-topic/registration/index.ts +6 -6
  64. package/src/cohort-topic/registration/renewal.ts +495 -495
  65. package/src/cohort-topic/registration/sharding.ts +61 -61
  66. package/src/cohort-topic/registration/store.ts +81 -81
  67. package/src/cohort-topic/registration/types.ts +91 -91
  68. package/src/cohort-topic/ring-hash.ts +50 -50
  69. package/src/cohort-topic/service.ts +416 -416
  70. package/src/cohort-topic/sig/index.ts +2 -2
  71. package/src/cohort-topic/sig/payloads.ts +59 -59
  72. package/src/cohort-topic/sig/threshold.ts +64 -64
  73. package/src/cohort-topic/tiers.ts +74 -74
  74. package/src/cohort-topic/traffic.ts +233 -233
  75. package/src/cohort-topic/walk.ts +326 -326
  76. package/src/cohort-topic/willingness.ts +237 -237
  77. package/src/cohort-topic/wire/codec.ts +216 -216
  78. package/src/cohort-topic/wire/index.ts +18 -18
  79. package/src/cohort-topic/wire/payloads.ts +126 -126
  80. package/src/cohort-topic/wire/primitives.ts +188 -188
  81. package/src/cohort-topic/wire/types.ts +475 -475
  82. package/src/cohort-topic/wire/validate.ts +512 -512
  83. package/src/collection/collection-type-registry.ts +37 -37
  84. package/src/collection/collection.ts +25 -2
  85. package/src/collections/diary/diary.ts +68 -68
  86. package/src/collections/tree/readme.md +4 -0
  87. package/src/collections/tree/tree.ts +320 -312
  88. package/src/matchmaking/capability-filter.ts +45 -45
  89. package/src/matchmaking/config.ts +98 -98
  90. package/src/matchmaking/index.ts +21 -21
  91. package/src/matchmaking/multi-cohort-seeker.ts +234 -234
  92. package/src/matchmaking/provider.ts +123 -123
  93. package/src/matchmaking/query-eval.ts +105 -105
  94. package/src/matchmaking/seeker-walk.ts +127 -127
  95. package/src/matchmaking/seeker.ts +86 -86
  96. package/src/matchmaking/topic-anchor.ts +90 -90
  97. package/src/matchmaking/voting-quorum.ts +394 -394
  98. package/src/matchmaking/wire.ts +603 -603
  99. package/src/network/i-peer-network.ts +17 -0
  100. package/src/network/stale-failure.ts +43 -43
  101. package/src/network/struct.ts +41 -2
  102. package/src/network/types.ts +37 -37
  103. package/src/reactivity/backfill.ts +220 -220
  104. package/src/reactivity/backpressure.ts +191 -191
  105. package/src/reactivity/checkpoint.ts +308 -308
  106. package/src/reactivity/config.ts +172 -172
  107. package/src/reactivity/dedupe.ts +132 -132
  108. package/src/reactivity/forwarder.ts +87 -87
  109. package/src/reactivity/index.ts +34 -34
  110. package/src/reactivity/notification.ts +123 -123
  111. package/src/reactivity/policy.ts +79 -79
  112. package/src/reactivity/push-state.ts +310 -310
  113. package/src/reactivity/recover.ts +153 -153
  114. package/src/reactivity/replay-buffer.ts +141 -141
  115. package/src/reactivity/resume.ts +549 -549
  116. package/src/reactivity/rotation.ts +415 -415
  117. package/src/reactivity/subscriber.ts +132 -132
  118. package/src/reactivity/subscription.ts +66 -66
  119. package/src/reactivity/topic-anchor.ts +71 -71
  120. package/src/reactivity/verify.ts +73 -73
  121. package/src/reactivity/wire-validate.ts +13 -13
  122. package/src/reactivity/wire.ts +224 -224
  123. package/src/testing/async-wait.ts +65 -65
  124. package/src/testing/index.ts +2 -2
  125. package/src/testing/test-transactor.ts +638 -502
  126. package/src/transaction/errors.ts +91 -91
  127. package/src/transaction/operations-hash.ts +196 -196
  128. package/src/transaction/read-dependency-collector.ts +78 -78
  129. package/src/transaction/transaction.ts +1 -1
  130. package/src/transactor/change-notifier.ts +80 -80
  131. package/src/transactor/index.ts +5 -5
  132. package/src/transactor/network-transactor.ts +49 -14
  133. package/src/transactor/transactor-source.ts +25 -2
  134. package/src/transform/atomic-proxy.ts +92 -92
  135. package/src/transform/helpers.ts +159 -159
  136. package/src/utility/backoff.ts +95 -95
  137. package/src/utility/batch-coordinator.ts +191 -191
  138. package/dist/src/transaction/context.d.ts +0 -60
  139. package/dist/src/transaction/context.d.ts.map +0 -1
  140. package/dist/src/transaction/context.js +0 -91
  141. package/dist/src/transaction/context.js.map +0 -1
@@ -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";