defmodule EmqttFailover do @moduledoc """ Helper functions for supporting EmqttFailover. """ @type client_id_opt :: {:prefix, binary} | {:hostname, binary} @doc """ Generate a unique client ID, like `"--"` Options: - `prefix`: defaults to `"emqtt-f"` - `hostname`: defaults to the value of `:inet.gethostname()` """ @spec client_id() :: binary @spec client_id([client_id_opt]) :: binary def client_id(opts \\ []) do prefix = Keyword.get(opts, :prefix, "emqtt-f") hostname = case Keyword.fetch(opts, :hostname) do {:ok, value} -> value :error -> {:ok, hostname} = :inet.gethostname() hostname end suffix = Base.encode32(:crypto.strong_rand_bytes(5), case: :lower, padding: false) "#{prefix}-#{hostname}-#{suffix}" end end