[#20] removing client when the WS connection finishes

This commit is contained in:
Felipe Ripoll 2018-07-03 09:28:31 -06:00
parent 7db13e30ea
commit cb3521678d
3 changed files with 22 additions and 4 deletions

View File

@ -52,7 +52,7 @@ defmodule POABackend.Receiver do
config :poa_backend, config :poa_backend,
:subscriptions, :subscriptions,
[ [
# {:my_receiver, [:ethereum_metrics]} {:my_receiver, [:ethereum_metrics]}
] ]
## Implementing A Receiver Plugin ## Implementing A Receiver Plugin
@ -80,6 +80,10 @@ defmodule POABackend.Receiver do
{:ok, state} {:ok, state}
end end
def handle_message(_message, state) do
{:ok, state}
end
def terminate(_state) do def terminate(_state) do
:ok :ok
end end

View File

@ -29,6 +29,8 @@ defmodule POABackend.Receivers.Dashboard do
@moduledoc false @moduledoc false
require Logger
alias POABackend.Protocol.Message alias POABackend.Protocol.Message
@behaviour :cowboy_websocket_handler @behaviour :cowboy_websocket_handler
@ -40,9 +42,13 @@ defmodule POABackend.Receivers.Dashboard do
def websocket_init(_type, req, %{receiver_id: receiver_id, ws_secret: ws_secret}) do def websocket_init(_type, req, %{receiver_id: receiver_id, ws_secret: ws_secret}) do
case :cowboy_req.parse_header("wssecret", req) do case :cowboy_req.parse_header("wssecret", req) do
{_, ^ws_secret, req} -> {_, ^ws_secret, req} ->
Logger.info("Websocket connection with dashboard client accepted")
send(receiver_id, {:add_client, self()}) send(receiver_id, {:add_client, self()})
{:ok, req, %{}} {:ok, req, %{receiver_id: receiver_id}}
{_, _, req} -> {_, _, req} ->
Logger.info("Websocket connection with dashboard client unauthorized")
{:shutdown, req} {:shutdown, req}
end end
end end
@ -55,7 +61,10 @@ defmodule POABackend.Receivers.Dashboard do
{:reply, {:text, build_message(message)}, req, state} {:reply, {:text, build_message(message)}, req, state}
end end
def websocket_terminate(_reason, _req, _state) do def websocket_terminate(_reason, _req, %{receiver_id: receiver_id}) do
Logger.warn("Websocket connection with dashboard client lost")
send(receiver_id, {:remove_client, self()})
:ok :ok
end end
@ -98,6 +107,10 @@ defmodule POABackend.Receivers.Dashboard do
{:ok, %{state | clients: [client | clients]}} {:ok, %{state | clients: [client | clients]}}
end end
def handle_message({:remove_client, client}, %{clients: clients} = state) do
{:ok, %{state | clients: List.delete(clients, client)}}
end
def terminate(_) do def terminate(_) do
:ok :ok
end end

View File

@ -66,7 +66,8 @@ defmodule POABackend.MixProject do
], ],
"Receivers": [ "Receivers": [
POABackend.Receiver, POABackend.Receiver,
POABackend.Receivers.DynamoDB POABackend.Receivers.DynamoDB,
POABackend.Receivers.Dashboard
] ]
] ]
] ]