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.SchemasDescriptor;
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 io.muoncore.protocol.introspection.SchemaIntrospectionRequest;
import static io.muoncore.protocol.introspection.server.IntrospectionServerProtocolStack.PROTOCOL;
public class IntrospectSchemasClientProtocol<X, R> {
public static final String SCHEMA_INTROSPECTION_REQUESTED = "schemaIntrospection";
private Codecs codecs;
public IntrospectSchemasClientProtocol(
String serviceName,
AutoConfiguration config,
final ChannelConnection<SchemasDescriptor, SchemaIntrospectionRequest> leftChannelConnection,
final ChannelConnection<MuonOutboundMessage, MuonInboundMessage> rightChannelConnection,
final Codecs codecs,
final Discovery discovery) {
rightChannelConnection.receive(message -> {
if (message == null) {
leftChannelConnection.shutdown();
return;
}
SchemasDescriptor descript = codecs.decode(message.getPayload(), message.getContentType(), SchemasDescriptor.class);
leftChannelConnection.send(descript);
});
leftChannelConnection.receive(request -> {
if (request == null) {
rightChannelConnection.shutdown();
return;
}
Codecs.EncodingResult result = codecs.encode(request,
discovery.getCodecsForService(serviceName));
MuonOutboundMessage msg = MuonMessageBuilder
.fromService(config.getServiceName())
.step(SCHEMA_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.
*
*
*/
}
}