Move log and i18n to their own utils module

This commit is contained in:
Nick O'Leary
2018-04-19 11:23:08 +01:00
parent 7409cb3abb
commit 1cdb039ea2
24 changed files with 101 additions and 72 deletions

View File

@@ -1,130 +0,0 @@
/**
* Copyright JS Foundation and other contributors, http://js.foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var i18n = require("i18next");
var when = require("when");
var path = require("path");
var fs = require("fs");
var defaultLang = "en-US";
var resourceMap = {};
var resourceCache = {};
function registerMessageCatalogs(catalogs) {
var promises = catalogs.map(function(catalog) {
return registerMessageCatalog(catalog.namespace,catalog.dir,catalog.file);
});
return when.settle(promises);
}
function registerMessageCatalog(namespace,dir,file) {
return when.promise(function(resolve,reject) {
resourceMap[namespace] = { basedir:dir, file:file};
i18n.loadNamespace(namespace,function() {
resolve();
});
});
}
function mergeCatalog(fallback,catalog) {
for (var k in fallback) {
if (fallback.hasOwnProperty(k)) {
if (!catalog[k]) {
catalog[k] = fallback[k];
} else if (typeof fallback[k] === 'object') {
mergeCatalog(fallback[k],catalog[k]);
}
}
}
}
var MessageFileLoader = {
fetchOne: function(lng, ns, callback) {
if (resourceMap[ns]) {
var file = path.join(resourceMap[ns].basedir,lng,resourceMap[ns].file);
//console.log(file);
fs.readFile(file,"utf8",function(err,content) {
if (err) {
callback(err);
} else {
try {
resourceCache[ns] = resourceCache[ns]||{};
resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, ''));
//console.log(resourceCache[ns][lng]);
if (lng !== defaultLang) {
mergeCatalog(resourceCache[ns][defaultLang],resourceCache[ns][lng]);
}
callback(null, resourceCache[ns][lng]);
} catch(e) {
callback(e);
}
}
});
} else {
callback(new Error("Unrecognised namespace"));
}
}
}
function init() {
return when.promise(function(resolve,reject) {
i18n.backend(MessageFileLoader);
i18n.init({
ns: {
namespaces: [],
defaultNs: "runtime"
},
fallbackLng: [defaultLang]
},function() {
resolve();
});
});
}
function getCatalog(namespace,lang) {
var result = null;
lang = lang || defaultLang;
if (resourceCache.hasOwnProperty(namespace)) {
result = resourceCache[namespace][lang];
if (!result) {
var langParts = lang.split("-");
if (langParts.length == 2) {
result = resourceCache[namespace][langParts[0]];
}
}
}
return result;
}
var obj = module.exports = {
init: init,
registerMessageCatalog: registerMessageCatalog,
registerMessageCatalogs: registerMessageCatalogs,
catalog: getCatalog,
i: i18n,
defaultLang: defaultLang
}
obj['_'] = function() {
//var opts = {};
//if (def) {
// opts.defaultValue = def;
//}
//console.log(arguments);
return i18n.t.apply(null,arguments);
}

View File

@@ -19,8 +19,6 @@ var when = require('when');
var redNodes = require("./nodes");
var storage = require("./storage");
var library = require("./library");
var log = require("./log");
var i18n = require("./i18n");
var events = require("./events");
var settings = require("./settings");
@@ -29,6 +27,10 @@ var path = require('path');
var fs = require("fs");
var os = require("os");
var redUtil;
var log;
var i18n;
var runtimeMetricInterval = null;
var started = false;
@@ -55,9 +57,12 @@ var adminApi = {
var nodeApp;
function init(userSettings,_adminApi) {
function init(userSettings,_redUtil,_adminApi) {
redUtil = _redUtil;
log = redUtil.log;
i18n = redUtil.i18n;
userSettings.version = getVersion();
log.init(userSettings);
settings.init(userSettings);
nodeApp = express();
@@ -86,10 +91,7 @@ function getVersion() {
}
function start() {
return i18n.init()
.then(function() {
return i18n.registerMessageCatalog("runtime",path.resolve(path.join(__dirname,"locales")),"runtime.json")
})
return i18n.registerMessageCatalog("runtime",path.resolve(path.join(__dirname,"locales")),"runtime.json")
.then(function() { return storage.init(runtime)})
.then(function() { return settings.load(storage)})
.then(function() {
@@ -241,8 +243,8 @@ var runtime = module.exports = {
version: getVersion,
log: log,
i18n: i18n,
get log() { return log },
get i18n() { return i18n },
settings: settings,
storage: storage,
events: events,

View File

@@ -1,166 +0,0 @@
/**
* Copyright JS Foundation and other contributors, http://js.foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var util = require("util");
var EventEmitter = require("events").EventEmitter;
var i18n = require("./i18n");
var levels = {
off: 1,
fatal: 10,
error: 20,
warn: 30,
info: 40,
debug: 50,
trace: 60,
audit: 98,
metric: 99
};
var levelNames = {
10: "fatal",
20: "error",
30: "warn",
40: "info",
50: "debug",
60: "trace",
98: "audit",
99: "metric"
};
var logHandlers = [];
var verbose;
var metricsEnabled = false;
var LogHandler = function(settings) {
this.logLevel = settings ? levels[settings.level]||levels.info : levels.info;
this.metricsOn = settings ? settings.metrics||false : false;
this.auditOn = settings ? settings.audit||false : false;
metricsEnabled = metricsEnabled || this.metricsOn;
this.handler = (settings && settings.handler) ? settings.handler(settings) : consoleLogger;
this.on("log",function(msg) {
if (this.shouldReportMessage(msg.level)) {
this.handler(msg);
}
});
}
util.inherits(LogHandler, EventEmitter);
LogHandler.prototype.shouldReportMessage = function(msglevel) {
return (msglevel == log.METRIC && this.metricsOn) ||
(msglevel == log.AUDIT && this.auditOn) ||
msglevel <= this.logLevel;
}
var consoleLogger = function(msg) {
if (msg.level == log.METRIC || msg.level == log.AUDIT) {
util.log("["+levelNames[msg.level]+"] "+JSON.stringify(msg));
} else {
if (verbose && msg.msg && msg.msg.stack) {
util.log("["+levelNames[msg.level]+"] "+(msg.type?"["+msg.type+":"+(msg.name||msg.id)+"] ":"")+msg.msg.stack);
} else {
var message = msg.msg;
if (typeof message === 'object' && message !== null && message.toString() === '[object Object]' && message.message) {
message = message.message;
}
util.log("["+levelNames[msg.level]+"] "+(msg.type?"["+msg.type+":"+(msg.name||msg.id)+"] ":"")+message);
}
}
}
var log = module.exports = {
FATAL: 10,
ERROR: 20,
WARN: 30,
INFO: 40,
DEBUG: 50,
TRACE: 60,
AUDIT: 98,
METRIC: 99,
init: function(settings) {
metricsEnabled = false;
logHandlers = [];
var loggerSettings = {};
verbose = settings.verbose;
if (settings.logging) {
var keys = Object.keys(settings.logging);
if (keys.length === 0) {
log.addHandler(new LogHandler());
} else {
for (var i=0, l=keys.length; i<l; i++) {
var config = settings.logging[keys[i]];
loggerSettings = config || {};
if ((keys[i] === "console") || config.handler) {
log.addHandler(new LogHandler(loggerSettings));
}
}
}
} else {
log.addHandler(new LogHandler());
}
},
addHandler: function(func) {
logHandlers.push(func);
},
removeHandler: function(func) {
var index = logHandlers.indexOf(func);
if (index > -1) {
logHandlers.splice(index,1);
}
},
log: function(msg) {
msg.timestamp = Date.now();
logHandlers.forEach(function(handler) {
handler.emit("log",msg);
});
},
info: function(msg) {
log.log({level:log.INFO,msg:msg});
},
warn: function(msg) {
log.log({level:log.WARN,msg:msg});
},
error: function(msg) {
log.log({level:log.ERROR,msg:msg});
},
trace: function(msg) {
log.log({level:log.TRACE,msg:msg});
},
debug: function(msg) {
log.log({level:log.DEBUG,msg:msg});
},
metric: function() {
return metricsEnabled;
},
audit: function(msg,req) {
msg.level = log.AUDIT;
if (req) {
msg.user = req.user;
msg.path = req.path;
msg.ip = (req.headers && req.headers['x-forwarded-for']) || (req.connection && req.connection.remoteAddress) || undefined;
}
log.log(msg);
}
}
log["_"] = i18n._;

View File

@@ -19,7 +19,7 @@ var EventEmitter = require("events").EventEmitter;
var when = require("when");
var redUtil = require("../util");
var Log = require("../log");
var Log = require("../../util").log; // TODO: separate module
var context = require("./context");
var flows = require("./flows");

View File

@@ -18,7 +18,8 @@ var when = require("when");
var crypto = require('crypto');
var runtime;
var settings;
var log;
var log = require("../../util").log; // TODO: separate module
var encryptedCredentials = null;
var credentialCache = {};

View File

@@ -17,7 +17,7 @@
var when = require("when");
var clone = require("clone");
var typeRegistry = require("../registry");
var Log = require("../../log");
var Log = require("../../../util").log; // TODO: separate module
var redUtil = require("../../util");
var flowUtil = require("./util");

View File

@@ -24,7 +24,7 @@ var context = require("../context")
var credentials = require("../credentials");
var flowUtil = require("./util");
var log = require("../../log");
var log = require("../../../util").log; // TODO: separate module
var events = require("../../events");
var redUtil = require("../../util");
var deprecated = require("../registry/deprecated");

View File

@@ -25,7 +25,7 @@ var flows = require("./flows");
var flowUtil = require("./flows/util")
var context = require("./context");
var Node = require("./Node");
var log = null;
var log = require("../../util").log; // TODO: separate module
var library = require("./library");
var events = require("../events");
@@ -94,7 +94,6 @@ function createNode(node,def) {
function init(runtime) {
settings = runtime.settings;
log = runtime.log;
credentials.init(runtime);
flows.init(runtime);
registry.init(runtime);

View File

@@ -20,7 +20,7 @@ var path = require("path");
var fs = require("fs");
var registry = require("./registry");
var log = require("../../log");
var log = require("../../../util").log; // TODO: separate module
var events = require("../../events");

View File

@@ -19,8 +19,8 @@ var fs = require("fs");
var path = require("path");
var events;
var log;
var i18n;
var log = require("../../../util").log; // TODO: separate module
var i18n = require("../../../util").i18n; // TODO: separate module
var settings;
var disableNodePathScan = false;
@@ -29,8 +29,6 @@ var iconFileExtensions = [".png", ".gif"];
function init(runtime) {
settings = runtime.settings;
events = runtime.events;
log = runtime.log;
i18n = runtime.i18n;
}
function isIncluded(name) {

View File

@@ -17,7 +17,7 @@
var when = require("when");
var clone = require("clone");
var assert = require("assert");
var log = require("./log");
var log = require("../util").log; // TODO: separate module
var util = require("./util");
// localSettings are those provided in the runtime settings.js file

View File

@@ -18,7 +18,7 @@ var when = require('when');
var Path = require('path');
var crypto = require('crypto');
var log = require("../log");
var log = require("../../util").log; // TODO: separate module
var runtime;
var storageModule;

View File

@@ -18,7 +18,8 @@ var fs = require('fs-extra');
var when = require('when');
var fspath = require("path");
var log = require("../../log");
var log = require("../../../util").log; // TODO: separate module
var util = require("./util");
var library = require("./library");
var sessions = require("./sessions");

View File

@@ -18,7 +18,8 @@ var when = require('when');
var fs = require('fs-extra');
var fspath = require("path");
var log = require("../../log");
var log = require("../../../util").log; // TODO: separate module
var util = require("./util");
var sessionsFile;

View File

@@ -18,7 +18,7 @@ var when = require('when');
var fs = require('fs-extra');
var fspath = require("path");
var log = require("../../log");
var log = require("../../../util").log; // TODO: separate module
var util = require("./util");
var globalSettingsFile;

View File

@@ -18,7 +18,7 @@ var fs = require('fs-extra');
var when = require('when');
var nodeFn = require('when/node/function');
var log = require("../../log");
var log = require("../../../util").log; // TODO: separate module
function parseJSON(data) {
if (data.charCodeAt(0) === 0xFEFF) {