defmodule Multiverses.Plug do @moduledoc """ A module `Plug` that intercepts an http request and temporarily assigns the callers stack of the http request to the `Http` shard stored in the `x-multiverse-id` header of the http request """ @behaviour Plug alias Plug.Conn def init(_), do: [] def call(conn, _) do case Conn.get_req_header(conn, "x-multiverse-id") do [multiverse_id] -> old_callers = Process.get(:"$callers") multiverse_id |> String.to_integer() |> Multiverses.Http.adopt_callers() Conn.register_before_send(conn, &restore_callers(&1, old_callers)) [] -> conn end end defp restore_callers(conn, old_callers) do if old_callers do Process.put(:"$callers", old_callers) else Process.delete(:"$callers") end conn end end