Skip to content

Commit

Permalink
Add support for when a device disconnects
Browse files Browse the repository at this point in the history
  • Loading branch information
joshk committed Jan 27, 2025
1 parent 2dfbba6 commit a25889f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 46 deletions.
22 changes: 22 additions & 0 deletions lib/nerves_hub/rpc/device_auth.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,28 @@ defmodule NervesHub.RPC.DeviceAuth do
end
end

def disconnect_device({:error, {:shutdown, :disconnected}}, device, reference_id) do
:telemetry.execute([:nerves_hub, :devices, :duplicate_connection], %{count: 1}, %{
ref_id: reference_id,
device: device
})

disconnect_device(:ok, device, reference_id)
end

def disconnect_device(_, device, reference_id) do
:telemetry.execute([:nerves_hub, :devices, :disconnect], %{count: 1}, %{
ref_id: reference_id,
identifier: device.identifier
})

{:ok, _device_connection} = Connections.device_disconnected(reference_id)

Tracker.offline(device)

:ok
end

defp on_connect(%Device{status: :registered} = device) do
Devices.set_as_provisioned!(device)
|> on_connect()
Expand Down
48 changes: 2 additions & 46 deletions lib/nerves_hub_web/channels/device_socket.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ defmodule NervesHubWeb.DeviceSocket do
require Logger

alias NervesHub.Devices.Connections
alias NervesHub.Tracker

alias NervesHub.RPC.DeviceAuth

Expand All @@ -18,7 +17,8 @@ defmodule NervesHubWeb.DeviceSocket do
@impl Phoenix.Socket.Transport
@decorate with_span("Channels.DeviceSocket.terminate")
def terminate(reason, {_channels_info, socket} = state) do
on_disconnect(reason, socket)
%{assigns: %{device: device, reference_id: reference_id}} = socket
DeviceAuth.disconnect_device(reason, device, reference_id)
super(reason, state)
end

Expand Down Expand Up @@ -110,50 +110,6 @@ defmodule NervesHubWeb.DeviceSocket do
{:ok, socket}
end

@decorate with_span("Channels.DeviceSocket.on_disconnect")
defp on_disconnect(exit_reason, socket)

defp on_disconnect({:error, reason}, %{
assigns: %{
device: device,
reference_id: reference_id
}
}) do
if reason == {:shutdown, :disconnected} do
:telemetry.execute([:nerves_hub, :devices, :duplicate_connection], %{count: 1}, %{
ref_id: reference_id,
device: device
})
end

shutdown(device, reference_id)

:ok
end

defp on_disconnect(_, %{
assigns: %{
device: device,
reference_id: reference_id
}
}) do
shutdown(device, reference_id)
end

@decorate with_span("Channels.DeviceSocket.shutdown")
defp shutdown(device, reference_id) do
:telemetry.execute([:nerves_hub, :devices, :disconnect], %{count: 1}, %{
ref_id: reference_id,
identifier: device.identifier
})

{:ok, _device_connection} = Connections.device_disconnected(reference_id)

Tracker.offline(device)

:ok
end

defp last_seen_update_interval() do
Application.get_env(:nerves_hub, :device_last_seen_update_interval_minutes)
end
Expand Down

0 comments on commit a25889f

Please sign in to comment.