namespace AcDream.Runtime;
///
/// Identifies one exact client-session generation. Default is the
/// pre-session generation and remains a valid compare token.
///
public readonly record struct RuntimeGenerationToken(ulong Value)
{
public static RuntimeGenerationToken Initial => default;
public RuntimeGenerationToken Next() => new(checked(Value + 1UL));
public override string ToString() => Value.ToString(
System.Globalization.CultureInfo.InvariantCulture);
}
public enum RuntimeLifecycleState
{
Constructed,
Stopped,
Starting,
InWorld,
Stopping,
Faulted,
Disposed,
}
public readonly record struct RuntimeLifecycleSnapshot(
RuntimeGenerationToken Generation,
RuntimeLifecycleState State,
uint PlayerGuid,
bool HasTransport);
[Flags]
public enum RuntimeTeardownStage
{
None = 0,
CommandsInert = 1 << 0,
InboundDetached = 1 << 1,
TransportDisposed = 1 << 2,
HostReset = 1 << 3,
Complete = CommandsInert | InboundDetached | TransportDisposed | HostReset,
}
///
/// A generation-scoped acknowledgement. A caller may retry only the missing
/// suffix; completed teardown stages never replay.
///
public readonly record struct RuntimeTeardownAcknowledgement(
RuntimeGenerationToken RetiredGeneration,
RuntimeGenerationToken CurrentGeneration,
RuntimeCommandStatus Status,
RuntimeTeardownStage CompletedStages,
Exception? Error = null)
{
public bool IsComplete =>
Status == RuntimeCommandStatus.Accepted
&&
(CompletedStages & RuntimeTeardownStage.Complete)
== RuntimeTeardownStage.Complete
&& Error is null;
}