Antenna Cheatsheet
View SourceSetting 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