@tiledesk/tiledesk-server
Version:
The Tiledesk server module
63 lines (59 loc) • 1.75 kB
JavaScript
/**
* @module helpers
* @fileoverview Helpers for winston-mongodb
* @license MIT
* @author 0@39.yt (Yurij Mikhalevich)
*/
;
const ObjectID = require('mongodb').ObjectID;
/**
* Prepares metadata to store into database.
* @param {*} meta Metadata
* @return {*}
*/
exports.prepareMetaData = meta=>{
return cloneMeta(meta);
};
/**
* Clones meta object and cleans it from circular references, replacing them
* with string '[Circular]' and fixes field names to be storable within
* MongoDB
* @param {Object} node Current object or its leaf
* @param {Array=} opt_parents Object's parents
*/
function cloneMeta(node, opt_parents) {
if (!(node instanceof Object) || (node instanceof ObjectID)
|| (node instanceof Buffer)) {
return node;
}
let copy = Array.isArray(node) ? [] : {};
if (node instanceof Date) {
return new Date(node.getTime());
} else if (node instanceof Error) {
// This is needed because Error's message, name and stack isn't accessible when cycling through properties
copy = {message: node.message, name: node.name, stack: node.stack};
}
opt_parents = opt_parents || [];
opt_parents.push(node);
for (let key in node) {
if (!Object.prototype.hasOwnProperty.call(node, key)) {
continue;
}
let value = node[key];
let newKey = key;
if (newKey.includes('.') || newKey.includes('$')) {
newKey = newKey.replace(/\./g, '[dot]').replace(/\$/g, '[$]');
}
if (value instanceof Object) {
if (opt_parents.indexOf(value) === -1) {
copy[newKey] = cloneMeta(value, opt_parents);
} else {
copy[newKey] = '[Circular]';
}
} else {
copy[newKey] = value;
}
}
opt_parents.pop();
return copy;
}