diff --git a/mail_livekit/static/src/discuss/livekit_service.js b/mail_livekit/static/src/discuss/livekit_service.js index 875d5eca..34754404 100644 --- a/mail_livekit/static/src/discuss/livekit_service.js +++ b/mail_livekit/static/src/discuss/livekit_service.js @@ -173,6 +173,9 @@ class LivekitService { publication, participant ); + } else if (!publication.isSubscribed) { + log(`Requesting missing audio subscription for ${identity}`); + publication.setSubscribed?.(true); } } diff --git a/mail_livekit/static/tests/livekit_adapter.test.js b/mail_livekit/static/tests/livekit_adapter.test.js index 9c255ae3..dd6fce27 100644 --- a/mail_livekit/static/tests/livekit_adapter.test.js +++ b/mail_livekit/static/tests/livekit_adapter.test.js @@ -39,6 +39,24 @@ function makeRemoteAudioTrack(identity) { return {audioElement, participant, publication, track}; } +function makeRemoteAudioPublication(identity, {isSubscribed = false} = {}) { + const publication = { + source: Source.MICROPHONE, + track: null, + isSubscribed, + setSubscribed: (subscribed) => { + publication.requestedSubscription = subscribed; + }, + }; + const participant = { + identity, + sid: `${identity}-sid`, + audioTrackPublications: new Map([["microphone", publication]]), + videoTrackPublications: new Map(), + }; + return {participant, publication}; +} + describe("mail_livekit livekit adapter", () => { after(() => { window.LivekitClient = originalLivekitClient; @@ -107,4 +125,25 @@ describe("mail_livekit livekit adapter", () => { track, }); }); + + test("rebindExistingTracks requests missing remote microphone subscriptions in a multi-person call", async () => { + const {participant: alreadySubscribed} = makeRemoteAudioTrack("partner:10"); + const {participant: missingPeerA, publication: missingPublicationA} = + makeRemoteAudioPublication("partner:11"); + const {participant: missingPeerB, publication: missingPublicationB} = + makeRemoteAudioPublication("partner:12"); + + livekitService.room = { + remoteParticipants: new Map([ + [alreadySubscribed.identity, alreadySubscribed], + [missingPeerA.identity, missingPeerA], + [missingPeerB.identity, missingPeerB], + ]), + }; + + await livekitService.rebindExistingTracks(); + + expect(missingPublicationA.requestedSubscription).toBe(true); + expect(missingPublicationB.requestedSubscription).toBe(true); + }); });