ice-breaker
Version:
Set of helper methods to ease the WebRTC Media connection process.
123 lines (111 loc) • 4.76 kB
JavaScript
'use strict';
/**
* RFC-5245: http://tools.ietf.org/html/rfc5245#section-15.1
*
* candidate-attribute = "candidate" ":" foundation SP component-id SP
transport SP
priority SP
connection-address SP ;from RFC 4566
port ;port from RFC 4566
SP cand-type
[SP rel-addr]
[SP rel-port]
*(SP extension-att-name SP
extension-att-value)
*
* foundation = 1*32ice-char
* component-id = 1*5DIGIT
* transport = "UDP" / transport-extension
* transport-extension = token ; from RFC 3261
* priority = 1*10DIGIT
* cand-type = "typ" SP candidate-types
* candidate-types = "host" / "srflx" / "prflx" / "relay" / token
* rel-addr = "raddr" SP connection-address
* rel-port = "rport" SP port
* extension-att-name = byte-string ;from RFC 4566
* extension-att-value = byte-string
* ice-char = ALPHA / DIGIT / "+" / "/"
*/
/**
* RFC-3261: https://tools.ietf.org/html/rfc3261#section-25.1
*
* token = 1*(alphanum / "-" / "." / "!" / "%" / "*"
/ "_" / "+" / "`" / "'" / "~" )
*/
/*
* RFC-4566: https://tools.ietf.org/html/rfc4566#section-9
*
* port = 1*DIGIT
* IP4-address = b1 3("." decimal-uchar)
* b1 = decimal-uchar
; less than "224"
* ; The following is consistent with RFC 2373 [30], Appendix B.
* IP6-address = hexpart [ ":" IP4-address ]
* hexpart = hexseq / hexseq "::" [ hexseq ] /
"::" [ hexseq ]
* hexseq = hex4 *( ":" hex4)
* hex4 = 1*4HEXDIG
* decimal-uchar = DIGIT
/ POS-DIGIT DIGIT
/ ("1" 2*(DIGIT))
/ ("2" ("0"/"1"/"2"/"3"/"4") DIGIT)
/ ("2" "5" ("0"/"1"/"2"/"3"/"4"/"5"))
*/
var candidateFieldName = {
FOUNDATION: 'foundation',
COMPONENT_ID: 'componentId',
TRANSPORT: 'transport',
PRIORITY: 'priority',
CONNECTION_ADDRESS: 'connectionAddress',
PORT: 'port',
CANDIDATE_TYPE: 'candidateType',
REMOTE_CANDIDATE_ADDRESS: 'remoteConnectionAddress',
REMOTE_CANDIDATE_PORT: 'remotePort'
};
var candidateType = {
HOST: 'host',
SRFLX: 'srflx',
PRFLX: 'prflx',
RELAY: 'relay'
};
var transport = {
TCP: 'TCP',
UDP: 'UDP'
};
var IPV4SEG = '(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])';
var IPV4ADDR = '(?:' + IPV4SEG + '\\.){3}' + IPV4SEG;
var IPV6SEG = '[0-9a-fA-F]{1,4}';
var IPV6ADDR = '(?:' + IPV6SEG + ':){7,7}' + IPV6SEG + '|' + ( // 1:2:3:4:5:6:7:8
'(?:' + IPV6SEG + ':){1,7}:|') + ( // 1:: 1:2:3:4:5:6:7::
'(?:' + IPV6SEG + ':){1,6}:' + IPV6SEG + '|') + ( // 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8
'(?:' + IPV6SEG + ':){1,5}(?::' + IPV6SEG + '){1,2}|') + ( // 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8
'(?:' + IPV6SEG + ':){1,4}(?::' + IPV6SEG + '){1,3}|') + ( // 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8
'(?:' + IPV6SEG + ':){1,3}(?::' + IPV6SEG + '){1,4}|') + ( // 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8
'(?:' + IPV6SEG + ':){1,2}(?::' + IPV6SEG + '){1,5}|') + ( // 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8
IPV6SEG + ':(?:(?::' + IPV6SEG + '){1,6})|') + ( // 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8
':(?:(?::' + IPV6SEG + '){1,7}|:)|') + ( // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::
'fe80:(?::' + IPV6SEG + '){0,4}%[0-9a-zA-Z]{1,}|') + ( // fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index)
'::(?:ffff(?::0{1,4}){0,1}:){0,1}' + IPV4ADDR + '|') + ( // ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
'(?:' + IPV6SEG + ':){1,4}:' + IPV4ADDR); // 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
var TOKEN = '[0-9a-zA-Z\\-\\.!\\%\\*_\\+\\`\\\'\\~]+';
var CANDIDATE_TYPE = '';
Object.keys(candidateType).forEach(function (key) {
CANDIDATE_TYPE += candidateType[key] + '|';
});
CANDIDATE_TYPE += '' + TOKEN;
var pattern = {
COMPONENT_ID: '[0-9]{1,5}',
FOUNDATION: '[a-zA-Z0-9\\+\\/\\-]+',
PRIORITY: '[0-9]{1,10}',
TRANSPORT: transport.UPD + '|' + TOKEN,
CONNECTION_ADDRESS: IPV4ADDR + '|' + IPV6ADDR,
PORT: '[0-9]{1,5}',
CANDIDATE_TYPE: CANDIDATE_TYPE
};
var constants = {
candidateFieldName: candidateFieldName,
candidateType: candidateType,
pattern: pattern,
transport: transport
};
module.exports = constants;