public static void Insert <TResponse>(IProtocolRequest <TResponse> request, AuthenticationContext authenticationContext)
     where TResponse : IProtocolResponse
 {
     lock (_lock)
     {
         _authenticationContexts.Add(request.GetHashCode(), authenticationContext);
     }
 }
        public static AuthenticationContext Get <TResponse>(IProtocolRequest <TResponse> request)
            where TResponse : IProtocolResponse
        {
            lock (_lock)
            {
                if (_authenticationContexts.TryGetValue(request.GetHashCode(), out AuthenticationContext context))
                {
                    return(context);
                }

                return(null);
            }
        }
        public TResponse Execute <TResponse>(IProtocolRequest <TResponse> request)
            where TResponse : class, IProtocolResponse, new()
        {
            if (_connection == null)
            {
                throw new ConnectionRequiredException();
            }

            MessageHeadersDictionary headers = new MessageHeadersDictionary();

            byte[] requestHeaders    = ProtocolMessageHeaderSerializer.Serialize(headers);
            byte[] requestBody       = ProtocolBodySerializer.Serialize(request);
            byte[] requestIdentifier = _encoder.Encode(request.GetIdentifier());
            IList <ArraySegment <byte> > serializedRequest = ProtocolSerializer.Serialize(requestIdentifier, requestHeaders, requestBody);

            byte[] responseEncoded = _connection.Send(serializedRequest);

            var    deserializedObject = ProtocolSerializer.Deserialize(responseEncoded);
            string expectedIdentifier = new TResponse().GetIdentifier();
            string identifier         = _encoder.Decode(deserializedObject.ControlCommand);

            if (identifier != expectedIdentifier)
            {
                if (identifier == ErrorResponse.Identifier)
                {
                    ErrorResponse errorResponse = ProtocolBodySerializer.Deserialize <ErrorResponse>(deserializedObject.Body);
                    throw new CustomException(errorResponse.Message);
                }

                throw new InvalidResponseException();
            }

            TResponse response = ProtocolBodySerializer.Deserialize <TResponse>(deserializedObject.Body);

            return(response);
        }
 public Task <TResponse> ExecuteAsync <TResponse>(IProtocolRequest <TResponse> request)
     where TResponse : class, IProtocolResponse, new()
 {
     throw new NotImplementedException();
 }