Merge branch 'fix/debian-install-libmagic-typo' into 'develop'
[akkoma] / lib / pleroma / web / fed_sockets / socket_info.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.FedSockets.SocketInfo do
6 defstruct origin: nil,
7 pid: nil,
8 conn_pid: nil,
9 state: :default,
10 connected_until: nil
11
12 alias Pleroma.Web.FedSockets.SocketInfo
13 @default_connection_duration 15 * 60 * 1000
14
15 def build(uri, conn_pid \\ nil) do
16 uri
17 |> build_origin()
18 |> build_pids(conn_pid)
19 |> touch()
20 end
21
22 def touch(%SocketInfo{} = socket_info),
23 do: %{socket_info | connected_until: new_ttl()}
24
25 def connect(%SocketInfo{} = socket_info),
26 do: %{socket_info | state: :connected}
27
28 def expired?(%{connected_until: connected_until}),
29 do: connected_until < :erlang.monotonic_time(:millisecond)
30
31 def origin(uri),
32 do: build_origin(uri).origin
33
34 defp build_pids(socket_info, conn_pid),
35 do: struct(socket_info, pid: self(), conn_pid: conn_pid)
36
37 defp build_origin(uri) when is_binary(uri),
38 do: uri |> URI.parse() |> build_origin
39
40 defp build_origin(%{host: host, port: nil, scheme: scheme}),
41 do: build_origin(%{host: host, port: URI.default_port(scheme)})
42
43 defp build_origin(%{host: host, port: port}),
44 do: %SocketInfo{origin: "#{host}:#{port}"}
45
46 defp new_ttl do
47 connection_duration =
48 Pleroma.Config.get([:fed_sockets, :connection_duration], @default_connection_duration)
49
50 :erlang.monotonic_time(:millisecond) + connection_duration
51 end
52 end