This module contains the Node.js client library for the Asterisk REST Interface. It builds upon the swagger-js library, providing an improved, Asterisk-specific API over the API generated by swagger-js.
$ npm install ari-client
The client exposes a connect function that can be used to connect to an instance of ARI and to configure a client with all available resources and operations.
Callbacks:
var client = require('ari-client');
client.connect(url, username, password, function (err, ari) {})
Promises:
var client = require('ari-client');
client.connect(url, username, password)
.then(function (ari) {})
.catch(function (err) {});
Upon connecting, a callback will be called passing a reference to a client with all available resources attached.
ari.bridges, ari.channels, ari.endpoints...
Those properties expose operations that can be performed for that given resource.
Callbacks:
ari.bridges.list(function (err, bridges) {});
ari.bridges.get({bridgeId: 'uniqueid'}, function (err, bridge) {});
Promises:
ari.bridges.list()
.then(function (bridges) {})
.catch(function (err) {});
ari.bridges.get({bridgeId: 'uniqueid'})
.then(function (bridge) {})
.catch(function (err) {});
Operations that return a resource or a list of resources expose the same operations tied to that given instance.
bridge.addChannel({channel: 'uniqueid'});
Note that the bridge id was not required since the operation was called from a resource instance. The above operation is equivalent to the following:
ari.bridges.addChannel({bridgeId: 'uniqueid', channel: 'uniqueid'});
The client also exposes functions to create new resources.
ari.Bridge(), ari.Channel(), ari.Playback(), ari.LiveRecording()
The instance returned by these functions can then be used to call a create operations in ARI.
Callbacks:
var bridge = ari.Bridge();
bridge.create(function (err, bridge) {});
Promises:
var bridge = ari.Bridge();
bridge.create()
.then(function (bridge) {})
.catch(function (err) {});
Note that the create operation returns an updated copy of the bridge after creation.
Using this method of resource creation, it is possible to register event listeners for a resource before it is created in ARI.
Callbacks:
var channel = ari.Channel();
channel.on('StasisStart', function (event, channel) {});
channel.on('ChannelDtmfReceived', function (event, channel) {});
channel.originate(
{endpoint: 'PJSIP/1000', app: 'application', appArgs: 'dialed'},
function (err, channel) {}
);
Promises:
var channel = ari.Channel();
channel.on('StasisStart', function (event, channel) {});
channel.on('ChannelDtmfReceived', function (event, channel) {});
channel.originate({endpoint: 'PJSIP/1000', app: 'application', appArgs: 'dialed'})
.then(function (channel) {})
.catch(function (err) {});
Some create operations require an instance be passed in for this to work.
Callbacks:
var playback = ari.Playback();
channel.play({media: 'sound:hello-world'}, playback, function (err, playback) {});
Promises:
var playback = ari.Playback();
channel.play({media: 'sound:hello-world'}, playback)
.then(function (playback) {})
.catch(function (err) {});
If you are using the client directly to call a create operation instead of using an instance, you will have to pass the appropriate ids as part of the options to the create operation.
Callbacks:
var playback = ari.Playback();
ari.channels.play({
media: 'sound:hello-world',
channelId: channel.id,
playbackId: playback.id
}, function (err, playback) {});
Promises:
var playback = ari.Playback();
ari.channels.play({
media: 'sound:hello-world',
channelId: channel.id,
playbackId: playback.id
}).then(function (playback) {}).catch(function (err) {});
The following operations are defined:
Filter application events types.
Callbacks:
ari.applications.filter(
{applicationName: val},
function (err, application) {}
);
Promises:
ari.applications.filter({
applicationName: val
})
.then(function (application) {})
.catch(function (err) {});
Get details of an application.
Callbacks:
ari.applications.get(
{applicationName: val},
function (err, application) {}
);
Promises:
ari.applications.get({
applicationName: val
})
.then(function (application) {})
.catch(function (err) {});
List all applications.
Callbacks:
ari.applications.list(
function (err, applications) {}
);
Promises:
ari.applications.list()
.then(function (applications) {})
.catch(function (err) {});
Subscribe an application to a event source.
Callbacks:
ari.applications.subscribe(
{applicationName: val, eventSource: val},
function (err, application) {}
);
Promises:
ari.applications.subscribe({
applicationName: val,
eventSource: val
})
.then(function (application) {})
.catch(function (err) {});
Unsubscribe an application from an event source.
Callbacks:
ari.applications.unsubscribe(
{applicationName: val, eventSource: val},
function (err, application) {}
);
Promises:
ari.applications.unsubscribe({
applicationName: val,
eventSource: val
})
.then(function (application) {})
.catch(function (err) {});
Adds a log channel.
Callbacks:
ari.asterisk.addLog(
{configuration: val, logChannelName: val},
function (err) {}
);
Promises:
ari.asterisk.addLog({
configuration: val,
logChannelName: val
})
.then(function () {})
.catch(function (err) {});
Deletes a log channel.
Callbacks:
ari.asterisk.deleteLog(
{logChannelName: val},
function (err) {}
);
Promises:
ari.asterisk.deleteLog({
logChannelName: val
})
.then(function () {})
.catch(function (err) {});
Delete a dynamic configuration object.
Callbacks:
ari.asterisk.deleteObject(
{configClass: val, id: val, objectType: val},
function (err) {}
);
Promises:
ari.asterisk.deleteObject({
configClass: val,
id: val,
objectType: val
})
.then(function () {})
.catch(function (err) {});
Get the value of a global variable.
Callbacks:
ari.asterisk.getGlobalVar(
{variable: val},
function (err, variable) {}
);
Promises:
ari.asterisk.getGlobalVar({
variable: val
})
.then(function (variable) {})
.catch(function (err) {});
Gets Asterisk system information.
Callbacks:
ari.asterisk.getInfo(
function (err, asteriskinfo) {}
);
Promises:
ari.asterisk.getInfo()
.then(function (asteriskinfo) {})
.catch(function (err) {});
Get Asterisk module information.
Callbacks:
ari.asterisk.getModule(
{moduleName: val},
function (err, module) {}
);
Promises:
ari.asterisk.getModule({
moduleName: val
})
.then(function (module) {})
.catch(function (err) {});
Retrieve a dynamic configuration object.
Callbacks:
ari.asterisk.getObject(
{configClass: val, id: val, objectType: val},
function (err, configtuples) {}
);
Promises:
ari.asterisk.getObject({
configClass: val,
id: val,
objectType: val
})
.then(function (configtuples) {})
.catch(function (err) {});
Gets Asterisk log channel information.
Callbacks:
ari.asterisk.listLogChannels(
function (err, logchannels) {}
);
Promises:
ari.asterisk.listLogChannels()
.then(function (logchannels) {})
.catch(function (err) {});
List Asterisk modules.
Callbacks:
ari.asterisk.listModules(
function (err, modules) {}
);
Promises:
ari.asterisk.listModules()
.then(function (modules) {})
.catch(function (err) {});
Load an Asterisk module.
Callbacks:
ari.asterisk.loadModule(
{moduleName: val},
function (err) {}
);
Promises:
ari.asterisk.loadModule({
moduleName: val
})
.then(function () {})
.catch(function (err) {});
Response pong message.
Callbacks:
ari.asterisk.ping(
function (err, asteriskping) {}
);
Promises:
ari.asterisk.ping()
.then(function (asteriskping) {})
.catch(function (err) {});
Reload an Asterisk module.
Callbacks:
ari.asterisk.reloadModule(
{moduleName: val},
function (err) {}
);
Promises:
ari.asterisk.reloadModule({
moduleName: val
})
.then(function () {})
.catch(function (err) {});
Rotates a log channel.
Callbacks:
ari.asterisk.rotateLog(
{logChannelName: val},
function (err) {}
);
Promises:
ari.asterisk.rotateLog({
logChannelName: val
})
.then(function () {})
.catch(function (err) {});
Set the value of a global variable.
Callbacks:
ari.asterisk.setGlobalVar(
{variable: val},
function (err) {}
);
Promises:
ari.asterisk.setGlobalVar({
variable: val
})
.then(function () {})
.catch(function (err) {});
Unload an Asterisk module.
Callbacks:
ari.asterisk.unloadModule(
{moduleName: val},
function (err) {}
);
Promises:
ari.asterisk.unloadModule({
moduleName: val
})
.then(function () {})
.catch(function (err) {});
Create or update a dynamic configuration object.
Callbacks:
ari.asterisk.updateObject(
{configClass: val, id: val, objectType: val},
function (err, configtuples) {}
);
Promises:
ari.asterisk.updateObject({
configClass: val,
id: val,
objectType: val
})
.then(function (configtuples) {})
.catch(function (err) {});
Add a channel to a bridge.
Callbacks:
ari.bridges.addChannel(
{bridgeId: val, channel: val},
function (err) {}
);
Promises:
ari.bridges.addChannel({
bridgeId: val,
channel: val
})
.then(function () {})
.catch(function (err) {});
Removes any explicit video source in a multi-party mixing bridge. This operation has no effect on bridges with two or fewer participants. When no explicit video source is set, talk detection will be used to determine the active video stream.
Callbacks:
ari.bridges.clearVideoSource(
{bridgeId: val},
function (err) {}
);
Promises:
ari.bridges.clearVideoSource({
bridgeId: val
})
.then(function () {})
.catch(function (err) {});
Create a new bridge.
Callbacks:
ari.bridges.create(
function (err, bridge) {}
);
Promises:
ari.bridges.create()
.then(function (bridge) {})
.catch(function (err) {});
Create a new bridge or updates an existing one.
Callbacks:
ari.bridges.createWithId(
{bridgeId: val},
function (err, bridge) {}
);
Promises:
ari.bridges.createWithId({
bridgeId: val
})
.then(function (bridge) {})
.catch(function (err) {});
Shut down a bridge.
Callbacks:
ari.bridges.destroy(
{bridgeId: val},
function (err) {}
);
Promises:
ari.bridges.destroy({
bridgeId: val
})
.then(function () {})
.catch(function (err) {});
Get bridge details.
Callbacks:
ari.bridges.get(
{bridgeId: val},
function (err, bridge) {}
);
Promises:
ari.bridges.get({
bridgeId: val
})
.then(function (bridge) {})
.catch(function (err) {});
List all active bridges in Asterisk.
Callbacks:
ari.bridges.list(
function (err, bridges) {}
);
Promises:
ari.bridges.list()
.then(function (bridges) {})
.catch(function (err) {});
Start playback of media on a bridge.
Callbacks:
ari.bridges.play(
{bridgeId: val, media: val},
function (err, playback) {}
);
Promises:
ari.bridges.play({
bridgeId: val,
media: val
})
.then(function (playback) {})
.catch(function (err) {});
Start playback of media on a bridge.
Callbacks:
ari.bridges.playWithId(
{bridgeId: val, media: val, playbackId: val},
function (err, playback) {}
);
Promises:
ari.bridges.playWithId({
bridgeId: val,
media: val,
playbackId: val
})
.then(function (playback) {})
.catch(function (err) {});
Start a recording.
Callbacks:
ari.bridges.record(
{bridgeId: val, format: val, name: val},
function (err, liverecording) {}
);
Promises:
ari.bridges.record({
bridgeId: val,
format: val,
name: val
})
.then(function (liverecording) {})
.catch(function (err) {});
Remove a channel from a bridge.
Callbacks:
ari.bridges.removeChannel(
{bridgeId: val, channel: val},
function (err) {}
);
Promises:
ari.bridges.removeChannel({
bridgeId: val,
channel: val
})
.then(function () {})
.catch(function (err) {});
Set a channel as the video source in a multi-party mixing bridge. This operation has no effect on bridges with two or fewer participants.
Callbacks:
ari.bridges.setVideoSource(
{bridgeId: val, channelId: val},
function (err) {}
);
Promises:
ari.bridges.setVideoSource({
bridgeId: val,
channelId: val
})
.then(function () {})
.catch(function (err) {});
Play music on hold to a bridge or change the MOH class that is playing.
Callbacks:
ari.bridges.startMoh(
{bridgeId: val},
function (err) {}
);
Promises:
ari.bridges.startMoh({
bridgeId: val
})
.then(function () {})
.catch(function (err) {});
Stop playing music on hold to a bridge.
Callbacks:
ari.bridges.stopMoh(
{bridgeId: val},
function (err) {}
);
Promises:
ari.bridges.stopMoh({
bridgeId: val
})
.then(function () {})
.catch(function (err) {});
Answer a channel.
Callbacks:
ari.channels.answer(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.answer({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Exit application; continue execution in the dialplan.
Callbacks:
ari.channels.continueInDialplan(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.continueInDialplan({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Create channel.
Callbacks:
ari.channels.create(
{app: val, endpoint: val},
function (err, channel) {}
);
Promises:
ari.channels.create({
app: val,
endpoint: val
})
.then(function (channel) {})
.catch(function (err) {});
Dial a created channel.
Callbacks:
ari.channels.dial(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.dial({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Start an External Media session.
Callbacks:
ari.channels.externalMedia(
{app: val, external_host: val, format: val},
function (err, channel) {}
);
Promises:
ari.channels.externalMedia({
app: val,
external_host: val,
format: val
})
.then(function (channel) {})
.catch(function (err) {});
Channel details.
Callbacks:
ari.channels.get(
{channelId: val},
function (err, channel) {}
);
Promises:
ari.channels.get({
channelId: val
})
.then(function (channel) {})
.catch(function (err) {});
Get the value of a channel variable or function.
Callbacks:
ari.channels.getChannelVar(
{channelId: val, variable: val},
function (err, variable) {}
);
Promises:
ari.channels.getChannelVar({
channelId: val,
variable: val
})
.then(function (variable) {})
.catch(function (err) {});
Delete (i.e. hangup) a channel.
Callbacks:
ari.channels.hangup(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.hangup({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Hold a channel.
Callbacks:
ari.channels.hold(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.hold({
channelId: val
})
.then(function () {})
.catch(function (err) {});
List all active channels in Asterisk.
Callbacks:
ari.channels.list(
function (err, channels) {}
);
Promises:
ari.channels.list()
.then(function (channels) {})
.catch(function (err) {});
Move the channel from one Stasis application to another.
Callbacks:
ari.channels.move(
{app: val, channelId: val},
function (err) {}
);
Promises:
ari.channels.move({
app: val,
channelId: val
})
.then(function () {})
.catch(function (err) {});
Mute a channel.
Callbacks:
ari.channels.mute(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.mute({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Create a new channel (originate).
Callbacks:
ari.channels.originate(
{endpoint: val},
function (err, channel) {}
);
Promises:
ari.channels.originate({
endpoint: val
})
.then(function (channel) {})
.catch(function (err) {});
Create a new channel (originate with id).
Callbacks:
ari.channels.originateWithId(
{channelId: val, endpoint: val},
function (err, channel) {}
);
Promises:
ari.channels.originateWithId({
channelId: val,
endpoint: val
})
.then(function (channel) {})
.catch(function (err) {});
Start playback of media.
Callbacks:
ari.channels.play(
{channelId: val, media: val},
function (err, playback) {}
);
Promises:
ari.channels.play({
channelId: val,
media: val
})
.then(function (playback) {})
.catch(function (err) {});
Start playback of media and specify the playbackId.
Callbacks:
ari.channels.playWithId(
{channelId: val, media: val, playbackId: val},
function (err, playback) {}
);
Promises:
ari.channels.playWithId({
channelId: val,
media: val,
playbackId: val
})
.then(function (playback) {})
.catch(function (err) {});
Start a recording.
Callbacks:
ari.channels.record(
{channelId: val, format: val, name: val},
function (err, liverecording) {}
);
Promises:
ari.channels.record({
channelId: val,
format: val,
name: val
})
.then(function (liverecording) {})
.catch(function (err) {});
Redirect the channel to a different location.
Callbacks:
ari.channels.redirect(
{channelId: val, endpoint: val},
function (err) {}
);
Promises:
ari.channels.redirect({
channelId: val,
endpoint: val
})
.then(function () {})
.catch(function (err) {});
Indicate ringing to a channel.
Callbacks:
ari.channels.ring(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.ring({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Stop ringing indication on a channel if locally generated.
Callbacks:
ari.channels.ringStop(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.ringStop({
channelId: val
})
.then(function () {})
.catch(function (err) {});
RTP stats on a channel.
Callbacks:
ari.channels.rtpstatistics(
{channelId: val},
function (err, rtpstat) {}
);
Promises:
ari.channels.rtpstatistics({
channelId: val
})
.then(function (rtpstat) {})
.catch(function (err) {});
Send provided DTMF to a given channel.
Callbacks:
ari.channels.sendDTMF(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.sendDTMF({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Set the value of a channel variable or function.
Callbacks:
ari.channels.setChannelVar(
{channelId: val, variable: val},
function (err) {}
);
Promises:
ari.channels.setChannelVar({
channelId: val,
variable: val
})
.then(function () {})
.catch(function (err) {});
Start snooping.
Callbacks:
ari.channels.snoopChannel(
{app: val, channelId: val},
function (err, channel) {}
);
Promises:
ari.channels.snoopChannel({
app: val,
channelId: val
})
.then(function (channel) {})
.catch(function (err) {});
Start snooping.
Callbacks:
ari.channels.snoopChannelWithId(
{app: val, channelId: val, snoopId: val},
function (err, channel) {}
);
Promises:
ari.channels.snoopChannelWithId({
app: val,
channelId: val,
snoopId: val
})
.then(function (channel) {})
.catch(function (err) {});
Play music on hold to a channel.
Callbacks:
ari.channels.startMoh(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.startMoh({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Play silence to a channel.
Callbacks:
ari.channels.startSilence(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.startSilence({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Stop playing music on hold to a channel.
Callbacks:
ari.channels.stopMoh(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.stopMoh({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Stop playing silence to a channel.
Callbacks:
ari.channels.stopSilence(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.stopSilence({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Remove a channel from hold.
Callbacks:
ari.channels.unhold(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.unhold({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Unmute a channel.
Callbacks:
ari.channels.unmute(
{channelId: val},
function (err) {}
);
Promises:
ari.channels.unmute({
channelId: val
})
.then(function () {})
.catch(function (err) {});
Destroy a device-state controlled by ARI.
Callbacks:
ari.deviceStates.delete(
{deviceName: val},
function (err) {}
);
Promises:
ari.deviceStates.delete({
deviceName: val
})
.then(function () {})
.catch(function (err) {});
Retrieve the current state of a device.
Callbacks:
ari.deviceStates.get(
{deviceName: val},
function (err, devicestate) {}
);
Promises:
ari.deviceStates.get({
deviceName: val
})
.then(function (devicestate) {})
.catch(function (err) {});
List all ARI controlled device states.
Callbacks:
ari.deviceStates.list(
function (err, devicestates) {}
);
Promises:
ari.deviceStates.list()
.then(function (devicestates) {})
.catch(function (err) {});
Change the state of a device controlled by ARI. (Note - implicitly creates the device state).
Callbacks:
ari.deviceStates.update(
{deviceName: val, deviceState: val},
function (err) {}
);
Promises:
ari.deviceStates.update({
deviceName: val,
deviceState: val
})
.then(function () {})
.catch(function (err) {});
Details for an endpoint.
Callbacks:
ari.endpoints.get(
function (err, endpoint) {}
);
Promises:
ari.endpoints.get()
.then(function (endpoint) {})
.catch(function (err) {});
List all endpoints.
Callbacks:
ari.endpoints.list(
function (err, endpoints) {}
);
Promises:
ari.endpoints.list()
.then(function (endpoints) {})
.catch(function (err) {});
List available endoints for a given endpoint technology.
Callbacks:
ari.endpoints.listByTech(
function (err, endpoints) {}
);
Promises:
ari.endpoints.listByTech()
.then(function (endpoints) {})
.catch(function (err) {});
Send a message to some technology URI or endpoint.
Callbacks:
ari.endpoints.sendMessage(
{from: val, to: val},
function (err) {}
);
Promises:
ari.endpoints.sendMessage({
from: val,
to: val
})
.then(function () {})
.catch(function (err) {});
Send a message to some endpoint in a technology.
Callbacks:
ari.endpoints.sendMessageToEndpoint(
{from: val},
function (err) {}
);
Promises:
ari.endpoints.sendMessageToEndpoint({
from: val
})
.then(function () {})
.catch(function (err) {});
Destroy a mailbox.
Callbacks:
ari.mailboxes.delete(
{mailboxName: val},
function (err) {}
);
Promises:
ari.mailboxes.delete({
mailboxName: val
})
.then(function () {})
.catch(function (err) {});
Retrieve the current state of a mailbox.
Callbacks:
ari.mailboxes.get(
{mailboxName: val},
function (err, mailbox) {}
);
Promises:
ari.mailboxes.get({
mailboxName: val
})
.then(function (mailbox) {})
.catch(function (err) {});
List all mailboxes.
Callbacks:
ari.mailboxes.list(
function (err, mailboxs) {}
);
Promises:
ari.mailboxes.list()
.then(function (mailboxs) {})
.catch(function (err) {});
Change the state of a mailbox. (Note - implicitly creates the mailbox).
Callbacks:
ari.mailboxes.update(
{mailboxName: val, newMessages: val, oldMessages: val},
function (err) {}
);
Promises:
ari.mailboxes.update({
mailboxName: val,
newMessages: val,
oldMessages: val
})
.then(function () {})
.catch(function (err) {});
Control a playback.
Callbacks:
ari.playbacks.control(
{operation: val, playbackId: val},
function (err) {}
);
Promises:
ari.playbacks.control({
operation: val,
playbackId: val
})
.then(function () {})
.catch(function (err) {});
Get a playback's details.
Callbacks:
ari.playbacks.get(
{playbackId: val},
function (err, playback) {}
);
Promises:
ari.playbacks.get({
playbackId: val
})
.then(function (playback) {})
.catch(function (err) {});
Stop a playback.
Callbacks:
ari.playbacks.stop(
{playbackId: val},
function (err) {}
);
Promises:
ari.playbacks.stop({
playbackId: val
})
.then(function () {})
.catch(function (err) {});
Stop a live recording and discard it.
Callbacks:
ari.recordings.cancel(
{recordingName: val},
function (err) {}
);
Promises:
ari.recordings.cancel({
recordingName: val
})
.then(function () {})
.catch(function (err) {});
Copy a stored recording.
Callbacks:
ari.recordings.copyStored(
{destinationRecordingName: val, recordingName: val},
function (err, storedrecording) {}
);
Promises:
ari.recordings.copyStored({
destinationRecordingName: val,
recordingName: val
})
.then(function (storedrecording) {})
.catch(function (err) {});
Delete a stored recording.
Callbacks:
ari.recordings.deleteStored(
{recordingName: val},
function (err) {}
);
Promises:
ari.recordings.deleteStored({
recordingName: val
})
.then(function () {})
.catch(function (err) {});
List live recordings.
Callbacks:
ari.recordings.getLive(
{recordingName: val},
function (err, liverecording) {}
);
Promises:
ari.recordings.getLive({
recordingName: val
})
.then(function (liverecording) {})
.catch(function (err) {});
Get a stored recording's details.
Callbacks:
ari.recordings.getStored(
{recordingName: val},
function (err, storedrecording) {}
);
Promises:
ari.recordings.getStored({
recordingName: val
})
.then(function (storedrecording) {})
.catch(function (err) {});
Get the file associated with the stored recording.
Callbacks:
ari.recordings.getStoredFile(
{recordingName: val},
function (err, binary) {}
);
Promises:
ari.recordings.getStoredFile({
recordingName: val
})
.then(function (binary) {})
.catch(function (err) {});
List recordings that are complete.
Callbacks:
ari.recordings.listStored(
function (err, storedrecordings) {}
);
Promises:
ari.recordings.listStored()
.then(function (storedrecordings) {})
.catch(function (err) {});
Mute a live recording.
Callbacks:
ari.recordings.mute(
{recordingName: val},
function (err) {}
);
Promises:
ari.recordings.mute({
recordingName: val
})
.then(function () {})
.catch(function (err) {});
Pause a live recording.
Callbacks:
ari.recordings.pause(
{recordingName: val},
function (err) {}
);
Promises:
ari.recordings.pause({
recordingName: val
})
.then(function () {})
.catch(function (err) {});
Stop a live recording and store it.
Callbacks:
ari.recordings.stop(
{recordingName: val},
function (err) {}
);
Promises:
ari.recordings.stop({
recordingName: val
})
.then(function () {})
.catch(function (err) {});
Unmute a live recording.
Callbacks:
ari.recordings.unmute(
{recordingName: val},
function (err) {}
);
Promises:
ari.recordings.unmute({
recordingName: val
})
.then(function () {})
.catch(function (err) {});
Unpause a live recording.
Callbacks:
ari.recordings.unpause(
{recordingName: val},
function (err) {}
);
Promises:
ari.recordings.unpause({
recordingName: val
})
.then(function () {})
.catch(function (err) {});
Get a sound's details.
Callbacks:
ari.sounds.get(
{soundId: val},
function (err, sound) {}
);
Promises:
ari.sounds.get({
soundId: val
})
.then(function (sound) {})
.catch(function (err) {});
List all sounds.
Callbacks:
ari.sounds.list(
function (err, sounds) {}
);
Promises:
ari.sounds.list()
.then(function (sounds) {})
.catch(function (err) {});
Event listeners can be registered on the client as well as on resource instances.
Client events are received for all events of a given type regardless of which resource the event is for.
ari.on('StasisStart', function (event, channelInstance) {
// will be called for all channels that enter the Stasis application
});
Resource instance events are only received for the given type and resource.
Callbacks:
var channel = ari.Channel();
channel.on('StasisStart', function (event, channelInstance) {
// will only be called when the channel above enters the Stasis application
});
channel.originate(
{endpoint: 'PJSIP/endpoint', app: 'applicationName'},
function (err, channelInstance) {}
);
Promises:
var channel = ari.Channel();
channel.on('StasisStart', function (event, channelInstance) {
// will only be called when the channel above enters the Stasis application
});
channel.originate({endpoint: 'PJSIP/endpoint', app: 'applicationName'})
.then(function (channelInstance) {})
.catch(function (err) {});
When using events, it is important to note that the callbacks you provide to handle events cannot be garbage collected until they are unregistered as shown below.
At the client level:
var handler = function (event, channel) {};
// receive all 'ChannelDtmfReceived' events
ari.on('ChannelDtmfReceived', handler);
// at some point in your application, remove the event listener to ensure the handler function can be garbage collected
ari.removeListener('ChannelDtmfReceived', handler);
// or remove all event listeners for a particular event type
ari.removeAllListeners('ChannelDtmfReceived');
At the instance level:
var channel = ari.Channel();
var handler = function (event, channel) {};
// receive all 'ChannelDtmfReceived' events for this channel
channel.on('ChannelDtmfReceived', handler);
// at some point in your application, remove the event listener to ensure the handler function can be garbage collected
channel.removeListener('ChannelDtmfReceived', handler);
// or remove all event listeners for a particular event type
channel.removeAllListeners('ChannelDtmfReceived');
For events that are only expected to fire once, once
can be used to register an event listener that will automatically be unregistered once the event fires as shown below:
var playback = ari.Playback();
var handler = function (event, playback) {};
// receive 'PlaybackFinished' events for this playback
playback.once('PlaybackFinished', handler);
The following events are defined:
ARI client failed to load.
function (err) {}
Notification that trying to move a channel to another Stasis application failed.
function (event, channel) {}
Channel
Notification that another WebSocket has taken over for an application.
An application may only be subscribed to by a single WebSocket at a time. If multiple WebSockets attempt to subscribe to the same application, the newer WebSocket wins, and the older one receives this event.
function (event) {}
Notification that an attended transfer has occurred.
function (event, {destination_link_first_leg: val, destination_link_second_leg: val, destination_threeway_bridge: val, destination_threeway_channel: val, replace_channel: val, transfer_target: val, transferee: val, transferer_first_leg: val, transferer_first_leg_bridge: val, transferer_second_leg: val, transferer_second_leg_bridge: val}) {}
Channel Bridge
Notification that a blind transfer has occurred.
function (event, {bridge: val, channel: val, replace_channel: val, transferee: val}) {}
Bridge Channel
Notification that a bridge has been created.
function (event, bridge) {}
Bridge
Notification that a bridge has been destroyed.
function (event, bridge) {}
Bridge
Notification that one bridge has merged into another.
function (event, {bridge: val, bridge_from: val}) {}
Bridge
Notification that the source of video in a bridge has changed.
function (event, bridge) {}
Bridge
Channel changed Caller ID.
function (event, channel) {}
Channel
Channel changed Connected Line.
function (event, channel) {}
Channel
Notification that a channel has been created.
function (event, channel) {}
Channel
Notification that a channel has been destroyed.
function (event, channel) {}
Channel
Channel changed location in the dialplan.
function (event, channel) {}
Channel
DTMF received on a channel.
This event is sent when the DTMF ends. There is no notification about the start of DTMF
function (event, channel) {}
Channel
Notification that a channel has entered a bridge.
function (event, {bridge: val, channel: val}) {}
Bridge Channel
A hangup was requested on the channel.
function (event, channel) {}
Channel
A channel initiated a media hold.
function (event, channel) {}
Channel
Notification that a channel has left a bridge.
function (event, {bridge: val, channel: val}) {}
Bridge Channel
Notification of a channel's state change.
function (event, channel) {}
Channel
Talking is no longer detected on the channel.
function (event, channel) {}
Channel
Talking was detected on the channel.
function (event, channel) {}
Channel
A channel initiated a media unhold.
function (event, channel) {}
Channel
User-generated event with additional user-defined fields in the object.
function (event, {bridge: val, channel: val, endpoint: val}) {}
Bridge Channel Endpoint
Channel variable changed.
function (event, channel) {}
If missing, the variable is a global variable.
Channel
Detailed information about a contact on an endpoint.
function (event) {}
The state of a contact on an endpoint has changed.
function (event, endpoint) {}
Endpoint
Notification that a device state has changed.
function (event, device_state) {}
DeviceState
Dialing state has changed.
function (event, {caller: val, forwarded: val, peer: val}) {}
Channel
Endpoint state changed.
function (event, endpoint) {}
Endpoint
Error event sent when required params are missing.
function (event) {}
Detailed information about a remote peer that communicates with Asterisk.
function (event) {}
The state of a peer associated with an endpoint has changed.
function (event, endpoint) {}
Endpoint
Event showing the continuation of a media playback operation from one media URI to the next in the list.
function (event, playback) {}
Playback
Event showing the completion of a media playback operation.
function (event, playback) {}
Playback
Event showing the start of a media playback operation.
function (event, playback) {}
Playback
Event showing failure of a recording operation.
function (event, recording) {}
LiveRecording
Event showing the completion of a recording operation.
function (event, recording) {}
LiveRecording
Event showing the start of a recording operation.
function (event, recording) {}
LiveRecording
Notification that a channel has left a Stasis application.
function (event, channel) {}
Channel
Notification that a channel has entered a Stasis application.
function (event, {channel: val, replace_channel: val}) {}
Channel
A text message was received from an endpoint.
function (event, endpoint) {}
Endpoint
WebSocket has disconnected, and the client is attempting to reconnect.
function (err) {}
WebSocket has connected. Note that normally this event is emitted prior to resolving the connect()
promise, so you probably will not get an even on the initial connection.
function () {}
Client will no longer attempt to reconnect to the WebSocket for the current application(s).
function (err) {}
Callbacks:
var client = require('ari-client'),
util = require('util');
client.connect('http://localhost:8088', 'user', 'secret', client_loaded);
function client_loaded (err, ari) {
if (err) {
throw err; // program will crash if it fails to connect
}
ari.once('StasisStart', channel_joined);
function channel_joined (event, incoming) {
incoming.on('ChannelDtmfReceived', dtmf_received);
incoming.answer(function (err) {
play(incoming, 'sound:hello-world');
});
}
function dtmf_received (event, channel) {
var digit = event.digit;
switch (digit) {
case '#':
play(channel, 'sound:vm-goodbye', function (err) {
channel.hangup(function (err) {
process.exit(0);
});
});
break;
case '*':
play(channel, 'sound:tt-monkeys');
break;
default:
play(channel, util.format('sound:digits/%s', digit));
}
}
function play (channel, sound, callback) {
var playback = ari.Playback();
playback.on('PlaybackFinished', function (event, playback) {
if (callback) {
callback(null);
}
});
channel.play({media: sound}, playback, function (err, playback) {});
}
ari.start('hello');
}
Promises:
var client = require('ari-client'),
Promise = require('bluebird'),
util = require('util');
client.connect('http://localhost:8088', 'user', 'secret')
.then(function (ari) {
ari.once('StasisStart', channelJoined);
function channelJoined (event, incoming) {
incoming.on('ChannelDtmfReceived', dtmfReceived);
incoming.answer()
.then(function () {
return play(incoming, 'sound:hello-world');
})
.catch(function (err) {});
}
function dtmfReceived (event, channel) {
var digit = event.digit;
switch (digit) {
case '#':
play(channel, 'sound:vm-goodbye')
.then(function () {
return channel.hangup();
})
.finally(function () {
process.exit(0);
});
break;
case '*':
play(channel, 'sound:tt-monkeys');
break;
default:
play(channel, util.format('sound:digits/%s', digit));
}
}
function play (channel, sound) {
var playback = ari.Playback();
return new Promise(function (resolve, reject) {
playback.on('PlaybackFinished', function (event, playback) {
resolve(playback);
});
channel.play({media: sound}, playback)
.catch(function (err) {
reject(err);
});
});
}
ari.start('hello');
})
.done(); // program will crash if it fails to connect
To run the mocha tests for ari-client, run the following:
$ npm test
The tests run against a mocked ARI REST endpoint and websocket server.
After cloning the git repository, run the following to install all dev dependencies:
$ npm install
$ npm link
Then run the following to run jshint and mocha tests:
$ npm test
jshint will enforce a minimal style guide. It is also a good idea to create unit tests when adding new features to ari-client.
To generate a test coverage report run the following:
$ npm run check-coverage
This will also ensure a coverage threshold is met by the tests.
Unit test fixtures for ARI resources can be generated from a local asterisk instance by running the following:
$ grunt genfixtures
Once you have done this and loaded a mocked ARI server, individual calls can be mocked using the hock library. Websocket events can be mocked by creating a websocket server and calling its send method. The helpers module exposes methods for creating a mocked ARI server and a mocked websocket server for use in writing unit tests.
Developer documentation can ge generated by running the following:
$ grunt jsdoc
Apache, Version 2.0. Copyright (c) 2014, Digium, Inc. All rights reserved.