Current section
Files
Jump to
Current section
Files
lib/eslx.ex
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, timeout) do
ESLx.LibESL.Events.start_link(
ConnectionDetails.host(connection_details),
ConnectionDetails.port(connection_details),
ConnectionDetails.password(connection_details),
timeout
)
end
defdelegate events(node, events), to: ESLx.LibESL.Events
end
@doc """
executes api once and closes connection
"""
@spec api(ConnectionDetails.t(), cmd :: String.t(), timeout :: pos_integer()) ::
{:ok, String.t()} | :error
def api(connection_details, cmd, opts) do
connection_timeout = Keyword.get(opts, :connect_timeout, 1_000)
command_timeout = Keyword.get(opts, :command_timeout, 1_000)
{:ok, esl} =
ESLx.LibESL.Inbound.start_link(
ConnectionDetails.host(connection_details),
ConnectionDetails.port(connection_details),
ConnectionDetails.password(connection_details),
connection_timeout
)
case ESLx.LibESL.send_recv(esl, "api #{cmd}\n\n", command_timeout) do
{:ok, data} ->
ESLx.LibESL.close(esl)
data
{:error, _error} ->
ESLx.LibESL.close(esl)
:error
end
end
end