feat: wire subject transforms into NatsServer message delivery path
This commit is contained in:
@@ -32,6 +32,7 @@ public sealed class NatsServer : IMessageRouter, ISubListAccess, IDisposable
|
||||
private readonly Account _systemAccount;
|
||||
private readonly SslServerAuthenticationOptions? _sslOptions;
|
||||
private readonly TlsRateLimiter? _tlsRateLimiter;
|
||||
private readonly SubjectTransform[] _subjectTransforms;
|
||||
private Socket? _listener;
|
||||
private MonitorServer? _monitorServer;
|
||||
private ulong _nextClientId;
|
||||
@@ -297,6 +298,27 @@ public sealed class NatsServer : IMessageRouter, ISubListAccess, IDisposable
|
||||
_tlsRateLimiter = new TlsRateLimiter(options.TlsRateLimit);
|
||||
}
|
||||
|
||||
// Compile subject transforms
|
||||
if (options.SubjectMappings is { Count: > 0 })
|
||||
{
|
||||
var transforms = new List<SubjectTransform>();
|
||||
foreach (var (source, dest) in options.SubjectMappings)
|
||||
{
|
||||
var t = SubjectTransform.Create(source, dest);
|
||||
if (t != null)
|
||||
transforms.Add(t);
|
||||
else
|
||||
_logger.LogWarning("Invalid subject mapping: {Source} -> {Dest}", source, dest);
|
||||
}
|
||||
_subjectTransforms = transforms.ToArray();
|
||||
if (_subjectTransforms.Length > 0)
|
||||
_logger.LogInformation("Compiled {Count} subject transform(s)", _subjectTransforms.Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
_subjectTransforms = [];
|
||||
}
|
||||
|
||||
BuildCachedInfo();
|
||||
}
|
||||
|
||||
@@ -512,6 +534,20 @@ public sealed class NatsServer : IMessageRouter, ISubListAccess, IDisposable
|
||||
public void ProcessMessage(string subject, string? replyTo, ReadOnlyMemory<byte> headers,
|
||||
ReadOnlyMemory<byte> payload, NatsClient sender)
|
||||
{
|
||||
// Apply subject transforms
|
||||
if (_subjectTransforms.Length > 0)
|
||||
{
|
||||
foreach (var transform in _subjectTransforms)
|
||||
{
|
||||
var mapped = transform.Apply(subject);
|
||||
if (mapped != null)
|
||||
{
|
||||
subject = mapped;
|
||||
break; // First matching transform wins
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var subList = sender.Account?.SubList ?? _globalAccount.SubList;
|
||||
var result = subList.Match(subject);
|
||||
var delivered = false;
|
||||
|
||||
Reference in New Issue
Block a user