fix(dm): WebSocket 연결 완료 시점을 보정한다
This commit is contained in:
@@ -42,10 +42,12 @@ class DmChatRoomViewModel(
|
||||
private var nextCursor: Long? = null
|
||||
private var isLoadingOlder: Boolean = false
|
||||
private var isSending: Boolean = false
|
||||
private var isRealtimeJoining: Boolean = false
|
||||
private var isRealtimeConnected: Boolean = false
|
||||
private var shouldReconnectRealtime: Boolean = false
|
||||
private var currentAuthToken: String = ""
|
||||
private var currentRealtimeToken: String = ""
|
||||
private var currentRealtimeRoomId: Long = 0L
|
||||
private var reconnectDisposable: Disposable? = null
|
||||
private var localMessageSequence: Long = 0L
|
||||
private val mainHandler = Handler(Looper.getMainLooper())
|
||||
@@ -179,10 +181,14 @@ class DmChatRoomViewModel(
|
||||
|
||||
private fun connectRealtime(token: String) {
|
||||
val roomId = currentRoomId
|
||||
if (roomId <= 0L || isRealtimeConnected || !shouldReconnectRealtime && currentRealtimeToken.isNotEmpty()) return
|
||||
if (roomId <= 0L || isRealtimeConnected && currentRealtimeRoomId == roomId) return
|
||||
if (isRealtimeJoining && currentRealtimeRoomId == roomId) return
|
||||
if (!shouldReconnectRealtime && currentRealtimeToken.isNotEmpty() && currentRealtimeRoomId == roomId) return
|
||||
|
||||
currentRealtimeToken = token
|
||||
isRealtimeConnected = true
|
||||
currentRealtimeRoomId = roomId
|
||||
isRealtimeJoining = true
|
||||
isRealtimeConnected = false
|
||||
shouldReconnectRealtime = true
|
||||
reconnectDisposable?.dispose()
|
||||
reconnectDisposable = null
|
||||
@@ -195,6 +201,7 @@ class DmChatRoomViewModel(
|
||||
|
||||
override fun onFailure(throwable: Throwable) {
|
||||
scheduleRealtimeCallback {
|
||||
isRealtimeJoining = false
|
||||
isRealtimeConnected = false
|
||||
throwable.message?.let { Logger.e(it) }
|
||||
scheduleRealtimeReconnect()
|
||||
@@ -211,6 +218,8 @@ class DmChatRoomViewModel(
|
||||
|
||||
shouldReconnectRealtime = false
|
||||
currentRealtimeToken = ""
|
||||
currentRealtimeRoomId = 0L
|
||||
isRealtimeJoining = false
|
||||
isRealtimeConnected = false
|
||||
reconnectDisposable?.dispose()
|
||||
reconnectDisposable = null
|
||||
@@ -247,6 +256,9 @@ class DmChatRoomViewModel(
|
||||
mainHandler.removeCallbacksAndMessages(null)
|
||||
reconnectDisposable?.dispose()
|
||||
reconnectDisposable = null
|
||||
currentRealtimeRoomId = 0L
|
||||
isRealtimeJoining = false
|
||||
isRealtimeConnected = false
|
||||
repository.closeSocket()
|
||||
super.onCleared()
|
||||
}
|
||||
@@ -329,7 +341,11 @@ class DmChatRoomViewModel(
|
||||
|
||||
private fun handleSocketEvent(event: DmChatSocketEvent, token: String) {
|
||||
when (event) {
|
||||
DmChatSocketEvent.Joined -> syncLatestMessagesAfterReconnect(token = token)
|
||||
DmChatSocketEvent.Joined -> {
|
||||
isRealtimeJoining = false
|
||||
isRealtimeConnected = true
|
||||
syncLatestMessagesAfterReconnect(token = token)
|
||||
}
|
||||
is DmChatSocketEvent.Message -> onRealtimeMessage(event.message)
|
||||
is DmChatSocketEvent.SendAck -> handleSendAck(event.requestId, event.message)
|
||||
is DmChatSocketEvent.Error -> event.requestId?.let { markLocalMessageFailed(it) }
|
||||
|
||||
Reference in New Issue
Block a user