defmodule Emit do alias Emit.{Cluster, DB} alias Lethe.Query def sub(metadata) when is_map(metadata) do DB.set key(), metadata end def unsub do DB.del key() end def pub(msg, %Query{} = query) do [Node.self() | Node.list()] |> Enum.map(fn node -> target = if node == Node.self() do Cluster.task_supervisor() else {Cluster.task_supervisor(), node} end Task.Supervisor.async target, fn -> query |> DB.query |> Manifold.send(msg) end end) |> Enum.each(&Task.await/1) end def query, do: DB.new_query() defp key, do: self() end