Skip to content

Commit 302c4f1

Browse files
committed
[IDLE-468] 웹소켓 연결 실패시 2의 배수만큼 기다렸다가 연결을 재시도 하도록 변경 및 최대 대기시간은 10초
1 parent a3c20c0 commit 302c4f1

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

core/data/src/main/java/com/idle/data/repository/chatting/ChattingRepositoryImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class ChattingRepositoryImpl @Inject constructor(
1717
webSocketDataSource.disconnectWebSocket()
1818

1919
override fun subscribeChatMessage(): Flow<ChatMessage> =
20-
webSocketDataSource.getChatMessageFlow()
20+
webSocketDataSource.chatMessageFlow
2121
.filterNotNull()
2222
.map { it.toVO() }
23-
}
23+
}

core/network/src/main/java/com/idle/network/source/websocket/WebSocketDataSource.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,29 @@ package com.idle.network.source.websocket
33
import com.idle.network.BuildConfig
44
import com.idle.network.di.WebSocketOkHttpClient
55
import com.idle.network.model.chatting.ChatMessageResponse
6+
import kotlinx.coroutines.Dispatchers
7+
import kotlinx.coroutines.delay
68
import kotlinx.coroutines.flow.StateFlow
9+
import kotlinx.coroutines.withContext
710
import okhttp3.OkHttpClient
811
import okhttp3.Request
912
import okhttp3.WebSocket
1013
import javax.inject.Inject
1114
import javax.inject.Singleton
15+
import kotlin.math.pow
1216

1317
@Singleton
1418
class WebSocketDataSource @Inject constructor(
1519
@WebSocketOkHttpClient private val client: OkHttpClient,
1620
private val chatMessageListener: ChatMessageListener,
1721
) {
22+
val chatMessageFlow: StateFlow<ChatMessageResponse?> = chatMessageListener.chatMessageFlow
23+
1824
private lateinit var chatMessageWebSocket: WebSocket
1925
private var connectionAttempts = 0
2026

21-
fun connectWebSocket(): Result<Unit> {
22-
return try {
27+
suspend fun connectWebSocket(): Result<Unit> = withContext(Dispatchers.IO) {
28+
try {
2329
val chatMessageRequest: Request = Request.Builder()
2430
.url(BuildConfig.CARE_WEBSOCKET_URL)
2531
.build()
@@ -29,6 +35,8 @@ class WebSocketDataSource @Inject constructor(
2935
Result.success(Unit)
3036
} catch (e: Exception) {
3137
if (connectionAttempts < MAX_RETRY_ATTEMPTS) {
38+
val waitTime = minOf(calculateBackoffTime(connectionAttempts), MAX_WAIT_TIME)
39+
delay(waitTime)
3240
connectionAttempts++
3341
connectWebSocket()
3442
} else {
@@ -48,9 +56,11 @@ class WebSocketDataSource @Inject constructor(
4856
}
4957
}
5058

51-
fun getChatMessageFlow(): StateFlow<ChatMessageResponse?> = chatMessageListener.chatMessageFlow
59+
private fun calculateBackoffTime(attempt: Int): Long =
60+
(2.0.pow(attempt) * 1000).toLong()
5261

5362
companion object {
5463
private const val MAX_RETRY_ATTEMPTS = 5
64+
private const val MAX_WAIT_TIME = 10_000L // 10 seconds
5565
}
5666
}

0 commit comments

Comments
 (0)