package io.muoncore.transport.client;
import io.muoncore.Discovery;
import io.muoncore.channel.Channel;
import io.muoncore.channel.ChannelConnection;
import io.muoncore.channel.Channels;
import io.muoncore.codec.Codecs;
import io.muoncore.config.AutoConfiguration;
import io.muoncore.message.MuonInboundMessage;
import io.muoncore.message.MuonMessage;
import io.muoncore.message.MuonOutboundMessage;
import io.muoncore.transport.*;
import io.muoncore.transport.sharedsocket.client.SharedSocketRoute;
import io.muoncore.transport.sharedsocket.client.SharedSocketRouter;
import org.reactivestreams.Publisher;
import reactor.core.Dispatcher;
import java.util.List;
import java.util.function.Predicate;
/**
* Transport layer control
*/
public class MultiTransportClient implements TransportClient, TransportControl {
private List<MuonTransport> transports;
private TransportMessageDispatcher taps;
private Dispatcher dispatcher = new RingBufferLocalDispatcher("transportDispatch", 8192);
private AutoConfiguration configuration;
private SharedSocketRouter sharedSocketRouter;
private Discovery discovery;
private TransportConnectionProvider transportConnectionProvider;
public MultiTransportClient(
List<MuonTransport> transports,
TransportMessageDispatcher taps,
AutoConfiguration config,
Discovery discovery, Codecs codecs) {
this.transports = transports;
this.taps = taps;
this.configuration = config;
this.discovery = discovery;
transportConnectionProvider = new DefaultTransportConnectionProvider(transports);
this.sharedSocketRouter = new SharedSocketRouter(serviceName -> {
return new SharedSocketRoute(serviceName, transportConnectionProvider, codecs, configuration);
});
}
@Override
public ChannelConnection<MuonOutboundMessage, MuonInboundMessage> openClientChannel() {
Channel<MuonOutboundMessage, MuonInboundMessage> tapChannel = Channels.wiretapChannel(taps);
Channels.connect(
tapChannel.right(),
new MultiTransportClientChannelConnection(dispatcher, sharedSocketRouter, discovery, transportConnectionProvider));
return tapChannel.left();
}
@Override
public void shutdown() {
for (MuonTransport transport: transports) {
transport.shutdown();
}
taps.shutdown();
}
@Override
public Publisher<MuonMessage> tap(Predicate<MuonMessage> msg) {
return taps.observe(msg);
}
}