package io.muoncore.protocol.requestresponse.client; import io.muoncore.channel.ChannelConnection; import io.muoncore.channel.impl.TimeoutChannel; import io.muoncore.channel.support.Scheduler; import io.muoncore.codec.Codecs; import io.muoncore.message.MuonInboundMessage; import io.muoncore.message.MuonOutboundMessage; import io.muoncore.protocol.requestresponse.RRPEvents; import io.muoncore.protocol.requestresponse.RRPTransformers; import io.muoncore.protocol.requestresponse.Request; import io.muoncore.protocol.requestresponse.Response; import io.muoncore.transport.TransportEvents; /** * Request Response client middleware protocol. * <p> * Add reliability, timeout etc. */ public class RequestResponseClientProtocol { private Codecs codecs; private Scheduler timer; private Scheduler.TimerControl localTimeoutEvent; public RequestResponseClientProtocol( String serviceName, final ChannelConnection<Response, Request> leftChannelConnection, final ChannelConnection<MuonOutboundMessage, MuonInboundMessage> rightChannelConnection, final Codecs codecs, final Scheduler timer) { rightChannelConnection.receive(message -> { if (message == null) { leftChannelConnection.shutdown(); return; } switch (message.getStep()) { case RRPEvents.RESPONSE: leftChannelConnection.send( RRPTransformers.toResponse(message, codecs)); break; case RRPEvents.RESPONSE_FAILED: leftChannelConnection.send( RRPTransformers.toResponse(message, codecs)); break; case TransportEvents.SERVICE_NOT_FOUND: Codecs.EncodingResult encoded = codecs.encode("No such service " + message.getSourceServiceName(), codecs.getAvailableCodecs()); leftChannelConnection.send( new Response( 404, encoded.getPayload(), encoded.getContentType(), codecs)); break; case TimeoutChannel.TIMEOUT_STEP: encoded = codecs.encode("Client timeout, no data received from the remote", codecs.getAvailableCodecs()); leftChannelConnection.send( new Response( 408, encoded.getPayload(), encoded.getContentType(), codecs)); break; case TransportEvents.CONNECTION_FAILURE: encoded = codecs.encode("The channel has failed, no data received from the remote and the connection is now broken", codecs.getAvailableCodecs()); leftChannelConnection.send( new Response( 408, encoded.getPayload(), encoded.getContentType(), codecs)); break; default: Codecs.EncodingResult encoded500 = codecs.encode("Unknown error sending to " + message.getSourceServiceName(), codecs.getAvailableCodecs()); leftChannelConnection.send( new Response( 500, encoded500.getPayload(), encoded500.getContentType(), codecs)); } }); leftChannelConnection.receive(request -> { if (request == null) { rightChannelConnection.shutdown(); return; } rightChannelConnection.send(RRPTransformers.toOutbound( serviceName, request, codecs, codecs.getAvailableCodecs())); }); /** * handle 404. * handle local timeout. * * */ } }