From a099c402ffccaeb9879d36523591d93f9bb097b8 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Mon, 7 Oct 2024 19:47:00 -0500 Subject: [PATCH] Fix joining deleted call links leaving call active Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com> --- ts/state/ducks/calling.ts | 56 +++++++++++--------- ts/test-electron/state/ducks/calling_test.ts | 36 +++++++++++++ 2 files changed, 68 insertions(+), 24 deletions(-) diff --git a/ts/state/ducks/calling.ts b/ts/state/ducks/calling.ts index 7d1aace420da..9b560a407199 100644 --- a/ts/state/ducks/calling.ts +++ b/ts/state/ducks/calling.ts @@ -2252,6 +2252,7 @@ const _startCallLinkLobby = async ({ return; } + let success = false; try { dispatch({ type: WAITING_FOR_CALL_LINK_LOBBY, @@ -2342,22 +2343,25 @@ const _startCallLinkLobby = async ({ isConversationTooBigToRing: false, }, }); + success = true; } catch (error) { log.error(`${logId}: Failed to start lobby`, Errors.toLogFormat(error)); + } finally { + if (!success) { + try { + calling.stopCallingLobby(roomId); + } catch (innerError) { + log.error( + `${logId}: Failed to stop calling lobby`, + Errors.toLogFormat(innerError) + ); + } - try { - calling.stopCallingLobby(roomId); - } catch (innerError) { - log.error( - `${logId}: Failed to stop calling lobby`, - Errors.toLogFormat(innerError) - ); + dispatch({ + type: CALL_LOBBY_FAILED, + payload: { conversationId: roomId }, + }); } - - dispatch({ - type: CALL_LOBBY_FAILED, - payload: { conversationId: roomId }, - }); } }; @@ -2437,6 +2441,7 @@ function startCallingLobby({ return; } + let success = false; try { dispatch({ type: WAITING_FOR_CALLING_LOBBY, @@ -2473,22 +2478,25 @@ function startCallingLobby({ isConversationTooBigToRing: isConversationTooBigToRing(conversation), }, }); + success = true; } catch (error) { log.error(`${logId}: Failed to start lobby`, Errors.toLogFormat(error)); + } finally { + if (!success) { + try { + calling.stopCallingLobby(conversationId); + } catch (innerError) { + log.error( + `${logId}: Failed to stop calling lobby`, + Errors.toLogFormat(innerError) + ); + } - try { - calling.stopCallingLobby(conversationId); - } catch (innerError) { - log.error( - `${logId}: Failed to stop calling lobby`, - Errors.toLogFormat(innerError) - ); + dispatch({ + type: CALL_LOBBY_FAILED, + payload: { conversationId }, + }); } - - dispatch({ - type: CALL_LOBBY_FAILED, - payload: { conversationId }, - }); } }; } diff --git a/ts/test-electron/state/ducks/calling_test.ts b/ts/test-electron/state/ducks/calling_test.ts index f121ba6eab2a..1a1170695695 100644 --- a/ts/test-electron/state/ducks/calling_test.ts +++ b/ts/test-electron/state/ducks/calling_test.ts @@ -1579,6 +1579,42 @@ describe('calling duck', () => { }); }); + describe('startCallLinkLobby for deleted links', () => { + beforeEach(function (this: Mocha.Context) { + this.callingServiceReadCallLink = this.sandbox + .stub(callingService, 'readCallLink') + .resolves(null); + }); + + const doAction = async ( + payload: StartCallLinkLobbyType + ): Promise<{ dispatch: sinon.SinonSpy }> => { + const { startCallLinkLobby } = actions; + const dispatch = sinon.spy(); + await startCallLinkLobby(payload)(dispatch, getEmptyRootState, null); + return { dispatch }; + }; + + it('fails', async function (this: Mocha.Context) { + const { roomId, rootKey } = FAKE_CALL_LINK; + const { dispatch } = await doAction({ rootKey }); + + sinon.assert.calledTwice(dispatch); + sinon.assert.calledWith(dispatch, { + type: 'calling/WAITING_FOR_CALL_LINK_LOBBY', + payload: { + roomId, + }, + }); + sinon.assert.calledWith(dispatch, { + type: 'calling/CALL_LOBBY_FAILED', + payload: { + conversationId: roomId, + }, + }); + }); + }); + describe('peekNotConnectedGroupCall', () => { const { peekNotConnectedGroupCall } = actions;