protected override ClusterSubscription CreateSubscription()
 {
     return(new ClusterSubscription(
                ClientAddPartitionLostListenerCodec.EncodeRequest(_isSmart),
                (message, state) => ClientAddPartitionLostListenerCodec.DecodeResponse(message).Response,
                (id, state) => ClientRemovePartitionLostListenerCodec.EncodeRequest(id),
                (message, state) => ClientRemovePartitionLostListenerCodec.DecodeResponse(message).Response,
                (message, state) => ClientAddPartitionLostListenerCodec.HandleEventAsync(message, HandleInternal, LoggerFactory)));
 }
        internal Guid AddPartitionLostListener(IPartitionLostListener partitionLostListener)
        {
            CheckNotNull(partitionLostListener, NullListenerIsNotAllowed);
            var request = ClientAddPartitionLostListenerCodec.EncodeRequest(_isSmart);

            void HandlePartitionLostEvent(int partitionId, int lostBackupCount, Guid source)
            {
                var member = _client.ClusterService.GetMember(source);

                partitionLostListener.PartitionLost(new PartitionLostEvent(partitionId, lostBackupCount, member.Address));
            }

            void EventHandler(ClientMessage eventMessage) =>
            ClientAddPartitionLostListenerCodec.EventHandler.HandleEvent(eventMessage, HandlePartitionLostEvent);

            Guid ResponseDecoder(ClientMessage response) => ClientAddPartitionLostListenerCodec.DecodeResponse(response).Response;

            ClientMessage EncodeDeregisterRequest(Guid registrationId) =>
            ClientRemovePartitionLostListenerCodec.EncodeRequest(registrationId);

            return(_client.ListenerService.RegisterListener(request, ResponseDecoder, EncodeDeregisterRequest, EventHandler));
        }