Aetheria/tools/Aetheria.TransportProbe/Program.cs
2026-07-19 22:15:50 +01:00

40 lines
1.9 KiB
C#

using GameCult.Aetheria.State.Verse;
using GameCult.Mesh;
using GameCult.Mesh.Quic;
using GameCult.Networking;
var controlEndpoint = args.ElementAtOrDefault(0) ?? "cultnet+tcp://127.0.0.1:3076";
var verseId = args.ElementAtOrDefault(1) ?? "aetheria.local";
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(15));
var discovery = new CultMeshVerseDiscoveryClient();
var catalog = await discovery.FetchAsync(
controlEndpoint,
new CultMeshVerseCatalogRequestMessage
{
VerseIds = new[] { verseId },
TransportVersion = "cultmesh.v0"
}).ConfigureAwait(false);
var advertised = catalog.Verses
.SingleOrDefault(candidate => string.Equals(candidate.VerseId, verseId, StringComparison.Ordinal))
?? throw new InvalidDataException($"Aetheria Verse '{verseId}' was not advertised by {controlEndpoint}.");
Console.WriteLine($"Aetheria advertised routes: {string.Join(", ", advertised.DiscoveryEndpoints)}");
using var client = new CultMeshClient(new CultMeshClientOptions
{
RendezvousEndpoints = new[] { controlEndpoint },
RealtimeConnectors = new ICultMeshRealtimeTransportConnector[]
{
new CultMeshQuicRealtimeTransportConnector()
}
});
using var session = await client.ConnectRealtimeAsync(verseId, deadline.Token).ConfigureAwait(false);
var frame = await session.ReceiveAsync(deadline.Token).ConfigureAwait(false);
if (!string.Equals(frame.BodyId, AetheriaRuntimeDaemonSoaFramePublisher.BodyId, StringComparison.Ordinal) ||
!string.Equals(frame.SchemaId, AetheriaRuntimeDaemonSoaFramePublisher.BodySchemaId, StringComparison.Ordinal) ||
frame.Payload.IsEmpty)
throw new InvalidDataException(
$"Aetheria QUIC frame mismatch: body={frame.BodyId} schema={frame.SchemaId} bytes={frame.Payload.Length}.");
Console.WriteLine(
$"Aetheria realtime transport={session.TransportId} delivery={frame.Delivery} " +
$"epoch={frame.ProducerEpoch} sequence={frame.Sequence} bytes={frame.Payload.Length}.");