@did-btcr2/aggregation 0.1.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 (233) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +19 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/browser.js +24017 -0
  5. package/dist/browser.mjs +24011 -0
  6. package/dist/cjs/index.js +5690 -0
  7. package/dist/cjs/package.json +1 -0
  8. package/dist/esm/beacon-strategy.js +76 -0
  9. package/dist/esm/beacon-strategy.js.map +1 -0
  10. package/dist/esm/cohort.js +316 -0
  11. package/dist/esm/cohort.js.map +1 -0
  12. package/dist/esm/conditions.js +102 -0
  13. package/dist/esm/conditions.js.map +1 -0
  14. package/dist/esm/errors.js +22 -0
  15. package/dist/esm/errors.js.map +1 -0
  16. package/dist/esm/fallback-spend.js +132 -0
  17. package/dist/esm/fallback-spend.js.map +1 -0
  18. package/dist/esm/index.js +21 -0
  19. package/dist/esm/index.js.map +1 -0
  20. package/dist/esm/logger.js +15 -0
  21. package/dist/esm/logger.js.map +1 -0
  22. package/dist/esm/messages/base.js +36 -0
  23. package/dist/esm/messages/base.js.map +1 -0
  24. package/dist/esm/messages/bodies.js +149 -0
  25. package/dist/esm/messages/bodies.js.map +1 -0
  26. package/dist/esm/messages/constants.js +37 -0
  27. package/dist/esm/messages/constants.js.map +1 -0
  28. package/dist/esm/messages/factories.js +139 -0
  29. package/dist/esm/messages/factories.js.map +1 -0
  30. package/dist/esm/messages/guards.js +40 -0
  31. package/dist/esm/messages/guards.js.map +1 -0
  32. package/dist/esm/messages/index.js +6 -0
  33. package/dist/esm/messages/index.js.map +1 -0
  34. package/dist/esm/participant.js +588 -0
  35. package/dist/esm/participant.js.map +1 -0
  36. package/dist/esm/phases.js +45 -0
  37. package/dist/esm/phases.js.map +1 -0
  38. package/dist/esm/recovery-policy.js +156 -0
  39. package/dist/esm/recovery-policy.js.map +1 -0
  40. package/dist/esm/recovery-spend.js +106 -0
  41. package/dist/esm/recovery-spend.js.map +1 -0
  42. package/dist/esm/runner/aggregation-runner.js +75 -0
  43. package/dist/esm/runner/aggregation-runner.js.map +1 -0
  44. package/dist/esm/runner/events.js +2 -0
  45. package/dist/esm/runner/events.js.map +1 -0
  46. package/dist/esm/runner/index.js +6 -0
  47. package/dist/esm/runner/index.js.map +1 -0
  48. package/dist/esm/runner/participant-runner.js +407 -0
  49. package/dist/esm/runner/participant-runner.js.map +1 -0
  50. package/dist/esm/runner/service-runner.js +701 -0
  51. package/dist/esm/runner/service-runner.js.map +1 -0
  52. package/dist/esm/runner/typed-emitter.js +80 -0
  53. package/dist/esm/runner/typed-emitter.js.map +1 -0
  54. package/dist/esm/service.js +774 -0
  55. package/dist/esm/service.js.map +1 -0
  56. package/dist/esm/signer.js +33 -0
  57. package/dist/esm/signer.js.map +1 -0
  58. package/dist/esm/signing-session.js +195 -0
  59. package/dist/esm/signing-session.js.map +1 -0
  60. package/dist/esm/transport/didcomm.js +41 -0
  61. package/dist/esm/transport/didcomm.js.map +1 -0
  62. package/dist/esm/transport/error.js +12 -0
  63. package/dist/esm/transport/error.js.map +1 -0
  64. package/dist/esm/transport/factory.js +29 -0
  65. package/dist/esm/transport/factory.js.map +1 -0
  66. package/dist/esm/transport/http/client.js +342 -0
  67. package/dist/esm/transport/http/client.js.map +1 -0
  68. package/dist/esm/transport/http/envelope.js +126 -0
  69. package/dist/esm/transport/http/envelope.js.map +1 -0
  70. package/dist/esm/transport/http/errors.js +11 -0
  71. package/dist/esm/transport/http/errors.js.map +1 -0
  72. package/dist/esm/transport/http/inbox-buffer.js +45 -0
  73. package/dist/esm/transport/http/inbox-buffer.js.map +1 -0
  74. package/dist/esm/transport/http/index.js +12 -0
  75. package/dist/esm/transport/http/index.js.map +1 -0
  76. package/dist/esm/transport/http/nonce-cache.js +38 -0
  77. package/dist/esm/transport/http/nonce-cache.js.map +1 -0
  78. package/dist/esm/transport/http/protocol.js +28 -0
  79. package/dist/esm/transport/http/protocol.js.map +1 -0
  80. package/dist/esm/transport/http/rate-limiter.js +45 -0
  81. package/dist/esm/transport/http/rate-limiter.js.map +1 -0
  82. package/dist/esm/transport/http/request-auth.js +100 -0
  83. package/dist/esm/transport/http/request-auth.js.map +1 -0
  84. package/dist/esm/transport/http/server.js +475 -0
  85. package/dist/esm/transport/http/server.js.map +1 -0
  86. package/dist/esm/transport/http/sse-stream.js +110 -0
  87. package/dist/esm/transport/http/sse-stream.js.map +1 -0
  88. package/dist/esm/transport/http/sse-writer.js +25 -0
  89. package/dist/esm/transport/http/sse-writer.js.map +1 -0
  90. package/dist/esm/transport/in-memory.js +149 -0
  91. package/dist/esm/transport/in-memory.js.map +1 -0
  92. package/dist/esm/transport/index.js +8 -0
  93. package/dist/esm/transport/index.js.map +1 -0
  94. package/dist/esm/transport/nostr.js +491 -0
  95. package/dist/esm/transport/nostr.js.map +1 -0
  96. package/dist/esm/transport/transport.js +2 -0
  97. package/dist/esm/transport/transport.js.map +1 -0
  98. package/dist/types/beacon-strategy.d.ts +56 -0
  99. package/dist/types/beacon-strategy.d.ts.map +1 -0
  100. package/dist/types/cohort.d.ts +188 -0
  101. package/dist/types/cohort.d.ts.map +1 -0
  102. package/dist/types/conditions.d.ts +86 -0
  103. package/dist/types/conditions.d.ts.map +1 -0
  104. package/dist/types/errors.d.ts +14 -0
  105. package/dist/types/errors.d.ts.map +1 -0
  106. package/dist/types/fallback-spend.d.ts +94 -0
  107. package/dist/types/fallback-spend.d.ts.map +1 -0
  108. package/dist/types/index.d.ts +17 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/logger.d.ts +22 -0
  111. package/dist/types/logger.d.ts.map +1 -0
  112. package/dist/types/messages/base.d.ts +58 -0
  113. package/dist/types/messages/base.d.ts.map +1 -0
  114. package/dist/types/messages/bodies.d.ts +177 -0
  115. package/dist/types/messages/bodies.d.ts.map +1 -0
  116. package/dist/types/messages/constants.d.ts +31 -0
  117. package/dist/types/messages/constants.d.ts.map +1 -0
  118. package/dist/types/messages/factories.d.ts +217 -0
  119. package/dist/types/messages/factories.d.ts.map +1 -0
  120. package/dist/types/messages/guards.d.ts +11 -0
  121. package/dist/types/messages/guards.d.ts.map +1 -0
  122. package/dist/types/messages/index.d.ts +6 -0
  123. package/dist/types/messages/index.d.ts.map +1 -0
  124. package/dist/types/participant.d.ts +162 -0
  125. package/dist/types/participant.d.ts.map +1 -0
  126. package/dist/types/phases.d.ts +55 -0
  127. package/dist/types/phases.d.ts.map +1 -0
  128. package/dist/types/recovery-policy.d.ts +132 -0
  129. package/dist/types/recovery-policy.d.ts.map +1 -0
  130. package/dist/types/recovery-spend.d.ts +94 -0
  131. package/dist/types/recovery-spend.d.ts.map +1 -0
  132. package/dist/types/runner/aggregation-runner.d.ts +72 -0
  133. package/dist/types/runner/aggregation-runner.d.ts.map +1 -0
  134. package/dist/types/runner/events.d.ts +147 -0
  135. package/dist/types/runner/events.d.ts.map +1 -0
  136. package/dist/types/runner/index.d.ts +6 -0
  137. package/dist/types/runner/index.d.ts.map +1 -0
  138. package/dist/types/runner/participant-runner.d.ts +122 -0
  139. package/dist/types/runner/participant-runner.d.ts.map +1 -0
  140. package/dist/types/runner/service-runner.d.ts +228 -0
  141. package/dist/types/runner/service-runner.d.ts.map +1 -0
  142. package/dist/types/runner/typed-emitter.d.ts +41 -0
  143. package/dist/types/runner/typed-emitter.d.ts.map +1 -0
  144. package/dist/types/service.d.ts +177 -0
  145. package/dist/types/service.d.ts.map +1 -0
  146. package/dist/types/signer.d.ts +50 -0
  147. package/dist/types/signer.d.ts.map +1 -0
  148. package/dist/types/signing-session.d.ts +81 -0
  149. package/dist/types/signing-session.d.ts.map +1 -0
  150. package/dist/types/transport/didcomm.d.ts +23 -0
  151. package/dist/types/transport/didcomm.d.ts.map +1 -0
  152. package/dist/types/transport/error.d.ts +8 -0
  153. package/dist/types/transport/error.d.ts.map +1 -0
  154. package/dist/types/transport/factory.d.ts +28 -0
  155. package/dist/types/transport/factory.d.ts.map +1 -0
  156. package/dist/types/transport/http/client.d.ts +56 -0
  157. package/dist/types/transport/http/client.d.ts.map +1 -0
  158. package/dist/types/transport/http/envelope.d.ts +64 -0
  159. package/dist/types/transport/http/envelope.d.ts.map +1 -0
  160. package/dist/types/transport/http/errors.d.ts +9 -0
  161. package/dist/types/transport/http/errors.d.ts.map +1 -0
  162. package/dist/types/transport/http/inbox-buffer.d.ts +32 -0
  163. package/dist/types/transport/http/inbox-buffer.d.ts.map +1 -0
  164. package/dist/types/transport/http/index.d.ts +12 -0
  165. package/dist/types/transport/http/index.d.ts.map +1 -0
  166. package/dist/types/transport/http/nonce-cache.d.ts +26 -0
  167. package/dist/types/transport/http/nonce-cache.d.ts.map +1 -0
  168. package/dist/types/transport/http/protocol.d.ts +53 -0
  169. package/dist/types/transport/http/protocol.d.ts.map +1 -0
  170. package/dist/types/transport/http/rate-limiter.d.ts +41 -0
  171. package/dist/types/transport/http/rate-limiter.d.ts.map +1 -0
  172. package/dist/types/transport/http/request-auth.d.ts +50 -0
  173. package/dist/types/transport/http/request-auth.d.ts.map +1 -0
  174. package/dist/types/transport/http/server.d.ts +118 -0
  175. package/dist/types/transport/http/server.d.ts.map +1 -0
  176. package/dist/types/transport/http/sse-stream.d.ts +34 -0
  177. package/dist/types/transport/http/sse-stream.d.ts.map +1 -0
  178. package/dist/types/transport/http/sse-writer.d.ts +12 -0
  179. package/dist/types/transport/http/sse-writer.d.ts.map +1 -0
  180. package/dist/types/transport/in-memory.d.ts +64 -0
  181. package/dist/types/transport/in-memory.d.ts.map +1 -0
  182. package/dist/types/transport/index.d.ts +8 -0
  183. package/dist/types/transport/index.d.ts.map +1 -0
  184. package/dist/types/transport/nostr.d.ts +153 -0
  185. package/dist/types/transport/nostr.d.ts.map +1 -0
  186. package/dist/types/transport/transport.d.ts +62 -0
  187. package/dist/types/transport/transport.d.ts.map +1 -0
  188. package/package.json +128 -0
  189. package/src/beacon-strategy.ts +142 -0
  190. package/src/cohort.ts +422 -0
  191. package/src/conditions.ts +172 -0
  192. package/src/errors.ts +25 -0
  193. package/src/fallback-spend.ts +223 -0
  194. package/src/index.ts +23 -0
  195. package/src/logger.ts +33 -0
  196. package/src/messages/base.ts +80 -0
  197. package/src/messages/bodies.ts +328 -0
  198. package/src/messages/constants.ts +40 -0
  199. package/src/messages/factories.ts +297 -0
  200. package/src/messages/guards.ts +61 -0
  201. package/src/messages/index.ts +5 -0
  202. package/src/participant.ts +779 -0
  203. package/src/phases.ts +91 -0
  204. package/src/recovery-policy.ts +237 -0
  205. package/src/recovery-spend.ts +192 -0
  206. package/src/runner/aggregation-runner.ts +125 -0
  207. package/src/runner/events.ts +129 -0
  208. package/src/runner/index.ts +5 -0
  209. package/src/runner/participant-runner.ts +488 -0
  210. package/src/runner/service-runner.ts +891 -0
  211. package/src/runner/typed-emitter.ts +87 -0
  212. package/src/service.ts +1000 -0
  213. package/src/signer.ts +67 -0
  214. package/src/signing-session.ts +290 -0
  215. package/src/transport/didcomm.ts +59 -0
  216. package/src/transport/error.ts +13 -0
  217. package/src/transport/factory.ts +65 -0
  218. package/src/transport/http/client.ts +409 -0
  219. package/src/transport/http/envelope.ts +204 -0
  220. package/src/transport/http/errors.ts +11 -0
  221. package/src/transport/http/inbox-buffer.ts +53 -0
  222. package/src/transport/http/index.ts +11 -0
  223. package/src/transport/http/nonce-cache.ts +43 -0
  224. package/src/transport/http/protocol.ts +57 -0
  225. package/src/transport/http/rate-limiter.ts +75 -0
  226. package/src/transport/http/request-auth.ts +164 -0
  227. package/src/transport/http/server.ts +617 -0
  228. package/src/transport/http/sse-stream.ts +121 -0
  229. package/src/transport/http/sse-writer.ts +23 -0
  230. package/src/transport/in-memory.ts +178 -0
  231. package/src/transport/index.ts +7 -0
  232. package/src/transport/nostr.ts +576 -0
  233. package/src/transport/transport.ts +79 -0
