README.md

# Fastagi
[![Elixir CI](https://github.com/staskobzar/exfastagi/actions/workflows/elixir.yml/badge.svg)](https://github.com/staskobzar/exfastagi/actions/workflows/elixir.yml)
[![Coverage Status](https://coveralls.io/repos/github/staskobzar/exfastagi/badge.svg?branch=master)](https://coveralls.io/github/staskobzar/exfastagi?branch=master)
[![GPLv3 license](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://github.com/staskobzar/exfastagi/blob/master/LICENSE)


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

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `fastagi` to your list of dependencies in `mix.exs`:

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

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at <https://hexdocs.pm/fastagi>.

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

```elixir
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:
```elixir
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
```