namespace NATS.Server;
///
/// Per-client trace configuration and echo control.
/// Go reference: server/client.go — c.trace, c.echo fields.
///
public sealed class ClientTraceInfo
{
private bool _traceEnabled;
private bool _echoEnabled = true; // default: echo is enabled
private readonly List _traceLog = new();
private readonly Lock _lock = new();
/// Whether message delivery tracing is enabled for this client.
public bool TraceEnabled
{
get => Volatile.Read(ref _traceEnabled);
set => Volatile.Write(ref _traceEnabled, value);
}
/// Whether this client echoes its own published messages back.
public bool EchoEnabled
{
get => Volatile.Read(ref _echoEnabled);
set => Volatile.Write(ref _echoEnabled, value);
}
///
/// Records a message delivery trace if tracing is enabled.
/// Go reference: server/client.go — traceMsg / TraceMsgDelivery.
///
public void TraceMsgDelivery(string subject, string destination, int payloadSize)
{
if (!TraceEnabled) return;
lock (_lock)
{
_traceLog.Add(new TraceRecord
{
Subject = subject,
Destination = destination,
PayloadSize = payloadSize,
TimestampUtc = DateTime.UtcNow,
});
}
}
///
/// Returns whether a message from this client should be delivered back to it.
/// When echo is disabled, messages published by this client are not delivered to
/// subscriptions on the same client.
/// Go reference: server/client.go — c.echo check in deliverMsg.
///
public bool ShouldEcho(string publisherClientId, string subscriberClientId)
{
if (EchoEnabled) return true;
return !string.Equals(publisherClientId, subscriberClientId, StringComparison.Ordinal);
}
/// Returns all trace records and clears the log.
public IReadOnlyList DrainTraceLog()
{
lock (_lock)
{
var copy = _traceLog.ToList();
_traceLog.Clear();
return copy;
}
}
/// Current trace log count.
public int TraceLogCount
{
get { lock (_lock) return _traceLog.Count; }
}
}
public sealed record TraceRecord
{
public string Subject { get; init; } = string.Empty;
public string Destination { get; init; } = string.Empty;
public int PayloadSize { get; init; }
public DateTime TimestampUtc { get; init; }
}