JettyWsClientAdapter.kt

  1. package com.hexagonkt.http.client.jetty.ws

  2. import com.hexagonkt.core.urlOf
  3. import com.hexagonkt.http.client.HttpClient
  4. import com.hexagonkt.http.client.jetty.JettyClientAdapter
  5. import com.hexagonkt.http.model.ws.WsSession
  6. import org.eclipse.jetty.websocket.client.WebSocketClient
  7. import java.net.URI

  8. /**
  9.  * Client to use other REST services.
  10.  */
  11. class JettyWsClientAdapter : JettyClientAdapter() {

  12.     private lateinit var wsClient: WebSocketClient

  13.     override fun startUp(client: HttpClient) {
  14.         super.startUp(client)
  15.         wsClient = WebSocketClient(jettyClient)
  16.         wsClient.start()
  17.     }

  18.     override fun shutDown() {
  19.         super.shutDown()
  20.         wsClient.stop()
  21.     }

  22.     override fun ws(
  23.         path: String,
  24.         onConnect: WsSession.() -> Unit,
  25.         onBinary: WsSession.(data: ByteArray) -> Unit,
  26.         onText: WsSession.(text: String) -> Unit,
  27.         onPing: WsSession.(data: ByteArray) -> Unit,
  28.         onPong: WsSession.(data: ByteArray) -> Unit,
  29.         onClose: WsSession.(status: Int, reason: String) -> Unit,
  30.     ): WsSession {

  31.         val baseUrl = httpClient.settings.baseUrl ?: urlOf(path)
  32.         val scheme = if (baseUrl.protocol.lowercase() == "https") "wss" else "ws"
  33.         val uri = URI("$scheme://${baseUrl.host}:${baseUrl.port}${baseUrl.path}$path")
  34.         val adapter =
  35.             JettyWebSocketAdapter(uri, onConnect, onBinary, onText, onPing, onPong, onClose)
  36.         val session = wsClient.connect(adapter, uri).get()

  37.         return JettyClientWsSession(uri, session)
  38.     }
  39. }