Exemple #1
0
        private async Task <FastForwardResult> FastForward(IStreamStore from, IStreamStore to, string branchId)
        {
            var fastForwardResult = new FastForwardResult();
            var page = await from.ListStreams();

            while (page.StreamIds.Length > 0)
            {
                foreach (var s in page.StreamIds.Where(x => x.StartsWith(branchId)))
                {
                    var localPosition = await from.LastPosition(s);

                    var remotePosition = await to.LastPosition(s);

                    if (localPosition == remotePosition)
                    {
                        continue;
                    }

                    var eventPage = await from.ReadStreamForwards(s, Math.Max(remotePosition + 1, 0), Configuration.BatchSize);

                    var appendMessages = new List <NewStreamMessage>();

                    if (eventPage.Messages.Length == 0 && localPosition >= ExpectedVersion.EmptyStream)
                    {
                        await to.AppendToStream(s, remotePosition, appendMessages.ToArray());
                    }

                    var metadata = await from.GetStreamMetadata(s);

                    await to.SetStreamMetadata(s, ExpectedVersion.Any, metadata.MaxAge, metadata.MaxCount, metadata.MetadataJson);

                    while (eventPage.Messages.Length > 0)
                    {
                        appendMessages.Clear();
                        foreach (var m in eventPage.Messages)
                        {
                            var payload = await m.GetJsonData();

                            var message = new NewStreamMessage(m.MessageId, m.Type, payload, m.JsonMetadata);
                            appendMessages.Add(message);
                        }

                        var result = await to.AppendToStream(s, remotePosition, appendMessages.ToArray());

                        fastForwardResult.NumberOfMessages += result.CurrentVersion - Math.Max(remotePosition, ExpectedVersion.EmptyStream);
                        eventPage = await eventPage.ReadNext();
                    }

                    fastForwardResult.NumberOfStreams++;
                }

                page = await page.Next();
            }

            fastForwardResult.ResultStatus = Status.Success;

            return(fastForwardResult);
        }
Exemple #2
0
        /// <summary>
        /// Enrich the stream from store
        /// </summary>
        /// <remarks>
        /// <para/>
        /// Null if stream exists but some of the ancestors do not
        /// </remarks>
        /// <param name="streamStore">Stream store</param>
        /// <param name="key">Stream key</param>
        /// <param name="serializer">Serializer</param>
        /// <returns>Stream info</returns>
        public static async Task <IStream> GetStream(
            this IStreamStore streamStore, string key, ISerializer <IEvent> serializer)
        {
            var metadata = await streamStore.GetStreamMetadata(key);

            var stream = serializer.DecodeStreamMetadata(metadata.MetadataJson);

            if (stream == null)
            {
                return(new Stream(key));
            }

            var count = await streamStore.DeletedCount(key);

            stream.AddDeleted(count);

            var parent = stream.Parent;

            while (parent != null && parent.Version > ExpectedVersion.EmptyStream)
            {
                var parentMetadata = await streamStore.GetStreamMetadata(parent.Key);

                if (parentMetadata == null)
                {
                    return(null);
                }

                count = await streamStore.DeletedCount(parent.Key);

                parent.AddDeleted(count);

                var grandParent = serializer.DecodeStreamMetadata(parentMetadata.MetadataJson)?.Parent;

                parent.Parent = grandParent;
                parent        = grandParent;
            }

            return(stream);
        }
Exemple #3
0
 public Task <StreamMetadataResult> Invoke(IStreamStore streamStore, CancellationToken ct)
 => streamStore.GetStreamMetadata(StreamId, ct);
Exemple #4
0
 public Task <StreamMetadataResult> GetStreamMetadata(string streamId, CancellationToken cancellationToken = new CancellationToken())
 {
     return(_store.GetStreamMetadata(streamId, cancellationToken));
 }