UNPKG

khamba

Version:

A cli tool for sharing files through local network.

63 lines (62 loc) 1.96 kB
import * as os from 'os'; import { useEffect } from 'react'; import { $baseInfo } from '../stores/baseStore.js'; const isPrivateIP = (ip) => { return ip.startsWith('192.168'); }; const calculateBroadcastAddress = (ipAddress, subnetMask) => { const ipBinary = ipAddress .split('.') .map(part => parseInt(part, 10).toString(2).padStart(8, '0')) .join(''); const maskBinary = subnetMask .split('.') .map(part => parseInt(part, 10).toString(2).padStart(8, '0')) .join(''); const broadcastBinary = ipBinary .split('') .map((bit, index) => parseInt(bit, 2) | (maskBinary[index] === '0' ? 1 : 0)) .join(''); const broadcastParts = []; for (let i = 0; i < 4; i++) { broadcastParts.push(parseInt(broadcastBinary.substr(i * 8, 8), 2)); } return broadcastParts.join('.'); }; const getLocalIP = () => { const interfaces = os.networkInterfaces(); const addresses = []; let address = null; let subnetMask = null; for (const iface in interfaces) { for (const details of interfaces[iface]) { if (details.family === 'IPv4' && !details.internal) { addresses.push(details.address); if (isPrivateIP(details.address)) { address = details.address; subnetMask = details.netmask; } } } } return { address, subnetMask, addresses, }; }; const useLocalIP = () => { useEffect(() => { const { address, subnetMask } = getLocalIP(); if (address && subnetMask) { const broadcastAddress = calculateBroadcastAddress(address, subnetMask); $baseInfo.set({ ...$baseInfo.get(), MY_IP: address, BROADCAST_ADDR: broadcastAddress, }); } }, []); return; }; export default useLocalIP;