dnssd
Version:
Bonjour/Avahi-like service discovery in pure JavaScript
117 lines (88 loc) • 3.09 kB
JavaScript
;
var misc = require('./misc');
var enabledNamespaces = [];
var disabledNamespaces = [];
var enabledVerbose = [];
var disabledVerbose = [];
var colors = ['blue', 'green', 'magenta', 'yellow', 'cyan', 'red'];
var colorsIndex = 0;
var noop = function noop() {};
noop.verbose = noop;
noop.v = noop;
noop.isEnabled = false;
noop.verbose.isEnabled = false;
noop.v.isEnabled = false;
var logger = console.log;
// initialize
if (process.env.DEBUG) {
process.env.DEBUG.replace(/\*/g, '.*?').split(',').filter(function (s) {
return !!s;
}).forEach(function (namespace) {
namespace.substr(0, 1) === '-' ? disabledNamespaces.push(namespace.substr(1)) : enabledNamespaces.push(namespace);
});
}
if (process.env.VERBOSE) {
process.env.VERBOSE.replace(/\*/g, '.*?').split(',').filter(function (s) {
return !!s;
}).forEach(function (namespace) {
namespace.substr(0, 1) === '-' ? disabledVerbose.push(namespace.substr(1)) : enabledVerbose.push(namespace);
});
}
function namespaceIsEnabled(name) {
if (!enabledNamespaces.length) return false;
function matches(namespace) {
return name.match(new RegExp('^' + namespace + '$'));
}
if (disabledNamespaces.some(matches)) return false;
if (enabledNamespaces.some(matches)) return true;
return false;
}
function namespaceIsVerbose(name) {
if (!enabledVerbose.length) return false;
function matches(namespace) {
return name.match(new RegExp('^' + namespace + '$'));
}
if (disabledVerbose.some(matches)) return false;
if (enabledVerbose.some(matches)) return true;
return false;
}
function timestamp() {
var now = new Date();
var time = [misc.padStart(now.getHours(), 2, '0'), misc.padStart(now.getMinutes(), 2, '0'), misc.padStart(now.getSeconds(), 2, '0'), misc.padStart(now.getMilliseconds(), 3, '0')];
return '[' + time.join(':') + ']';
}
/**
* Returns debug fn if debug is enabled, noop if not
*
* @param {string} namespace
* @return {function}
*/
module.exports = function debug(namespace) {
if (!namespaceIsEnabled(namespace)) return noop;
// shorten Zeroconf:filename.js -> filename… becuase its driving me crazy
var shortname = namespace.replace('dnssd:', '');
if (shortname.length > 10) shortname = shortname.substr(0, 9) + '…';
if (shortname.length < 10) shortname = misc.pad(shortname, 10);
var color = colors[colorsIndex++ % colors.length];
var prefix = misc.color('•' + shortname, color);
function logFn(msg) {
// '•Query.js [10:41:54:482] '
var output = prefix + ' ' + misc.color(timestamp(), 'grey') + ' ';
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
output += misc.format.apply(misc, [msg].concat(args));
logger(output);
}
logFn.isEnabled = true;
if (namespaceIsVerbose(namespace)) {
logFn.verbose = logFn;
logFn.v = logFn;
logFn.verbose.isEnabled = true;
logFn.v.isEnabled = true;
} else {
logFn.verbose = noop;
logFn.v = noop;
}
return logFn;
};