dm-174
This commit is contained in:
parent
00eb15613b
commit
a11db10fca
1 changed files with 51 additions and 0 deletions
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.example.login_v3.data.di
|
||||||
|
|
||||||
|
import okhttp3.*
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
|
import kotlinx.coroutines.flow.SharedFlow
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class ChatWebSocketManager @Inject constructor(
|
||||||
|
private val client: OkHttpClient // 可以從 Hilt 模組注入
|
||||||
|
) {
|
||||||
|
private var webSocket: WebSocket? = null
|
||||||
|
|
||||||
|
// 用 SharedFlow 把收到的字串推出去給 Repository 監聽
|
||||||
|
private val _incomingMessages = MutableSharedFlow<String>(extraBufferCapacity = 64)
|
||||||
|
val incomingMessages: SharedFlow<String> = _incomingMessages
|
||||||
|
|
||||||
|
fun connect(url: String) {
|
||||||
|
if (webSocket != null) return // 避免重複連線
|
||||||
|
|
||||||
|
val request = Request.Builder().url(url).build()
|
||||||
|
webSocket = client.newWebSocket(request, object : WebSocketListener() {
|
||||||
|
override fun onMessage(webSocket: WebSocket, text: String) {
|
||||||
|
// 收到伺服器即時訊息,丟進 Flow
|
||||||
|
_incomingMessages.tryEmit(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
|
||||||
|
this@ChatWebSocketManager.webSocket = null
|
||||||
|
// 這裡可以寫自動重連邏輯
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
|
||||||
|
this@ChatWebSocketManager.webSocket = null
|
||||||
|
// 處理連線失敗
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 進入房間時,通知後端我們要訂閱這個 Room 的即時訊息(看後端協議決定要不要傳這個)
|
||||||
|
fun subscribeToRoom(roomId: String) {
|
||||||
|
// 例如送出 JSON: { "action": "subscribe", "roomId": "xxx" }
|
||||||
|
webSocket?.send("{\"action\":\"subscribe\",\"roomId\":\"$roomId\"}")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun disconnect() {
|
||||||
|
webSocket?.close(1000, "User exit")
|
||||||
|
webSocket = null
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue