initial support for conference and queues

This commit is contained in:
Dave Horton
2020-05-06 15:27:24 -04:00
parent 419c5ea9fd
commit a0508a2494
18 changed files with 711 additions and 68 deletions

View File

@@ -12,27 +12,27 @@ function retrieveCallSession(callSid, opts) {
if (cs) {
const task = cs.currentTask;
if (!task || task.name != TaskName.Conference) {
throw new DbErrorUnprocessableRequest(`startConference api failure: indicated call is not waiting: ${task.name}`);
throw new DbErrorUnprocessableRequest(`conference api failure: indicated call is not waiting: ${task.name}`);
}
}
return cs;
}
/**
* update a call
* notify a waiting session that a conference has started
*/
router.post('/:callSid', async(req, res) => {
const logger = req.app.locals.logger;
const callSid = req.params.callSid;
logger.debug({body: req.body}, 'got startConference request');
logger.debug({body: req.body}, 'got conference request');
try {
const cs = retrieveCallSession(callSid, req.body);
if (!cs) {
logger.info(`startConference: callSid not found ${callSid}`);
logger.info(`conference: callSid not found ${callSid}`);
return res.sendStatus(404);
}
res.status(202).end();
cs.notifyStartConference(req.body);
cs.notifyConferenceEvent(req.body);
} catch (err) {
sysError(logger, res, err);
}

View File

@@ -0,0 +1,41 @@
const router = require('express').Router();
const sysError = require('./error');
const sessionTracker = require('../../session/session-tracker');
const {TaskName} = require('../../utils/constants.json');
const {DbErrorUnprocessableRequest} = require('../utils/errors');
/**
* validate the call state
*/
function retrieveCallSession(callSid, opts) {
const cs = sessionTracker.get(callSid);
if (cs) {
const task = cs.currentTask;
if (!task || task.name != TaskName.Dequeue) {
throw new DbErrorUnprocessableRequest(`dequeue api failure: indicated call is not queued: ${task.name}`);
}
}
return cs;
}
/**
* notify a session in a dequeue verb of an event
*/
router.post('/:callSid', async(req, res) => {
const logger = req.app.locals.logger;
const callSid = req.params.callSid;
logger.debug({body: req.body}, 'got dequeue event');
try {
const cs = retrieveCallSession(callSid, req.body);
if (!cs) {
logger.info(`dequeue: callSid not found ${callSid}`);
return res.sendStatus(404);
}
res.status(202).end();
cs.notifyDequeueEvent(req.body);
} catch (err) {
sysError(logger, res, err);
}
});
module.exports = router;

View File

@@ -0,0 +1,41 @@
const router = require('express').Router();
const sysError = require('./error');
const sessionTracker = require('../../session/session-tracker');
const {TaskName} = require('../../utils/constants.json');
const {DbErrorUnprocessableRequest} = require('../utils/errors');
/**
* validate the call state
*/
function retrieveCallSession(callSid, opts) {
const cs = sessionTracker.get(callSid);
if (cs) {
const task = cs.currentTask;
if (!task || task.name != TaskName.Enqueue) {
throw new DbErrorUnprocessableRequest(`enqueue api failure: indicated call is not queued: ${task.name}`);
}
}
return cs;
}
/**
* notify a waiting session that a conference has started
*/
router.post('/:callSid', async(req, res) => {
const logger = req.app.locals.logger;
const callSid = req.params.callSid;
logger.debug({body: req.body}, 'got enqueue event');
try {
const cs = retrieveCallSession(callSid, req.body);
if (!cs) {
logger.info(`enqueue: callSid not found ${callSid}`);
return res.sendStatus(404);
}
res.status(202).end();
cs.notifyEnqueueEvent(req.body);
} catch (err) {
sysError(logger, res, err);
}
});
module.exports = router;

View File

@@ -2,7 +2,9 @@ const api = require('express').Router();
api.use('/createCall', require('./create-call'));
api.use('/updateCall', require('./update-call'));
api.use('/startConference', require('./start-conference'));
api.use('/conference', require('./conference'));
api.use('/dequeue', require('./dequeue'));
api.use('/enqueue', require('./enqueue'));
// health checks
api.get('/', (req, res) => res.sendStatus(200));