"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");