HttpClientPort.kt

package com.hexagontk.http.client

import com.hexagontk.http.HttpFeature
import com.hexagontk.http.model.HttpProtocol
import com.hexagontk.http.model.HttpRequestPort
import com.hexagontk.http.model.HttpResponsePort
import com.hexagontk.http.model.ServerEvent
import com.hexagontk.http.model.ws.WsSession
import java.util.concurrent.Flow.Publisher

interface HttpClientPort {

    fun startUp(client: HttpClient)

    fun shutDown()

    fun started(): Boolean

    fun send(request: HttpRequestPort): HttpResponsePort

    fun sse(request: HttpRequestPort): Publisher<ServerEvent>

    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

    /**
     * Return the client adapter's supported features.
     *
     * @return Set of supported features.
     */
    fun supportedFeatures(): Set<HttpFeature>

    /**
     * Return the server adapter's supported protocols.
     *
     * @return Set of supported protocols.
     */
    fun supportedProtocols(): Set<HttpProtocol>
}