![]() |
VOOZH | about |
dotnet add package Rig.TUnit.Messaging.Nats --version 0.1.0-beta.2
NuGet\Install-Package Rig.TUnit.Messaging.Nats -Version 0.1.0-beta.2
<PackageReference Include="Rig.TUnit.Messaging.Nats" Version="0.1.0-beta.2" />
<PackageVersion Include="Rig.TUnit.Messaging.Nats" Version="0.1.0-beta.2" />Directory.Packages.props
<PackageReference Include="Rig.TUnit.Messaging.Nats" />Project file
paket add Rig.TUnit.Messaging.Nats --version 0.1.0-beta.2
#r "nuget: Rig.TUnit.Messaging.Nats, 0.1.0-beta.2"
#:package Rig.TUnit.Messaging.Nats@0.1.0-beta.2
#addin nuget:?package=Rig.TUnit.Messaging.Nats&version=0.1.0-beta.2&prereleaseInstall as a Cake Addin
#tool nuget:?package=Rig.TUnit.Messaging.Nats&version=0.1.0-beta.2&prereleaseInstall as a Cake Tool
Two parallel fixtures: core NATS (
NatsFixture) for low-latency pub/sub and JetStream (NatsJetStreamFixture) for durable streams + ordered consumers, with a fluent topology builder.
The Rig.TUnit NATS provider. Two fixture flavours, both Testcontainers-backed:
NatsFixture — nats:2.10-alpine server, JetStream off; ships
NatsListener + NatsEventSender for core pub/sub testing.NatsJetStreamFixture — same image with -js flag, exposes an
INatsJSContext; ships:
NatsJetStreamEventSender — publishes via
INatsJSContext.PublishAsync with a SendContext overload that
writes x-correlation-id + x-session-key headers.NatsJetStreamListener — ordered consumer
(CreateOrderedConsumerAsync); supports multi-subject filters and
survives reconnects without duplicates. Reads x-session-key into
CapturedMessage.SessionKey.NatsTopologyBuilder + provider-scoped interfaces
(INatsTopologyBuilder, INatsStreamConfig,
INatsConsumerConfig, NatsRetentionPolicy enum) wired via
NatsRigBuilder.WithTopology(…). Stream creation is idempotent
via JSStreamNameExistErr (10058) → UpdateStreamAsync fallback.The core-NATS API is unchanged from prior releases. JetStream is a
strictly additive layer (Feature 007 Phase 5) and uses an isolated
NATS.Client.JetStream package reference, guarded by an architecture
test (DependencyDirectionTests).
NATS.Client.Core (transitive)Core NATS — best-effort pub/sub:
using Rig.TUnit.Messaging.Nats.Fixtures;
using Rig.TUnit.Messaging.Nats.Helpers;
await using var fx = new NatsFixture();
await fx.InitializeAsync();
await using var sender = new NatsEventSender(fx.ConnectionString, subject: "orders");
await sender.SendAsync("{\"orderId\":1}", correlationId: "abc");
JetStream — durable + ordered:
using Rig.TUnit.Messaging.Helpers;
using Rig.TUnit.Messaging.Nats.Fixtures;
using Rig.TUnit.Messaging.Nats.Helpers;
var fx = await SharedNatsJetStreamFixture.GetAsync();
// 1) Declare topology at runtime.
services.AddRigTUnit(rig =>
rig.UseNats(RigConnect.FromValue(fx.ConnectionString), n =>
n.WithTopology(t => t.Stream("ORDERS", c => c
.WithSubjects("orders.>")
.WithMaxMessages(10_000)
.WithRetentionPolicy(NatsRetentionPolicy.Limits)))));
// 2) Send + ordered receive.
await using var sender = new NatsJetStreamEventSender(fx.JetStream, "orders.eu");
await using var listener = new NatsJetStreamListener(fx.JetStream, "ORDERS", "orders.eu");
await listener.StartAsync(ct);
await sender.SendAsync(
"payload-1",
context: new SendContext(SessionKey: "session-abc"),
ct: ct);
| Property | Type | Default | Description |
|---|---|---|---|
Image |
string |
"nats:2.10-alpine" |
NATS image |
StartupTimeoutSeconds |
int |
30 |
NATS boots in ~1 s |
EnableJetStream |
bool |
false |
Durable streams |
JetStreamStorageDir |
string? |
null |
JetStream persistence path |
Core NATS:
Rig.TUnit.Messaging.Nats.Fixtures.NatsFixtureRig.TUnit.Messaging.Nats.Options.NatsFixtureOptionsRig.TUnit.Messaging.Nats.Builder.NatsRigBuilder — ships
WithTopology(Action<INatsTopologyBuilder>).Rig.TUnit.Messaging.Nats.Helpers.NatsListenerRig.TUnit.Messaging.Nats.Helpers.NatsEventSenderJetStream (Feature 007 Phase 5):
Rig.TUnit.Messaging.Nats.Fixtures.NatsJetStreamFixture ·
SharedNatsJetStreamFixtureRig.TUnit.Messaging.Nats.Helpers.NatsJetStreamEventSender — ships
SendAsync(string, SendContext, …) overload.Rig.TUnit.Messaging.Nats.Helpers.NatsJetStreamListener —
ordered consumer with optional multi-subject filters.Rig.TUnit.Messaging.Nats.Topology.INatsTopologyBuilderRig.TUnit.Messaging.Nats.Topology.INatsStreamConfig —
WithSubjects, WithMaxMessages, WithRetentionPolicy.Rig.TUnit.Messaging.Nats.Topology.INatsConsumerConfigRig.TUnit.Messaging.Nats.Topology.NatsRetentionPolicy — enum
(Limits, Interest, WorkQueue).Rig.TUnit.Messaging.Nats.Topology.NatsTopologyBuilderPer-test subject: orders.{IsolationKey:short}. NATS subjects are
namespace-scoped by dot-separated tokens so parallel tests never
collide. No teardown needed — subjects are ephemeral.
No responders error — the subscriber wasn't active when the
publisher fired. Use listener.StartAsync + MessageAssert.Within
rather than a fixed sleep.EnableJetStream=false by default;
turn it on explicitly.See .
NatsJetStreamFixture (separate
fixture, separate package reference, separate CI matrix entry).orders.*, orders.>) match differently —
* is single-token, > is multi-token. Tests asserting on wildcard
routing must be explicit.NatsJSApiException.Error.ErrCode == 10058
(JSStreamNameExistErr) and falls back to UpdateStreamAsync. Other
400-coded errors (e.g. invalid retention policy) propagate so they
surface in tests.NatsJetStreamListener.StartAsync creates the ordered consumer
synchronously before spawning the consume loop — so a fast
publisher can never race a not-yet-existing consumer, and any broker
error (auth, missing stream) propagates to the test.SendContext.PartitionKey is unused on JetStream — partitioning is
done via the subject hierarchy. Use SessionKey for per-key
ordering, mapped to the x-session-key header.NATS.Client.JetStream
package reference, which DependencyDirectionTests enforces is
referenced only by Rig.TUnit.Messaging.Nats.See ;
baseline in benchmarks/baseline-005.json.
MIT. See .
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 1 NuGet packages that depend on Rig.TUnit.Messaging.Nats:
| Package | Downloads |
|---|---|
|
Rig.TUnit.All
Meta-package containing every Rig.TUnit.* package. DISCOURAGED — prefer per-feature or per-stack meta-packages (Rig.TUnit, Rig.TUnit.Microservices). |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-beta.2 | 64 | 4/27/2026 |
| 0.0.0-alpha.0.14 | 61 | 4/26/2026 |