@optimystic/db-core 0.14.1 → 0.16.3

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 (301) hide show
  1. package/dist/src/blocks/block-store.d.ts +18 -1
  2. package/dist/src/blocks/block-store.d.ts.map +1 -1
  3. package/dist/src/blocks/helpers.d.ts +2 -2
  4. package/dist/src/blocks/helpers.d.ts.map +1 -1
  5. package/dist/src/blocks/helpers.js +2 -2
  6. package/dist/src/blocks/helpers.js.map +1 -1
  7. package/dist/src/btree/btree.d.ts +27 -6
  8. package/dist/src/btree/btree.d.ts.map +1 -1
  9. package/dist/src/btree/btree.js +104 -61
  10. package/dist/src/btree/btree.js.map +1 -1
  11. package/dist/src/chain/chain.d.ts.map +1 -1
  12. package/dist/src/chain/chain.js +11 -1
  13. package/dist/src/chain/chain.js.map +1 -1
  14. package/dist/src/cluster/index.d.ts +1 -0
  15. package/dist/src/cluster/index.d.ts.map +1 -1
  16. package/dist/src/cluster/index.js +1 -0
  17. package/dist/src/cluster/index.js.map +1 -1
  18. package/dist/src/cluster/membership.d.ts +49 -0
  19. package/dist/src/cluster/membership.d.ts.map +1 -0
  20. package/dist/src/cluster/membership.js +75 -0
  21. package/dist/src/cluster/membership.js.map +1 -0
  22. package/dist/src/cluster/structs.d.ts +50 -1
  23. package/dist/src/cluster/structs.d.ts.map +1 -1
  24. package/dist/src/cluster/structs.js +9 -1
  25. package/dist/src/cluster/structs.js.map +1 -1
  26. package/dist/src/cohort-topic/addressing.d.ts +8 -2
  27. package/dist/src/cohort-topic/addressing.d.ts.map +1 -1
  28. package/dist/src/cohort-topic/addressing.js +11 -3
  29. package/dist/src/cohort-topic/addressing.js.map +1 -1
  30. package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts +13 -7
  31. package/dist/src/cohort-topic/antidos/bootstrap-evidence.d.ts.map +1 -1
  32. package/dist/src/cohort-topic/antidos/bootstrap-evidence.js +17 -6
  33. package/dist/src/cohort-topic/antidos/bootstrap-evidence.js.map +1 -1
  34. package/dist/src/cohort-topic/antidos/replay-guard.d.ts +17 -0
  35. package/dist/src/cohort-topic/antidos/replay-guard.d.ts.map +1 -1
  36. package/dist/src/cohort-topic/antidos/replay-guard.js +33 -0
  37. package/dist/src/cohort-topic/antidos/replay-guard.js.map +1 -1
  38. package/dist/src/cohort-topic/antidos/topic-budget.d.ts +7 -0
  39. package/dist/src/cohort-topic/antidos/topic-budget.d.ts.map +1 -1
  40. package/dist/src/cohort-topic/antidos/topic-budget.js +8 -2
  41. package/dist/src/cohort-topic/antidos/topic-budget.js.map +1 -1
  42. package/dist/src/cohort-topic/coldstart.d.ts +34 -14
  43. package/dist/src/cohort-topic/coldstart.d.ts.map +1 -1
  44. package/dist/src/cohort-topic/coldstart.js +25 -11
  45. package/dist/src/cohort-topic/coldstart.js.map +1 -1
  46. package/dist/src/cohort-topic/gossip/bus.d.ts +12 -1
  47. package/dist/src/cohort-topic/gossip/bus.d.ts.map +1 -1
  48. package/dist/src/cohort-topic/gossip/bus.js +27 -1
  49. package/dist/src/cohort-topic/gossip/bus.js.map +1 -1
  50. package/dist/src/cohort-topic/gossip/view.d.ts +8 -0
  51. package/dist/src/cohort-topic/gossip/view.d.ts.map +1 -1
  52. package/dist/src/cohort-topic/gossip/view.js +17 -1
  53. package/dist/src/cohort-topic/gossip/view.js.map +1 -1
  54. package/dist/src/cohort-topic/member-engine.d.ts +10 -3
  55. package/dist/src/cohort-topic/member-engine.d.ts.map +1 -1
  56. package/dist/src/cohort-topic/member-engine.js +29 -14
  57. package/dist/src/cohort-topic/member-engine.js.map +1 -1
  58. package/dist/src/cohort-topic/membership/publisher.d.ts +14 -7
  59. package/dist/src/cohort-topic/membership/publisher.d.ts.map +1 -1
  60. package/dist/src/cohort-topic/membership/publisher.js +15 -27
  61. package/dist/src/cohort-topic/membership/publisher.js.map +1 -1
  62. package/dist/src/cohort-topic/membership/verifier.d.ts +35 -0
  63. package/dist/src/cohort-topic/membership/verifier.d.ts.map +1 -1
  64. package/dist/src/cohort-topic/membership/verifier.js +88 -3
  65. package/dist/src/cohort-topic/membership/verifier.js.map +1 -1
  66. package/dist/src/cohort-topic/promotion.d.ts +7 -0
  67. package/dist/src/cohort-topic/promotion.d.ts.map +1 -1
  68. package/dist/src/cohort-topic/promotion.js +16 -2
  69. package/dist/src/cohort-topic/promotion.js.map +1 -1
  70. package/dist/src/cohort-topic/registration/renewal.d.ts +18 -0
  71. package/dist/src/cohort-topic/registration/renewal.d.ts.map +1 -1
  72. package/dist/src/cohort-topic/registration/renewal.js +54 -0
  73. package/dist/src/cohort-topic/registration/renewal.js.map +1 -1
  74. package/dist/src/cohort-topic/registration/types.d.ts +12 -0
  75. package/dist/src/cohort-topic/registration/types.d.ts.map +1 -1
  76. package/dist/src/cohort-topic/registration/types.js +14 -0
  77. package/dist/src/cohort-topic/registration/types.js.map +1 -1
  78. package/dist/src/cohort-topic/service.d.ts +4 -3
  79. package/dist/src/cohort-topic/service.d.ts.map +1 -1
  80. package/dist/src/cohort-topic/service.js +38 -12
  81. package/dist/src/cohort-topic/service.js.map +1 -1
  82. package/dist/src/cohort-topic/sig/payloads.d.ts +23 -7
  83. package/dist/src/cohort-topic/sig/payloads.d.ts.map +1 -1
  84. package/dist/src/cohort-topic/sig/payloads.js +22 -6
  85. package/dist/src/cohort-topic/sig/payloads.js.map +1 -1
  86. package/dist/src/cohort-topic/traffic.d.ts +6 -0
  87. package/dist/src/cohort-topic/traffic.d.ts.map +1 -1
  88. package/dist/src/cohort-topic/traffic.js +16 -1
  89. package/dist/src/cohort-topic/traffic.js.map +1 -1
  90. package/dist/src/cohort-topic/walk.d.ts +22 -7
  91. package/dist/src/cohort-topic/walk.d.ts.map +1 -1
  92. package/dist/src/cohort-topic/walk.js +78 -18
  93. package/dist/src/cohort-topic/walk.js.map +1 -1
  94. package/dist/src/cohort-topic/wire/codec.d.ts +3 -1
  95. package/dist/src/cohort-topic/wire/codec.d.ts.map +1 -1
  96. package/dist/src/cohort-topic/wire/codec.js +7 -1
  97. package/dist/src/cohort-topic/wire/codec.js.map +1 -1
  98. package/dist/src/cohort-topic/wire/index.d.ts +1 -1
  99. package/dist/src/cohort-topic/wire/index.d.ts.map +1 -1
  100. package/dist/src/cohort-topic/wire/index.js +1 -1
  101. package/dist/src/cohort-topic/wire/index.js.map +1 -1
  102. package/dist/src/cohort-topic/wire/payloads.d.ts +5 -4
  103. package/dist/src/cohort-topic/wire/payloads.d.ts.map +1 -1
  104. package/dist/src/cohort-topic/wire/payloads.js +14 -5
  105. package/dist/src/cohort-topic/wire/payloads.js.map +1 -1
  106. package/dist/src/cohort-topic/wire/primitives.d.ts +65 -0
  107. package/dist/src/cohort-topic/wire/primitives.d.ts.map +1 -0
  108. package/dist/src/cohort-topic/wire/primitives.js +173 -0
  109. package/dist/src/cohort-topic/wire/primitives.js.map +1 -0
  110. package/dist/src/cohort-topic/wire/types.d.ts +132 -5
  111. package/dist/src/cohort-topic/wire/types.d.ts.map +1 -1
  112. package/dist/src/cohort-topic/wire/validate.d.ts +15 -5
  113. package/dist/src/cohort-topic/wire/validate.d.ts.map +1 -1
  114. package/dist/src/cohort-topic/wire/validate.js +146 -123
  115. package/dist/src/cohort-topic/wire/validate.js.map +1 -1
  116. package/dist/src/collection/collection.d.ts +23 -12
  117. package/dist/src/collection/collection.d.ts.map +1 -1
  118. package/dist/src/collection/collection.js +111 -35
  119. package/dist/src/collection/collection.js.map +1 -1
  120. package/dist/src/collection/struct.d.ts +37 -2
  121. package/dist/src/collection/struct.d.ts.map +1 -1
  122. package/dist/src/collection/struct.js +16 -1
  123. package/dist/src/collection/struct.js.map +1 -1
  124. package/dist/src/collections/tree/tree.d.ts +18 -1
  125. package/dist/src/collections/tree/tree.d.ts.map +1 -1
  126. package/dist/src/collections/tree/tree.js +36 -6
  127. package/dist/src/collections/tree/tree.js.map +1 -1
  128. package/dist/src/index.d.ts +1 -0
  129. package/dist/src/index.d.ts.map +1 -1
  130. package/dist/src/index.js +1 -0
  131. package/dist/src/index.js.map +1 -1
  132. package/dist/src/log/log.d.ts +26 -3
  133. package/dist/src/log/log.d.ts.map +1 -1
  134. package/dist/src/log/log.js +34 -7
  135. package/dist/src/log/log.js.map +1 -1
  136. package/dist/src/log/struct.d.ts +5 -4
  137. package/dist/src/log/struct.d.ts.map +1 -1
  138. package/dist/src/log/struct.js.map +1 -1
  139. package/dist/src/matchmaking/wire.d.ts +2 -1
  140. package/dist/src/matchmaking/wire.d.ts.map +1 -1
  141. package/dist/src/matchmaking/wire.js +13 -92
  142. package/dist/src/matchmaking/wire.js.map +1 -1
  143. package/dist/src/network/i-key-network.d.ts +9 -0
  144. package/dist/src/network/i-key-network.d.ts.map +1 -1
  145. package/dist/src/network/i-repo.d.ts +8 -0
  146. package/dist/src/network/i-repo.d.ts.map +1 -1
  147. package/dist/src/network/struct.d.ts +10 -0
  148. package/dist/src/network/struct.d.ts.map +1 -1
  149. package/dist/src/reactivity/push-state.d.ts.map +1 -1
  150. package/dist/src/reactivity/push-state.js +4 -33
  151. package/dist/src/reactivity/push-state.js.map +1 -1
  152. package/dist/src/reactivity/wire-validate.d.ts +7 -22
  153. package/dist/src/reactivity/wire-validate.d.ts.map +1 -1
  154. package/dist/src/reactivity/wire-validate.js +7 -73
  155. package/dist/src/reactivity/wire-validate.js.map +1 -1
  156. package/dist/src/reactivity/wire.js +3 -3
  157. package/dist/src/reactivity/wire.js.map +1 -1
  158. package/dist/src/testing/async-wait.d.ts +23 -0
  159. package/dist/src/testing/async-wait.d.ts.map +1 -0
  160. package/dist/src/testing/async-wait.js +42 -0
  161. package/dist/src/testing/async-wait.js.map +1 -0
  162. package/dist/src/testing/index.d.ts +3 -0
  163. package/dist/src/testing/index.d.ts.map +1 -0
  164. package/dist/src/testing/index.js +3 -0
  165. package/dist/src/testing/index.js.map +1 -0
  166. package/dist/src/testing/test-transactor.d.ts +44 -0
  167. package/dist/src/testing/test-transactor.d.ts.map +1 -0
  168. package/dist/src/testing/test-transactor.js +423 -0
  169. package/dist/src/testing/test-transactor.js.map +1 -0
  170. package/dist/src/transaction/actions-engine.d.ts +6 -3
  171. package/dist/src/transaction/actions-engine.d.ts.map +1 -1
  172. package/dist/src/transaction/actions-engine.js +8 -7
  173. package/dist/src/transaction/actions-engine.js.map +1 -1
  174. package/dist/src/transaction/coordinator.d.ts +43 -22
  175. package/dist/src/transaction/coordinator.d.ts.map +1 -1
  176. package/dist/src/transaction/coordinator.js +443 -178
  177. package/dist/src/transaction/coordinator.js.map +1 -1
  178. package/dist/src/transaction/errors.d.ts +82 -0
  179. package/dist/src/transaction/errors.d.ts.map +1 -0
  180. package/dist/src/transaction/errors.js +93 -0
  181. package/dist/src/transaction/errors.js.map +1 -0
  182. package/dist/src/transaction/index.d.ts +6 -3
  183. package/dist/src/transaction/index.d.ts.map +1 -1
  184. package/dist/src/transaction/index.js +4 -2
  185. package/dist/src/transaction/index.js.map +1 -1
  186. package/dist/src/transaction/operations-hash.d.ts +119 -0
  187. package/dist/src/transaction/operations-hash.d.ts.map +1 -0
  188. package/dist/src/transaction/operations-hash.js +180 -0
  189. package/dist/src/transaction/operations-hash.js.map +1 -0
  190. package/dist/src/transaction/read-dependency-collector.d.ts +43 -0
  191. package/dist/src/transaction/read-dependency-collector.d.ts.map +1 -0
  192. package/dist/src/transaction/read-dependency-collector.js +69 -0
  193. package/dist/src/transaction/read-dependency-collector.js.map +1 -0
  194. package/dist/src/transaction/session.d.ts +12 -3
  195. package/dist/src/transaction/session.d.ts.map +1 -1
  196. package/dist/src/transaction/session.js +35 -9
  197. package/dist/src/transaction/session.js.map +1 -1
  198. package/dist/src/transaction/transaction.d.ts +162 -1
  199. package/dist/src/transaction/transaction.d.ts.map +1 -1
  200. package/dist/src/transaction/transaction.js +85 -3
  201. package/dist/src/transaction/transaction.js.map +1 -1
  202. package/dist/src/transaction/validator.d.ts +3 -11
  203. package/dist/src/transaction/validator.d.ts.map +1 -1
  204. package/dist/src/transaction/validator.js +69 -28
  205. package/dist/src/transaction/validator.js.map +1 -1
  206. package/dist/src/transactor/network-transactor.d.ts +35 -0
  207. package/dist/src/transactor/network-transactor.d.ts.map +1 -1
  208. package/dist/src/transactor/network-transactor.js +146 -40
  209. package/dist/src/transactor/network-transactor.js.map +1 -1
  210. package/dist/src/transactor/transactor-source.d.ts +19 -5
  211. package/dist/src/transactor/transactor-source.d.ts.map +1 -1
  212. package/dist/src/transactor/transactor-source.js +43 -11
  213. package/dist/src/transactor/transactor-source.js.map +1 -1
  214. package/dist/src/transform/atomic-proxy.d.ts +35 -5
  215. package/dist/src/transform/atomic-proxy.d.ts.map +1 -1
  216. package/dist/src/transform/atomic-proxy.js +39 -7
  217. package/dist/src/transform/atomic-proxy.js.map +1 -1
  218. package/dist/src/transform/cache-source.d.ts +36 -5
  219. package/dist/src/transform/cache-source.d.ts.map +1 -1
  220. package/dist/src/transform/cache-source.js +84 -8
  221. package/dist/src/transform/cache-source.js.map +1 -1
  222. package/dist/src/transform/helpers.d.ts.map +1 -1
  223. package/dist/src/transform/helpers.js +8 -2
  224. package/dist/src/transform/helpers.js.map +1 -1
  225. package/dist/src/transform/tracker.d.ts +17 -2
  226. package/dist/src/transform/tracker.d.ts.map +1 -1
  227. package/dist/src/transform/tracker.js +66 -11
  228. package/dist/src/transform/tracker.js.map +1 -1
  229. package/dist/src/utility/backoff.d.ts +48 -0
  230. package/dist/src/utility/backoff.d.ts.map +1 -0
  231. package/dist/src/utility/backoff.js +60 -0
  232. package/dist/src/utility/backoff.js.map +1 -0
  233. package/dist/src/utility/pending.d.ts +1 -0
  234. package/dist/src/utility/pending.d.ts.map +1 -1
  235. package/dist/src/utility/pending.js +3 -1
  236. package/dist/src/utility/pending.js.map +1 -1
  237. package/package.json +4 -4
  238. package/src/blocks/block-store.ts +19 -1
  239. package/src/blocks/helpers.ts +3 -3
  240. package/src/btree/btree.ts +108 -63
  241. package/src/chain/chain.ts +11 -1
  242. package/src/cluster/index.ts +1 -0
  243. package/src/cluster/membership.ts +85 -0
  244. package/src/cluster/structs.ts +51 -1
  245. package/src/cohort-topic/addressing.ts +12 -4
  246. package/src/cohort-topic/antidos/bootstrap-evidence.ts +21 -9
  247. package/src/cohort-topic/antidos/replay-guard.ts +37 -0
  248. package/src/cohort-topic/antidos/topic-budget.ts +17 -2
  249. package/src/cohort-topic/coldstart.ts +48 -15
  250. package/src/cohort-topic/gossip/bus.ts +39 -2
  251. package/src/cohort-topic/gossip/view.ts +26 -1
  252. package/src/cohort-topic/member-engine.ts +36 -15
  253. package/src/cohort-topic/membership/publisher.ts +25 -33
  254. package/src/cohort-topic/membership/verifier.ts +119 -3
  255. package/src/cohort-topic/promotion.ts +23 -2
  256. package/src/cohort-topic/registration/renewal.ts +73 -1
  257. package/src/cohort-topic/registration/types.ts +15 -0
  258. package/src/cohort-topic/service.ts +41 -15
  259. package/src/cohort-topic/sig/payloads.ts +29 -9
  260. package/src/cohort-topic/traffic.ts +23 -1
  261. package/src/cohort-topic/walk.ts +95 -24
  262. package/src/cohort-topic/wire/codec.ts +12 -0
  263. package/src/cohort-topic/wire/index.ts +2 -0
  264. package/src/cohort-topic/wire/payloads.ts +14 -5
  265. package/src/cohort-topic/wire/primitives.ts +188 -0
  266. package/src/cohort-topic/wire/types.ts +136 -4
  267. package/src/cohort-topic/wire/validate.ts +168 -134
  268. package/src/collection/collection.ts +123 -40
  269. package/src/collection/struct.ts +44 -2
  270. package/src/collections/tree/tree.ts +42 -5
  271. package/src/index.ts +1 -0
  272. package/src/log/log.ts +37 -9
  273. package/src/log/struct.ts +5 -4
  274. package/src/matchmaking/wire.ts +25 -102
  275. package/src/network/i-key-network.ts +10 -0
  276. package/src/network/i-repo.ts +8 -0
  277. package/src/network/struct.ts +10 -0
  278. package/src/reactivity/push-state.ts +4 -37
  279. package/src/reactivity/wire-validate.ts +7 -81
  280. package/src/reactivity/wire.ts +3 -3
  281. package/src/testing/async-wait.ts +65 -0
  282. package/src/testing/index.ts +2 -0
  283. package/src/testing/test-transactor.ts +468 -0
  284. package/src/transaction/actions-engine.ts +8 -6
  285. package/src/transaction/coordinator.ts +498 -229
  286. package/src/transaction/errors.ts +91 -0
  287. package/src/transaction/index.ts +23 -3
  288. package/src/transaction/operations-hash.ts +196 -0
  289. package/src/transaction/read-dependency-collector.ts +78 -0
  290. package/src/transaction/session.ts +37 -9
  291. package/src/transaction/transaction.ts +211 -4
  292. package/src/transaction/validator.ts +73 -48
  293. package/src/transactor/network-transactor.ts +164 -49
  294. package/src/transactor/transactor-source.ts +47 -12
  295. package/src/transform/atomic-proxy.ts +92 -49
  296. package/src/transform/cache-source.ts +87 -9
  297. package/src/transform/helpers.ts +8 -2
  298. package/src/transform/tracker.ts +69 -11
  299. package/src/utility/backoff.ts +95 -0
  300. package/src/utility/pending.ts +3 -1
  301. package/src/transaction/context.ts +0 -103
