UNPKG

node-red-contrib-hikvision-ultimate

Version:

A native set of nodes for Hikvision (and compatible) Cameras, Alarms, Radars, NVR, Doorbells, etc.

52 lines (47 loc) 2.25 kB
// Helper for ipaddresses const os = require('os') // #region "GET LOCAL INTERFACE PROPERTIES" function getIPv4Interfaces () { // get the local address of the IPv4 interface we're going to use const candidateInterfaces = {} const interfaces = os.networkInterfaces() for (const iface in interfaces) { for (const key in interfaces[iface]) { const intf = interfaces[iface][key] // 11/05/2022 Fixed a breaking change introduced by node 18 (https://nodejs.org/api/os.html#osnetworkinterfaces) // In Node < 18, intf.family is a string "IPv4" or "IPv6", from node 18, is an integer, for example 4. try { //// knxLog.get().debug('ipAddressHelper.js: parsing interface: %s (%j)', iface, intf) if (intf.family !== undefined && intf.family.toString().includes('4') && !intf.internal) { //// knxLog.get().trace('ipAddressHelper.js: Found suitable interface: %s (%j)', iface, intf) candidateInterfaces[iface] = intf } else { //// knxLog.get().trace('ipAddressHelper.js: Found NOT suitable interface: %s (%j)', iface, intf) } } catch (error) { //// knxLog.get().error('ipAddressHelper.js: getIPv4Interfaces: error parsing the interface %s (%j)', iface, intf) } } } return candidateInterfaces } exports.getLocalAddress = function (_interface = '') { // knxLog.get().trace('ipAddressHelper.js: getLocalAddress: getting interfaces') const candidateInterfaces = getIPv4Interfaces() // if user has declared a desired interface then use it if (_interface !== '') { if (!candidateInterfaces.hasOwnProperty(_interface)) { // knxLog.get().error('ipAddressHelper.js: exports.getLocalAddress: Interface ' + _interface + ' not found or has no useful IPv4 address!') throw Error('Interface ' + _interface + ' not found or has no useful IPv4 address!') } else { return candidateInterfaces[_interface].address } } // just return the first available IPv4 non-loopback interface if (Object.keys(candidateInterfaces).length > 0) { return candidateInterfaces[Object.keys(candidateInterfaces)[0]].address } // no local IpV4 interfaces? throw Error('No valid IPv4 interfaces detected') } // #endregion