README.md

# Actioncable

## Installation

### - 1) Add the `:actioncable` dependency to your mix.exs file

```elixir
defp deps() do
  [
    {:actioncable, "~> 0.2.0"}
  ]
```

Then, run `mix deps.get` in your shell to fetch the new dependencies.


### - 2) Add this configuration in config/config.ex,

```elixir
config :application, ApplicationWeb.Endpoint,
  check_origin: false,
    http: [
      dispatch: [
        {:_, [
          {"/cable", SocketHandler, []},
          {:_, Phoenix.Endpoint.Cowboy2Handler, {ApplicationWeb.Endpoint, []}}
        ]}
      ]
    ],
    subprotocols: ["actioncable-v1-json"]
```

It will redirect every url ending by "/cable" to Cowboy Websocket Handler.
Other url will be redirect in your Endpoint as usual.

### - 3) Create module : `SocketHandler`

```elixir
defmodule SocketHandler do
  use Actioncable.SocketHandler

  def handle_client_message(message) do
    #Handle message from JS client the way you want it ;)
    IO.inspect message
  end

end

```

This module has to `use Actioncable.SocketHandler`and implement `handle_client_message`function.


### - 4) Start a Redix connection named `:redix_ac`
(it will be used for storing websocket pid in corresponding channel.)

In your application.ex :

```elixir
def start(_type, _args) do
  children = [
    %{
      id: Redix,
      start: {Redix, :start_link, ["redis://localhost:6379/0", [name: :redix_ac]]}
    }
  ]
end
```
Of course, you can use any valid redis uri ("redis://localhost:6379/0" is just an example). You just have to name the redis connection :redix_ac.

### Usage

- Receive message : As seen above, every message will be transfered in this function : `handle_client_message(message)` (In `SocketHandler` module)

- Send message: 

If the JS client subscribe with `{channel: "XXX", id: "XXX"}` :

   use `Actioncable.Channel.broadcast(channel, id, message)`

    Example:
```elixir
    iex>  Actioncable.Channel.broadcast("room", "1", %{"action"=>"write", "args" => "hello"})

    iex>  Actioncable.Channel.broadcast("room", "1", %{"action"=>"write"})
```

    Broadcast message to all subscriber from given channel.

else (subscription in JS with channel only)

   use `Actioncable.Channel.broadcast(channel, message)`

    Example:
```elixir 
    iex> Actioncable.Channel.broadcast("room_1", %{"action"=>"write", "args" => "hello"})

    iex> Actioncable.Channel.broadcast("room_1", %{"action"=>"write"})
```

    Broadcast message to all subscriber from given channel. 

### Improvement

- Do not hesitate to perform pull request, this is a first version and there are a lot of things that need to be improved