@@ -1 +1 @@
1
- {"version":3,"file":"bus.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/bus.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAA2C,MAAM,WAAW,CAAC;AAsEtF,MAAM,wBAAwB;IAOA;IANZ,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,aAAa,GAAG,IAAI,GAAG,EAAgB,CAAC;IACxC,UAAU,GAAsB,gBAAgB,EAAE,CAAC;IACnD,GAAG,CAAe;IAClB,MAAM,CAAa;IAEpC,YAA6B,IAAyB;QAAzB,SAAI,GAAJ,IAAI,CAAqB;QACrD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAc,EAAE,GAAe,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,SAAS,CAAC,CAAiB;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,QAAQ,CAAC,OAAsB;QAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,OAAqB;QAC5B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,CAAiB,EAAE,GAAW;QAC1C,+FAA+F;QAC/F,mGAAmG;QACnG,iGAAiG;QACjG,kBAAkB;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC1C,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YACjD,CAAC;QACF,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAChC,IAAI,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,uGAAuG;QACvG,mGAAmG;QACnG,0DAA0D;QAC1D,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YACjG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAED,IAAI;QACH,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAEO,SAAS,CAAC,GAAe;QAChC,MAAM,CAAC,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/D,4FAA4F;QAC5F,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,+FAA+F;QAC/F,iFAAiF;QACjF,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,OAAO;QACR,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,OAAO,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;IACF,CAAC;IAED,4EAA4E;IACpE,UAAU,CAAC,CAAiB;QACnC,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAEO,SAAS,CAAC,CAAiB,EAAE,YAAwB;QAC5D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE;YACnC,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5C,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,SAAS,EAAE,CAAC,CAAC,SAAS;SACtB,CAAC,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,CAAiB,EAAE,GAAW;QAClD,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACtC,2FAA2F;YAC3F,2FAA2F;YAC3F,2FAA2F;YAC3F,oEAAoE;YACpE,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtC,uFAAuF;YACvF,0FAA0F;YAC1F,oEAAoE;YACpE,IAAI,GAAG,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;gBAC5C,SAAS;YACV,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;YACxF,oFAAoF;YACpF,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;QACD,kGAAkG;QAClG,iGAAiG;QACjG,oGAAoG;QACpG,oGAAoG;QACpG,6FAA6F;QAC7F,IAAI,aAAkD,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvD,+FAA+F;YAC/F,+FAA+F;YAC/F,sCAAsC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACtE,2FAA2F;YAC3F,gGAAgG;YAChG,8FAA8F;YAC9F,4EAA4E;YAC5E,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACxD,SAAS;YACV,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC/C,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBAC9C,CAAC,aAAa,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;QACF,CAAC;QACD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,gBAAiB,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACF,CAAC;CACD;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC9D,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -19,6 +19,14 @@ export interface MemberContribution {
19
19
  readonly windowSeconds: number;
20
20
  /** Exact per-topic summaries this member last reported. */
21
21
  readonly topicSummaries: readonly CohortTopicSummary[];
22
+ /**
23
+ * `topicId` (base64url) → summary, derived from {@link topicSummaries} at {@link MutableCohortView.merge}
24
+ * so a per-topic reader (traffic `snapshot`) does an O(1) lookup instead of an O(summaries) `.find` per
25
+ * member per reply. First occurrence wins on a duplicate `topicId` (matching `Array.prototype.find`).
26
+ * Populated by `merge`; a contribution built without going through `merge` may omit it, in which case
27
+ * consumers fall back to scanning {@link topicSummaries}.
28
+ */
29
+ readonly topicIndex?: ReadonlyMap<string, CohortTopicSummary>;
22
30
  /** Gossip timestamp (unix ms) — the last-writer-wins key. */
23
31
  readonly timestamp: number;
24
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,UAAU;IAC1B,mFAAmF;IACnF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,wDAAwD;IACxD,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC/C;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACpD,6GAA6G;IAC7G,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;CACtD;AAuBD,oDAAoD;AACpD,wBAAgB,gBAAgB,IAAI,iBAAiB,CAEpD"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9D,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,UAAU;IAC1B,mFAAmF;IACnF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,wDAAwD;IACxD,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC/C;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACpD,6GAA6G;IAC7G,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;CACtD;AAwCD,oDAAoD;AACpD,wBAAgB,gBAAgB,IAAI,iBAAiB,CAEpD"}
@@ -19,10 +19,26 @@ class MapCohortView {
19
19
  if (held !== undefined && c.timestamp < held.timestamp) {
20
20
  return false; // stale; keep the newer contribution
21
21
  }
22
- this.byMember.set(member, c);
22
+ // Derive the per-topic index once, at write time, so per-topic readers never rescan the flat
23
+ // `topicSummaries` array per reply. A writer pays O(summaries) once per merge (gossip round).
24
+ this.byMember.set(member, { ...c, topicIndex: indexTopics(c.topicSummaries) });
23
25
  return true;
24
26
  }
