Route daemon surface reads through client state

This commit is contained in:
Meta Vens 2026-06-28 11:14:31 +01:00
commit 81eb52f8a7
4 changed files with 190 additions and 45 deletions

View file

@ -3197,10 +3197,10 @@ static void RequireEveRuntimeBootstrap(string root)
"AetheriaUnityRuntimeClientProvider.ResolveClient(",
"CultMeshReactiveDocument<global::Aetheria.State.Documents.EveSurfaceState>",
"ResolveReactiveDaemonSurfaceState(",
"client.State.Daemon.ReactiveGameSurface()",
"client.State.Daemon.ReactiveGameTuiSurface()",
"client.State.Daemon.ReactiveEditorSurface()",
"client.State.Daemon.ReactiveEditorTuiSurface()",
"client.State.ReactiveGameSurface()",
"client.State.ReactiveGameTuiSurface()",
"client.State.ReactiveEditorSurface()",
"client.State.ReactiveEditorTuiSurface()",
"DisposeReactiveSurfaceState()",
"AetheriaRuntimeEveSurfaceAdapter.ToEveSurfaceDocument(",
"private bool ShouldMountSurface(",
@ -3232,6 +3232,10 @@ static void RequireEveRuntimeBootstrap(string root)
presenter.Contains(".DaemonGameTuiSurfaceAsync()", StringComparison.Ordinal) ||
presenter.Contains(".DaemonEditorSurfaceAsync()", StringComparison.Ordinal) ||
presenter.Contains(".DaemonEditorTuiSurfaceAsync()", StringComparison.Ordinal) ||
presenter.Contains("client.State.Daemon.ReactiveGameSurface()", StringComparison.Ordinal) ||
presenter.Contains("client.State.Daemon.ReactiveGameTuiSurface()", StringComparison.Ordinal) ||
presenter.Contains("client.State.Daemon.ReactiveEditorSurface()", StringComparison.Ordinal) ||
presenter.Contains("client.State.Daemon.ReactiveEditorTuiSurface()", StringComparison.Ordinal) ||
presenter.Contains("client.State.Daemon.GameSurface.LatestAsync()", StringComparison.Ordinal) ||
presenter.Contains("client.State.Daemon.GameTuiSurface.LatestAsync()", StringComparison.Ordinal) ||
presenter.Contains("client.State.Daemon.EditorSurface.LatestAsync()", StringComparison.Ordinal) ||
@ -7591,6 +7595,9 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root
}
var clientState = File.ReadAllText(clientStatePath);
var topLevelClientState = clientState.Split(
"public sealed class AetheriaClientDaemonState",
StringSplitOptions.None)[0];
var requiredClientSymbols = new[]
{
"public AetheriaRuntimeDaemonFrameDocument LatestDaemonFrame()",
@ -7696,7 +7703,13 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root
".State.Daemon.GameSurface.LatestAsync()",
".State.Daemon.GameTuiSurface.LatestAsync()",
".State.Daemon.EditorSurface.LatestAsync()",
".State.Daemon.EditorTuiSurface.LatestAsync()"
".State.Daemon.EditorTuiSurface.LatestAsync()",
"client.State.Daemon.LatestFrameDocument()",
"client.State.Daemon.LatestGameSurface()",
"client.State.Daemon.LatestGameTuiSurface()",
"client.State.Daemon.LatestEditorSurface()",
"client.State.Daemon.LatestEditorTuiSurface()",
"client.State.Daemon.LatestAuthorityPolicy()"
}
.Select(CompactSource)
.ToArray();
@ -10866,9 +10879,9 @@ static void RequireAetheriaRuntimeVerseClientContract(string root)
"public Func<string, string> CreateEveSurfaceStateRefResolver()",
"public CultMeshStateRefResolver CreateEveSurfaceCultMeshStateRefResolver()",
"public async Task<CultMeshStateRefResolver> CreateEveSurfaceCultMeshStateRefResolverAsync()",
"Daemon.LatestFrameDocumentAsync()",
"Daemon.LatestHealthAsync()",
"Daemon.LatestCommandBoundaryAsync()",
"LatestDaemonFrameAsync()",
"LatestHealthAsync()",
"LatestCommandBoundaryAsync()",
"LatestCatalog",
"AetheriaRuntimeStateRefResolver.CreateEveSurfaceCultMeshStateRefResolver("
};
@ -10882,6 +10895,14 @@ static void RequireAetheriaRuntimeVerseClientContract(string root)
string.Join(", ", missingClientStateSymbols));
}
if (clientState.Contains("var frameTask = Daemon.LatestFrameDocumentAsync()", StringComparison.Ordinal) ||
clientState.Contains("var healthTask = Daemon.LatestHealthAsync()", StringComparison.Ordinal) ||
clientState.Contains("var commandBoundaryTask = Daemon.LatestCommandBoundaryAsync()", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"AetheriaClientState Eve state-ref resolver must use top-level managed accessors instead of walking through the nested daemon state.");
}
var requiredStateRefResolverSymbols = new[]
{
"public static class AetheriaRuntimeStateRefResolver",