| '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; |