fix: disconnect LiveKit before clearing state event

Element X stays connected because it sees the state event clear while
we're still in the LiveKit room. Reversed the order: disconnect from
LiveKit first (remote party sees us leave), then clear the state event.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-03 06:49:30 +10:00
parent d60edcf45f
commit e1d9ec788c

View File

@@ -127,6 +127,8 @@ class LiveKitService {
} }
/// Disconnect and dispose the active room, clearing the MatrixRTC state event. /// Disconnect and dispose the active room, clearing the MatrixRTC state event.
/// Order: disconnect LiveKit first (so Element X sees us leave the SFU),
/// then clear the state event (so Element X knows the call session ended).
Future<void> disconnect() async { Future<void> disconnect() async {
final room = _activeRoom; final room = _activeRoom;
final matrixRoomId = _activeMatrixRoomId; final matrixRoomId = _activeMatrixRoomId;
@@ -134,7 +136,14 @@ class LiveKitService {
_activeMatrixRoomId = null; _activeMatrixRoomId = null;
_membershipId = null; _membershipId = null;
// Clear the call member state event so Element X sees the call ended // Step 1: Leave LiveKit — Element X will see us disappear from the SFU
if (room != null) {
await room.disconnect();
await room.dispose();
debugPrint('[LiveKit] LiveKit room disconnected');
}
// Step 2: Clear the call.member state event — Element X sees call ended
if (matrixRoomId != null) { if (matrixRoomId != null) {
try { try {
final client = _ref.read(matrixClientProvider); final client = _ref.read(matrixClientProvider);
@@ -147,11 +156,6 @@ class LiveKitService {
debugPrint('[LiveKit] Failed to clear call member event: $e'); debugPrint('[LiveKit] Failed to clear call member event: $e');
} }
} }
if (room != null) {
await room.disconnect();
await room.dispose();
}
} }
/// Fetches a LiveKit JWT via the MSC4143 flow: /// Fetches a LiveKit JWT via the MSC4143 flow: