Skip to content

Commit 5e8582a

Browse files
authored
chore: use built-in phoenix websocket (#1011)
1 parent 0be0aed commit 5e8582a

File tree

15 files changed

+574
-320
lines changed

15 files changed

+574
-320
lines changed

config/dev.exs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ config :ae_mdw, AeMdwWeb.Endpoint,
77
watchers: [],
88
check_origin: false
99

10-
config :ae_mdw, AeMdwWeb.Endpoint,
11-
live_reload: [
12-
patterns: [
13-
~r"priv/gettext/.*(po)$",
14-
~r"lib/test_web/(live|views)/.*(ex)$",
15-
~r"lib/test_web/templates/.*(eex)$"
16-
]
17-
]
10+
config :ae_mdw, AeMdwWeb.WebsocketEndpoint,
11+
http: [port: 4001],
12+
debug_errors: true,
13+
code_reloader: false,
14+
watchers: [],
15+
check_origin: false
1816

1917
# ## SSL Support
2018
#

config/prod.secret.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ config :ae_mdw, AeMdwWeb.Endpoint,
1818
],
1919
secret_key_base: secret_key_base
2020

21+
config :ae_mdw, AeMdwWeb.WebsocketEndpoint,
22+
http: [
23+
port: String.to_integer(System.get_env("WS_PORT") || "4001"),
24+
transport_options: [socket_opts: [:inet6]]
25+
],
26+
secret_key_base: secret_key_base
27+
2128
# ## Using releases (Elixir v1.9+)
2229
#
2330
# If you are doing OTP releases, you need to instruct Phoenix

config/test.exs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,9 @@ config :ae_mdw, AeMdwWeb.Endpoint,
1313
http: [port: 4002],
1414
server: false
1515

16+
config :ae_mdw, AeMdwWeb.WebsocketEndpoint,
17+
http: [port: 4003],
18+
server: true
19+
1620
# Log warnings
1721
config :logger, level: :warn

lib/ae_mdw_web/supervisor.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ defmodule AeMdwWeb.Supervisor do
77

88
@impl true
99
def init([]) do
10-
children = [AeMdwWeb.Endpoint]
10+
children = [
11+
AeMdwWeb.Endpoint,
12+
AeMdwWeb.WebsocketEndpoint
13+
]
1114

1215
Supervisor.init(children, strategy: :one_for_one)
1316
end

lib/ae_mdw_web/websocket/broadcaster.ex

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,7 @@ defmodule AeMdwWeb.Websocket.Broadcaster do
172172
end
173173

174174
defp broadcast(channel, msg) do
175-
Riverside.LocalDelivery.deliver(
176-
{:channel, channel},
177-
{:text, msg}
178-
)
175+
AeMdwWeb.Websocket.SocketHandler.channel_broadcast(channel, msg)
179176
end
180177

181178
defp encode_message(payload, "Transactions", source),
@@ -258,7 +255,7 @@ defmodule AeMdwWeb.Websocket.Broadcaster do
258255
|> Enum.uniq()
259256
end
260257

261-
defp already_processed?(type_hash), do: EtsCache.get(@hashes_table, type_hash) != nil
258+
defp already_processed?(type_hash), do: EtsCache.member(@hashes_table, type_hash)
262259

263260
defp push_hash(type_hash), do: EtsCache.put(@hashes_table, type_hash, :ok)
264261
end

lib/ae_mdw_web/websocket/chain_listener.ex

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -61,32 +61,32 @@ defmodule AeMdwWeb.Websocket.ChainListener do
6161

6262
@impl GenServer
6363
def handle_info({:DOWN, _ref, _type, pid, _info}, state) do
64-
case :ets.member(@subs_main, pid) do
65-
true ->
66-
# main socket channel dies, all connections are disconnected. Clean all tables.
67-
Enum.each(
68-
[@subs_main, @subs_channel_targets, @subs_target_channels, @subs_pids],
69-
&:ets.delete_all_objects/1
70-
)
71-
72-
false ->
73-
spec =
74-
Ex2ms.fun do
75-
{{^pid, sub}, _} -> sub
76-
end
77-
78-
for sub <- :ets.select(@subs_channel_targets, spec) do
79-
key_to_delete = {sub, pid}
80-
:ets.delete(@subs_target_channels, key_to_delete)
64+
Process.demonitor(pid, [:flush])
65+
66+
# last connection down
67+
if :ets.info(@subs_pids, :size) <= 1 do
68+
Enum.each(
69+
[@subs_main, @subs_channel_targets, @subs_target_channels, @subs_pids],
70+
&:ets.delete_all_objects/1
71+
)
72+
else
73+
spec =
74+
Ex2ms.fun do
75+
{{^pid, sub}, _} -> sub
8176
end
8277

83-
spec_ =
84-
Ex2ms.fun do
85-
{{^pid, _}, _} -> true
86-
end
78+
for sub <- :ets.select(@subs_channel_targets, spec) do
79+
key_to_delete = {sub, pid}
80+
:ets.delete(@subs_target_channels, key_to_delete)
81+
end
8782

88-
:ets.select_delete(@subs_channel_targets, spec_)
89-
:ets.delete(@subs_pids, pid)
83+
spec_ =
84+
Ex2ms.fun do
85+
{{^pid, _}, _} -> true
86+
end
87+
88+
:ets.select_delete(@subs_channel_targets, spec_)
89+
:ets.delete(@subs_pids, pid)
9090
end
9191

9292
{:noreply, state}

0 commit comments

Comments
 (0)