diff --git a/lib/session/siprec-call-session.js b/lib/session/siprec-call-session.js index e734fe70..bb4f6b0a 100644 --- a/lib/session/siprec-call-session.js +++ b/lib/session/siprec-call-session.js @@ -1,6 +1,7 @@ const InboundCallSession = require('./inbound-call-session'); const {createSipRecPayload} = require('../utils/siprec-utils'); const {CallStatus} = require('../utils/constants'); +const {parseSiprecPayload} = require('../utils/siprec-utils'); /** * @classdesc Subclass of InboundCallSession. This represents a CallSession that is * established for an inbound SIPREC call. @@ -16,6 +17,31 @@ class SipRecCallSession extends InboundCallSession { this.metadata = metadata; } + async _onReinvite(req, res) { + try { + const {sdp1: reSdp1, sdp2: reSdp2, metadata: reMetadata} = await parseSiprecPayload(req, this.logger); + this.sdp1 = reSdp1; + this.sdp2 = reSdp2; + this.metadata = reMetadata; + + if (this.ep && this.ep2) { + let remoteSdp = this.sdp1.replace(/sendonly/, 'sendrecv'); + const newSdp1 = await this.ep.modify(remoteSdp); + remoteSdp = this.sdp2.replace(/sendonly/, 'sendrecv'); + const newSdp2 = await this.ep2.modify(remoteSdp); + const combinedSdp = await createSipRecPayload(newSdp1, newSdp2, this.logger); + res.send(200, {body: combinedSdp}); + this.logger.info({offer: req.body, answer: combinedSdp}, 'handling reINVITE'); + } + else { + this.logger.info('got reINVITE but no endpoint and media has not been released'); + res.send(488); + } + } catch (err) { + this.logger.error(err, 'Error handling reinvite'); + } + } + async answerSipRecCall() { try { this.ms = this.getMS();