KServerSocketFactoryDefault.kt

package org.knio.core.net

import org.knio.core.context.KnioContext
import java.net.InetAddress
import java.net.InetSocketAddress

internal class KServerSocketFactoryDefault (
    private val context: KnioContext
): KServerSocketFactory {
    override suspend fun createServerSocket() =
        KServerSocketImpl(context.channelFactory.openServerSocketChannel())

    override suspend fun createServerSocket(port: Int) =
        createServerSocket().open(port)

    override suspend fun createServerSocket(port: Int, backlog: Int) =
        createServerSocket().open(port, backlog)

    override suspend fun createServerSocket(port: Int, backlog: Int, ifAddress: InetAddress) =
        createServerSocket().open(port, backlog, ifAddress)

    private suspend fun KServerSocket.open(port: Int, backlog: Int = 0, bindAddress: InetAddress? = null): KServerSocket {
        try {
            require(port in 1..0xfffe) { "Port value out of range: $port" }

            val bkLog = if (backlog < 1) 50 else backlog
            val local = InetSocketAddress(bindAddress, port)

            bind(local, bkLog)
        } catch  (th: Throwable) {
            close()
        }

        return this
    }
}