var fs = require('fs'); var moment = require('moment'); var helper = require('../lib/helper'); var _ = require('lodash'); /* * parameters: * dirname: string * rotation: interger (ms) * maxsize: interger (byte) */ function alarm(dirname, opts) { opts = opts || {}; this.dirname = dirname; this.rotation = opts.rotation || 15 * 60 * 1000; this.maxsize = opts.maxsize || 20000; this.external = opts.external || []; this.currentsize = 0; this.timestamp = 0; this.foldername = 'alarm/'; helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`); }; /* * parameters: * data: any */ alarm.prototype.appendAlarm = function(data) { data = this.formatData(data); this.currentsize = this.currentsize + helper.getLengthOfContent(data); this.request(data); fs.appendFile(this.getDir(), data, function(err) {}); }; /* * parameters: * none */ alarm.prototype.getDir = function() { var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation); this.resetCurrentSize(time.unix()); time = time.format('YYYY-MM-DDTHH-mm-ss'); var count = this.getCount(); return `${this.dirname}${this.foldername}${time}_${count}.txt`; }; /* * parameters: * time_unix: string */ alarm.prototype.resetCurrentSize = function(time_unix) { if(time_unix > this.timestamp) { this.currentsize = 0 this.timestamp = time_unix; } }; /* * parameters: * none */ alarm.prototype.getCount = function() { var count = Math.floor((this.currentsize / this.maxsize) + 1); return ((count * 1e-5).toFixed(5)).split('.')[1]; }; /* * parameters: * data: any */ alarm.prototype.formatData = function(data) { var date = moment().toISOString().trim(); var timestamp = moment().unix(); data = this._formatObject(data).trim(); return `${date} ${timestamp} ${data}\r\n`; }; /* * parameters: * data: any */ alarm.prototype._formatObject = function(data) { if(_.isObject(data)) { return JSON.stringify(data); } if(_.isNumber(data)) { return toString(data); } return data; }; /* * parameters: * data: any */ alarm.prototype.request = function(data) { _.forEach(this.external, function(external) { external.fn.apply(this, [data].concat(external.args)); }); }; module.exports = alarm;