Mostlylucid.Ephemeral.Atoms.SignalAware
2.10.0
dotnet add package Mostlylucid.Ephemeral.Atoms.SignalAware --version 2.10.0
NuGet\Install-Package Mostlylucid.Ephemeral.Atoms.SignalAware -Version 2.10.0
<PackageReference Include="Mostlylucid.Ephemeral.Atoms.SignalAware" Version="2.10.0" />
<PackageVersion Include="Mostlylucid.Ephemeral.Atoms.SignalAware" Version="2.10.0" />
<PackageReference Include="Mostlylucid.Ephemeral.Atoms.SignalAware" />
paket add Mostlylucid.Ephemeral.Atoms.SignalAware --version 2.10.0
#r "nuget: Mostlylucid.Ephemeral.Atoms.SignalAware, 2.10.0"
#:package Mostlylucid.Ephemeral.Atoms.SignalAware@2.10.0
#addin nuget:?package=Mostlylucid.Ephemeral.Atoms.SignalAware&version=2.10.0
#tool nuget:?package=Mostlylucid.Ephemeral.Atoms.SignalAware&version=2.10.0
Mostlylucid.Ephemeral.Atoms.SignalAware
Pause or cancel intake based on ambient signals. Circuit-breaker and backpressure patterns.
dotnet add package mostlylucid.ephemeral.atoms.signalaware
Quick Start
using Mostlylucid.Ephemeral.Atoms.SignalAware;
var sink = new SignalSink();
await using var atom = new SignalAwareAtom<WorkItem>(
async (item, ct) => await ProcessAsync(item, ct),
cancelOn: new HashSet<string> { "shutdown" },
deferOn: new HashSet<string> { "backpressure" },
signals: sink);
await atom.EnqueueAsync(item); // Normal processing
sink.Raise("backpressure"); // New items defer
sink.Raise("shutdown"); // New items rejected (-1)
await atom.DrainAsync();
All Options
new SignalAwareAtom<T>(
// Required: async work body
body: async (item, ct) => await ProcessAsync(item, ct),
// Signals that reject items (returns -1)
// Supports glob: "error.*", "circuit-*"
// Default: null
cancelOn: new HashSet<string> { "shutdown", "circuit-open" },
// Signals that delay items until cleared
// Supports glob patterns
// Default: null
deferOn: new HashSet<string> { "backpressure.*", "rate-limited" },
// Recheck interval when deferring
// Default: 100ms
deferInterval: TimeSpan.FromMilliseconds(100),
// Max defer attempts before running anyway
// Default: 50
maxDeferAttempts: 50,
// Shared signal sink
// Default: null
signals: sharedSink,
// Max concurrent operations
// Default: Environment.ProcessorCount
maxConcurrency: 8
)
API Reference
// Enqueue (returns -1 if canceled by signal)
ValueTask<long> id = await atom.EnqueueAsync(item, ct);
// Raise ambient signal
atom.Raise("backpressure");
// Drain and stats
await atom.DrainAsync(ct);
var snapshot = atom.Snapshot();
var (pending, active, completed, failed) = atom.Stats();
await atom.DisposeAsync();
Example: Circuit Breaker
var sink = new SignalSink();
await using var atom = new SignalAwareAtom<ApiRequest>(
async (req, ct) =>
{
try { await CallApi(req, ct); }
catch { sink.Raise("api.failure"); throw; }
},
cancelOn: new HashSet<string> { "circuit-open" },
signals: sink);
// Monitor and open circuit
Task.Run(async () =>
{
while (true)
{
if (sink.Sense(s => s.Signal == "api.failure").Count() > 5)
sink.Raise("circuit-open");
await Task.Delay(1000);
}
});
Example: Backpressure
var sink = new SignalSink();
await using var atom = new SignalAwareAtom<WorkItem>(
async (item, ct) => await SlowProcess(item, ct),
deferOn: new HashSet<string> { "backpressure.*" },
signals: sink);
sink.Raise("backpressure.downstream"); // Items wait
sink.Retract("backpressure.downstream"); // Items resume
Related Packages
| Package | Description |
|---|---|
| mostlylucid.ephemeral | Core library |
| mostlylucid.ephemeral.patterns.circuitbreaker | Full circuit breaker |
| mostlylucid.ephemeral.complete | All in one DLL |
License
Unlicense (public domain)
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.9)
- mostlylucid.ephemeral (>= 2.10.0)
- System.IO.Hashing (>= 10.0.9)
-
net8.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.9)
- mostlylucid.ephemeral (>= 2.10.0)
- System.IO.Hashing (>= 10.0.9)
-
net9.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.9)
- mostlylucid.ephemeral (>= 2.10.0)
- System.IO.Hashing (>= 10.0.9)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Mostlylucid.Ephemeral.Atoms.SignalAware:
| Package | Downloads |
|---|---|
|
mostlylucid.botdetection
Enterprise bot detection and anonymous entity resolution for ASP.NET Core — the detection engine behind StyloBot (https://stylo.bot). Probabilistic and behavioural, not just User-Agent matching: UA/header/IP analysis, JA3/JA4/HTTP2/QUIC/TCP-IP fingerprinting, Leiden cluster discovery, 129-dim Markov session vectors, metastable fingerprint identity, and optional LLM classification. Zero-PII (HMAC-SHA256), SQLite-backed, single-call UseStyloBot() setup. |
|
|
mostlylucid.ephemeral.complete
Meta-package that references all Mostlylucid.Ephemeral packages - bounded async execution with signals, atoms, and patterns. Install this single package to get everything. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.10.0 | 3,187 | 7/23/2026 |
| 2.9.1 | 2,117 | 7/9/2026 |
| 2.9.0 | 198 | 7/8/2026 |
| 2.8.1 | 98 | 7/6/2026 |
| 2.7.0 | 101 | 7/4/2026 |
| 2.6.4 | 113 | 6/21/2026 |
| 2.6.3 | 117 | 5/22/2026 |
| 2.6.2 | 119 | 5/22/2026 |
| 2.6.0 | 108 | 5/22/2026 |
| 2.5.1 | 118 | 5/22/2026 |
| 2.5.0 | 109 | 5/3/2026 |
| 2.4.0 | 120 | 4/17/2026 |
| 2.3.2 | 137 | 1/9/2026 |
| 2.3.1 | 133 | 1/9/2026 |
| 2.3.1-alpha0 | 131 | 1/9/2026 |
| 2.3.0 | 1,305 | 1/8/2026 |
| 2.3.0-alpha1 | 128 | 1/8/2026 |
| 2.1.0 | 134 | 1/8/2026 |
| 2.1.0-preview | 129 | 1/8/2026 |
| 2.0.1 | 140 | 1/8/2026 |