@@ -0,0 +1,407 @@
1
+ var _a;
2
+ import { AGGREGATED_NONCE, AUTHORIZATION_REQUEST, COHORT_ADVERT, COHORT_OPT_IN_ACCEPT, COHORT_READY, DISTRIBUTE_AGGREGATED_DATA, FALLBACK_AUTHORIZATION_REQUEST, } from '../messages/constants.js';
3
+ import { AggregationParticipant } from '../participant.js';
4
+ import { ParticipantCohortPhase } from '../phases.js';
5
+ import { KeyPairAggregationSigner } from '../signer.js';
6
+ import { TypedEventEmitter } from './typed-emitter.js';
7
+ /**
8
+ * High-level facade for an Aggregation Participant.
9
+ *
10
+ * Long-running listener: waits for cohort adverts, applies the `shouldJoin`
11
+ * filter, and drives each accepted cohort through the full protocol to
12
+ * completion in parallel.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const transport = new NostrTransport({ relays: [RELAY] });
17
+ * transport.registerActor(myDid, myKeys);
18
+ *
19
+ * const runner = new AggregationParticipantRunner({
20
+ * transport,
21
+ * did: myDid,
22
+ * keys: myKeys,
23
+ * shouldJoin: async (advert) => advert.beaconType === 'CASBeacon',
24
+ * onProvideUpdate: async ({ beaconAddress }) => {
25
+ * return Updater.sign(myDid, unsigned, vm, secretKey);
26
+ * },
27
+ * });
28
+ *
29
+ * runner.on('cohort-complete', ({ beaconAddress }) => {
30
+ * console.log(`Add to DID document: bitcoin:${beaconAddress}`);
31
+ * });
32
+ *
33
+ * await runner.start();
34
+ * ```
35
+ *
36
+ * For full manual control, drop down to the underlying state machine via
37
+ * `runner.session`. The state machine has no transport coupling and exposes
38
+ * every protocol decision as an explicit method.
39
+ *
40
+ * @class AggregationParticipantRunner
41
+ * @extends TypedEventEmitter<AggregationParticipantEvents>
42
+ */
43
+ export class AggregationParticipantRunner extends TypedEventEmitter {
44
+ /** Direct access to the underlying state machine for advanced use. */
45
+ session;
46
+ #transport;
47
+ #did;
48
+ #shouldJoin;
49
+ #onProvideUpdate;
50
+ #onValidateData;
51
+ #onApproveSigning;
52
+ #handlersRegistered = false;
53
+ #stopped = false;
54
+ constructor(options) {
55
+ super();
56
+ this.#transport = options.transport;
57
+ this.#did = options.did;
58
+ this.#shouldJoin = options.shouldJoin ?? (async () => false);
59
+ this.#onProvideUpdate = options.onProvideUpdate;
60
+ this.#onValidateData = options.onValidateData ?? (async (info) => ({ approved: info.matches }));
61
+ this.#onApproveSigning = options.onApproveSigning ?? (async () => ({ approved: true }));
62
+ this.session = new AggregationParticipant({
63
+ did: options.did,
64
+ signer: new KeyPairAggregationSigner(options.keys),
65
+ });
66
+ }
67
+ /**
68
+ * Start listening for cohorts. The runner stays active until {@link stop}
69
+ * is called or the underlying transport disconnects.
70
+ */
71
+ async start() {
72
+ this.#registerHandlers();
73
+ }
74
+ /** Stop the runner and detach transport handlers. Safe to call repeatedly. */
75
+ stop() {
76
+ this.#stopped = true;
77
+ this.#unregisterHandlers();
78
+ // Deterministically wipe any secret nonce left on an abandoned signing
79
+ // session. The signing key itself lives behind the AggregationSigner and is
80
+ // never retained here.
81
+ this.session.clearSecrets();
82
+ }
83
+ /** Message types this runner listens for on the transport. */
84
+ static #HANDLED_MESSAGE_TYPES = [
85
+ COHORT_ADVERT,
86
+ COHORT_OPT_IN_ACCEPT,
87
+ COHORT_READY,
88
+ DISTRIBUTE_AGGREGATED_DATA,
89
+ AUTHORIZATION_REQUEST,
90
+ AGGREGATED_NONCE,
91
+ FALLBACK_AUTHORIZATION_REQUEST,
92
+ ];
93
+ /** Internal: detach from the transport. Safe to call repeatedly. */
94
+ #unregisterHandlers() {
95
+ if (!this.#handlersRegistered)
96
+ return;
97
+ this.#handlersRegistered = false;
98
+ for (const type of _a.#HANDLED_MESSAGE_TYPES) {
99
+ this.#transport.unregisterMessageHandler(this.#did, type);
100
+ }
101
+ }
102
+ /**
103
+ * Single-shot helper: start, join the first cohort that passes `shouldJoin`,
104
+ * drive it to completion, and resolve. Convenient for tests and demos. The
105
+ * single-cohort special case of {@link joinMatching} (count = 1).
106
+ */
107
+ static async joinFirst(options) {
108
+ return new Promise((resolve, reject) => {
109
+ const runner = new _a(options);
110
+ runner.once('cohort-complete', (info) => {
111
+ runner.stop();
112
+ resolve(info);
113
+ });
114
+ runner.on('error', reject);
115
+ runner.start().catch(reject);
116
+ });
117
+ }
118
+ /**
119
+ * Multi-cohort helper: start, join EVERY cohort whose advert passes
120
+ * `shouldJoin`, drive each to completion in parallel, and resolve once
121
+ * `count` cohorts have completed (the runner stops at that point). The
122
+ * N-cohort generalization of {@link joinFirst}, for a participant that joins
123
+ * several cohorts advertised by one service.
124
+ *
125
+ * For an open-ended, long-lived subscriber (no fixed count), construct an
126
+ * {@link AggregationParticipantRunner} directly, set `shouldJoin`, call
127
+ * `start()`, and listen for `cohort-complete` - the runner already drives
128
+ * any number of cohorts concurrently.
129
+ *
130
+ * @param options Participant runner options (set `shouldJoin` to select cohorts).
131
+ * @param count Number of completed cohorts to collect before resolving.
132
+ * @returns The {@link CohortCompleteInfo} for each completed cohort, in completion order.
133
+ */
134
+ static async joinMatching(options, count) {
135
+ return new Promise((resolve, reject) => {
136
+ const runner = new _a(options);
137
+ const completed = [];
138
+ runner.on('cohort-complete', (info) => {
139
+ completed.push(info);
140
+ if (completed.length >= count) {
141
+ runner.stop();
142
+ resolve(completed);
143
+ }
144
+ });
145
+ runner.on('error', reject);
146
+ runner.start().catch(reject);
147
+ });
148
+ }
149
+ /**
150
+ * Internal: handler registration with the transport. Idempotent and safe to call multiple times,
151
+ * but only registers handlers once.
152
+ */
153
+ #registerHandlers() {
154
+ if (this.#handlersRegistered)
155
+ return;
156
+ this.#handlersRegistered = true;
157
+ this.#transport.registerMessageHandler(this.#did, COHORT_ADVERT, this.#handleAdvert.bind(this));
158
+ this.#transport.registerMessageHandler(this.#did, COHORT_OPT_IN_ACCEPT, this.#handleOptInAccept.bind(this));
159
+ this.#transport.registerMessageHandler(this.#did, COHORT_READY, this.#handleCohortReady.bind(this));
160
+ this.#transport.registerMessageHandler(this.#did, DISTRIBUTE_AGGREGATED_DATA, this.#handleDistributeData.bind(this));
161
+ this.#transport.registerMessageHandler(this.#did, AUTHORIZATION_REQUEST, this.#handleAuthorizationRequest.bind(this));
162
+ this.#transport.registerMessageHandler(this.#did, AGGREGATED_NONCE, this.#handleAggregatedNonce.bind(this));
163
+ this.#transport.registerMessageHandler(this.#did, FALLBACK_AUTHORIZATION_REQUEST, this.#handleFallbackAuthorizationRequest.bind(this));
164
+ }
165
+ /**
166
+ * Internal: handler for cohort adverts. Applies the `shouldJoin` filter and joins if approved.
167
+ * @param {BaseMessage} msg - The received cohort advert message.
168
+ * @returns {Promise<void>} Resolves when processing is complete.
169
+ */
170
+ async #handleAdvert(msg) {
171
+ if (this.#stopped)
172
+ return;
173
+ try {
174
+ this.session.receive(msg);
175
+ const advert = this.session.discoveredCohorts.get(msg.body?.cohortId ?? '');
176
+ if (!advert)
177
+ return;
178
+ this.emit('cohort-discovered', advert);
179
+ // Register the service's communication key for encrypted message routing
180
+ if (advert.serviceCommunicationPk) {
181
+ this.#transport.registerPeer(advert.serviceDid, advert.serviceCommunicationPk);
182
+ }
183
+ const join = await this.#shouldJoin(advert);
184
+ if (!join)
185
+ return;
186
+ await this.#sendAll(this.session.joinCohort(advert.cohortId));
187
+ this.emit('cohort-joined', { cohortId: advert.cohortId });
188
+ }
189
+ catch (err) {
190
+ this.emit('error', err);
191
+ }
192
+ }
193
+ /**
194
+ * Internal: handler for opt-in accept messages. Updates the session state accordingly.
195
+ * @param {BaseMessage} msg - The received opt-in accept message.
196
+ */
197
+ #handleOptInAccept(msg) {
198
+ if (this.#stopped)
199
+ return;
200
+ try {
201
+ this.session.receive(msg);
202
+ }
203
+ catch (err) {
204
+ this.emit('error', err);
205
+ }
206
+ }
207
+ /**
208
+ * Internal: handler for cohort ready messages. Updates the session state, emits a 'cohort-ready'
209
+ * event, and triggers the update submission flow via the `onProvideUpdate` callback.
210
+ * @param {BaseMessage} msg - The received cohort ready message.
211
+ * @returns {Promise<void>} Resolves when processing is complete.
212
+ */
213
+ async #handleCohortReady(msg) {
214
+ if (this.#stopped)
215
+ return;
216
+ try {
217
+ this.session.receive(msg);
218
+ const cohortId = msg.body?.cohortId;
219
+ if (!cohortId)
220
+ return;
221
+ const info = this.session.joinedCohorts.get(cohortId);
222
+ if (!info)
223
+ return;
224
+ this.emit('cohort-ready', { cohortId, beaconAddress: info.beaconAddress });
225
+ // Construct the signed update via caller callback and submit. A null return
226
+ // means the member has no update this round: it declines (cooperative
227
+ // non-inclusion) but stays in the cohort and still signs.
228
+ const signedUpdate = await this.#onProvideUpdate({
229
+ cohortId,
230
+ beaconAddress: info.beaconAddress,
231
+ });
232
+ if (signedUpdate === null) {
233
+ await this.#sendAll(this.session.declineUpdate(cohortId));
234
+ this.emit('update-declined', { cohortId });
235
+ }
236
+ else {
237
+ await this.#sendAll(this.session.submitUpdate(cohortId, signedUpdate));
238
+ this.emit('update-submitted', { cohortId });
239
+ }
240
+ }
241
+ catch (err) {
242
+ this.emit('error', err);
243
+ }
244
+ }
245
+ /**
246
+ * Internal: handler for distribute aggregated data messages. Updates the session state, emits a
247
+ * 'validation-requested' event, and triggers the validation decision flow via the `onValidateData`
248
+ * callback. Depending on the decision, sends an approval or rejection message.
249
+ * @param {BaseMessage} msg - The received distribute aggregated data message.
250
+ * @returns {Promise<void>} Resolves when processing is complete.
251
+ * @throws {Error} If an error occurs during message processing or callback execution.
252
+ */
253
+ async #handleDistributeData(msg) {
254
+ if (this.#stopped)
255
+ return;
256
+ try {
257
+ this.session.receive(msg);
258
+ const cohortId = msg.body?.cohortId;
259
+ if (!cohortId)
260
+ return;
261
+ const validation = this.session.pendingValidations.get(cohortId);
262
+ if (!validation)
263
+ return;
264
+ this.emit('validation-requested', validation);
265
+ const decision = await this.#onValidateData(validation);
266
+ if (decision.approved) {
267
+ await this.#sendAll(this.session.approveValidation(cohortId));
268
+ }
269
+ else {
270
+ await this.#sendAll(this.session.rejectValidation(cohortId));
271
+ this.emit('cohort-failed', { cohortId, reason: 'Validation rejected by participant' });
272
+ }
273
+ }
274
+ catch (err) {
275
+ this.emit('error', err);
276
+ }
277
+ }
278
+ /**
279
+ * Internal: handler for authorization request messages. Updates the session state, emits a
280
+ * 'signing-requested' event, and triggers the signing approval flow via the `onApproveSigning`
281
+ * callback. Depending on the decision, sends a nonce approval message or emits a 'cohort-failed'
282
+ * event.
283
+ * @param {BaseMessage} msg - The received authorization request message.
284
+ * @returns {Promise<void>} Resolves when processing is complete.
285
+ * @throws {Error} If an error occurs during message processing or callback execution.
286
+ */
287
+ async #handleAuthorizationRequest(msg) {
288
+ if (this.#stopped)
289
+ return;
290
+ try {
291
+ this.session.receive(msg);
292
+ const cohortId = msg.body?.cohortId;
293
+ if (!cohortId)
294
+ return;
295
+ const req = this.session.pendingSigningRequests.get(cohortId);
296
+ if (!req)
297
+ return;
298
+ this.emit('signing-requested', req);
299
+ const decision = await this.#onApproveSigning(req);
300
+ if (!decision.approved) {
301
+ this.emit('cohort-failed', { cohortId, reason: 'Signing rejected by participant' });
302
+ return;
303
+ }
304
+ await this.#sendAll(this.session.approveNonce(cohortId));
305
+ }
306
+ catch (err) {
307
+ this.emit('error', err);
308
+ }
309
+ }
310
+ /**
311
+ * Internal: handler for aggregated nonce messages. Updates the session state, triggers partial
312
+ * signature generation, and sends the partial signature to the aggregator. If the cohort reaches
313
+ * completion after processing the nonce, emits a 'cohort-complete' event.
314
+ * @param {BaseMessage} msg - The received aggregated nonce message.
315
+ * @returns {Promise<void>} Resolves when processing is complete.
316
+ * @throws {Error} If an error occurs during message processing or partial signature generation.
317
+ */
318
+ async #handleAggregatedNonce(msg) {
319
+ if (this.#stopped)
320
+ return;
321
+ try {
322
+ this.session.receive(msg);
323
+ const cohortId = msg.body?.cohortId;
324
+ if (!cohortId)
325
+ return;
326
+ await this.#sendAll(this.session.generatePartialSignature(cohortId));
327
+ // Check if we've reached completion
328
+ this.#emitCohortCompleteIfDone(cohortId);
329
+ }
330
+ catch (err) {
331
+ this.emit('error', err);
332
+ }
333
+ }
334
+ /**
335
+ * Internal: handler for fallback authorization requests. The service abandoned
336
+ * the optimistic key path; the member authorizes the k-of-n script-path spend
337
+ * of the same beacon transaction (ADR 042). Reuses `onApproveSigning` to gate
338
+ * the decision, signs the fallback, and completes once it has contributed (the
339
+ * service needs only k members).
340
+ * @param {BaseMessage} msg - The received fallback authorization request message.
341
+ * @returns {Promise<void>} Resolves when processing is complete.
342
+ */
343
+ async #handleFallbackAuthorizationRequest(msg) {
344
+ if (this.#stopped)
345
+ return;
346
+ try {
347
+ this.session.receive(msg);
348
+ const cohortId = msg.body?.cohortId;
349
+ if (!cohortId)
350
+ return;
351
+ const req = this.session.pendingFallbackRequests.get(cohortId);
352
+ if (!req)
353
+ return;
354
+ this.emit('fallback-requested', req);
355
+ const decision = await this.#onApproveSigning(req);
356
+ if (!decision.approved) {
357
+ this.emit('cohort-failed', { cohortId, reason: 'Fallback signing rejected by participant' });
358
+ return;
359
+ }
360
+ await this.#sendAll(this.session.approveFallback(cohortId));
361
+ // The member has contributed its fallback signature and is done from its
362
+ // own perspective, regardless of whether the service has yet collected k.
363
+ this.#emitCohortCompleteIfDone(cohortId);
364
+ }
365
+ catch (err) {
366
+ this.emit('error', err);
367
+ }
368
+ }
369
+ /**
370
+ * Internal: emit `cohort-complete` with the participant's retained sidecar once
371
+ * the cohort has reached the Complete phase. Surfaces the CAS Announcement map
372
+ * (CAS beacons) or the SMT proof (SMT beacons) the participant keeps for future
373
+ * DID resolution. Read via getValidation (not pendingValidations, which lists
374
+ * only the AwaitingValidation phase) so the sidecar is still available at
375
+ * Complete. Shared by the optimistic and fallback completion paths.
376
+ */
377
+ #emitCohortCompleteIfDone(cohortId) {
378
+ if (this.session.getCohortPhase(cohortId) !== ParticipantCohortPhase.Complete)
379
+ return;
380
+ const info = this.session.joinedCohorts.get(cohortId);
381
+ if (!info)
382
+ return;
383
+ const validation = this.session.getValidation(cohortId);
384
+ this.emit('cohort-complete', {
385
+ cohortId,
386
+ beaconAddress: info.beaconAddress,
387
+ beaconType: validation?.beaconType ?? '',
388
+ included: validation?.included ?? true,
389
+ casAnnouncement: validation?.casAnnouncement,
390
+ smtProof: validation?.smtProof,
391
+ });
392
+ }
393
+ /**
394
+ * Internal: send helper to ensure messages are sent sequentially. This is important for protocol
395
+ * correctness, as some transports may not guarantee message order if sent in parallel.
396
+ * @param {BaseMessage[]} msgs - The messages to send.
397
+ * @returns {Promise<void>} Resolves when all messages have been sent.
398
+ * @throws {Error} If an error occurs during message sending.
399
+ */
400
+ async #sendAll(msgs) {
401
+ for (const m of msgs) {
402
+ await this.#transport.sendMessage(m, this.#did, m.to);
403
+ }
404
+ }
405
+ }
406
+ _a = AggregationParticipantRunner;
407
+ //# sourceMappingURL=participant-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"participant-runner.js","sourceRoot":"","sources":["../../../src/runner/participant-runner.ts"],"names":[],"mappings":"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"}