package it.cavallium.dbengine.database.remote; import io.netty.handler.codec.ByteToMessageCodec; import java.util.function.Supplier; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks.Empty; import reactor.netty.NettyOutbound; public class MappedStream implements AutoCloseable { private final Flux inConn; private final NettyOutbound outConn; private final Supplier> outCodec; private final Empty streamTerminator; public MappedStream(NettyOutbound outConn, Supplier> outCodec, Flux inConn, Empty streamTerminator) { this.inConn = inConn; this.outConn = outConn; this.outCodec = outCodec; this.streamTerminator = streamTerminator; } private NettyOutbound getOut() { return outConn.withConnection(conn -> conn.addHandler(outCodec.get())); } public Mono send(SEND item) { return getOut().sendObject(item).then(); } public Mono sendMany(Flux items) { return getOut().sendObject(items).then(); } public Mono receive() { return inConn.take(1, true).singleOrEmpty(); } public Flux receiveMany() { return inConn.hide(); } @Override public void close() { streamTerminator.tryEmitEmpty(); } }