25
27
  }
28
+ /**
29
+ * Index a member's flat topic summaries by `topicId` (base64url). First occurrence wins on a duplicate
30
+ * `topicId`, exactly matching the `Array.prototype.find` scan this replaces — so a snapshot over the index
31
+ * returns identical numbers to one over the array.
32
+ */
33
+ function indexTopics(summaries) {
34
+ const index = new Map();
35
+ for (const s of summaries) {
36
+ if (!index.has(s.topicId)) {
37
+ index.set(s.topicId, s);
38
+ }
39
+ }
40
+ return index;
41
+ }
26
42
  /** Construct an empty {@link MutableCohortView}. */
27
43
  export function createCohortView() {
28
44
  return new MapCohortView();
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkCH,MAAM,aAAa;IACD,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAElE,GAAG,CAAC,MAAc;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,GAAG;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAc,EAAE,CAAqB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,CAAC,qCAAqC;QACpD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAED,oDAAoD;AACpD,MAAM,UAAU,gBAAgB;IAC/B,OAAO,IAAI,aAAa,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../../src/cohort-topic/gossip/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0CH,MAAM,aAAa;IACD,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAElE,GAAG,CAAC,MAAc;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,GAAG;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAc,EAAE,CAAqB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,CAAC,qCAAqC;QACpD,CAAC;QACD,6FAA6F;QAC7F,8FAA8F;QAC9F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,SAAwC;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,gBAAgB;IAC/B,OAAO,IAAI,aAAa,EAAE,CAAC;AAC5B,CAAC"}
@@ -5,8 +5,9 @@
5
5
  * on it (the activity callback in `docs/cohort-topic.md` §FRET integration). It is the cohort-facing
6
6
  * half of the substrate, composed from the prereq tickets' pure modules — the participant-facing half
7
7
  * lives in {@link import("./service.js").CohortTopicService}. db-p2p's FRET host decodes an inbound
8
- * frame, supplies the routing context this module can't see (`followOn`, the quorum-willing tally),
9
- * and serializes whatever reply this returns back over the wire. db-core never imports FRET here.
8
+ * frame, supplies the routing context this module can't see (`followOn` — derived from the wire
9
+ * `RegisterV1.followOn` flag, evidence-gated in step 1 plus the quorum-willing tally), and serializes
10
+ * whatever reply this returns back over the wire. db-core never imports FRET here.
10
11
  *
