@ipcom/extended-ami
Version:
Advanced manager for connecting to Asterisk
588 lines • 24.3 kB
JavaScript
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