From 8b94bb70c31e96adbbd357732c568ada02c698a4 Mon Sep 17 00:00:00 2001 From: gaoxiaoxiong <745570899@qq.com> Date: Wed, 24 Dec 2025 16:23:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?bugfix:=E5=8D=8F=E7=A8=8B=E6=8C=82=E8=B5=B7?= =?UTF-8?q?=E4=B8=8D=E4=BC=9A=E5=88=9B=E5=BB=BA=E6=96=B0=E7=9A=84webSocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/livekit/android/room/SignalClient.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt b/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt index 735fed9c..efc4cc54 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt @@ -40,6 +40,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.coroutines.withTimeout import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -62,6 +63,7 @@ import java.util.Date import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton +import kotlin.time.Duration.Companion.seconds /** * SignalClient to LiveKit WS servers @@ -184,10 +186,19 @@ constructor( .addHeader("Authorization", "Bearer $token") .build() - return suspendCancellableCoroutine { - // Wait for join response through WebSocketListener - joinContinuation = it - currentWs = websocketFactory.newWebSocket(request, this) + return withTimeout(5.seconds) { + suspendCancellableCoroutine { cont -> + // Wait for join response through WebSocketListener + joinContinuation = cont + //When a coroutine is canceled, WebSocket must be interrupted. + cont.invokeOnCancellation { + LKLog.w { "connect cancelled, abort websocket" } + currentWs?.cancel() + currentWs = null + joinContinuation = null + } + currentWs = websocketFactory.newWebSocket(request, this@SignalClient) + } } } @@ -863,7 +874,7 @@ constructor( pingJob = null pongJob?.cancel() pongJob = null - currentWs?.close(code, reason) + currentWs?.cancel() currentWs = null joinContinuation?.cancel() joinContinuation = null From 2af8be46494e04b2366bdcce0772482304fce184 Mon Sep 17 00:00:00 2001 From: gaoxiaoxiong <745570899@qq.com> Date: Fri, 9 Jan 2026 15:36:11 +0800 Subject: [PATCH 2/2] feat: optimize signal reconnect --- .../src/main/java/io/livekit/android/room/SignalClient.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt b/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt index efc4cc54..b0a1a7d8 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/room/SignalClient.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 LiveKit, Inc. + * Copyright 2023-2026 LiveKit, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -190,7 +190,7 @@ constructor( suspendCancellableCoroutine { cont -> // Wait for join response through WebSocketListener joinContinuation = cont - //When a coroutine is canceled, WebSocket must be interrupted. + // When a coroutine is canceled, WebSocket must be interrupted. cont.invokeOnCancellation { LKLog.w { "connect cancelled, abort websocket" } currentWs?.cancel()