net/NetUtil.js

'use strict';
const net = require('net');
const OSUtil = require('../os/OSUtil');
const StringUtil = require("../string/StringUtil");

/**
 * @author ycx
 * @description 网络工具类
 */
class NetUtil {


    /**
     *  有效最大端口号 65535
     * @type {number}
     */
    static #PORT_RANGE_MAX = 0xFFFF;


    /**
     * 判断是否有效端口 这里是0 -65535
     * 注:有些端口是1024-65535
     * @param port {number} 端口号
     * @return {boolean} 是否有效
     */
    static isValidPort(port) {
        return port > 0 && port <= this.#PORT_RANGE_MAX;
    }

    /**
     * 检测本地端口是否可用
     * @param port {number} 端口号
     * @return Promise({boolean})
     */
    static async isUsableLocalPort(port) {

        //获取回调
        return new Promise(resolve => {
            //检测是否合法端口
            if (!this.isValidPort(port)) {
                resolve(false);
                return;
            }
            let server = net.createServer().listen(port);
            server.on('listening', () => {
                //关闭服务
                server.close();
                resolve(true);
            });
            server.on('error', (err) => {

                // 'EACCES' 权限被拒绝
                // 'EADDRINUSE‘ 端口被占用
                resolve(false);
            });

        });
    }

    /**
     * 获取本机ipv4地址
     * @return {string | (() => AddressInfo) | (() => (AddressInfo | {})) | (() => (AddressInfo | string | null))}
     */
    static getIPV4Address() {
        return OSUtil.getIPV4Address();
    }

    /**
     *  获取本机ipv6地址
     * @return {string | (() => AddressInfo) | (() => (AddressInfo | {})) | (() => (AddressInfo | string | null))}
     */
    static getIPV6Address() {
        return OSUtil.getIPV6Address();
    }

    /**
     * 从多级反向代理中获得第一个非unknown IP地址
     * @param ip {string} 获得的IP地址
     * @return {string} 第一个非unknown IP地址
     */
    static getMultistageReverseProxyIp(ip){
        if (StringUtil.isNotEmpty(ip) &&  ip.indexOf(",") > 0){
            const ips = ip.trim().split(',');

            for (let subIp of ips) {
                if (false === this.isUnknown(subIp)){
                    ip = subIp;
                    break;
                }
            }
        }
        return ip;
    }

    /**
     * 检测给定字符串是否为未知
     * @param checkString {string}
     * @return {boolean}
     */
    static isUnknown(checkString){
        return StringUtil.isBlank(checkString) || 'unknown' === checkString.toLowerCase();
    }


    /**
     * 是不是ip地址
     * @param ipStr {string}
     * @return {number}
     */
    static isIp(ipStr){
        return net.isIP(ipStr);
    }

    /**
     * 是不是ipv4地址
     * @param ipStr
     * @return {boolean}
     */
    static isIpv4(ipStr){
        return net.isIPv4(ipStr);
    }

    /**
     * 是不是ipv6地址
     * @param ipStr
     * @return {boolean}
     */
    static  isIpv6(ipStr){
        return net.isIPv6(ipStr);
    }

}

module.exports = NetUtil