# `Denox.CallbackHandler`
[🔗](https://github.com/gsmlg-dev/denox/blob/v0.9.0/lib/denox/callback_handler.ex#L1)

GenServer that handles JS → Elixir callbacks for a Denox runtime.

When JavaScript code calls `Denox.callback(name, arg1, arg2, ...)`,
this handler receives the request, invokes the registered Elixir function,
and sends the result back to JavaScript.

## Usage

    # 1. Start a callback handler with named functions
    {:ok, handler} = Denox.CallbackHandler.start_link(
      callbacks: %{
        "greet" => fn [name] -> "Hello, #{name}!" end,
        "add" => fn [a, b] -> a + b end
      }
    )

    # 2. Create a runtime with the handler's PID
    {:ok, rt} = Denox.runtime(callback_pid: handler)

    # 3. JavaScript can now call back to Elixir
    {:ok, result} = Denox.eval(rt, ~s[Denox.callback("greet", "Alice")])
    # result => ""Hello, Alice!""

## Convenience

Use `Denox.CallbackHandler.runtime/1` to create both handler and runtime in one call:

    {:ok, rt, handler} = Denox.CallbackHandler.runtime(
      callbacks: %{"add" => fn [a, b] -> a + b end},
      base_dir: "/some/path"
    )

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `runtime`

```elixir
@spec runtime(keyword()) :: {:ok, Denox.runtime(), pid()} | {:error, String.t()}
```

Create a callback handler and runtime together.

Options:
  - `:callbacks` - map of callback name to function (required)
  - All other options are passed to `Denox.runtime/1`

Returns `{:ok, runtime, handler_pid}` or `{:error, reason}`.

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start()
```

Start a callback handler.

Options:
  - `:callbacks` - map of callback name (string) to function (required).
    Each function receives a list of decoded JSON arguments.

---

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