@@ -3,23 +3,29 @@ package com.idle.network.source.websocket
3
3
import com.idle.network.BuildConfig
4
4
import com.idle.network.di.WebSocketOkHttpClient
5
5
import com.idle.network.model.chatting.ChatMessageResponse
6
+ import kotlinx.coroutines.Dispatchers
7
+ import kotlinx.coroutines.delay
6
8
import kotlinx.coroutines.flow.StateFlow
9
+ import kotlinx.coroutines.withContext
7
10
import okhttp3.OkHttpClient
8
11
import okhttp3.Request
9
12
import okhttp3.WebSocket
10
13
import javax.inject.Inject
11
14
import javax.inject.Singleton
15
+ import kotlin.math.pow
12
16
13
17
@Singleton
14
18
class WebSocketDataSource @Inject constructor(
15
19
@WebSocketOkHttpClient private val client : OkHttpClient ,
16
20
private val chatMessageListener : ChatMessageListener ,
17
21
) {
22
+ val chatMessageFlow: StateFlow <ChatMessageResponse ?> = chatMessageListener.chatMessageFlow
23
+
18
24
private lateinit var chatMessageWebSocket: WebSocket
19
25
private var connectionAttempts = 0
20
26
21
- fun connectWebSocket (): Result <Unit > {
22
- return try {
27
+ suspend fun connectWebSocket (): Result <Unit > = withContext( Dispatchers . IO ) {
28
+ try {
23
29
val chatMessageRequest: Request = Request .Builder ()
24
30
.url(BuildConfig .CARE_WEBSOCKET_URL )
25
31
.build()
@@ -29,6 +35,8 @@ class WebSocketDataSource @Inject constructor(
29
35
Result .success(Unit )
30
36
} catch (e: Exception ) {
31
37
if (connectionAttempts < MAX_RETRY_ATTEMPTS ) {
38
+ val waitTime = minOf(calculateBackoffTime(connectionAttempts), MAX_WAIT_TIME )
39
+ delay(waitTime)
32
40
connectionAttempts++
33
41
connectWebSocket()
34
42
} else {
@@ -48,9 +56,11 @@ class WebSocketDataSource @Inject constructor(
48
56
}
49
57
}
50
58
51
- fun getChatMessageFlow (): StateFlow <ChatMessageResponse ?> = chatMessageListener.chatMessageFlow
59
+ private fun calculateBackoffTime (attempt : Int ): Long =
60
+ (2.0 .pow(attempt) * 1000 ).toLong()
52
61
53
62
companion object {
54
63
private const val MAX_RETRY_ATTEMPTS = 5
64
+ private const val MAX_WAIT_TIME = 10_000L // 10 seconds
55
65
}
56
66
}
0 commit comments