From f571c8342ab88ebb4f5acf594cdbf2d34fb215d6 Mon Sep 17 00:00:00 2001 From: Benjamin Milde Date: Wed, 8 Feb 2023 18:33:27 +0100 Subject: [PATCH 1/2] Address #14 --- lib/sink/connection/server.ex | 8 +++----- lib/sink/connection/server_handler.ex | 8 ++++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/sink/connection/server.ex b/lib/sink/connection/server.ex index 8465bf6..75c51d3 100644 --- a/lib/sink/connection/server.ex +++ b/lib/sink/connection/server.ex @@ -7,17 +7,15 @@ defmodule Sink.Connection.Server do """ @spec connected_clients() :: list(String.t()) def connected_clients do - Registry.select(@registry, [{{:"$1", :_, :_}, [], [:"$1"]}]) + Registry.select(@registry, [{{:"$1", :_, :"$2"}, [{:"/=", :"$2", nil}], [:"$1"]}]) end @doc """ Returns the number of currently connected clients. - - For large numbers of connected clients this will be more performant than `connected_clients` """ @spec connected_clients_count() :: non_neg_integer() def connected_clients_count do - Registry.count(@registry) + length(connected_clients()) end @doc """ @@ -29,7 +27,7 @@ defmodule Sink.Connection.Server do |> Registry.lookup(client_id) |> case do [] -> nil - [{_pid, connected_at}] -> connected_at + [{_pid, connected_at_or_nil}] -> connected_at_or_nil end end end diff --git a/lib/sink/connection/server_handler.ex b/lib/sink/connection/server_handler.ex index d94764d..b91c040 100644 --- a/lib/sink/connection/server_handler.ex +++ b/lib/sink/connection/server_handler.ex @@ -233,7 +233,7 @@ defmodule Sink.Connection.ServerHandler do ) :ok = - case Registry.register(@registry, client_id, DateTime.utc_now()) do + case Registry.register(@registry, client_id, nil) do {:ok, _} -> :ok @@ -401,6 +401,10 @@ defmodule Sink.Connection.ServerHandler do handler.handle_connection_response(new_state.client, other) end + if ConnectionStatus.connected?(new_state.connection_status) do + Registry.update_value(@registry, client_id, fn _ -> DateTime.utc_now() end) + end + {new_state, {:connection_response, {:connection_response, encodeable_response}}} {:ack, message_id} -> @@ -554,7 +558,7 @@ defmodule Sink.Connection.ServerHandler do end defp register_when_clear(client_id) do - case Registry.register(@registry, client_id, DateTime.utc_now()) do + case Registry.register(@registry, client_id, nil) do {:ok, _} -> :ok From 0c7e6261b420650f263093ea37b6ea1ad3b9791a Mon Sep 17 00:00:00 2001 From: Benjamin Milde Date: Wed, 8 Feb 2023 18:39:42 +0100 Subject: [PATCH 2/2] Add tests --- test/sink/connection_test.exs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/sink/connection_test.exs b/test/sink/connection_test.exs index 19cb363..44f33e8 100644 --- a/test/sink/connection_test.exs +++ b/test/sink/connection_test.exs @@ -111,6 +111,8 @@ defmodule Sink.ConnectionTest do assert Sink.Connection.Client.connected?() assert Sink.Connection.ServerHandler.connected?("abc123") + assert %DateTime{} = Sink.Connection.Server.connected_at("abc123") + assert "abc123" in Sink.Connection.Server.connected_clients() assert_received msg assert {:handle_connection_response, :connected} = msg @@ -157,6 +159,8 @@ defmodule Sink.ConnectionTest do assert Sink.Connection.Client.connected?() assert Sink.Connection.ServerHandler.connected?("abc123") + assert %DateTime{} = Sink.Connection.Server.connected_at("abc123") + assert "abc123" in Sink.Connection.Server.connected_clients() stop_supervised!(Sink.Connection.Client) stop_supervised!(Sink.Connection.ServerListener) @@ -197,6 +201,8 @@ defmodule Sink.ConnectionTest do assert Sink.Connection.Client.connected?() assert Sink.Connection.ServerHandler.connected?("abc123") + assert %DateTime{} = Sink.Connection.Server.connected_at("abc123") + assert "abc123" in Sink.Connection.Server.connected_clients() stop_supervised!(Sink.Connection.Client) stop_supervised!(Sink.Connection.ServerListener) @@ -235,6 +241,8 @@ defmodule Sink.ConnectionTest do refute Sink.Connection.Client.connected?() refute Sink.Connection.ServerHandler.connected?("abc123") + refute Sink.Connection.Server.connected_at("abc123") + refute "abc123" in Sink.Connection.Server.connected_clients() # # give it time to connect @@ -242,6 +250,8 @@ defmodule Sink.ConnectionTest do assert Sink.Connection.Client.connected?() assert Sink.Connection.ServerHandler.connected?("abc123") + assert %DateTime{} = Sink.Connection.Server.connected_at("abc123") + assert "abc123" in Sink.Connection.Server.connected_clients() stop_supervised!(Sink.Connection.Client) stop_supervised!(Sink.Connection.ServerListener) @@ -282,6 +292,8 @@ defmodule Sink.ConnectionTest do refute Sink.Connection.Client.connected?() refute Sink.Connection.ServerHandler.connected?("abc123") + refute Sink.Connection.Server.connected_at("abc123") + refute "abc123" in Sink.Connection.Server.connected_clients() assert {:error, :no_connection} == Sink.Connection.Client.publish(@event, @ack_key) @@ -327,6 +339,8 @@ defmodule Sink.ConnectionTest do refute Sink.Connection.Client.connected?() refute Sink.Connection.ServerHandler.connected?("abc123") + refute Sink.Connection.Server.connected_at("abc123") + refute "abc123" in Sink.Connection.Server.connected_clients() assert {:error, :no_connection} == Sink.Connection.Client.publish(@event, @ack_key) @@ -368,6 +382,8 @@ defmodule Sink.ConnectionTest do refute Sink.Connection.Client.connected?() refute Sink.Connection.ServerHandler.connected?("abc123") + refute Sink.Connection.Server.connected_at("abc123") + refute "abc123" in Sink.Connection.Server.connected_clients() stop_supervised!(Sink.Connection.Client) stop_supervised!(Sink.Connection.ServerListener) @@ -408,6 +424,8 @@ defmodule Sink.ConnectionTest do refute Sink.Connection.Client.connected?() refute Sink.Connection.ServerHandler.connected?("abc123") + refute Sink.Connection.Server.connected_at("abc123") + refute "abc123" in Sink.Connection.Server.connected_clients() stop_supervised!(Sink.Connection.Client) stop_supervised!(Sink.Connection.ServerListener)