Skip to content

Commit

Permalink
Fix media issues with sip.js
Browse files Browse the repository at this point in the history
  • Loading branch information
psanders committed Mar 7, 2021
1 parent 83f3307 commit 0d85f21
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 31 deletions.
84 changes: 55 additions & 29 deletions mod/core/processor/response_processor.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ const SipFactory = Java.type('javax.sip.SipFactory')
const LogManager = Java.type('org.apache.logging.log4j.LogManager')
const LOG = LogManager.getLogger()
const headerFactory = SipFactory.getInstance().createHeaderFactory()
const { RTPBridgingNote } = require('@routr/rtpengine/rtp_bridging_note')
const { directionFromResponse } = require('@routr/rtpengine/utils')

class ResponseProcessor {
constructor (sipProvider, contextStorage) {
Expand Down Expand Up @@ -47,43 +49,67 @@ class ResponseProcessor {
}

async sendResponse (event) {
const response = event.getResponse().clone()
const viaHeader = response.getHeader(ViaHeader.NAME)
const xReceivedHeader = headerFactory.createHeader(
'X-Inf-Received',
viaHeader.getReceived()
)
const xRPortHeader = headerFactory.createHeader(
'X-Inf-RPort',
`${viaHeader.getRPort()}`
)
response.addHeader(xReceivedHeader)
response.addHeader(xRPortHeader)
response.removeFirst(ViaHeader.NAME)

if (isTransactional(event)) {
const context = this.contextStorage.findContext(
event.getClientTransaction().getBranchId()
try {
const response = event.getResponse().clone()
const bridgingNote = directionFromResponse(response)
const viaHeader = response.getHeader(ViaHeader.NAME)
const xReceivedHeader = headerFactory.createHeader(
'X-Inf-Received',
viaHeader.getReceived()
)
const xRPortHeader = headerFactory.createHeader(
'X-Inf-RPort',
`${viaHeader.getRPort()}`
)
response.addHeader(xReceivedHeader)
response.addHeader(xRPortHeader)
response.removeFirst(ViaHeader.NAME)

if (isOk(response) && hasSDP(response)) {
const obj = await RTPEngineConnector.answer(
context.bridgingNote,
extractRTPEngineParams(response)
if (isTransactional(event)) {
const context = this.contextStorage.findContext(
event.getClientTransaction().getBranchId()
)
response.setContent(obj.sdp, response.getHeader(ContentTypeHeader.NAME))
}

if (context && context.serverTransaction) {
context.serverTransaction.sendResponse(response)
// WARNINIG: We need to remove the SDP for response to WebRTC endpoints
// else we will get a Called with SDP without DTLS fingerprint
if (
response.getStatusCode() === 183 &&
bridgingNote === RTPBridgingNote.WEB_TO_SIP
)
response.removeContent()

if (isOk(response) && hasSDP(response)) {
const obj = await RTPEngineConnector.answer(
bridgingNote,
extractRTPEngineParams(response)
)

// WARNINIG: This patches an issue with RTPEngine where its not setting rtpmux
if (bridgingNote === RTPBridgingNote.WEB_TO_SIP)
obj.sdp = obj.sdp.replace(
'a=setup:active',
'a=setup:active\na=rtcp-mux'
)

response.setContent(
obj.sdp,
response.getHeader(ContentTypeHeader.NAME)
)
}

if (context && context.serverTransaction) {
context.serverTransaction.sendResponse(response)
} else if (response.getHeader(ViaHeader.NAME) !== null) {
this.sipProvider.sendResponse(response)
}
} else if (response.getHeader(ViaHeader.NAME) !== null) {
// Could be a BYE due to Record-Route
this.sipProvider.sendResponse(response)
}
} else if (response.getHeader(ViaHeader.NAME) !== null) {
// Could be a BYE due to Record-Route
this.sipProvider.sendResponse(response)
LOG.debug(response)
} catch (e) {
LOG.error(e)
}
LOG.debug(response)
}
}

Expand Down
34 changes: 32 additions & 2 deletions mod/rtpengine/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,48 @@ const { RTPBridgingNote } = require('@routr/rtpengine/rtp_bridging_note')
const ViaHeader = Java.type('javax.sip.header.ViaHeader')
const isTransportWeb = t => t === 'ws' || t === 'wss'

module.exports.getBridgingNote = (request, route) => {
const destTransport = !route.thruGw ? route.transport.toLowerCase() : ''
module.exports.directionFromRequest = (request, route) => {
const destTransport = route.transport.toLowerCase()
const srcTransport = request
.getHeader(ViaHeader.NAME)
.getTransport()
.toLowerCase()

if (isTransportWeb(srcTransport) && isTransportWeb(destTransport))
return RTPBridgingNote.WEB_TO_WEB

if (isTransportWeb(srcTransport) && !isTransportWeb(destTransport))
return RTPBridgingNote.WEB_TO_SIP

if (!isTransportWeb(srcTransport) && !isTransportWeb(destTransport))
return RTPBridgingNote.SIP_TO_SIP

if (!isTransportWeb(srcTransport) && isTransportWeb(destTransport))
return RTPBridgingNote.SIP_TO_WEB
}

module.exports.directionFromResponse = response => {
const viaHeaders = response.getHeaders(ViaHeader.NAME)
if (viaHeaders.hasNext()) {
const viaHeaders = response.getHeaders(ViaHeader.NAME)
const srcTransport = viaHeaders
.next()
.getTransport()
.toLowerCase()
const destTransport = viaHeaders
.next()
.getTransport()
.toLowerCase()

if (isTransportWeb(srcTransport) && isTransportWeb(destTransport))
return RTPBridgingNote.WEB_TO_WEB

if (isTransportWeb(srcTransport) && !isTransportWeb(destTransport))
return RTPBridgingNote.SIP_TO_WEB

if (!isTransportWeb(srcTransport) && isTransportWeb(destTransport))
return RTPBridgingNote.WEB_TO_SIP
}

return RTPBridgingNote.SIP_TO_SIP
}

0 comments on commit 0d85f21

Please sign in to comment.