Actioncable

Installation

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

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,

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

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.SocketHandlerand implement handle_client_messagefunction.

- 4) Start a Redix connection named :redix_ac

(it will be used for storing websocket pid in corresponding channel.)

In your application.ex :

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

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

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

Example:
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:
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