UNPKG

@ipcom/extended-ami

Version:

Advanced manager for connecting to Asterisk

588 lines 24.3 kB
import { AMI_EVENTS } from './e-ami.js'; import { _isNull, _isUndefined } from './functions.js'; export class eAmiActions { eAmi; timeOutAction; constructor(eAmi) { this.eAmi = eAmi; this.timeOutAction = 5000; } BridgeInfo(options) { return new Promise((resolve, reject) => { (async () => { options.Action = 'BridgeInfo'; options.ActionID = new Date().getTime(); const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.BRIDGE_INFO_CHANNEL, onBRIDGE_INFO_CHANNEL); }; const onBRIDGE_INFO_CHANNEL = (response) => { resolve(response); removeListener(); }; this.eAmi.events.once(AMI_EVENTS.BRIDGE_INFO_CHANNEL, onBRIDGE_INFO_CHANNEL); setTimeout(() => { reject("Timeout to '" + options.Action + "' action, try again later..."); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } BridgeList(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'BridgeList'; options.ActionID = new Date().getTime(); let bridgeItemsCount = 0; const bridgeItems = []; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.BRIDGE_LIST_COMPLETE, onBRIDGE_LIST_COMPLETE); this.eAmi.events.removeListener(AMI_EVENTS.BRIDGE_LIST_ITEM, onBRIDGE_LIST_ITEM); }; const onBRIDGE_LIST_ITEM = (response) => { bridgeItems.push(response); if (bridgeItemsCount === bridgeItems.length) { resolve(bridgeItems); removeListener(); } }; const onBRIDGE_LIST_COMPLETE = (response) => { bridgeItemsCount = response.ListItems; if (bridgeItemsCount === bridgeItems.length) { resolve(bridgeItems); removeListener(); } }; this.eAmi.events.once(AMI_EVENTS.BRIDGE_LIST_COMPLETE, onBRIDGE_LIST_COMPLETE); this.eAmi.events.on(AMI_EVENTS.BRIDGE_LIST_ITEM, onBRIDGE_LIST_ITEM); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } CoreShowChannels(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'CoreShowChannels'; let channelsCount = 0; const channels = []; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.CORE_SHOW_CHANNEL, onCORE_SHOW_CHANNEL); this.eAmi.events.removeListener(AMI_EVENTS.CORE_SHOW_CHANNEL_COMPLETE, onCORE_SHOW_CHANNEL_COMPLETE); }; const onCORE_SHOW_CHANNEL = (response) => { channels.push(response); if (channels.length === channelsCount) { resolve(channels); removeListener(); } }; const onCORE_SHOW_CHANNEL_COMPLETE = (response) => { channelsCount = response.ListItems; if (channels.length === channelsCount) { resolve(channels); removeListener(); } }; this.eAmi.events.once(AMI_EVENTS.CORE_SHOW_CHANNEL_COMPLETE, onCORE_SHOW_CHANNEL_COMPLETE); this.eAmi.events.on(AMI_EVENTS.CORE_SHOW_CHANNEL, onCORE_SHOW_CHANNEL); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } Hangup(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'Hangup'; const hangup = { hangup: null, hangupRequest: null, }; const removeListeners = () => { this.eAmi.events.removeListener(AMI_EVENTS.HANGUP, onHANGUP); this.eAmi.events.removeListener(AMI_EVENTS.HANGUP_REQUEST, onHANGUP_REQUEST); }; const onHANGUP = (h) => { hangup.hangup = h; if (!_isNull(hangup.hangupRequest)) resolve(hangup); removeListeners(); }; const onHANGUP_REQUEST = (hr) => { hangup.hangupRequest = hr; if (!_isNull(hangup.hangup)) resolve(hangup); removeListeners(); }; this.eAmi.events.once(AMI_EVENTS.HANGUP, onHANGUP); this.eAmi.events.once(AMI_EVENTS.HANGUP_REQUEST, onHANGUP_REQUEST); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListeners(); } } catch (error) { reject(error); removeListeners(); } })(); }); } Login(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'Login'; options.ActionID = new Date().getTime(); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response.Response === 'Success') resolve(true); else if (response.Response === 'Error') reject(response); else resolve(true); } catch (error) { console.log('ERROR LOGIN', error); reject(error); } })(); }); } Logout() { return new Promise((resolve, reject) => { (async () => { const actionId = new Date().getTime(); setTimeout(() => { reject(new Error("Timeout to 'Logoff' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action({ Action: 'Logoff', ActionID: actionId, }); if (this.eAmi.debug) console.log('logout-response', response); if (_isUndefined(response.Response)) reject(response); if (response.Response === 'Goodbye') resolve(true); else reject(response); } catch (error) { reject(error); } })(); }); } Originate(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'Originate'; options.ActionID = new Date().getTime(); const removeListener = () => { this.eAmi.events.removeListener('Action_' + options.ActionID, onActionID); }; const onActionID = (response) => { if (typeof response === 'object' && response !== null && 'Message' in response) { const message = response .Message; if (_isUndefined(message)) { reject(new Error('Message is undefined')); removeListener(); return; } if (message .toString() .toLowerCase() .indexOf('failed') >= 0) { reject(new Error('Action failed')); removeListener(); return; } resolve(true); removeListener(); } else { reject(new Error('Unexpected response format')); removeListener(); } }; this.eAmi.events.once('Action_' + options.ActionID, onActionID); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } Ping() { return new Promise((resolve, reject) => { (async () => { const actionID = new Date().getTime(); setTimeout(() => { reject(new Error("Timeout to 'Ping' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action({ Action: 'Ping', ActionID: actionID, }); if (response.Response === 'Success') resolve(true); else if (response.Request?.Completed === true) resolve(true); else if (response.Request?.Completed === false) reject(response); } catch (error) { reject(error); } })(); }); } QueueMemberAdd(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'QueueAdd'; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.Q_MEMBER_ADDED, onQ_MEMBER_ADDED); }; const onQ_MEMBER_ADDED = (response) => { resolve(response); removeListener(); }; this.eAmi.events.once(AMI_EVENTS.Q_MEMBER_ADDED, onQ_MEMBER_ADDED); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } QueueMemberRemove(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'QueueRemove'; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.Q_MEMBER_REMOVED, onQ_MEMBER_REMOVED); }; const onQ_MEMBER_REMOVED = (response) => { resolve(response); removeListener(); }; this.eAmi.events.once(AMI_EVENTS.Q_MEMBER_REMOVED, onQ_MEMBER_REMOVED); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { removeListener(); reject(response); } } catch (error) { reject(error); removeListener(); } })(); }); } QueueMemberPenalty(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'QueuePenalty'; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.Q_MEMBER_PENALTY, onQ_MEMBER_PENALTY); }; const onQ_MEMBER_PENALTY = (response) => { resolve(response); removeListener(); }; this.eAmi.events.once(AMI_EVENTS.Q_MEMBER_PENALTY, onQ_MEMBER_PENALTY); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } QueueMemberPause(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'QueuePause'; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.Q_MEMBER_PAUSE, onQ_MEMBER_PAUSE); }; const onQ_MEMBER_PAUSE = (response) => { resolve(response); removeListener(); }; this.eAmi.events.once(AMI_EVENTS.Q_MEMBER_PAUSE, onQ_MEMBER_PAUSE); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } QueueStatus(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'QueueStatus'; const members = []; let countMembers = 0; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.Q_MEMBER, onQ_MEMBER); }; const onQ_MEMBER = (response) => { members.push(response); if (members.length === countMembers) { resolve(members); removeListener(); } }; this.eAmi.events.on(AMI_EVENTS.Q_MEMBER, onQ_MEMBER); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); removeListener(); this.QueueStatus(options); }, this.timeOutAction); try { const summary = await this.QueueSummary({ Queue: options.Queue, }); countMembers = summary.Available + summary.Callers + summary.LoggedIn; if (options.MembersCount !== undefined && options.MembersCount !== null) { countMembers = countMembers === options.MembersCount ? countMembers : options.MembersCount; } else { // Garanta que countMembers tenha um valor numérico mesmo que MembersCount seja undefined countMembers = 0; } if (this.eAmi.debug) { console.log('Count queue members: available - %s, Callers - %s, LoggedIn - %s. Need count - %s', summary.Available, summary.Callers, summary.LoggedIn, options.MembersCount ?? null); } const response = await this.eAmi.action(options); if (typeof response === 'object' && response !== null && 'Response' in response) { if (response.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } else { this.eAmi.events.emit(AMI_EVENTS.Q_PARAMS, response); removeListener(); } } } catch (error) { reject(error); removeListener(); } })(); }); } QueueSummary(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'QueueSummary'; const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.Q_SUMMARY, onQ_SUMMARY); }; const onQ_SUMMARY = (response) => { resolve(response); removeListener(); }; this.eAmi.events.once(AMI_EVENTS.Q_SUMMARY, onQ_SUMMARY); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } Status(options) { return new Promise((resolve, reject) => { (async () => { if (_isUndefined(options)) reject(new Error('Options are undefined')); options.Action = 'Status'; options.ActionID = new Date().getTime(); const removeListener = () => { this.eAmi.events.removeListener(AMI_EVENTS.STATUS, onSTATUS); }; const onSTATUS = (response) => { resolve(response); removeListener(); }; this.eAmi.events.once(AMI_EVENTS.STATUS, onSTATUS); setTimeout(() => { reject(new Error("Timeout to '" + options.Action + "' action, try again later...")); }, this.timeOutAction); try { const response = await this.eAmi.action(options); if (response?.Response?.toLowerCase() === 'error') { reject(response); removeListener(); } } catch (error) { reject(error); removeListener(); } })(); }); } } //# sourceMappingURL=e-ami-actions.js.map