Support sipindialog for conference (#1050)

* fix: add _onRequestWithinDialog catch block

* feat: support sipindialog for conference

* fix: remove any existing listener before adding new
This commit is contained in:
Anton Voylenko
2025-02-24 20:59:32 +02:00
committed by GitHub
parent 8bed44cce3
commit 69ba18acd1
3 changed files with 30 additions and 5 deletions

View File

@@ -2478,12 +2478,14 @@ Duration=${duration} `
} else if (sip_method === 'MESSAGE') { } else if (sip_method === 'MESSAGE') {
res.send(202); res.send(202);
} else { } else {
this.logger.info(`CallSession:_onRequestWithinDialog unsported method: ${req.method}`); this.logger.warn(`CallSession:_onRequestWithinDialog unsupported method: ${req.method}`);
res.send(501); res.send(501);
return; return;
} }
const params = {sip_method, sip_body: req.body, sip_headers: req.headers}; const params = {sip_method, sip_body: req.body, sip_headers: req.headers};
this.currentTask.performHook(this, this.sipRequestWithinDialogHook, params); this.currentTask.performHook(this, this.sipRequestWithinDialogHook, params).catch((err) => {
this.logger.error({err}, 'CallSession:_onRequestWithinDialog - error calling sipRequestWithinDialogHook');
});
} }
async _onReinvite(req, res) { async _onReinvite(req, res) {

View File

@@ -83,7 +83,11 @@ class Conference extends Task {
// reset answer time if we were transferred from another feature server // reset answer time if we were transferred from another feature server
if (this.connectTime) dlg.connectTime = this.connectTime; if (this.connectTime) dlg.connectTime = this.connectTime;
if (cs.sipRequestWithinDialogHook) {
/* remove any existing listener to escape from duplicating events */
this._removeSipIndialogRequestListener(this.dlg);
this._initSipIndialogRequestListener(cs, dlg);
}
this.ep.on('destroy', this._kicked.bind(this, cs, dlg)); this.ep.on('destroy', this._kicked.bind(this, cs, dlg));
try { try {
@@ -103,6 +107,7 @@ class Conference extends Task {
this.logger.debug(`Conference:exec - conference ${this.confName} is over`); this.logger.debug(`Conference:exec - conference ${this.confName} is over`);
if (this.callMoved !== false) await this.performAction(this.results); if (this.callMoved !== false) await this.performAction(this.results);
this._removeSipIndialogRequestListener(dlg);
} catch (err) { } catch (err) {
this.logger.info(err, `TaskConference:exec - error in conference ${this.confName}`); this.logger.info(err, `TaskConference:exec - error in conference ${this.confName}`);
} }
@@ -416,6 +421,20 @@ class Conference extends Task {
} }
} }
_initSipIndialogRequestListener(cs, dlg) {
dlg.on('info', this._onRequestWithinDialog.bind(this, cs));
dlg.on('message', this._onRequestWithinDialog.bind(this, cs));
}
_removeSipIndialogRequestListener(dlg) {
dlg && dlg.removeAllListeners('message');
dlg && dlg.removeAllListeners('info');
}
_onRequestWithinDialog(cs, req, res) {
cs._onRequestWithinDialog(req, res);
}
/** /**
* The conference we have been waiting for has started. * The conference we have been waiting for has started.
* It may be on this server or a different one, and we are * It may be on this server or a different one, and we are

View File

@@ -499,7 +499,7 @@ class TaskDial extends Task {
dlg && dlg.removeAllListeners('info'); dlg && dlg.removeAllListeners('info');
} }
async _onRequestWithinDialog(cs, req, res) { _onRequestWithinDialog(cs, req, res) {
cs._onRequestWithinDialog(req, res); cs._onRequestWithinDialog(req, res);
} }
@@ -871,7 +871,11 @@ class TaskDial extends Task {
if (this.parentDtmfCollector) this._installDtmfDetection(cs, cs.dlg); if (this.parentDtmfCollector) this._installDtmfDetection(cs, cs.dlg);
if (this.childDtmfCollector) this._installDtmfDetection(cs, this.dlg); if (this.childDtmfCollector) this._installDtmfDetection(cs, this.dlg);
if (cs.sipRequestWithinDialogHook) this._initSipIndialogRequestListener(cs, this.dlg); if (cs.sipRequestWithinDialogHook) {
/* remove any existing listener to escape from duplicating events */
this._removeSipIndialogRequestListener(this.dlg);
this._initSipIndialogRequestListener(cs, this.dlg);
}
if (this.transcribeTask) this.transcribeTask.exec(cs, {ep: this.epOther, ep2:this.ep}); if (this.transcribeTask) this.transcribeTask.exec(cs, {ep: this.epOther, ep2:this.ep});
if (this.listenTask) this.listenTask.exec(cs, {ep: this.listenTask.channel === 2 ? this.ep : this.epOther}); if (this.listenTask) this.listenTask.exec(cs, {ep: this.listenTask.channel === 2 ? this.ep : this.epOther});