JettyWsHttpClient.kt

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

  2. import com.hexagontk.http.HttpFeature
  3. import com.hexagontk.http.HttpFeature.*
  4. import com.hexagontk.http.client.HttpClient
  5. import com.hexagontk.http.client.jetty.JettyHttpClient
  6. import com.hexagontk.http.model.ws.WsSession
  7. import org.eclipse.jetty.websocket.client.WebSocketClient
  8. import java.net.URI

  9. /**
  10.  * Client to use other REST services.
  11.  */
  12. class JettyWsHttpClient : JettyHttpClient() {

  13.     private lateinit var wsClient: WebSocketClient

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

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

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

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

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

  40.     override fun supportedFeatures(): Set<HttpFeature> =
  41.         super.supportedFeatures() + WEBSOCKETS
  42. }