@did-btcr2/method 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/README.md +118 -236
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/browser.js +27665 -23764
  4. package/dist/browser.mjs +27665 -23764
  5. package/dist/cjs/index.js +2661 -2239
  6. package/dist/esm/core/aggregation/cohort.js +178 -0
  7. package/dist/esm/core/aggregation/cohort.js.map +1 -0
  8. package/dist/esm/core/aggregation/errors.js +22 -0
  9. package/dist/esm/core/aggregation/errors.js.map +1 -0
  10. package/dist/esm/core/{beacon/aggregation/cohort → aggregation}/messages/base.js +0 -1
  11. package/dist/esm/core/aggregation/messages/base.js.map +1 -0
  12. package/dist/esm/core/aggregation/messages/constants.js +26 -0
  13. package/dist/esm/core/aggregation/messages/constants.js.map +1 -0
  14. package/dist/esm/core/aggregation/messages/factories.js +113 -0
  15. package/dist/esm/core/aggregation/messages/factories.js.map +1 -0
  16. package/dist/esm/core/aggregation/messages/guards.js +37 -0
  17. package/dist/esm/core/aggregation/messages/guards.js.map +1 -0
  18. package/dist/esm/core/aggregation/messages/index.js +5 -0
  19. package/dist/esm/core/aggregation/messages/index.js.map +1 -0
  20. package/dist/esm/core/aggregation/participant.js +376 -0
  21. package/dist/esm/core/aggregation/participant.js.map +1 -0
  22. package/dist/esm/core/aggregation/phases.js +39 -0
  23. package/dist/esm/core/aggregation/phases.js.map +1 -0
  24. package/dist/esm/core/aggregation/runner/events.js +2 -0
  25. package/dist/esm/core/aggregation/runner/events.js.map +1 -0
  26. package/dist/esm/core/aggregation/runner/index.js +5 -0
  27. package/dist/esm/core/aggregation/runner/index.js.map +1 -0
  28. package/dist/esm/core/aggregation/runner/participant-runner.js +286 -0
  29. package/dist/esm/core/aggregation/runner/participant-runner.js.map +1 -0
  30. package/dist/esm/core/aggregation/runner/service-runner.js +290 -0
  31. package/dist/esm/core/aggregation/runner/service-runner.js.map +1 -0
  32. package/dist/esm/core/aggregation/runner/typed-emitter.js +80 -0
  33. package/dist/esm/core/aggregation/runner/typed-emitter.js.map +1 -0
  34. package/dist/esm/core/aggregation/service.js +416 -0
  35. package/dist/esm/core/aggregation/service.js.map +1 -0
  36. package/dist/esm/core/aggregation/signing-session.js +133 -0
  37. package/dist/esm/core/aggregation/signing-session.js.map +1 -0
  38. package/dist/esm/core/aggregation/transport/didcomm.js +32 -0
  39. package/dist/esm/core/aggregation/transport/didcomm.js.map +1 -0
  40. package/dist/esm/core/aggregation/transport/error.js +12 -0
  41. package/dist/esm/core/aggregation/transport/error.js.map +1 -0
  42. package/dist/esm/core/aggregation/transport/factory.js +20 -0
  43. package/dist/esm/core/aggregation/transport/factory.js.map +1 -0
  44. package/dist/esm/core/aggregation/transport/index.js +6 -0
  45. package/dist/esm/core/aggregation/transport/index.js.map +1 -0
  46. package/dist/esm/core/aggregation/transport/nostr.js +262 -0
  47. package/dist/esm/core/aggregation/transport/nostr.js.map +1 -0
  48. package/dist/esm/core/aggregation/transport/transport.js +2 -0
  49. package/dist/esm/core/aggregation/transport/transport.js.map +1 -0
  50. package/dist/esm/core/beacon/beacon.js +80 -0
  51. package/dist/esm/core/beacon/beacon.js.map +1 -1
  52. package/dist/esm/core/beacon/cas-beacon.js +15 -56
  53. package/dist/esm/core/beacon/cas-beacon.js.map +1 -1
  54. package/dist/esm/core/beacon/error.js +0 -10
  55. package/dist/esm/core/beacon/error.js.map +1 -1
  56. package/dist/esm/core/beacon/fee-estimator.js +30 -0
  57. package/dist/esm/core/beacon/fee-estimator.js.map +1 -0
  58. package/dist/esm/core/beacon/singleton-beacon.js +10 -53
  59. package/dist/esm/core/beacon/singleton-beacon.js.map +1 -1
  60. package/dist/esm/core/beacon/smt-beacon.js +85 -9
  61. package/dist/esm/core/beacon/smt-beacon.js.map +1 -1
  62. package/dist/esm/core/identifier.js +13 -0
  63. package/dist/esm/core/identifier.js.map +1 -1
  64. package/dist/esm/core/resolver.js +9 -0
  65. package/dist/esm/core/resolver.js.map +1 -1
  66. package/dist/esm/core/updater.js +269 -0
  67. package/dist/esm/core/updater.js.map +1 -0
  68. package/dist/esm/did-btcr2.js +30 -42
  69. package/dist/esm/did-btcr2.js.map +1 -1
  70. package/dist/esm/index.js +16 -25
  71. package/dist/esm/index.js.map +1 -1
  72. package/dist/types/core/aggregation/cohort.d.ts +94 -0
  73. package/dist/types/core/aggregation/cohort.d.ts.map +1 -0
  74. package/dist/types/core/aggregation/errors.d.ts +14 -0
  75. package/dist/types/core/aggregation/errors.d.ts.map +1 -0
  76. package/dist/types/core/{beacon/aggregation/cohort → aggregation}/messages/base.d.ts +7 -1
  77. package/dist/types/core/aggregation/messages/base.d.ts.map +1 -0
  78. package/dist/types/core/aggregation/messages/constants.d.ts +23 -0
  79. package/dist/types/core/aggregation/messages/constants.d.ts.map +1 -0
  80. package/dist/types/core/aggregation/messages/factories.d.ts +177 -0
  81. package/dist/types/core/aggregation/messages/factories.d.ts.map +1 -0
  82. package/dist/types/core/aggregation/messages/guards.d.ts +11 -0
  83. package/dist/types/core/aggregation/messages/guards.d.ts.map +1 -0
  84. package/dist/types/core/aggregation/messages/index.d.ts +5 -0
  85. package/dist/types/core/aggregation/messages/index.d.ts.map +1 -0
  86. package/dist/types/core/aggregation/participant.d.ts +101 -0
  87. package/dist/types/core/aggregation/participant.d.ts.map +1 -0
  88. package/dist/types/core/aggregation/phases.d.ts +49 -0
  89. package/dist/types/core/aggregation/phases.d.ts.map +1 -0
  90. package/dist/types/core/aggregation/runner/events.d.ts +89 -0
  91. package/dist/types/core/aggregation/runner/events.d.ts.map +1 -0
  92. package/dist/types/core/aggregation/runner/index.d.ts +5 -0
  93. package/dist/types/core/aggregation/runner/index.d.ts.map +1 -0
  94. package/dist/types/core/aggregation/runner/participant-runner.d.ts +111 -0
  95. package/dist/types/core/aggregation/runner/participant-runner.d.ts.map +1 -0
  96. package/dist/types/core/aggregation/runner/service-runner.d.ts +102 -0
  97. package/dist/types/core/aggregation/runner/service-runner.d.ts.map +1 -0
  98. package/dist/types/core/aggregation/runner/typed-emitter.d.ts +41 -0
  99. package/dist/types/core/aggregation/runner/typed-emitter.d.ts.map +1 -0
  100. package/dist/types/core/aggregation/service.d.ts +112 -0
  101. package/dist/types/core/aggregation/service.d.ts.map +1 -0
  102. package/dist/types/core/aggregation/signing-session.d.ts +69 -0
  103. package/dist/types/core/aggregation/signing-session.d.ts.map +1 -0
  104. package/dist/types/core/aggregation/transport/didcomm.d.ts +20 -0
  105. package/dist/types/core/aggregation/transport/didcomm.d.ts.map +1 -0
  106. package/dist/types/core/{beacon/aggregation/communication → aggregation/transport}/error.d.ts +2 -2
  107. package/dist/types/core/aggregation/transport/error.d.ts.map +1 -0
  108. package/dist/types/core/aggregation/transport/factory.d.ts +13 -0
  109. package/dist/types/core/aggregation/transport/factory.d.ts.map +1 -0
  110. package/dist/types/core/aggregation/transport/index.d.ts +6 -0
  111. package/dist/types/core/aggregation/transport/index.d.ts.map +1 -0
  112. package/dist/types/core/aggregation/transport/nostr.d.ts +55 -0
  113. package/dist/types/core/aggregation/transport/nostr.d.ts.map +1 -0
  114. package/dist/types/core/aggregation/transport/transport.d.ts +37 -0
  115. package/dist/types/core/aggregation/transport/transport.d.ts.map +1 -0
  116. package/dist/types/core/beacon/beacon.d.ts +37 -2
  117. package/dist/types/core/beacon/beacon.d.ts.map +1 -1
  118. package/dist/types/core/beacon/cas-beacon.d.ts +19 -7
  119. package/dist/types/core/beacon/cas-beacon.d.ts.map +1 -1
  120. package/dist/types/core/beacon/error.d.ts +0 -6
  121. package/dist/types/core/beacon/error.d.ts.map +1 -1
  122. package/dist/types/core/beacon/fee-estimator.d.ts +40 -0
  123. package/dist/types/core/beacon/fee-estimator.d.ts.map +1 -0
  124. package/dist/types/core/beacon/interfaces.d.ts +8 -0
  125. package/dist/types/core/beacon/interfaces.d.ts.map +1 -1
  126. package/dist/types/core/beacon/singleton-beacon.d.ts +9 -2
  127. package/dist/types/core/beacon/singleton-beacon.d.ts.map +1 -1
  128. package/dist/types/core/beacon/smt-beacon.d.ts +27 -7
  129. package/dist/types/core/beacon/smt-beacon.d.ts.map +1 -1
  130. package/dist/types/core/identifier.d.ts +8 -0
  131. package/dist/types/core/identifier.d.ts.map +1 -1
  132. package/dist/types/core/interfaces.d.ts +2 -2
  133. package/dist/types/core/resolver.d.ts +11 -1
  134. package/dist/types/core/resolver.d.ts.map +1 -1
  135. package/dist/types/core/updater.d.ts +178 -0
  136. package/dist/types/core/updater.d.ts.map +1 -0
  137. package/dist/types/did-btcr2.d.ts +23 -23
  138. package/dist/types/did-btcr2.d.ts.map +1 -1
  139. package/dist/types/index.d.ts +11 -25
  140. package/dist/types/index.d.ts.map +1 -1
  141. package/package.json +31 -30
  142. package/src/core/aggregation/cohort.ts +247 -0
  143. package/src/core/aggregation/errors.ts +25 -0
  144. package/src/core/{beacon/aggregation/cohort → aggregation}/messages/base.ts +8 -3
  145. package/src/core/aggregation/messages/constants.ts +28 -0
  146. package/src/core/aggregation/messages/factories.ts +240 -0
  147. package/src/core/aggregation/messages/guards.ts +55 -0
  148. package/src/core/aggregation/messages/index.ts +4 -0
  149. package/src/core/aggregation/participant.ts +510 -0
  150. package/src/core/aggregation/phases.ts +82 -0
  151. package/src/core/aggregation/runner/events.ts +77 -0
  152. package/src/core/aggregation/runner/index.ts +4 -0
  153. package/src/core/aggregation/runner/participant-runner.ts +364 -0
  154. package/src/core/aggregation/runner/service-runner.ts +365 -0
  155. package/src/core/aggregation/runner/typed-emitter.ts +87 -0
  156. package/src/core/aggregation/service.ts +547 -0
  157. package/src/core/aggregation/signing-session.ts +209 -0
  158. package/src/core/aggregation/transport/didcomm.ts +42 -0
  159. package/src/core/aggregation/transport/error.ts +13 -0
  160. package/src/core/aggregation/transport/factory.ts +29 -0
  161. package/src/core/aggregation/transport/index.ts +5 -0
  162. package/src/core/aggregation/transport/nostr.ts +333 -0
  163. package/src/core/aggregation/transport/transport.ts +46 -0
  164. package/src/core/beacon/beacon.ts +122 -2
  165. package/src/core/beacon/cas-beacon.ts +28 -76
  166. package/src/core/beacon/error.ts +0 -12
  167. package/src/core/beacon/fee-estimator.ts +52 -0
  168. package/src/core/beacon/interfaces.ts +10 -1
  169. package/src/core/beacon/singleton-beacon.ts +14 -75
  170. package/src/core/beacon/smt-beacon.ts +109 -11
  171. package/src/core/identifier.ts +17 -0
  172. package/src/core/interfaces.ts +2 -2
  173. package/src/core/resolver.ts +25 -2
  174. package/src/core/updater.ts +415 -0
  175. package/src/did-btcr2.ts +36 -66
  176. package/src/index.ts +17 -30
  177. package/dist/esm/core/beacon/aggregation/cohort/index.js +0 -237
  178. package/dist/esm/core/beacon/aggregation/cohort/index.js.map +0 -1
  179. package/dist/esm/core/beacon/aggregation/cohort/messages/base.js.map +0 -1
  180. package/dist/esm/core/beacon/aggregation/cohort/messages/constants.js +0 -11
  181. package/dist/esm/core/beacon/aggregation/cohort/messages/constants.js.map +0 -1
  182. package/dist/esm/core/beacon/aggregation/cohort/messages/index.js +0 -98
  183. package/dist/esm/core/beacon/aggregation/cohort/messages/index.js.map +0 -1
  184. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js +0 -31
  185. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.js.map +0 -1
  186. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js +0 -29
  187. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.js.map +0 -1
  188. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js +0 -27
  189. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.js.map +0 -1
  190. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in.js +0 -23
  191. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/opt-in.js.map +0 -1
  192. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/subscribe.js +0 -28
  193. package/dist/esm/core/beacon/aggregation/cohort/messages/keygen/subscribe.js.map +0 -1
  194. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js +0 -29
  195. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.js.map +0 -1
  196. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/authorization-request.js +0 -30
  197. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/authorization-request.js.map +0 -1
  198. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js +0 -30
  199. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.js.map +0 -1
  200. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/request-signature.js +0 -30
  201. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/request-signature.js.map +0 -1
  202. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js +0 -31
  203. package/dist/esm/core/beacon/aggregation/cohort/messages/sign/signature-authorization.js.map +0 -1
  204. package/dist/esm/core/beacon/aggregation/cohort/status.js +0 -8
  205. package/dist/esm/core/beacon/aggregation/cohort/status.js.map +0 -1
  206. package/dist/esm/core/beacon/aggregation/communication/adapter/did-comm.js +0 -121
  207. package/dist/esm/core/beacon/aggregation/communication/adapter/did-comm.js.map +0 -1
  208. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js +0 -245
  209. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js.map +0 -1
  210. package/dist/esm/core/beacon/aggregation/communication/error.js +0 -12
  211. package/dist/esm/core/beacon/aggregation/communication/error.js.map +0 -1
  212. package/dist/esm/core/beacon/aggregation/communication/factory.js +0 -21
  213. package/dist/esm/core/beacon/aggregation/communication/factory.js.map +0 -1
  214. package/dist/esm/core/beacon/aggregation/communication/service.js +0 -2
  215. package/dist/esm/core/beacon/aggregation/communication/service.js.map +0 -1
  216. package/dist/esm/core/beacon/aggregation/coordinator.js +0 -343
  217. package/dist/esm/core/beacon/aggregation/coordinator.js.map +0 -1
  218. package/dist/esm/core/beacon/aggregation/participant.js +0 -435
  219. package/dist/esm/core/beacon/aggregation/participant.js.map +0 -1
  220. package/dist/esm/core/beacon/aggregation/session/index.js +0 -244
  221. package/dist/esm/core/beacon/aggregation/session/index.js.map +0 -1
  222. package/dist/esm/core/beacon/aggregation/session/status.js +0 -11
  223. package/dist/esm/core/beacon/aggregation/session/status.js.map +0 -1
  224. package/dist/esm/core/update.js +0 -112
  225. package/dist/esm/core/update.js.map +0 -1
  226. package/dist/types/core/beacon/aggregation/cohort/index.d.ts +0 -136
  227. package/dist/types/core/beacon/aggregation/cohort/index.d.ts.map +0 -1
  228. package/dist/types/core/beacon/aggregation/cohort/messages/base.d.ts.map +0 -1
  229. package/dist/types/core/beacon/aggregation/cohort/messages/constants.d.ts +0 -11
  230. package/dist/types/core/beacon/aggregation/cohort/messages/constants.d.ts.map +0 -1
  231. package/dist/types/core/beacon/aggregation/cohort/messages/index.d.ts +0 -65
  232. package/dist/types/core/beacon/aggregation/cohort/messages/index.d.ts.map +0 -1
  233. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.d.ts +0 -29
  234. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.d.ts.map +0 -1
  235. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.d.ts +0 -26
  236. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.d.ts.map +0 -1
  237. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.d.ts +0 -24
  238. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.d.ts.map +0 -1
  239. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in.d.ts +0 -20
  240. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/opt-in.d.ts.map +0 -1
  241. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/subscribe.d.ts +0 -25
  242. package/dist/types/core/beacon/aggregation/cohort/messages/keygen/subscribe.d.ts.map +0 -1
  243. package/dist/types/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.d.ts +0 -25
  244. package/dist/types/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.d.ts.map +0 -1
  245. package/dist/types/core/beacon/aggregation/cohort/messages/sign/authorization-request.d.ts +0 -26
  246. package/dist/types/core/beacon/aggregation/cohort/messages/sign/authorization-request.d.ts.map +0 -1
  247. package/dist/types/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.d.ts +0 -26
  248. package/dist/types/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.d.ts.map +0 -1
  249. package/dist/types/core/beacon/aggregation/cohort/messages/sign/request-signature.d.ts +0 -26
  250. package/dist/types/core/beacon/aggregation/cohort/messages/sign/request-signature.d.ts.map +0 -1
  251. package/dist/types/core/beacon/aggregation/cohort/messages/sign/signature-authorization.d.ts +0 -27
  252. package/dist/types/core/beacon/aggregation/cohort/messages/sign/signature-authorization.d.ts.map +0 -1
  253. package/dist/types/core/beacon/aggregation/cohort/status.d.ts +0 -8
  254. package/dist/types/core/beacon/aggregation/cohort/status.d.ts.map +0 -1
  255. package/dist/types/core/beacon/aggregation/communication/adapter/did-comm.d.ts +0 -89
  256. package/dist/types/core/beacon/aggregation/communication/adapter/did-comm.d.ts.map +0 -1
  257. package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts +0 -103
  258. package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts.map +0 -1
  259. package/dist/types/core/beacon/aggregation/communication/error.d.ts.map +0 -1
  260. package/dist/types/core/beacon/aggregation/communication/factory.d.ts +0 -10
  261. package/dist/types/core/beacon/aggregation/communication/factory.d.ts.map +0 -1
  262. package/dist/types/core/beacon/aggregation/communication/service.d.ts +0 -36
  263. package/dist/types/core/beacon/aggregation/communication/service.d.ts.map +0 -1
  264. package/dist/types/core/beacon/aggregation/coordinator.d.ts +0 -116
  265. package/dist/types/core/beacon/aggregation/coordinator.d.ts.map +0 -1
  266. package/dist/types/core/beacon/aggregation/participant.d.ts +0 -192
  267. package/dist/types/core/beacon/aggregation/participant.d.ts.map +0 -1
  268. package/dist/types/core/beacon/aggregation/session/index.d.ts +0 -156
  269. package/dist/types/core/beacon/aggregation/session/index.d.ts.map +0 -1
  270. package/dist/types/core/beacon/aggregation/session/status.d.ts +0 -11
  271. package/dist/types/core/beacon/aggregation/session/status.d.ts.map +0 -1
  272. package/dist/types/core/update.d.ts +0 -52
  273. package/dist/types/core/update.d.ts.map +0 -1
  274. package/src/core/beacon/aggregation/cohort/index.ts +0 -305
  275. package/src/core/beacon/aggregation/cohort/messages/constants.ts +0 -12
  276. package/src/core/beacon/aggregation/cohort/messages/index.ts +0 -143
  277. package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-advert.ts +0 -44
  278. package/src/core/beacon/aggregation/cohort/messages/keygen/cohort-ready.ts +0 -40
  279. package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in-accept.ts +0 -35
  280. package/src/core/beacon/aggregation/cohort/messages/keygen/opt-in.ts +0 -34
  281. package/src/core/beacon/aggregation/cohort/messages/keygen/subscribe.ts +0 -36
  282. package/src/core/beacon/aggregation/cohort/messages/sign/aggregated-nonce.ts +0 -39
  283. package/src/core/beacon/aggregation/cohort/messages/sign/authorization-request.ts +0 -40
  284. package/src/core/beacon/aggregation/cohort/messages/sign/nonce-contribution.ts +0 -40
  285. package/src/core/beacon/aggregation/cohort/messages/sign/request-signature.ts +0 -40
  286. package/src/core/beacon/aggregation/cohort/messages/sign/signature-authorization.ts +0 -41
  287. package/src/core/beacon/aggregation/cohort/status.ts +0 -7
  288. package/src/core/beacon/aggregation/communication/adapter/did-comm.ts +0 -148
  289. package/src/core/beacon/aggregation/communication/adapter/nostr.ts +0 -323
  290. package/src/core/beacon/aggregation/communication/error.ts +0 -13
  291. package/src/core/beacon/aggregation/communication/factory.ts +0 -25
  292. package/src/core/beacon/aggregation/communication/service.ts +0 -42
  293. package/src/core/beacon/aggregation/coordinator.ts +0 -419
  294. package/src/core/beacon/aggregation/participant.ts +0 -517
  295. package/src/core/beacon/aggregation/session/index.ts +0 -301
  296. package/src/core/beacon/aggregation/session/status.ts +0 -18
  297. package/src/core/update.ts +0 -158
