Skip to content

Commit 1c66573

Browse files
authored
handles reconnect/rejoin status in session managers (#5564)
adds 'onDisconnected' event emitter to multisig broker client uses 'onDisconnected' events in sessionManager to wait from confirmation that client has reconnected to server and rejoined session by using 'waitForConnectedMessage' and 'waitForJoinedSession' we display ux status output to the user _and_ throw an error if the session can't be rejoined updates session managers to conditionally start ux actions in polling loops. this makes it so that the session manager won't clear the ux status output from waiting to reconnect or rejoin a session while polling for session status
1 parent ab45237 commit 1c66573

File tree

4 files changed

+32
-8
lines changed

4 files changed

+32
-8
lines changed

ironfish-cli/src/multisigBroker/clients/client.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export abstract class MultisigClient {
5959
private tryConnectUntil: number | null = null
6060

6161
readonly onConnected = new Event<[]>()
62+
readonly onDisconnected = new Event<[]>()
6263
readonly onDkgStatus = new Event<[DkgStatusMessage]>()
6364
readonly onSigningStatus = new Event<[SigningStatusMessage]>()
6465
readonly onConnectedMessage = new Event<[ConnectedMessage]>()
@@ -288,6 +289,8 @@ export abstract class MultisigClient {
288289
this.logger.warn('Disconnected from server unexpectedly. Reconnecting.')
289290
this.connectTimeout = setTimeout(() => void this.startConnecting(), 5000)
290291
}
292+
293+
this.onDisconnected.emit()
291294
}
292295

293296
protected onError = (error: unknown): void => {

ironfish-cli/src/multisigBroker/sessionManagers/dkgSessionManager.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,11 @@ export class MultisigClientDkgSessionManager
143143
identities = message.identities
144144
})
145145

146-
ux.action.start('Waiting for Identities from server')
147146
while (identities.length < totalParticipants) {
148147
this.client.getDkgStatus()
148+
if (!ux.action.running) {
149+
ux.action.start('Waiting for Identities from server')
150+
}
149151
ux.action.status = `${identities.length}/${totalParticipants}`
150152
await PromiseUtils.sleep(3000)
151153
}
@@ -169,9 +171,11 @@ export class MultisigClientDkgSessionManager
169171
round1PublicPackages = message.round1PublicPackages
170172
})
171173

172-
ux.action.start('Waiting for Round 1 Public Packages from server')
173174
while (round1PublicPackages.length < totalParticipants) {
174175
this.client.getDkgStatus()
176+
if (!ux.action.running) {
177+
ux.action.start('Waiting for Round 1 Public Packages from server')
178+
}
175179
ux.action.status = `${round1PublicPackages.length}/${totalParticipants}`
176180
await PromiseUtils.sleep(3000)
177181
}
@@ -195,9 +199,11 @@ export class MultisigClientDkgSessionManager
195199
round2PublicPackages = message.round2PublicPackages
196200
})
197201

198-
ux.action.start('Waiting for Round 2 Public Packages from server')
199202
while (round2PublicPackages.length < totalParticipants) {
200203
this.client.getDkgStatus()
204+
if (!ux.action.running) {
205+
ux.action.start('Waiting for Round 2 Public Packages from server')
206+
}
201207
ux.action.status = `${round2PublicPackages.length}/${totalParticipants}`
202208
await PromiseUtils.sleep(3000)
203209
}

ironfish-cli/src/multisigBroker/sessionManagers/sessionManager.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,22 @@ export abstract class MultisigClientSessionManager extends MultisigSessionManage
5858
return
5959
}
6060

61+
this.client.start()
62+
63+
await this.waitForConnectedMessage()
64+
65+
this.client.onDisconnected.on(async () => {
66+
await this.waitForConnectedMessage()
67+
await this.waitForJoinedSession()
68+
})
69+
}
70+
71+
protected async waitForConnectedMessage(): Promise<void> {
6172
let confirmed = false
6273

6374
ux.action.start(
6475
`Connecting to multisig broker server: ${this.client.hostname}:${this.client.port}`,
6576
)
66-
this.client.start()
67-
6877
this.client.onConnectedMessage.on(() => {
6978
confirmed = true
7079
})

ironfish-cli/src/multisigBroker/sessionManagers/signingSessionManager.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,11 @@ export class MultisigClientSigningSessionManager
144144
identities = message.identities
145145
})
146146

147-
ux.action.start('Waiting for Identities from server')
148147
while (identities.length < numSigners) {
149148
this.client.getSigningStatus()
149+
if (!ux.action.running) {
150+
ux.action.start('Waiting for Identities from server')
151+
}
150152
ux.action.status = `${identities.length}/${numSigners}`
151153
await PromiseUtils.sleep(3000)
152154
}
@@ -171,9 +173,11 @@ export class MultisigClientSigningSessionManager
171173
signingCommitments = message.signingCommitments
172174
})
173175

174-
ux.action.start('Waiting for Signing Commitments from server')
175176
while (signingCommitments.length < numSigners) {
176177
this.client.getSigningStatus()
178+
if (!ux.action.running) {
179+
ux.action.start('Waiting for Signing Commitments from server')
180+
}
177181
ux.action.status = `${signingCommitments.length}/${numSigners}`
178182
await PromiseUtils.sleep(3000)
179183
}
@@ -198,9 +202,11 @@ export class MultisigClientSigningSessionManager
198202
signatureShares = message.signatureShares
199203
})
200204

201-
ux.action.start('Waiting for Signature Shares from server')
202205
while (signatureShares.length < numSigners) {
203206
this.client.getSigningStatus()
207+
if (!ux.action.running) {
208+
ux.action.start('Waiting for Signature Shares from server')
209+
}
204210
ux.action.status = `${signatureShares.length}/${numSigners}`
205211
await PromiseUtils.sleep(3000)
206212
}

0 commit comments

Comments
 (0)