UNPKG

simple-fs-rotator

Version:
228 lines (227 loc) 9.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs"); const enums_1 = require("./enums"); const helper_1 = require("./helper"); // import { format } from 'date-fns' class Rotator { constructor(settings, lastEntry) { var _a; this.currentSize = 0; this.lastDate = ""; this.fileIndx = 0; this.settings = settings; switch (this.settings.frequency) { case enums_1.Frequency.hours: if (!(this.settings.amount && this.settings.amount < 13)) { this.settings.amount = 12; } else if (!(this.settings.amount && this.settings.amount > 0)) { this.settings.amount = 1; } if (!this.isFormatValidForHour()) { helper_1.Logger.log("Date format not suitable for X hours rotation. Changing date format to 'YMDHm'"); this.settings.format = "YMDHm"; } break; case enums_1.Frequency.minutes: if (!(this.settings.amount && this.settings.amount < 31)) { this.settings.amount = 30; } else if (!(this.settings.amount && this.settings.amount > 0)) { this.settings.amount = 1; } if (!this.isFormatValidForMinutes()) { this.settings.format = "YMDHm"; helper_1.Logger.log("Date format not suitable for X minutes rotation. Changing date format to 'YMDHm'"); } break; case enums_1.Frequency.daily: if (!this.isFormatValidForDaily()) { this.settings.format = "YMD"; helper_1.Logger.log("Date format not suitable for daily rotation. Changing date format to 'YMD'"); } break; } if (this.settings.frequency !== enums_1.Frequency.none && !this.settings.filename.match("%DATE%")) { this.settings.filename += ".%DATE%"; helper_1.Logger.log(`Appending date to the end of the filename`); } this.lastDate = this.getDateString(); if (this.settings.maxSize && lastEntry) { let date = new Date(lastEntry.date); let extension = (_a = this.settings.extension) !== null && _a !== void 0 ? _a : ""; helper_1.Logger.debug(this.getDateString(date) == this.getDateString(new Date()), this.getDateString(date), this.getDateString(new Date())); if (this.getDateString(date) == this.getDateString(new Date())) { let indx = lastEntry.name.match(RegExp("(\\d+)" + extension.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); if (indx) { this.fileIndx = Number(indx[1]); } var fileSize = this.getSizeForFile(this.getNewFilename()); if (fileSize) { this.currentSize = fileSize; } this.lastDate = this.getDateString(date); helper_1.Logger.debug("LOADED LAST ENTRY", this.currentSize, this.lastDate, this.fileIndx); } else { var fileSize = this.getSizeForFile(this.getNewFilename()); if (fileSize) { this.currentSize = fileSize; } helper_1.Logger.debug("CURRENT FILE:", this.getNewFilename(), this.currentSize); } } } getSizeForFile(file) { try { if (fs.existsSync(file)) { var fileStats = fs.statSync(this.getNewFilename()); if (fileStats) { return fileStats.size; } } } catch (error) { return undefined; } return undefined; } hasMaxSizeReached() { return this.settings.maxSize ? this.currentSize > this.settings.maxSize : false; } hasMaxFilesReached() { var _a; return ((_a = this.settings.keepSettings) === null || _a === void 0 ? void 0 : _a.amount) != null && this.fileIndx >= this.settings.keepSettings.amount; } shouldRotate() { let rotateBySize = this.hasMaxSizeReached(); switch (this.settings.frequency) { case enums_1.Frequency.none: return rotateBySize; case enums_1.Frequency.hours: case enums_1.Frequency.minutes: case enums_1.Frequency.date: case enums_1.Frequency.daily: default: let newDate = this.getDateString(); if (this.lastDate != newDate) { return true; } else { return rotateBySize; } } } isFormatValidForDaily() { let date1 = new Date(2022, 2, 20, 1, 2, 3); let date2 = new Date(2022, 2, 20, 23, 55, 45); let date3 = new Date(2022, 2, 21, 2, 55, 45); return this.getDateString(date1) === this.getDateString(date2) && this.getDateString(date1) !== this.getDateString(date3); } isFormatValidForHour() { if (!this.settings.amount || this.settings.frequency != enums_1.Frequency.hours) { return false; } let date1 = new Date(2022, 2, 20, 1, 2, 3); let date2 = new Date(2022, 2, 20, 2 + this.settings.amount, 55, 45); return this.getDateString(date1) !== this.getDateString(date2); } isFormatValidForMinutes() { if (!this.settings.amount || this.settings.frequency != enums_1.Frequency.minutes) { return false; } let date1 = new Date(2022, 2, 20, 1, 2, 3); let date2 = new Date(2022, 2, 20, 1, 2 + this.settings.amount, 45); return this.getDateString(date1) !== this.getDateString(date2); } getDateString(date) { let _date = date || new Date(); let components = Rotator.getDateComponents(_date, this.settings.utc); let format = this.settings.format; if (format) { switch (this.settings.frequency) { case enums_1.Frequency.hours: if (this.settings.amount) { var hour = Math.floor(components.hour / this.settings.amount) * this.settings.amount; components.hour = hour; components.minute = 0; components.second = 0; } case enums_1.Frequency.minutes: if (this.settings.amount) { var minute = Math.floor(components.minute / this.settings.amount) * this.settings.amount; components.minute = minute; components.second = 0; } } return format === null || format === void 0 ? void 0 : format.replace(/D+/, components.day.toString().padStart(2, "0")).replace(/M+/, components.month.toString().padStart(2, "0")).replace(/Y+/, components.year.toString()).replace(/H+/, components.hour.toString().padStart(2, "0")).replace(/m+/, components.minute.toString().padStart(2, "0")).replace(/s+/, components.second.toString().padStart(2, "0")).replace(/A+/, components.hour > 11 ? "PM" : "AM"); } return ""; } getFilename(name, extension) { // console.log(name.replace("%DATE%",this.lastDate) + (this.settings.maxSize ? "." + this.fileIndx : "") + (extension ? extension : "")) return name.replace("%DATE%", this.lastDate) + (this.settings.maxSize || this.fileIndx > 0 ? "." + this.fileIndx : "") + (extension ? extension : ""); } getNewFilename() { return this.getFilename(this.settings.filename, this.settings.extension); } addBytes(bytes) { this.currentSize += bytes; } rotate(force = false) { if (force) { this.fileIndx += 1; } else if (this.shouldRotate()) { if (this.hasMaxSizeReached()) { this.fileIndx += 1; } else { this.fileIndx = 0; } } else { return; } if (this.hasMaxFilesReached()) { this.fileIndx = 0; } this.currentSize = 0; this.lastDate = this.getDateString(); return; } static getDateComponents(date, utc) { if (utc) { return { day: date.getUTCDate(), month: date.getUTCMonth() + 1, year: date.getUTCFullYear(), hour: date.getUTCHours(), minute: date.getUTCMinutes(), second: date.getUTCSeconds(), utc: utc, source: date }; } else { return { day: date.getDate(), month: date.getMonth() + 1, year: date.getFullYear(), hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds(), utc: utc, source: date }; } } static createDate(components, utc) { if (utc) { new Date(Date.UTC(components.year, components.month, components.day, components.hour, components.minute, components.second)); } return new Date(components.year, components.month, components.day, components.hour, components.minute, components.second); } } exports.default = Rotator;