polylog/index.js

105 lines
2.2 KiB
JavaScript

var fs = require('fs');
var util = require('util');
var streams = [];
var labels = {};
var chain;
function _log(arg1, arg2) {
var label = '';
var msg = '';
if (typeof arg2 === 'undefined') {
if (arg1 instanceof Arguments) {
for (var arg in arg1) {
msg += util.format(arg1[arg]);
}
} else {
msg = util.format(arg1);
}
} else {
label = arg1;
if (arg2 instanceof Arguments) {
for (var arg in arg2) {
msg += util.format(arg2[arg]);
}
} else {
msg = util.format(arg2);
}
}
// build our output customization string
var str = '';
if (typeof labels[label] !== 'undefined') {
for (var j = labels[label].length-1; j >= 0; j--) {
str = labels[label][j](str);
if (j == 0) str += ' ';
}
}
// write our string to our streams
for (var i = 0; i < streams.length; i++) {
streams[i].write(str+msg+'\n');
}
return module.exports;
}
function init(file) {
if (typeof file !== 'undefined') {
var writable = fs.createWriteStream(file);
streams.push(writable);
}
if (process.stdin.isTTY) {
streams.push(process.stdin);
}
return module.exports;
}
module.exports.init = init;
function setup() {
var cur, last;
chain = cur = last = streams[0];
for (var i = 0; i < streams.length; i++) {
cur = streams[i];
if (last != cur) {
last.pipe(cur);
}
last = cur;
}
return module.exports;
}
module.exports.setup = setup;
function _new(label, options) {
labels[label] = [];
if (typeof options !== 'undefined') {
if (options.logLabel == true) {
labels[label].push(function(str) { return label+str });
}
if (options.logTime == true) {
labels[label].push(doTime);
}
}
streams[label] = [];
return get(label);
}
module.exports.new = _new;
function get(label) {
return function() { _log(label, toArguments(arguments)) };
}
module.exports.get = get;
module.exports.log = _new('');
function doTime(str) {
var new_str = '('+new Date().toISOString() + '):' + str;
return new_str;
}
function Arguments() {};
function toArguments(obj) {
var args = new Arguments();
for (var attr in obj) {
args[attr] = obj[attr];
}
return args;
}