An open API service indexing awesome lists of open source software.

https://github.com/staskobzar/exfastagi

Elixir FastAGI library
https://github.com/staskobzar/exfastagi

asterisk asterisk-agi asterisk-pbx elixir fastagi

Last synced: 3 months ago
JSON representation

Elixir FastAGI library

Awesome Lists containing this project

README

        

# 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

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

[Fastagi.Session commands](https://hexdocs.pm/fastagi/Fastagi.Session.html) documentation.

## 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
```