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); }
/// <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); }
public Task <StreamMetadataResult> Invoke(IStreamStore streamStore, CancellationToken ct) => streamStore.GetStreamMetadata(StreamId, ct);
public Task <StreamMetadataResult> GetStreamMetadata(string streamId, CancellationToken cancellationToken = new CancellationToken()) { return(_store.GetStreamMetadata(streamId, cancellationToken)); }