Shout (Shout v0.1.0) View Source
A small library that provides Elixir modules with subscribe/publish functionality.
- Separate core business logic from external concerns
- Publish events synchronously or asynchronously
Usage
Create your router, usually one per app but can be many. You'll define all the subscriptions in there. It's simply a GenServer that will keep track of subscriptions and allow you to add or remove more. (Don't forget to add it to your supervision tree)
Router
defmodule MyApp.Events do
use Shout.Router
subscribe(MyApp.Users.Create, :user_created, to: &MyApp.Emails.welcome_email/1)
# Runs it asynchronously (uses Kernel.spawn/1)
subscribe(MyApp.Users.Updated, :user_updated, to: &MyApp.Service.custom_task/1, asnyc: true)
end
A subscription can be added at runtime too:
MyApp.Events.subscribe(MyApp.SomeTask, :success, &MyApp.Notify.send_email/1)
Shout will make sure there are no duplicate subscriptions.
Publishing
By default when publishing an event using broadcast
the subscriptions will be executed synchronously.
defmodule MyApp.Users.Create do
use MyApp.Events.Publisher
def create(params) do
user = User.create(params)
broadcast(:user_created, user) # Will trigger: MyApp.Emails.welcome_email/1
end
end