From 9587465e8556d5b44574d9cb63300f19e8832d01 Mon Sep 17 00:00:00 2001 From: Vinod Dharashive Date: Fri, 7 Apr 2023 17:03:24 +0530 Subject: [PATCH] Support for Cisco NBR for Agentassist (#303) * NBR Support * NBR Support * NBR Support * re-invite Ok sdp should be sendonly * NBR Support * sendrecv sdp correction * Update siprec-utils.js * Updated comments * Siprec participants details added to hook * Bugfix siprec * Update call-info.js --- lib/middleware.js | 17 ++++++++++++++--- lib/session/call-info.js | 17 +++++++++++++++++ lib/utils/siprec-utils.js | 12 ++++++++++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/lib/middleware.js b/lib/middleware.js index 47bb1814..fa3b49e0 100644 --- a/lib/middleware.js +++ b/lib/middleware.js @@ -46,7 +46,16 @@ module.exports = function(srf, logger) { } if (req.has('X-Authenticated-User')) req.locals.originatingUser = req.get('X-Authenticated-User'); if (req.has('X-MS-Teams-Tenant-FQDN')) req.locals.msTeamsTenant = req.get('X-MS-Teams-Tenant-FQDN'); - + if (req.has('X-Cisco-Recording-Participant')) { + const ciscoParticipants = req.get('X-Cisco-Recording-Participant'); + const regex = /sip:[\d]+@[\d]+\.[\d]+\.[\d]+\.[\d]+/g; + const sipURIs = ciscoParticipants.match(regex); + logger.info(`X-Cisco-Recording-Participant : ${sipURIs} `); + if (sipURIs && sipURIs.length > 0) { + req.locals.calledNumber = sipURIs[0]; + req.locals.callingNumber = sipURIs[1]; + } + } next(); } @@ -94,8 +103,10 @@ module.exports = function(srf, logger) { .find((p) => p.type === 'application/sdp') .content; const {sdp1, sdp2, ...metadata} = await parseSiprecPayload(req, logger); - req.locals.calledNumber = metadata.caller.number; - req.locals.callingNumber = metadata.callee.number; + if (!req.locals.calledNumber && !req.locals.calledNumber) { + req.locals.calledNumber = metadata.caller.number; + req.locals.callingNumber = metadata.callee.number; + } req.locals = { ...req.locals, siprec: { diff --git a/lib/session/call-info.js b/lib/session/call-info.js index 4f056018..fb7cd7fd 100644 --- a/lib/session/call-info.js +++ b/lib/session/call-info.js @@ -33,6 +33,23 @@ class CallInfo { this.callStatus = CallStatus.Trying; this.originatingSipIp = req.get('X-Forwarded-For'); this.originatingSipTrunkName = req.get('X-Originating-Carrier'); + const {siprec} = req.locals; + if (siprec) { + const caller = parseUri(req.locals.callingNumber); + const callee = parseUri(req.locals.calledNumber); + this.participants = [ + { + participant: 'caller', + uriUser: caller.user, + uriHost: caller.host + }, + { + participant: 'callee', + uriUser: callee.user, + uriHost: callee.host + } + ]; + } } else if (opts.parentCallInfo) { // outbound call that is a child of an existing call diff --git a/lib/utils/siprec-utils.js b/lib/utils/siprec-utils.js index 1905f339..82130db8 100644 --- a/lib/utils/siprec-utils.js +++ b/lib/utils/siprec-utils.js @@ -47,8 +47,16 @@ const parseSiprecPayload = (req, logger) => { } } - if (!sdp || !meta) { - logger.info({payload: req.payload}, 'invalid SIPREC payload'); + + if (!meta && sdp) { + const arr = /^([^]+)(m=[^]+?)(m=[^]+?)$/.exec(sdp); + opts.sdp1 = `${arr[1]}${arr[2]}`; + opts.sdp2 = `${arr[1]}${arr[3]}\r\n`; + opts.sessionId = uuidv4(); + logger.info({ payload: req.payload }, 'SIPREC payload with no metadata (e.g. Cisco NBR)'); + resolve(opts); + } else if (!sdp || !meta) { + logger.info({ payload: req.payload }, 'invalid SIPREC payload'); return reject(new Error('expected multipart SIPREC body')); }