52 lines
1.5 KiB
Elixir
52 lines
1.5 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Web.FedSockets.SocketInfo do
|
|
defstruct origin: nil,
|
|
pid: nil,
|
|
conn_pid: nil,
|
|
state: :default,
|
|
connected_until: nil
|
|
|
|
alias Pleroma.Web.FedSockets.SocketInfo
|
|
@default_connection_duration 15 * 60 * 1000
|
|
|
|
def build(uri, conn_pid \\ nil) do
|
|
uri
|
|
|> build_origin()
|
|
|> build_pids(conn_pid)
|
|
|> touch()
|
|
end
|
|
|
|
def touch(%SocketInfo{} = socket_info),
|
|
do: %{socket_info | connected_until: new_ttl()}
|
|
|
|
def connect(%SocketInfo{} = socket_info),
|
|
do: %{socket_info | state: :connected}
|
|
|
|
def expired?(%{connected_until: connected_until}),
|
|
do: connected_until < :erlang.monotonic_time(:millisecond)
|
|
|
|
def origin(uri),
|
|
do: build_origin(uri).origin
|
|
|
|
defp build_pids(socket_info, conn_pid),
|
|
do: struct(socket_info, pid: self(), conn_pid: conn_pid)
|
|
|
|
defp build_origin(uri) when is_binary(uri),
|
|
do: uri |> URI.parse() |> build_origin
|
|
|
|
defp build_origin(%{host: host, port: nil, scheme: scheme}),
|
|
do: build_origin(%{host: host, port: URI.default_port(scheme)})
|
|
|
|
defp build_origin(%{host: host, port: port}),
|
|
do: %SocketInfo{origin: "#{host}:#{port}"}
|
|
|
|
defp new_ttl do
|
|
connection_duration =
|
|
Pleroma.Config.get([:fed_sockets, :connection_duration], @default_connection_duration)
|
|
|
|
:erlang.monotonic_time(:millisecond) + connection_duration
|
|
end
|
|
end
|