lib/myspace_ipfs/swarm.ex

defmodule MyspaceIPFS.Swarm do
  @moduledoc """
  MyspaceIPFS.Swarm is where the swarm commands of the IPFS API reside.
  """

  import MyspaceIPFS.Api
  import MyspaceIPFS.Utils

  @typep okresult :: MyspaceIPFS.okresult()
  @typep peer_id :: MyspaceIPFS.peer_id()

  @doc """
  List the addresses of known peers.
  """
  @spec addrs :: okresult
  def addrs do
    post_query("/swarm/addrs")
    |> handle_json_response()
  end

  @doc """
  List the interfaces swarm is listening on.
  """
  @spec addrs_listen :: okresult
  def addrs_listen do
    post_query("/swarm/addrs/listen")
    |> handle_json_response()
  end

  @doc """
  List the local addresses.
  """
  @spec addrs_local :: okresult
  def addrs_local do
    post_query("/swarm/addrs/local")
    |> handle_json_response()
  end

  @spec addrs_local(peer_id) :: okresult
  def addrs_local(peer_id) do
    post_query("/swarm/addrs/local?id=#{peer_id}")
    |> handle_json_response()
  end

  @doc """
  Open a connection to a given address.

  ## Parameters
  https://docs.ipfs.io/reference/http/api/#api-v0-swarm-connect
    `peer_id` - The address to connect to.
  """
  @spec connect(peer_id) :: okresult
  def connect(peer_id) do
    post_query("/swarm/connect?arg=#{peer_id}")
    |> handle_json_response()
  end

  @doc """
  Close a connection to a given address.

  ## Parameters
  https://docs.ipfs.io/reference/http/api/#api-v0-swarm-disconnect
    `peer_id` - The address to disconnect from.
  """
  @spec disconnect(peer_id) :: okresult
  def disconnect(peer_id) do
    post_query("/swarm/disconnect?arg=#{peer_id}")
    |> handle_json_response()
  end

  @doc """
  Manipulate address filters.
  """
  @spec filters :: okresult
  def filters() do
    post_query("/swarm/filters")
    |> handle_json_response()
  end

  @doc """
  Multiaddress filter to add.

  ## Parameters
  https://docs.ipfs.io/reference/http/api/#api-v0-swarm-filters-add
    `peer_id` - The multiaddress to add to the filter.
  """
  @spec filters_add(peer_id) :: okresult
  def filters_add(peer_id) do
    post_query("/swarm/filters/add?arg=#{peer_id}")
    |> handle_json_response()
  end

  @doc """
  Multiaddress filter to remove.

  ## Parameters
  https://docs.ipfs.io/reference/http/api/#api-v0-swarm-filters-rm
    `peer_id` - The multiaddress to remove from the filter.
  """
  @spec filters_rm(peer_id) :: okresult
  def filters_rm(peer_id) do
    post_query("/swarm/filters/rm?arg=#{peer_id}")
    |> handle_json_response()
  end

  @doc """
  Add peers to the peering service.

  ## Parameters
  https://docs.ipfs.io/reference/http/api/#api-v0-swarm-peering-add
    `peer_id` - The peer ID of the peer to add.
  """
  @spec peering_add(peer_id) :: okresult
  def peering_add(peer_id) do
    post_query("/swarm/peering/add?arg=#{peer_id}")
    |> handle_json_response()
  end

  @doc """
  List peers in the peering service.
  """
  @spec peering_ls :: okresult
  def peering_ls do
    post_query("/swarm/peering/ls")
    |> handle_json_response()
  end

  @doc """
  Remove peers from the peering service.

  ## Parameters
  https://docs.ipfs.io/reference/http/api/#api-v0-swarm-peering-rm
    `peer_id` - The multihash of the peer to remove.
  """
  def peering_rm(peer_id) do
    post_query("/swarm/peering/rm?arg=#{peer_id}")
    |> handle_json_response()
  end

  @doc """
  List peers with open connections.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-swarm-peers
    `verbose` - Write extra information.
    `streams` - Also list information about open streams for each connection.
    `latency` - Also list information about latency to each peer.
    `direction` - Also list information about direction of connection.
  """
  @spec peers :: okresult
  def peers do
    post_query("/swarm/peers")
    |> handle_json_response()
  end
end