Elixir ATProtocol firehose & subscription listener
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