Aetheria/Aetheria.State/AetheriaVerseDiscoveryHost.cs
2026-06-29 05:06:47 +01:00

67 lines
1.9 KiB
C#

using Aetheria.State.Documents;
using GameCult.Mesh;
namespace Aetheria.State;
public sealed class AetheriaVerseDiscoveryHost : IDisposable
{
private readonly AetheriaStateNode _node;
private CultMeshVerseCatalog? _catalog;
private CultMeshVerseDiscoveryServer? _server;
private string _fingerprint = "";
public AetheriaVerseDiscoveryHost(AetheriaStateNode node)
{
_node = node ?? throw new ArgumentNullException(nameof(node));
}
public void Update(AetheriaVerseHostSettings? settings)
{
var normalized = AetheriaVerseHostSettingsNormalizer.Normalize(settings);
if (!string.Equals(normalized.Visibility, "public", StringComparison.OrdinalIgnoreCase))
{
DisposeServer();
return;
}
var nextFingerprint = CreateFingerprint(normalized);
if (string.Equals(_fingerprint, nextFingerprint, StringComparison.Ordinal))
return;
DisposeServer();
_catalog = CultMesh.CreateVerseCatalog();
_catalog.Upsert(AetheriaVerseCatalogDocuments.Build(normalized));
_server = CultMesh.ServeVerseCatalog(_node.MeshNode, _catalog);
_fingerprint = nextFingerprint;
}
public void Dispose()
{
DisposeServer();
GC.SuppressFinalize(this);
}
private void DisposeServer()
{
_server?.Dispose();
_server = null;
_catalog?.Dispose();
_catalog = null;
_fingerprint = "";
}
private static string CreateFingerprint(AetheriaVerseHostSettings settings)
{
return string.Join(
"\u001f",
settings.ServiceId ?? "",
settings.VerseId ?? "",
settings.RootVerse ?? "",
settings.CanonicalService ?? "",
settings.LocatedService ?? "",
settings.CultMeshAddress ?? "",
settings.Title ?? "",
settings.Visibility ?? "");
}
}