lib/fly.ex

defmodule Fly do
  @moduledoc """
  Functions and features to help Elixir applications more easily take advantage
  of the features that Fly.io provides.
  """

  @doc """
  Return the configured primary region. Reads and requires an ENV setting for
  `PRIMARY_REGION`.
  """
  @spec primary_region() :: String.t()
  def primary_region do
    System.fetch_env!("PRIMARY_REGION")
  end

  @doc """
  Return the configured current region. Reads the `FLY_REGION` ENV setting
  that's available when deployed on the Fly.io platform.
  """
  @spec my_region() :: String.t()
  def my_region do
    System.fetch_env!("FLY_REGION")
  end

  @doc """
  Return if the app instance is running in the primary region or not. Boolean
  result.
  """
  @spec is_primary? :: no_return() | boolean()
  def is_primary? do
    my_region() == primary_region()
  end

  @doc false
  # A "private" function that converts the MFA data into a string for logging.
  def mfa_string(module, func, args) do
    "#{Atom.to_string(module)}.#{Atom.to_string(func)}/#{length(args)}"
  end

  @doc """
  Execute the MFA on a node in the primary region.
  """
  @spec rpc_primary(module(), atom(), [any()], keyword()) :: any()
  def rpc_primary(module, func, args, opts \\ []) do
    Fly.RPC.rpc_region(:primary, module, func, args, opts)
  end
end