Skip to content

Commit a145371

Browse files
committed
Add support for when a device disconnects
1 parent 234efcf commit a145371

File tree

2 files changed

+24
-47
lines changed

2 files changed

+24
-47
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 & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ defmodule NervesHubWeb.DeviceSocket do
66

77
alias NervesHub.Devices.Connections
88

9-
alias NervesHub.Tracker
10-
119
alias NervesHub.RPC.DeviceAuth
1210

1311
channel("console", NervesHubWeb.ConsoleChannel)
@@ -19,7 +17,8 @@ defmodule NervesHubWeb.DeviceSocket do
1917
@impl Phoenix.Socket.Transport
2018
@decorate with_span("Channels.DeviceSocket.terminate")
2119
def terminate(reason, {_channels_info, socket} = state) do
22-
on_disconnect(reason, socket)
20+
%{assigns: %{device: device, reference_id: reference_id}} = socket
21+
DeviceAuth.disconnect_device(reason, device, reference_id)
2322
super(reason, state)
2423
end
2524

@@ -111,50 +110,6 @@ defmodule NervesHubWeb.DeviceSocket do
111110
{:ok, socket}
112111
end
113112

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

0 commit comments

Comments
 (0)