private ClientMessage.ReadStreamEventsForwardCompleted ReadStreamEventsForward(ClientMessage.ReadStreamEventsForward msg) { using (HistogramService.Measure(_readerStreamRangeHistogram)) { var lastCommitPosition = _readIndex.LastReplicatedPosition; try { if (msg.MaxCount > MaxPageSize) { throw new ArgumentException(string.Format("Read size too big, should be less than {0} items", MaxPageSize)); } if (msg.ValidationStreamVersion.HasValue && _readIndex.GetStreamLastEventNumber(msg.EventStreamId) == msg.ValidationStreamVersion) { return(NoData(msg, ReadStreamResult.NotModified, lastCommitPosition, msg.ValidationStreamVersion.Value)); } var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User); if (!access.Granted) { return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition)); } var result = _readIndex.ReadStreamEventsForward(msg.EventStreamId, msg.FromEventNumber, msg.MaxCount); CheckEventsOrder(msg, result); var resolvedPairs = ResolveLinkToEvents(result.Records, msg.ResolveLinkTos, msg.User); if (resolvedPairs == null) { return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition)); } return(new ClientMessage.ReadStreamEventsForwardCompleted( msg.CorrelationId, msg.EventStreamId, msg.FromEventNumber, msg.MaxCount, (ReadStreamResult)result.Result, resolvedPairs, result.Metadata, access.Public, string.Empty, result.NextEventNumber, result.LastEventNumber, result.IsEndOfStream, lastCommitPosition)); } catch (Exception exc) { Log.ErrorException(exc, "Error during processing ReadStreamEventsForward request."); return(NoData(msg, ReadStreamResult.Error, lastCommitPosition, error: exc.Message)); } } }
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 ClientMessage.ReadStreamEventsForwardCompleted ReadStreamEventsForward(ClientMessage.ReadStreamEventsForward msg) { var lastCommitPosition = _readIndex.LastCommitPosition; try { if (msg.ValidationStreamVersion.HasValue && _readIndex.GetStreamLastEventNumber(msg.EventStreamId) == msg.ValidationStreamVersion) { return(NoData(msg, ReadStreamResult.NotModified, lastCommitPosition, msg.ValidationStreamVersion.Value)); } var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User); if (!access.Granted) { return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition)); } var result = _readIndex.ReadStreamEventsForward(msg.EventStreamId, msg.FromEventNumber, msg.MaxCount); CheckEventsOrder(msg, result); var resolvedPairs = ResolveLinkToEvents(result.Records, msg.ResolveLinkTos, msg.User); if (resolvedPairs == null) { return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition)); } return(new ClientMessage.ReadStreamEventsForwardCompleted( msg.CorrelationId, msg.EventStreamId, msg.FromEventNumber, msg.MaxCount, (ReadStreamResult)result.Result, resolvedPairs, result.Metadata, access.Public, string.Empty, result.NextEventNumber, result.LastEventNumber, result.IsEndOfStream, lastCommitPosition)); } catch (Exception exc) { Log.ErrorException(exc, "Error during processing ReadStreamEventsForward request."); return(NoData(msg, ReadStreamResult.Error, lastCommitPosition, error: exc.Message)); } }
public long GetStreamLastEventNumber(TStreamId streamId) => _readIndex.GetStreamLastEventNumber(streamId);
public static long GetStreamLastEventNumber <TStreamId>(this IReadIndex <TStreamId> self, string streamName) { var streamId = self.GetStreamId(streamName); return(self.GetStreamLastEventNumber(streamId)); }