Skip to content

Commit

Permalink
added support for ami responses
Browse files Browse the repository at this point in the history
extended `rawToObject` method for support ami responses
some refactorings
updated tests
updated README.md
  • Loading branch information
BelirafoN authored and BelirafoN committed Apr 22, 2016
1 parent 805430e commit 315606e
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 47 deletions.
22 changes: 11 additions & 11 deletions README.md
Expand Up @@ -3,34 +3,34 @@
[![Build Status](https://travis-ci.org/BelirafoN/asterisk-ami-event-utils.svg?branch=master)](https://travis-ci.org/BelirafoN/asterisk-ami-event-utils)
[![Coverage Status](https://coveralls.io/repos/BelirafoN/asterisk-ami-event-utils/badge.svg)](https://coveralls.io/r/BelirafoN/asterisk-ami-event-utils)

Some service functions for parse\stringify raw events|responses|actions from Asterisk AMI's socket.
This library is a part of other library for work with Asterisk AMI, which will be release soon.
Some service functions for parse\stringify raw data packages (events, actions, responses, extended responses)
from Asterisk AMI's socket. This library is a part of other library for work with Asterisk AMI, which will be release soon.

### NodeJS versions

support `>=4.0.0`

### Available methods

* **`.toString(eventBuffer)`** - converts raw AMI's event from buffer to utf-8 string
* **`.toString(buffer)`** - converts raw AMI's data package from buffer to utf-8 string
and trim all CRLF in start or end of this string;
* **`.toObject(eventBuffer)`** - converts raw AMI's event from buffer to object;
* **`.toJson(eventBuffer)`** - converts raw AMI's event from buffer to json-string;
* **`.toArray(eventBuffer)`** - converts raw AMI's event from buffer to paired-array,
* **`.toObject(buffer)`** - converts raw AMI's data package from buffer to object;
* **`.toJson(buffer)`** - converts raw AMI's data package from buffer to json-string;
* **`.toArray(buffer)`** - converts raw AMI's data package from buffer to paired-array,
like this: *[['prop_name_1', 'prop_val_1'], ..., ['prop_name_n', 'prop_val_n']]*;
* **`.fromObject(eventObject)`** - converts event from object to string, which ready for send into
* **`.fromObject(obj)`** - converts data package from object to string, which ready for send into
socket of Asterisk AMI socket;
* **`.fromArray(eventArray)`** - converts event from paired-array to string, which ready for send into
* **`.fromArray(arr)`** - converts data package from paired-array to string, which ready for send into
socket of Asterisk AMI socket;
* **`.fromString(eventString)`** - prepares event's string into correct form for send into
* **`.fromString(str)`** - prepares data package's string into correct form for send into
socket of Asterisk AMI socket;

### Usage

```javascript
const eventUtils = require('asterisk-ami-event-utils');
const amiUtils = require('asterisk-ami-event-utils');
let eventBuffer = '...'; // any buffer or string of event from AMI's socket or from other place
let eventObject = eventUtils.toObject(eventBuffer);
let eventObject = amiUtils.toObject(eventBuffer);
```

### Examples
Expand Down
8 changes: 4 additions & 4 deletions lib/arrayToRaw.js
Expand Up @@ -10,13 +10,13 @@ const CRLF = '\r\n';

/**
*
* @param eventArr
* @param arr
* @returns {*}
*/
module.exports = function(eventArr){
if(!eventArr || !Array.isArray(eventArr)){ return ''; }
module.exports = function(arr){
if(!arr || !Array.isArray(arr)){ return ''; }

let rawStr = eventArr.reduce((result, curr) => {
let rawStr = arr.reduce((result, curr) => {
if(Array.isArray(curr) && curr.length == 2){
result.push(curr.join(': '));
}
Expand Down
10 changes: 5 additions & 5 deletions lib/objToRaw.js
Expand Up @@ -10,14 +10,14 @@ const CRLF = '\r\n';

/**
*
* @param event
* @param obj
* @returns {*}
*/
module.exports = function(event){
if(!event){ return ''; }
module.exports = function(obj){
if(!obj){ return ''; }

let rawStr = Object.keys(event).reduce((result, currentKey) => {
result.push(`${currentKey}: ${event[currentKey]}`);
let rawStr = Object.keys(obj).reduce((result, currentKey) => {
result.push(`${currentKey}: ${obj[currentKey]}`);
return result;
}, []).join(CRLF);

Expand Down
8 changes: 4 additions & 4 deletions lib/rawToArray.js
Expand Up @@ -6,15 +6,15 @@

"use strict";

const toObject = require('./rawToObject');
const bufferToObject = require('./rawToObject');

/**
*
* @param rawEventData
* @param buffer
* @returns {*}
*/
module.exports = function(rawEventData){
let event = toObject(rawEventData);
module.exports = function(buffer){
let event = bufferToObject(buffer);
return Object.keys(event).reduce((arr, curr) => {
arr.push([curr, event[curr]]);
return arr;
Expand Down
8 changes: 4 additions & 4 deletions lib/rawToJson.js
Expand Up @@ -6,12 +6,12 @@

"use strict";

const toObject = require('./rawToObject');
const bufferToObject = require('./rawToObject');

/**
*
* @param rawEventData
* @param buffer
*/
module.exports = function(rawEventData){
return JSON.stringify(toObject(rawEventData));
module.exports = function(buffer){
return JSON.stringify(bufferToObject(buffer));
};
67 changes: 58 additions & 9 deletions lib/rawToObject.js
Expand Up @@ -6,25 +6,74 @@

"use strict";

const rawToString = require('./rawToString');
const bufferToString = require('./rawToString');
const CRLF = '\r\n';
const COMMAND_END = '--END COMMAND--';

/**
*
* @param rawEventData
* @param buffer
* @returns {*}
*/
module.exports = function(rawEventData){
if(!rawEventData){ return {}; }
module.exports = function(buffer){
if(!buffer){ return {}; }

rawEventData = rawToString(rawEventData);
let rawStr = bufferToString(buffer);

return rawEventData.split(CRLF).reduce((event, curr) => {
let pair = curr.split(/:\s|:$/);
if(!/^Event|Action:/i.test(rawStr)){
return parseResponseToObj(rawStr);
}

return rawStr.split(CRLF).reduce((event, curr) => {
let delimiter = ':',
pair = curr.split(delimiter);

if(pair.length > 1){
event[pair[0]] = pair[1];
event[pair[0].trim()] = pair.slice(1).join(delimiter).trim();
}
return event;
}, {});
};
};

/**
*
* @param rawPackageStr
* @returns {{}}
*/
function parseResponseToObj(rawPackageStr){
let result = {};

if(!/^Response:/i.test(rawPackageStr)){
return {
Response: null,
$content: rawPackageStr
};
}

let rows = rawPackageStr.split(CRLF),
i = 0;

for(i; i < rows.length; i++){
if(/^[a-z\d_-]+?:/i.test(rows[i])){
let delimiter = ':',
pair = rows[i].split(delimiter);

if(pair.length > 1){
result[pair[0].trim()] = pair.slice(1).join(delimiter).trim();
}
}else{ break; }
}

if(i < rows.length){
let content = rows.slice(i).join(CRLF),
indexOfEnd = content.indexOf(COMMAND_END);

if(~indexOfEnd){
content = bufferToString(content.substr(0, indexOfEnd));
}

result['$content'] = content;
}

return result;
}
8 changes: 4 additions & 4 deletions lib/rawToString.js
Expand Up @@ -8,12 +8,12 @@

/**
*
* @param rawEventData
* @param buffer
* @returns {*}
*/
module.exports = function(rawEventData){
if(!rawEventData){ return ''; }
module.exports = function(buffer){
if(!buffer){ return ''; }

return rawEventData.toString('utf-8')
return buffer.toString('utf-8')
.replace(/^[\r\n]+|[\r\n]+$/g, '');
};
8 changes: 4 additions & 4 deletions lib/stringToRaw.js
Expand Up @@ -10,10 +10,10 @@ const CRLF = '\r\n';

/**
*
* @param event
* @param str
* @returns {*}
*/
module.exports = function(event){
if(!event){ return ''; }
return event.toString().replace(/^[\r\n]+|[\r\n]+$/g, '') + CRLF.repeat(2);
module.exports = function(str){
if(!str){ return ''; }
return str.toString().replace(/^[\r\n]+|[\r\n]+$/g, '') + CRLF.repeat(2);
};
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "asterisk-ami-event-utils",
"version": "1.0.3",
"version": "2.0.0",
"description": "Asterisk AMI Event Utils for NodeJS (ES2015)",
"main": "./lib/index.js",
"engines": {
Expand Down
60 changes: 59 additions & 1 deletion test/utilsTest.js
Expand Up @@ -34,7 +34,7 @@ describe('Event utils test', () => {
]);
});

describe('rawToString', () => {
describe('bufferToString', () => {

it('with event\'s raw string', () => {
testEvent = CRLF.repeat(5) + testEvent + CRLF.repeat(5);
Expand All @@ -57,6 +57,64 @@ describe('Event utils test', () => {
});
});

it('with action\'s raw string', () => {
let commandStr = [
'Action: command',
'Command: Core Show Channels'
].join(CRLF) + CRLF.repeat(2);

assert.deepEqual(eventUtil.toObject(commandStr), {
Action: 'command',
Command: 'Core Show Channels'
});
});

it('with simple response\'s raw string', () => {
let commandStr = [
'Response: Pong',
'Value: 12345'
].join(CRLF) + CRLF.repeat(2);

assert.deepEqual(eventUtil.toObject(commandStr), {
Response: 'Pong',
Value: '12345'
});
});

it('with extended response\'s raw string', () => {
let commandStr = [
'extended row 1',
'extended row 2'
].join(CRLF) + CRLF.repeat(2);

assert.deepEqual(eventUtil.toObject(commandStr), {
Response: null,
$content: [
'extended row 1',
'extended row 2'
].join(CRLF)
});
});

it('with extended response\'s raw string (with end command)', () => {
let commandStr = [
'Response: Follows',
'Privilege: Command',
'Channel (Context Extension Pri ) State Appl. Data',
'0 active channel(s)',
'--END COMMAND--'
].join(CRLF) + CRLF.repeat(2);
console.log(eventUtil.toObject(commandStr));
assert.deepEqual(eventUtil.toObject(commandStr), {
Response: 'Follows',
Privilege: 'Command',
$content: [
'Channel (Context Extension Pri ) State Appl. Data',
'0 active channel(s)'
].join(CRLF)
});
});

it('without event\'s raw string', () => {
assert.deepEqual(eventUtil.toObject(), {});
});
Expand Down

0 comments on commit 315606e

Please sign in to comment.