public fun startOrchestrationListener()

in hot-reload-orchestration/src/main/kotlin/org/jetbrains/compose/reload/orchestration/OrchestrationListener.kt [61:94]


public fun startOrchestrationListener(role: OrchestrationClientRole): OrchestrationListener {
    val port = Future<Int>()
    val connections = Queue<Try<OrchestrationClient>>()

    val thread = WorkerThread("Orchestration Listener")
    val task = launchTask("Orchestration Listener", thread.dispatcher) {
        invokeOnFinish { thread.shutdown() }
        invokeOnStop { reason -> port.completeExceptionally(reason) }

        val serverSocket = ServerSocket()
        invokeOnFinish { serverSocket.close() }

        serverSocket.bind(InetSocketAddress("127.0.0.1", 0))
        port.complete(serverSocket.localPort)

        while (isActive()) {
            val client = OrchestrationClient(role, AwaitServerConnection(serverSocket))
            invokeOnFinish { client.close() }
            val connection = client.connect()
            if (isActive()) {
                connections.send(if (connection.isSuccess()) client.toLeft() else connection)
            }
        }
    }

    return object : OrchestrationListener, Task<Unit> by task {
        override val port: Future<Int> = port
        override val connections: Queue<Try<OrchestrationClient>> = connections

        override fun close() {
            task.stop()
        }
    }
}