# ![Logo](/stuff/logo-48x48.png?raw=true) Envío

[![CircleCI](](     **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, "~> 0.3"}

## 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)

### Simple subscriber ([`dispatch`](

Just register your handler anywhere in the code:

  {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}

## Changelog

* `0.5.0` → removed a dependency from `Slack` package

* `0.4.0` → better docs and other enhancements

* `0.3.0` → `Envio.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.)

## [Documentation](