@bitblit/ratchet-common
Version:
Common tools for general use
102 lines • 4.29 kB
JavaScript
import { Logger } from '../logger/logger.js';
export class NetworkRatchet {
static LOCAL_IP = null;
constructor() { }
static findLocalIp(useCache = true) {
Logger.info('Attempting to find local IP (V 2)');
if (NetworkRatchet.LOCAL_IP && useCache) {
return Promise.resolve(NetworkRatchet.LOCAL_IP);
}
else {
if (typeof window !== 'undefined') {
return new Promise(function (resolve, reject) {
try {
const RTCPeerConnection = window['RTCPeerConnection'] || window['webkitRTCPeerConnection'] || window['mozRTCPeerConnection'];
if (RTCPeerConnection) {
const rtc = new RTCPeerConnection({ iceServers: [] });
const addrs = Object.create(null);
addrs['0.0.0.0'] = false;
rtc.createDataChannel('', { reliable: false });
rtc.onicecandidate = function (evt) {
if (evt.candidate) {
NetworkRatchet.grepSDP('a=' + evt.candidate.candidate, addrs, resolve);
}
};
rtc.createOffer(function (offerDesc) {
NetworkRatchet.grepSDP(offerDesc.sdp, addrs, resolve);
rtc.setLocalDescription(offerDesc);
}, function (e) {
Logger.warn('Offer failed : %s', e);
resolve(NetworkRatchet.updateLocalIP('FIND_UNSUPPORTED'));
});
}
else {
Logger.warn('IP Address find not supported on this device');
resolve(NetworkRatchet.updateLocalIP('FIND_UNSUPPORTED'));
}
}
catch (err) {
Logger.warn('Error finding local ip address : %s', err);
resolve(NetworkRatchet.updateLocalIP('ERROR'));
}
});
}
else {
Logger.warn('Window not found, cannot calculate local ip');
return Promise.resolve(NetworkRatchet.updateLocalIP('NO_WINDOW'));
}
}
}
static parseUrl(href) {
const url = new URL(href);
const rval = url &&
{
href: href,
protocol: url.protocol,
host: url.host,
hostname: url.hostname,
port: url.port,
pathname: url.pathname,
search: url.search,
hash: url.hash,
};
return rval;
}
static updateLocalIP(newIp) {
NetworkRatchet.LOCAL_IP = newIp;
return NetworkRatchet.LOCAL_IP;
}
static grepSDP(sdp, addrs, resolve) {
const hosts = [];
sdp.split('\r\n').forEach(function (line) {
if (~line.indexOf('a=candidate')) {
const parts = line.split(' '), addr = parts[4], type = parts[7];
if (type === 'host') {
NetworkRatchet.updateAddressList(addr, addrs, resolve);
}
}
else if (~line.indexOf('c=')) {
const parts = line.split(' '), addr = parts[2];
NetworkRatchet.updateAddressList(addr, addrs, resolve);
}
});
}
static updateAddressList(newAddr, addrs, resolve) {
if (newAddr in addrs)
return;
else
addrs[newAddr] = true;
const displayAddrs = Object.keys(addrs).filter(function (k) {
return addrs[k];
});
if (displayAddrs && displayAddrs.length == 1) {
resolve(NetworkRatchet.updateLocalIP(displayAddrs[0]));
}
else {
const multi = displayAddrs.sort().join(',');
Logger.warn('Multiple addresses found, returning sorted join : %s', multi);
resolve(NetworkRatchet.updateLocalIP(multi));
}
}
}
//# sourceMappingURL=network-ratchet.js.map