< Summary

Information
Class: Elsa.Diagnostics.ConsoleLogs.Services.ElsaConsoleLogProvider
Assembly: Elsa.Diagnostics.ConsoleLogs
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.ConsoleLogs/Services/ElsaConsoleLogProvider.cs
Line coverage
75%
Covered lines: 37
Uncovered lines: 12
Coverable lines: 49
Total lines: 110
Line coverage: 75.5%
Branch coverage
70%
Covered branches: 21
Total branches: 30
Branch coverage: 70%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.cctor()100%11100%
PublishAsync(...)100%11100%
GetRecentAsync()100%22100%
SubscribeAsync()70%151062.5%
ListSourcesAsync(...)100%210%
Dispose()0%2040%
DisposeAsync()50%7440%
Enrich(...)100%44100%
HasMetadataFilter(...)100%11100%
MatchesMetadata(...)100%66100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.ConsoleLogs/Services/ElsaConsoleLogProvider.cs

#LineLine coverage
 1using ConsoleLogStreaming.Core;
 2
 3namespace Elsa.Diagnostics.ConsoleLogs.Services;
 4
 95internal sealed class ElsaConsoleLogProvider(
 96    IConsoleLogProvider inner,
 97    IConsoleLogContextAccessor contextAccessor,
 98    ElsaConsoleLogRecentBuffer recentBuffer) : IConsoleLogProvider, IDisposable, IAsyncDisposable
 9{
 110    private static readonly IReadOnlyDictionary<string, string> EmptyMetadataFilter = new Dictionary<string, string>();
 11
 12    public ValueTask PublishAsync(ConsoleLogLine line, CancellationToken cancellationToken = default)
 13    {
 714        var enrichedLine = Enrich(line);
 715        recentBuffer.Add(enrichedLine);
 716        return inner.PublishAsync(enrichedLine, cancellationToken);
 17    }
 18
 19    public async ValueTask<RecentConsoleLogsResult> GetRecentAsync(ConsoleLogFilter filter, CancellationToken cancellati
 20    {
 721        if (!HasMetadataFilter(filter))
 222            return await inner.GetRecentAsync(filter, cancellationToken);
 23
 524        var result = await inner.GetRecentAsync(filter with
 525        {
 526            Metadata = EmptyMetadataFilter
 527        }, cancellationToken);
 528        var items = recentBuffer.Query(filter);
 29
 530        return result with { Items = items };
 731    }
 32
 33    public async IAsyncEnumerable<ConsoleLogStreamingItem> SubscribeAsync(
 34        ConsoleLogFilter filter,
 35        [EnumeratorCancellation] CancellationToken cancellationToken = default)
 36    {
 137        if (!HasMetadataFilter(filter))
 38        {
 039            await foreach (var item in inner.SubscribeAsync(filter, cancellationToken).ConfigureAwait(false))
 040                yield return item;
 41
 042            yield break;
 43        }
 44
 645        await foreach (var item in inner.SubscribeAsync(filter with { Metadata = EmptyMetadataFilter }, cancellationToke
 46        {
 247            if (item.Line != null && !MatchesMetadata(item.Line, filter.Metadata))
 48                continue;
 49
 150            yield return item;
 51        }
 152    }
 53
 54    public ValueTask<IReadOnlyCollection<ConsoleLogSource>> ListSourcesAsync(CancellationToken cancellationToken = defau
 55    {
 056        return inner.ListSourcesAsync(cancellationToken);
 57    }
 58
 59    public void Dispose()
 60    {
 061        switch (inner)
 62        {
 63            case IDisposable disposable:
 064                disposable.Dispose();
 065                break;
 66            case IAsyncDisposable asyncDisposable:
 067                asyncDisposable.DisposeAsync().AsTask().GetAwaiter().GetResult();
 68                break;
 69        }
 070    }
 71
 72    public async ValueTask DisposeAsync()
 73    {
 974        switch (inner)
 75        {
 76            case IAsyncDisposable asyncDisposable:
 077                await asyncDisposable.DisposeAsync();
 078                break;
 79            case IDisposable disposable:
 080                disposable.Dispose();
 81                break;
 82        }
 983    }
 84
 85    private ConsoleLogLine Enrich(ConsoleLogLine line)
 86    {
 787        var ambientMetadata = contextAccessor.GetMetadata();
 788        if (ambientMetadata.Count == 0)
 489            return line;
 90
 391        var metadata = new Dictionary<string, string>(line.Metadata, StringComparer.OrdinalIgnoreCase);
 1292        foreach (var item in ambientMetadata)
 393            metadata[item.Key] = item.Value;
 94
 395        return line with { Metadata = metadata };
 96    }
 97
 898    private static bool HasMetadataFilter(ConsoleLogFilter filter) => filter.Metadata.Count > 0;
 99
 100    private static bool MatchesMetadata(ConsoleLogLine line, IReadOnlyDictionary<string, string> metadata)
 101    {
 7102        foreach (var (key, value) in metadata)
 103        {
 2104            if (!line.Metadata.TryGetValue(key, out var candidate) || !string.Equals(candidate, value, StringComparison.
 1105                return false;
 106        }
 107
 1108        return true;
 1109    }
 110}