Callbag example

Date: 2019-02-25
const {
    interval,
    fromPromise,
    fromIter,
    forEach,
    map,
    pipe,
    flatten
} = require("callbag-basics");
const fetch = require('node-fetch');

const limit = (v, min, max) => Math.max(min, Math.min(max, Number(v) || 0));
const mapNumber = (v, inMin, inMax, outMin, outMax) => (limit(v, inMin, inMax) - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;

let getProgressBar = (name, perc, width) => {
    perc = mapNumber(perc, 95, 100, 0, 100); // correctie om meer verschil te zien
    let full = Math.floor((perc / 100) * width);
    return `${name} [${'='.repeat(full)}${' '.repeat(width - full)}]`;
};

let tvs = {};
const updateProgress = () => {
    var pbs = [];
    pbs.push(new Date().toISOString().slice(11, 19));
    Object.keys(tvs).forEach(k => {
        pbs.push(getProgressBar(k, 100 - tvs[k], 50));
    });
    const out = pbs.join(', ') + '\r'; //\n
    process.stdout.write(out);
};

const numberRegex = /(\d+)/gm;
const fields = ['total', 'used', 'free', 'shared', 'buffers', 'cached', 'buffers_used', 'buffers_free', 'swap_total', 'swap_used', 'swap_free'];

const parseInfo = (tv, data) => {
    const res = {};
    const matches = [];
    while (m = numberRegex.exec(data)) {
        matches.push(m[1])
    }
    matches.map(a => Number(a)).slice(0, fields.length).forEach((a, i) => res[fields[i]] = a);
    return {
        tv,
        info: res
    };
};

const showInfo = (tv, memInfo) => {
    if (memInfo && memInfo.total) {
        let total = memInfo.total;
        let free = (memInfo.total - memInfo.used);
        let perc = (free / total) * 100;
        tvs[tv] = perc;
        updateProgress();
    }
};

const getInfo = (tv, url) => {
    return fetch(url)
        .then(r => r.text())
        .then(text => ({
            tv: tv,
            info: text
        }));
}

pipe(
    interval(500),
    map(x => fromIter([34, 35])),
    flatten,
    map(x => fromPromise(getInfo(`${x}`, `http://10.199.108.${x}:9500/api/memoryinfo`))),
    flatten,
    map(x => parseInfo(x.tv, x.info)),
    forEach(x => showInfo(x.tv, x.info))
);
19150cookie-checkCallbag example