FluxFlow.Components.Routing
3.0.0
See the version list below for details.
dotnet add package FluxFlow.Components.Routing --version 3.0.0
NuGet\Install-Package FluxFlow.Components.Routing -Version 3.0.0
<PackageReference Include="FluxFlow.Components.Routing" Version="3.0.0" />
<PackageVersion Include="FluxFlow.Components.Routing" Version="3.0.0" />
<PackageReference Include="FluxFlow.Components.Routing" />
paket add FluxFlow.Components.Routing --version 3.0.0
#r "nuget: FluxFlow.Components.Routing, 3.0.0"
#:package FluxFlow.Components.Routing@3.0.0
#addin nuget:?package=FluxFlow.Components.Routing&version=3.0.0
#tool nuget:?package=FluxFlow.Components.Routing&version=3.0.0
FluxFlow.Components.Routing
Standalone routing nodes for FluxFlow, built on the FluxFlow.Nodes kit. Every node is
a self-contained TPL Dataflow processor: new it with its options and the selectors it
needs, post FlowMessage<T> envelopes to its input(s), and link its broadcast output/error/
event ports to the next stage. No engine, registry, or runtime is required. Key and side
extraction is supplied by the caller as plain delegates (compile them once from a
FluxFlow.Mapping IFlowExpressionEngine / IFlowPredicate if you use expressions).
Nodes
| Node | Base | Shape |
|---|---|---|
FlowSwitchNode<TInput> |
FlowNode<TInput, TInput> |
Input → Matched (primary Output), Default, optional Routed, configured route-output ports, Errors/Events |
FlowForkNode<TInput> |
FlowNode<TInput, TInput> |
Input → each configured output (first is the primary Output), Errors/Events |
FlowMergeNode<TInput> |
FlowNode<TInput, TInput> |
one fan-in Input (link many upstreams) → Output, Errors/Events |
FlowWindowNode<TInput> |
FlowNode<TInput, FlowWindow<TInput>> |
Input → Output (windows), Errors/Events |
FlowCorrelationNode<TInput> |
FlowNode<TInput, FlowCorrelationMatch<TInput>> |
Input → Matched (primary Output), Timeouts, Errors/Events |
FlowJoinNode<TLeft, TRight> |
kit primitives (two inputs) | Left, Right → Output (results), Timeouts, Errors/Events |
Every emitted message carries the source correlation id forward (FlowMessage<T>.With):
the matched branch keeps the input's id, a join result keeps the left message's id, a
correlation match keeps the request's id, and each timeout keeps its own message's id.
All nodes time off an injected System.TimeProvider (defaulting to TimeProvider.System),
so windows, join timeouts, and correlation timeouts are deterministic under a
FakeTimeProvider in tests.
Switch
var node = new FlowSwitchNode<AppMessage>(
new SwitchRoutingOptions
{
Routes = ["priority", "standard"],
RouteOutputs = new Dictionary<string, string> { ["priority"] = "Priority" },
DefaultRoute = "unknown"
},
routeKeySelector: message => message.Category);
Matched (the primary Output) re-emits the input when its route key is in Routes;
Default re-emits it otherwise. If Routes is empty every non-empty key is treated as
matched. RouteOutputs adds extra ports keyed by name and re-emits the input to the
matching route port; several route keys may map to the same port. Set EmitRouteEnvelope
to expose a neutral Routed port. EmitMatchedInput / EmitDefaultInput suppress those
branches. Route-key selector failures surface on Errors and the node keeps processing.
Fork
var node = new FlowForkNode<AppMessage>(
new ForkRoutingOptions { Outputs = ["Audit", "Transform", "Dashboard"] });
Each configured output receives every input. The first output is the primary Output;
the rest are reached through node.Outputs[name]. Output names must be valid identifiers
and cannot collide with the built-in Input/Errors ports.
Merge
var node = new FlowMergeNode<AppMessage>(new MergeRoutingOptions());
// link several upstreams into the one input:
sourceA.LinkTo(node.Input);
sourceB.LinkTo(node.Input);
A fan-in node: the single bounded Input already merges concurrent producers, and the
node re-broadcasts each message on Output in arrival order, preserving correlation.
Window
var node = new FlowWindowNode<AppMessage>(
new WindowRoutingOptions { MaxItems = 100, TimeMilliseconds = 5000 });
Output emits FlowWindow<TInput> (sequence, items, start/emit timestamps, duration,
count, reason). MaxItems emits when the window fills; TimeMilliseconds emits when the
open window ages out (timed off the injected clock); when both are set, whichever fires
first wins. At least one boundary is required. On completion a partial window is emitted by
default — set EmitPartialOnCompletion = false to discard it.
Correlation
var node = new FlowCorrelationNode<AppMessage>(
new CorrelationRoutingOptions
{
RequestSide = "request",
ResponseSide = "response",
TimeoutMilliseconds = 30000
},
keySelector: message => message.CorrelationId,
sideSelector: message => message.Kind);
Pairs a request with its matching response by key. Matched emits
FlowCorrelationMatch<TInput>; Timeouts emits FlowCorrelationTimeout<TInput> for
pending inputs that age past the timeout (observed before the next input or on completion).
Invalid keys/sides, duplicate sides, selector failures, and pending-capacity overflow
surface on Errors and the node keeps processing.
Join
var node = new FlowJoinNode<RequestMessage, ResponseMessage>(
new JoinRoutingOptions { TimeoutMilliseconds = 30000 },
leftKeySelector: request => request.CorrelationId,
rightKeySelector: response => response.CorrelationId);
The one two-input routing node, built directly on kit primitives. Post to Left and
Right; Output emits FlowJoinResult<TLeft, TRight> for matched pairs (FIFO for repeated
keys) and Timeouts emits FlowJoinTimeout<TLeft, TRight> for values that age past the
timeout or remain when the node completes. Key-evaluation failures, empty keys, and
pending-capacity overflow surface on Errors and the node keeps processing.
Lifecycle
Each node implements IFlowNode: Complete() drains and completes the outputs, Fault
faults the data outputs while flushing (completing) Errors/Events so buffered
diagnostics survive, and await DisposeAsync() completes, drains, and releases timers.
| 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
- FluxFlow.Mapping (>= 1.0.0)
- FluxFlow.Nodes (>= 1.0.0)
-
net8.0
- FluxFlow.Mapping (>= 1.0.0)
- FluxFlow.Nodes (>= 1.0.0)
- System.Threading.Tasks.Dataflow (>= 9.0.4)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on FluxFlow.Components.Routing:
| Package | Downloads |
|---|---|
|
FluxFlow.Components.Routing.Composition
Typed JSON routing registration and Designer metadata over host-owned selectors and clocks. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 7.0.0-rc.1 | 70 | 9/5/2026 |
| 6.0.1 | 157 | 8/3/2026 |
| 3.0.2 | 126 | 7/3/2026 |
| 3.0.1 | 171 | 7/2/2026 |
| 3.0.0 | 120 | 6/19/2026 |
| 2.0.0 | 141 | 6/18/2026 |
| 1.2.1 | 121 | 6/15/2026 |
| 1.2.0 | 427 | 6/12/2026 |
| 1.1.0 | 115 | 6/5/2026 |
| 1.0.0 | 125 | 6/4/2026 |
| 0.10.0-alpha.1 | 238 | 6/2/2026 |
| 0.9.0-alpha.1 | 72 | 6/2/2026 |
| 0.8.0-alpha.1 | 69 | 6/2/2026 |
| 0.7.0-alpha.1 | 63 | 6/2/2026 |
| 0.6.1-alpha.1 | 75 | 6/2/2026 |
| 0.6.0-alpha.1 | 86 | 6/2/2026 |
| 0.5.0-alpha.1 | 60 | 6/2/2026 |
| 0.4.0-alpha.1 | 67 | 6/2/2026 |
| 0.3.0-alpha.1 | 63 | 6/2/2026 |
| 0.2.0-alpha.2 | 65 | 6/2/2026 |
Rebuilt on the FluxFlow.Nodes kit: flow.switch/fork/window/correlation are FlowNode<TInput, ...> transforms and flow.merge is a fan-in FlowNode<TInput, TInput>, all carrying the message correlation id and timing off an injected TimeProvider; flow.join is built directly on kit primitives with two typed inputs (Left/Right), a result Output, and a Timeouts output. Each node takes its options record, key/predicate selectors (IFlowPredicate / IFlowExpressionEngine from FluxFlow.Mapping), and a TimeProvider directly. The engine factories, module, registration extensions, design-metadata provider, the definition-options reader, and the string-to-Type / expression-registry resolution layer are removed; the package depends only on FluxFlow.Nodes and FluxFlow.Mapping (runs without the engine).