1defmodule Drinkup.ConsumerGroup do
2 @moduledoc """
3 Register consumers and dispatch events to them.
4 """
5
6 alias Drinkup.Event
7
8 @scope __MODULE__
9 @group :consumers
10
11 def start_link(_) do
12 :pg.start_link(@scope)
13 end
14
15 def child_spec(opts) do
16 %{
17 id: __MODULE__,
18 start: {__MODULE__, :start_link, [opts]},
19 type: :worker,
20 restart: :permanent,
21 shutdown: 500
22 }
23 end
24
25 @spec join() :: :ok
26 def join(), do: join(self())
27
28 @spec join(pid()) :: :ok
29 def join(pid), do: :pg.join(@scope, @group, pid)
30
31 @spec dispatch(Event.t()) :: :ok
32 def dispatch(event) do
33 @scope
34 |> :pg.get_members(@group)
35 |> Enum.each(&send(&1, {:event, event}))
36 end
37
38 # TODO: read `:pg` docs on what `monitor` is used fo
39end