[#20] removing client when the WS connection finishes
This commit is contained in:
parent
7db13e30ea
commit
cb3521678d
|
@ -52,7 +52,7 @@ defmodule POABackend.Receiver do
|
|||
config :poa_backend,
|
||||
:subscriptions,
|
||||
[
|
||||
# {:my_receiver, [:ethereum_metrics]}
|
||||
{:my_receiver, [:ethereum_metrics]}
|
||||
]
|
||||
|
||||
## Implementing A Receiver Plugin
|
||||
|
@ -80,6 +80,10 @@ defmodule POABackend.Receiver do
|
|||
{:ok, state}
|
||||
end
|
||||
|
||||
def handle_message(_message, state) do
|
||||
{:ok, state}
|
||||
end
|
||||
|
||||
def terminate(_state) do
|
||||
:ok
|
||||
end
|
||||
|
|
|
@ -29,6 +29,8 @@ defmodule POABackend.Receivers.Dashboard do
|
|||
|
||||
@moduledoc false
|
||||
|
||||
require Logger
|
||||
|
||||
alias POABackend.Protocol.Message
|
||||
|
||||
@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
|
||||
case :cowboy_req.parse_header("wssecret", req) do
|
||||
{_, ^ws_secret, req} ->
|
||||
Logger.info("Websocket connection with dashboard client accepted")
|
||||
|
||||
send(receiver_id, {:add_client, self()})
|
||||
{:ok, req, %{}}
|
||||
{:ok, req, %{receiver_id: receiver_id}}
|
||||
{_, _, req} ->
|
||||
Logger.info("Websocket connection with dashboard client unauthorized")
|
||||
|
||||
{:shutdown, req}
|
||||
end
|
||||
end
|
||||
|
@ -55,7 +61,10 @@ defmodule POABackend.Receivers.Dashboard do
|
|||
{:reply, {:text, build_message(message)}, req, state}
|
||||
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
|
||||
end
|
||||
|
||||
|
@ -98,6 +107,10 @@ defmodule POABackend.Receivers.Dashboard do
|
|||
{:ok, %{state | clients: [client | clients]}}
|
||||
end
|
||||
|
||||
def handle_message({:remove_client, client}, %{clients: clients} = state) do
|
||||
{:ok, %{state | clients: List.delete(clients, client)}}
|
||||
end
|
||||
|
||||
def terminate(_) do
|
||||
:ok
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue