all files / tool/ network.js

91.67% Statements 22/24
100% Branches 6/6
100% Functions 4/4
91.67% Lines 22/24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81                                950× 950× 950×                                           946×   946× 944×                                          
/**
 * @file
 * @desc network handlers
 * @author liuyuanyangscript@gmail.com
 * @date  2017/08/11
 */
 
const dns = require('dns');
const getPort = require('get-port');
const URL = require('url-parse');
 
module.exports = {
 
    /**
     * @thunk function
     * @private
     * @desc get free port
     * @param {Number/String} defaultPort
     */
    _getPort(defaultPort) {
        return (done) => {
            getPort(defaultPort).then((port) => {
                done(null, port);
            });
        };
    },
 
    /**
     * @func
     * @desc check whether port was used
     * @param {Number/String} port
     */
    checkPortUsed: function* checkPortUsed(port) {
        const newPort = yield this._getPort(port);
 
        if (parseInt(newPort, 10) === parseInt(port, 10)) {
            return false;
        }
 
        return true;
    },
 
    /**
     * @func
     * @desc get free port. It will increase one by one from defaultPort to get free port
     * @param {Number/String} defaultPort
     */
    getFreePort: function* getFreePort(defaultPort) {
        const finalPort = yield this._getPort(defaultPort);
 
        if (finalPort !== defaultPort) {
            return yield this.getFreePort(defaultPort + 1);
        }
 
        return defaultPort;
    },
 
    /**
     * @thunk function
     * @desc check whether url can be reached
     * @param {String} url
     */
    isReachable(url) {
        const { hostname } = new URL(url);
        return (done) => {
            dns.lookup(hostname, (err) => {
                if (err) {
                    done(null, false);
                } else {
                    done(null, true);
                }
            });
            const reachableTimer = setTimeout(() => {
                clearTimeout(reachableTimer);
                done(null, false);
            }, 2000);
        };
    },
 
};