Skip to content

Commit fe132cc

Browse files
committed
Add support for when a device disconnects
1 parent 2dfbba6 commit fe132cc

File tree

2 files changed

+24
-45
lines changed

2 files changed

+24
-45
lines changed

lib/nerves_hub/rpc/device_auth.ex

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,28 @@ defmodule NervesHub.RPC.DeviceAuth do
5252
end
5353
end
5454

55+
def disconnect_device({:error, {:shutdown, :disconnected}}, device, reference_id) do
56+
:telemetry.execute([:nerves_hub, :devices, :duplicate_connection], %{count: 1}, %{
57+
ref_id: reference_id,
58+
device: device
59+
})
60+
61+
disconnect_device(:ok, device, reference_id)
62+
end
63+
64+
def disconnect_device(_, device, reference_id) do
65+
:telemetry.execute([:nerves_hub, :devices, :disconnect], %{count: 1}, %{
66+
ref_id: reference_id,
67+
identifier: device.identifier
68+
})
69+
70+
{:ok, _device_connection} = Connections.device_disconnected(reference_id)
71+
72+
Tracker.offline(device)
73+
74+
:ok
75+
end
76+
5577
defp on_connect(%Device{status: :registered} = device) do
5678
Devices.set_as_provisioned!(device)
5779
|> on_connect()

lib/nerves_hub_web/channels/device_socket.ex

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ defmodule NervesHubWeb.DeviceSocket do
1818
@impl Phoenix.Socket.Transport
1919
@decorate with_span("Channels.DeviceSocket.terminate")
2020
def terminate(reason, {_channels_info, socket} = state) do
21-
on_disconnect(reason, socket)
21+
%{assigns: %{device: device, reference_id: reference_id}} = socket
22+
DeviceAuth.disconnect_device(reason, device, reference_id)
2223
super(reason, state)
2324
end
2425

@@ -110,50 +111,6 @@ defmodule NervesHubWeb.DeviceSocket do
110111
{:ok, socket}
111112
end
112113

113-
@decorate with_span("Channels.DeviceSocket.on_disconnect")
114-
defp on_disconnect(exit_reason, socket)
115-
116-
defp on_disconnect({:error, reason}, %{
117-
assigns: %{
118-
device: device,
119-
reference_id: reference_id
120-
}
121-
}) do
122-
if reason == {:shutdown, :disconnected} do
123-
:telemetry.execute([:nerves_hub, :devices, :duplicate_connection], %{count: 1}, %{
124-
ref_id: reference_id,
125-
device: device
126-
})
127-
end
128-
129-
shutdown(device, reference_id)
130-
131-
:ok
132-
end
133-
134-
defp on_disconnect(_, %{
135-
assigns: %{
136-
device: device,
137-
reference_id: reference_id
138-
}
139-
}) do
140-
shutdown(device, reference_id)
141-
end
142-
143-
@decorate with_span("Channels.DeviceSocket.shutdown")
144-
defp shutdown(device, reference_id) do
145-
:telemetry.execute([:nerves_hub, :devices, :disconnect], %{count: 1}, %{
146-
ref_id: reference_id,
147-
identifier: device.identifier
148-
})
149-
150-
{:ok, _device_connection} = Connections.device_disconnected(reference_id)
151-
152-
Tracker.offline(device)
153-
154-
:ok
155-
end
156-
157114
defp last_seen_update_interval() do
158115
Application.get_env(:nerves_hub, :device_last_seen_update_interval_minutes)
159116
end

0 commit comments

Comments
 (0)