@@ -0,0 +1,77 @@
1
+ import type { CohortAdvert, PendingSigningRequest, PendingValidation } from '../participant.js';
2
+ import type { AggregationResult, PendingOptIn } from '../service.js';
3
+
4
+ /**
5
+ * AggregationServiceRunner events are emitted by the AggregationServiceRunner to signal important
6
+ * milestones and actions during the aggregation process. They can be listened to by external code
7
+ * to react to these events, such as logging, updating a UI, or triggering additional actions.
8
+ */
9
+ export type AggregationServiceEvents = {
10
+ /** A cohort has been created and the advert message broadcast. */
11
+ 'cohort-advertised': [{ cohortId: string }];
12
+
13
+ /** A participant has opted in. Fires before the accept decision callback. */
14
+ 'opt-in-received': [PendingOptIn];
15
+
16
+ /** A participant has been accepted into the cohort. */
17
+ 'participant-accepted': [{ participantDid: string }];
18
+
19
+ /** Keygen has been finalized — beacon address is now available. */
20
+ 'keygen-complete': [{ cohortId: string; beaconAddress: string }];
21
+
22
+ /** A participant has submitted a signed update. */
23
+ 'update-received': [{ participantDid: string }];
24
+
25
+ /** Aggregated data has been distributed to all participants for validation. */
26
+ 'data-distributed': [{ cohortId: string }];
27
+
28
+ /** A participant has acknowledged validation (approved or rejected). */
29
+ 'validation-received': [{ participantDid: string; approved: boolean }];
30
+
31
+ /** Signing has started — auth requests sent to participants. */
32
+ 'signing-started': [{ sessionId: string }];
33
+
34
+ /** A participant has contributed their MuSig2 nonce. */
35
+ 'nonce-received': [{ participantDid: string }];
36
+
37
+ /** Signing complete — final aggregated signature is ready to broadcast. */
38
+ 'signing-complete': [AggregationResult];
39
+
40
+ /** A non-fatal error occurred. Fatal errors reject the run() promise. */
41
+ 'error': [Error];
42
+ };
43
+
44
+ /**
45
+ * AggregationParticipantRunner events are emitted by the AggregationParticipantRunner to signal
46
+ * important milestones and actions during the participant's involvement in the aggregation process.
47
+ * They can be listened to by external code to react to these events, such as logging, updating a
48
+ * UI, or triggering additional actions.
49
+ */
50
+ export type AggregationParticipantEvents = {
51
+ /** A new cohort advert was discovered. Fires before the shouldJoin filter. */
52
+ 'cohort-discovered': [CohortAdvert];
53
+
54
+ /** Participant has opted in to a cohort. */
55
+ 'cohort-joined': [{ cohortId: string }];
56
+
57
+ /** Cohort keygen is complete — beacon address is now available. */
58
+ 'cohort-ready': [{ cohortId: string; beaconAddress: string }];
59
+
60
+ /** Participant has submitted their signed update. */
61
+ 'update-submitted': [{ cohortId: string }];
62
+
63
+ /** Aggregated data has arrived for validation. Fires before the validate callback. */
64
+ 'validation-requested': [PendingValidation];
65
+
66
+ /** Signing request has arrived. Fires before the sign approval callback. */
67
+ 'signing-requested': [PendingSigningRequest];
68
+
69
+ /** Cohort signing is complete from this participant's perspective. */
70
+ 'cohort-complete': [{ cohortId: string; beaconAddress: string }];
71
+
72
+ /** Cohort failed (rejected validation, signing error, etc.). */
73
+ 'cohort-failed': [{ cohortId: string; reason: string }];
74
+
75
+ /** A non-fatal error occurred. */
76
+ 'error': [Error];
77
+ };
@@ -0,0 +1,4 @@
1
+ export * from './typed-emitter.js';
2
+ export * from './events.js';
3
+ export * from './service-runner.js';
4
+ export * from './participant-runner.js';
@@ -0,0 +1,364 @@
1
+ import type { SignedBTCR2Update } from '@did-btcr2/cryptosuite';
2
+ import type { SchnorrKeyPair } from '@did-btcr2/keypair';
3
+ import type { BaseMessage } from '../messages/base.js';
4
+ import {
5
+ AGGREGATED_NONCE,
6
+ AUTHORIZATION_REQUEST,
7
+ COHORT_ADVERT,
8
+ COHORT_OPT_IN_ACCEPT,
9
+ COHORT_READY,
10
+ DISTRIBUTE_AGGREGATED_DATA,
11
+ } from '../messages/constants.js';
12
+ import type {
13
+ CohortAdvert,
14
+ PendingSigningRequest,
15
+ PendingValidation} from '../participant.js';
16
+ import {
17
+ AggregationParticipant
18
+ } from '../participant.js';
19
+ import { ParticipantCohortPhase } from '../phases.js';
20
+ import type { Transport } from '../transport/transport.js';
21
+ import type { AggregationParticipantEvents } from './events.js';
22
+ import { TypedEventEmitter } from './typed-emitter.js';
23
+
24
+ /** Decision callback: filter discovered cohorts. Default rejects all. */
25
+ export type ShouldJoin = (advert: CohortAdvert) => Promise<boolean>;
26
+
27
+ /** Data callback: provide a signed BTCR2 update for a joined cohort. */
28
+ export type OnProvideUpdate = (info: {
29
+ cohortId: string;
30
+ beaconAddress: string;
31
+ }) => Promise<SignedBTCR2Update>;
32
+
33
+ /** Decision callback: approve or reject aggregated data. */
34
+ export type OnValidateData = (info: PendingValidation) => Promise<{ approved: boolean }>;
35
+
36
+ /** Decision callback: approve or reject signing. */
37
+ export type OnApproveSigning = (info: PendingSigningRequest) => Promise<{ approved: boolean }>;
38
+
39
+ export interface AggregationParticipantRunnerOptions {
40
+ /** Underlying transport. */
41
+ transport: Transport;
42
+
43
+ /** Participant identity. */
44
+ did: string;
45
+ keys: SchnorrKeyPair;
46
+
47
+ /**
48
+ * Filter discovered cohorts. Returns true to join, false to skip.
49
+ * Default: rejects all cohorts (caller MUST override or no cohorts will be joined).
50
+ */
51
+ shouldJoin?: ShouldJoin;
52
+
53
+ /**
54
+ * Provide a signed BTCR2 update for the cohort.
55
+ * REQUIRED — no sensible default.
56
+ */
57
+ onProvideUpdate: OnProvideUpdate;
58
+
59
+ /**
60
+ * Approve or reject aggregated data.
61
+ * Default: approve if validation matches the submitted update's hash.
62
+ */
63
+ onValidateData?: OnValidateData;
64
+
65
+ /**
66
+ * Approve or reject the signing request.
67
+ * Default: approve.
68
+ */
69
+ onApproveSigning?: OnApproveSigning;
70
+ }
71
+
72
+ /**
73
+ * High-level facade for an Aggregation Participant.
74
+ *
75
+ * Long-running listener: waits for cohort adverts, applies the `shouldJoin`
76
+ * filter, and drives each accepted cohort through the full protocol to
77
+ * completion in parallel.
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const transport = new NostrTransport({ relays: [RELAY] });
82
+ * transport.registerActor(myDid, myKeys);
83
+ *
84
+ * const runner = new AggregationParticipantRunner({
85
+ * transport,
86
+ * did: myDid,
87
+ * keys: myKeys,
88
+ * shouldJoin: async (advert) => advert.beaconType === 'CASBeacon',
89
+ * onProvideUpdate: async ({ beaconAddress }) => {
90
+ <<<<<<< Updated upstream
91
+ * return Update.sign(myDid, unsigned, vm, secretKey);
92
+ =======
93
+ * return Updater.sign(myDid, unsigned, vm, secretKey);
94
+ >>>>>>> Stashed changes
95
+ * },
96
+ * });
97
+ *
98
+ * runner.on('cohort-complete', ({ beaconAddress }) => {
99
+ * console.log(`Add to DID document: bitcoin:${beaconAddress}`);
100
+ * });
101
+ *
102
+ * await runner.start();
103
+ * ```
104
+ *
105
+ * For full manual control, drop down to the underlying state machine via
106
+ * `runner.session`. The state machine has no transport coupling and exposes
107
+ * every protocol decision as an explicit method.
108
+ *
109
+ * @class AggregationParticipantRunner
110
+ * @extends TypedEventEmitter<AggregationParticipantEvents>
111
+ */
112
+ export class AggregationParticipantRunner extends TypedEventEmitter<AggregationParticipantEvents> {
113
+ /** Direct access to the underlying state machine for advanced use. */
114
+ readonly session: AggregationParticipant;
115
+
116
+ readonly #transport: Transport;
117
+ readonly #did: string;
118
+ readonly #shouldJoin: ShouldJoin;
119
+ readonly #onProvideUpdate: OnProvideUpdate;
120
+ readonly #onValidateData: OnValidateData;
121
+ readonly #onApproveSigning: OnApproveSigning;
122
+
123
+ #handlersRegistered = false;
124
+ #stopped = false;
125
+
126
+ constructor(options: AggregationParticipantRunnerOptions) {
127
+ super();
128
+ this.#transport = options.transport;
129
+ this.#did = options.did;
130
+ this.#shouldJoin = options.shouldJoin ?? (async () => false);
131
+ this.#onProvideUpdate = options.onProvideUpdate;
132
+ this.#onValidateData = options.onValidateData ?? (async (info) => ({ approved: info.matches }));
133
+ this.#onApproveSigning = options.onApproveSigning ?? (async () => ({ approved: true }));
134
+
135
+ this.session = new AggregationParticipant({ did: options.did, keys: options.keys });
136
+ }
137
+
138
+ /**
139
+ * Start listening for cohorts. The runner stays active until {@link stop}
140
+ * is called or the underlying transport disconnects.
141
+ */
142
+ async start(): Promise<void> {
143
+ this.#registerHandlers();
144
+ }
145
+
146
+ /** Stop the runner. Does not unregister transport handlers. */
147
+ stop(): void {
148
+ this.#stopped = true;
149
+ }
150
+
151
+ /**
152
+ * Single-shot helper: start, join the first cohort that passes `shouldJoin`,
153
+ * drive it to completion, and resolve. Convenient for tests and demos.
154
+ */
155
+ static async joinFirst(
156
+ options: AggregationParticipantRunnerOptions
157
+ ): Promise<{ cohortId: string; beaconAddress: string }> {
158
+ return new Promise((resolve, reject) => {
159
+ const runner = new AggregationParticipantRunner(options);
160
+ runner.once('cohort-complete', (info) => {
161
+ runner.stop();
162
+ resolve(info);
163
+ });
164
+ runner.on('error', reject);
165
+ runner.start().catch(reject);
166
+ });
167
+ }
168
+
169
+ /**
170
+ * Internal: handler registration with the transport. Idempotent and safe to call multiple times,
171
+ * but only registers handlers once.
172
+ */
173
+ #registerHandlers(): void {
174
+ if (this.#handlersRegistered) return;
175
+ this.#handlersRegistered = true;
176
+
177
+ this.#transport.registerMessageHandler(this.#did, COHORT_ADVERT, this.#handleAdvert.bind(this));
178
+ this.#transport.registerMessageHandler(this.#did, COHORT_OPT_IN_ACCEPT, this.#handleOptInAccept.bind(this));
179
+ this.#transport.registerMessageHandler(this.#did, COHORT_READY, this.#handleCohortReady.bind(this));
180
+ this.#transport.registerMessageHandler(this.#did, DISTRIBUTE_AGGREGATED_DATA, this.#handleDistributeData.bind(this));
181
+ this.#transport.registerMessageHandler(this.#did, AUTHORIZATION_REQUEST, this.#handleAuthorizationRequest.bind(this));
182
+ this.#transport.registerMessageHandler(this.#did, AGGREGATED_NONCE, this.#handleAggregatedNonce.bind(this));
183
+ }
184
+
185
+ /**
186
+ * Internal: handler for cohort adverts. Applies the `shouldJoin` filter and joins if approved.
187
+ * @param {BaseMessage} msg - The received cohort advert message.
188
+ * @returns {Promise<void>} Resolves when processing is complete.
189
+ */
190
+ async #handleAdvert(msg: BaseMessage): Promise<void> {
191
+ if (this.#stopped) return;
192
+ try {
193
+ this.session.receive(msg);
194
+
195
+ const advert = this.session.discoveredCohorts.get(msg.body?.cohortId ?? '');
196
+ if (!advert) return;
197
+ this.emit('cohort-discovered', advert);
198
+
199
+ // Register the service's communication key for encrypted message routing
200
+ if (advert.serviceCommunicationPk) {
201
+ this.#transport.registerPeer(advert.serviceDid, advert.serviceCommunicationPk);
202
+ }
203
+
204
+ const join = await this.#shouldJoin(advert);
205
+ if (!join) return;
206
+
207
+ await this.#sendAll(this.session.joinCohort(advert.cohortId));
208
+ this.emit('cohort-joined', { cohortId: advert.cohortId });
209
+ } catch (err) {
210
+ this.emit('error', err as Error);
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Internal: handler for opt-in accept messages. Updates the session state accordingly.
216
+ * @param {BaseMessage} msg - The received opt-in accept message.
217
+ */
218
+ #handleOptInAccept(msg: BaseMessage): void {
219
+ if (this.#stopped) return;
220
+ try {
221
+ this.session.receive(msg);
222
+ } catch (err) {
223
+ this.emit('error', err as Error);
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Internal: handler for cohort ready messages. Updates the session state, emits a 'cohort-ready'
229
+ * event, and triggers the update submission flow via the `onProvideUpdate` callback.
230
+ * @param {BaseMessage} msg - The received cohort ready message.
231
+ * @returns {Promise<void>} Resolves when processing is complete.
232
+ */
233
+ async #handleCohortReady(msg: BaseMessage): Promise<void> {
234
+ if (this.#stopped) return;
235
+ try {
236
+ this.session.receive(msg);
237
+
238
+ const cohortId = msg.body?.cohortId;
239
+ if (!cohortId) return;
240
+
241
+ const info = this.session.joinedCohorts.get(cohortId);
242
+ if (!info) return;
243
+ this.emit('cohort-ready', { cohortId, beaconAddress: info.beaconAddress });
244
+
245
+ // Construct the signed update via caller callback and submit
246
+ const signedUpdate = await this.#onProvideUpdate({
247
+ cohortId,
248
+ beaconAddress : info.beaconAddress,
249
+ });
250
+ await this.#sendAll(this.session.submitUpdate(cohortId, signedUpdate));
251
+ this.emit('update-submitted', { cohortId });
252
+ } catch (err) {
253
+ this.emit('error', err as Error);
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Internal: handler for distribute aggregated data messages. Updates the session state, emits a
259
+ * 'validation-requested' event, and triggers the validation decision flow via the `onValidateData`
260
+ * callback. Depending on the decision, sends an approval or rejection message.
261
+ * @param {BaseMessage} msg - The received distribute aggregated data message.
262
+ * @returns {Promise<void>} Resolves when processing is complete.
263
+ * @throws {Error} If an error occurs during message processing or callback execution.
264
+ */
265
+ async #handleDistributeData(msg: BaseMessage): Promise<void> {
266
+ if (this.#stopped) return;
267
+ try {
268
+ this.session.receive(msg);
269
+
270
+ const cohortId = msg.body?.cohortId;
271
+ if (!cohortId) return;
272
+
273
+ const validation = this.session.pendingValidations.get(cohortId);
274
+ if (!validation) return;
275
+ this.emit('validation-requested', validation);
276
+
277
+ const decision = await this.#onValidateData(validation);
278
+ if (decision.approved) {
279
+ await this.#sendAll(this.session.approveValidation(cohortId));
280
+ } else {
281
+ await this.#sendAll(this.session.rejectValidation(cohortId));
282
+ this.emit('cohort-failed', { cohortId, reason: 'Validation rejected by participant' });
283
+ }
284
+ } catch (err) {
285
+ this.emit('error', err as Error);
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Internal: handler for authorization request messages. Updates the session state, emits a
291
+ * 'signing-requested' event, and triggers the signing approval flow via the `onApproveSigning`
292
+ * callback. Depending on the decision, sends a nonce approval message or emits a 'cohort-failed'
293
+ * event.
294
+ * @param {BaseMessage} msg - The received authorization request message.
295
+ * @returns {Promise<void>} Resolves when processing is complete.
296
+ * @throws {Error} If an error occurs during message processing or callback execution.
297
+ */
298
+ async #handleAuthorizationRequest(msg: BaseMessage): Promise<void> {
299
+ if (this.#stopped) return;
300
+ try {
301
+ this.session.receive(msg);
302
+
303
+ const cohortId = msg.body?.cohortId;
304
+ if (!cohortId) return;
305
+
306
+ const req = this.session.pendingSigningRequests.get(cohortId);
307
+ if (!req) return;
308
+ this.emit('signing-requested', req);
309
+
310
+ const decision = await this.#onApproveSigning(req);
311
+ if (!decision.approved) {
312
+ this.emit('cohort-failed', { cohortId, reason: 'Signing rejected by participant' });
313
+ return;
314
+ }
315
+
316
+ await this.#sendAll(this.session.approveNonce(cohortId));
317
+ } catch (err) {
318
+ this.emit('error', err as Error);
319
+ }
320
+ }
321
+
322
+ /**
323
+ * Internal: handler for aggregated nonce messages. Updates the session state, triggers partial
324
+ * signature generation, and sends the partial signature to the aggregator. If the cohort reaches
325
+ * completion after processing the nonce, emits a 'cohort-complete' event.
326
+ * @param {BaseMessage} msg - The received aggregated nonce message.
327
+ * @returns {Promise<void>} Resolves when processing is complete.
328
+ * @throws {Error} If an error occurs during message processing or partial signature generation.
329
+ */
330
+ async #handleAggregatedNonce(msg: BaseMessage): Promise<void> {
331
+ if (this.#stopped) return;
332
+ try {
333
+ this.session.receive(msg);
334
+
335
+ const cohortId = msg.body?.cohortId;
336
+ if (!cohortId) return;
337
+
338
+ await this.#sendAll(this.session.generatePartialSignature(cohortId));
339
+
340
+ // Check if we've reached completion
341
+ if (this.session.getCohortPhase(cohortId) === ParticipantCohortPhase.Complete) {
342
+ const info = this.session.joinedCohorts.get(cohortId);
343
+ if (info) {
344
+ this.emit('cohort-complete', { cohortId, beaconAddress: info.beaconAddress });
345
+ }
346
+ }
347
+ } catch (err) {
348
+ this.emit('error', err as Error);
349
+ }
350
+ }
351
+
352
+ /**
353
+ * Internal: send helper to ensure messages are sent sequentially. This is important for protocol
354
+ * correctness, as some transports may not guarantee message order if sent in parallel.
355
+ * @param {BaseMessage[]} msgs - The messages to send.
356
+ * @returns {Promise<void>} Resolves when all messages have been sent.
357
+ * @throws {Error} If an error occurs during message sending.
358
+ */
359
+ async #sendAll(msgs: BaseMessage[]): Promise<void> {
360
+ for (const m of msgs) {
361
+ await this.#transport.sendMessage(m, this.#did, m.to);
362
+ }
363
+ }
364
+ }