FluxFlow.Nodes
1.1.2
See the version list below for details.
dotnet add package FluxFlow.Nodes --version 1.1.2
NuGet\Install-Package FluxFlow.Nodes -Version 1.1.2
<PackageReference Include="FluxFlow.Nodes" Version="1.1.2" />
<PackageVersion Include="FluxFlow.Nodes" Version="1.1.2" />
<PackageReference Include="FluxFlow.Nodes" />
paket add FluxFlow.Nodes --version 1.1.2
#r "nuget: FluxFlow.Nodes, 1.1.2"
#:package FluxFlow.Nodes@1.1.2
#addin nuget:?package=FluxFlow.Nodes&version=1.1.2
#tool nuget:?package=FluxFlow.Nodes&version=1.1.2
FluxFlow.Nodes
The minimal base every FluxFlow node is built on. A node is a self-contained TPL
Dataflow processor — you new it and link it; no engine, registry, or runtime.
When To Use It
Use this package when you are authoring reusable nodes or linking node instances directly in code. It owns the message envelope, node/source base classes, common error and event contracts, and the bounded Dataflow plumbing shared by component packages.
Do not use it as an application workspace model or resource registry. Hosts own
workflow files, resource lookup, concrete clients, stores, and any UI or
dashboard projection. Add FluxFlow.Composition only when a host wants fluent or
configuration-driven node composition.
Messages
Every message travels in a FlowMessage<T> envelope: a strongly-typed
CorrelationId + the Payload (plus a per-hop MessageId, Timestamp, and a
Headers bag). It's immutable, so a broadcast can hand the same instance to many
consumers. Transform the payload with With, which keeps the correlation id and
headers — so correlation flows through a graph with no node copying it by hand.
Assigned header dictionaries are copied with ordinal key comparison, so later
caller mutations cannot change an existing envelope.
var message = FlowMessage.Create("hello"); // mints a CorrelationId
var next = message.With(message.Payload.Length); // same id, new payload
CorrelationId is a guarded value type (non-empty) and serializes as a bare JSON
string, so envelopes persist cleanly.
FlowNode<TInput, TOutput>
Derive from it and implement ProcessAsync. The base gives you four ports:
| Port | Block | Notes |
|---|---|---|
Input |
BufferBlock<FlowMessage<TInput>> |
bounded intake — SendAsync applies backpressure |
Output |
BroadcastBlock<FlowMessage<TOutput>> |
fan-out: link to as many downstream inputs as you like |
Errors |
BroadcastBlock<FlowError> |
uniform error stream (carries the message's correlation id) |
Events |
BroadcastBlock<FlowEvent> |
uniform observability stream |
public sealed class UppercaseNode : FlowNode<string, string>
{
protected override Task ProcessAsync(FlowMessage<string> message)
{
Emit(message.With(message.Payload.ToUpperInvariant()));
return Task.CompletedTask;
}
}
await using var node = new UppercaseNode();
node.Output.LinkTo(next.Input);
await node.Input.SendAsync(FlowMessage.Create("hello"));
A throw inside ProcessAsync is caught and surfaced on Errors rather than
killing the pump. Complete() drains the input and completes the outputs;
Fault(ex) tears everything down; Completion tracks the lifecycle.
Design notes
- Outputs are broadcast (latest-wins): a consumer that keeps up sees every message; one that falls badly behind may miss some. That is the deliberate trade for simplicity.
- Options validate on assignment:
FlowNodeOptionsrejects non-positive input capacity and max-degree-of-parallelism values, andFlowSourceOptionsrejects invalid output capacities while allowingUnboundedOutputCapacity. - Sources can opt into bounded broadcast output with
FlowSourceOptions.OutputCapacityandEmitAsync. Source loops should awaitEmitAsyncwhen they expose a capacity option, but this is still broadcast output, not a durable queue or no-loss delivery guarantee. Callback-driven sources can keep using nonblockingEmit. - Inputs are a bounded buffer, so a node throttles its own intake.
- The kit owns no domain logic and no engine concepts — just the plumbing every node shares.
| 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 was computed. 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
- No dependencies.
-
net8.0
- System.Threading.Tasks.Dataflow (>= 9.0.4)
NuGet packages (29)
Showing the top 5 NuGet packages that depend on FluxFlow.Nodes:
| Package | Downloads |
|---|---|
|
FluxFlow.Engine
Canonical FluxFlow application runtime assembler with transactional revisions, stable addressable ports, conditional routing, system events, and diagnostics. |
|
|
FluxFlow.Composition
Canonical FluxFlow application definitions, addressing, link compilation, component registration contracts, and keyed resource registration without depending on FluxFlow.Engine. |
|
|
FluxFlow.Components.Mqtt
Transport-neutral MQTT client orchestration and standalone FluxFlow components for commands, publish, receive, workflow acknowledgement, and client events. No engine or concrete MQTT client required. |
|
|
FluxFlow.Components.Routing
Standalone typed Window, Correlation, and Join nodes for FluxFlow, including explicit JSON specializations. |
|
|
FluxFlow.Components.Storage
Standalone logical-storage nodes with exact FlowContent operations and normal typed results over host-owned stores. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.0.0-rc.1 | 496 | 9/5/2026 |
| 4.0.0 | 2,087 | 8/3/2026 |
| 1.2.0 | 1,261 | 7/3/2026 |
| 1.1.2 | 1,679 | 7/2/2026 |
| 1.0.0 | 851 | 6/19/2026 |
FlowNodeOptions and FlowSourceOptions now reject invalid capacities on assignment, with direct option contract coverage.