util.js

// vim: ts=4:sw=4:expandtab

/**
 * @module
 */
const readline = require('readline');

function unencodeAddr(addr) {
    const tuple = addr.split(".");
    if (tuple.length > 2) {
        throw new TypeError("Invalid address format");
    }
    if (tuple[1]) {
        tuple[1] = parseInt(tuple[1]);
    }
    return tuple;
}


const _maxTimeout = 0x7fffffff;  // `setTimeout` max valid value.
/**
 * Sleep for N seconds.
 *
 * @param {number} seconds
 */
async function sleep(seconds) {
    let ms = seconds * 1000;
    while (ms > _maxTimeout) {
        // Support sleeping longer than the javascript max setTimeout...
        await new Promise(resolve => setTimeout(resolve, _maxTimeout));
        ms -= _maxTimeout;
    }
    return await new Promise(resolve => setTimeout(resolve, ms, seconds));
}


/**
 * Never resolve
 */
async function never() {
    return await new Promise(() => null);
}


/**
 * Interactive prompt for string input on the console/tty.
 * @param {string} prompt - Message to display to user as prompt.
 * @returns {string} User inputted text.
 */
async function consoleInput(prompt) {
    /* This simplifies authentication for a lot of use cases. */
    const rl = readline.createInterface(process.stdin, process.stdout);
    try { 
         return await new Promise(resolve => rl.question(prompt, resolve));
    } finally {
        rl.close();
    }   
}   


module.exports = {
    unencodeAddr,
    sleep,
    never,
    consoleInput
};