36 lines
1.1 KiB
C#
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;
|
|
}
|
|
}
|