Route observed daemon through managed sessions

This commit is contained in:
Meta Vens 2026-06-28 14:57:30 +01:00
commit 08c4fc190e
3 changed files with 42 additions and 27 deletions

View file

@ -15387,7 +15387,7 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
!observedFrameApplier.Contains("ApplyLatestZoneRender()", StringComparison.Ordinal) ||
!observedFrameApplier.Contains("observer.LastObservedState?.ZoneRender", StringComparison.Ordinal) ||
!observedDaemonState.Contains("public AetheriaRuntimeZoneRenderDocument ZoneRender { get; }", StringComparison.Ordinal) ||
!observedDaemonState.Contains("CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> zoneRender", StringComparison.Ordinal) ||
!observedDaemonState.Contains("AetheriaRuntimeZoneRenderSession zoneRender", StringComparison.Ordinal) ||
!observedDaemonState.Contains("var currentZoneRender = zoneRender?.Current;", StringComparison.Ordinal) ||
!observedDaemonState.Contains("new AetheriaRuntimeObservedDaemonState(currentFrame, currentSoaView, currentZoneRender)", StringComparison.Ordinal) ||
!aetheriaClientState.Contains("var zoneRender = await LatestZoneRenderAsync().ConfigureAwait(false);", StringComparison.Ordinal) ||
@ -15517,10 +15517,13 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
{
"public AetheriaRuntimeObservedDaemonState? CurrentObservedDaemon(",
"public AetheriaRuntimeObservedDaemonSession ObserveDaemon(",
"using var frame = ReactiveDaemonFrame(options);",
"using var soaView = TryReactiveDaemonSoaView(options);",
"using var zoneRender = ReactiveZoneRender(options);",
"using var frame = ObserveDaemonFrame(options);",
"using var soaView = TryObserveDaemonSoaView(options);",
"using var zoneRender = ObserveZoneRender(options);",
"AetheriaRuntimeObservedDaemonState.TryCreateCurrent(frame, soaView, zoneRender, out var current)",
"var frame = ObserveDaemonFrame(options);",
"AetheriaRuntimeDaemonSoaViewSession? soaView = null;",
"AetheriaRuntimeZoneRenderSession? zoneRender = null;",
"return new AetheriaRuntimeObservedDaemonSession(frame, soaView, zoneRender);"
};
var missingManagedObservedDaemonSymbols = requiredManagedObservedDaemonSymbols
@ -15545,13 +15548,16 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
{
"AetheriaRuntimeDaemonSoaViewIndex.Build(soaView)",
"public static bool TryCreateCurrent(",
"CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> frame",
"CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>? soaView",
"CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> zoneRender",
"AetheriaRuntimeDaemonFrameSession frame",
"AetheriaRuntimeDaemonSoaViewSession? soaView",
"AetheriaRuntimeZoneRenderSession zoneRender",
"var currentFrame = frame?.Current;",
"var currentZoneRender = zoneRender?.Current;",
"new AetheriaRuntimeObservedDaemonState(currentFrame, currentSoaView, currentZoneRender)",
"public sealed class AetheriaRuntimeObservedDaemonSession",
"private readonly AetheriaRuntimeDaemonFrameSession _frame;",
"private readonly AetheriaRuntimeDaemonSoaViewSession? _soaView;",
"private readonly AetheriaRuntimeZoneRenderSession _zoneRender;",
"public AetheriaRuntimeObservedDaemonState? Current =>",
"_frame.Dispose();",
"_soaView?.Dispose();",
@ -15567,6 +15573,16 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
string.Join(", ", missingObservedDaemonStateSymbols));
}
if (observedDaemonState.Contains("CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument>", StringComparison.Ordinal) ||
observedDaemonState.Contains("CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>", StringComparison.Ordinal) ||
observedDaemonState.Contains("CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument>", StringComparison.Ordinal) ||
observedDaemonState.Contains("using GameCult.Mesh;", StringComparison.Ordinal) ||
aetheriaClientState.Contains("TryReactiveDaemonSoaView(options)", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"Observed daemon state must compose named managed sessions instead of owning raw reactive CultMesh documents.");
}
var forbiddenObservedDaemonStateSymbols = new[]
{
"string statePath",

View file

@ -277,9 +277,9 @@ namespace GameCult.Aetheria.State.Verse
public AetheriaRuntimeObservedDaemonState? CurrentObservedDaemon(
CultMeshReactiveDocumentOptions? options = null)
{
using var frame = ReactiveDaemonFrame(options);
using var soaView = TryReactiveDaemonSoaView(options);
using var zoneRender = ReactiveZoneRender(options);
using var frame = ObserveDaemonFrame(options);
using var soaView = TryObserveDaemonSoaView(options);
using var zoneRender = ObserveZoneRender(options);
return AetheriaRuntimeObservedDaemonState.TryCreateCurrent(frame, soaView, zoneRender, out var current)
? current
: null;
@ -288,13 +288,13 @@ namespace GameCult.Aetheria.State.Verse
public AetheriaRuntimeObservedDaemonSession ObserveDaemon(
CultMeshReactiveDocumentOptions? options = null)
{
var frame = ReactiveDaemonFrame(options);
CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>? soaView = null;
CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument>? zoneRender = null;
var frame = ObserveDaemonFrame(options);
AetheriaRuntimeDaemonSoaViewSession? soaView = null;
AetheriaRuntimeZoneRenderSession? zoneRender = null;
try
{
soaView = TryReactiveDaemonSoaView(options);
zoneRender = ReactiveZoneRender(options);
soaView = TryObserveDaemonSoaView(options);
zoneRender = ObserveZoneRender(options);
return new AetheriaRuntimeObservedDaemonSession(frame, soaView, zoneRender);
}
catch
@ -338,12 +338,12 @@ namespace GameCult.Aetheria.State.Verse
}
}
private CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>? TryReactiveDaemonSoaView(
private AetheriaRuntimeDaemonSoaViewSession? TryObserveDaemonSoaView(
CultMeshReactiveDocumentOptions? options)
{
try
{
return ReactiveDaemonSoaView(options);
return ObserveDaemonSoaView(options);
}
catch (KeyNotFoundException)
{

View file

@ -1,5 +1,4 @@
using System;
using GameCult.Mesh;
#nullable enable
@ -27,9 +26,9 @@ namespace GameCult.Aetheria.State.Verse
public AetheriaRuntimeRunCheckpointCommit Run => Frame.Run;
public static bool TryCreateCurrent(
CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> frame,
CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>? soaView,
CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> zoneRender,
AetheriaRuntimeDaemonFrameSession frame,
AetheriaRuntimeDaemonSoaViewSession? soaView,
AetheriaRuntimeZoneRenderSession zoneRender,
out AetheriaRuntimeObservedDaemonState? observed)
{
observed = null;
@ -60,14 +59,14 @@ namespace GameCult.Aetheria.State.Verse
public sealed class AetheriaRuntimeObservedDaemonSession : IDisposable
{
private readonly CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> _frame;
private readonly CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>? _soaView;
private readonly CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> _zoneRender;
private readonly AetheriaRuntimeDaemonFrameSession _frame;
private readonly AetheriaRuntimeDaemonSoaViewSession? _soaView;
private readonly AetheriaRuntimeZoneRenderSession _zoneRender;
public AetheriaRuntimeObservedDaemonSession(
CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> frame,
CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>? soaView,
CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> zoneRender)
AetheriaRuntimeDaemonFrameSession frame,
AetheriaRuntimeDaemonSoaViewSession? soaView,
AetheriaRuntimeZoneRenderSession zoneRender)
{
_frame = frame ?? throw new ArgumentNullException(nameof(frame));
_soaView = soaView;