mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2025-12-20 16:50:39 +00:00
add dmtf verb
This commit is contained in:
@@ -340,8 +340,8 @@ class CallSession extends Emitter {
|
||||
|
||||
// this whole thing requires us to be in a Dial verb
|
||||
const task = this.currentTask;
|
||||
if (!task || TaskName.Dial !== task.name) {
|
||||
return this.logger.info('CallSession:_lccWhisper - invalid command since we are not in a dial');
|
||||
if (!task || ![TaskName.Dial, TaskName.Listen].includes(task.name)) {
|
||||
return this.logger.info('CallSession:_lccWhisper - invalid command since we are not in a dial or listen');
|
||||
}
|
||||
|
||||
// allow user to provide a url object, a url string, an array of tasks, or a single task
|
||||
|
||||
41
lib/tasks/dtmf.js
Normal file
41
lib/tasks/dtmf.js
Normal file
@@ -0,0 +1,41 @@
|
||||
const Task = require('./task');
|
||||
const {TaskName, TaskPreconditions} = require('../utils/constants');
|
||||
|
||||
class TaskDtmf extends Task {
|
||||
constructor(logger, opts) {
|
||||
super(logger, opts);
|
||||
this.preconditions = TaskPreconditions.Endpoint;
|
||||
|
||||
this.dtmf = this.data.dtmf;
|
||||
this.duration = this.data.duration || 500;
|
||||
}
|
||||
|
||||
get name() { return TaskName.Dtmf; }
|
||||
|
||||
async exec(cs, ep) {
|
||||
await super.exec(cs);
|
||||
this.ep = ep;
|
||||
try {
|
||||
this.logger.info({data: this.data}, `sending dtmf ${this.dtmf}`);
|
||||
await this.ep.execute('send_dtmf', `${this.dtmf}@${this.duration}`);
|
||||
this.timer = setTimeout(this.notifyTaskDone.bind(this), this.dtmf.length * (this.duration + 250) + 750);
|
||||
await this.awaitTaskDone();
|
||||
this.logger.info({data: this.data}, `done sending dtmf ${this.dtmf}`);
|
||||
} catch (err) {
|
||||
this.logger.info(err, `TaskDtmf:exec - error playing ${this.dtmf}`);
|
||||
}
|
||||
this.emit('playDone');
|
||||
}
|
||||
|
||||
async kill(cs) {
|
||||
super.kill(cs);
|
||||
if (this.ep.connected && !this.playComplete) {
|
||||
this.logger.debug('TaskDtmf:kill - killing audio');
|
||||
await this.ep.api('uuid_break', this.ep.uuid).catch((err) => this.logger.info(err, 'Error killing audio'));
|
||||
}
|
||||
clearTimeout(this.timer);
|
||||
this.notifyTaskDone();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = TaskDtmf;
|
||||
@@ -159,6 +159,24 @@ class TaskListen extends Task {
|
||||
this.notifyTaskDone();
|
||||
}
|
||||
|
||||
/**
|
||||
* play or say something during the call
|
||||
* @param {*} tasks - array of play/say tasks to execute
|
||||
*/
|
||||
async whisper(tasks, callSid) {
|
||||
try {
|
||||
const cs = this.callSession;
|
||||
this.logger.debug('Listen:whisper tasks starting');
|
||||
while (tasks.length && !cs.callGone) {
|
||||
const task = tasks.shift();
|
||||
await task.exec(cs, this.ep);
|
||||
}
|
||||
this.logger.debug('Listen:whisper tasks complete');
|
||||
} catch (err) {
|
||||
this.logger.error(err, 'Listen:whisper error');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = TaskListen;
|
||||
|
||||
@@ -30,6 +30,9 @@ function makeTask(logger, obj, parent) {
|
||||
case TaskName.Dequeue:
|
||||
const TaskDequeue = require('./dequeue');
|
||||
return new TaskDequeue(logger, data, parent);
|
||||
case TaskName.Dtmf:
|
||||
const TaskDtmf = require('./dtmf');
|
||||
return new TaskDtmf(logger, data, parent);
|
||||
case TaskName.Enqueue:
|
||||
const TaskEnqueue = require('./enqueue');
|
||||
return new TaskEnqueue(logger, data, parent);
|
||||
|
||||
@@ -141,6 +141,15 @@
|
||||
"lang"
|
||||
]
|
||||
},
|
||||
"dtmf": {
|
||||
"properties": {
|
||||
"dtmf": "string",
|
||||
"duration": "number"
|
||||
},
|
||||
"required": [
|
||||
"dtmf"
|
||||
]
|
||||
},
|
||||
"lex": {
|
||||
"properties": {
|
||||
"bot": "string",
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
"Dequeue": "dequeue",
|
||||
"Dial": "dial",
|
||||
"Dialogflow": "dialogflow",
|
||||
"Dtmf": "dtmf",
|
||||
"Enqueue": "enqueue",
|
||||
"Gather": "gather",
|
||||
"Hangup": "hangup",
|
||||
|
||||
@@ -108,11 +108,12 @@ class SingleDialer extends Emitter {
|
||||
|
||||
this.ep = await ms.createEndpoint();
|
||||
this.logger.debug(`SingleDialer:exec - created endpoint ${this.ep.uuid}`);
|
||||
let promiseStreamConnected;
|
||||
|
||||
let lastSdp;
|
||||
const connectStream = async(remoteSdp) => {
|
||||
// wait for previous re-invite to complete, if any
|
||||
if (promiseStreamConnected) await promiseStreamConnected.catch((err) => {});
|
||||
return promiseStreamConnected = this.ep.modify(remoteSdp);
|
||||
if (remoteSdp === lastSdp) return;
|
||||
lastSdp = remoteSdp;
|
||||
return this.ep.modify(remoteSdp);
|
||||
};
|
||||
|
||||
Object.assign(opts, {
|
||||
|
||||
Reference in New Issue
Block a user