@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.
Files changed (447) hide show
  1. package/dist/src/cluster/structs.d.ts +13 -0
  2. package/dist/src/cluster/structs.d.ts.map +1 -1
  3. package/dist/src/cohort-topic/addressing.d.ts +53 -0
  4. package/dist/src/cohort-topic/addressing.d.ts.map +1 -0
  5. package/dist/src/cohort-topic/addressing.js +95 -0
  6. package/dist/src/cohort-topic/addressing.js.map +1 -0
  7. package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.d.ts +105 -0
  8. package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.d.ts.map +1 -0
  9. package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.js +197 -0
  10. package/dist/src/cohort-topic/antidos/bootstrap-evidence-envelope.js.map +1 -0
  11. package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts +50 -0
  12. package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts.map +1 -0
  13. package/dist/src/cohort-topic/antidos/bootstrap-evidence.js +62 -0
  14. package/dist/src/cohort-topic/antidos/bootstrap-evidence.js.map +1 -0
  15. package/dist/src/cohort-topic/antidos/index.d.ts +6 -0
  16. package/dist/src/cohort-topic/antidos/index.d.ts.map +1 -0
  17. package/dist/src/cohort-topic/antidos/index.js +6 -0
  18. package/dist/src/cohort-topic/antidos/index.js.map +1 -0
  19. package/dist/src/cohort-topic/antidos/rate-limiter.d.ts +95 -0
  20. package/dist/src/cohort-topic/antidos/rate-limiter.d.ts.map +1 -0
  21. package/dist/src/cohort-topic/antidos/rate-limiter.js +146 -0
  22. package/dist/src/cohort-topic/antidos/rate-limiter.js.map +1 -0
  23. package/dist/src/cohort-topic/antidos/replay-guard.d.ts +37 -0
  24. package/dist/src/cohort-topic/antidos/replay-guard.d.ts.map +1 -0
  25. package/dist/src/cohort-topic/antidos/replay-guard.js +78 -0
  26. package/dist/src/cohort-topic/antidos/replay-guard.js.map +1 -0
  27. package/dist/src/cohort-topic/antidos/topic-budget.d.ts +50 -0
  28. package/dist/src/cohort-topic/antidos/topic-budget.d.ts.map +1 -0
  29. package/dist/src/cohort-topic/antidos/topic-budget.js +95 -0
  30. package/dist/src/cohort-topic/antidos/topic-budget.js.map +1 -0
  31. package/dist/src/cohort-topic/antiflood/index.d.ts +3 -0
  32. package/dist/src/cohort-topic/antiflood/index.d.ts.map +1 -0
  33. package/dist/src/cohort-topic/antiflood/index.js +3 -0
  34. package/dist/src/cohort-topic/antiflood/index.js.map +1 -0
  35. package/dist/src/cohort-topic/antiflood/invariants.d.ts +70 -0
  36. package/dist/src/cohort-topic/antiflood/invariants.d.ts.map +1 -0
  37. package/dist/src/cohort-topic/antiflood/invariants.js +86 -0
  38. package/dist/src/cohort-topic/antiflood/invariants.js.map +1 -0
  39. package/dist/src/cohort-topic/antiflood/jitter.d.ts +65 -0
  40. package/dist/src/cohort-topic/antiflood/jitter.d.ts.map +1 -0
  41. package/dist/src/cohort-topic/antiflood/jitter.js +75 -0
  42. package/dist/src/cohort-topic/antiflood/jitter.js.map +1 -0
  43. package/dist/src/cohort-topic/coldstart.d.ts +117 -0
  44. package/dist/src/cohort-topic/coldstart.d.ts.map +1 -0
  45. package/dist/src/cohort-topic/coldstart.js +127 -0
  46. package/dist/src/cohort-topic/coldstart.js.map +1 -0
  47. package/dist/src/cohort-topic/dmax.d.ts +44 -0
  48. package/dist/src/cohort-topic/dmax.d.ts.map +1 -0
  49. package/dist/src/cohort-topic/dmax.js +70 -0
  50. package/dist/src/cohort-topic/dmax.js.map +1 -0
  51. package/dist/src/cohort-topic/gossip/bus.d.ts +85 -0
  52. package/dist/src/cohort-topic/gossip/bus.d.ts.map +1 -0
  53. package/dist/src/cohort-topic/gossip/bus.js +146 -0
  54. package/dist/src/cohort-topic/gossip/bus.js.map +1 -0
  55. package/dist/src/cohort-topic/gossip/index.d.ts +4 -0
  56. package/dist/src/cohort-topic/gossip/index.d.ts.map +1 -0
  57. package/dist/src/cohort-topic/gossip/index.js +4 -0
  58. package/dist/src/cohort-topic/gossip/index.js.map +1 -0
  59. package/dist/src/cohort-topic/gossip/records.d.ts +12 -0
  60. package/dist/src/cohort-topic/gossip/records.d.ts.map +1 -0
  61. package/dist/src/cohort-topic/gossip/records.js +41 -0
  62. package/dist/src/cohort-topic/gossip/records.js.map +1 -0
  63. package/dist/src/cohort-topic/gossip/view.d.ts +39 -0
  64. package/dist/src/cohort-topic/gossip/view.d.ts.map +1 -0
  65. package/dist/src/cohort-topic/gossip/view.js +30 -0
  66. package/dist/src/cohort-topic/gossip/view.js.map +1 -0
  67. package/dist/src/cohort-topic/index.d.ts +21 -0
  68. package/dist/src/cohort-topic/index.d.ts.map +1 -0
  69. package/dist/src/cohort-topic/index.js +21 -0
  70. package/dist/src/cohort-topic/index.js.map +1 -0
  71. package/dist/src/cohort-topic/load/barometer.d.ts +78 -0
  72. package/dist/src/cohort-topic/load/barometer.d.ts.map +1 -0
  73. package/dist/src/cohort-topic/load/barometer.js +93 -0
  74. package/dist/src/cohort-topic/load/barometer.js.map +1 -0
  75. package/dist/src/cohort-topic/load/index.d.ts +2 -0
  76. package/dist/src/cohort-topic/load/index.d.ts.map +1 -0
  77. package/dist/src/cohort-topic/load/index.js +2 -0
  78. package/dist/src/cohort-topic/load/index.js.map +1 -0
  79. package/dist/src/cohort-topic/member-engine.d.ts +134 -0
  80. package/dist/src/cohort-topic/member-engine.d.ts.map +1 -0
  81. package/dist/src/cohort-topic/member-engine.js +264 -0
  82. package/dist/src/cohort-topic/member-engine.js.map +1 -0
  83. package/dist/src/cohort-topic/membership/index.d.ts +4 -0
  84. package/dist/src/cohort-topic/membership/index.d.ts.map +1 -0
  85. package/dist/src/cohort-topic/membership/index.js +4 -0
  86. package/dist/src/cohort-topic/membership/index.js.map +1 -0
  87. package/dist/src/cohort-topic/membership/publisher.d.ts +82 -0
  88. package/dist/src/cohort-topic/membership/publisher.d.ts.map +1 -0
  89. package/dist/src/cohort-topic/membership/publisher.js +107 -0
  90. package/dist/src/cohort-topic/membership/publisher.js.map +1 -0
  91. package/dist/src/cohort-topic/membership/source.d.ts +31 -0
  92. package/dist/src/cohort-topic/membership/source.d.ts.map +1 -0
  93. package/dist/src/cohort-topic/membership/source.js +32 -0
  94. package/dist/src/cohort-topic/membership/source.js.map +1 -0
  95. package/dist/src/cohort-topic/membership/verifier.d.ts +96 -0
  96. package/dist/src/cohort-topic/membership/verifier.d.ts.map +1 -0
  97. package/dist/src/cohort-topic/membership/verifier.js +250 -0
  98. package/dist/src/cohort-topic/membership/verifier.js.map +1 -0
  99. package/dist/src/cohort-topic/ports.d.ts +149 -0
  100. package/dist/src/cohort-topic/ports.d.ts.map +1 -0
  101. package/dist/src/cohort-topic/ports.js +25 -0
  102. package/dist/src/cohort-topic/ports.js.map +1 -0
  103. package/dist/src/cohort-topic/promotion.d.ts +135 -0
  104. package/dist/src/cohort-topic/promotion.d.ts.map +1 -0
  105. package/dist/src/cohort-topic/promotion.js +269 -0
  106. package/dist/src/cohort-topic/promotion.js.map +1 -0
  107. package/dist/src/cohort-topic/registration/bytes.d.ts +16 -0
  108. package/dist/src/cohort-topic/registration/bytes.d.ts.map +1 -0
  109. package/dist/src/cohort-topic/registration/bytes.js +32 -0
  110. package/dist/src/cohort-topic/registration/bytes.js.map +1 -0
  111. package/dist/src/cohort-topic/registration/handoff.d.ts +69 -0
  112. package/dist/src/cohort-topic/registration/handoff.d.ts.map +1 -0
  113. package/dist/src/cohort-topic/registration/handoff.js +98 -0
  114. package/dist/src/cohort-topic/registration/handoff.js.map +1 -0
  115. package/dist/src/cohort-topic/registration/index.d.ts +7 -0
  116. package/dist/src/cohort-topic/registration/index.d.ts.map +1 -0
  117. package/dist/src/cohort-topic/registration/index.js +7 -0
  118. package/dist/src/cohort-topic/registration/index.js.map +1 -0
  119. package/dist/src/cohort-topic/registration/renewal.d.ts +115 -0
  120. package/dist/src/cohort-topic/registration/renewal.d.ts.map +1 -0
  121. package/dist/src/cohort-topic/registration/renewal.js +306 -0
  122. package/dist/src/cohort-topic/registration/renewal.js.map +1 -0
  123. package/dist/src/cohort-topic/registration/sharding.d.ts +31 -0
  124. package/dist/src/cohort-topic/registration/sharding.d.ts.map +1 -0
  125. package/dist/src/cohort-topic/registration/sharding.js +48 -0
  126. package/dist/src/cohort-topic/registration/sharding.js.map +1 -0
  127. package/dist/src/cohort-topic/registration/store.d.ts +13 -0
  128. package/dist/src/cohort-topic/registration/store.d.ts.map +1 -0
  129. package/dist/src/cohort-topic/registration/store.js +72 -0
  130. package/dist/src/cohort-topic/registration/store.js.map +1 -0
  131. package/dist/src/cohort-topic/registration/types.d.ts +71 -0
  132. package/dist/src/cohort-topic/registration/types.d.ts.map +1 -0
  133. package/dist/src/cohort-topic/registration/types.js +27 -0
  134. package/dist/src/cohort-topic/registration/types.js.map +1 -0
  135. package/dist/src/cohort-topic/ring-hash.d.ts +27 -0
  136. package/dist/src/cohort-topic/ring-hash.d.ts.map +1 -0
  137. package/dist/src/cohort-topic/ring-hash.js +45 -0
  138. package/dist/src/cohort-topic/ring-hash.js.map +1 -0
  139. package/dist/src/cohort-topic/service.d.ts +157 -0
  140. package/dist/src/cohort-topic/service.d.ts.map +1 -0
  141. package/dist/src/cohort-topic/service.js +237 -0
  142. package/dist/src/cohort-topic/service.js.map +1 -0
  143. package/dist/src/cohort-topic/sig/index.d.ts +3 -0
  144. package/dist/src/cohort-topic/sig/index.d.ts.map +1 -0
  145. package/dist/src/cohort-topic/sig/index.js +3 -0
  146. package/dist/src/cohort-topic/sig/index.js.map +1 -0
  147. package/dist/src/cohort-topic/sig/payloads.d.ts +25 -0
  148. package/dist/src/cohort-topic/sig/payloads.d.ts.map +1 -0
  149. package/dist/src/cohort-topic/sig/payloads.js +25 -0
  150. package/dist/src/cohort-topic/sig/payloads.js.map +1 -0
  151. package/dist/src/cohort-topic/sig/threshold.d.ts +33 -0
  152. package/dist/src/cohort-topic/sig/threshold.d.ts.map +1 -0
  153. package/dist/src/cohort-topic/sig/threshold.js +51 -0
  154. package/dist/src/cohort-topic/sig/threshold.js.map +1 -0
  155. package/dist/src/cohort-topic/tiers.d.ts +58 -0
  156. package/dist/src/cohort-topic/tiers.d.ts.map +1 -0
  157. package/dist/src/cohort-topic/tiers.js +49 -0
  158. package/dist/src/cohort-topic/tiers.js.map +1 -0
  159. package/dist/src/cohort-topic/traffic.d.ts +90 -0
  160. package/dist/src/cohort-topic/traffic.d.ts.map +1 -0
  161. package/dist/src/cohort-topic/traffic.js +146 -0
  162. package/dist/src/cohort-topic/traffic.js.map +1 -0
  163. package/dist/src/cohort-topic/walk.d.ts +123 -0
  164. package/dist/src/cohort-topic/walk.d.ts.map +1 -0
  165. package/dist/src/cohort-topic/walk.js +150 -0
  166. package/dist/src/cohort-topic/walk.js.map +1 -0
  167. package/dist/src/cohort-topic/willingness.d.ts +123 -0
  168. package/dist/src/cohort-topic/willingness.d.ts.map +1 -0
  169. package/dist/src/cohort-topic/willingness.js +143 -0
  170. package/dist/src/cohort-topic/willingness.js.map +1 -0
  171. package/dist/src/cohort-topic/wire/codec.d.ts +42 -0
  172. package/dist/src/cohort-topic/wire/codec.d.ts.map +1 -0
  173. package/dist/src/cohort-topic/wire/codec.js +163 -0
  174. package/dist/src/cohort-topic/wire/codec.js.map +1 -0
  175. package/dist/src/cohort-topic/wire/index.d.ts +6 -0
  176. package/dist/src/cohort-topic/wire/index.d.ts.map +1 -0
  177. package/dist/src/cohort-topic/wire/index.js +6 -0
  178. package/dist/src/cohort-topic/wire/index.js.map +1 -0
  179. package/dist/src/cohort-topic/wire/payloads.d.ts +38 -0
  180. package/dist/src/cohort-topic/wire/payloads.d.ts.map +1 -0
  181. package/dist/src/cohort-topic/wire/payloads.js +102 -0
  182. package/dist/src/cohort-topic/wire/payloads.js.map +1 -0
  183. package/dist/src/cohort-topic/wire/types.d.ts +304 -0
  184. package/dist/src/cohort-topic/wire/types.d.ts.map +1 -0
  185. package/dist/src/cohort-topic/wire/types.js +16 -0
  186. package/dist/src/cohort-topic/wire/types.js.map +1 -0
  187. package/dist/src/cohort-topic/wire/validate.d.ts +25 -0
  188. package/dist/src/cohort-topic/wire/validate.d.ts.map +1 -0
  189. package/dist/src/cohort-topic/wire/validate.js +427 -0
  190. package/dist/src/cohort-topic/wire/validate.js.map +1 -0
  191. package/dist/src/collection/collection.d.ts +58 -1
  192. package/dist/src/collection/collection.d.ts.map +1 -1
  193. package/dist/src/collection/collection.js +76 -0
  194. package/dist/src/collection/collection.js.map +1 -1
  195. package/dist/src/collections/tree/tree.d.ts +58 -2
  196. package/dist/src/collections/tree/tree.d.ts.map +1 -1
  197. package/dist/src/collections/tree/tree.js +59 -2
  198. package/dist/src/collections/tree/tree.js.map +1 -1
  199. package/dist/src/index.d.ts +3 -0
  200. package/dist/src/index.d.ts.map +1 -1
  201. package/dist/src/index.js +3 -0
  202. package/dist/src/index.js.map +1 -1
  203. package/dist/src/log/log.d.ts +42 -4
  204. package/dist/src/log/log.d.ts.map +1 -1
  205. package/dist/src/log/log.js +71 -3
  206. package/dist/src/log/log.js.map +1 -1
  207. package/dist/src/log/struct.d.ts +122 -2
  208. package/dist/src/log/struct.d.ts.map +1 -1
  209. package/dist/src/log/struct.js.map +1 -1
  210. package/dist/src/matchmaking/capability-filter.d.ts +24 -0
  211. package/dist/src/matchmaking/capability-filter.d.ts.map +1 -0
  212. package/dist/src/matchmaking/capability-filter.js +37 -0
  213. package/dist/src/matchmaking/capability-filter.js.map +1 -0
  214. package/dist/src/matchmaking/config.d.ts +77 -0
  215. package/dist/src/matchmaking/config.d.ts.map +1 -0
  216. package/dist/src/matchmaking/config.js +69 -0
  217. package/dist/src/matchmaking/config.js.map +1 -0
  218. package/dist/src/matchmaking/index.d.ts +21 -0
  219. package/dist/src/matchmaking/index.d.ts.map +1 -0
  220. package/dist/src/matchmaking/index.js +21 -0
  221. package/dist/src/matchmaking/index.js.map +1 -0
  222. package/dist/src/matchmaking/multi-cohort-seeker.d.ts +133 -0
  223. package/dist/src/matchmaking/multi-cohort-seeker.d.ts.map +1 -0
  224. package/dist/src/matchmaking/multi-cohort-seeker.js +142 -0
  225. package/dist/src/matchmaking/multi-cohort-seeker.js.map +1 -0
  226. package/dist/src/matchmaking/provider.d.ts +70 -0
  227. package/dist/src/matchmaking/provider.d.ts.map +1 -0
  228. package/dist/src/matchmaking/provider.js +93 -0
  229. package/dist/src/matchmaking/provider.js.map +1 -0
  230. package/dist/src/matchmaking/query-eval.d.ts +53 -0
  231. package/dist/src/matchmaking/query-eval.d.ts.map +1 -0
  232. package/dist/src/matchmaking/query-eval.js +69 -0
  233. package/dist/src/matchmaking/query-eval.js.map +1 -0
  234. package/dist/src/matchmaking/seeker-walk.d.ts +95 -0
  235. package/dist/src/matchmaking/seeker-walk.d.ts.map +1 -0
  236. package/dist/src/matchmaking/seeker-walk.js +75 -0
  237. package/dist/src/matchmaking/seeker-walk.js.map +1 -0
  238. package/dist/src/matchmaking/seeker.d.ts +51 -0
  239. package/dist/src/matchmaking/seeker.d.ts.map +1 -0
  240. package/dist/src/matchmaking/seeker.js +62 -0
  241. package/dist/src/matchmaking/seeker.js.map +1 -0
  242. package/dist/src/matchmaking/topic-anchor.d.ts +54 -0
  243. package/dist/src/matchmaking/topic-anchor.d.ts.map +1 -0
  244. package/dist/src/matchmaking/topic-anchor.js +67 -0
  245. package/dist/src/matchmaking/topic-anchor.js.map +1 -0
  246. package/dist/src/matchmaking/voting-quorum.d.ts +233 -0
  247. package/dist/src/matchmaking/voting-quorum.d.ts.map +1 -0
  248. package/dist/src/matchmaking/voting-quorum.js +238 -0
  249. package/dist/src/matchmaking/voting-quorum.js.map +1 -0
  250. package/dist/src/matchmaking/wire.d.ts +259 -0
  251. package/dist/src/matchmaking/wire.d.ts.map +1 -0
  252. package/dist/src/matchmaking/wire.js +484 -0
  253. package/dist/src/matchmaking/wire.js.map +1 -0
  254. package/dist/src/network/i-repo.d.ts +9 -0
  255. package/dist/src/network/i-repo.d.ts.map +1 -1
  256. package/dist/src/network/repo-protocol.d.ts +3 -1
  257. package/dist/src/network/repo-protocol.d.ts.map +1 -1
  258. package/dist/src/network/struct.d.ts +23 -1
  259. package/dist/src/network/struct.d.ts.map +1 -1
  260. package/dist/src/reactivity/backfill.d.ts +118 -0
  261. package/dist/src/reactivity/backfill.d.ts.map +1 -0
  262. package/dist/src/reactivity/backfill.js +137 -0
  263. package/dist/src/reactivity/backfill.js.map +1 -0
  264. package/dist/src/reactivity/backpressure.d.ts +99 -0
  265. package/dist/src/reactivity/backpressure.d.ts.map +1 -0
  266. package/dist/src/reactivity/backpressure.js +153 -0
  267. package/dist/src/reactivity/backpressure.js.map +1 -0
  268. package/dist/src/reactivity/checkpoint.d.ts +165 -0
  269. package/dist/src/reactivity/checkpoint.d.ts.map +1 -0
  270. package/dist/src/reactivity/checkpoint.js +232 -0
  271. package/dist/src/reactivity/checkpoint.js.map +1 -0
  272. package/dist/src/reactivity/config.d.ts +131 -0
  273. package/dist/src/reactivity/config.d.ts.map +1 -0
  274. package/dist/src/reactivity/config.js +135 -0
  275. package/dist/src/reactivity/config.js.map +1 -0
  276. package/dist/src/reactivity/dedupe.d.ts +51 -0
  277. package/dist/src/reactivity/dedupe.d.ts.map +1 -0
  278. package/dist/src/reactivity/dedupe.js +90 -0
  279. package/dist/src/reactivity/dedupe.js.map +1 -0
  280. package/dist/src/reactivity/forwarder.d.ts +50 -0
  281. package/dist/src/reactivity/forwarder.d.ts.map +1 -0
  282. package/dist/src/reactivity/forwarder.js +52 -0
  283. package/dist/src/reactivity/forwarder.js.map +1 -0
  284. package/dist/src/reactivity/index.d.ts +34 -0
  285. package/dist/src/reactivity/index.d.ts.map +1 -0
  286. package/dist/src/reactivity/index.js +34 -0
  287. package/dist/src/reactivity/index.js.map +1 -0
  288. package/dist/src/reactivity/notification.d.ts +72 -0
  289. package/dist/src/reactivity/notification.d.ts.map +1 -0
  290. package/dist/src/reactivity/notification.js +92 -0
  291. package/dist/src/reactivity/notification.js.map +1 -0
  292. package/dist/src/reactivity/policy.d.ts +59 -0
  293. package/dist/src/reactivity/policy.d.ts.map +1 -0
  294. package/dist/src/reactivity/policy.js +64 -0
  295. package/dist/src/reactivity/policy.js.map +1 -0
  296. package/dist/src/reactivity/push-state.d.ts +140 -0
  297. package/dist/src/reactivity/push-state.d.ts.map +1 -0
  298. package/dist/src/reactivity/push-state.js +270 -0
  299. package/dist/src/reactivity/push-state.js.map +1 -0
  300. package/dist/src/reactivity/recover.d.ts +75 -0
  301. package/dist/src/reactivity/recover.d.ts.map +1 -0
  302. package/dist/src/reactivity/recover.js +105 -0
  303. package/dist/src/reactivity/recover.js.map +1 -0
  304. package/dist/src/reactivity/replay-buffer.d.ts +57 -0
  305. package/dist/src/reactivity/replay-buffer.d.ts.map +1 -0
  306. package/dist/src/reactivity/replay-buffer.js +88 -0
  307. package/dist/src/reactivity/replay-buffer.js.map +1 -0
  308. package/dist/src/reactivity/resume.d.ts +214 -0
  309. package/dist/src/reactivity/resume.d.ts.map +1 -0
  310. package/dist/src/reactivity/resume.js +358 -0
  311. package/dist/src/reactivity/resume.js.map +1 -0
  312. package/dist/src/reactivity/rotation.d.ts +283 -0
  313. package/dist/src/reactivity/rotation.d.ts.map +1 -0
  314. package/dist/src/reactivity/rotation.js +265 -0
  315. package/dist/src/reactivity/rotation.js.map +1 -0
  316. package/dist/src/reactivity/subscriber.d.ts +66 -0
  317. package/dist/src/reactivity/subscriber.d.ts.map +1 -0
  318. package/dist/src/reactivity/subscriber.js +75 -0
  319. package/dist/src/reactivity/subscriber.js.map +1 -0
  320. package/dist/src/reactivity/subscription.d.ts +52 -0
  321. package/dist/src/reactivity/subscription.d.ts.map +1 -0
  322. package/dist/src/reactivity/subscription.js +28 -0
  323. package/dist/src/reactivity/subscription.js.map +1 -0
  324. package/dist/src/reactivity/topic-anchor.d.ts +46 -0
  325. package/dist/src/reactivity/topic-anchor.d.ts.map +1 -0
  326. package/dist/src/reactivity/topic-anchor.js +61 -0
  327. package/dist/src/reactivity/topic-anchor.js.map +1 -0
  328. package/dist/src/reactivity/verify.d.ts +41 -0
  329. package/dist/src/reactivity/verify.d.ts.map +1 -0
  330. package/dist/src/reactivity/verify.js +48 -0
  331. package/dist/src/reactivity/verify.js.map +1 -0
  332. package/dist/src/reactivity/wire-validate.d.ts +28 -0
  333. package/dist/src/reactivity/wire-validate.d.ts.map +1 -0
  334. package/dist/src/reactivity/wire-validate.js +79 -0
  335. package/dist/src/reactivity/wire-validate.js.map +1 -0
  336. package/dist/src/reactivity/wire.d.ts +102 -0
  337. package/dist/src/reactivity/wire.d.ts.map +1 -0
  338. package/dist/src/reactivity/wire.js +129 -0
  339. package/dist/src/reactivity/wire.js.map +1 -0
  340. package/dist/src/transaction/coordinator.d.ts +9 -5
  341. package/dist/src/transaction/coordinator.d.ts.map +1 -1
  342. package/dist/src/transaction/coordinator.js +48 -25
  343. package/dist/src/transaction/coordinator.js.map +1 -1
  344. package/dist/src/transactor/change-notifier.d.ts +74 -0
  345. package/dist/src/transactor/change-notifier.d.ts.map +1 -0
  346. package/dist/src/transactor/change-notifier.js +4 -0
  347. package/dist/src/transactor/change-notifier.js.map +1 -0
  348. package/dist/src/transactor/index.d.ts +1 -0
  349. package/dist/src/transactor/index.d.ts.map +1 -1
  350. package/dist/src/transactor/index.js +1 -0
  351. package/dist/src/transactor/index.js.map +1 -1
  352. package/dist/src/transactor/network-transactor.d.ts +34 -2
  353. package/dist/src/transactor/network-transactor.d.ts.map +1 -1
  354. package/dist/src/transactor/network-transactor.js +113 -13
  355. package/dist/src/transactor/network-transactor.js.map +1 -1
  356. package/package.json +2 -2
  357. package/src/cluster/structs.ts +13 -0
  358. package/src/cohort-topic/addressing.ts +112 -0
  359. package/src/cohort-topic/antidos/bootstrap-evidence-envelope.ts +253 -0
  360. package/src/cohort-topic/antidos/bootstrap-evidence.ts +94 -0
  361. package/src/cohort-topic/antidos/index.ts +5 -0
  362. package/src/cohort-topic/antidos/rate-limiter.ts +210 -0
  363. package/src/cohort-topic/antidos/replay-guard.ts +109 -0
  364. package/src/cohort-topic/antidos/topic-budget.ts +145 -0
  365. package/src/cohort-topic/antiflood/index.ts +2 -0
  366. package/src/cohort-topic/antiflood/invariants.ts +108 -0
  367. package/src/cohort-topic/antiflood/jitter.ts +117 -0
  368. package/src/cohort-topic/coldstart.ts +204 -0
  369. package/src/cohort-topic/dmax.ts +88 -0
  370. package/src/cohort-topic/gossip/bus.ts +217 -0
  371. package/src/cohort-topic/gossip/index.ts +3 -0
  372. package/src/cohort-topic/gossip/records.ts +45 -0
  373. package/src/cohort-topic/gossip/view.ts +66 -0
  374. package/src/cohort-topic/index.ts +20 -0
  375. package/src/cohort-topic/load/barometer.ts +134 -0
  376. package/src/cohort-topic/load/index.ts +1 -0
  377. package/src/cohort-topic/member-engine.ts +409 -0
  378. package/src/cohort-topic/membership/index.ts +3 -0
  379. package/src/cohort-topic/membership/publisher.ts +171 -0
  380. package/src/cohort-topic/membership/source.ts +41 -0
  381. package/src/cohort-topic/membership/verifier.ts +345 -0
  382. package/src/cohort-topic/ports.ts +157 -0
  383. package/src/cohort-topic/promotion.ts +384 -0
  384. package/src/cohort-topic/registration/bytes.ts +37 -0
  385. package/src/cohort-topic/registration/handoff.ts +154 -0
  386. package/src/cohort-topic/registration/index.ts +6 -0
  387. package/src/cohort-topic/registration/renewal.ts +423 -0
  388. package/src/cohort-topic/registration/sharding.ts +61 -0
  389. package/src/cohort-topic/registration/store.ts +81 -0
  390. package/src/cohort-topic/registration/types.ts +76 -0
  391. package/src/cohort-topic/ring-hash.ts +50 -0
  392. package/src/cohort-topic/service.ts +390 -0
  393. package/src/cohort-topic/sig/index.ts +2 -0
  394. package/src/cohort-topic/sig/payloads.ts +39 -0
  395. package/src/cohort-topic/sig/threshold.ts +64 -0
  396. package/src/cohort-topic/tiers.ts +74 -0
  397. package/src/cohort-topic/traffic.ts +211 -0
  398. package/src/cohort-topic/walk.ts +255 -0
  399. package/src/cohort-topic/willingness.ts +237 -0
  400. package/src/cohort-topic/wire/codec.ts +204 -0
  401. package/src/cohort-topic/wire/index.ts +16 -0
  402. package/src/cohort-topic/wire/payloads.ts +117 -0
  403. package/src/cohort-topic/wire/types.ts +343 -0
  404. package/src/cohort-topic/wire/validate.ts +478 -0
  405. package/src/collection/collection.ts +93 -1
  406. package/src/collections/tree/tree.ts +84 -3
  407. package/src/index.ts +3 -0
  408. package/src/log/log.ts +86 -7
  409. package/src/log/struct.ts +126 -2
  410. package/src/matchmaking/capability-filter.ts +45 -0
  411. package/src/matchmaking/config.ts +98 -0
  412. package/src/matchmaking/index.ts +21 -0
  413. package/src/matchmaking/multi-cohort-seeker.ts +234 -0
  414. package/src/matchmaking/provider.ts +123 -0
  415. package/src/matchmaking/query-eval.ts +105 -0
  416. package/src/matchmaking/seeker-walk.ts +127 -0
  417. package/src/matchmaking/seeker.ts +86 -0
  418. package/src/matchmaking/topic-anchor.ts +90 -0
  419. package/src/matchmaking/voting-quorum.ts +394 -0
  420. package/src/matchmaking/wire.ts +680 -0
  421. package/src/network/i-repo.ts +9 -0
  422. package/src/network/repo-protocol.ts +3 -2
  423. package/src/network/struct.ts +24 -1
  424. package/src/reactivity/backfill.ts +220 -0
  425. package/src/reactivity/backpressure.ts +191 -0
  426. package/src/reactivity/checkpoint.ts +308 -0
  427. package/src/reactivity/config.ts +172 -0
  428. package/src/reactivity/dedupe.ts +132 -0
  429. package/src/reactivity/forwarder.ts +87 -0
  430. package/src/reactivity/index.ts +34 -0
  431. package/src/reactivity/notification.ts +123 -0
  432. package/src/reactivity/policy.ts +79 -0
  433. package/src/reactivity/push-state.ts +343 -0
  434. package/src/reactivity/recover.ts +153 -0
  435. package/src/reactivity/replay-buffer.ts +141 -0
  436. package/src/reactivity/resume.ts +549 -0
  437. package/src/reactivity/rotation.ts +415 -0
  438. package/src/reactivity/subscriber.ts +132 -0
  439. package/src/reactivity/subscription.ts +66 -0
  440. package/src/reactivity/topic-anchor.ts +71 -0
  441. package/src/reactivity/verify.ts +73 -0
  442. package/src/reactivity/wire-validate.ts +87 -0
  443. package/src/reactivity/wire.ts +224 -0
  444. package/src/transaction/coordinator.ts +53 -27
  445. package/src/transactor/change-notifier.ts +80 -0
  446. package/src/transactor/index.ts +1 -0
  447. package/src/transactor/network-transactor.ts +133 -15
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Matchmaking — voting-quorum assembler (db-core, discovery-only composition).
3
+ *
4
+ * The voting subsystem's **discovery** flow, built as a thin composition over the matchmaking module
5
+ * (`docs/matchmaking.md` §Voting-quorum assembly). Matchmaking already provides "find the peers": the
6
+ * stable {@link import("./topic-anchor.js").MatchTopicAnchor}, the signed provider registration
7
+ * ({@link MatchmakingProvider}), the single-cohort hang-out walk and the hot-topic multi-cohort sweep,
8
+ * and the reply-side per-entry `registrationSig` re-validation ({@link verifyProviderEntry}). This
9
+ * module adds the small amount of glue that turns that surface into "assemble a quorum of eligible
10
+ * voters for proposal `P`".
11
+ *
12
+ * **No matchmaking wire-protocol change is introduced.** The genuinely voting-layer pieces are injected
13
+ * or left out of scope entirely:
14
+ *
15
+ * - **Eligibility proof minting** — the caller mints an opaque proof (a signature over the proposal from
16
+ * a stake-bearing key, etc.) and supplies the {@link VotingQuorumRequest.verifyEligibility} predicate
17
+ * over it. Matchmaking treats the proof as opaque bytes carried in the provider's `capabilities`.
18
+ * - **The quorum selection rule** (random sample, stake-weighted, geographic) — injected via
19
+ * {@link VotingQuorumRequest.select}; the default is first-`targetSize`.
20
+ * - **Ballots, tally, dispute, ballot privacy** — out of scope; a separate forthcoming voting doc.
21
+ *
22
+ * ## Resolved design decisions (`docs/matchmaking.md` §Voting-quorum assembly)
23
+ *
24
+ * 1. **Reply-side per-entry verification is the default and required path; a client-side reputation
25
+ * pre-filter is optional and additive.** Quorum-assembly *liveness* must never depend on
26
+ * reputation-subsystem *availability*, so reputation is an optimization, never a dependency.
27
+ * Matchmaking forwards each entry's `registrationSig` plus the eligibility proof in `capabilities`,
28
+ * so reply-side verification is effectively free; the cohort returns ineligible entries the
29
+ * coordinator discards (bandwidth bounded by `query_limit_max × swept-cohort-count`).
30
+ * 2. **Flash-vote fairness among competing coordinators is a voting-layer concern; no matchmaking signal
31
+ * is added.** Matchmaking returns an advisory *candidate set*, never an allocation — overlapping sets
32
+ * are expected and quorum non-collision is decided by the voting protocol.
33
+ * 3. **No matchmaking protocol additions are needed.** `AggregateCountV1` is threshold-signed (an
34
+ * attested *registered*-provider count); an attested *eligible*-voter count, if voting needs one, is a
35
+ * voting-layer aggregate computed after discovery+verification, not a matchmaking message.
36
+ * 4. **Quorum-assembler delegation.** The seeker role may be held by the coordinator itself or by a
37
+ * delegated assembler peer; whoever holds it owns `patienceMs` and the reply-side re-validation duty.
38
+ * A delegated assembler returns an already-validated {@link ProviderEntryV1}`[]`; because every entry
39
+ * carries `registrationSig` + the proof in `capabilities`, the set is independently checkable, so the
40
+ * coordinator MAY re-validate (trust-but-verify) on receipt by re-running the verify→select pipeline.
41
+ *
42
+ * ## Architecture seam
43
+ *
44
+ * db-core is transport-free, so the actual discovery I/O (the register/query/renew walk, the root
45
+ * `AggregateCountV1` sweep) is **injected** as a {@link QuorumDiscovery} port — exactly as the seeker
46
+ * walk client and entry verifier are injected elsewhere in this module. db-p2p binds the port to
47
+ * `MatchmakingSeeker.walk` (single-cohort) and `multi-cohort-seeker` (sweep). The assembler itself never
48
+ * dials voters, never collects ballots, never tallies.
49
+ */
50
+ import { createMatchTopicAnchor } from "./topic-anchor.js";
51
+ import { MatchmakingProvider } from "./provider.js";
52
+ import { verifyProviderEntry } from "./wire.js";
53
+ /** Default concurrent-vote-collection budget for a registered voter — accepts one vote-collection RPC. */
54
+ export const DEFAULT_VOTER_CAPACITY_BUDGET = 1;
55
+ /**
56
+ * Indicative `patienceMs` range for voting-quorum assembly (`docs/matchmaking.md` §Patience budgeting).
57
+ * Advisory only — the layer does not dictate; {@link VotingQuorumAssembler.assembleQuorum} requires a
58
+ * positive budget but does not clamp to this window.
59
+ */
60
+ export const VOTING_PATIENCE_MIN_MS = 30_000;
61
+ export const VOTING_PATIENCE_MAX_MS = 300_000;
62
+ /**
63
+ * Reserved capability-tag prefix carrying a voter's opaque eligibility proof. The proof is bound into the
64
+ * provider `capabilities`, which {@link import("./wire.js").providerSigningPayload} covers, so the
65
+ * provider's `registrationSig` attests the proof verbatim. The caller's `verifyEligibility` predicate
66
+ * reads it back from the forwarded entry via {@link eligibilityProofOf}.
67
+ */
68
+ export const ELIGIBILITY_TAG_PREFIX = "voter-eligibility:";
69
+ /** Encode an opaque eligibility proof as the reserved capability tag. */
70
+ export function eligibilityTag(proof) {
71
+ return ELIGIBILITY_TAG_PREFIX + proof;
72
+ }
73
+ /** Extract the eligibility proof from a capability set, or `undefined` if no eligibility tag is present. */
74
+ export function eligibilityProofFromCapabilities(capabilities) {
75
+ const tag = capabilities.find((c) => c.startsWith(ELIGIBILITY_TAG_PREFIX));
76
+ return tag === undefined ? undefined : tag.slice(ELIGIBILITY_TAG_PREFIX.length);
77
+ }
78
+ /** Extract the eligibility proof carried by a forwarded {@link ProviderEntryV1} (`undefined` if absent). */
79
+ export function eligibilityProofOf(entry) {
80
+ return eligibilityProofFromCapabilities(entry.capabilities);
81
+ }
82
+ /**
83
+ * Discovery-only voting-quorum assembler over the matchmaking module. One instance can act in either
84
+ * role: a voter calls {@link registerEligibleVoter}; a coordinator (or delegated assembler) calls
85
+ * {@link assembleQuorum}. Deps are role-specific and asserted per method, so a coordinator need not
86
+ * supply `sign`/`registerProvider` and a voter need not supply `discovery`/`verifyEntrySig`.
87
+ */
88
+ export class VotingQuorumAssembler {
89
+ anchor;
90
+ deps;
91
+ clock;
92
+ constructor(deps = {}) {
93
+ this.deps = deps;
94
+ this.anchor = deps.anchor ?? createMatchTopicAnchor();
95
+ this.clock = deps.clock ?? (() => Date.now());
96
+ }
97
+ /**
98
+ * The quorum topic anchor for a proposal: `kind = "quorum"`, `label = proposalHash`, yielding
99
+ * `topicId = H("quorum" ‖ proposalHash ‖ "match")` via the matchmaking topic anchor.
100
+ */
101
+ static quorumTopic(proposalHash) {
102
+ return { kind: "quorum", label: proposalHash };
103
+ }
104
+ /** Resolve the cohort-topic `topicId` for a proposal's quorum topic. */
105
+ topicIdFor(proposalHash) {
106
+ const { kind, label } = VotingQuorumAssembler.quorumTopic(proposalHash);
107
+ return this.anchor.topicId(kind, label);
108
+ }
109
+ /**
110
+ * Voter side: bind the caller-minted eligibility proof into `capabilities`, build the signed provider
111
+ * registration, and register it at the quorum topic (cohort-topic T2). The proof is opaque to
112
+ * matchmaking; the provider `signature` covers `(topicId, capabilities, capacityBudget)`, so it binds
113
+ * the proof to the registration.
114
+ */
115
+ async registerEligibleVoter(req) {
116
+ const sign = this.requireSign();
117
+ const registerProvider = this.requireRegisterProvider();
118
+ const topicId = this.topicIdFor(req.proposalHash);
119
+ const capacityBudget = req.capacityBudget ?? DEFAULT_VOTER_CAPACITY_BUDGET;
120
+ const capabilities = mergeEligibilityCapabilities(req.capabilityTags ?? [], req.eligibilityProof);
121
+ const provider = new MatchmakingProvider({
122
+ topicId,
123
+ capabilities,
124
+ capacityBudget,
125
+ contactHint: req.contactHint,
126
+ sign,
127
+ ...(req.serviceUntil !== undefined ? { serviceUntil: req.serviceUntil } : {}),
128
+ ...(this.deps.randomBytes !== undefined ? { randomBytes: this.deps.randomBytes } : {}),
129
+ });
130
+ await registerProvider({ topicId, appPayloadBytes: await provider.appPayloadBytes() });
131
+ }
132
+ /**
133
+ * Coordinator / delegated-assembler side: discover → verify → select. Drives the single-cohort walk,
134
+ * escalates to the multi-cohort sweep on a hot topic (`childCohortCount > 0`) or when `preferSweep`,
135
+ * dedups by `participantId`, applies the optional reputation pre-filter, re-validates each entry's
136
+ * `registrationSig` **and** `verifyEligibility`, then applies the selection rule. Passes the *draining*
137
+ * patience budget to each discovery hop (walk, then sweep) — the deadline is fixed at entry and each
138
+ * hop receives the remaining slice — and on exhaustion returns whatever matched with `metTarget = false`.
139
+ * (Both legs honour `patienceMs`: the walk enforces a wall-clock deadline across hops and hang-out; the
140
+ * sweep stops starting new shard queries once the budget drains. The residual is at most one in-flight
141
+ * shard RPC — assembly never blocks materially past `patienceMs`.)
142
+ */
143
+ async assembleQuorum(req) {
144
+ const discovery = this.requireDiscovery();
145
+ const verifyEntrySig = this.requireVerifyEntrySig();
146
+ const targetSize = requireTargetSize(req.targetSize);
147
+ requirePositivePatience(req.patienceMs);
148
+ const topicId = this.topicIdFor(req.proposalHash);
149
+ const deadline = this.clock() + req.patienceMs;
150
+ const remaining = () => Math.max(0, deadline - this.clock());
151
+ // Step 2: single-cohort walk, then the single-vs-sweep decision.
152
+ const walkSlice = await discovery.walk({ topicId, wantCount: targetSize, patienceMs: remaining() });
153
+ const swept = req.preferSweep === true || walkSlice.childCohortCount > 0;
154
+ const slices = [walkSlice];
155
+ if (swept) {
156
+ slices.push(await discovery.sweep({ topicId, wantCount: targetSize, patienceMs: remaining() }));
157
+ }
158
+ // Step 3: dedup the unioned candidate set by participantId (defensive — promotion/redirect overlap).
159
+ const candidates = dedupByParticipant(slices.flatMap((s) => [...s.entries]));
160
+ // Step 4: optional, additive reputation pre-filter (bandwidth/quality trim; never a dependency).
161
+ const prefiltered = req.reputationPrefilter ? req.reputationPrefilter([...candidates]) : candidates;
162
+ // Step 5: reply-side default — both registrationSig re-validation AND verifyEligibility must pass.
163
+ const eligible = prefiltered.filter((entry) => verifyProviderEntry(topicId, entry, verifyEntrySig) && req.verifyEligibility(entry));
164
+ // Step 6: selection rule (default first targetSize), deduped defensively.
165
+ const select = req.select ?? defaultSelect;
166
+ const quorum = dedupByParticipant(select([...eligible], targetSize));
167
+ return {
168
+ quorum,
169
+ candidates: candidates.length,
170
+ eligible: eligible.length,
171
+ metTarget: quorum.length >= targetSize,
172
+ swept,
173
+ };
174
+ }
175
+ requireDiscovery() {
176
+ if (this.deps.discovery === undefined) {
177
+ throw new Error("VotingQuorumAssembler.assembleQuorum requires a `discovery` dependency");
178
+ }
179
+ return this.deps.discovery;
180
+ }
181
+ requireVerifyEntrySig() {
182
+ if (this.deps.verifyEntrySig === undefined) {
183
+ throw new Error("VotingQuorumAssembler.assembleQuorum requires a `verifyEntrySig` dependency");
184
+ }
185
+ return this.deps.verifyEntrySig;
186
+ }
187
+ requireSign() {
188
+ if (this.deps.sign === undefined) {
189
+ throw new Error("VotingQuorumAssembler.registerEligibleVoter requires a `sign` dependency");
190
+ }
191
+ return this.deps.sign;
192
+ }
193
+ requireRegisterProvider() {
194
+ if (this.deps.registerProvider === undefined) {
195
+ throw new Error("VotingQuorumAssembler.registerEligibleVoter requires a `registerProvider` dependency");
196
+ }
197
+ return this.deps.registerProvider;
198
+ }
199
+ }
200
+ /** The default selection rule: take the first `targetSize` eligible entries (the discovery order). */
201
+ export function defaultSelect(eligible, targetSize) {
202
+ return eligible.slice(0, targetSize);
203
+ }
204
+ /**
205
+ * Merge application capability tags with the eligibility proof tag: drop any caller-supplied tag that
206
+ * already uses the reserved prefix (the proof is authoritative), then append exactly one proof tag.
207
+ * Order is preserved end-to-end (the cohort forwards `capabilities` verbatim), so the provider signature
208
+ * reconstructs byte-for-byte on the seeker side.
209
+ */
210
+ function mergeEligibilityCapabilities(tags, proof) {
211
+ const appTags = tags.filter((tag) => !tag.startsWith(ELIGIBILITY_TAG_PREFIX));
212
+ return [...appTags, eligibilityTag(proof)];
213
+ }
214
+ /** Dedup entries by `participantId`, keeping the first occurrence (preserves discovery/FCFS order). */
215
+ function dedupByParticipant(entries) {
216
+ const seen = new Map();
217
+ for (const entry of entries) {
218
+ if (!seen.has(entry.participantId)) {
219
+ seen.set(entry.participantId, entry);
220
+ }
221
+ }
222
+ return [...seen.values()];
223
+ }
224
+ /** Validate `targetSize` is an integer `>= 1`. */
225
+ function requireTargetSize(targetSize) {
226
+ if (!Number.isInteger(targetSize) || targetSize < 1) {
227
+ throw new RangeError(`voting quorum: targetSize must be an integer >= 1, got ${targetSize}`);
228
+ }
229
+ return targetSize;
230
+ }
231
+ /** Validate `patienceMs` is a finite number `> 0` (the voting 30–300 s range is advisory, not enforced). */
232
+ function requirePositivePatience(patienceMs) {
233
+ if (!Number.isFinite(patienceMs) || patienceMs <= 0) {
234
+ throw new RangeError(`voting quorum: patienceMs must be a finite number > 0, got ${patienceMs}`);
235
+ }
236
+ return patienceMs;
237
+ }
238
+ //# sourceMappingURL=voting-quorum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voting-quorum.js","sourceRoot":"","sources":["../../../src/matchmaking/voting-quorum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Matchmaking — V1 wire types, codecs, and per-message validation.
3
+ *
4
+ * Transcribed from `docs/matchmaking.md` §Wire formats. Matchmaking reuses the cohort-topic
5
+ * `RegisterV1` / `RenewV1` envelopes **unchanged**; the matchmaking-specific shape lives in two
6
+ * places:
7
+ *
8
+ * 1. **App payloads** ({@link ProviderAppPayloadV1} / {@link SeekerAppPayloadV1}) carried opaquely
9
+ * inside `RegisterV1.appPayload`. These are serialized to UTF-8 JSON bytes and handed to the
10
+ * cohort-topic {@link import("../cohort-topic/service.js").RegisterRequest}`.appPayload` slot,
11
+ * which base64url-encodes them on the wire. They are therefore **not** length-framed here — the
12
+ * cohort-topic `RegisterV1` frame wraps them.
13
+ *
14
+ * 2. **Query-protocol messages** ({@link QueryV1} / {@link QueryReplyV1} / {@link AggregateCountV1})
15
+ * sent as standalone RPCs over the matchmaking application protocol. These ride the same
16
+ * length-prefixed UTF-8 JSON framing as cohort-topic messages ({@link encodeCohortMessage}).
17
+ *
18
+ * Conventions (matching the cohort-topic wire conventions): all JSON, byte fields base64url (no
19
+ * padding), unix-millisecond timestamps, per-message structural validation on decode. Byte fidelity
20
+ * round-trips (encode→decode→encode is stable). The query-protocol producers (cohort-side reply,
21
+ * root-cohort aggregate sweep) land in later tickets; their decoders live here so the seeker side can
22
+ * be unit-tested against fixtures.
23
+ */
24
+ import type { TopicTrafficV1 } from "../cohort-topic/wire/types.js";
25
+ /** A provider's registration payload (`SubscribeAppPayloadV1.appPayload`, `kind == "match-provider"`). */
26
+ export interface ProviderAppPayloadV1 {
27
+ kind: "match-provider";
28
+ /** Application-defined attribute tags. */
29
+ capabilities: string[];
30
+ /** Concurrent tasks accepted; `0` == "listed but full". */
31
+ capacityBudget: number;
32
+ /** Unix ms, soft expiry hint to seekers. */
33
+ serviceUntil?: number;
34
+ /** Multiaddr or PeerId-based callback. */
35
+ contactHint: string;
36
+ /** base64url, over `(topicId, capabilities, capacityBudget)` — see {@link providerSigningPayload}. */
37
+ signature: string;
38
+ }
39
+ /** A seeker's registration payload (`SubscribeAppPayloadV1.appPayload`, `kind == "match-seeker"`). */
40
+ export interface SeekerAppPayloadV1 {
41
+ kind: "match-seeker";
42
+ /** Number of providers desired. */
43
+ wantCount: number;
44
+ /** Optional capability filter. */
45
+ filter?: CapabilityFilter;
46
+ /** For collective-assembly use. */
47
+ contactHint: string;
48
+ /** Opt into arrival pushes; default false (poll path). */
49
+ pushOnArrival?: boolean;
50
+ /** base64url. */
51
+ signature: string;
52
+ }
53
+ /** A capability filter, evaluated locally at the cohort (advisory — the seeker re-validates). */
54
+ export interface CapabilityFilter {
55
+ /** Tags that must all be present. */
56
+ must: string[];
57
+ /** Tags that must not be present. */
58
+ mustNot: string[];
59
+ /** Skip providers whose `capacityBudget` is below this. */
60
+ minBudget?: number;
61
+ }
62
+ /** A seeker's query against a cohort for the providers/seekers it holds. */
63
+ export interface QueryV1 {
64
+ v: 1;
65
+ /** Topic id, base64url. */
66
+ topicId: string;
67
+ includeProviders: boolean;
68
+ includeSeekers: boolean;
69
+ filter?: CapabilityFilter;
70
+ /** `<= query_limit_max` (256). */
71
+ limit: number;
72
+ /** Requesting PeerId. */
73
+ requesterId: string;
74
+ /** Unix ms. */
75
+ timestamp: number;
76
+ /** base64url. */
77
+ signature: string;
78
+ }
79
+ /** A cohort's advisory reply to a {@link QueryV1} (signed by the cohort primary, not threshold). */
80
+ export interface QueryReplyV1 {
81
+ v: 1;
82
+ providers?: ProviderEntryV1[];
83
+ seekers?: SeekerEntryV1[];
84
+ truncated: boolean;
85
+ /** base64url. */
86
+ cohortEpoch: string;
87
+ /** From cohort-topic; consumed by the hang-out engine (next ticket). */
88
+ topicTraffic: TopicTrafficV1;
89
+ /** Cohort PRIMARY single-member signature (NOT threshold), base64url. */
90
+ signature: string;
91
+ }
92
+ /** A provider entry in a {@link QueryReplyV1}. */
93
+ export interface ProviderEntryV1 {
94
+ /** PeerId. */
95
+ participantId: string;
96
+ capabilities: string[];
97
+ capacityBudget: number;
98
+ contactHint: string;
99
+ /** Unix ms. */
100
+ attachedAt: number;
101
+ /** Provider's original signature, forwarded for seeker re-validation, base64url. */
102
+ registrationSig: string;
103
+ }
104
+ /** A seeker entry in a {@link QueryReplyV1} (collective-assembly discovery). */
105
+ export interface SeekerEntryV1 {
106
+ /** PeerId. */
107
+ participantId: string;
108
+ wantCount: number;
109
+ contactHint: string;
110
+ /** Unix ms. */
111
+ attachedAt: number;
112
+ /** base64url. */
113
+ registrationSig: string;
114
+ }
115
+ /**
116
+ * Root-cohort multi-cohort-sweep summary (`docs/matchmaking.md` §Aggregated provider counts).
117
+ *
118
+ * Unlike {@link QueryReplyV1}, this is **threshold-signed** — it attests a cohort-agreed *registered*
119
+ * provider count, not one primary's advisory view — so it carries the same `(thresholdSig, signers)`
120
+ * envelope the cohort-topic {@link import("../cohort-topic/wire/types.js").PromotionNoticeV1} uses:
121
+ * `signature` is the concatenated cohort multisig blob and `signers` is the distinct `>= minSigs` member
122
+ * subset that produced it. A verifier splits the blob by `signers` and checks the subset against the
123
+ * cohort membership certificate (db-p2p binds the crypto). `signers` is required precisely because a
124
+ * threshold blob is unverifiable without the signer set that aligns chunk `i` ↔ `signers[i]`.
125
+ */
126
+ export interface AggregateCountV1 {
127
+ v: 1;
128
+ /** Topic id, base64url. */
129
+ topicId: string;
130
+ /** `count` is log-bucketed (see {@link logBucketCount}). */
131
+ bucketCounts: AggregateBucketV1[];
132
+ /** Cohort threshold-signature blob over {@link aggregateCountSigningPayload}, base64url. */
133
+ signature: string;
134
+ /** PeerIds of the `>= minSigs` threshold signers, base64url (aligns the `signature` blob). */
135
+ signers: string[];
136
+ /** base64url. */
137
+ cohortEpoch: string;
138
+ }
139
+ /** One bucketed shard count inside an {@link AggregateCountV1}. */
140
+ export interface AggregateBucketV1 {
141
+ targetTier: number;
142
+ prefixSlot: number;
143
+ /** Log-bucketed. */
144
+ count: number;
145
+ }
146
+ /** Ceiling for an opaque app payload (provider/seeker), guarding decode allocation. */
147
+ export declare const DEFAULT_MAX_APP_PAYLOAD_BYTES: number;
148
+ /** Narrow an already-parsed value to {@link ProviderAppPayloadV1}, throwing on any defect. */
149
+ export declare function validateProviderAppPayloadV1(value: unknown): ProviderAppPayloadV1;
150
+ /** Narrow an already-parsed value to {@link SeekerAppPayloadV1}, throwing on any defect. */
151
+ export declare function validateSeekerAppPayloadV1(value: unknown): SeekerAppPayloadV1;
152
+ /** Serialize a {@link ProviderAppPayloadV1} to the opaque UTF-8 JSON bytes for `RegisterV1.appPayload`. */
153
+ export declare function encodeProviderAppPayload(payload: ProviderAppPayloadV1): Uint8Array;
154
+ /** Decode opaque `RegisterV1.appPayload` bytes back to a validated {@link ProviderAppPayloadV1}. */
155
+ export declare function decodeProviderAppPayload(bytes: Uint8Array, maxBytes?: number): ProviderAppPayloadV1;
156
+ /** Serialize a {@link SeekerAppPayloadV1} to the opaque UTF-8 JSON bytes for `RegisterV1.appPayload`. */
157
+ export declare function encodeSeekerAppPayload(payload: SeekerAppPayloadV1): Uint8Array;
158
+ /** Decode opaque `RegisterV1.appPayload` bytes back to a validated {@link SeekerAppPayloadV1}. */
159
+ export declare function decodeSeekerAppPayload(bytes: Uint8Array, maxBytes?: number): SeekerAppPayloadV1;
160
+ /** Either matchmaking registration payload, discriminated by `kind`. */
161
+ export type MatchAppPayloadV1 = ProviderAppPayloadV1 | SeekerAppPayloadV1;
162
+ /**
163
+ * Decode an opaque `RegisterV1.appPayload` to whichever matchmaking payload it carries, dispatched on
164
+ * `kind` (parsed once — no exception-as-control-flow). The cohort query handler uses this to classify a
165
+ * registration record into a provider vs. seeker entry. Throws {@link CohortWireError} on an unknown
166
+ * `kind` or a malformed payload.
167
+ */
168
+ export declare function decodeMatchAppPayload(bytes: Uint8Array, maxBytes?: number): MatchAppPayloadV1;
169
+ /** Narrow an already-parsed value to {@link QueryV1}, throwing on any defect. */
170
+ export declare function validateQueryV1(value: unknown): QueryV1;
171
+ /** Narrow an already-parsed value to {@link QueryReplyV1}, throwing on any defect. */
172
+ export declare function validateQueryReplyV1(value: unknown): QueryReplyV1;
173
+ /** Narrow an already-parsed value to {@link AggregateCountV1}, throwing on any defect. */
174
+ export declare function validateAggregateCountV1(value: unknown): AggregateCountV1;
175
+ /** Encode a {@link QueryV1} as a length-prefixed UTF-8 JSON frame. */
176
+ export declare function encodeQueryV1(msg: QueryV1, maxMessageBytes?: number): Uint8Array;
177
+ /** Decode a length-prefixed {@link QueryV1} frame. */
178
+ export declare function decodeQueryV1(bytes: Uint8Array, maxMessageBytes?: number): QueryV1;
179
+ /** Encode a {@link QueryReplyV1} as a length-prefixed UTF-8 JSON frame. */
180
+ export declare function encodeQueryReplyV1(msg: QueryReplyV1, maxMessageBytes?: number): Uint8Array;
181
+ /** Decode a length-prefixed {@link QueryReplyV1} frame. */
182
+ export declare function decodeQueryReplyV1(bytes: Uint8Array, maxMessageBytes?: number): QueryReplyV1;
183
+ /** Encode an {@link AggregateCountV1} as a length-prefixed UTF-8 JSON frame. */
184
+ export declare function encodeAggregateCountV1(msg: AggregateCountV1, maxMessageBytes?: number): Uint8Array;
185
+ /** Decode a length-prefixed {@link AggregateCountV1} frame. */
186
+ export declare function decodeAggregateCountV1(bytes: Uint8Array, maxMessageBytes?: number): AggregateCountV1;
187
+ /**
188
+ * Canonical signed byte image of a provider registration — `(topicId, capabilities, capacityBudget)`
189
+ * per `docs/matchmaking.md` §Wire formats.
190
+ *
191
+ * **Signing scope (resolved):** the signed image deliberately excludes the matchmaking
192
+ * `correlationId`. The advisory trust model (matchmaking.md §Wire formats) requires a seeker to
193
+ * re-validate each forwarded {@link ProviderEntryV1}'s `registrationSig`, and a {@link ProviderEntryV1}
194
+ * carries **no** `correlationId` field — so binding the signature over `correlationId` would leave the
195
+ * seeker unable to reconstruct the exact signed image. Dropping it (option (b) of the implement ticket)
196
+ * keeps the signed image fully self-contained in the forwarded entry: `topicId` (the topic the seeker
197
+ * queried) + `capabilities` + `capacityBudget`. Replay-binding of the *registration* is handled
198
+ * independently by the cohort-topic `RegisterV1` envelope (its own `correlationId` + replay guard +
199
+ * peer-key signature); the matchmaking signature only attests provider authorship of the advertised
200
+ * capabilities, which the participant peer key (the entry's `participantId`) anchors.
201
+ *
202
+ * Determinism comes from an explicitly-ordered array (stable, unlike object key order), exactly like
203
+ * the cohort-topic `registerSigningPayload`. `topicId` is passed as raw bytes and emitted as base64url
204
+ * so signer and verifier agree byte-for-byte.
205
+ */
206
+ export declare function providerSigningPayload(topicId: Uint8Array, capabilities: readonly string[], capacityBudget: number): Uint8Array;
207
+ /**
208
+ * Canonical signed byte image of a seeker registration — `(topicId, wantCount)`. Mirrors the provider
209
+ * scope (option (b), see {@link providerSigningPayload}): the image excludes `correlationId` so it is
210
+ * fully reconstructable from a forwarded {@link SeekerEntryV1} (`participantId` + `wantCount`) for
211
+ * collective-assembly re-validation.
212
+ */
213
+ export declare function seekerSigningPayload(topicId: Uint8Array, wantCount: number): Uint8Array;
214
+ /**
215
+ * Verifies a forwarded entry's `registrationSig`. db-core is crypto-free, so the actual peer-key check
216
+ * is injected (db-p2p binds it to {@link import("@optimystic/db-p2p").verifyPeerSig} over the
217
+ * participant's Ed25519 peer key). `signerId` is the entry's `participantId` (a peer-id string); the
218
+ * verifier resolves the public key from it. Returns `false` (never throws) on a malformed signature.
219
+ */
220
+ export type EntrySigVerifier = (signerId: string, payload: Uint8Array, signature: Uint8Array) => boolean;
221
+ /**
222
+ * Re-validate a forwarded {@link ProviderEntryV1} against the topic it was returned for: reconstruct the
223
+ * provider signing image from the entry's own fields and verify `registrationSig` against the entry's
224
+ * `participantId`. This is the seeker-side check the advisory trust model hinges on — the cohort vouches
225
+ * only for "these were the registrations I held", never for provider authenticity.
226
+ */
227
+ export declare function verifyProviderEntry(topicId: Uint8Array, entry: ProviderEntryV1, verify: EntrySigVerifier): boolean;
228
+ /** Re-validate a forwarded {@link SeekerEntryV1} (collective-assembly discovery), mirroring {@link verifyProviderEntry}. */
229
+ export declare function verifySeekerEntry(topicId: Uint8Array, entry: SeekerEntryV1, verify: EntrySigVerifier): boolean;
230
+ /**
231
+ * Canonical signed byte image of a {@link QueryReplyV1} — the cohort **primary's** single-member
232
+ * signature (not threshold), per `docs/matchmaking.md` §Wire formats. The primary vouches only for the
233
+ * *set it held*; provider authenticity is re-validated per entry via {@link verifyProviderEntry}. The
234
+ * image binds the epoch, truncation flag, traffic snapshot, and the participant ids of each returned
235
+ * entry (order-sensitive) so a tampered reply is detectable, while staying independent of the
236
+ * advisory per-entry signatures.
237
+ */
238
+ export declare function queryReplySigningPayload(reply: Omit<QueryReplyV1, "signature">): Uint8Array;
239
+ /**
240
+ * Log-bucket a raw provider count for an {@link AggregateCountV1} bucket: the largest power of two
241
+ * `<= n` (and `0` for `n <= 0`). The root reports bucketed, not exact, per-shard populations
242
+ * (`docs/matchmaking.md` §Multi-cohort sweep) — both to compress the summary and to avoid leaking exact
243
+ * counts.
244
+ *
245
+ * The bucketing rounds **down** and is monotonic non-decreasing, so a consumer summing bucketed counts
246
+ * (`multi-cohort-seeker.selectShards`) *under*-estimates the true population. That bias is the safe
247
+ * direction for shard selection: the real population is always `>=` the reported one, so selecting until
248
+ * the bucketed sum reaches `wantCount` naturally over-provisions rather than under-selecting.
249
+ */
250
+ export declare function logBucketCount(n: number): number;
251
+ /**
252
+ * Canonical threshold-signed byte image of an {@link AggregateCountV1} — covers the semantic fields
253
+ * (`v`, `topicId`, `cohortEpoch`, and the bucket set) but never the `signature`/`signers` envelope,
254
+ * exactly as the cohort-topic `sig/payloads.ts` builders do for their threshold-signed notices. The
255
+ * bucket set is sorted by `(targetTier, prefixSlot)` so the image is independent of bucket emission
256
+ * order — signer and verifier recompute identical bytes.
257
+ */
258
+ export declare function aggregateCountSigningPayload(unsigned: Omit<AggregateCountV1, "signature" | "signers">): Uint8Array;
259
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/matchmaking/wire.ts"],"names":[],"mappings":"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"}