Files
natsdotnet/src/NATS.Server/LeafNodes/LeafLoopDetector.cs

36 lines
1.1 KiB
C#

namespace NATS.Server.LeafNodes;
public static class LeafLoopDetector
{
private const string LeafLoopPrefix = "$LDS.";
public static bool HasLoopMarker(string subject)
=> subject.StartsWith(LeafLoopPrefix, StringComparison.Ordinal);
public static string Mark(string subject, string serverId)
=> $"{LeafLoopPrefix}{serverId}.{subject}";
public static bool IsLooped(string subject, string localServerId)
=> subject.StartsWith($"{LeafLoopPrefix}{localServerId}.", StringComparison.Ordinal);
public static bool TryUnmark(string subject, out string unmarked)
{
unmarked = subject;
if (!HasLoopMarker(subject))
return false;
var current = subject;
while (HasLoopMarker(current))
{
var serverSeparator = current.IndexOf('.', LeafLoopPrefix.Length);
if (serverSeparator < 0 || serverSeparator == current.Length - 1)
return false;
current = current[(serverSeparator + 1)..];
}
unmarked = current;
return true;
}
}