MingaEditor.Renderer.State (Minga v0.1.0)

Copy Markdown View Source

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

editor_ref()

@type editor_ref() :: pid() | atom() | nil

frame_credit()

@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}

frame_successor()

@type frame_successor() :: MingaEditor.Renderer.FrameAttempt.t()

pipeline()

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

accept_intent(state, intent)

@spec accept_intent(t(), MingaEditor.RenderPipeline.Intent.t()) ::
  {:accepted, t()} | {:blocked, t()}

advance_credit(state)

@spec advance_credit(t()) ::
  {:idle, t()} | {:schedule, t(), MingaEditor.Renderer.FrameAttempt.t()}

await_ack(state, lease)

@spec await_ack(t(), MingaEditor.Renderer.AckLease.t()) :: t()

awaiting_lease(state)

@spec awaiting_lease(t()) :: MingaEditor.Renderer.AckLease.t() | nil

clear_rejection(state)

@spec clear_rejection(t()) :: t()

coalesce_frame(state, attempt)

@spec coalesce_frame(t(), MingaEditor.Renderer.FrameAttempt.t()) ::
  :idle | {:coalesced, t(), MingaEditor.Renderer.FrameAttempt.t() | nil}

consume_adaptation(state, ack_lease)

@spec consume_adaptation(t(), MingaEditor.Renderer.AckLease.t()) ::
  {:ok, t(), MingaEditor.RenderPipeline.Intent.t()} | :error

consume_render_token(state, token)

@spec consume_render_token(t(), reference()) ::
  {:ok, t(), MingaEditor.Renderer.FrameAttempt.t(), non_neg_integer()} | :stale

drop_buffer_down(state, ref, buffer)

@spec drop_buffer_down(t(), reference(), pid()) :: {t(), boolean()}

latest_successor(state, fallback)

new(opts)

@spec new(keyword()) :: t()

reconcile_windows(state, intent)

@spec reconcile_windows(t(), MingaEditor.RenderPipeline.Intent.t()) :: t()

record_adaptation(state, generation, frame_seq, descriptor, adapted)

rendering?(state)

@spec rendering?(t()) :: boolean()

reset_frontend(state, reason \\ :reset_required)

retry_scheduled_frame(state, token)

@spec retry_scheduled_frame(t(), reference()) :: t()

schedule_frame(state, attempt, token)

@spec schedule_frame(t(), MingaEditor.Renderer.FrameAttempt.t(), reference()) :: t()

terminal_failure(state)

@spec terminal_failure(t()) :: MingaEditor.Renderer.RejectionState.terminal() | nil

terminal_failure(state, last_good_frame_seq, reason)

@spec terminal_failure(t(), non_neg_integer(), atom()) :: t()