Current section
Files
Jump to
Current section
Files
lib/emit.ex
defmodule Emit do
alias Emit.{Cluster, DB}
alias Lethe.Query
def sub(key \\ key(), metadata) when is_map(metadata) do
DB.set(key, metadata)
end
def unsub(key \\ key()) do
DB.del(key)
end
def unsub_auto(key \\ key()) do
spawn(fn ->
Process.monitor(key)
receive do
{:DOWN, _ref, :process, _pid, _reason} ->
DB.del(key)
end
end)
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