| defmodule PerplexityMacro.TraceHub do | |
| use GenServer | |
| def publish(trace), do: GenServer.cast(__MODULE__, {:trace, trace}) | |
| def subscribe, do: Phoenix.PubSub.subscribe(PerplexityMacro.PubSub, "macro_vm:trace") | |
| def latest(n), do: GenServer.call(__MODULE__, {:latest, n}) | |
| def init(_), do: {:ok, %{queue: :queue.new(), size: 0}} | |
| def handle_cast({:trace, t}, s) do | |
| Phoenix.PubSub.broadcast(PerplexityMacro.PubSub, "macro_vm:trace", {:vm_trace, t}) | |
| q = :queue.in(t, s.queue) | |
| {q, sz} = if s.size + 1 > 50000 do {:queue.drop(q), s.size} else {q, s.size + 1} end | |
| {:noreply, %{s | queue: q, size: sz}} | |
| end | |
| def handle_call({:latest, n}, _from, s), do: {:reply, s.queue |> :queue.to_list() |> Enum.take(-n), s} | |
| end | |