< Summary

Information
Class: Elsa.Workflows.Runtime.BookmarkQueueSignaler
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/BookmarkQueueSignaler.cs
Line coverage
100%
Covered lines: 21
Uncovered lines: 0
Coverable lines: 21
Total lines: 59
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
.ctor(...)100%11100%
AwaitAsync(...)100%11100%
TriggerAsync(...)100%11100%
TriggerAsync(...)100%11100%
Release(...)100%11100%
GetChannel(...)100%22100%
CurrentTenantId()100%22100%
CreateChannel()100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/BookmarkQueueSignaler.cs

#LineLine coverage
 1using System.Collections.Concurrent;
 2using System.Threading.Channels;
 3using Elsa.Common.Multitenancy;
 4
 5namespace Elsa.Workflows.Runtime;
 6
 7public class BookmarkQueueSignaler : IBookmarkQueueSignaler
 8{
 2419    private readonly ConcurrentDictionary<string, Channel<object?>> _channels = new();
 10    private readonly ITenantAccessor? _tenantAccessor;
 11
 112    public BookmarkQueueSignaler()
 13    {
 114    }
 15
 24016    public BookmarkQueueSignaler(ITenantAccessor tenantAccessor)
 17    {
 24018        _tenantAccessor = tenantAccessor;
 24019    }
 20
 21    public Task AwaitAsync(CancellationToken cancellationToken = default)
 22    {
 48923        return GetChannel().Reader.ReadAsync(cancellationToken).AsTask();
 24    }
 25
 26    public Task TriggerAsync(CancellationToken cancellationToken = default)
 27    {
 132928        return TriggerAsync(CurrentTenantId(), cancellationToken);
 29    }
 30
 31    public Task TriggerAsync(string tenantId, CancellationToken cancellationToken = default)
 32    {
 133033        GetChannel(tenantId).Writer.TryWrite(null);
 133034        return Task.CompletedTask;
 35    }
 36
 37    public void Release(string tenantId)
 38    {
 3139        _channels.TryRemove(tenantId.NormalizeTenantId(), out _);
 3140    }
 41
 42    private Channel<object?> GetChannel(string? tenantId = null)
 43    {
 202144        return _channels.GetOrAdd((tenantId ?? CurrentTenantId()).NormalizeTenantId(), static _ => CreateChannel());
 45    }
 46
 181847    private string CurrentTenantId() => (_tenantAccessor?.TenantId).NormalizeTenantId();
 48
 49    private static Channel<object?> CreateChannel()
 50    {
 20251        var options = new BoundedChannelOptions(1)
 20252        {
 20253            SingleReader = true,
 20254            SingleWriter = false,
 20255            AllowSynchronousContinuations = false
 20256        };
 20257        return Channel.CreateBounded<object?>(options);
 58    }
 59}