Skip to content

Application-wide registry with handy helpers to ease dispatching

License

Notifications You must be signed in to change notification settings

am-kantox/envio

Repository files navigation

Logo Envío    Kantox ❤ OSS  Test  Dialyzer

Application-wide registry with handy helpers to ease dispatching.

Installation

Simply add envio to your list of dependencies in mix.exs:

def deps do
  [
    {:envio, "~> 1.0"}
  ]
end

Usage

Simple publisher

Use Envio.Publisher helper to scaffold the registry publisher. It provides broadcast/2 helper (and brodcast/1 if the default channel is set.)

defmodule Spitter.Registry do
  use Envio.Publisher, channel: :main

  def spit(channel, what), do: broadcast(channel, what)
  def spit(what), do: broadcast(what)
end

Simple subscriber (dispatch)

Just register your handler anywhere in the code:

Envio.register(
  {Sucker, :suck},
  dispatch: %Envio.Channel{source: Spitter.Registry, name: :foo}
)

Sucker.suck/1 will be called with a payload.

PubSub subscriber (pub_sub)

Use Envio.Subscriber helper to scaffold the registry subscriber. Implement handle_envio/2 for custom message handling. The default implementation collects last 10 messages in it’s state.

defmodule PubSucker do
  use Envio.Subscriber, channels: [{Spitter.Registry, :foo}]

  def handle_envio(message, state) do
    {:noreply, state} = super(message, state)
    IO.inspect({message, state}, label: "PubSucked")
    {:noreply, state}
  end
end

Phoenix.PubSub subscriber (phoenix_pub_sub)

Use manager: :phoenix_pub_sub for distributed message broadcasting. The implementation below subscribes to "main" channel in the distributed OTP environment and prints out each subsequent incoming message to standard output.

defmodule Pg2Sucker do
  use Envio.Subscriber, channels: ["main"], manager: :phoenix_pub_sub

  def handle_envio(message, state) do
    {:noreply, state} = super(message, state)
    IO.inspect({message, state}, label: "Received")
    {:noreply, state}
  end
end

The publisher this subscriber might be listening to would look like

defmodule Pg2Spitter do
  use Envio.Publisher, manager: :phoenix_pub_sub, channel: "main"
  def spit(channel, what), do: broadcast(channel, what)
  def spit(what), do: broadcast(what)
end

Changelog

  • 1.0.0 → Modern Elixir v1.16 update, no more features planned
  • 0.10.2 → Accept :warning alongside :warn
  • 0.10.1 → Runtime configs for backends via {:system, value} tuples
  • 0.10.0 → Process backend
  • 0.8.0 → Phoenix.PubSub support (+ backend)
  • 0.5.0 → removed a dependency from Slack package
  • 0.4.0 → better docs and other enhancements
  • 0.3.0Envio.Backend and infrastructure for backends; Slack as an example.

ToDo

  • Back pressure with GenStage for :dispatch kind of delivery;
  • Set of backends for easy delivery (slack, redis, rabbit, etc.)

About

Application-wide registry with handy helpers to ease dispatching

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages