slavery-js
Version:
A simple clustering app that allows you to scale an application on multiple thread, containers or machines
51 lines (42 loc) • 1.68 kB
text/typescript
import * as os from 'os';
import * as ip from 'ip';
import getPort from 'get-port';
interface NetworkInterfaceInfo {
ip: string;
subnet: string;
}
function getLocalIpAndSubnet() : NetworkInterfaceInfo[] {
const interfaces = os.networkInterfaces();
const result = [];
for (const name of Object.keys(interfaces)) {
for (const iface of interfaces[name]!) {
if (iface.family === 'IPv4' && !iface.internal) {
result.push({ ip: iface.address, subnet: iface.netmask });
}
}
}
return result;
}
function isSameNetwork(localIp: string, localSubnet: string, targetIp: string) : boolean {
const localSubnetInfo = ip.subnet(localIp, localSubnet);
const targetSubnetInfo = ip.subnet(targetIp, localSubnet); // Using localSubnet for the mask
return localSubnetInfo.networkAddress === targetSubnetInfo.networkAddress;
}
function findLocalIpOnSameNetwork(targetIp: string) : string | null {
// if targetIp is localhost, use
if(targetIp === 'localhost') targetIp = '127.0.0.1';
// if targetIp is in the local network, return the local IP
if (ip.isLoopback(targetIp) && ip.isPrivate(targetIp))
return targetIp;
// Otherwise, find the local IP on the same network
const localNetworks = getLocalIpAndSubnet();
// for each local network, check if the target IP is in the same network
for (const network of localNetworks) {
if (isSameNetwork(network.ip, network.subnet, targetIp)) {
// return the local IP
return network.ip;
}
}
return null;
}
export { findLocalIpOnSameNetwork, getLocalIpAndSubnet, getPort };