test/support/voice_sideband_provider.ex

main at 58e6347eeb72 · 1 KB

defmodule OpenAgents.Voice.TestSidebandProvider do
  @behaviour OpenAgents.Voice.SidebandProvider

  @impl true
  def start_link(owner, session, _config) do
    process = spawn_link(fn -> loop(owner) end)

    if observer = Application.get_env(:openagents, :voice_sideband_test_observer) do
      send(observer, {:sideband_started, process, session})
    end

    send(owner, {:voice_sideband_connected, session.id, session.generation, process})
    {:ok, process}
  end

  @impl true
  def send_event(process, event) do
    send(process, {:send_event, event})
    :ok
  end

  @impl true
  def close(process) do
    send(process, :close)
    :ok
  end

  defp loop(owner) do
    receive do
      {:send_event, event} ->
        if observer = Application.get_env(:openagents, :voice_sideband_test_observer) do
          send(observer, {:sideband_event_sent, event})
        end

        loop(owner)

      {:provider_event, session, event} ->
        send(owner, {:voice_provider_event, session.id, session.generation, event})
        loop(owner)

      :disconnect ->
        send(owner, :test_sideband_disconnected)

      :close ->
        :ok
    end
  end
end