Simple peer-peer library using zio
- TCP library
 
Echo in uppercase server
import io.github.searler.zio_peer.{ALL, Acceptor, AcceptorTracker, Routing}
import io.github.searler.zio_tcp.TCP
import zio.stream.{ZSink, ZStream}
import zio.{App, ExitCode, URIO, ZHub}
import java.net.{InetAddress, InetSocketAddress}
object StringServer extends App {
  override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = {
    val program = for {
      tracker <- AcceptorTracker.dropOld[InetAddress]
      responseHub <-
        ZHub.sliding[(Routing[InetAddress], String)](20)
      requestHub <- ZHub.sliding[(InetAddress, String)](20)
      _ <- ZStream.fromHub(requestHub).map(p => ALL -> (p._2.toUpperCase)).run(ZSink.fromHub(responseHub)).fork
      _ <- Acceptor.strings[InetAddress, String](TCP.fromSocketServer(8888),
        20,
        sa => Option(sa.asInstanceOf[InetSocketAddress].getAddress),
        tracker,
        responseHub,
        requestHub.toQueue
      )
    } yield ()
    program.exitCode
  }
}Client sending line read from stdin
import io.github.searler.zio_peer.{ALL, Connector, ConnectorTracker, Routing}
import io.github.searler.zio_tcp.TCP
import zio.duration._
import zio.stream.{ZSink, ZStream}
import zio.{App, ExitCode, Schedule, URIO, ZHub, console}
object StringClient extends App {
  type Host = String
  override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = {
    val program = for {
      responseHub <-
        ZHub.sliding[(Routing[Host], String)](20)
      responseQueue = responseHub.toQueue
      requestHub <- ZHub.sliding[(Host, String)](20)
      _ <- ZStream.fromHub(requestHub).run(ZSink.foreach(result => console.putStrLn(result.toString))).forkDaemon
      ex <- ConnectorTracker[Host]
      _ <- ex.changes.run(ZSink.foreach(keys => console.putStrLn(keys.toString()))).forkDaemon
      _ <- (console.getStrLn.flatMap(line => responseQueue.offer(ALL -> line))).forever.forkDaemon
      connector <- Connector.strings[Host, String, Long](Set("localhost"),
        addr => TCP.fromSocketClient(8888, addr),
        ex,
        responseHub,
        requestHub.toQueue,
        reconnector = Schedule.spaced(1.second)
      )
    }
    yield ()
    program.exitCode
  }
}See the test cases for further examples
still to be implemented
- TLS