package io.ripc.rx.protocol.tcp; import io.ripc.protocol.tcp.TcpConnection; import io.ripc.protocol.tcp.TcpHandler; import io.ripc.protocol.tcp.TcpServer; import org.reactivestreams.Publisher; import rx.RxReactiveStreams; public final class RxTcpServer<R, W> { private final TcpServer<R, W> transport; private RxTcpServer(final TcpServer<R, W> transport) { this.transport = transport; } public RxTcpServer<R, W> start(final RxTcpHandler<R, W> handler) { transport.start(new TcpHandler<R, W>() { @Override public Publisher<Void> handle(TcpConnection<R, W> connection) { return RxReactiveStreams.toPublisher(handler.handle(RxConnection.create(connection))); } }); return this; } public void startAndAwait(RxTcpHandler<R, W> handler) { start(handler); transport.awaitShutdown(); } public final boolean shutdown() { return transport.shutdown(); } public void awaitShutdown() { transport.awaitShutdown(); } public int getPort() { return transport.getPort(); } public static <R, W> RxTcpServer<R, W> create(TcpServer<R, W> transport) { return new RxTcpServer<>(transport); } }