11
12
  * Inbound `RegisterV1` decision pipeline (§Registration mechanics, §Willingness, §Cold-start):
12
13
  *
@@ -38,7 +39,13 @@ import type { NodeProfile, Tier } from "./tiers.js";
38
39
  import type { DemotionNoticeV1, PromotionNoticeV1, RegisterReplyV1, RegisterV1, RenewReplyV1, RenewV1 } from "./wire/types.js";
39
40
  /** Routing context the FRET host supplies for an inbound register (db-core can't derive it). */
40
41
  export interface RegisterContext {
41
- /** Did this register arrive as a follow-on to a parent cohort's `Promoted` redirect? */
42
+ /**
43
+ * Did this register arrive as a follow-on to a parent cohort's `Promoted` redirect? The host derives
44
+ * this from the wire `RegisterV1.followOn` flag (`followOn: reg.followOn === true`). It is participant-
45
+ * asserted and therefore evidence-gated: `runGuards` (step 1) already ran `bootstrapEvidence.verify`,
46
+ * which demands the same proof for `followOn: true` as for `bootstrap: true`, so an unbacked follow-on
47
+ * never reaches this instantiation decision (it short-circuited to `unwilling_cohort`).
48
+ */
42
49
  readonly followOn: boolean;
43
50
  /** Tree tier `d` this cohort serves the topic at (the walk position the register landed on). */
44
51
  readonly treeTier: number;
@@ -1 +1 @@
1
- {"version":3,"file":"member-engine.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"member-engine.d.ts","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,9 @@
5
5
  * on it (the activity callback in `docs/cohort-topic.md` §FRET integration). It is the cohort-facing
6
6
  * half of the substrate, composed from the prereq tickets' pure modules — the participant-facing half
7
7
  * lives in {@link import("./service.js").CohortTopicService}. db-p2p's FRET host decodes an inbound
8
- * frame, supplies the routing context this module can't see (`followOn`, the quorum-willing tally),
9
- * and serializes whatever reply this returns back over the wire. db-core never imports FRET here.
8
+ * frame, supplies the routing context this module can't see (`followOn` — derived from the wire
9
+ * `RegisterV1.followOn` flag, evidence-gated in step 1 plus the quorum-willing tally), and serializes
10
+ * whatever reply this returns back over the wire. db-core never imports FRET here.
10
11
  *
11
12
  * Inbound `RegisterV1` decision pipeline (§Registration mechanics, §Willingness, §Cold-start):
12
13
  *
@@ -23,7 +24,7 @@
23
24
  * Every collaborator is injected, so the engine unit-tests without FRET or libp2p.
24
25
  */
25
26
  import { bytesEqual, bytesKey } from "./registration/bytes.js";
26
- import { DEFAULT_TTL_MS } from "./registration/types.js";
27
+ import { clampTtl } from "./registration/types.js";
27
28
  import { backoffRetryMs } from "./willingness.js";
28
29
  import { promotedRedirectReply } from "./coldstart.js";
29
30
  import { shouldInstantiate } from "./coldstart.js";
@@ -58,7 +59,10 @@ class StoreCohortMemberEngine {
58
59
  }
59
60
  return this.admitOrDecline(reg, topicId, participantId, tier, ctx, now);
60
61
  }
