Download the PHP package batinduz/ami-react without Composer
On this page you can find all versions of the php package batinduz/ami-react. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download batinduz/ami-react
More information about batinduz/ami-react
Files in batinduz/ami-react
Package ami-react
Short Description Async, event-driven access to the Asterisk Manager Interface (AMI)
License MIT
Homepage https://github.com/clue/php-ami-react
Informations about the package ami-react
clue/ami-react
Simple async, event-driven access to the Asterisk Manager Interface (AMI)
The Asterisk PBX is a popular open source telephony solution that offers a wide range of telephony features. The Asterisk Manager Interface (AMI) allows you to control and monitor the PBX. Among others, it can be used to originate a new call, execute Asterisk commands or monitor the status of subscribers, channels or queues.
- Async execution of Actions - Send any number of actions (commands) to the asterisk in parallel and process their responses as soon as results come in. The Promise-based design provides a sane interface to working with out of bound responses.
- Event-driven core - Register your event handler callbacks to react to incoming events, such as an incoming call or a change in a subscriber state.
- Lightweight, SOLID design - Provides a thin abstraction that is just good enough and does not get in your way. Future or custom actions and events require no changes to be supported.
- Good test coverage - Comes with an automated tests suite and is regularly tested against versions as old as Asterisk 1.8+
Quickstart example
Once installed, you can use the following code to access your local Asterisk Telephony instance and issue some simple commands via AMI:
See also the examples.
Usage
Factory
The Factory
is responsible for creating your Client
instance.
It also registers everything with the main EventLoop
.
If you need custom DNS or proxy settings, you can explicitly pass a
custom instance of the ConnectorInterface
:
createClient()
The createClient($amiUrl)
method can be used to create a new Client
.
It helps with establishing a plain TCP/IP or secure SSL/TLS connection to the AMI
and issuing an initial login
action.
Note: The given $amiUrl must include a host, it should include a username and secret and it can include a scheme (tcp/ssl) and port definition.
Client
The Client
is responsible for exchanging messages with the Asterisk Manager Interface
and keeps track of pending actions.
If you want to send outgoing actions, see below for the ActionSender
class.
on()
The on($eventName, $eventHandler)
method can be used to register a new event handler.
Incoming events and errors will be forwarded to registered event handler callbacks:
close()
The close()
method can be used to force-close the AMI connection and reject all pending actions.
end()
The end()
method can be used to soft-close the AMI connection once all pending actions are completed.
Advanced
Creating Action
objects, sending them via AMI and waiting for incoming
ActionSender
interface.
If you happen to need a custom or otherwise unsupported action, you can also do so manually as follows. Consider filing a PR though :)
createAction()
The createAction($name, $fields)
method can be used to construct a custom AMI action.
A unique value will be added to "ActionID" field automatically (needed to match incoming responses).
request()
The request(Action $action)
method can be used to queue the given messages to be sent via AMI
and wait for a Response
object that matches the value of its "ActionID" field.
ActionSender
The ActionSender
wraps a given Client
instance to provide a simple way to execute common actions.
This class represents the main interface to execute actions and wait for the corresponding responses.
Actions
All public methods resemble their respective AMI actions.
Listing all available actions is out of scope here, please refer to the class outline.
Processing
Sending actions is async (non-blocking), so you can actually send multiple action requests in parallel.
The AMI will respond to each action with a Response
object. The order is not guaranteed.
Sending actions uses a Promise-based interface that makes it easy to react to when an action is fulfilled
(i.e. either successfully resolved or rejected with an error):
Custom actions
Using the ActionSender
is not strictly necessary, but is the recommended way to execute common actions.
If you happen to need a new or otherwise unsupported action, or additional arguments,
you can also do so manually. See the advanced Client
usage above for details.
A PR that updates the ActionSender
is very much appreciated :)
Message
The Message
is an abstract base class for the Event
value objects.
It provides a common interface for these three message types.
Each Message
consists of any number of fields with each having a name and one or multiple values.
Field names are matched case-insensitive. The interpretation of values is application specific.
getFieldValue()
The getFieldValue($key)
method can be used to get the first value for the given field key.
If no value was found, null
is returned.
getFieldValues()
The getFieldValues($key)
method can be used to get a list of all values for the given field key.
If no value was found, an empty array()
is returned.
getFields()
The getFields()
method can be used to get an array of all fields.
getActionId()
The getActionId()
method can be used to get the unique action ID of this message.
This is a shortcut to get the value of the "ActionID" field.
Response
The Response
value object represents the incoming response received from the AMI.
It shares all properties of the Message
parent class.
getCommandOutput()
The getCommandOutput()
method can be used to get the resulting output of
a "command" Action
.
This value is only available if this is actually a response to a "command" action,
otherwise it defaults to null
.
Action
The Action
value object represents an outgoing action message to be sent to the AMI.
It shares all properties of the Message
parent class.
Event
The Event
value object represents the incoming event received from the AMI.
It shares all properties of the Message
parent class.
getName()
The getName()
method can be used to get the name of the event.
This is a shortcut to get the value of the "Event" field.
Install
The recommended way to install this library is through composer. New to composer?
Tests
In order to run the tests, you need PHPUnit:
The test suite contains both unit tests and functional integration tests. The functional tests require access to a running Asterisk server instance and will be skipped by default. If you want to also run the functional tests, you need to supply your AMI login details in an environment variable like this:
License
MIT
All versions of ami-react with dependencies
evenement/evenement Version ~1.0|~2.0
react/promise Version ~1.0|~2.0
react/socket-client Version 0.3.*|0.4.*
react/event-loop Version 0.3.*|0.4.*