# `MingaEditor.Renderer.RecoveryHandler`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga_editor/renderer/recovery_handler.ex#L1)

Owns connection reset, timeout recovery, and targeted window recovery.

# `request_result`

```elixir
@type request_result() :: :recovery_started | :stale
```

# `adapted`

```elixir
@spec adapted(MingaEditor.Renderer.State.t(), non_neg_integer(), atom()) ::
  {:noreply, MingaEditor.Renderer.State.t()}
```

Starts one fresh-generation retry only after consuming explicit adaptation evidence.

# `keyframe`

```elixir
@spec keyframe(
  MingaEditor.Renderer.State.t(),
  MingaEditor.RenderPipeline.Intent.t(),
  non_neg_integer(),
  integer()
) :: {:reply, :ok, MingaEditor.Renderer.State.t()}
```

Forces a same-connection keyframe while retaining acknowledged presentation leases.

# `keyframe_sync`

```elixir
@spec keyframe_sync(
  MingaEditor.Renderer.State.t(),
  MingaEditor.RenderPipeline.Intent.t(),
  non_neg_integer(),
  integer()
) ::
  {:reply,
   {:ok, MingaEditor.Renderer.RenderReceipt.t()} | {:error, Exception.t()},
   MingaEditor.Renderer.State.t()}
```

Renders a synchronous same-connection keyframe without abandoning presentation leases.

# `request`

```elixir
@spec request(MingaEditor.Renderer.State.t(), non_neg_integer(), non_neg_integer()) ::
  {:reply, request_result(), MingaEditor.Renderer.State.t()}
```

# `reset`

```elixir
@spec reset(
  MingaEditor.Renderer.State.t(),
  MingaEditor.RenderPipeline.Intent.t(),
  non_neg_integer(),
  integer()
) :: {:reply, :ok, MingaEditor.Renderer.State.t()}
```

# `reset_sync`

```elixir
@spec reset_sync(
  MingaEditor.Renderer.State.t(),
  MingaEditor.RenderPipeline.Intent.t(),
  non_neg_integer(),
  integer()
) ::
  {:reply,
   {:ok, MingaEditor.Renderer.RenderReceipt.t()} | {:error, Exception.t()},
   MingaEditor.Renderer.State.t()}
```

Resets frontend state and renders a synchronous recovery keyframe.

# `transaction`

```elixir
@spec transaction(
  MingaEditor.Renderer.State.t(),
  MingaEditor.Renderer.FrameAttempt.t()
) ::
  {:noreply, MingaEditor.Renderer.State.t()}
```

Starts transaction recovery from the latest semantic intent.

# `window`

```elixir
@spec window(
  MingaEditor.Renderer.State.t(),
  MingaEditor.Renderer.FrameAttempt.t(),
  non_neg_integer()
) ::
  {:noreply, MingaEditor.Renderer.State.t()}
```

Recovers one missed retained window without resetting unrelated frontend state.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
