Current section
Files
Jump to
Current section
Files
lib/support/memory.ex
defmodule Hivent.Memory do
alias Hivent.{Event, Config}
alias Event.Meta
defmodule Emitter do
defmodule Cache do
use GenServer
@name __MODULE__
def start_link do
GenServer.start_link(__MODULE__, :ok, [name: @name])
end
# API
def insert(value) do
GenServer.cast(@name, {:insert, value})
end
def all do
GenServer.call(@name, {:all})
end
def last do
GenServer.call(@name, {:last})
end
def clear do
GenServer.cast(@name, {:clear})
end
# Callbacks
def init(:ok) do
{:ok, []}
end
def handle_cast({:insert, value}, cache) do
{:noreply, cache ++ [value]}
end
def handle_cast({:clear}, _cache) do
{:noreply, []}
end
def handle_call({:last}, _from, cache) do
{:reply, List.last(cache), cache}
end
def handle_call({:all}, _from, cache) do
{:reply, cache, cache}
end
end
def emit(name, payload, %{version: version} = options, created_at \\ Timex.now) when is_integer(version) do
build_message(name, payload, options[:cid], version, created_at) |> Cache.insert
end
defp build_message(name, payload, cid, version, created_at) do
%Event{
payload: payload,
meta: meta_data(name, cid, version, created_at)
}
end
defp meta_data(name, cid, version, created_at) do
%Meta{
uuid: UUID.uuid4(:hex),
name: name,
version: version || 1,
cid: cid || UUID.uuid4(:hex),
producer: Config.get(:hivent, :client_id),
created_at: created_at |> DateTime.to_iso8601
}
end
end
def start(_type, _args) do
{:ok, _} = Emitter.Cache.start_link
end
def emit(name, payload, options) do
Emitter.emit(name, payload, options)
end
end