rust-sdks icon indicating copy to clipboard operation
rust-sdks copied to clipboard

livekit: wait for disconnect before callback

Open nbsp opened this issue 7 months ago • 3 comments

should fix a race condition where in node-sdks await room.disconnect() doesn't wait for the room status update to change.

draft because it doesn't work reliably yet: patched node-sdks still fails approximately one in fifty times.

node-sdks diff
diff --git a/packages/livekit-rtc/src/room.ts b/packages/livekit-rtc/src/room.ts
index 143774f..f9bebeb 100644
--- a/packages/livekit-rtc/src/room.ts
+++ b/packages/livekit-rtc/src/room.ts
@@ -16,6 +16,7 @@ import type {
   ConnectResponse,
   ConnectionQuality,
   DataPacketKind,
+  DisconnectCallback,
   DisconnectResponse,
   IceServer,
   RoomInfo,
@@ -148,7 +149,7 @@ export class Room extends (EventEmitter as new () => TypedEmitter<RoomCallbacks>
       return;
     }

-    FfiClient.instance.request<DisconnectResponse>({
+    const res = FfiClient.instance.request<DisconnectResponse>({
       message: {
         case: 'disconnect',
         value: {
@@ -157,6 +158,10 @@ export class Room extends (EventEmitter as new () => TypedEmitter<RoomCallbacks>
       },
     });

+    await FfiClient.instance.waitFor<DisconnectCallback>((ev: FfiEvent) => {
+      return ev.message.case == 'disconnect' && ev.message.value.asyncId == res.asyncId;
+    });
+
     FfiClient.instance.removeAllListeners();
     this.removeAllListeners();
   }

nbsp avatar Jul 13 '24 20:07 nbsp