Antenna Cheatsheet

View Source

Setting up matchers

match/4

Matches events against a pattern and executes handler when matched

Antenna.match(MyApp.Antenna, pattern, handler, opts \\ [])

Pattern can be any Elixir pattern with guards

{:user_event, user_id, action}
%{type: :order, amount: amount} when amount > 1000
{:error, _reason} = error

Handler can be a pid, function, or list of handlers

self()
&Logger.info/1
fn channel, event -> handle_event(event) end
[&Logger.error/1, &Notifier.alert/1]

Common Patterns

High-value orders

Antenna.match(MyApp.Antenna,
  %{event: :order_created, total: total} when total > 1000,
  &HighValueOrderProcessor.handle/1,
  channels: [:orders])

Error monitoring

Antenna.match(MyApp.Antenna, 
  {:error, _},
  [&Logger.error/1, &Notifier.alert/1],
  channels: [:system])

Temperature alerts

Antenna.match(MyApp.Antenna,
  {:temperature, celsius, location} when celsius > 30,
  fn _, event -> handle_high_temp(event) end,
  channels: [:sensors])

Handling events

event/3

Sends an event to all the channels specified and responds immediately

Antenna.event(id, channels, event)

Broadcasts an event asynchronously to all matching handlers

Antenna.event(MyApp.Antenna, [:users], {:user_login, "123"})
Antenna.event(MyApp.Antenna, [:metrics], %{cpu: 80})

sync_event/3,4

Sends an event to all the channels specified and waits for responds

Antenna.sync_event(id, channels, event, timeout \\ 5_000)

Broadcasts event synchronously and collects responses

responses = Antenna.sync_event(MyApp.Antenna, [:auth], {:verify, token})

Adding handlers/subscribers to events

subscribe/3

Subscribes the handlers(s) to channel(s)

Antenna.subscribe(id, channels, handler)

Subscribe handler to channels manually

Antenna.subscribe(MyApp.Antenna, [:logs], &Logger.info/1)
Antenna.subscribe(MyApp.Antenna, [:errors], error_handler_pid)

Testing

Match and receive events

Declaration

test "matches events" do
  Antenna.match(TestAntenna,
    {:test, value} when value > 0,
    self(),
    channels: [:test])
  # ⇓ see below ⇓ 

Validation

  # ⇑ see above ⇑ 
  Antenna.event(TestAntenna, [:test], {:test, 42})
  assert_receive {:antenna_event, :test, {:test, 42}}
end