update WebSocketClient

This commit is contained in:
tursom 2021-07-05 15:38:20 +08:00
parent f97cc59191
commit befef46add
10 changed files with 149 additions and 103 deletions

View File

@ -494,7 +494,8 @@ fun getCallerClass(thisClassName: List<String>): Class<*>? {
var callStackDepth = 1 var callStackDepth = 1
do { do {
clazz = getCallerClass(callStackDepth++) clazz = getCallerClass(callStackDepth++)
if (clazz?.name !in thisClassName) { val clazzName = clazz?.name
if (clazzName != "cn.tursom.core.ToolsKt" && clazzName !in thisClassName) {
break break
} }
} while (clazz != null) } while (clazz != null)

View File

@ -26,7 +26,10 @@ open class Slf4jImpl constructor(
@Suppress("MemberVisibilityCanBePrivate", "NOTHING_TO_INLINE") @Suppress("MemberVisibilityCanBePrivate", "NOTHING_TO_INLINE")
companion object { 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 private val loggerName: String
get() = getCallerClassName(thisClassName)?.substringBefore('$') get() = getCallerClassName(thisClassName)?.substringBefore('$')
?: throw UnsupportedOperationException() ?: throw UnsupportedOperationException()

View File

@ -8,210 +8,210 @@ import io.netty.handler.codec.http.websocketx.PongWebSocketFrame
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
@Suppress("unused") @Suppress("unused")
open class AbstractWebSocketHandler : WebSocketHandler { open class AbstractWebSocketHandler<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>> : WebSocketHandler<T, H> {
private var onOpen: ((client: WebSocketClient) -> Unit)? = null private var onOpen: ((client: T) -> Unit)? = null
fun onOpen(onOpen: ((client: WebSocketClient) -> Unit)) { fun onOpen(onOpen: ((client: T) -> Unit)) {
this.onOpen = onOpen this.onOpen = onOpen
} }
override fun onOpen(client: WebSocketClient) { override fun onOpen(client: T) {
onOpen?.also { it(client) } ?: super.onOpen(client) 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 this.onClose = onClose
} }
override fun onClose(client: WebSocketClient) { override fun onClose(client: T) {
onClose?.also { it(client) } ?: super.onClose(client) 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 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) 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") @JvmName("readMessage1")
fun readMessage(readMessage: (client: WebSocketClient, msg: String) -> Unit) { fun readMessage(readMessage: (client: T, msg: String) -> Unit) {
readMessage1 = readMessage 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) 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") @JvmName("readMessage2")
fun readMessage(readMessage: (client: WebSocketClient, msg: TextWebSocketFrame) -> Unit) { fun readMessage(readMessage: (client: T, msg: TextWebSocketFrame) -> Unit) {
readMessage2 = readMessage 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) 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") @JvmName("readMessage3")
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) { fun readMessage(readMessage: (client: T, msg: ByteArray) -> Unit) {
readMessage3 = readMessage 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) 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") @JvmName("readMessage4")
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) { fun readMessage(readMessage: (client: T, msg: ByteBuf) -> Unit) {
readMessage4 = readMessage 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) 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") @JvmName("readMessage5")
fun readMessage(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) { fun readMessage(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
readMessage5 = readMessage 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) 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") @JvmName("readMessage6")
fun readMessage(readMessage: (client: WebSocketClient, msg: BinaryWebSocketFrame) -> Unit) { fun readMessage(readMessage: (client: T, msg: BinaryWebSocketFrame) -> Unit) {
readMessage6 = readMessage 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) 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") @JvmName("readPing1")
fun readPing(readMessage: (client: WebSocketClient, msg: PingWebSocketFrame) -> Unit) { fun readPing(readMessage: (client: T, msg: PingWebSocketFrame) -> Unit) {
readPing1 = readMessage 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) 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") @JvmName("readPing2")
fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) { fun readPing(readMessage: (client: T, msg: ByteBuf) -> Unit) {
readPing2 = readMessage 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) 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") @JvmName("readPing3")
fun readPing(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) { fun readPing(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
readPing3 = readMessage 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) 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") @JvmName("readPing4")
fun readPing(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) { fun readPing(readMessage: (client: T, msg: ByteArray) -> Unit) {
readPing4 = readMessage 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) 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") @JvmName("readPing5")
fun readPing(readMessage: (client: WebSocketClient, msg: String) -> Unit) { fun readPing(readMessage: (client: T, msg: String) -> Unit) {
readPing5 = readMessage 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) 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") @JvmName("readPong1")
fun readPong(readMessage: (client: WebSocketClient, msg: PongWebSocketFrame) -> Unit) { fun readPong(readMessage: (client: T, msg: PongWebSocketFrame) -> Unit) {
readPong1 = readMessage 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) 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") @JvmName("readPong2")
fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuf) -> Unit) { fun readPong(readMessage: (client: T, msg: ByteBuf) -> Unit) {
readPong2 = readMessage 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) 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") @JvmName("readPong3")
fun readPong(readMessage: (client: WebSocketClient, msg: ByteBuffer) -> Unit) { fun readPong(readMessage: (client: T, msg: ByteBuffer) -> Unit) {
readPong3 = readMessage 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) 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") @JvmName("readPong4")
fun readPong(readMessage: (client: WebSocketClient, msg: ByteArray) -> Unit) { fun readPong(readMessage: (client: T, msg: ByteArray) -> Unit) {
readPong4 = readMessage 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) 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") @JvmName("readPong5")
fun readPong(readMessage: (client: WebSocketClient, msg: String) -> Unit) { fun readPong(readMessage: (client: T, msg: String) -> Unit) {
readPong5 = readMessage 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) readPong5?.also { it(client, msg) } ?: super.readPong(client, msg)
} }
} }

View File

@ -3,23 +3,23 @@ package cn.tursom.core.ws
import cn.tursom.core.buffer.ByteBuffer import cn.tursom.core.buffer.ByteBuffer
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
interface AutoCloseWebSocketHandler : WebSocketHandler { interface AutoCloseWebSocketHandler<in T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>> : WebSocketHandler<T, H> {
override fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) { override fun readMessage(client: T, msg: TextWebSocketFrame) {
super.readMessage(client, msg) super.readMessage(client, msg)
msg.release() msg.release()
} }
override fun readMessage(client: WebSocketClient, msg: ByteBuffer) { override fun readMessage(client: T, msg: ByteBuffer) {
super.readMessage(client, msg) super.readMessage(client, msg)
msg.close() msg.close()
} }
override fun readPing(client: WebSocketClient, msg: ByteBuffer) { override fun readPing(client: T, msg: ByteBuffer) {
super.readPing(client, msg) super.readPing(client, msg)
msg.close() msg.close()
} }
override fun readPong(client: WebSocketClient, msg: ByteBuffer) { override fun readPong(client: T, msg: ByteBuffer) {
super.readPong(client, msg) super.readPong(client, msg)
msg.close() msg.close()
} }

View File

@ -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 : WebSocketHandler<SimpWebSocketClient<H>, H>>(
url: String,
handler: H,
autoWrap: Boolean = true,
log: Boolean = false,
compressed: Boolean = true,
maxContextLength: Int = 4096,
headers: Map<String, String>? = null,
handshakerUri: URI? = null,
autoRelease: Boolean = true,
initChannel: ((ch: SocketChannel) -> Unit)? = null,
) : WebSocketClient<SimpWebSocketClient<H>, H>(
url,
handler,
autoWrap,
log,
compressed,
maxContextLength,
headers,
handshakerUri,
autoRelease,
initChannel
)

View File

@ -0,0 +1,11 @@
package cn.tursom.core.ws
/**
* using like
* val handler = object : AbstractWebSocketHandler<SimpWebSocketClient<SimpWebSocketHandler>, SimpWebSocketHandler>(),
* SimpWebSocketHandler {
* }
* SimpWebSocketClient("", handler)
* to impl AbstractWebSocketHandler's function
*/
interface SimpWebSocketHandler : WebSocketHandler<SimpWebSocketClient<SimpWebSocketHandler>, SimpWebSocketHandler>

View File

@ -3,6 +3,7 @@ package cn.tursom.core.ws
import cn.tursom.core.ShutdownHook import cn.tursom.core.ShutdownHook
import cn.tursom.core.buffer.ByteBuffer import cn.tursom.core.buffer.ByteBuffer
import cn.tursom.core.buffer.impl.NettyByteBuffer import cn.tursom.core.buffer.impl.NettyByteBuffer
import cn.tursom.core.uncheckedCast
import io.netty.bootstrap.Bootstrap import io.netty.bootstrap.Bootstrap
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.buffer.Unpooled import io.netty.buffer.Unpooled
@ -22,9 +23,9 @@ import java.net.URI
@Suppress("unused") @Suppress("unused")
open class WebSocketClient( open class WebSocketClient<in T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
url: String, url: String,
open val handler: WebSocketHandler, open val handler: H,
val autoWrap: Boolean = true, val autoWrap: Boolean = true,
val log: Boolean = false, val log: Boolean = false,
val compressed: Boolean = true, val compressed: Boolean = true,
@ -32,7 +33,7 @@ open class WebSocketClient(
private val headers: Map<String, String>? = null, private val headers: Map<String, String>? = null,
private val handshakerUri: URI? = null, private val handshakerUri: URI? = null,
val autoRelease: Boolean = true, val autoRelease: Boolean = true,
var initChannel: ((ch: SocketChannel) -> Unit)? = null var initChannel: ((ch: SocketChannel) -> Unit)? = null,
) { ) {
private val uri: URI = URI.create(url) private val uri: URI = URI.create(url)
var ch: Channel? = null var ch: Channel? = null
@ -44,12 +45,11 @@ open class WebSocketClient(
} }
} }
fun open() { fun open(): ChannelFuture? {
close() close()
val scheme = if (uri.scheme == null) "ws" else uri.scheme val scheme = if (uri.scheme == null) "ws" else uri.scheme
val host = if (uri.host == null) "127.0.0.1" else uri.host val host = if (uri.host == null) "127.0.0.1" else uri.host
val port: Int val port = if (uri.port == -1) {
port = if (uri.port == -1) {
when { when {
"ws".equals(scheme, ignoreCase = true) -> 80 "ws".equals(scheme, ignoreCase = true) -> 80
"wss".equals(scheme, ignoreCase = true) -> 443 "wss".equals(scheme, ignoreCase = true) -> 443
@ -61,7 +61,7 @@ open class WebSocketClient(
if (!"ws".equals(scheme, ignoreCase = true) && !"wss".equals(scheme, ignoreCase = true)) { if (!"ws".equals(scheme, ignoreCase = true) && !"wss".equals(scheme, ignoreCase = true)) {
System.err.println("Only WS(S) is supported.") System.err.println("Only WS(S) is supported.")
return return null
} }
val ssl = "wss".equals(scheme, ignoreCase = true) val ssl = "wss".equals(scheme, ignoreCase = true)
@ -78,9 +78,9 @@ open class WebSocketClient(
val handshakerAdapter = WebSocketClientHandshakerAdapter( val handshakerAdapter = WebSocketClientHandshakerAdapter(
WebSocketClientHandshakerFactory.newHandshaker( WebSocketClientHandshakerFactory.newHandshaker(
handshakerUri ?: uri, WebSocketVersion.V13, null, true, httpHeaders 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() val bootstrap = Bootstrap()
bootstrap.group(group) bootstrap.group(group)
.channel(NioSocketChannel::class.java) .channel(NioSocketChannel::class.java)
@ -107,8 +107,7 @@ open class WebSocketClient(
initChannel?.invoke(ch) initChannel?.invoke(ch)
} }
}) })
bootstrap.connect(uri.host, port) return bootstrap.connect(uri.host, port)
//handler.handshakeFuture().sync()
} }
fun close(reasonText: String? = null): ChannelFuture? { fun close(reasonText: String? = null): ChannelFuture? {
@ -199,4 +198,4 @@ open class WebSocketClient(
companion object { companion object {
val group: EventLoopGroup = NioEventLoopGroup() val group: EventLoopGroup = NioEventLoopGroup()
} }
} }

View File

@ -5,9 +5,9 @@ import io.netty.channel.SimpleChannelInboundHandler
import io.netty.handler.codec.http.websocketx.* import io.netty.handler.codec.http.websocketx.*
class WebSocketClientChannelHandler( class WebSocketClientChannelHandler<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
val client: WebSocketClient, val client: T,
val handler: WebSocketHandler, val handler: WebSocketHandler<T, H>,
private val autoRelease: Boolean = true, private val autoRelease: Boolean = true,
) : SimpleChannelInboundHandler<WebSocketFrame>(autoRelease) { ) : SimpleChannelInboundHandler<WebSocketFrame>(autoRelease) {

View File

@ -7,10 +7,10 @@ import io.netty.handler.codec.http.FullHttpResponse
import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker
import io.netty.util.CharsetUtil import io.netty.util.CharsetUtil
class WebSocketClientHandshakerAdapter( class WebSocketClientHandshakerAdapter<T : WebSocketClient<T, H>, H : WebSocketHandler<T, H>>(
private val handshaker: WebSocketClientHandshaker, private val handshaker: WebSocketClientHandshaker,
private val client: WebSocketClient, private val client: T,
private val handler: WebSocketHandler, private val handler: WebSocketHandler<T, H>,
) : SimpleChannelInboundHandler<FullHttpResponse>() { ) : SimpleChannelInboundHandler<FullHttpResponse>() {
private var handshakeFuture: ChannelPromise? = null private var handshakeFuture: ChannelPromise? = null

View File

@ -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.PongWebSocketFrame
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
interface WebSocketHandler { interface WebSocketHandler<in T : WebSocketClient<T, in H>, in H : WebSocketHandler<T, H>> {
fun onOpen(client: WebSocketClient) {} fun onOpen(client: T) {}
fun onClose(client: WebSocketClient) {} fun onClose(client: T) {}
fun onError(client: WebSocketClient, e: Throwable) { fun onError(client: T, e: Throwable) {
throw e throw e
} }
fun readMessage(client: WebSocketClient, msg: String) {} fun readMessage(client: T, msg: String) {}
fun readMessage(client: WebSocketClient, msg: TextWebSocketFrame) { fun readMessage(client: T, msg: TextWebSocketFrame) {
readMessage(client, msg.text()) 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)) readMessage(client, NettyByteBuffer(msg))
} }
fun readMessage(client: WebSocketClient, msg: ByteBuffer) { fun readMessage(client: T, msg: ByteBuffer) {
readMessage(client, msg.getBytes()) readMessage(client, msg.getBytes())
} }
fun readMessage(client: WebSocketClient, msg: BinaryWebSocketFrame) { fun readMessage(client: T, msg: BinaryWebSocketFrame) {
readMessage(client, msg.content()) readMessage(client, msg.content())
} }
fun readPing(client: WebSocketClient, msg: PingWebSocketFrame) { fun readPing(client: T, msg: PingWebSocketFrame) {
readPing(client, msg.content()) readPing(client, msg.content())
} }
fun readPing(client: WebSocketClient, msg: ByteBuf) { fun readPing(client: T, msg: ByteBuf) {
readPing(client, NettyByteBuffer(msg)) readPing(client, NettyByteBuffer(msg))
} }
fun readPing(client: WebSocketClient, msg: ByteBuffer) { fun readPing(client: T, msg: ByteBuffer) {
readPing(client, msg.getBytes()) readPing(client, msg.getBytes())
} }
fun readPing(client: WebSocketClient, msg: ByteArray) { fun readPing(client: T, msg: ByteArray) {
readPing(client, msg.toUTF8String()) 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()) readPong(client, msg.content())
} }
fun readPong(client: WebSocketClient, msg: ByteBuf) { fun readPong(client: T, msg: ByteBuf) {
readPong(client, NettyByteBuffer(msg)) readPong(client, NettyByteBuffer(msg))
} }
fun readPong(client: WebSocketClient, msg: ByteBuffer) { fun readPong(client: T, msg: ByteBuffer) {
readPong(client, msg.getBytes()) readPong(client, msg.getBytes())
} }
fun readPong(client: WebSocketClient, msg: ByteArray) { fun readPong(client: T, msg: ByteArray) {
readPong(client, msg.toUTF8String()) readPong(client, msg.toUTF8String())
} }
fun readPong(client: WebSocketClient, msg: String) { fun readPong(client: T, msg: String) {
} }
} }