Skip to content

Commit 229ab84

Browse files
committed
Modify OnMessageReceived bytestring as Charset.defaultCharset() string
1 parent 764d357 commit 229ab84

File tree

6 files changed

+108
-9
lines changed

6 files changed

+108
-9
lines changed

app/src/main/java/com/jeremy/thunder/di/SocketModule.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
1212
import dagger.hilt.components.SingletonComponent
1313
import okhttp3.OkHttpClient
1414
import okhttp3.logging.HttpLoggingInterceptor
15+
import java.util.concurrent.TimeUnit
1516
import javax.inject.Singleton
1617

1718
@Module
@@ -25,6 +26,10 @@ internal object SocketModule {
2526
.setLevel(HttpLoggingInterceptor.Level.BODY)
2627
return OkHttpClient.Builder()
2728
.addInterceptor(httpLoggingInterceptor)
29+
.pingInterval(
30+
10,
31+
TimeUnit.SECONDS
32+
) // If there are no events for a minute, we need to put in some code for ping pong to output a socket connection error from okhttp.
2833
.build()
2934
}
3035

@@ -35,7 +40,8 @@ internal object SocketModule {
3540
@ApplicationContext context: Context
3641
): SocketService {
3742
return thunder {
38-
webSocketCore(okHttpClient.makeWebSocketCore("wss://fstream.binance.com/stream"))
43+
// webSocketCore(okHttpClient.makeWebSocketCore("wss://fstream.binance.com/stream")) // binance socket server
44+
webSocketCore(okHttpClient.makeWebSocketCore("wss://api.upbit.com/websocket/v1")) // upbit socket server
3945
setApplicationContext(context)
4046
setConverterType(ConverterType.Gson)
4147
}.create()

app/src/main/java/com/jeremy/thunder/socket/SocketService.kt

+8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import com.jeremy.thunder.socket.model.AllMarketResponse
55
import com.jeremy.thunder.socket.model.AllMarketTickerResponse
66
import com.jeremy.thunder.socket.model.BinanceRequest
77
import com.jeremy.thunder.socket.model.TickerResponse
8+
import com.jeremy.thunder.socket.model.UpbitRequest
9+
import com.jeremy.thunder.socket.model.UpbitTickerResponse
810
import com.jeremy.thunder.ws.Event
911
import com.jeremy.thunder.ws.Receive
1012
import com.jeremy.thunder.ws.Send
@@ -14,6 +16,12 @@ interface SocketService {
1416
@Send
1517
fun request(request: BinanceRequest)
1618

19+
@Send
20+
fun requestUpbit(request: List<UpbitRequest>)
21+
22+
@Receive
23+
fun collectUpbitTicker(): Flow<UpbitTickerResponse>
24+
1725
@Event
1826
fun receiveEvent(): Flow<WebSocketEvent>
1927

app/src/main/java/com/jeremy/thunder/socket/model/BinanceRequest.kt

+17-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,20 @@ data class BinanceRequest(
66
val params: List<String> = listOf("btcusdt@markPrice")
77
)
88

9-
//val params: List<String> = listOf("btcusdt@markPrice", "ethusdt@markPrice")
9+
//val params: List<String> = listOf("btcusdt@markPrice", "ethusdt@markPrice")
10+
11+
//[{"ticket":"test"},{"type":"trade","codes":["KRW-BTC","BTC-BCH"]},{"format":"SIMPLE"}]
12+
sealed interface UpbitRequest
13+
14+
data class RequestTicketField(
15+
val ticket: String
16+
): UpbitRequest
17+
18+
data class RequestTypeField(
19+
val type: String,
20+
val codes: List<String>
21+
): UpbitRequest
22+
23+
data class RequestFormatField(
24+
val format: String = "DEFAULT"
25+
): UpbitRequest
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.jeremy.thunder.socket.model
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
data class UpbitTickerResponse(
7+
val acc_ask_volume: Double,
8+
val acc_bid_volume: Double,
9+
val acc_trade_price: Double,
10+
val acc_trade_price_24h: Double,
11+
val acc_trade_volume: Double,
12+
val acc_trade_volume_24h: Double,
13+
val ask_bid: String,
14+
val change: String,
15+
val change_price: Double,
16+
val change_rate: Double,
17+
val code: String,
18+
val high_price: Double,
19+
val highest_52_week_date: String,
20+
val highest_52_week_price: Double,
21+
val is_trading_suspended: Boolean,
22+
val low_price: Double,
23+
val lowest_52_week_date: String,
24+
val lowest_52_week_price: Double,
25+
val market_state: String,
26+
val market_warning: String,
27+
val opening_price: Double,
28+
val prev_closing_price: Double,
29+
val signed_change_price: Double,
30+
val signed_change_rate: Double,
31+
val stream_type: String,
32+
val timestamp: Long,
33+
val trade_date: String,
34+
val trade_price: Double,
35+
val trade_time: String,
36+
val trade_timestamp: Long,
37+
val trade_volume: Double,
38+
val type: String
39+
)

app/src/main/java/com/jeremy/thunder/ui/home/HomeViewModel.kt

+22
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ import com.jeremy.thunder.event.WebSocketEvent
66
import com.jeremy.thunder.socket.SocketService
77
import com.jeremy.thunder.socket.model.AllMarketTickerResponseItem
88
import com.jeremy.thunder.socket.model.BinanceRequest
9+
import com.jeremy.thunder.socket.model.RequestFormatField
10+
import com.jeremy.thunder.socket.model.RequestTicketField
11+
import com.jeremy.thunder.socket.model.RequestTypeField
912
import dagger.hilt.android.lifecycle.HiltViewModel
1013
import kotlinx.coroutines.flow.Flow
1114
import kotlinx.coroutines.flow.MutableStateFlow
1215
import kotlinx.coroutines.flow.launchIn
1316
import kotlinx.coroutines.flow.onEach
1417
import kotlinx.coroutines.flow.update
18+
import java.util.UUID
1519
import javax.inject.Inject
1620

1721
@HiltViewModel
@@ -46,6 +50,19 @@ class HomeViewModel @Inject constructor(
4650
}
4751

4852
fun requestAllMarketTicker() {
53+
// upbit socket request
54+
service.requestUpbit(
55+
listOf(
56+
RequestTicketField(ticket = UUID.randomUUID().toString()),
57+
RequestTypeField(
58+
type = "ticker",
59+
codes = listOf("KRW-BTC","KRW-ETH")
60+
),
61+
RequestFormatField()
62+
)
63+
)
64+
65+
// binance socket request subscribe
4966
service.request(
5067
request = BinanceRequest(
5168
method = "SUBSCRIBE",
@@ -54,6 +71,7 @@ class HomeViewModel @Inject constructor(
5471
}
5572

5673
fun requestCancelAllMarketTicker() {
74+
// binance socket request unsubscribe
5775
service.request(
5876
request = BinanceRequest(
5977
method = "UNSUBSCRIBE",
@@ -63,6 +81,10 @@ class HomeViewModel @Inject constructor(
6381
}
6482

6583
fun observeAllMarket() {
84+
service.collectUpbitTicker().onEach {
85+
// this is upbit flow
86+
}.launchIn(viewModelScope)
87+
6688
service.observeAllMarketTickers().onEach { response ->
6789
_allMarketTickerFlow.update { response.data.sortedBy { it.c } }
6890
}.launchIn(viewModelScope)

thunder-okhttp/src/main/java/com/jeremy/thunder/SocketListener.kt

+15-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.jeremy.thunder
22

3+
import com.jeremy.thunder.event.WebSocketEvent
34
import kotlinx.coroutines.channels.BufferOverflow
45
import kotlinx.coroutines.flow.Flow
56
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -8,37 +9,44 @@ import okhttp3.Response
89
import okhttp3.WebSocket
910
import okhttp3.WebSocketListener
1011
import okio.ByteString
12+
import java.nio.charset.Charset
1113

1214
class SocketListener : WebSocketListener(), EventCollector {
1315

14-
private val _eventFlow = MutableSharedFlow<com.jeremy.thunder.event.WebSocketEvent>(
16+
private val _eventFlow = MutableSharedFlow<WebSocketEvent>(
1517
replay = 1,
1618
extraBufferCapacity = DEFAULT_BUFFER,
1719
onBufferOverflow = BufferOverflow.DROP_OLDEST
1820
)
1921

20-
override fun collectEvent(): Flow<com.jeremy.thunder.event.WebSocketEvent> {
22+
override fun collectEvent(): Flow<WebSocketEvent> {
2123
return _eventFlow.asSharedFlow()
2224
}
2325

2426
override fun onOpen(webSocket: WebSocket, response: Response) {
25-
_eventFlow.tryEmit(com.jeremy.thunder.event.WebSocketEvent.OnConnectionOpen(webSocket))
27+
_eventFlow.tryEmit(WebSocketEvent.OnConnectionOpen(webSocket))
2628
}
2729

2830
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
29-
_eventFlow.tryEmit(com.jeremy.thunder.event.WebSocketEvent.OnMessageReceived(bytes.toString()))
31+
_eventFlow.tryEmit(
32+
WebSocketEvent.OnMessageReceived(
33+
bytes.string(
34+
Charset.defaultCharset()
35+
)
36+
)
37+
)
3038
}
3139

3240
override fun onMessage(webSocket: WebSocket, text: String) {
33-
_eventFlow.tryEmit(com.jeremy.thunder.event.WebSocketEvent.OnMessageReceived(text))
41+
_eventFlow.tryEmit(WebSocketEvent.OnMessageReceived(text))
3442
}
3543

3644
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
37-
_eventFlow.tryEmit(com.jeremy.thunder.event.WebSocketEvent.OnConnectionClosed)
45+
_eventFlow.tryEmit(WebSocketEvent.OnConnectionClosed)
3846
}
3947

4048
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
41-
_eventFlow.tryEmit(com.jeremy.thunder.event.WebSocketEvent.OnConnectionError(t.message))
49+
_eventFlow.tryEmit(WebSocketEvent.OnConnectionError(t.message))
4250
}
4351

4452
companion object {

0 commit comments

Comments
 (0)