View Source Fastagi

Elixir CI Coverage Status GPLv3 license

Elixir FastAGI library to build FastAGI servers and process Asterisk calls.

installation

Installation

If available in Hex, the package can be installed by adding fastagi to your list of dependencies in mix.exs:

def deps do
  [
    {:fastagi, "~> 0.1.0"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/fastagi.

usage

Usage

Module to Fasagi processes each AGI connection with "handle_connection" callback withing a module that uses Fastagi. Module example:

defmodule MyAGI do
  require Logger
  use Fastagi

  def handle_connection(sess) do
    IO.puts("========================================")
    IO.inspect(sess)

    with {:ok, _} <- Fastagi.Session.answer(sess),
         {:ok, _} <- Fastagi.Session.verbose(sess, "Hello there from exFastagi"),
         {:ok, resp} <- Fastagi.Session.get_variable(sess, "VARFOO"),
         :ok <- Logger.info("VARFOO = #{resp.value}"),
         {:ok, _} = Fastagi.Session.hangup(sess) do
      IO.puts("=================================================")
      IO.puts("| session is done")
      IO.puts("=================================================")
    else
      :hangup -> Logger.warn("Session channel was hangup by Asterisk")
      {:error, err} -> Logger.error("Session error: #{err}")
    end

    Fastagi.Session.close(sess)
  end
end

Starting Fastagi.Server can be done directly via "start_link" function that receives port and module name as arguments. Can also be used in application. For example:

defmodule MyMAGI.App do
  use Application

  @impl true
  def start(_type, _args) do
    children = [
      Supervisor.child_spec({Task, fn -> Fastagi.Server.start_link(4575, MyAGI) end},
        restart: :permanent
      )
    ]

    Supervisor.start_link(children, strategy: :one_for_one)
  end
end