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()
}
}
}