NettyWebSocketHandler.kt

  1. package com.hexagontk.http.server.netty

  2. import com.hexagontk.http.model.ws.WsSession
  3. import io.netty.channel.ChannelHandlerContext
  4. import io.netty.channel.ChannelInboundHandlerAdapter
  5. import io.netty.handler.codec.http.websocketx.*

  6. internal class NettyWebSocketHandler(
  7.     private val session: WsSession,
  8.     private val onBinary: WsSession.(data: ByteArray) -> Unit = {},
  9.     private val onText: WsSession.(text: String) -> Unit = {},
  10.     private val onPing: WsSession.(data: ByteArray) -> Unit = {},
  11.     private val onPong: WsSession.(data: ByteArray) -> Unit = {},
  12.     private val onClose: WsSession.(status: Int, reason: String) -> Unit = { _, _ -> },
  13. ) : ChannelInboundHandlerAdapter() {

  14.     override fun channelRead(context: ChannelHandlerContext, message: Any) {
  15.         if (message !is WebSocketFrame)
  16.             return

  17.         val content = message.content()
  18.         when (message) {
  19.             is BinaryWebSocketFrame -> session.onBinary(content.retain().array())
  20.             is TextWebSocketFrame -> session.onText(message.text())
  21.             is PingWebSocketFrame -> session.onPing(content.retain().array())
  22.             is PongWebSocketFrame -> session.onPong(content.retain().array())
  23.             is CloseWebSocketFrame -> {
  24.                 // TODO Close the channel?
  25.                 session.onClose(message.statusCode(), message.reasonText())
  26.             }
  27.             else -> error("Unsupported WebSocketFrame")
  28.         }
  29.     }
  30. }