Complete long-lived state owned by MingaEditor.Renderer.Server.
Renderer caches, font registration, frontend acknowledgement state, resident
windows, observed buffer monitors, and coalesced frame credit live here. Public
transitions centralize lifecycle cleanup so window close, buffer replacement,
reset, and exact monitor :DOWN all discard the same state.
Summary
Types
@type frame_credit() :: :idle | {:scheduled, reference(), MingaEditor.Renderer.FrameAttempt.t(), non_neg_integer(), frame_successor() | nil} | {:awaiting_ack, MingaEditor.Renderer.AckLease.t(), frame_successor() | nil}
@type frame_successor() :: MingaEditor.Renderer.FrameAttempt.t()
@type pipeline() :: (MingaEditor.RenderPipeline.Input.t() -> MingaEditor.RenderPipeline.Input.t())
@type t() :: %MingaEditor.Renderer.State{ ack_timeout_ms: pos_integer(), caches: MingaEditor.Renderer.Caches.t(), editor_pid: editor_ref(), font_registry: MingaEditor.UI.FontRegistry.t(), frame_credit: frame_credit(), message_store: MingaEditor.UI.Panel.MessageStore.t() | nil, observed_buffers: MingaEditor.Renderer.ObservedBuffers.t(), pipeline: pipeline(), rejection_state: MingaEditor.Renderer.RejectionState.t(), require_ack?: boolean(), resident_windows: %{ optional(MingaEditor.Window.id()) => MingaEditor.Renderer.ResidentWindowState.t() } }
Functions
@spec accept_intent(t(), MingaEditor.RenderPipeline.Intent.t()) :: {:accepted, t()} | {:blocked, t()}
@spec advance_credit(t()) :: {:idle, t()} | {:schedule, t(), MingaEditor.Renderer.FrameAttempt.t()}
@spec await_ack(t(), MingaEditor.Renderer.AckLease.t()) :: t()
@spec awaiting_lease(t()) :: MingaEditor.Renderer.AckLease.t() | nil
@spec coalesce_frame(t(), MingaEditor.Renderer.FrameAttempt.t()) :: :idle | {:coalesced, t(), MingaEditor.Renderer.FrameAttempt.t() | nil}
@spec consume_adaptation(t(), MingaEditor.Renderer.AckLease.t()) :: {:ok, t(), MingaEditor.RenderPipeline.Intent.t()} | :error
@spec consume_render_token(t(), reference()) :: {:ok, t(), MingaEditor.Renderer.FrameAttempt.t(), non_neg_integer()} | :stale
@spec latest_successor(t(), MingaEditor.Renderer.FrameAttempt.t()) :: MingaEditor.Renderer.FrameAttempt.t()
@spec reconcile_windows(t(), MingaEditor.RenderPipeline.Intent.t()) :: t()
@spec record_adaptation( t(), non_neg_integer(), non_neg_integer(), MingaEditor.Frontend.ResourcePolicy.adaptation_descriptor(), MingaEditor.RenderPipeline.Intent.t() ) :: {:ok, t()} | {:error, t()}
@spec reset_frontend(t(), MingaEditor.Renderer.ResidentWindowState.hydration_reason()) :: t()
@spec schedule_frame(t(), MingaEditor.Renderer.FrameAttempt.t(), reference()) :: t()
@spec terminal_failure(t()) :: MingaEditor.Renderer.RejectionState.terminal() | nil
@spec terminal_failure(t(), non_neg_integer(), atom()) :: t()