< Summary

Information
Class: Elsa.Diagnostics.ConsoleLogs.RealTime.ElsaConsoleLogsHub
Assembly: Elsa.Diagnostics.ConsoleLogs
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.ConsoleLogs/RealTime/ElsaConsoleLogsHub.cs
Line coverage
73%
Covered lines: 19
Uncovered lines: 7
Coverable lines: 26
Total lines: 86
Line coverage: 73%
Branch coverage
58%
Covered branches: 7
Total branches: 12
Branch coverage: 58.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
StreamAsync()50%2280%
SubscribeAsync()100%11100%
UpdateFilterAsync()100%1133.33%
UnsubscribeAsync()100%11100%
OnDisconnectedAsync()100%210%
ValidateFilter(...)50%9875%
EnsureCanReadAsync()100%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.ConsoleLogs/RealTime/ElsaConsoleLogsHub.cs

#LineLine coverage
 1using ConsoleLogStreaming.Core;
 2using Elsa.Diagnostics.ConsoleLogs.Services;
 3using Microsoft.AspNetCore.Authorization;
 4using Microsoft.AspNetCore.SignalR;
 5
 6namespace Elsa.Diagnostics.ConsoleLogs.RealTime;
 7
 8/// <summary>
 9/// SignalR hub for live Elsa console log streaming.
 10/// </summary>
 11[Authorize]
 812public sealed class ElsaConsoleLogsHub(
 813    IConsoleLogProvider provider,
 814    IElsaConsoleLogHubAuthorizer authorizer,
 815    ElsaConsoleLogSubscriptionManager subscriptionManager) : Hub<IElsaConsoleLogsClient>
 16{
 17    /// <summary>
 18    /// Streams matching console log items as a SignalR streaming method.
 19    /// </summary>
 20    public async IAsyncEnumerable<ConsoleLogStreamingItem> StreamAsync(
 21        ElsaConsoleLogFilter? filter,
 22        [EnumeratorCancellation] CancellationToken cancellationToken)
 23    {
 224        await EnsureCanReadAsync(cancellationToken).ConfigureAwait(false);
 225        filter = ValidateFilter(filter);
 26
 427        await foreach (var item in provider.SubscribeAsync(ConsoleLogFilterMapper.ToStreamingFilter(filter), cancellatio
 028            yield return item;
 229    }
 30
 31    /// <summary>
 32    /// Starts pushing stream items to the caller through typed client methods.
 33    /// </summary>
 34    public async Task SubscribeAsync(ElsaConsoleLogFilter? filter)
 35    {
 536        await EnsureCanReadAsync(Context.ConnectionAborted).ConfigureAwait(false);
 437        await subscriptionManager.SubscribeAsync(Context.ConnectionId, ValidateFilter(filter), Context.ConnectionAborted
 438    }
 39
 40    /// <summary>
 41    /// Replaces the current pushed subscription filter.
 42    /// </summary>
 43    public async Task UpdateFilterAsync(ElsaConsoleLogFilter? filter)
 44    {
 145        await EnsureCanReadAsync(Context.ConnectionAborted).ConfigureAwait(false);
 046        await subscriptionManager.UpdateFilterAsync(Context.ConnectionId, ValidateFilter(filter), Context.ConnectionAbor
 047    }
 48
 49    /// <summary>
 50    /// Stops the current pushed subscription.
 51    /// </summary>
 52    public Task UnsubscribeAsync()
 53    {
 154        return subscriptionManager.UnsubscribeAsync(Context.ConnectionId);
 55    }
 56
 57    /// <inheritdoc />
 58    public override async Task OnDisconnectedAsync(Exception? exception)
 59    {
 060        await UnsubscribeAsync().ConfigureAwait(false);
 061        await base.OnDisconnectedAsync(exception).ConfigureAwait(false);
 062    }
 63
 64    private static ElsaConsoleLogFilter ValidateFilter(ElsaConsoleLogFilter? filter)
 65    {
 666        filter ??= new();
 67
 668        if (filter.From is { } from && filter.To is { } to && from > to)
 069            throw new HubException("The console log filter 'from' timestamp must be earlier than or equal to 'to'.");
 70
 671        return filter;
 72    }
 73
 74    private async ValueTask EnsureCanReadAsync(CancellationToken cancellationToken)
 75    {
 876        if (!await authorizer.CanReadAsync(Context, cancellationToken).ConfigureAwait(false))
 277            throw new HubException("Access denied.");
 678    }
 79}
 80
 81public interface IElsaConsoleLogsClient
 82{
 83    Task ReceiveConsoleLogLineAsync(ConsoleLogLine line, CancellationToken cancellationToken = default);
 84    Task ReceiveDroppedLinesAsync(ConsoleLogDroppedSummary summary, CancellationToken cancellationToken = default);
 85    Task ReceiveSourceChangedAsync(ConsoleLogSource source, CancellationToken cancellationToken = default);
 86}