| "use strict"; | 
|   | 
| const execa = require("execa"); | 
| const ipRegex = require("ip-regex"); | 
|   | 
| const gwArgs = "path Win32_NetworkAdapterConfiguration where IPEnabled=true get DefaultIPGateway,Index /format:table".split(" "); | 
| const ifArgs = "path Win32_NetworkAdapter get Index,NetConnectionID /format:table".split(" "); | 
|   | 
| const parse = (gwTable, ifTable, family) => { | 
|   let gateway, gwid, result; | 
|   | 
|   (gwTable || "").trim().split("\n").splice(1).some(line => { | 
|     const results = line.trim().split(/} +/) || []; | 
|     const gw = results[0]; | 
|     const id = results[1]; | 
|     gateway = (ipRegex[family]().exec((gw || "").trim()) || [])[0]; | 
|     if (gateway) { | 
|       gwid = id; | 
|       return true; | 
|     } | 
|   }); | 
|   | 
|   (ifTable || "").trim().split("\n").splice(1).some(line => { | 
|     const i = line.indexOf(" "); | 
|     const id = line.substr(0, i).trim(); | 
|     const name = line.substr(i + 1).trim(); | 
|     if (id === gwid) { | 
|       result = {gateway, interface: name ? name : null}; | 
|       return true; | 
|     } | 
|   }); | 
|   | 
|   if (!result) { | 
|     throw new Error("Unable to determine default gateway"); | 
|   } | 
|   | 
|   return result; | 
| }; | 
|   | 
| const spawnOpts = { | 
|   windowsHide: true, | 
| }; | 
|   | 
| const promise = family => { | 
|   return Promise.all([ | 
|     execa.stdout("wmic", gwArgs, spawnOpts), | 
|     execa.stdout("wmic", ifArgs, spawnOpts), | 
|   ]).then(results => { | 
|     const gwTable = results[0]; | 
|     const ifTable = results[1]; | 
|   | 
|     return parse(gwTable, ifTable, family); | 
|   }); | 
| }; | 
|   | 
| const sync = family => { | 
|   const gwTable = execa.sync("wmic", gwArgs, spawnOpts).stdout; | 
|   const ifTable = execa.sync("wmic", ifArgs, spawnOpts).stdout; | 
|   | 
|   return parse(gwTable, ifTable, family); | 
| }; | 
|   | 
| module.exports.v4 = () => promise("v4"); | 
| module.exports.v6 = () => promise("v6"); | 
|   | 
| module.exports.v4.sync = () => sync("v4"); | 
| module.exports.v6.sync = () => sync("v6"); |