/// <summary> /// Enrich the stream from store /// </summary> /// <remarks> /// <para/> /// Null if stream exists but some of the ancestors do not /// </remarks> /// <param name="connection">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 IEventStoreConnection connection, string key, ISerializer <IEvent> serializer) { var metadata = await connection.GetStreamMetadataAsync(key); var stream = serializer.DecodeStreamMetadata(metadata.StreamMetadata.AsJsonString()); if (stream == null) { return(new Stream(key)); } var count = await connection.DeletedCount(key); stream.AddDeleted(count); var parent = stream.Parent; while (parent != null && parent.Version > ExpectedVersion.EmptyStream) { var parentMetadata = await connection.GetStreamMetadataAsync(parent.Key); if (parentMetadata.StreamMetadata == null) { return(null); } count = await connection.DeletedCount(parent.Key); parent.AddDeleted(count); var grandParent = serializer.DecodeStreamMetadata(parentMetadata.StreamMetadata.AsJsonString())?.Parent; parent.Parent = grandParent; parent = grandParent; } return(stream); }