diff --git a/.changeset/pretty-donkeys-report.md b/.changeset/pretty-donkeys-report.md new file mode 100644 index 00000000..5690d34e --- /dev/null +++ b/.changeset/pretty-donkeys-report.md @@ -0,0 +1,5 @@ +--- +'@livekit/rtc-node': patch +--- + +Bugfix: Queue FFI events from rust and always process them in order diff --git a/packages/livekit-rtc/src/room.ts b/packages/livekit-rtc/src/room.ts index 7d0e4c39..d5484c83 100644 --- a/packages/livekit-rtc/src/room.ts +++ b/packages/livekit-rtc/src/room.ts @@ -82,6 +82,8 @@ export class Room extends (EventEmitter as new () => TypedEmitter private byteStreamHandlers = new Map(); private textStreamHandlers = new Map(); + private preConnectEvents: FfiEvent[] = []; + e2eeManager?: E2EEManager; connectionState: ConnectionState = ConnectionState.CONN_DISCONNECTED; @@ -180,6 +182,8 @@ export class Room extends (EventEmitter as new () => TypedEmitter options, }); + FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onFfiEvent); + const res = FfiClient.instance.request({ message: { case: 'connect', @@ -210,8 +214,6 @@ export class Room extends (EventEmitter as new () => TypedEmitter rp.trackPublications.set(publication.sid!, publication); } } - - FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onFfiEvent); break; case 'error': default: @@ -279,7 +281,22 @@ export class Room extends (EventEmitter as new () => TypedEmitter private onFfiEvent = (ffiEvent: FfiEvent) => { if (!this.localParticipant || !this.ffiHandle || !this.info) { - throw TypeError('cannot handle ffi events before connectCallback'); + this.preConnectEvents.push(ffiEvent); + return; + } + + // process preConnectEvents if we received the connectCallback after the events were queued + for (const ev of this.preConnectEvents) { + this.processFfiEvent(ev); + } + this.preConnectEvents = []; + + this.processFfiEvent(ffiEvent); + }; + + private processFfiEvent = (ffiEvent: FfiEvent) => { + if (!this.localParticipant || !this.ffiHandle || !this.info) { + throw new Error('processFfiEvent called before connect'); } if (ffiEvent.message.case == 'rpcMethodInvocation') {