logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

socket_info.ex (1535B)


  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. defmodule Pleroma.Web.FedSockets.SocketInfo do
  5. defstruct origin: nil,
  6. pid: nil,
  7. conn_pid: nil,
  8. state: :default,
  9. connected_until: nil
  10. alias Pleroma.Web.FedSockets.SocketInfo
  11. @default_connection_duration 15 * 60 * 1000
  12. def build(uri, conn_pid \\ nil) do
  13. uri
  14. |> build_origin()
  15. |> build_pids(conn_pid)
  16. |> touch()
  17. end
  18. def touch(%SocketInfo{} = socket_info),
  19. do: %{socket_info | connected_until: new_ttl()}
  20. def connect(%SocketInfo{} = socket_info),
  21. do: %{socket_info | state: :connected}
  22. def expired?(%{connected_until: connected_until}),
  23. do: connected_until < :erlang.monotonic_time(:millisecond)
  24. def origin(uri),
  25. do: build_origin(uri).origin
  26. defp build_pids(socket_info, conn_pid),
  27. do: struct(socket_info, pid: self(), conn_pid: conn_pid)
  28. defp build_origin(uri) when is_binary(uri),
  29. do: uri |> URI.parse() |> build_origin
  30. defp build_origin(%{host: host, port: nil, scheme: scheme}),
  31. do: build_origin(%{host: host, port: URI.default_port(scheme)})
  32. defp build_origin(%{host: host, port: port}),
  33. do: %SocketInfo{origin: "#{host}:#{port}"}
  34. defp new_ttl do
  35. connection_duration =
  36. Pleroma.Config.get([:fed_sockets, :connection_duration], @default_connection_duration)
  37. :erlang.monotonic_time(:millisecond) + connection_duration
  38. end
  39. end