added redirect verb

This commit is contained in:
Dave Horton
2020-01-27 08:35:31 -05:00
parent 6f51ebacee
commit bed4fa1f42
6 changed files with 55 additions and 7 deletions

View File

@@ -14,28 +14,31 @@ class CallSession extends Emitter {
this.callSid = callSid;
this.tasks = tasks;
this.taskIdx = 0;
this.stackIdx = 0;
this.callGone = false;
}
async exec() {
let idx = 0;
this.logger.info(`CallSession:exec starting task list with ${this.tasks.length} tasks`);
while (this.tasks.length && !this.callGone) {
const taskNum = ++this.taskIdx;
const stackNum = this.stackIdx;
const task = this.tasks.shift();
this.logger.debug({task}, `CallSession:exec starting task #${++idx}: ${task.name}`);
this.logger.debug({task}, `CallSession:exec starting task #${stackNum}:${taskNum}: ${task.name}`);
try {
const resources = await this._evaluatePreconditions(task);
this.currentTask = task;
await task.exec(this, resources);
this.currentTask = null;
this.logger.debug(`CallSession:exec completed task #${idx}: ${task.name}`);
this.logger.debug(`CallSession:exec completed task #${stackNum}:${taskNum}: ${task.name}`);
} catch (err) {
this.currentTask = null;
if (err.message.includes(BADPRECONDITIONS)) {
this.logger.info(`CallSession:exec task #${idx}: ${task.name}: ${err.message}`);
this.logger.info(`CallSession:exec task #${stackNum}:${taskNum}: ${task.name}: ${err.message}`);
}
else {
this.logger.error(err, `Error executing task #${idx}: ${task.name}`);
this.logger.error(err, `Error executing task #${stackNum}:${taskNum}: ${task.name}`);
break;
}
}
@@ -64,7 +67,9 @@ class CallSession extends Emitter {
*/
replaceApplication(tasks) {
this.tasks = tasks;
this.logger.info({tasks}, `CallSession:replaceApplication - set ${tasks.length} new tasks`);
this.logger.info({tasks}, `CallSession:replaceApplication - reset application with ${tasks.length} new tasks`);
this.taskIdx = 0;
this.stackIdx++;
}
_evaluatePreconditions(task) {
switch (task.preconditions) {

View File

@@ -39,6 +39,9 @@ function makeTask(logger, obj) {
case TaskName.Listen:
const TaskListen = require('./listen');
return new TaskListen(logger, data);
case TaskName.Redirect:
const TaskRedirect = require('./redirect');
return new TaskRedirect(logger, data);
}
// should never reach

23
lib/tasks/redirect.js Normal file
View File

@@ -0,0 +1,23 @@
const Task = require('./task');
const {TaskName} = require('../utils/constants');
/**
* Redirects to a new application
*/
class TaskRedirect extends Task {
constructor(logger, opts) {
super(logger, opts);
this.action = this.data.action;
this.method = this.data.method || 'POST';
}
get name() { return TaskName.Redirect; }
async exec(cs) {
super.exec(cs);
await this.performAction(this.method, this.auth);
}
}
module.exports = TaskRedirect;

View File

@@ -102,6 +102,19 @@
"url"
]
},
"redirect": {
"properties": {
"action": "string",
"method": {
"type": "string",
"enum": ["GET", "POST"]
},
"auth": "#auth"
},
"required": [
"action"
]
},
"transcribe": {
"properties": {
"transcriptionCallback": "string",

View File

@@ -25,6 +25,10 @@ class Task extends Emitter {
return this.cs;
}
toJSON() {
return this.data;
}
async exec(cs) {
this.cs = cs;

View File

@@ -5,7 +5,7 @@
"Hangup": "hangup",
"Listen": "listen",
"Play": "play",
"redirect": "redirect",
"Redirect": "redirect",
"SipDecline": "sip:decline",
"SipNotify": "sip:notify",
"SipRedirect": "sip:redirect",