Interactive Processes
Sometimes you want to interact with a process in a back-and-forth manner by sending requests to the process and receiving responses back. For example, interacting with a repl-like process like node -i
, python -i
, etc. or an ssh server.
Here is an example of communicating with an interactive Python shell:
for {
commandQueue <- Queue.unbounded[Chunk[Byte]]
process <- Command("python", "-qi").stdin(ProcessInput.fromQueue(commandQueue)).run
_ <- process.stdout.linesStream.foreach { response =>
ZIO.debug(s"Response from REPL: $response")
}.forkDaemon
_ <- commandQueue.offer(Chunk.fromArray("1+1\n".getBytes(StandardCharsets.UTF_8)))
_ <- commandQueue.offer(Chunk.fromArray("2**8\n".getBytes(StandardCharsets.UTF_8)))
_ <- commandQueue.offer(Chunk.fromArray("import random\nrandom.randint(1, 100)\n".getBytes(StandardCharsets.UTF_8)))
_ <- commandQueue.offer(Chunk.fromArray("exit()\n".getBytes(StandardCharsets.UTF_8)))
} yield ()
You would probably want to create a helper for the repeated code, but this just a minimal example to help get you started.