UNPKG

@nethesis/astproxy

Version:

Node.js proxy for Asterisk PBX

495 lines (450 loc) 11.4 kB
/** * Abstraction of a queue. * * **It can throw exception.** * * @class Queue * @constructor * @param {string} queueNum The queue number * @return {object} The queue object. */ exports.Queue = function(queueNum) { // check the parameter if (typeof queueNum !== 'string') { throw new Error('wrong parameter: ' + queueNum); } /** * The queue number. * * @property queue * @type {string} * @required * @private */ var queue = queueNum; /** * The queue name. * * @property name * @type {string} * @private */ var name = ''; /** * The average hold time. * * @property avgHoldTime * @type {string} * @private */ var avgHoldTime; /** * The average talk time. * * @property avgTalkTime * @type {string} * @private */ var avgTalkTime; /** * The service level time period. * * @property serviceLevelTimePeriod * @type {string} * @private */ var serviceLevelTimePeriod; /** * The service level percentage. * * @property serviceLevelPercentage * @type {string} * @private */ var serviceLevelPercentage; /** * The number of completed calls. * * @property completedCallsCount * @type {number} * @private */ var completedCallsCount; /** * The number of abandoned calls. * * @property abandonedCallsCount * @type {number} * @private */ var abandonedCallsCount; /** * The members of the queue. The key is the member number and * the value is a _QueueMember_ object. * * @property members * @type {object} * @private */ var members = {}; /** * The waiting callers of the queue. The key is the channel and * the value is a _QueueWaitingCaller_ object. * * @property waitingCallers * @type {object} * @private */ var waitingCallers = {}; /** * Returns the specified member. * * @method getMember * @param {string} memberId The member identifier * @return {object} The member. */ function getMember(memberId) { return members[memberId]; } /** * Returns all the members. * * @method getAllMembers * @return {object} All the members. */ function getAllMembers() { return members; } /** * Returns the list of all members. * * @method getMembersList * @return {array} The list of all members. */ function getMembersList() { return Object.keys(members); } /** * Returns all the waiting callers. * * @method getAllWaitingCallers * @return {object} All the waiting callers. */ function getAllWaitingCallers() { return waitingCallers; } /** * Return a waiting caller. * * @method getWaitingCaller * @param {string} id The waiting caller identifier * @return {object} A waiting caller or undefined. */ function getWaitingCaller(id) { return waitingCallers[id]; } /** * Return the number of waiting calls. * * @method getWaitingCounter * @return {number} The number of waiting calls. */ function getWaitingCounter() { return Object.keys(waitingCallers).length; } /** * Returns true if the waiting caller exists. * * @method waitingCallerExists * @param {string} id The waiting caller identifier * @return {boolean} True if the waiting caller exists. */ function waitingCallerExists(id) { return waitingCallers[id] ? true : false; } /** * Adds the queue member to the private _members_ object property. * If the queue member already exists, it will be overwritten. * * **It can throw an Exception.** * * @method addMember * @param {object} m A _QueueMember_ object. */ function addMember(m) { // check the parameter if (typeof m !== 'object') { throw new Error('wrong parameter'); } members[m.getMember()] = m; } /** * Adds the queue waiting caller to the private _waitingCaller_ object property. * If the waiting caller already exists, it will be overwritten. * * **It can throw an Exception.** * * @method addWaitingCaller * @param {object} wCaller A _QueueWaitingCaller_ object. */ function addWaitingCaller(wCaller) { // check the parameter if (typeof wCaller !== 'object') { throw new Error('wrong parameter'); } waitingCallers[wCaller.getChannel()] = wCaller; } /** * Removes the waiting caller from the private _waitingCallers_ object property. * * **It can throw an Exception.** * * @method removeWaitingCaller * @param {string} channel The channel identifier. */ function removeWaitingCaller(channel) { // check the parameter if (typeof channel !== 'string') { throw new Error('wrong parameter'); } delete waitingCallers[channel]; } /** * Removes all the waiting callers from the private _waitingCallers_ object property. * * **It can throw an Exception.** * * @method removeAllWaitingCallers */ function removeAllWaitingCallers() { waitingCallers = {}; } /** * Update the waiting time of all waiting callers of all queues. * * @method updateWaitingTimeOfWaitingCallers */ function updateWaitingTimeOfWaitingCallers() { var wc; for (wc in waitingCallers) { waitingCallers[wc].updateWaiting(); } } /** * Removes the queue member from the private _members_ object property. * * **It can throw an Exception.** * * @method removeMember * @param {string} m The queue member number identifier. */ function removeMember(m) { // check the parameter if (typeof m !== 'string') { throw new Error('wrong parameter'); } delete members[m]; } /** * Return the number of completed calls. * * @method getCompletedCallsCount * @return {number} The number of completed calls. */ function getCompletedCallsCount() { return completedCallsCount; } /** * Sets the service level time period. * * @method setServiceLevelTimePeriod * @param {string} level The service level time period. */ function setServiceLevelTimePeriod(level) { serviceLevelTimePeriod = level; } /** * Sets the service level percentage. * * @method setServiceLevelPercentage * @param {string} percentage The service level percentage. */ function setServiceLevelPercentage(percentage) { serviceLevelPercentage = percentage; } /* * Sets the number of completed calls. * * @method setCompletedCallsCount * @param {number} num The number of completed calls. */ function setCompletedCallsCount(num) { completedCallsCount = num; } /** * Return the number of abandoned calls. * * @method getAbandonedCallsCount * @return {number} The number of abandoned calls. */ function getAbandonedCallsCount() { return abandonedCallsCount; } /** * Set the number of abandoned calls. * * @method setAbandonedCallsCount * @param {number} num The number of abandoned calls. */ function setAbandonedCallsCount(num) { abandonedCallsCount = num; } /** * Return the average talk time. * * @method getAvgTalkTime * @return {string} The average talk time. */ function getAvgTalkTime() { return avgTalkTime; } /** * Set the average talk time. * * @method setAvgTalkTime * @param {string} time The time in seconds. */ function setAvgTalkTime(time) { avgTalkTime = time; } /** * Return the average hold time. * * @method getAvgHoldTime * @return {string} The average hold time. */ function getAvgHoldTime() { return avgHoldTime; } /** * Set the average hold time. * * @method setAvgHoldTime * @param {string} time The time in seconds. */ function setAvgHoldTime(time) { avgHoldTime = time; } /** * Set the queue name. * * @method setName * @param {string} qName The queue name */ function setName(qName) { name = qName; } /** * Return the queue name. * * @method getName * @return {string} The queue name. */ function getName() { return name; } /** * Return the queue number. * * @method getQueue * @return {string} The queue number */ function getQueue() { return queue; } /** * Return the readable string description of the queue. * * @method toString * @return {string} The readable description of the extension */ function toString() { return 'QUEUE/' + getQueue(); } /** * Returns the JSON representation of the object. * * { * name: "Coda401", * queue: "401", * members: { QueueMember.{{#crossLink "QueueMember/toJSON"}}{{/crossLink}}() } // the keys is the extension numbers * avgHoldTime: "37" * avgTalkTime: "590", * waitingCallers: { QueueWaitingCaller.{{#crossLink "QueueWaitingCaller/toJSON"}}{{/crossLink}}() } // the keys is the channel identifier * abandonedCallsCount: "26", * completedCallsCount: "11" * serviceLevelTimePeriod: "60" * serviceLevelPercentage: "100.0" * } * * @method toJSON * @param {string} [privacyStr] If it's specified, it hides the last digits of the phone number * @return {object} The JSON representation of the object. */ function toJSON(privacyStr) { updateWaitingTimeOfWaitingCallers(); var k; var jsonMembers = {}; var jsonWCallers = {}; // JSON representation of the members for (k in members) { jsonMembers[k] = members[k].toJSON(); } // JSON representation of waiting callers for (k in waitingCallers) { jsonWCallers[k] = waitingCallers[k].toJSON(privacyStr); } return { name: name, queue: queue, members: jsonMembers, avgHoldTime: avgHoldTime, avgTalkTime: avgTalkTime, waitingCallers: jsonWCallers, completedCallsCount: completedCallsCount, abandonedCallsCount: abandonedCallsCount, serviceLevelTimePeriod: serviceLevelTimePeriod, serviceLevelPercentage: serviceLevelPercentage }; } // public interface return { toJSON: toJSON, setName: setName, getName: getName, getQueue: getQueue, toString: toString, addMember: addMember, getMember: getMember, removeMember: removeMember, getAllMembers: getAllMembers, getMembersList: getMembersList, getAvgHoldTime: getAvgHoldTime, setAvgHoldTime: setAvgHoldTime, getAvgTalkTime: getAvgTalkTime, setAvgTalkTime: setAvgTalkTime, addWaitingCaller: addWaitingCaller, getWaitingCaller: getWaitingCaller, getWaitingCounter: getWaitingCounter, removeWaitingCaller: removeWaitingCaller, waitingCallerExists: waitingCallerExists, getAllWaitingCallers: getAllWaitingCallers, getCompletedCallsCount: getCompletedCallsCount, setCompletedCallsCount: setCompletedCallsCount, getAbandonedCallsCount: getAbandonedCallsCount, setAbandonedCallsCount: setAbandonedCallsCount, removeAllWaitingCallers: removeAllWaitingCallers, setServiceLevelTimePeriod: setServiceLevelTimePeriod, setServiceLevelPercentage: setServiceLevelPercentage }; };