Comparing version 2.12.0 to 3.0.0
@@ -1,1 +0,1 @@ | ||
{"processes":{"987304f6-c747-496b-a588-c3a3acec9b3c":{"parent":null,"children":["d2946562-4d8d-4611-a0c2-7de213f7152d"]},"d2946562-4d8d-4611-a0c2-7de213f7152d":{"parent":"987304f6-c747-496b-a588-c3a3acec9b3c","children":[]}},"files":{"/media/fippo/houseparty/webrtc/sdp/sdp.js":["d2946562-4d8d-4611-a0c2-7de213f7152d"]},"externalIds":{}} | ||
{"processes":{"5fcbc816-295e-41b8-9166-5e0a51aade26":{"parent":null,"children":[]}},"files":{"/media/fippo/houseparty/webrtc/sdp/sdp.js":["5fcbc816-295e-41b8-9166-5e0a51aade26"]},"externalIds":{}} |
{ | ||
"name": "sdp", | ||
"version": "2.12.0", | ||
"version": "3.0.0", | ||
"description": "SDP parsing and serialization utilities", | ||
"main": "sdp.js", | ||
"main": "dist/sdp.js", | ||
"module": "sdp.js", | ||
"repository": { | ||
@@ -11,3 +12,5 @@ "type": "git", | ||
"scripts": { | ||
"build": "babel sdp.js --presets babel-preset-env --out-dir dist", | ||
"coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", | ||
"prepare": "npm run build", | ||
"test": "eslint sdp.js test/sdp.js && nyc --reporter html mocha test/sdp.js" | ||
@@ -22,6 +25,9 @@ }, | ||
"devDependencies": { | ||
"babel-cli": "^6.26.0", | ||
"babel-core": "^6.26.3", | ||
"babel-preset-env": "^1.7.0", | ||
"chai": "^4.0.0", | ||
"codecov": "^3.0.4", | ||
"codecov": "^3.6.5", | ||
"eslint": "^6.0.1", | ||
"mocha": "^5.2.0", | ||
"mocha": "^7.1.2", | ||
"nyc": "^14.1.1", | ||
@@ -28,0 +34,0 @@ "sinon": "^2.3.2", |
368
sdp.js
@@ -5,3 +5,3 @@ /* eslint-env node */ | ||
// SDP helpers. | ||
var SDPUtils = {}; | ||
const SDPUtils = {}; | ||
@@ -19,12 +19,9 @@ // Generate an alphanumeric identifier for cname or mids. | ||
SDPUtils.splitLines = function(blob) { | ||
return blob.trim().split('\n').map(function(line) { | ||
return line.trim(); | ||
}); | ||
return blob.trim().split('\n').map(line => line.trim()); | ||
}; | ||
// Splits SDP into sessionpart and mediasections. Ensures CRLF. | ||
SDPUtils.splitSections = function(blob) { | ||
var parts = blob.split('\nm='); | ||
return parts.map(function(part, index) { | ||
return (index > 0 ? 'm=' + part : part).trim() + '\r\n'; | ||
}); | ||
const parts = blob.split('\nm='); | ||
return parts.map((part, index) => (index > 0 ? | ||
'm=' + part : part).trim() + '\r\n'); | ||
}; | ||
@@ -34,3 +31,3 @@ | ||
SDPUtils.getDescription = function(blob) { | ||
var sections = SDPUtils.splitSections(blob); | ||
const sections = SDPUtils.splitSections(blob); | ||
return sections && sections[0]; | ||
@@ -41,3 +38,3 @@ }; | ||
SDPUtils.getMediaSections = function(blob) { | ||
var sections = SDPUtils.splitSections(blob); | ||
const sections = SDPUtils.splitSections(blob); | ||
sections.shift(); | ||
@@ -49,5 +46,3 @@ return sections; | ||
SDPUtils.matchPrefix = function(blob, prefix) { | ||
return SDPUtils.splitLines(blob).filter(function(line) { | ||
return line.indexOf(prefix) === 0; | ||
}); | ||
return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0); | ||
}; | ||
@@ -59,3 +54,3 @@ | ||
SDPUtils.parseCandidate = function(line) { | ||
var parts; | ||
let parts; | ||
// Parse both variants. | ||
@@ -68,5 +63,5 @@ if (line.indexOf('a=candidate:') === 0) { | ||
var candidate = { | ||
const candidate = { | ||
foundation: parts[0], | ||
component: parseInt(parts[1], 10), | ||
component: {1: 'rtp', 2: 'rtcp'}[parts[1]], | ||
protocol: parts[2].toLowerCase(), | ||
@@ -78,6 +73,6 @@ priority: parseInt(parts[3], 10), | ||
// skip parts[6] == 'typ' | ||
type: parts[7] | ||
type: parts[7], | ||
}; | ||
for (var i = 8; i < parts.length; i += 2) { | ||
for (let i = 8; i < parts.length; i += 2) { | ||
switch (parts[i]) { | ||
@@ -94,3 +89,3 @@ case 'raddr': | ||
case 'ufrag': | ||
candidate.ufrag = parts[i + 1]; // for backward compability. | ||
candidate.ufrag = parts[i + 1]; // for backward compatibility. | ||
candidate.usernameFragment = parts[i + 1]; | ||
@@ -108,5 +103,13 @@ break; | ||
SDPUtils.writeCandidate = function(candidate) { | ||
var sdp = []; | ||
const sdp = []; | ||
sdp.push(candidate.foundation); | ||
sdp.push(candidate.component); | ||
const component = candidate.component; | ||
if (component === 'rtp') { | ||
sdp.push(1); | ||
} else if (component === 'rtcp') { | ||
sdp.push(2); | ||
} else { | ||
sdp.push(component); | ||
} | ||
sdp.push(candidate.protocol.toUpperCase()); | ||
@@ -117,3 +120,3 @@ sdp.push(candidate.priority); | ||
var type = candidate.type; | ||
const type = candidate.type; | ||
sdp.push('typ'); | ||
@@ -148,5 +151,5 @@ sdp.push(type); | ||
SDPUtils.parseRtpMap = function(line) { | ||
var parts = line.substr(9).split(' '); | ||
var parsed = { | ||
payloadType: parseInt(parts.shift(), 10) // was: id | ||
let parts = line.substr(9).split(' '); | ||
const parsed = { | ||
payloadType: parseInt(parts.shift(), 10), // was: id | ||
}; | ||
@@ -167,7 +170,7 @@ | ||
SDPUtils.writeRtpMap = function(codec) { | ||
var pt = codec.payloadType; | ||
let pt = codec.payloadType; | ||
if (codec.preferredPayloadType !== undefined) { | ||
pt = codec.preferredPayloadType; | ||
} | ||
var channels = codec.channels || codec.numChannels || 1; | ||
const channels = codec.channels || codec.numChannels || 1; | ||
return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + | ||
@@ -181,7 +184,7 @@ (channels !== 1 ? '/' + channels : '') + '\r\n'; | ||
SDPUtils.parseExtmap = function(line) { | ||
var parts = line.substr(9).split(' '); | ||
const parts = line.substr(9).split(' '); | ||
return { | ||
id: parseInt(parts[0], 10), | ||
direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv', | ||
uri: parts[1] | ||
uri: parts[1], | ||
}; | ||
@@ -204,6 +207,6 @@ }; | ||
SDPUtils.parseFmtp = function(line) { | ||
var parsed = {}; | ||
var kv; | ||
var parts = line.substr(line.indexOf(' ') + 1).split(';'); | ||
for (var j = 0; j < parts.length; j++) { | ||
const parsed = {}; | ||
let kv; | ||
const parts = line.substr(line.indexOf(' ') + 1).split(';'); | ||
for (let j = 0; j < parts.length; j++) { | ||
kv = parts[j].trim().split('='); | ||
@@ -217,4 +220,4 @@ parsed[kv[0].trim()] = kv[1]; | ||
SDPUtils.writeFmtp = function(codec) { | ||
var line = ''; | ||
var pt = codec.payloadType; | ||
let line = ''; | ||
let pt = codec.payloadType; | ||
if (codec.preferredPayloadType !== undefined) { | ||
@@ -224,4 +227,4 @@ pt = codec.preferredPayloadType; | ||
if (codec.parameters && Object.keys(codec.parameters).length) { | ||
var params = []; | ||
Object.keys(codec.parameters).forEach(function(param) { | ||
const params = []; | ||
Object.keys(codec.parameters).forEach(param => { | ||
if (codec.parameters[param]) { | ||
@@ -241,6 +244,6 @@ params.push(param + '=' + codec.parameters[param]); | ||
SDPUtils.parseRtcpFb = function(line) { | ||
var parts = line.substr(line.indexOf(' ') + 1).split(' '); | ||
const parts = line.substr(line.indexOf(' ') + 1).split(' '); | ||
return { | ||
type: parts.shift(), | ||
parameter: parts.join(' ') | ||
parameter: parts.join(' '), | ||
}; | ||
@@ -250,4 +253,4 @@ }; | ||
SDPUtils.writeRtcpFb = function(codec) { | ||
var lines = ''; | ||
var pt = codec.payloadType; | ||
let lines = ''; | ||
let pt = codec.payloadType; | ||
if (codec.preferredPayloadType !== undefined) { | ||
@@ -258,3 +261,3 @@ pt = codec.preferredPayloadType; | ||
// FIXME: special handling for trr-int? | ||
codec.rtcpFeedback.forEach(function(fb) { | ||
codec.rtcpFeedback.forEach(fb => { | ||
lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + | ||
@@ -271,7 +274,7 @@ (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + | ||
SDPUtils.parseSsrcMedia = function(line) { | ||
var sp = line.indexOf(' '); | ||
var parts = { | ||
ssrc: parseInt(line.substr(7, sp - 7), 10) | ||
const sp = line.indexOf(' '); | ||
const parts = { | ||
ssrc: parseInt(line.substr(7, sp - 7), 10), | ||
}; | ||
var colon = line.indexOf(':', sp); | ||
const colon = line.indexOf(':', sp); | ||
if (colon > -1) { | ||
@@ -287,8 +290,6 @@ parts.attribute = line.substr(sp + 1, colon - sp - 1); | ||
SDPUtils.parseSsrcGroup = function(line) { | ||
var parts = line.substr(13).split(' '); | ||
const parts = line.substr(13).split(' '); | ||
return { | ||
semantics: parts.shift(), | ||
ssrcs: parts.map(function(ssrc) { | ||
return parseInt(ssrc, 10); | ||
}) | ||
ssrcs: parts.map(ssrc => parseInt(ssrc, 10)), | ||
}; | ||
@@ -300,3 +301,3 @@ }; | ||
SDPUtils.getMid = function(mediaSection) { | ||
var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0]; | ||
const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0]; | ||
if (mid) { | ||
@@ -308,6 +309,6 @@ return mid.substr(6); | ||
SDPUtils.parseFingerprint = function(line) { | ||
var parts = line.substr(14).split(' '); | ||
const parts = line.substr(14).split(' '); | ||
return { | ||
algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge. | ||
value: parts[1] | ||
value: parts[1], | ||
}; | ||
@@ -320,3 +321,3 @@ }; | ||
SDPUtils.getDtlsParameters = function(mediaSection, sessionpart) { | ||
var lines = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
'a=fingerprint:'); | ||
@@ -327,3 +328,3 @@ // Note: a=setup line is ignored since we use the 'auto' role. | ||
role: 'auto', | ||
fingerprints: lines.map(SDPUtils.parseFingerprint) | ||
fingerprints: lines.map(SDPUtils.parseFingerprint), | ||
}; | ||
@@ -334,4 +335,4 @@ }; | ||
SDPUtils.writeDtlsParameters = function(params, setupType) { | ||
var sdp = 'a=setup:' + setupType + '\r\n'; | ||
params.fingerprints.forEach(function(fp) { | ||
let sdp = 'a=setup:' + setupType + '\r\n'; | ||
params.fingerprints.forEach(fp => { | ||
sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n'; | ||
@@ -345,3 +346,3 @@ }); | ||
SDPUtils.parseCryptoLine = function(line) { | ||
var parts = line.substr(9).split(' '); | ||
const parts = line.substr(9).split(' '); | ||
return { | ||
@@ -371,3 +372,3 @@ tag: parseInt(parts[0], 10), | ||
} | ||
var parts = keyParams.substr(7).split('|'); | ||
const parts = keyParams.substr(7).split('|'); | ||
return { | ||
@@ -391,5 +392,5 @@ keyMethod: 'inline', | ||
// Extracts all SDES paramters. | ||
// Extracts all SDES parameters. | ||
SDPUtils.getCryptoParameters = function(mediaSection, sessionpart) { | ||
var lines = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
'a=crypto:'); | ||
@@ -403,5 +404,5 @@ return lines.map(SDPUtils.parseCryptoLine); | ||
SDPUtils.getIceParameters = function(mediaSection, sessionpart) { | ||
var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
'a=ice-ufrag:')[0]; | ||
var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart, | ||
'a=ice-pwd:')[0]; | ||
@@ -419,4 +420,8 @@ if (!(ufrag && pwd)) { | ||
SDPUtils.writeIceParameters = function(params) { | ||
return 'a=ice-ufrag:' + params.usernameFragment + '\r\n' + | ||
let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\r\n' + | ||
'a=ice-pwd:' + params.password + '\r\n'; | ||
if (params.iceLite) { | ||
sdp += 'a=ice-lite\r\n'; | ||
} | ||
return sdp; | ||
}; | ||
@@ -426,17 +431,17 @@ | ||
SDPUtils.parseRtpParameters = function(mediaSection) { | ||
var description = { | ||
const description = { | ||
codecs: [], | ||
headerExtensions: [], | ||
fecMechanisms: [], | ||
rtcp: [] | ||
rtcp: [], | ||
}; | ||
var lines = SDPUtils.splitLines(mediaSection); | ||
var mline = lines[0].split(' '); | ||
for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..] | ||
var pt = mline[i]; | ||
var rtpmapline = SDPUtils.matchPrefix( | ||
const lines = SDPUtils.splitLines(mediaSection); | ||
const mline = lines[0].split(' '); | ||
for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..] | ||
const pt = mline[i]; | ||
const rtpmapline = SDPUtils.matchPrefix( | ||
mediaSection, 'a=rtpmap:' + pt + ' ')[0]; | ||
if (rtpmapline) { | ||
var codec = SDPUtils.parseRtpMap(rtpmapline); | ||
var fmtps = SDPUtils.matchPrefix( | ||
const codec = SDPUtils.parseRtpMap(rtpmapline); | ||
const fmtps = SDPUtils.matchPrefix( | ||
mediaSection, 'a=fmtp:' + pt + ' '); | ||
@@ -460,3 +465,3 @@ // Only the first a=fmtp:<pt> is considered. | ||
} | ||
SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) { | ||
SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => { | ||
description.headerExtensions.push(SDPUtils.parseExtmap(line)); | ||
@@ -471,3 +476,3 @@ }); | ||
SDPUtils.writeRtpDescription = function(kind, caps) { | ||
var sdp = ''; | ||
let sdp = ''; | ||
@@ -478,3 +483,3 @@ // Build the mline. | ||
sdp += ' UDP/TLS/RTP/SAVPF '; | ||
sdp += caps.codecs.map(function(codec) { | ||
sdp += caps.codecs.map(codec => { | ||
if (codec.preferredPayloadType !== undefined) { | ||
@@ -490,3 +495,3 @@ return codec.preferredPayloadType; | ||
// Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb. | ||
caps.codecs.forEach(function(codec) { | ||
caps.codecs.forEach(codec => { | ||
sdp += SDPUtils.writeRtpMap(codec); | ||
@@ -496,4 +501,4 @@ sdp += SDPUtils.writeFmtp(codec); | ||
}); | ||
var maxptime = 0; | ||
caps.codecs.forEach(function(codec) { | ||
let maxptime = 0; | ||
caps.codecs.forEach(codec => { | ||
if (codec.maxptime > maxptime) { | ||
@@ -506,6 +511,5 @@ maxptime = codec.maxptime; | ||
} | ||
sdp += 'a=rtcp-mux\r\n'; | ||
if (caps.headerExtensions) { | ||
caps.headerExtensions.forEach(function(extension) { | ||
caps.headerExtensions.forEach(extension => { | ||
sdp += SDPUtils.writeExtmap(extension); | ||
@@ -521,24 +525,18 @@ }); | ||
SDPUtils.parseRtpEncodingParameters = function(mediaSection) { | ||
var encodingParameters = []; | ||
var description = SDPUtils.parseRtpParameters(mediaSection); | ||
var hasRed = description.fecMechanisms.indexOf('RED') !== -1; | ||
var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1; | ||
const encodingParameters = []; | ||
const description = SDPUtils.parseRtpParameters(mediaSection); | ||
const hasRed = description.fecMechanisms.indexOf('RED') !== -1; | ||
const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1; | ||
// filter a=ssrc:... cname:, ignore PlanB-msid | ||
var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') | ||
.map(function(line) { | ||
return SDPUtils.parseSsrcMedia(line); | ||
}) | ||
.filter(function(parts) { | ||
return parts.attribute === 'cname'; | ||
}); | ||
var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc; | ||
var secondarySsrc; | ||
const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') | ||
.map(line => SDPUtils.parseSsrcMedia(line)) | ||
.filter(parts => parts.attribute === 'cname'); | ||
const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc; | ||
let secondarySsrc; | ||
var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID') | ||
.map(function(line) { | ||
var parts = line.substr(17).split(' '); | ||
return parts.map(function(part) { | ||
return parseInt(part, 10); | ||
}); | ||
const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID') | ||
.map(line => { | ||
const parts = line.substr(17).split(' '); | ||
return parts.map(part => parseInt(part, 10)); | ||
}); | ||
@@ -549,7 +547,7 @@ if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) { | ||
description.codecs.forEach(function(codec) { | ||
description.codecs.forEach(codec => { | ||
if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) { | ||
var encParam = { | ||
let encParam = { | ||
ssrc: primarySsrc, | ||
codecPayloadType: parseInt(codec.parameters.apt, 10) | ||
codecPayloadType: parseInt(codec.parameters.apt, 10), | ||
}; | ||
@@ -564,3 +562,3 @@ if (primarySsrc && secondarySsrc) { | ||
ssrc: primarySsrc, | ||
mechanism: hasUlpfec ? 'red+ulpfec' : 'red' | ||
mechanism: hasUlpfec ? 'red+ulpfec' : 'red', | ||
}; | ||
@@ -573,3 +571,3 @@ encodingParameters.push(encParam); | ||
encodingParameters.push({ | ||
ssrc: primarySsrc | ||
ssrc: primarySsrc, | ||
}); | ||
@@ -579,3 +577,3 @@ } | ||
// we support both b=AS and b=TIAS but interpret AS as TIAS. | ||
var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b='); | ||
let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b='); | ||
if (bandwidth.length) { | ||
@@ -591,3 +589,3 @@ if (bandwidth[0].indexOf('b=TIAS:') === 0) { | ||
} | ||
encodingParameters.forEach(function(params) { | ||
encodingParameters.forEach(params => { | ||
params.maxBitrate = bandwidth; | ||
@@ -601,13 +599,9 @@ }); | ||
SDPUtils.parseRtcpParameters = function(mediaSection) { | ||
var rtcpParameters = {}; | ||
const rtcpParameters = {}; | ||
// Gets the first SSRC. Note tha with RTX there might be multiple | ||
// Gets the first SSRC. Note that with RTX there might be multiple | ||
// SSRCs. | ||
var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') | ||
.map(function(line) { | ||
return SDPUtils.parseSsrcMedia(line); | ||
}) | ||
.filter(function(obj) { | ||
return obj.attribute === 'cname'; | ||
})[0]; | ||
const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') | ||
.map(line => SDPUtils.parseSsrcMedia(line)) | ||
.filter(obj => obj.attribute === 'cname')[0]; | ||
if (remoteSsrc) { | ||
@@ -620,3 +614,3 @@ rtcpParameters.cname = remoteSsrc.value; | ||
// compound is !reducedSize | ||
var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize'); | ||
const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize'); | ||
rtcpParameters.reducedSize = rsize.length > 0; | ||
@@ -627,3 +621,3 @@ rtcpParameters.compound = rsize.length === 0; | ||
// Note that Edge does not support unmuxed RTCP. | ||
var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux'); | ||
const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux'); | ||
rtcpParameters.mux = mux.length > 0; | ||
@@ -634,7 +628,23 @@ | ||
SDPUtils.writeRtcpParameters = function(rtcpParameters) { | ||
let sdp = ''; | ||
if (rtcpParameters.reducedSize) { | ||
sdp += 'a=rtcp-rsize\r\n'; | ||
} | ||
if (rtcpParameters.mux) { | ||
sdp += 'a=rtcp-mux\r\n'; | ||
} | ||
if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) { | ||
sdp += 'a=ssrc:' + rtcpParameters.ssrc + | ||
' cname:' + rtcpParameters.cname + '\r\n'; | ||
} | ||
return sdp; | ||
}; | ||
// parses either a=msid: or a=ssrc:... msid lines and returns | ||
// the id of the MediaStream and MediaStreamTrack. | ||
SDPUtils.parseMsid = function(mediaSection) { | ||
var parts; | ||
var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:'); | ||
let parts; | ||
const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:'); | ||
if (spec.length === 1) { | ||
@@ -644,9 +654,5 @@ parts = spec[0].substr(7).split(' '); | ||
} | ||
var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') | ||
.map(function(line) { | ||
return SDPUtils.parseSsrcMedia(line); | ||
}) | ||
.filter(function(msidParts) { | ||
return msidParts.attribute === 'msid'; | ||
}); | ||
const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') | ||
.map(line => SDPUtils.parseSsrcMedia(line)) | ||
.filter(msidParts => msidParts.attribute === 'msid'); | ||
if (planB.length > 0) { | ||
@@ -662,5 +668,5 @@ parts = planB[0].value.split(' '); | ||
SDPUtils.parseSctpDescription = function(mediaSection) { | ||
var mline = SDPUtils.parseMLine(mediaSection); | ||
var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:'); | ||
var maxMessageSize; | ||
const mline = SDPUtils.parseMLine(mediaSection); | ||
const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:'); | ||
let maxMessageSize; | ||
if (maxSizeLine.length > 0) { | ||
@@ -672,3 +678,3 @@ maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10); | ||
} | ||
var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:'); | ||
const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:'); | ||
if (sctpPort.length > 0) { | ||
@@ -678,8 +684,8 @@ return { | ||
protocol: mline.fmt, | ||
maxMessageSize: maxMessageSize | ||
maxMessageSize, | ||
}; | ||
} | ||
var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:'); | ||
const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:'); | ||
if (sctpMapLines.length > 0) { | ||
var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0] | ||
const parts = sctpMapLines[0] | ||
.substr(10) | ||
@@ -690,3 +696,3 @@ .split(' '); | ||
protocol: parts[1], | ||
maxMessageSize: maxMessageSize | ||
maxMessageSize, | ||
}; | ||
@@ -702,3 +708,3 @@ } | ||
SDPUtils.writeSctpDescription = function(media, sctp) { | ||
var output = []; | ||
let output = []; | ||
if (media.protocol !== 'DTLS/SCTP') { | ||
@@ -708,3 +714,3 @@ output = [ | ||
'c=IN IP4 0.0.0.0\r\n', | ||
'a=sctp-port:' + sctp.port + '\r\n' | ||
'a=sctp-port:' + sctp.port + '\r\n', | ||
]; | ||
@@ -715,3 +721,3 @@ } else { | ||
'c=IN IP4 0.0.0.0\r\n', | ||
'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\r\n' | ||
'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\r\n', | ||
]; | ||
@@ -733,3 +739,3 @@ } | ||
// Write boilder plate for start of SDP | ||
// Write boiler plate for start of SDP | ||
// sessId argument is optional - if not supplied it will | ||
@@ -740,4 +746,4 @@ // be generated randomly | ||
SDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) { | ||
var sessionId; | ||
var version = sessVer !== undefined ? sessVer : 2; | ||
let sessionId; | ||
const version = sessVer !== undefined ? sessVer : 2; | ||
if (sessId) { | ||
@@ -748,3 +754,3 @@ sessionId = sessId; | ||
} | ||
var user = sessUser || 'thisisadapterortc'; | ||
const user = sessUser || 'thisisadapterortc'; | ||
// FIXME: sess-id should be an NTP timestamp. | ||
@@ -758,61 +764,7 @@ return 'v=0\r\n' + | ||
SDPUtils.writeMediaSection = function(transceiver, caps, type, stream) { | ||
var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps); | ||
// Map ICE parameters (ufrag, pwd) to SDP. | ||
sdp += SDPUtils.writeIceParameters( | ||
transceiver.iceGatherer.getLocalParameters()); | ||
// Map DTLS parameters to SDP. | ||
sdp += SDPUtils.writeDtlsParameters( | ||
transceiver.dtlsTransport.getLocalParameters(), | ||
type === 'offer' ? 'actpass' : 'active'); | ||
sdp += 'a=mid:' + transceiver.mid + '\r\n'; | ||
if (transceiver.direction) { | ||
sdp += 'a=' + transceiver.direction + '\r\n'; | ||
} else if (transceiver.rtpSender && transceiver.rtpReceiver) { | ||
sdp += 'a=sendrecv\r\n'; | ||
} else if (transceiver.rtpSender) { | ||
sdp += 'a=sendonly\r\n'; | ||
} else if (transceiver.rtpReceiver) { | ||
sdp += 'a=recvonly\r\n'; | ||
} else { | ||
sdp += 'a=inactive\r\n'; | ||
} | ||
if (transceiver.rtpSender) { | ||
// spec. | ||
var msid = 'msid:' + stream.id + ' ' + | ||
transceiver.rtpSender.track.id + '\r\n'; | ||
sdp += 'a=' + msid; | ||
// for Chrome. | ||
sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + | ||
' ' + msid; | ||
if (transceiver.sendEncodingParameters[0].rtx) { | ||
sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + | ||
' ' + msid; | ||
sdp += 'a=ssrc-group:FID ' + | ||
transceiver.sendEncodingParameters[0].ssrc + ' ' + | ||
transceiver.sendEncodingParameters[0].rtx.ssrc + | ||
'\r\n'; | ||
} | ||
} | ||
// FIXME: this should be written by writeRtpDescription. | ||
sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + | ||
' cname:' + SDPUtils.localCName + '\r\n'; | ||
if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) { | ||
sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + | ||
' cname:' + SDPUtils.localCName + '\r\n'; | ||
} | ||
return sdp; | ||
}; | ||
// Gets the direction from the mediaSection or the sessionpart. | ||
SDPUtils.getDirection = function(mediaSection, sessionpart) { | ||
// Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv. | ||
var lines = SDPUtils.splitLines(mediaSection); | ||
for (var i = 0; i < lines.length; i++) { | ||
const lines = SDPUtils.splitLines(mediaSection); | ||
for (let i = 0; i < lines.length; i++) { | ||
switch (lines[i]) { | ||
@@ -835,4 +787,4 @@ case 'a=sendrecv': | ||
SDPUtils.getKind = function(mediaSection) { | ||
var lines = SDPUtils.splitLines(mediaSection); | ||
var mline = lines[0].split(' '); | ||
const lines = SDPUtils.splitLines(mediaSection); | ||
const mline = lines[0].split(' '); | ||
return mline[0].substr(2); | ||
@@ -846,4 +798,4 @@ }; | ||
SDPUtils.parseMLine = function(mediaSection) { | ||
var lines = SDPUtils.splitLines(mediaSection); | ||
var parts = lines[0].substr(2).split(' '); | ||
const lines = SDPUtils.splitLines(mediaSection); | ||
const parts = lines[0].substr(2).split(' '); | ||
return { | ||
@@ -853,3 +805,3 @@ kind: parts[0], | ||
protocol: parts[2], | ||
fmt: parts.slice(3).join(' ') | ||
fmt: parts.slice(3).join(' '), | ||
}; | ||
@@ -859,4 +811,4 @@ }; | ||
SDPUtils.parseOLine = function(mediaSection) { | ||
var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0]; | ||
var parts = line.substr(2).split(' '); | ||
const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0]; | ||
const parts = line.substr(2).split(' '); | ||
return { | ||
@@ -868,3 +820,3 @@ username: parts[0], | ||
addressType: parts[4], | ||
address: parts[5] | ||
address: parts[5], | ||
}; | ||
@@ -878,4 +830,4 @@ }; | ||
} | ||
var lines = SDPUtils.splitLines(blob); | ||
for (var i = 0; i < lines.length; i++) { | ||
const lines = SDPUtils.splitLines(blob); | ||
for (let i = 0; i < lines.length; i++) { | ||
if (lines[i].length < 2 || lines[i].charAt(1) !== '=') { | ||
@@ -882,0 +834,0 @@ return false; |
Sorry, the diff of this file is not supported yet
120063
1395
10
11