bugix: re-invites after releasing media fail

This commit is contained in:
Dave Horton
2022-01-17 13:11:19 -05:00
parent 752eed428f
commit 097f36cb00
4 changed files with 44 additions and 6 deletions

View File

@@ -780,9 +780,19 @@ class CallSession extends Emitter {
async _onReinvite(req, res) { async _onReinvite(req, res) {
try { try {
const newSdp = await this.ep.modify(req.body); if (this.ep) {
res.send(200, {body: newSdp}); const newSdp = await this.ep.modify(req.body);
this.logger.info({offer: req.body, answer: newSdp}, 'handling reINVITE'); res.send(200, {body: newSdp});
this.logger.info({offer: req.body, answer: newSdp}, 'handling reINVITE');
}
else if (this.currentTask && this.currentTask.name === TaskName.Dial) {
this.logger.info('handling reINVITE after media has been released');
await this.currentTask.handleReinviteAfterMediaReleased(req, res);
}
else {
this.logger.info('got reINVITE but no endpoint and media has not been released');
res.send(488);
}
} catch (err) { } catch (err) {
this.logger.error(err, 'Error handling reinvite'); this.logger.error(err, 'Error handling reinvite');
} }
@@ -953,6 +963,13 @@ class CallSession extends Emitter {
}); });
} }
async handleReinviteAfterMediaReleased(req, res) {
assert(this.dlg && this.dlg.connected && !this.ep);
const sdp = await this.dlg.modify(req.body);
this.logger.info({sdp}, 'CallSession:handleReinviteAfterMediaReleased - reinvite to A leg returned sdp');
res.send(200, {body: sdp});
}
/** /**
* Called any time call status changes. This method both invokes the * Called any time call status changes. This method both invokes the
* call_status_hook callback as well as updates the realtime database * call_status_hook callback as well as updates the realtime database

View File

@@ -13,6 +13,7 @@ const placeCall = require('../utils/place-outdial');
const sessionTracker = require('../session/session-tracker'); const sessionTracker = require('../session/session-tracker');
const DtmfCollector = require('../utils/dtmf-collector'); const DtmfCollector = require('../utils/dtmf-collector');
const dbUtils = require('../utils/db-utils'); const dbUtils = require('../utils/db-utils');
const { rmSync } = require('fs');
const debug = require('debug')('jambonz:feature-server'); const debug = require('debug')('jambonz:feature-server');
function parseDtmfOptions(logger, dtmfCapture) { function parseDtmfOptions(logger, dtmfCapture) {
@@ -437,6 +438,13 @@ class TaskDial extends Task {
this.kill(cs); this.kill(cs);
} }
}) })
.on('reinvite', (req, res) => {
try {
cs.handleReinviteAfterMediaReleased(req, res);
} catch (err) {
this.logger.error(err, 'Error in dial einvite from B leg');
}
})
.once('adulting', () => { .once('adulting', () => {
/* child call just adulted and got its own session */ /* child call just adulted and got its own session */
this.logger.info('Dial:on_adulting: detaching child call leg'); this.logger.info('Dial:on_adulting: detaching child call leg');
@@ -563,6 +571,12 @@ class TaskDial extends Task {
await Promise.all([sd.reAnchorMedia(), cs.reAnchorMedia()]); await Promise.all([sd.reAnchorMedia(), cs.reAnchorMedia()]);
this.epOther = cs.ep; this.epOther = cs.ep;
} }
async handleReinviteAfterMediaReleased(req, res) {
const sdp = await this.dlg.modify(req.body);
this.logger.info({sdp}, 'Dial:handleReinviteAfterMediaReleased - sent reinvite to B leg');
res.send(200, {body: sdp});
}
} }
module.exports = TaskDial; module.exports = TaskDial;

View File

@@ -197,9 +197,15 @@ class SingleDialer extends Emitter {
.on('refresh', () => this.logger.info('SingleDialer:exec - dialog refreshed by uas')) .on('refresh', () => this.logger.info('SingleDialer:exec - dialog refreshed by uas'))
.on('modify', async(req, res) => { .on('modify', async(req, res) => {
try { try {
const newSdp = await this.ep.modify(req.body); if (this.ep) {
res.send(200, {body: newSdp}); const newSdp = await this.ep.modify(req.body);
this.logger.info({offer: req.body, answer: newSdp}, 'SingleDialer:exec: handling reINVITE'); res.send(200, {body: newSdp});
this.logger.info({offer: req.body, answer: newSdp}, 'SingleDialer:exec: handling reINVITE');
}
else {
this.logger.info('SingleDialer:exec: handling reINVITE with released media, emit event');
this.emit('reinvite', req, res);
}
} catch (err) { } catch (err) {
this.logger.error(err, 'Error handling reinvite'); this.logger.error(err, 'Error handling reinvite');
} }

View File

@@ -9,6 +9,7 @@ networks:
services: services:
mysql: mysql:
image: mysql:5.7 image: mysql:5.7
platform: linux/x86_64
ports: ports:
- "3360:3306" - "3360:3306"
environment: environment: