private ClientMessage.ReadStreamEventsForwardCompleted ReadStreamEventsForward(ClientMessage.ReadStreamEventsForward msg) { var lastCommitPosition = _readIndex.LastCommitPosition; try { if (msg.ValidationStreamVersion.HasValue && _readIndex.GetLastStreamEventNumber(msg.EventStreamId) == msg.ValidationStreamVersion) { return(NoData(msg, ReadStreamResult.NotModified, lastCommitPosition)); } 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, exc.Message)); } }