bugfix: audio lost on reINVITE from called party

This commit is contained in:
Dave Horton
2020-04-02 11:05:56 -04:00
parent 08c9f29ac8
commit e4313fd5d3
+12 -5
View File
@@ -12,7 +12,7 @@ class CallSession extends Emitter {
this.srf = req.srf;
this.performLcr = this.srf.locals.dbHelpers.performLcr;
this.logger = logger.child({callId: req.get('Call-ID')});
this.useWss = req.locals.registration && req.locals.registration.protocol === 'wss';
this.useWss = req.locals.registration && req.locals.registration.protocol === 'wss';
this.stats = this.srf.locals.stats;
this.activeCallIds = this.srf.locals.activeCallIds;
}
@@ -88,8 +88,10 @@ class CallSession extends Emitter {
proxyResponseHeaders: ['all'],
localSdpB: response.sdp,
localSdpA: async(sdp, res) => {
const opts = Object.assign({sdp, 'to-tag': res.getParsedHeader('To').params.tag},
this.toTag = res.getParsedHeader('To').params.tag;
const opts = Object.assign({sdp, 'to-tag': this.toTag},
this.rtpEngineOpts.answer);
this.logger.debug({opts}, 'calling rtpengine answer with these opts');
const response = await this.answer(opts);
if ('ok' !== response.result) {
this.logger.error(`rtpengine answer failed with ${JSON.stringify(response)}`);
@@ -165,19 +167,24 @@ class CallSession extends Emitter {
async _onReinvite(dlg, req, res) {
try {
let response = await this.offer(Object.assign({sdp: req.body}, this.rtpEngineOpts.offer));
const optOffer = Object.assign(this.rtpEngineOpts.offer, {sdp: req.body, 'to-tag': this.toTag});
this.logger.debug({opts: optOffer}, 'got reinvite, calling rtpengine offer with these opts');
let response = await this.offer(optOffer);
if ('ok' !== response.result) {
res.send(488);
throw new Error(`_onReinvite: rtpengine failed: offer: ${JSON.stringify(response)}`);
}
this.logger.debug({sdp: response.sdp}, 'rtpengine offer returned');
const sdp = await dlg.other.modify(response.sdp);
const opts = Object.assign({sdp, 'to-tag': res.getParsedHeader('To').params.tag},
this.rtpEngineOpts.answer);
this.logger.debug({sdp}, 'reinvite to feature server returned');
const opts = Object.assign(this.rtpEngineOpts.answer, {sdp, 'to-tag': this.toTag});
this.logger.debug({opts}, 'in reinvite, calling rtpengine answer with these opts');
response = await this.answer(opts);
if ('ok' !== response.result) {
res.send(488);
throw new Error(`_onReinvite: rtpengine failed: ${JSON.stringify(response)}`);
}
this.logger.debug({sdp: response.sdp}, 'rtpengine answer returned');
res.send(200, {body: response.sdp});
} catch (err) {
this.logger.error(err, 'Error handling reinvite');