Esempio n. 1
0
        public void Handle(ClientMessage.ConnectToPersistentSubscription message)
        {
            if (!_started)
            {
                return;
            }
            var streamAccess = _readIndex.CheckStreamAccess(
                message.EventStreamId, StreamAccessType.Read, message.User);

            if (!streamAccess.Granted)
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.AccessDenied));
                return;
            }

            List <PersistentSubscription> subscribers;

            if (!_subscriptionTopics.TryGetValue(message.EventStreamId, out subscribers))
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.NotFound));
                return;
            }

            var key = BuildSubscriptionGroupKey(message.EventStreamId, message.SubscriptionId);
            PersistentSubscription subscription;

            if (!_subscriptionsById.TryGetValue(key, out subscription))
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.NotFound));
                return;
            }

            if (subscription.HasReachedMaxClientCount)
            {
                message.Envelope.ReplyWith(new ClientMessage.SubscriptionDropped(message.CorrelationId,
                                                                                 SubscriptionDropReason.SubscriberMaxCountReached));
                return;
            }

            Log.Debug("New connection to persistent subscription {subscriptionKey} by {connectionId}", key,
                      message.ConnectionId);
            var lastEventNumber   = _readIndex.GetStreamLastEventNumber(message.EventStreamId);
            var lastCommitPos     = _readIndex.LastIndexedPosition;
            var subscribedMessage =
                new ClientMessage.PersistentSubscriptionConfirmation(key, message.CorrelationId, lastCommitPos,
                                                                     lastEventNumber);

            message.Envelope.ReplyWith(subscribedMessage);
            var name = message.User == null ? "anonymous" : message.User.Identity.Name;

            subscription.AddClient(message.CorrelationId, message.ConnectionId, message.ConnectionName, message.Envelope,
                                   message.AllowedInFlightMessages, name, message.From);
        }
 private void HandleAsNonMaster(ClientMessage.ConnectToPersistentSubscription message)
 {
     if (_master == null)
     {
         DenyRequestBecauseNotReady(message.Envelope, message.CorrelationId);
     }
     else
     {
         DenyRequestBecauseNotMaster(message.CorrelationId, message.Envelope);
     }
 }
Esempio n. 3
0
        protected override TcpPackage CreateSubscriptionPackage()
        {
            var dto = new ClientMessage.ConnectToPersistentSubscription(_groupName, _streamId, _bufferSize);

            return(new TcpPackage(TcpCommand.ConnectToPersistentSubscription,
                                  _userCredentials != null ? TcpFlags.Authenticated : TcpFlags.None,
                                  _correlationId,
                                  _userCredentials != null ? _userCredentials.Username : null,
                                  _userCredentials != null ? _userCredentials.Password : null,
                                  dto.Serialize()));
        }