Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
QuiteAFancyEmerald
GitHub Repository: QuiteAFancyEmerald/Holy-Unblocker
Path: blob/master/lib/rammerhead/src/classes/RammerheadLogging.js
5253 views
1
/**
2
* @typedef {'disabled'|'debug'|'traffic'|'info'|'warn'|'error'} LoggingLevels
3
*/
4
5
const LOG_LEVELS = ['disabled', 'debug', 'traffic', 'info', 'warn', 'error'];
6
7
function defaultGeneratePrefix(level) {
8
return `[${new Date().toISOString()}] [${level.toUpperCase()}] `;
9
}
10
11
class RammerheadLogging {
12
/**
13
* @param {object} options
14
* @param {LoggingLevels} options.logLevel - logLevel to initialize the logger with
15
* @param {(data: string) => void} options.logger - expects the logger to automatically add a newline, just like what console.log does
16
* @param {*} options.loggerThis - logger will be called with loggerThis binded
17
* @param {(level: LoggingLevels) => string} options.generatePrefix - generates a prefix before every log. set to null to disable
18
*/
19
constructor({
20
logLevel = 'info',
21
logger = console.log,
22
loggerThis = console,
23
generatePrefix = defaultGeneratePrefix
24
} = {}) {
25
this.logger = logger;
26
this.loggerThis = loggerThis;
27
this.generatePrefix = generatePrefix;
28
29
/**
30
* @private
31
*/
32
this._logRank = this._getLogRank(logLevel);
33
}
34
35
get logLevel() {
36
return LOG_LEVELS[this._logRank];
37
}
38
/**
39
* logger() will be called based on this log level
40
* @param {LoggingLevels} level
41
*/
42
set logLevel(level) {
43
this._logRank = this._getLogRank(level);
44
}
45
callLogger(data) {
46
this.logger.call(this.loggerThis, data);
47
}
48
/**
49
* @param {LoggingLevels} level
50
* @param {string} data
51
*/
52
log(level, data) {
53
const rank = this._getLogRank(level);
54
// the higher the log level, the more important it is.
55
// ensure it's not disabled
56
if (rank && this._logRank <= rank) {
57
this.callLogger((this.generatePrefix ? this.generatePrefix(level) : '') + data);
58
}
59
}
60
debug = (data) => this.log('debug', data);
61
traffic = (data) => this.log('traffic', data);
62
info = (data) => this.log('info', data);
63
warn = (data) => this.log('warn', data);
64
error = (data) => this.log('error', data);
65
66
/**
67
* @private
68
* @param {LoggingLevels} level
69
* @returns {number}
70
*/
71
_getLogRank(level) {
72
const index = LOG_LEVELS.indexOf(level);
73
if (index === -1) {
74
throw new TypeError(`Invalid log level '${level}'. Valid log levels: ${LOG_LEVELS.join(', ')}`);
75
}
76
return index;
77
}
78
}
79
80
module.exports = RammerheadLogging;
81
82