From befef46add55c097c144421c5a331e763e05746e Mon Sep 17 00:00:00 2001 From: tursom Date: Mon, 5 Jul 2021 15:38:20 +0800 Subject: [PATCH] update WebSocketClient --- .../src/main/kotlin/cn/tursom/core/Tools.kt | 3 +- .../kotlin/cn/tursom/log/impl/Slf4jImpl.kt | 5 +- .../core/ws/AbstractWebSocketHandler.kt | 116 +++++++++--------- .../core/ws/AutoCloseWebSocketHandler.kt | 10 +- .../cn/tursom/core/ws/SimpWebSocketClient.kt | 32 +++++ .../cn/tursom/core/ws/SimpWebSocketHandler.kt | 11 ++ .../cn/tursom/core/ws/WebSocketClient.kt | 23 ++-- .../core/ws/WebSocketClientChannelHandler.kt | 6 +- .../ws/WebSocketClientHandshakerAdapter.kt | 6 +- .../cn/tursom/core/ws/WebSocketHandler.kt | 40 +++--- 10 files changed, 149 insertions(+), 103 deletions(-) create mode 100644 ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketClient.kt create mode 100644 ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketHandler.kt diff --git a/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt b/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt index e56976b..8195790 100644 --- a/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt +++ b/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt @@ -494,7 +494,8 @@ fun getCallerClass(thisClassName: List): Class<*>? { var callStackDepth = 1 do { clazz = getCallerClass(callStackDepth++) - if (clazz?.name !in thisClassName) { + val clazzName = clazz?.name + if (clazzName != "cn.tursom.core.ToolsKt" && clazzName !in thisClassName) { break } } while (clazz != null) diff --git a/ts-core/ts-log/src/main/kotlin/cn/tursom/log/impl/Slf4jImpl.kt b/ts-core/ts-log/src/main/kotlin/cn/tursom/log/impl/Slf4jImpl.kt index 4bf8d70..c452aca 100644 --- a/ts-core/ts-log/src/main/kotlin/cn/tursom/log/impl/Slf4jImpl.kt +++ b/ts-core/ts-log/src/main/kotlin/cn/tursom/log/impl/Slf4jImpl.kt @@ -26,7 +26,10 @@ open class Slf4jImpl constructor( @Suppress("MemberVisibilityCanBePrivate", "NOTHING_TO_INLINE") companion object { - private val thisClassName = listOf(this::class.java.name.dropLast(10), this::class.java.name) + private val thisClassName = listOf( + this::class.java.name.dropLast(10), + this::class.java.name, + ) private val loggerName: String get() = getCallerClassName(thisClassName)?.substringBefore('$') ?: throw UnsupportedOperationException() diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AbstractWebSocketHandler.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AbstractWebSocketHandler.kt index 4ab87fc..495c8af 100644 --- a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AbstractWebSocketHandler.kt +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AbstractWebSocketHandler.kt @@ -8,210 +8,210 @@ import io.netty.handler.codec.http.websocketx.PongWebSocketFrame import io.netty.handler.codec.http.websocketx.TextWebSocketFrame @Suppress("unused") -open class AbstractWebSocketHandler : WebSocketHandler { - private var onOpen: ((client: WebSocketClient) -> Unit)? = null +open class AbstractWebSocketHandler, H : WebSocketHandler> : WebSocketHandler { + private var onOpen: ((client: T) -> Unit)? = null - fun onOpen(onOpen: ((client: WebSocketClient) -> Unit)) { + fun onOpen(onOpen: ((client: T) -> Unit)) { this.onOpen = onOpen } - override fun onOpen(client: WebSocketClient) { + override fun onOpen(client: T) { onOpen?.also { it(client) } ?: super.onOpen(client) } - private var onClose: ((client: WebSocketClient) -> Unit)? = null + private var onClose: ((client: T) -> Unit)? = null - fun onClose(onClose: ((client: WebSocketClient) -> Unit)) { + fun onClose(onClose: ((client: T) -> Unit)) { this.onClose = onClose } - override fun onClose(client: WebSocketClient) { + override fun onClose(client: T) { onClose?.also { it(client) } ?: super.onClose(client) } - private var onError: ((client: WebSocketClient, e: Throwable) -> Unit)? = null + private var onError: ((client: T, e: Throwable) -> Unit)? = null - fun onError(onError: ((client: WebSocketClient, e: Throwable) -> Unit)) { + fun onError(onError: ((client: T, e: Throwable) -> Unit)) { this.onError = onError } - override fun onError(client: WebSocketClient, e: Throwable) { + override fun onError(client: T, e: Throwable) { onError?.also { it(client, e) } ?: super.onError(client, e) } - private var readMessage1: ((client: WebSocketClient, msg: String) -> Unit)? = null + private var readMessage1: ((client: T, msg: String) -> Unit)? = null @JvmName("readMessage1") - fun readMessage(readMessage: (client: WebSocketClient, msg: String) -> Unit) { + fun readMessage(readMessage: (client: T, msg: String) -> Unit) { readMessage1 = readMessage } - override fun readMessage(client: WebSocketClient, msg: String) { + override fun readMessage(client: T, msg: String) { readMessage1?.also { it(client, msg) } ?: super.readMessage(client, msg) } - private var readMessage2: ((client: WebSocketClient, msg: TextWebSocketFrame) -> Unit)? = null + private var readMessage2: ((client: T, msg: TextWebSocketFrame) -> Unit)? = null @JvmName("readMessage2") - fun readMessage(readMessage: (client: WebSocketClient, msg: TextWebSocketFrame) -> Unit) { + fun readMessage(readMessage: (client: T, msg: TextWebSocketFrame) -> Unit) { readMessage2 = readMessage } - override fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) { + override fun readMessage(client: T, msg: TextWebSocketFrame) { readMessage2?.also { it(client, msg) } ?: super.readMessage(client, msg) } - private var readMessage3: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null + private var readMessage3: ((client: T, msg: ByteArray) -> Unit)? = null @JvmName("readMessage3") - fun readMessage(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) { + fun readMessage(readMessage: (client: T, msg: ByteArray) -> Unit) { readMessage3 = readMessage } - override fun readMessage(client: WebSocketClient, msg: ByteArray) { + override fun readMessage(client: T, msg: ByteArray) { readMessage3?.also { it(client, msg) } ?: super.readMessage(client, msg) } - private var readMessage4: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null + private var readMessage4: ((client: T, msg: ByteBuf) -> Unit)? = null @JvmName("readMessage4") - fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) { + fun readMessage(readMessage: (client: T, msg: ByteBuf) -> Unit) { readMessage4 = readMessage } - override fun readMessage(client: WebSocketClient, msg: ByteBuf) { + override fun readMessage(client: T, msg: ByteBuf) { readMessage4?.also { it(client, msg) } ?: super.readMessage(client, msg) } - private var readMessage5: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null + private var readMessage5: ((client: T, msg: ByteBuffer) -> Unit)? = null @JvmName("readMessage5") - fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) { + fun readMessage(readMessage: (client: T, msg: ByteBuffer) -> Unit) { readMessage5 = readMessage } - override fun readMessage(client: WebSocketClient, msg: ByteBuffer) { + override fun readMessage(client: T, msg: ByteBuffer) { readMessage5?.also { it(client, msg) } ?: super.readMessage(client, msg) } - private var readMessage6: ((client: WebSocketClient, msg: BinaryWebSocketFrame) -> Unit)? = null + private var readMessage6: ((client: T, msg: BinaryWebSocketFrame) -> Unit)? = null @JvmName("readMessage6") - fun readMessage(readMessage: (client: WebSocketClient, msg: BinaryWebSocketFrame) -> Unit) { + fun readMessage(readMessage: (client: T, msg: BinaryWebSocketFrame) -> Unit) { readMessage6 = readMessage } - override fun readMessage(client: WebSocketClient, msg: BinaryWebSocketFrame) { + override fun readMessage(client: T, msg: BinaryWebSocketFrame) { readMessage6?.also { it(client, msg) } ?: super.readMessage(client, msg) } - private var readPing1: ((client: WebSocketClient, msg: PingWebSocketFrame) -> Unit)? = null + private var readPing1: ((client: T, msg: PingWebSocketFrame) -> Unit)? = null @JvmName("readPing1") - fun readPing(readMessage: (client: WebSocketClient, msg: PingWebSocketFrame) -> Unit) { + fun readPing(readMessage: (client: T, msg: PingWebSocketFrame) -> Unit) { readPing1 = readMessage } - override fun readPing(client: WebSocketClient, msg: PingWebSocketFrame) { + override fun readPing(client: T, msg: PingWebSocketFrame) { readPing1?.also { it(client, msg) } ?: super.readPing(client, msg) } - private var readPing2: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null + private var readPing2: ((client: T, msg: ByteBuf) -> Unit)? = null @JvmName("readPing2") - fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) { + fun readPing(readMessage: (client: T, msg: ByteBuf) -> Unit) { readPing2 = readMessage } - override fun readPing(client: WebSocketClient, msg: ByteBuf) { + override fun readPing(client: T, msg: ByteBuf) { readPing2?.also { it(client, msg) } ?: super.readPing(client, msg) } - private var readPing3: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null + private var readPing3: ((client: T, msg: ByteBuffer) -> Unit)? = null @JvmName("readPing3") - fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) { + fun readPing(readMessage: (client: T, msg: ByteBuffer) -> Unit) { readPing3 = readMessage } - override fun readPing(client: WebSocketClient, msg: ByteBuffer) { + override fun readPing(client: T, msg: ByteBuffer) { readPing3?.also { it(client, msg) } ?: super.readPing(client, msg) } - private var readPing4: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null + private var readPing4: ((client: T, msg: ByteArray) -> Unit)? = null @JvmName("readPing4") - fun readPing(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) { + fun readPing(readMessage: (client: T, msg: ByteArray) -> Unit) { readPing4 = readMessage } - override fun readPing(client: WebSocketClient, msg: ByteArray) { + override fun readPing(client: T, msg: ByteArray) { readPing4?.also { it(client, msg) } ?: super.readPing(client, msg) } - private var readPing5: ((client: WebSocketClient, msg: String) -> Unit)? = null + private var readPing5: ((client: T, msg: String) -> Unit)? = null @JvmName("readPing5") - fun readPing(readMessage: (client: WebSocketClient, msg: String) -> Unit) { + fun readPing(readMessage: (client: T, msg: String) -> Unit) { readPing5 = readMessage } - override fun readPing(client: WebSocketClient, msg: String) { + override fun readPing(client: T, msg: String) { readPing5?.also { it(client, msg) } ?: super.readPing(client, msg) } - private var readPong1: ((client: WebSocketClient, msg: PongWebSocketFrame) -> Unit)? = null + private var readPong1: ((client: T, msg: PongWebSocketFrame) -> Unit)? = null @JvmName("readPong1") - fun readPong(readMessage: (client: WebSocketClient, msg: PongWebSocketFrame) -> Unit) { + fun readPong(readMessage: (client: T, msg: PongWebSocketFrame) -> Unit) { readPong1 = readMessage } - override fun readPong(client: WebSocketClient, msg: PongWebSocketFrame) { + override fun readPong(client: T, msg: PongWebSocketFrame) { readPong1?.also { it(client, msg) } ?: super.readPong(client, msg) } - private var readPong2: ((client: WebSocketClient, msg: ByteBuf) -> Unit)? = null + private var readPong2: ((client: T, msg: ByteBuf) -> Unit)? = null @JvmName("readPong2") - fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) { + fun readPong(readMessage: (client: T, msg: ByteBuf) -> Unit) { readPong2 = readMessage } - override fun readPong(client: WebSocketClient, msg: ByteBuf) { + override fun readPong(client: T, msg: ByteBuf) { readPong2?.also { it(client, msg) } ?: super.readPong(client, msg) } - private var readPong3: ((client: WebSocketClient, msg: ByteBuffer) -> Unit)? = null + private var readPong3: ((client: T, msg: ByteBuffer) -> Unit)? = null @JvmName("readPong3") - fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) { + fun readPong(readMessage: (client: T, msg: ByteBuffer) -> Unit) { readPong3 = readMessage } - override fun readPong(client: WebSocketClient, msg: ByteBuffer) { + override fun readPong(client: T, msg: ByteBuffer) { readPong3?.also { it(client, msg) } ?: super.readPong(client, msg) } - private var readPong4: ((client: WebSocketClient, msg: ByteArray) -> Unit)? = null + private var readPong4: ((client: T, msg: ByteArray) -> Unit)? = null @JvmName("readPong4") - fun readPong(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) { + fun readPong(readMessage: (client: T, msg: ByteArray) -> Unit) { readPong4 = readMessage } - override fun readPong(client: WebSocketClient, msg: ByteArray) { + override fun readPong(client: T, msg: ByteArray) { readPong4?.also { it(client, msg) } ?: super.readPong(client, msg) } - private var readPong5: ((client: WebSocketClient, msg: String) -> Unit)? = null + private var readPong5: ((client: T, msg: String) -> Unit)? = null @JvmName("readPong5") - fun readPong(readMessage: (client: WebSocketClient, msg: String) -> Unit) { + fun readPong(readMessage: (client: T, msg: String) -> Unit) { readPong5 = readMessage } - override fun readPong(client: WebSocketClient, msg: String) { + override fun readPong(client: T, msg: String) { readPong5?.also { it(client, msg) } ?: super.readPong(client, msg) } } \ No newline at end of file diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AutoCloseWebSocketHandler.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AutoCloseWebSocketHandler.kt index 2bfd407..775d648 100644 --- a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AutoCloseWebSocketHandler.kt +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/AutoCloseWebSocketHandler.kt @@ -3,23 +3,23 @@ package cn.tursom.core.ws import cn.tursom.core.buffer.ByteBuffer import io.netty.handler.codec.http.websocketx.TextWebSocketFrame -interface AutoCloseWebSocketHandler : WebSocketHandler { - override fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) { +interface AutoCloseWebSocketHandler, H : WebSocketHandler> : WebSocketHandler { + override fun readMessage(client: T, msg: TextWebSocketFrame) { super.readMessage(client, msg) msg.release() } - override fun readMessage(client: WebSocketClient, msg: ByteBuffer) { + override fun readMessage(client: T, msg: ByteBuffer) { super.readMessage(client, msg) msg.close() } - override fun readPing(client: WebSocketClient, msg: ByteBuffer) { + override fun readPing(client: T, msg: ByteBuffer) { super.readPing(client, msg) msg.close() } - override fun readPong(client: WebSocketClient, msg: ByteBuffer) { + override fun readPong(client: T, msg: ByteBuffer) { super.readPong(client, msg) msg.close() } diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketClient.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketClient.kt new file mode 100644 index 0000000..f4a392f --- /dev/null +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketClient.kt @@ -0,0 +1,32 @@ +package cn.tursom.core.ws + +import io.netty.channel.socket.SocketChannel +import java.net.URI + +/** + * usually use SimpWebSocketHandler + * @see SimpWebSocketHandler + */ +class SimpWebSocketClient, H>>( + url: String, + handler: H, + autoWrap: Boolean = true, + log: Boolean = false, + compressed: Boolean = true, + maxContextLength: Int = 4096, + headers: Map? = null, + handshakerUri: URI? = null, + autoRelease: Boolean = true, + initChannel: ((ch: SocketChannel) -> Unit)? = null, +) : WebSocketClient, H>( + url, + handler, + autoWrap, + log, + compressed, + maxContextLength, + headers, + handshakerUri, + autoRelease, + initChannel +) diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketHandler.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketHandler.kt new file mode 100644 index 0000000..c71ce0c --- /dev/null +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/SimpWebSocketHandler.kt @@ -0,0 +1,11 @@ +package cn.tursom.core.ws + +/** + * using like + * val handler = object : AbstractWebSocketHandler, SimpWebSocketHandler>(), + * SimpWebSocketHandler { + * } + * SimpWebSocketClient("", handler) + * to impl AbstractWebSocketHandler's function + */ +interface SimpWebSocketHandler : WebSocketHandler, SimpWebSocketHandler> diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClient.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClient.kt index 16f68ba..ad54c50 100644 --- a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClient.kt +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClient.kt @@ -3,6 +3,7 @@ package cn.tursom.core.ws import cn.tursom.core.ShutdownHook import cn.tursom.core.buffer.ByteBuffer import cn.tursom.core.buffer.impl.NettyByteBuffer +import cn.tursom.core.uncheckedCast import io.netty.bootstrap.Bootstrap import io.netty.buffer.ByteBuf import io.netty.buffer.Unpooled @@ -22,9 +23,9 @@ import java.net.URI @Suppress("unused") -open class WebSocketClient( +open class WebSocketClient, H : WebSocketHandler>( url: String, - open val handler: WebSocketHandler, + open val handler: H, val autoWrap: Boolean = true, val log: Boolean = false, val compressed: Boolean = true, @@ -32,7 +33,7 @@ open class WebSocketClient( private val headers: Map? = null, private val handshakerUri: URI? = null, val autoRelease: Boolean = true, - var initChannel: ((ch: SocketChannel) -> Unit)? = null + var initChannel: ((ch: SocketChannel) -> Unit)? = null, ) { private val uri: URI = URI.create(url) var ch: Channel? = null @@ -44,12 +45,11 @@ open class WebSocketClient( } } - fun open() { + fun open(): ChannelFuture? { close() val scheme = if (uri.scheme == null) "ws" else uri.scheme val host = if (uri.host == null) "127.0.0.1" else uri.host - val port: Int - port = if (uri.port == -1) { + val port = if (uri.port == -1) { when { "ws".equals(scheme, ignoreCase = true) -> 80 "wss".equals(scheme, ignoreCase = true) -> 443 @@ -61,7 +61,7 @@ open class WebSocketClient( if (!"ws".equals(scheme, ignoreCase = true) && !"wss".equals(scheme, ignoreCase = true)) { System.err.println("Only WS(S) is supported.") - return + return null } val ssl = "wss".equals(scheme, ignoreCase = true) @@ -78,9 +78,9 @@ open class WebSocketClient( val handshakerAdapter = WebSocketClientHandshakerAdapter( WebSocketClientHandshakerFactory.newHandshaker( handshakerUri ?: uri, WebSocketVersion.V13, null, true, httpHeaders - ), this, handler + ), uncheckedCast(), handler ) - val handler = WebSocketClientChannelHandler(this, handler, autoRelease) + val handler = WebSocketClientChannelHandler(uncheckedCast(), handler, autoRelease) val bootstrap = Bootstrap() bootstrap.group(group) .channel(NioSocketChannel::class.java) @@ -107,8 +107,7 @@ open class WebSocketClient( initChannel?.invoke(ch) } }) - bootstrap.connect(uri.host, port) - //handler.handshakeFuture().sync() + return bootstrap.connect(uri.host, port) } fun close(reasonText: String? = null): ChannelFuture? { @@ -199,4 +198,4 @@ open class WebSocketClient( companion object { val group: EventLoopGroup = NioEventLoopGroup() } -} \ No newline at end of file +} diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientChannelHandler.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientChannelHandler.kt index 75bee11..0fdd2b2 100644 --- a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientChannelHandler.kt +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientChannelHandler.kt @@ -5,9 +5,9 @@ import io.netty.channel.SimpleChannelInboundHandler import io.netty.handler.codec.http.websocketx.* -class WebSocketClientChannelHandler( - val client: WebSocketClient, - val handler: WebSocketHandler, +class WebSocketClientChannelHandler, H : WebSocketHandler>( + val client: T, + val handler: WebSocketHandler, private val autoRelease: Boolean = true, ) : SimpleChannelInboundHandler(autoRelease) { diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientHandshakerAdapter.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientHandshakerAdapter.kt index b41eafb..3b08376 100644 --- a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientHandshakerAdapter.kt +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketClientHandshakerAdapter.kt @@ -7,10 +7,10 @@ import io.netty.handler.codec.http.FullHttpResponse import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker import io.netty.util.CharsetUtil -class WebSocketClientHandshakerAdapter( +class WebSocketClientHandshakerAdapter, H : WebSocketHandler>( private val handshaker: WebSocketClientHandshaker, - private val client: WebSocketClient, - private val handler: WebSocketHandler, + private val client: T, + private val handler: WebSocketHandler, ) : SimpleChannelInboundHandler() { private var handshakeFuture: ChannelPromise? = null diff --git a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketHandler.kt b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketHandler.kt index 4d6067d..1ddefc0 100644 --- a/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketHandler.kt +++ b/ts-core/ts-ws-client/src/main/kotlin/cn/tursom/core/ws/WebSocketHandler.kt @@ -9,67 +9,67 @@ import io.netty.handler.codec.http.websocketx.PingWebSocketFrame import io.netty.handler.codec.http.websocketx.PongWebSocketFrame import io.netty.handler.codec.http.websocketx.TextWebSocketFrame -interface WebSocketHandler { - fun onOpen(client: WebSocketClient) {} - fun onClose(client: WebSocketClient) {} - fun onError(client: WebSocketClient, e: Throwable) { +interface WebSocketHandler, in H : WebSocketHandler> { + fun onOpen(client: T) {} + fun onClose(client: T) {} + fun onError(client: T, e: Throwable) { throw e } - fun readMessage(client: WebSocketClient, msg: String) {} - fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) { + fun readMessage(client: T, msg: String) {} + fun readMessage(client: T, msg: TextWebSocketFrame) { readMessage(client, msg.text()) } - fun readMessage(client: WebSocketClient, msg: ByteArray) {} + fun readMessage(client: T, msg: ByteArray) {} - fun readMessage(client: WebSocketClient, msg: ByteBuf) { + fun readMessage(client: T, msg: ByteBuf) { readMessage(client, NettyByteBuffer(msg)) } - fun readMessage(client: WebSocketClient, msg: ByteBuffer) { + fun readMessage(client: T, msg: ByteBuffer) { readMessage(client, msg.getBytes()) } - fun readMessage(client: WebSocketClient, msg: BinaryWebSocketFrame) { + fun readMessage(client: T, msg: BinaryWebSocketFrame) { readMessage(client, msg.content()) } - fun readPing(client: WebSocketClient, msg: PingWebSocketFrame) { + fun readPing(client: T, msg: PingWebSocketFrame) { readPing(client, msg.content()) } - fun readPing(client: WebSocketClient, msg: ByteBuf) { + fun readPing(client: T, msg: ByteBuf) { readPing(client, NettyByteBuffer(msg)) } - fun readPing(client: WebSocketClient, msg: ByteBuffer) { + fun readPing(client: T, msg: ByteBuffer) { readPing(client, msg.getBytes()) } - fun readPing(client: WebSocketClient, msg: ByteArray) { + fun readPing(client: T, msg: ByteArray) { readPing(client, msg.toUTF8String()) } - fun readPing(client: WebSocketClient, msg: String) { + fun readPing(client: T, msg: String) { } - fun readPong(client: WebSocketClient, msg: PongWebSocketFrame) { + fun readPong(client: T, msg: PongWebSocketFrame) { readPong(client, msg.content()) } - fun readPong(client: WebSocketClient, msg: ByteBuf) { + fun readPong(client: T, msg: ByteBuf) { readPong(client, NettyByteBuffer(msg)) } - fun readPong(client: WebSocketClient, msg: ByteBuffer) { + fun readPong(client: T, msg: ByteBuffer) { readPong(client, msg.getBytes()) } - fun readPong(client: WebSocketClient, msg: ByteArray) { + fun readPong(client: T, msg: ByteArray) { readPong(client, msg.toUTF8String()) } - fun readPong(client: WebSocketClient, msg: String) { + fun readPong(client: T, msg: String) { } } \ No newline at end of file