RSS Git Download  Clone
Raw Blame History
const utilsPromise = require('./promise');

module.exports.waitPort = async (options) => {
    let {
        port, host, retry, wait
    } = options
    if (port === undefined) {
        throw new Error(`${port} is undefined, please select a port like 25, 80 etc...`)
    }
    retry = retry || 8
    wait = wait || 3000
    host = host || '127.0.0.1';

    let actualRetry = 0;

    const {reject, resolve, promise} = utilsPromise.deferred();

    const checkPort = () => {

        actualRetry++;

        const net = require('net');
        const server = net.createServer();

        server.once('error', function (err) {
            if (err.code === 'EADDRINUSE') {
                // port is currently in use
                console.info(`Port ${port} in ${host} is opened`);
                server.close();
                clearInterval(interval);
                resolve();
            }
        });

        server.once('listening', function () {
            // close the server if listening doesn't fail
            console.info(`Retry ${actualRetry}, Port ${port} in ${host} is not opened`);
            server.close();

            if (actualRetry > retry) {
                reject();
            }

        });

        server.listen({
            host: 'localhost',
            port: port,
        });
    }

    const interval = setInterval(checkPort, wait)
    checkPort();

    return promise;
}