package io.muoncore.protocol.introspection.client; import io.muoncore.Discovery; import io.muoncore.channel.ChannelConnection; import io.muoncore.codec.Codecs; import io.muoncore.config.AutoConfiguration; import io.muoncore.descriptors.ServiceExtendedDescriptor; import io.muoncore.message.MuonInboundMessage; import io.muoncore.message.MuonMessage; import io.muoncore.message.MuonMessageBuilder; import io.muoncore.message.MuonOutboundMessage; import static io.muoncore.protocol.introspection.server.IntrospectionServerProtocolStack.PROTOCOL; public class IntrospectClientProtocol<X,R> { public static final String INTROSPECTION_REQUESTED = "introspectionRequested"; private Codecs codecs; public IntrospectClientProtocol( String serviceName, AutoConfiguration config, final ChannelConnection<ServiceExtendedDescriptor, String> leftChannelConnection, final ChannelConnection<MuonOutboundMessage, MuonInboundMessage> rightChannelConnection, final Codecs codecs, final Discovery discovery) { rightChannelConnection.receive( message -> { if (message == null) { leftChannelConnection.shutdown(); return; } ServiceExtendedDescriptor descript = codecs.decode(message.getPayload(), message.getContentType(), ServiceExtendedDescriptor.class); leftChannelConnection.send(descript); }); leftChannelConnection.receive(request -> { if (request == null) { rightChannelConnection.shutdown(); return; } Codecs.EncodingResult result = codecs.encode(new Object(), discovery.getCodecsForService(serviceName)); MuonOutboundMessage msg = MuonMessageBuilder .fromService(config.getServiceName()) .step(INTROSPECTION_REQUESTED) .protocol(PROTOCOL) .toService(serviceName) .payload(result.getPayload()) .contentType(result.getContentType()) .status(MuonMessage.Status.success) .build(); rightChannelConnection.send(msg); }); /** * handle 404. * handle local timeout. * * */ } }