From 302c4f1fcf00834473f00e3e5fffab980a5fb5a6 Mon Sep 17 00:00:00 2001 From: tgyuuAn Date: Mon, 10 Feb 2025 00:53:15 +0900 Subject: [PATCH] =?UTF-8?q?[IDLE-468]=20=EC=9B=B9=EC=86=8C=EC=BC=93=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=20=EC=8B=A4=ED=8C=A8=EC=8B=9C=202=EC=9D=98?= =?UTF-8?q?=20=EB=B0=B0=EC=88=98=EB=A7=8C=ED=81=BC=20=EA=B8=B0=EB=8B=A4?= =?UTF-8?q?=EB=A0=B8=EB=8B=A4=EA=B0=80=20=EC=97=B0=EA=B2=B0=EC=9D=84=20?= =?UTF-8?q?=EC=9E=AC=EC=8B=9C=EB=8F=84=20=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=B5=9C=EB=8C=80=20=EB=8C=80?= =?UTF-8?q?=EA=B8=B0=EC=8B=9C=EA=B0=84=EC=9D=80=2010=EC=B4=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chatting/ChattingRepositoryImpl.kt | 4 ++-- .../source/websocket/WebSocketDataSource.kt | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/data/src/main/java/com/idle/data/repository/chatting/ChattingRepositoryImpl.kt b/core/data/src/main/java/com/idle/data/repository/chatting/ChattingRepositoryImpl.kt index d2bada36..fcef22ba 100644 --- a/core/data/src/main/java/com/idle/data/repository/chatting/ChattingRepositoryImpl.kt +++ b/core/data/src/main/java/com/idle/data/repository/chatting/ChattingRepositoryImpl.kt @@ -17,7 +17,7 @@ class ChattingRepositoryImpl @Inject constructor( webSocketDataSource.disconnectWebSocket() override fun subscribeChatMessage(): Flow = - webSocketDataSource.getChatMessageFlow() + webSocketDataSource.chatMessageFlow .filterNotNull() .map { it.toVO() } -} \ No newline at end of file +} diff --git a/core/network/src/main/java/com/idle/network/source/websocket/WebSocketDataSource.kt b/core/network/src/main/java/com/idle/network/source/websocket/WebSocketDataSource.kt index 0039eb42..733c241b 100644 --- a/core/network/src/main/java/com/idle/network/source/websocket/WebSocketDataSource.kt +++ b/core/network/src/main/java/com/idle/network/source/websocket/WebSocketDataSource.kt @@ -3,23 +3,29 @@ package com.idle.network.source.websocket import com.idle.network.BuildConfig import com.idle.network.di.WebSocketOkHttpClient import com.idle.network.model.chatting.ChatMessageResponse +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.WebSocket import javax.inject.Inject import javax.inject.Singleton +import kotlin.math.pow @Singleton class WebSocketDataSource @Inject constructor( @WebSocketOkHttpClient private val client: OkHttpClient, private val chatMessageListener: ChatMessageListener, ) { + val chatMessageFlow: StateFlow = chatMessageListener.chatMessageFlow + private lateinit var chatMessageWebSocket: WebSocket private var connectionAttempts = 0 - fun connectWebSocket(): Result { - return try { + suspend fun connectWebSocket(): Result = withContext(Dispatchers.IO) { + try { val chatMessageRequest: Request = Request.Builder() .url(BuildConfig.CARE_WEBSOCKET_URL) .build() @@ -29,6 +35,8 @@ class WebSocketDataSource @Inject constructor( Result.success(Unit) } catch (e: Exception) { if (connectionAttempts < MAX_RETRY_ATTEMPTS) { + val waitTime = minOf(calculateBackoffTime(connectionAttempts), MAX_WAIT_TIME) + delay(waitTime) connectionAttempts++ connectWebSocket() } else { @@ -48,9 +56,11 @@ class WebSocketDataSource @Inject constructor( } } - fun getChatMessageFlow(): StateFlow = chatMessageListener.chatMessageFlow + private fun calculateBackoffTime(attempt: Int): Long = + (2.0.pow(attempt) * 1000).toLong() companion object { private const val MAX_RETRY_ATTEMPTS = 5 + private const val MAX_WAIT_TIME = 10_000L // 10 seconds } }