UNPKG

@bitblit/ratchet-common

Version:

Common tools for general use

102 lines 4.29 kB
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