You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					52 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					52 lines
				
				1.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								const os = require('os');
							 | 
						||
| 
								 | 
							
								const defaultGateway = require('default-gateway');
							 | 
						||
| 
								 | 
							
								const ipaddr = require('ipaddr.js');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function findIp(gateway) {
							 | 
						||
| 
								 | 
							
									const interfaces = os.networkInterfaces();
							 | 
						||
| 
								 | 
							
									const gatewayIp = ipaddr.parse(gateway);
							 | 
						||
| 
								 | 
							
									let ip;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Look for the matching interface in all local interfaces
							 | 
						||
| 
								 | 
							
									Object.keys(interfaces).some(name => {
							 | 
						||
| 
								 | 
							
										return interfaces[name].some(addr => {
							 | 
						||
| 
								 | 
							
											const prefix = ipaddr.parse(addr.netmask).prefixLengthFromSubnetMask();
							 | 
						||
| 
								 | 
							
											const net = ipaddr.parseCIDR(`${addr.address}/${prefix}`);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (net[0] && net[0].kind() === gatewayIp.kind() && gatewayIp.match(net)) {
							 | 
						||
| 
								 | 
							
												ip = net[0].toString();
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return Boolean(ip);
							 | 
						||
| 
								 | 
							
										});
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return ip;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function promise(family) {
							 | 
						||
| 
								 | 
							
									return defaultGateway[family]().then(result => {
							 | 
						||
| 
								 | 
							
										return findIp(result.gateway) || null;
							 | 
						||
| 
								 | 
							
									}).catch(() => null);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function sync(family) {
							 | 
						||
| 
								 | 
							
									try {
							 | 
						||
| 
								 | 
							
										const result = defaultGateway[family].sync();
							 | 
						||
| 
								 | 
							
										return findIp(result.gateway) || null;
							 | 
						||
| 
								 | 
							
									} catch (error) {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const internalIp = {};
							 | 
						||
| 
								 | 
							
								internalIp.v6 = () => promise('v6');
							 | 
						||
| 
								 | 
							
								internalIp.v4 = () => promise('v4');
							 | 
						||
| 
								 | 
							
								internalIp.v6.sync = () => sync('v6');
							 | 
						||
| 
								 | 
							
								internalIp.v4.sync = () => sync('v4');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = internalIp;
							 | 
						||
| 
								 | 
							
								// TODO: Remove this for the next major release
							 | 
						||
| 
								 | 
							
								module.exports.default = internalIp;
							 |