Packages
event_bus
1.5.1
1.7.0
1.6.2
1.6.1
1.6.0
retired
1.5.2
retired
1.5.1
retired
1.5.0
retired
1.4.4
retired
1.4.3
retired
1.4.2
retired
1.4.1
retired
1.4.0
retired
1.3.8
retired
1.3.7
retired
1.3.6
retired
1.3.5
retired
1.3.4
retired
1.3.3
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.0
retired
1.1.3
retired
1.1.2
retired
1.1.1
retired
1.1.0
retired
1.0.0
retired
1.0.0-beta4
retired
1.0.0-beta3
retired
1.0.0-beta2
retired
1.0.0-beta1
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.1
retired
0.6.0
retired
0.5.0
retired
0.4.1
retired
0.4.0
retired
0.3.1
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.0
retired
Traceable, extendable and minimalist event bus implementation for Elixir with built-in event store and event watcher based on ETS
Retired package: Deprecated - Please prefer always the latest minor for the bug fixes and minor enhancements
Current section
Files
Jump to
Current section
Files
lib/event_bus/event_source.ex
defmodule EventBus.EventSource do
@moduledoc """
Event builder and notifier blocks/yields for EventBus
"""
alias EventBus.Model.Event
alias EventBus.Util.MonotonicTime
alias __MODULE__
defmacro __using__(_) do
quote do
require EventBus.EventSource
alias EventBus.EventSource
alias EventBus.Model.Event
alias EventBus.Util.Base62
@eb_app :event_bus
@eb_id_gen Application.get_env(@eb_app, :id_generator, Base62)
@eb_source String.replace("#{__MODULE__}", "Elixir.", "")
@eb_ttl Application.get_env(@eb_app, :ttl)
end
end
@doc """
Dynamic event builder block with auto setting source, initialized_at and
occurred_at fields in microseconds
"""
defmacro build(params, do: yield) do
quote do
initialized_at = MonotonicTime.now()
params = unquote(params)
{topic, data} =
case unquote(yield) do
{:error, error} ->
{params[:error_topic] || params[:topic], {:error, error}}
result ->
{params[:topic], result}
end
id = Map.get(params, :id, @eb_id_gen.unique_id())
%Event{
id: id,
topic: topic,
transaction_id: Map.get(params, :transaction_id, id),
data: data,
initialized_at: initialized_at,
occurred_at: MonotonicTime.now(),
source: Map.get(params, :source, @eb_source),
ttl: Map.get(params, :ttl, @eb_ttl)
}
end
end
@doc """
Dynamic event notifier block with auto setting source, initialized_at and
occurred_at fields in microseconds
"""
defmacro notify(params, do: yield) do
quote do
event =
EventSource.build unquote(params) do
unquote(yield)
end
EventBus.notify(event)
event.data
end
end
end