From d59ecbb4710ef103f838b3838fc2ccc909b8beb2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 13 Jan 2025 10:42:54 +1100 Subject: [PATCH] fix: groupInvite tracks abort signal to cancel request --- ts/session/sending/MessageQueue.ts | 1 + ts/session/sending/MessageSender.ts | 4 ++- ts/session/utils/calling/CallManager.ts | 1 + .../utils/job_runners/jobs/GroupInviteJob.ts | 1 + .../session/unit/sending/MessageQueue_test.ts | 29 ++++++++++--------- .../unit/sending/MessageSender_test.ts | 7 +++++ 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/ts/session/sending/MessageQueue.ts b/ts/session/sending/MessageQueue.ts index a43ecd437..c5f562de4 100644 --- a/ts/session/sending/MessageQueue.ts +++ b/ts/session/sending/MessageQueue.ts @@ -348,6 +348,7 @@ export class MessageQueueCl { const { effectiveTimestamp } = await MessageSender.sendSingleMessage({ message: rawMessage, isSyncMessage, + abortSignal: null, }); window.log.debug('sendSingleMessage took ', Date.now() - start); diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 36008aa53..4e65a6bc4 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -236,8 +236,10 @@ async function sendSingleMessage({ retryMinTimeout = 100, attempts = 3, isSyncMessage, + abortSignal, }: { message: OutgoingRawMessage; + abortSignal: MergedAbortSignal | null; attempts?: number; retryMinTimeout?: number; // in ms isSyncMessage: boolean; @@ -301,7 +303,7 @@ async function sendSingleMessage({ associatedWith: destination, allow401s: false, method: 'sequence', - abortSignal: null, + abortSignal, }); await handleBatchResultWithSubRequests({ batchResult, subRequests, destination }); diff --git a/ts/session/utils/calling/CallManager.ts b/ts/session/utils/calling/CallManager.ts index 16de5215a..6e7405d47 100644 --- a/ts/session/utils/calling/CallManager.ts +++ b/ts/session/utils/calling/CallManager.ts @@ -555,6 +555,7 @@ export async function USER_callRecipient(recipient: string) { const { wrappedEnvelope } = await MessageSender.sendSingleMessage({ message: rawPreOffer, isSyncMessage: false, + abortSignal: null, }); void PnServer.notifyPnServer(wrappedEnvelope, recipient); diff --git a/ts/session/utils/job_runners/jobs/GroupInviteJob.ts b/ts/session/utils/job_runners/jobs/GroupInviteJob.ts index c2c68499f..3cd5c223d 100644 --- a/ts/session/utils/job_runners/jobs/GroupInviteJob.ts +++ b/ts/session/utils/job_runners/jobs/GroupInviteJob.ts @@ -245,6 +245,7 @@ class GroupInviteJob extends PersistedJob { MessageSender.sendSingleMessage({ message: rawMessage, isSyncMessage: false, + abortSignal: controller.signal, }), 10 * DURATION.SECONDS, controller diff --git a/ts/test/session/unit/sending/MessageQueue_test.ts b/ts/test/session/unit/sending/MessageQueue_test.ts index 71daf78b5..28341fbd7 100644 --- a/ts/test/session/unit/sending/MessageQueue_test.ts +++ b/ts/test/session/unit/sending/MessageQueue_test.ts @@ -203,20 +203,23 @@ describe('MessageQueue', () => { .then(() => messageQueueStub.processPending(device)); // The cb is only invoke is all reties fails. Here we poll until the messageSentHandlerFailed was invoked as this is what we want to do - return PromiseUtils.poll(done => { - if (messageSentHandlerFailedStub.callCount === 1) { - try { - expect(messageSentHandlerFailedStub.callCount).to.be.equal(1); - expect(messageSentHandlerFailedStub.lastCall.args[0].identifier).to.be.equal( - message.identifier - ); - expect(messageSentHandlerFailedStub.lastCall.args[1].message).to.equal('failure'); - done(); - } catch (e) { - done(e); + return PromiseUtils.poll( + done => { + if (messageSentHandlerFailedStub.callCount === 1) { + try { + expect(messageSentHandlerFailedStub.callCount).to.be.equal(1); + expect(messageSentHandlerFailedStub.lastCall.args[0].identifier).to.be.equal( + message.identifier + ); + expect(messageSentHandlerFailedStub.lastCall.args[1].message).to.equal('failure'); + done(); + } catch (e) { + done(e); + } } - } - }, {interval:5}); + }, + { interval: 5 } + ); }); }); }); diff --git a/ts/test/session/unit/sending/MessageSender_test.ts b/ts/test/session/unit/sending/MessageSender_test.ts index 9b7389bd9..37f0371bc 100644 --- a/ts/test/session/unit/sending/MessageSender_test.ts +++ b/ts/test/session/unit/sending/MessageSender_test.ts @@ -88,6 +88,7 @@ describe('MessageSender', () => { attempts: 3, retryMinTimeout: 10, isSyncMessage: false, + abortSignal: null, }); await expectAsyncToThrow(promise, 'Failed to encrypt'); expect(sessionMessageAPISendStub.callCount).to.equal(0); @@ -100,6 +101,7 @@ describe('MessageSender', () => { attempts: 3, retryMinTimeout: 10, isSyncMessage: false, + abortSignal: null, }); expect(doSnodeBatchRequestStub.callCount).to.equal(1); }); @@ -114,6 +116,7 @@ describe('MessageSender', () => { attempts, retryMinTimeout: 10, isSyncMessage: false, + abortSignal: null, }); await expect(promise).is.rejectedWith('API error'); expect(doSnodeBatchRequestStub.callCount).to.equal(attempts); @@ -127,6 +130,7 @@ describe('MessageSender', () => { attempts: 3, retryMinTimeout: 10, isSyncMessage: false, + abortSignal: null, }); expect(doSnodeBatchRequestStub.callCount).to.equal(2); }); @@ -160,6 +164,7 @@ describe('MessageSender', () => { attempts: 3, retryMinTimeout: 10, isSyncMessage: false, + abortSignal: null, }); const args = doSnodeBatchRequestStub.getCall(0).args; @@ -203,6 +208,7 @@ describe('MessageSender', () => { attempts: 3, retryMinTimeout: 10, isSyncMessage: false, + abortSignal: null, }); const firstArg = doSnodeBatchRequestStub.getCall(0).args[0]; @@ -255,6 +261,7 @@ describe('MessageSender', () => { attempts: 3, retryMinTimeout: 10, isSyncMessage: false, + abortSignal: null, }); const firstArg = doSnodeBatchRequestStub.getCall(0).args[0];