From 9feb6f3c8f558fa4779da646d14d5fb398be45e2 Mon Sep 17 00:00:00 2001 From: Hoan Luu Huu <110280845+xquanluu@users.noreply.github.com> Date: Mon, 17 Feb 2025 21:47:59 +0700 Subject: [PATCH] support voip carrier sip proxy (#165) * support voiip carrier sip proxy * wip * wip * wip --- lib/call-session.js | 11 ++++++++++- lib/utils.js | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/call-session.js b/lib/call-session.js index 4d791e2..119af6b 100644 --- a/lib/call-session.js +++ b/lib/call-session.js @@ -7,7 +7,8 @@ const { isPrivateVoipNetwork, isBlackListedSipGateway, makeFullMediaReleaseKey, - makePartnerFullMediaReleaseKey + makePartnerFullMediaReleaseKey, + isValidDomainOrIP } = require('./utils'); const { MediaPath } = require('./constants.json'); const {forwardInDialogRequests} = require('drachtio-fn-b2b-sugar'); @@ -342,6 +343,14 @@ class CallSession extends Emitter { proxy = u; u = `${scheme}:${prefix}${prependPlus}${calledNumber}@${vc.register_sip_realm};transport=${transport}`; this.logger.debug({uri: u}, `using outbound proxy for this registered trunk: ${proxy}`); + } else if (vc.outbound_sip_proxy && vc.outbound_sip_proxy.length > 0) { + if (vc.outbound_sip_proxy.includes('sip:') || vc.outbound_sip_proxy.includes('sips:')) { + proxy = vc.outbound_sip_proxy; + } else if (isValidDomainOrIP(vc.outbound_sip_proxy)) { + proxy = + `${scheme}:${prefix}${prependPlus}${calledNumber}@${vc.outbound_sip_proxy};transport=${transport}`; + this.logger.debug({uri: u}, `using outbound proxy for this trunk: ${proxy}`); + } } mapGateways.set(u, obj); uris.push(u); diff --git a/lib/utils.js b/lib/utils.js index c2429a1..076fa1b 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -323,6 +323,18 @@ const makePartnerFullMediaReleaseKey = (callId) => { return `a_sdp:${callId}`; }; +function isValidDomainOrIP(input) { + const domainRegex = /^(?!:\/\/)([a-zA-Z0-9.-]+)(:\d+)?$/; + // eslint-disable-next-line max-len + const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(:\d+)?$/; + + if (domainRegex.test(input) || ipRegex.test(input)) { + return true; + } + + return false; // Invalid input +} + module.exports = { makeRtpEngineOpts, selectHostPort, @@ -336,5 +348,6 @@ module.exports = { isPrivateVoipNetwork, isBlackListedSipGateway, makeFullMediaReleaseKey, - makePartnerFullMediaReleaseKey + makePartnerFullMediaReleaseKey, + isValidDomainOrIP };