package io.muoncore.transport.client;
import io.muoncore.channel.Channel;
import io.muoncore.channel.ChannelConnection;
import io.muoncore.channel.Channels;
import io.muoncore.message.MuonInboundMessage;
import io.muoncore.message.MuonOutboundMessage;
import io.muoncore.transport.MuonTransport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Optional;
public class DefaultTransportConnectionProvider implements TransportConnectionProvider {
private Logger logger = LoggerFactory.getLogger(DefaultTransportConnectionProvider.class);
private List<MuonTransport> transports;
public DefaultTransportConnectionProvider(List<MuonTransport> transports) {
this.transports = transports;
}
public ChannelConnection<MuonOutboundMessage, MuonInboundMessage> connectChannel(
String service,
String protocol, ChannelConnection.ChannelFunction<MuonInboundMessage> inbound) {
Optional<MuonTransport> transport = transports.stream().filter(tr -> tr.canConnectToService(service)).findFirst();
if (transport.isPresent()) {
Channel<MuonOutboundMessage, MuonInboundMessage> zipChannel = Channels.zipChannel("client");
ChannelConnection<MuonOutboundMessage, MuonInboundMessage> connection = transport.get().openClientChannel(service, protocol);
Channels.connect(connection, zipChannel.right());
zipChannel.left().receive(inbound);
return zipChannel.left();
} else {
logger.warn("Can't find transport that can reach service " + service);
return null;
}
}
}