Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Vogen" Version="8.0.4" />
<PackageReference Include="Vogen" Version="8.0.5" />
<PackageReference Include="MemoryPack" Version="1.21.4" />
</ItemGroup>

Expand Down
27 changes: 11 additions & 16 deletions FlySwattr.NATS.Abstractions/ValueObjects/Ids.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,15 @@ namespace FlySwattr.NATS.Abstractions;
[ValueObject<string>]
public partial struct StreamName
{
[GeneratedRegex(@"^[a-zA-Z0-9_-]+$")]
private static partial Regex ValidPattern();
private static readonly Regex ValidPattern = new("^[a-zA-Z0-9_-]+$", RegexOptions.Compiled | RegexOptions.CultureInvariant);

private static Validation Validate(string value)
{
if (string.IsNullOrWhiteSpace(value))
return Validation.Invalid("Stream name cannot be empty");
if (value.Length > 256)
return Validation.Invalid("Stream name cannot exceed 256 characters");
if (!ValidPattern().IsMatch(value))
if (!ValidPattern.IsMatch(value))
return Validation.Invalid("Stream name can only contain letters, numbers, underscores, and hyphens");
return Validation.Ok;
}
Expand All @@ -25,16 +24,15 @@ private static Validation Validate(string value)
[ValueObject<string>]
public partial struct ConsumerName
{
[GeneratedRegex(@"^[a-zA-Z0-9_-]+$")]
private static partial Regex ValidPattern();
private static readonly Regex ValidPattern = new("^[a-zA-Z0-9_-]+$", RegexOptions.Compiled | RegexOptions.CultureInvariant);

private static Validation Validate(string value)
{
if (string.IsNullOrWhiteSpace(value))
return Validation.Invalid("Consumer name cannot be empty");
if (value.Length > 256)
return Validation.Invalid("Consumer name cannot exceed 256 characters");
if (!ValidPattern().IsMatch(value))
if (!ValidPattern.IsMatch(value))
return Validation.Invalid("Consumer name can only contain letters, numbers, underscores, and hyphens");
return Validation.Ok;
}
Expand All @@ -45,8 +43,7 @@ public partial struct SubjectName
{
// NATS subjects allow alphanumeric, dots (hierarchy), and wildcards (* for single token, > for multi)
// Wildcards should only appear in subscription patterns, not in publish subjects
[GeneratedRegex(@"^[a-zA-Z0-9_\-.*>]+$")]
private static partial Regex ValidPattern();
private static readonly Regex ValidPattern = new("^[a-zA-Z0-9_\\-.*>]+$", RegexOptions.Compiled | RegexOptions.CultureInvariant);

private static Validation Validate(string value)
{
Expand All @@ -72,7 +69,7 @@ private static Validation Validate(string value)
if (value.Contains("..") || value.Contains("**") || value.Contains(">>"))
return Validation.Invalid("Subject contains invalid pattern sequences");

if (!ValidPattern().IsMatch(value))
if (!ValidPattern.IsMatch(value))
return Validation.Invalid("Subject name contains invalid characters");
// Check for invalid wildcard positions (> must be at end if present)
if (value.Contains('>') && !value.EndsWith('>'))
Expand All @@ -86,16 +83,15 @@ private static Validation Validate(string value)
public partial struct BucketName
{
// KV/Object store bucket names: alphanumeric, underscores, hyphens only
[GeneratedRegex(@"^[a-zA-Z0-9_-]+$")]
private static partial Regex ValidPattern();
private static readonly Regex ValidPattern = new("^[a-zA-Z0-9_-]+$", RegexOptions.Compiled | RegexOptions.CultureInvariant);

private static Validation Validate(string value)
{
if (string.IsNullOrWhiteSpace(value))
return Validation.Invalid("Bucket name cannot be empty");
if (value.Length > 256)
return Validation.Invalid("Bucket name cannot exceed 256 characters");
if (!ValidPattern().IsMatch(value))
if (!ValidPattern.IsMatch(value))
return Validation.Invalid("Bucket name can only contain letters, numbers, underscores, and hyphens");
return Validation.Ok;
}
Expand All @@ -105,17 +101,16 @@ private static Validation Validate(string value)
public partial struct QueueGroup
{
// Queue groups: no spaces, dots, or wildcards
[GeneratedRegex(@"^[a-zA-Z0-9_-]+$")]
private static partial Regex ValidPattern();
private static readonly Regex ValidPattern = new("^[a-zA-Z0-9_-]+$", RegexOptions.Compiled | RegexOptions.CultureInvariant);

private static Validation Validate(string value)
{
if (string.IsNullOrWhiteSpace(value))
return Validation.Invalid("Queue group cannot be empty");
if (value.Length > 256)
return Validation.Invalid("Queue group cannot exceed 256 characters");
if (!ValidPattern().IsMatch(value))
if (!ValidPattern.IsMatch(value))
return Validation.Invalid("Queue group can only contain letters, numbers, underscores, and hyphens");
return Validation.Ok;
}
}
}
2 changes: 1 addition & 1 deletion FlySwattr.NATS.Caching/FlySwattr.NATS.Caching.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.5.0" />
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.6.0" />
</ItemGroup>

</Project>
8 changes: 4 additions & 4 deletions FlySwattr.NATS.Core/FlySwattr.NATS.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
<PackageReference Include="OpenTelemetry.Api" Version="1.15.3" />
<PackageReference Include="FluentValidation" Version="12.1.1" />
<PackageReference Include="MemoryPack" Version="1.21.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.1" />
<PackageReference Include="NATS.Net" Version="2.7.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.7" />
<PackageReference Include="NATS.Net" Version="2.7.3" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="DistributedLock.Core" Version="1.0.8" />
<PackageReference Include="Polly.Core" Version="8.6.5" />
<PackageReference Include="DistributedLock.Core" Version="1.0.9" />
<PackageReference Include="Polly.Core" Version="8.6.6" />
</ItemGroup>

</Project>
8 changes: 4 additions & 4 deletions FlySwattr.NATS.Hosting/FlySwattr.NATS.Hosting.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@

<ItemGroup>
<PackageReference Include="FluentValidation" Version="12.1.1" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.1" />
<PackageReference Include="CommunityToolkit.HighPerformance" Version="8.4.0" />
<PackageReference Include="Polly.Core" Version="8.6.5" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.7" />
<PackageReference Include="CommunityToolkit.HighPerformance" Version="8.4.2" />
<PackageReference Include="Polly.Core" Version="8.6.6" />
</ItemGroup>

</Project>
12 changes: 6 additions & 6 deletions FlySwattr.NATS.Resilience/FlySwattr.NATS.Resilience.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="NATS.Net" Version="2.7.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.1" />
<PackageReference Include="Polly.Core" Version="8.6.5" />
<PackageReference Include="Polly.RateLimiting" Version="8.6.5" />
<PackageReference Include="NATS.Net" Version="2.7.3" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.7" />
<PackageReference Include="Polly.Core" Version="8.6.6" />
<PackageReference Include="Polly.RateLimiting" Version="8.6.6" />
</ItemGroup>

</Project>
6 changes: 3 additions & 3 deletions FlySwattr.NATS.Topology/FlySwattr.NATS.Topology.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="DistributedLock.Core" Version="1.0.8" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.1" />
<PackageReference Include="Polly.Core" Version="8.6.5" />
<PackageReference Include="DistributedLock.Core" Version="1.0.9" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.7" />
<PackageReference Include="Polly.Core" Version="8.6.6" />
</ItemGroup>


Expand Down
6 changes: 3 additions & 3 deletions Samples/NatsTester/NatsTester.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.2" />
<PackageReference Include="Spectre.Console" Version="0.54.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.7" />
<PackageReference Include="Spectre.Console" Version="0.55.2" />
</ItemGroup>

<PropertyGroup>
Expand Down
4 changes: 2 additions & 2 deletions Samples/Service1/Service1.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.7" />
</ItemGroup>

<PropertyGroup>
Expand Down
4 changes: 2 additions & 2 deletions Samples/Service2/Service2.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.7" />
</ItemGroup>

<PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion Tests/Benchmarks/Benchmarks.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ public class NatsContainerFixture : IAsyncDisposable

public NatsContainerFixture()
{
_container = new NatsBuilder()
.WithImage("nats:2.10") // Explicit version
_container = new NatsBuilder("nats:2.10")
.WithCommand("--jetstream")
.Build();
}
Expand Down
16 changes: 8 additions & 8 deletions Tests/IntegrationTests/IntegrationTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@

<ItemGroup>
<PackageReference Include="MemoryPack" Version="1.21.4" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="Microsoft.Testing.Extensions.Retry" Version="2.2.1" />
<PackageReference Include="NATS.Client.Serializers.Json" Version="2.7.0" />
<PackageReference Include="NATS.Net" Version="2.7.0" />
<PackageReference Include="Testcontainers.Nats" Version="4.1.0" />
<PackageReference Include="TUnit" Version="1.8.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.7" />
<PackageReference Include="Microsoft.Testing.Extensions.Retry" Version="2.2.2" />
<PackageReference Include="NATS.Client.Serializers.Json" Version="2.7.3" />
<PackageReference Include="NATS.Net" Version="2.7.3" />
<PackageReference Include="Testcontainers.Nats" Version="4.11.0" />
<PackageReference Include="TUnit" Version="1.43.2" />
<PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.5.0" />
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.6.0" />
</ItemGroup>

<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion Tests/UnitTests/Core/Messaging/NatsJetStreamBusTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ public async Task PublishAsync_ShouldStampConfiguredWireVersionHeader()

// Assert
await Assert.That(publishedHeaders).IsNotNull();
await Assert.That(publishedHeaders!["X-Test-Wire-Version"]).IsEqualTo("7");
await Assert.That(publishedHeaders!["X-Test-Wire-Version"].Single()).IsEqualTo("7");
}

private record TestMessage(string Data);
Expand Down
16 changes: 13 additions & 3 deletions Tests/UnitTests/Core/Telemetry/NatsJetStreamBusTelemetryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -387,9 +387,19 @@ public async Task PublishAsync_WithoutParentActivity_ShouldCreateNewTrace()
SetupPublishMock();
var startCount = _capturedActivities.Count;

// Act - publish without a parent activity
await _bus.PublishAsync(subject1, message, "msg-1");
await _bus.PublishAsync(subject2, message, "msg-2");
var previousActivity = Activity.Current;
try
{
Activity.Current = null;

// Act - publish without a parent activity
await _bus.PublishAsync(subject1, message, "msg-1");
await _bus.PublishAsync(subject2, message, "msg-2");
}
finally
{
Activity.Current = previousActivity;
}

// Assert - find our specific activities
var ourActivities = _capturedActivities.Skip(startCount).Where(a => a.OperationName.Contains(prefix)).ToList();
Expand Down
4 changes: 1 addition & 3 deletions Tests/UnitTests/Core/Telemetry/NatsTelemetryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,7 @@ public void InjectTraceContext_WithActivityWithNoId_ShouldNotModifyHeaders()
{
// Arrange
var headers = new NatsHeaders();
// Create an activity that won't be sampled (no listener for this source)
using var tempSource = new ActivitySource("temp-test-source");
using var activity = tempSource.StartActivity("test"); // Will be null without listener
using var activity = new Activity("test");

// Act
NatsTelemetry.InjectTraceContext(activity, headers);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ public async Task ExecuteAsync_ShouldBlockInsteadOfNak_WhenChannelFull_Backpress
var msg = Substitute.For<INatsJSMsg<string>>();
msg.Data.Returns($"message-{i}");
msg.Subject.Returns("test.subject");
msg.NakAsync(default, default, default)
msg.NakAsync(default, default)
.ReturnsForAnyArgs(ValueTask.CompletedTask)
.AndDoes(x => Interlocked.Increment(ref nakCount));
mockMessages.Add(msg);
Expand Down Expand Up @@ -372,7 +372,7 @@ public async Task ExecuteAsync_ShouldDrainQueuedMessagesAndNakOnShutdown()
var secondMsg = Substitute.For<INatsJSMsg<string>>();
secondMsg.Data.Returns("second");
secondMsg.Subject.Returns("test.subject.2");
secondMsg.NakAsync(default, default, default).ReturnsForAnyArgs(ValueTask.CompletedTask);
secondMsg.NakAsync(default, default).ReturnsForAnyArgs(ValueTask.CompletedTask);

consumer.ConsumeAsync<string>(
Arg.Any<INatsDeserialize<string>>(),
Expand Down Expand Up @@ -469,7 +469,7 @@ private static async Task WaitForNakAsync(INatsJSMsg<string> message, TimeSpan t
{
try
{
await message.Received(1).NakAsync(default, TimeSpan.FromSeconds(1), Arg.Any<CancellationToken>());
await message.Received(1).NakAsync(Arg.Is<AckOpts?>(opts => opts != null && opts.Value.NakDelay == TimeSpan.FromSeconds(1)), Arg.Any<CancellationToken>());
return;
}
catch
Expand All @@ -478,6 +478,6 @@ private static async Task WaitForNakAsync(INatsJSMsg<string> message, TimeSpan t
}
}

await message.Received(1).NakAsync(default, TimeSpan.FromSeconds(1), Arg.Any<CancellationToken>());
await message.Received(1).NakAsync(Arg.Is<AckOpts?>(opts => opts != null && opts.Value.NakDelay == TimeSpan.FromSeconds(1)), Arg.Any<CancellationToken>());
}
}
18 changes: 9 additions & 9 deletions Tests/UnitTests/UnitTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@


<ItemGroup>
<PackageReference Include="MediatR" Version="14.0.0" />
<PackageReference Include="MediatR" Version="14.1.0" />
<PackageReference Include="MemoryPack" Version="1.21.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="9.0.0" />
<PackageReference Include="Microsoft.Testing.Extensions.Retry" Version="2.2.1" />
<PackageReference Include="TUnit" Version="1.8.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.TimeProvider.Testing" Version="10.5.0" />
<PackageReference Include="Microsoft.Testing.Extensions.Retry" Version="2.2.2" />
<PackageReference Include="TUnit" Version="1.43.2" />
<PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="NATS.Net" Version="2.7.0" />
<PackageReference Include="Polly.Testing" Version="8.5.0" />
<PackageReference Include="Vogen" Version="8.0.4" />
<PackageReference Include="NATS.Net" Version="2.7.3" />
<PackageReference Include="Polly.Testing" Version="8.6.6" />
<PackageReference Include="Vogen" Version="8.0.5" />
<PackageReference Include="OpenTelemetry.Api" Version="1.15.3" />
</ItemGroup>

Expand Down
Loading