lib/libcluster/epmd.ex

defmodule Cluster.EPMD do
  alias Cluster.EcsClusterInfo
  require Logger

  @magic_version 5

  def start_link do
    :erl_epmd.start_link()
  end

  def register_node(name, port, family) do
    :erl_epmd.register_node(name, port, family)
  end

  def listen_port_please(_name, _hostname) do
    container_port = System.get_env("DISTRIBUTION_PORT") |> String.to_integer()
    {:ok, container_port}
  end

  @spec address_please(charlist(), charlist(), atom()) ::
          {:ok, :inet.ip_address(), integer(), integer()} | {:error, term()}
  def address_please(name, hostname, family) do
    nodename = :"#{name}@#{hostname}"

    case EcsClusterInfo.get_nodes() do
      %{^nodename => {ip, port}} -> {:ok, ip, port, @magic_version}
      _ -> :erl_epmd.address_please(name, hostname, family)
    end
  end

  def names(hostname) do
    :erl_epmd.names(hostname)
  end
end