defmodule ESLx do @moduledoc """ `ESLx` a layer for Freeswitch Event Socket Protocol ## Examples ### Listening Events iex> {:ok, esl} = ESLx.Events.start_link(URI.parse("esl://:ClueCon@localhost:8021"), 3_000) iex> ESLx.Events.events(esl, "ALL") iex> flush(). ... ### Execute api iex> ESLx.api(URI.parse("esl://:ClueCon@localhost:8021"), "uptime", []) ... """ alias ESLx.ConnectionDetails defmodule Events do @moduledoc """ Continually receive events. """ def start_link(connection_details, events, timeout) do # ESLx.LibESL.Events.start_ {:ok, ESLx.FreeswitchESLRs.Events.start_link( self(), ConnectionDetails.host(connection_details), ConnectionDetails.port(connection_details), ConnectionDetails.password(connection_details), events, timeout )} end end @doc """ executes api once and closes connection """ @spec api(ConnectionDetails.t(), cmd :: String.t(), arg :: String.t(), timeout :: pos_integer()) :: {:ok, String.t()} | :error def api(connection_details, cmd, arg, opts) do connection_timeout = Keyword.get(opts, :connect_timeout, 1_000) command_timeout = Keyword.get(opts, :command_timeout, 1_000) esl = ESLx.FreeswitchESLRs.API.start_link( ConnectionDetails.host(connection_details), ConnectionDetails.port(connection_details), ConnectionDetails.password(connection_details), connection_timeout ) case ESLx.FreeswitchESLRs.API.api(esl, cmd, arg, command_timeout) do {:ok, data} -> ESLx.FreeswitchESLRs.API.close(esl) data {:error, _error} -> ESLx.FreeswitchESLRs.API.close(esl) :error end end end