From 42efc05bd0e96f68edd8263dbf77707427c99173 Mon Sep 17 00:00:00 2001 From: Timo K Date: Thu, 5 Feb 2026 06:04:38 +0100 Subject: [PATCH] Add more granular leave/join api --- sdk/main.ts | 12 +++++++++--- src/state/CallViewModel/CallViewModel.ts | 13 +++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/sdk/main.ts b/sdk/main.ts index 521af6e4..ee3101fb 100644 --- a/sdk/main.ts +++ b/sdk/main.ts @@ -68,6 +68,12 @@ interface MatrixRTCSdk { join: () => void; /** @throws on leave errors */ leave: () => void; + /** + * Ends the rtc sdk. This will unsubscribe any event listeners. And end the associated scope. + * No updates can be received from the rtc sdk. The sdk cannot be restarted after. + * A new sdk needs to be created via createMatrixRTCSdk. + */ + stop: () => void; data$: Observable<{ rtcBackendIdentity: string; data: string }>; /** * flattened list of members @@ -290,9 +296,6 @@ export async function createMatrixRTCSdk( // schedule close first and then leave (scope.end) void scheduleWidgetCloseOnLeave(); - - // actual hangup (ending scope will send the leave event.. its kinda odd. since you might end up closing the widget too fast) - scope.end(); }); logger.info("createMatrixRTCSdk done"); @@ -305,8 +308,11 @@ export async function createMatrixRTCSdk( }, leave: (): void => { callViewModel.hangup(); + }, + stop: (): void => { leaveSubs.unsubscribe(); livekitRoomItemsSub.unsubscribe(); + scope.end(); }, data$, localMember$: scope.behavior( diff --git a/src/state/CallViewModel/CallViewModel.ts b/src/state/CallViewModel/CallViewModel.ts index cf6ca92b..45ef1083 100644 --- a/src/state/CallViewModel/CallViewModel.ts +++ b/src/state/CallViewModel/CallViewModel.ts @@ -217,15 +217,23 @@ export interface CallViewModel { "unknown" | "ringing" | "timeout" | "decline" | "success" | null >; /** Observable that emits when the user should leave the call (hangup pressed, widget action, error). - * THIS DOES NOT LEAVE THE CALL YET. The only way to leave the call (send the hangup event) is by ending the scope. + * THIS DOES NOT LEAVE THE CALL YET. The only way to leave the call (send the hangup event) is + * - by ending the scope + * - or calling requestDisconnect + * + * TODO: it seems more reasonable to add a leave() method (that calls requestDisconnect) that will then update leave$ and remove the hangup pattern */ leave$: Observable<"user" | AutoLeaveReason>; - /** Call to initiate hangup. Use in conbination with reconnectino state track the async hangup process. */ + /** Call to initiate hangup. Use in conbination with reconnection state track the async hangup process. */ hangup: () => void; // joining join: () => void; + /** + * calls requestDisconnect. The async leave state can than be observed via connected$ + */ + leave: () => void; // screen sharing /** * Callback to toggle screen sharing. If null, screen sharing is not possible. @@ -1496,6 +1504,7 @@ export function createCallViewModel$( leave$: leave$, hangup: (): void => userHangup$.next(), join: localMembership.requestJoinAndPublish, + leave: localMembership.requestDisconnect, toggleScreenSharing: toggleScreenSharing, sharingScreen$: sharingScreen$,