feat: support srtpEncryption on dial verb for sip URI targets (#1568)

* feat: support srtpEncryption on dial verb for sip URI targets

Reads the new dial.srtpEncryption option and, for sip: URI targets,
forwards it to sbc-outbound as an X-Jambonz-SRTP header so the outbound
leg negotiates encrypted media (SRTP) — e.g. to a sips:/TLS endpoint
such as LiveKit. No behavior change when the option is unset.

Requires @jambonz/verb-specifications with the srtpEncryption spec
(dependency bump to follow once published) and sbc-outbound honoring
the X-Jambonz-SRTP header.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* update verb specification

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hoan Luu Huu
2026-07-20 07:23:48 -04:00
committed by GitHub
co-authored by Claude Opus 4.8
parent 9973670a6c
commit cdc9070488
4 changed files with 11 additions and 6 deletions
+1
View File
@@ -110,6 +110,7 @@ class TaskDial extends Task {
this.boostAudioSignal = this.data.boostAudioSignal;
this._mediaPath = MediaPath.FullMedia;
this.forwardPAI = this.data.forwardPAI;
this.srtpEncryption = this.data.srtpEncryption;
if (this.dtmfHook) {
const {parentDtmfCollector, childDtmfCollector} = parseDtmfOptions(logger, this.data.dtmfCapture || {});
+5 -1
View File
@@ -84,7 +84,11 @@ class SingleDialer extends Emitter {
'X-Jambonz-Routing': this.target.type,
'X-Call-Sid': this.callSid,
...(this.applicationSid && {'X-Application-Sid': this.applicationSid}),
...(this.target.proxy && {'X-SIP-Proxy': this.target.proxy})
...(this.target.proxy && {'X-SIP-Proxy': this.target.proxy}),
/* request encrypted media (SRTP) on the outbound leg for sip: URI targets;
sbc-outbound honors X-Jambonz-SRTP when forwarding the call */
...('sip' === this.target.type && this.dialTask?.srtpEncryption &&
{'X-Jambonz-SRTP': this.dialTask.srtpEncryption})
};
if (srf.locals.fsUUID) {
opts.headers = {
+4 -4
View File
@@ -18,7 +18,7 @@
"@jambonz/speech-utils": "^0.2.30",
"@jambonz/stats-collector": "^0.1.10",
"@jambonz/time-series": "^0.2.17",
"@jambonz/verb-specifications": "^0.1.12",
"@jambonz/verb-specifications": "^0.1.13",
"@modelcontextprotocol/sdk": "^1.9.0",
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/exporter-jaeger": "^1.23.0",
@@ -1643,9 +1643,9 @@
}
},
"node_modules/@jambonz/verb-specifications": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/@jambonz/verb-specifications/-/verb-specifications-0.1.12.tgz",
"integrity": "sha512-Ddqk78om3k2l1Kj6IGB945W8KOOEwKPLxWeXao6H4jMCbrRponCN+gFOOFUC8q4KRmoe4yaQ6Y02UkejPtaYzQ==",
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/@jambonz/verb-specifications/-/verb-specifications-0.1.13.tgz",
"integrity": "sha512-z/Nb1RE2ADJDAqcOOlevjWytZOnLyboErn6ZZRtz1VVYsrqaAlctYWaLOw6edFcrF9bfr9XhT6uBSma/1Na/Sw==",
"license": "MIT",
"dependencies": {
"debug": "^4.3.4",
+1 -1
View File
@@ -34,7 +34,7 @@
"@jambonz/speech-utils": "^0.2.30",
"@jambonz/stats-collector": "^0.1.10",
"@jambonz/time-series": "^0.2.17",
"@jambonz/verb-specifications": "^0.1.12",
"@jambonz/verb-specifications": "^0.1.13",
"@modelcontextprotocol/sdk": "^1.9.0",
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/exporter-jaeger": "^1.23.0",