All files / src observe.js

87.23% Statements 41/47
75% Branches 15/20
100% Functions 6/6
90.69% Lines 39/43

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 82 83 84 85 86 87 8833x 33x   33x 33x     4x 4x 4x 4x     4x 10x   4x 10x   4x       4x 4x       4x 2x   4x 4x         4x 18x 18x 18x 18x   18x 3x             18x 18x   18x 4x   4x   18x                 4x       3x 3x 3x 3x 3x           33x          
const fs = require('fs'),
    Malta = require('./malta');
 
module.exports = (function () {
    const elements = {};
 
    function arrDiff (a, b) {
        const bAdded = [],
            bRemoved = [],
            astr = a.join(':::'),
            bstr = b.join(':::');
        let i, l;
 
        for (i = 0, l = a.length; i < l; i++) {
            if (bstr.indexOf(a[i]) < 0) bRemoved.push(a[i]);
        }
        for (i = 0, l = b.length; i < l; i++) {
            if (astr.indexOf(b[i]) < 0) bAdded.push(b[i]);
        }
        return { added: bAdded, removed: bRemoved };
    }
 
    function observe (folder, cb, extension) {
        const actual = {};
        let previous = false;
 
        // if (folder in elements) return false;
 
        if (!(folder in elements)) {
            elements[folder] = {};
        }
        Eif (!(extension in elements[folder])) {
            elements[folder][extension] = {};
        } else {
            return false;
        }
 
        elements[folder][extension] = setInterval(() => {
            try {
                fs.readdir(folder, function (err, files) {
                    Iif (err) throw err;
                    Iif (!files) return;
 
                    if (!previous) {
                        previous = {
                            files: files,
                            n: files.length,
                            time: new Date()
                        };
                    }
 
                    actual.files = files;
                    actual.n = files.length;
 
                    if (previous.files.length !== actual.files.length) {
                        actual.time = new Date();
 
                        cb(arrDiff(previous.files, actual.files), extension);
                    }
                    previous.files = actual.files;
                });
            } catch (err) {
                // eslint-disable-next-line no-console
                Malta.log_debug(err);
                process.exit();
            }
        }, 100);
 
        return true;
    }
 
    function unobserve (folder, extension) {
        Eif (folder in elements) {
            Eif (extension in elements[folder]) {
                clearInterval(elements[folder][extension]);
                delete elements[folder][extension];
                return true;
            }
        }
        return false;
    }
 
    return {
        observe,
        unobserve
    };
})();