beaver-logger
Version:
Client side logger.
143 lines (140 loc) • 4.42 kB
JavaScript
;
exports.__esModule = true;
exports.defaultLogger = void 0;
exports.expressEndpoint = expressEndpoint;
exports.handleRequest = handleRequest;
exports.log = log;
var _url = _interopRequireDefault(require("url"));
var _constants = require("./constants");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint no-console: 0 */
// eslint-disable-line no-undef
// eslint-disable-line no-undef
const defaultLogger = exports.defaultLogger = {
log(req, level, name, payload) {
const date = payload.timestamp ? new Date(payload.timestamp).toString() : new Date().toString();
const str = [name, '\t[ ', date, ' ]\n', Object.keys(payload).map(key => {
return `\t${key}: ${payload[key]}`;
}).join('\n'), '\n'].join('');
console[level](str);
},
track(req, tracking) {
console.log('[track]\n', Object.keys(tracking).map(key => {
return `\t${key}: ${tracking[key]}`;
}).join('\n'), '\n');
},
meta(req, meta) {
console.log('[meta]\n', Object.keys(meta).map(key => {
return `\t${key}: ${meta[key]}`;
}).join('\n'), '\n');
}
};
function log(req, logger, logs) {
const events = logs.events || [];
const tracking = logs.tracking || [];
const meta = logs.meta || {};
if (logger.meta) {
logger.meta(req, meta);
}
if (logger.log) {
events.forEach(event => {
if (!event.event || typeof event.event !== 'string') {
return;
}
const name = event.event.replace(/_*[^a-zA-Z0-9_]+_*/g, '_');
const level = event.level || _constants.LOG_LEVEL.INFO;
const payload = event.payload || {};
return logger.log(req, level, name, payload, meta);
});
}
if (logger.track) {
tracking.forEach(track => {
logger.track(req, track, meta);
});
}
}
function handleRequest(req, logger) {
// $FlowFixMe
const method = req.method || _constants.HTTP_METHOD.GET;
// $FlowFixMe
const query = req.query;
// $FlowFixMe
const body = req.body || {};
if (method.toLowerCase() === 'post') {
const {
events,
tracking,
meta
} = body;
log(req, logger, {
events,
tracking,
meta
});
} else {
const {
event,
level = _constants.LOG_LEVEL.INFO,
...payload
} = query;
log(req, logger, {
events: [{
level,
event,
payload
}]
});
}
}
function sendCorsHeaders(req, res) {
const origin = req.get(_constants.HTTP_HEADER.ORIGIN);
if (origin) {
const parsedUrl = _url.default.parse(origin) || {};
if (!parsedUrl.protocol || !parsedUrl.host) {
res.header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_ORIGIN, _constants.WILDCARD);
} else {
res.header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_ORIGIN, `${parsedUrl.protocol}//${parsedUrl.host}`);
}
} else {
res.header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_ORIGIN, _constants.WILDCARD);
}
const corsRequestHeaders = req.headers[_constants.HTTP_HEADER.ACCESS_CONTROL_REQUEST_HEADERS];
if (corsRequestHeaders) {
res.header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_HEADERS, corsRequestHeaders);
}
const corsRequestMethod = req.headers[_constants.HTTP_HEADER.ACCESS_CONTROL_REQUEST_METHOD];
if (corsRequestMethod) {
res.header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_METHODS, corsRequestMethod);
}
res.header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_CREDENTIALS, 'true');
}
function expressEndpoint({
uri = '/',
logger = defaultLogger,
enableCors = false
} = {}) {
// $FlowFixMe
const app = require('express')();
app.on('mount', parent => {
// $FlowFixMe
app.settings = Object.create(parent.settings);
// $FlowFixMe
app.kraken = parent.kraken || parent.config;
});
app.all(uri, (req, res) => {
if (enableCors) {
sendCorsHeaders(req, res);
}
if (req.method.toLowerCase() === _constants.HTTP_METHOD.OPTIONS) {
return res.status(200).header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_CREDENTIALS, 'true').send();
}
try {
handleRequest(req, logger);
res.status(200).header(_constants.HTTP_HEADER.ACCESS_CONTROL_ALLOW_CREDENTIALS, 'true').json({});
} catch (err) {
console.error(err.stack || err.toString());
res.status(500).header(_constants.HTTP_HEADER.CONTENT_TYPE, 'application/json').json({});
}
});
return app;
}