defmodule AbsintheWebSocket.QueryServer do use GenServer def start_link(args, opts) do socket = Keyword.get(args, :socket) state = %{ socket: socket, queries: %{}, } GenServer.start_link(__MODULE__, state, opts) end def init(state) do {:ok, state} end def post(mod, query, variables \\ [], opts \\ []) do GenServer.call(mod, {:post, query, variables}, opts[:timeout] || 5_000) end def handle_call({:post, query, variables}, from, %{socket: socket, queries: queries} = state) do ref = make_ref() AbsintheWebSocket.WebSocket.query(socket, self(), ref, query, variables) queries = Map.put(queries, ref, from) state = Map.put(state, :queries, queries) {:noreply, state} end def handle_cast({:query_response, ref, response}, %{queries: queries} = state) do {from, queries} = Map.pop(queries, ref) GenServer.reply(from, response) state = Map.put(state, :queries, queries) {:noreply, state} end end