JettyWsHttpClient.kt

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

import com.hexagontk.http.HttpFeature
import com.hexagontk.http.HttpFeature.*
import com.hexagontk.http.client.HttpClient
import com.hexagontk.http.client.jetty.JettyHttpClient
import com.hexagontk.http.model.ws.WsSession
import org.eclipse.jetty.websocket.client.WebSocketClient
import java.net.URI

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

    private lateinit var wsClient: WebSocketClient

    override fun startUp(client: HttpClient) {
        super.startUp(client)
        wsClient = WebSocketClient(jettyClient)
        wsClient.start()
    }

    override fun shutDown() {
        super.shutDown()
        wsClient.stop()
    }

    override fun ws(
        path: String,
        onConnect: WsSession.() -> Unit,
        onBinary: WsSession.(data: ByteArray) -> Unit,
        onText: WsSession.(text: String) -> Unit,
        onPing: WsSession.(data: ByteArray) -> Unit,
        onPong: WsSession.(data: ByteArray) -> Unit,
        onClose: WsSession.(status: Int, reason: String) -> Unit,
    ): WsSession {

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

        return JettyClientWsSession(uri, session)
    }

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