61
- // 3. Cold path: instantiate only at a legitimate growth point with a willing quorum.
62
+ // 3. Cold path: instantiate only at a legitimate growth point with a willing quorum. `ctx.followOn`
63
+ // mirrors the wire `reg.followOn` flag (the host derives it), and by the time we reach here the
64
+ // step-1 bootstrap-evidence gate has already verified a `followOn: true` carries the same proof a
65
+ // `bootstrap: true` root cold-start carries — so this branch never instantiates an unbacked follow-on.
62
66
  const quorumWilling = this.deps.quorumWilling(tier);
63
67
  if (!shouldInstantiate({ bootstrap: reg.bootstrap === true, followOn: ctx.followOn, quorumWilling })) {
64
68
  return { v: 1, result: "no_state" };
@@ -177,7 +181,7 @@ class StoreCohortMemberEngine {
177
181
  async accept(reg, topicId, participantId, tier, ctx, now) {
178
182
  const { members, cohortEpoch } = this.deps.cohort();
179
183
  const { primary, backups } = this.deps.slots.assignSlots(participantId, cohortEpoch, members);
180
- const ttl = reg.ttl > 0 ? reg.ttl : DEFAULT_TTL_MS;
184
+ const ttl = clampTtl(reg.ttl);
181
185
  const record = {
182
186
  topicId,
183
187
  participantId,
@@ -226,21 +230,32 @@ class StoreCohortMemberEngine {
226
230
  runGuards(reg, topicId, participantId, tier, now) {
227
231
  if (this.deps.verifyRegisterSig?.(reg) === false) {
228
232
  // Unsigned / forged participant signature: serve nothing and record nothing (the cohort
229
- // cannot trust this participantCoord). Checked before the replay/rate guards so a forged
230
- // frame cannot consume their state.
233
+ // cannot trust this participantCoord). Cheap + stateless, so checked first a forged frame
234
+ // cannot consume any downstream guard state.
231
235
  return { v: 1, result: "no_state" };
232
236
  }
233
- const correlationId = b64urlToBytes(reg.correlationId);
234
- if (this.deps.replayGuard?.accept(correlationId, participantId, reg.timestamp, now) === false) {
235
- // Stale / future-skewed / replayed: serve nothing and record nothing.
236
- return { v: 1, result: "no_state" };
237
+ // Rate-check BEFORE the replay guard records anything: a fresh-correlationId spam frame that the
238
+ // rate limiter would reject must not first insert a `seen` entry (which would let an attacker grow
239
+ // the replay guard's memory at full attack speed regardless of the rate limit). Running it before
240
+ // the potentially-expensive bootstrap verify (which may do PoW) also short-circuits floods sooner.
241
+ // NOTE: a replayed frame now consumes a rate-limiter accept before the replay guard (below) drops it,
242
+ // whereas the old order dropped replays pre-rate. Fine for spam (inbound traffic should be counted);
243
+ // only matters if a legitimate client reuses one correlationId across retransmits — it would then
244
+ // burn rate budget per retransmit. If clients adopt idempotent same-cid retry, revisit this order.
245
+ const rate = this.deps.rateLimiter?.check(participantId, topicId, now);
246
+ if (rate !== undefined && rate.ok === false) {
247
+ return { v: 1, result: "unwilling_cohort", retryAfterMs: rate.retryAfterMs };
237
248
  }
238
249
  if (this.deps.bootstrapEvidence?.verify(reg, tier) === false) {
239
250
  return this.unwillingCohort(reg, now);
240
251
  }
241
- const rate = this.deps.rateLimiter?.check(participantId, topicId, now);
242
- if (rate !== undefined && rate.ok === false) {
243
- return { v: 1, result: "unwilling_cohort", retryAfterMs: rate.retryAfterMs };
252
+ // Replay guard records LAST, so only frames that passed signature + rate + bootstrap ever insert a
253
+ // `seen` entry. An *accepted* frame is still always recorded here, so a genuine replay of a served
254
+ // correlationId is still caught; only rate-rejected frames (never served, never recorded) skip it.
255
+ const correlationId = b64urlToBytes(reg.correlationId);
256
+ if (this.deps.replayGuard?.accept(correlationId, participantId, reg.timestamp, now) === false) {
257
+ // Stale / future-skewed / replayed: serve nothing and record nothing.
258
+ return { v: 1, result: "no_state" };
244
259
  }
245
260
  return undefined;
246
261
  }
@@ -1 +1 @@
1
- {"version":3,"file":"member-engine.js","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"member-engine.js","sourceRoot":"","sources":["../../../src/cohort-topic/member-engine.ts"],"names":[],"mappings":"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"}
@@ -4,13 +4,14 @@
4
4
  * Per `docs/cohort-topic.md` §Membership snapshots: the cohort publishes a threshold-signed
5
5
  * `MembershipCertV1`
6
6
  *
7
- * - at stabilization, and on any change to the first `k x` members ({@link MembershipCertPublisher.onStabilized});
7
+ * - at stabilization, and on any change to the cohort identity the epoch `H(sorted all members)`,
8
+ * so *any* member change (head or tail) forces a fresh publish ({@link MembershipCertPublisher.onStabilized});
8
9
  * - refreshed every `T_membership_refresh` (default 5 min) ({@link MembershipCertPublisher.tick}).
9
10
  *
10
11
  * The publisher is db-core logic over the {@link CohortSigner} (threshold sign) and the
11
12
  * {@link IMembershipPublishSink} (serve/advertise). It never imports FRET. Members are sorted
12
- * ascending for the cert (matching the sharding order) and the first `minSigs` (= `k − x`) of that
13
- * order are the "first `k x`" whose change forces a fresh publish.
13
+ * ascending for the cert (matching the sharding order); the snapshot's `cohortEpoch` is the full
14
+ * cohort identity, and a change to it across a publish forces a fresh publish.
14
15
  */
15
16
  import type { IMembershipPublishSink } from "../ports.js";
16
17
  import type { MembershipCertV1 } from "../wire/types.js";
@@ -58,10 +59,11 @@ export interface RotationAttestation {
58
59
  /** Cohort-side membership-cert publisher. */
59
60
  export interface MembershipCertPublisher {
60
61
  /**
61
- * Drive publication on a stabilization event. Publishes (and returns the cert) when the first
62
- * `k x` members changed since the last publish, or on the first call; otherwise returns `undefined`.
63
- * Pass `rotation` to attach a predecessor-cohort rotation attestation (an epoch rotation); omit it for
64
- * the default non-rotation publish (no rotation fields are emitted).
62
+ * Drive publication on a stabilization event. Publishes (and returns the cert) when the cohort identity
63
+ * (`cohortEpoch = H(sorted members)`) changed since the last publish i.e. on **any** member change,
64
+ * head or tail or on the first call; otherwise returns `undefined`. Pass `rotation` to attach a
65
+ * predecessor-cohort rotation attestation (an epoch rotation); omit it for the default non-rotation
66
+ * publish (no rotation fields are emitted).
65
67
  */
66
68
  onStabilized(snapshot: CohortSnapshot, now: number, rotation?: RotationAttestation): Promise<MembershipCertV1 | undefined>;
67
69
  /**
@@ -74,6 +76,11 @@ export interface MembershipCertPublisherDeps {
74
76
  signer: CohortSigner;
75
77
  sink: IMembershipPublishSink;
76
78
  refreshMs?: number;
79
+ /**
80
+ * Accepted for call-site compatibility but no longer read by the publisher: the republish gate now keys
81
+ * on the full `cohortEpoch`, not the first `k − x` members, and the threshold-sign quorum lives in the
82
+ * {@link CohortSigner}. Kept so existing callers (host + db-p2p tests) compile unchanged.
83
+ */
77
84
  minSigs?: number;
78
85
  maxMessageBytes?: number;
79
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAgC,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE/F,yEAAyE;AACzE,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAE1D;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,sBAAsB,CAQvF;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,sCAAsC;IACtC,WAAW,EAAE,UAAU,CAAC;IACxB,iEAAiE;IACjE,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,eAAe,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IACnC,kEAAkE;IAClE,SAAS,EAAE,UAAU,CAAC;IACtB,0FAA0F;IAC1F,WAAW,EAAE,UAAU,CAAC;IACxB,kFAAkF;IAClF,eAAe,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,6CAA6C;AAC7C,MAAM,WAAW,uBAAuB;IACvC;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAC3H;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;CACnH;AAED,MAAM,WAAW,2BAA2B;IAC3C,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAwED,2DAA2D;AAC3D,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,uBAAuB,CAExG"}
1
+ {"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAgC,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE/F,yEAAyE;AACzE,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAE1D;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,sBAAsB,CAQvF;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,sCAAsC;IACtC,WAAW,EAAE,UAAU,CAAC;IACxB,iEAAiE;IACjE,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,eAAe,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IACnC,kEAAkE;IAClE,SAAS,EAAE,UAAU,CAAC;IACtB,0FAA0F;IAC1F,WAAW,EAAE,UAAU,CAAC;IACxB,kFAAkF;IAClF,eAAe,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,6CAA6C;AAC7C,MAAM,WAAW,uBAAuB;IACvC;;;;;;OAMG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAC3H;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;CACnH;AAED,MAAM,WAAW,2BAA2B;IAC3C,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAyDD,2DAA2D;AAC3D,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,uBAAuB,CAExG"}
@@ -4,17 +4,18 @@
4
4
  * Per `docs/cohort-topic.md` §Membership snapshots: the cohort publishes a threshold-signed
5
5
  * `MembershipCertV1`
6
6
  *
7
- * - at stabilization, and on any change to the first `k x` members ({@link MembershipCertPublisher.onStabilized});
7
+ * - at stabilization, and on any change to the cohort identity the epoch `H(sorted all members)`,
8
+ * so *any* member change (head or tail) forces a fresh publish ({@link MembershipCertPublisher.onStabilized});
8
9
  * - refreshed every `T_membership_refresh` (default 5 min) ({@link MembershipCertPublisher.tick}).
9
10
  *
10
11
  * The publisher is db-core logic over the {@link CohortSigner} (threshold sign) and the
11
12
  * {@link IMembershipPublishSink} (serve/advertise). It never imports FRET. Members are sorted
12
- * ascending for the cert (matching the sharding order) and the first `minSigs` (= `k − x`) of that
13
- * order are the "first `k x`" whose change forces a fresh publish.
13
+ * ascending for the cert (matching the sharding order); the snapshot's `cohortEpoch` is the full
14
+ * cohort identity, and a change to it across a publish forces a fresh publish.
14
15
  */
15
16
  import { bytesToB64url, encodeCohortMessage } from "../wire/codec.js";
16
17
  import { compareBytes } from "../registration/bytes.js";
17
- import { DEFAULT_MIN_SIGS } from "../sig/threshold.js";
18
+ import {} from "../sig/threshold.js";
18
19
  import { membershipCertSigningPayload } from "../sig/payloads.js";
19
20
  /** Default membership-cert refresh interval (`T_membership_refresh`). */
20
21
  export const DEFAULT_T_MEMBERSHIP_REFRESH_MS = 5 * 60_000;
@@ -38,19 +39,21 @@ export function membershipCertSignable(snapshot) {
38
39
  class SigningMembershipCertPublisher {
39
40
  deps;
40
41
  refreshMs;
41
- minSigs;
42
- /** base64url of the first `minSigs` members of the last published snapshot. */
43
- lastFirstKx;
42
+ /** base64url of the last published snapshot's `cohortEpoch` — the full cohort-identity republish key. */
43
+ lastEpoch;
44
44
  lastPublishedAt;
45
45
  constructor(deps) {
46
46
  this.deps = deps;
47
47
  this.refreshMs = deps.refreshMs ?? DEFAULT_T_MEMBERSHIP_REFRESH_MS;
48
- this.minSigs = deps.minSigs ?? DEFAULT_MIN_SIGS;
49
48
  }
50
49
  async onStabilized(snapshot, now, rotation) {
51
- const firstKx = this.firstKx(snapshot.members);
52
- if (this.lastFirstKx !== undefined && sameOrder(this.lastFirstKx, firstKx)) {
53
- return undefined; // first k x unchanged no republish needed
50
+ // NOTE: republish (and the caller's rotation attestation) now fire on ANY epoch change — any member
51
+ // change, head or tail — not just first-(k − x) churn. Gated on an actual epoch change, never per
52
+ // tick, so cost is bounded by real churn. If a high-churn cohort ever shows excess `/sign` or publish
53
+ // load, reconsider a short debounce / batching here.
54
+ const epoch = bytesToB64url(snapshot.cohortEpoch);
55
+ if (this.lastEpoch !== undefined && this.lastEpoch === epoch) {
56
+ return undefined; // cohort identity unchanged — no republish needed
54
57
  }
55
58
  return this.publish(snapshot, now, rotation);
56
59
  }
@@ -60,10 +63,6 @@ class SigningMembershipCertPublisher {
60
63
  }
61
64
  return this.publish(snapshot, now, rotation);
62
65
  }
63
- /** The first `minSigs` members of the cert's ascending order, base64url — the republish-change key. */
64
- firstKx(members) {
65
- return [...members].sort(compareBytes).slice(0, this.minSigs).map(bytesToB64url);
66
- }
67
66
  async publish(snapshot, now, rotation) {
68
67
  const signable = membershipCertSignable(snapshot);
69
68
  const { thresholdSig, signers } = await this.deps.signer.thresholdSign(membershipCertSigningPayload(signable));
@@ -84,22 +83,11 @@ class SigningMembershipCertPublisher {
84
83
  cert.rotationSigners = rotation.rotationSigners.map(bytesToB64url);
85
84
  }
86
85
  this.deps.sink.publish(encodeCohortMessage(cert, this.deps.maxMessageBytes));
87
- this.lastFirstKx = signable.members.slice(0, this.minSigs);
86
+ this.lastEpoch = bytesToB64url(snapshot.cohortEpoch);
88
87
  this.lastPublishedAt = now;
89
88
  return cert;
90
89
  }
91
90
  }
92
- function sameOrder(a, b) {
93
- if (a.length !== b.length) {
94
- return false;
95
- }
96
- for (let i = 0; i < a.length; i++) {
97
- if (a[i] !== b[i]) {
98
- return false;
99
- }
100
- }
101
- return true;
102
- }
103
91
  /** Build a cohort-side {@link MembershipCertPublisher}. */
104
92
  export function createMembershipCertPublisher(deps) {
105
93
  return new SigningMembershipCertPublisher(deps);
@@ -1 +1 @@
1
- {"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/publisher.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,13 @@ import type { IMembershipTrustAnchor, RingCoord, TrustRoot } from "../ports.js";
47
47
  import type { MembershipCertV1 } from "../wire/types.js";
48
48
  import { type CohortSigner } from "../sig/threshold.js";
49
49
  import type { IMembershipSourceRouter } from "./source.js";
50
+ /**
51
+ * Default hard cap on distinct coords the verifier's per-coord maps retain (`byCoord`, `lastFetchAt`,
52
+ * `staleGapStrikes`). Beyond it the least-recently-used coord is evicted — bounding memory under a flood
53
+ * of verify-misses against attacker-chosen coords. Same 100k ballpark as the sibling anti-DoS caps
54
+ * ({@link import("../antidos/replay-guard.js").DEFAULT_REPLAY_GUARD_MAX_KEYS}).
55
+ */
56
+ export declare const DEFAULT_MEMBERSHIP_VERIFIER_MAX_COORDS = 100000;
50
57
  /** Outcome of verifying a threshold-signed message against cohort membership. */
51
58
  export type VerifyResult = "verified" | "untrusted";
52
59
  /** Caches certs per coord and verifies threshold-signed messages with one stale-cert refetch. */
@@ -90,6 +97,34 @@ export interface MembershipVerifierDeps {
90
97
  anchor?: IMembershipTrustAnchor;
91
98
  /** Out-of-band-seeded genesis trust roots (the base case of every attestation chain). Defaults to `[]`. */
92
99
  trustRoots?: readonly TrustRoot[];
100
+ /**
101
+ * Number of **consecutive** gap-signalled refetches after which a **trust-locked** coord whose direct
102
+ * anchor has gone `"unknown"` re-enters the interim TOFU regime — the exit from a stale trust-lock a
103
+ * former cohort member would otherwise be stranded in until the host process restarts.
104
+ *
105
+ * The lock (a coord holding a *trusted* cached cert refuses any un-anchored refetch — no TOFU downgrade)
106
+ * has no other exit: a node that served coord `C`, self-published its cert (locking `C`), then left `C`'s
107
+ * cohort keeps distrusting every later-epoch message from `C` if it missed an intermediate rotation, since
108
+ * the refetched cert's `prevEpoch` no longer matches the stale cached epoch and the anchor no longer
109
+ * vouches for `C`. Recovery counts **only** refetched certs presenting an *explicit chain gap* — a full
110
+ * rotation attestation whose `prevEpoch ≠` the cached trusted epoch (the network provably rotated past the
111
+ * cached epoch through an epoch this node never witnessed). A forged rotation off the *current* cached
112
+ * predecessor (`prevEpoch == cachedEpoch`) never counts as a strike, so the lock's headline invariant
113
+ * (un-anchored successor of a matching predecessor stays rejected) is preserved.
114
+ *
115
+ * Defaults to `3`. Setting it to `0` (or a negative) **disables** recovery — which re-opens the stale-lock
116
+ * liveness bug, so leave it on unless a caller has an independent lock-drop mechanism (see the
117
+ * drop-the-lock-on-demotion tripwire in the ticket).
118
+ */
119
+ staleGapRecoveryStrikes?: number;
120
+ /**
121
+ * Hard LRU cap on distinct coords retained across the verifier's per-coord maps (`byCoord`,
122
+ * `lastFetchAt`, `staleGapStrikes`); the least-recently-used coord is evicted beyond it. Bounds memory
123
+ * under a flood of verify-misses against attacker-chosen coords. Defaults to
124
+ * {@link DEFAULT_MEMBERSHIP_VERIFIER_MAX_COORDS}; must be a positive integer (mirrors the sibling
125
+ * anti-DoS `maxKeys` guard).
126
+ */
127
+ maxCoords?: number;
93
128
  }
94
129
  /** Build a participant-side {@link MembershipVerifier}. */
95
130
  export declare function createMembershipVerifier(deps: MembershipVerifierDeps): MembershipVerifier;
@@ -1 +1 @@
1
- {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,CAAC;AAEpD,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IAClC,iEAAiE;IACjE,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACxK;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,2GAA2G;IAC3G,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAClC;AAgPD,2DAA2D;AAC3D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CAEzF"}
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../../src/cohort-topic/membership/verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG3D;;;;;GAKG;AACH,eAAO,MAAM,sCAAsC,SAAU,CAAC;AAE9D,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,CAAC;AAEpD,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IAClC,iEAAiE;IACjE,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACxK;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,2GAA2G;IAC3G,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC;;;;;;;;;;;;;;;;;;OAkBG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA+TD,2DAA2D;AAC3D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CAEzF"}