@ -1,4 +1,5 @@
"use strict" ;
/ * !
// Common Util for frontend and backend
//
// DOT NOT MODIFY util.js!
@ -6,8 +7,10 @@
//
// Backend uses the compiled file util.js
// Frontend uses util.ts
* /
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
exports . localToUTC = exports . utcToLocal = exports . utcToISODateTime = exports . isoToUTCDateTime = exports . parseTimeFromTimeObject = exports . parseTimeObject = exports . getMaintenanceRelativeURL = exports . getMonitorRelativeURL = exports . genSecret = exports . getCryptoRandomInt = exports . getRandomInt = exports . getRandomArbitrary = exports . TimeLogger = exports . polyfill = exports . log = exports . debug = exports . ucfirst = exports . sleep = exports . flipStatus = exports . MIN _INTERVAL _SECOND = exports . MAX _INTERVAL _SECOND = exports . SQL _DATETIME _FORMAT _WITHOUT _SECOND = exports . SQL _DATETIME _FORMAT = exports . SQL _DATE _FORMAT = exports . STATUS _PAGE _MAINTENANCE = exports . STATUS _PAGE _PARTIAL _DOWN = exports . STATUS _PAGE _ALL _UP = exports . STATUS _PAGE _ALL _DOWN = exports . MAINTENANCE = exports . PENDING = exports . UP = exports . DOWN = exports . appName = exports . isDev = void 0 ;
exports . debug = exports . ucfirst = exports . sleep = exports . flipStatus = exports . CONSOLE _STYLE _BgGray = exports . CONSOLE _STYLE _BgWhite = exports . CONSOLE _STYLE _BgCyan = exports . CONSOLE _STYLE _BgMagenta = exports . CONSOLE _STYLE _BgBlue = exports . CONSOLE _STYLE _BgYellow = exports . CONSOLE _STYLE _BgGreen = exports . CONSOLE _STYLE _BgRed = exports . CONSOLE _STYLE _BgBlack = exports . CONSOLE _STYLE _FgPink = exports . CONSOLE _STYLE _FgBrown = exports . CONSOLE _STYLE _FgViolet = exports . CONSOLE _STYLE _FgLightBlue = exports . CONSOLE _STYLE _FgLightGreen = exports . CONSOLE _STYLE _FgOrange = exports . CONSOLE _STYLE _FgGray = exports . CONSOLE _STYLE _FgWhite = exports . CONSOLE _STYLE _FgCyan = exports . CONSOLE _STYLE _FgMagenta = exports . CONSOLE _STYLE _FgBlue = exports . CONSOLE _STYLE _FgYellow = exports . CONSOLE _STYLE _FgGreen = exports . CONSOLE _STYLE _FgRed = exports . CONSOLE _STYLE _FgBlack = exports . CONSOLE _STYLE _Hidden = exports . CONSOLE _STYLE _Reverse = exports . CONSOLE _STYLE _Blink = exports . CONSOLE _STYLE _Underscore = exports . CONSOLE _STYLE _Dim = exports . CONSOLE _STYLE _Bright = exports . CONSOLE _STYLE _Reset = exports . MIN _INTERVAL _SECOND = exports . MAX _INTERVAL _SECOND = exports . SQL _DATETIME _FORMAT _WITHOUT _SECOND = exports . SQL _DATETIME _FORMAT = exports . SQL _DATE _FORMAT = exports . STATUS _PAGE _MAINTENANCE = exports . STATUS _PAGE _PARTIAL _DOWN = exports . STATUS _PAGE _ALL _UP = exports . STATUS _PAGE _ALL _DOWN = exports . MAINTENANCE = exports . PENDING = exports . UP = exports . DOWN = exports . appName = exports . isDev = void 0 ;
exports . intHash = exports . localToUTC = exports . utcToLocal = exports . utcToISODateTime = exports . isoToUTCDateTime = exports . parseTimeFromTimeObject = exports . parseTimeObject = exports . getMaintenanceRelativeURL = exports . getMonitorRelativeURL = exports . genSecret = exports . getCryptoRandomInt = exports . getRandomInt = exports . getRandomArbitrary = exports . TimeLogger = exports . polyfill = exports . log = void 0 ;
const dayjs = require ( "dayjs" ) ;
exports . isDev = process . env . NODE _ENV === "development" ;
exports . appName = "Uptime Kuma" ;
@ -22,9 +25,57 @@ exports.STATUS_PAGE_MAINTENANCE = 3;
exports . SQL _DATE _FORMAT = "YYYY-MM-DD" ;
exports . SQL _DATETIME _FORMAT = "YYYY-MM-DD HH:mm:ss" ;
exports . SQL _DATETIME _FORMAT _WITHOUT _SECOND = "YYYY-MM-DD HH:mm" ;
exports . MAX _INTERVAL _SECOND = 2073600 ; // 24 days
exports . MIN _INTERVAL _SECOND = 20 ; // 20 seconds
/** Flip the status of s */
exports . MAX _INTERVAL _SECOND = 2073600 ;
exports . MIN _INTERVAL _SECOND = 20 ;
exports . CONSOLE _STYLE _Reset = "\x1b[0m" ;
exports . CONSOLE _STYLE _Bright = "\x1b[1m" ;
exports . CONSOLE _STYLE _Dim = "\x1b[2m" ;
exports . CONSOLE _STYLE _Underscore = "\x1b[4m" ;
exports . CONSOLE _STYLE _Blink = "\x1b[5m" ;
exports . CONSOLE _STYLE _Reverse = "\x1b[7m" ;
exports . CONSOLE _STYLE _Hidden = "\x1b[8m" ;
exports . CONSOLE _STYLE _FgBlack = "\x1b[30m" ;
exports . CONSOLE _STYLE _FgRed = "\x1b[31m" ;
exports . CONSOLE _STYLE _FgGreen = "\x1b[32m" ;
exports . CONSOLE _STYLE _FgYellow = "\x1b[33m" ;
exports . CONSOLE _STYLE _FgBlue = "\x1b[34m" ;
exports . CONSOLE _STYLE _FgMagenta = "\x1b[35m" ;
exports . CONSOLE _STYLE _FgCyan = "\x1b[36m" ;
exports . CONSOLE _STYLE _FgWhite = "\x1b[37m" ;
exports . CONSOLE _STYLE _FgGray = "\x1b[90m" ;
exports . CONSOLE _STYLE _FgOrange = "\x1b[38;5;208m" ;
exports . CONSOLE _STYLE _FgLightGreen = "\x1b[38;5;119m" ;
exports . CONSOLE _STYLE _FgLightBlue = "\x1b[38;5;117m" ;
exports . CONSOLE _STYLE _FgViolet = "\x1b[38;5;141m" ;
exports . CONSOLE _STYLE _FgBrown = "\x1b[38;5;130m" ;
exports . CONSOLE _STYLE _FgPink = "\x1b[38;5;219m" ;
exports . CONSOLE _STYLE _BgBlack = "\x1b[40m" ;
exports . CONSOLE _STYLE _BgRed = "\x1b[41m" ;
exports . CONSOLE _STYLE _BgGreen = "\x1b[42m" ;
exports . CONSOLE _STYLE _BgYellow = "\x1b[43m" ;
exports . CONSOLE _STYLE _BgBlue = "\x1b[44m" ;
exports . CONSOLE _STYLE _BgMagenta = "\x1b[45m" ;
exports . CONSOLE _STYLE _BgCyan = "\x1b[46m" ;
exports . CONSOLE _STYLE _BgWhite = "\x1b[47m" ;
exports . CONSOLE _STYLE _BgGray = "\x1b[100m" ;
const consoleModuleColors = [
exports . CONSOLE _STYLE _FgCyan ,
exports . CONSOLE _STYLE _FgGreen ,
exports . CONSOLE _STYLE _FgLightGreen ,
exports . CONSOLE _STYLE _FgBlue ,
exports . CONSOLE _STYLE _FgLightBlue ,
exports . CONSOLE _STYLE _FgMagenta ,
exports . CONSOLE _STYLE _FgOrange ,
exports . CONSOLE _STYLE _FgViolet ,
exports . CONSOLE _STYLE _FgBrown ,
exports . CONSOLE _STYLE _FgPink ,
] ;
const consoleLevelColors = {
"INFO" : exports . CONSOLE _STYLE _FgCyan ,
"WARN" : exports . CONSOLE _STYLE _FgYellow ,
"ERROR" : exports . CONSOLE _STYLE _FgRed ,
"DEBUG" : exports . CONSOLE _STYLE _FgGray ,
} ;
function flipStatus ( s ) {
if ( s === exports . UP ) {
return exports . DOWN ;
@ -35,18 +86,10 @@ function flipStatus(s) {
return s ;
}
exports . flipStatus = flipStatus ;
/ * *
* Delays for specified number of seconds
* @ param ms Number of milliseconds to sleep for
* /
function sleep ( ms ) {
return new Promise ( resolve => setTimeout ( resolve , ms ) ) ;
}
exports . sleep = sleep ;
/ * *
* PHP ' s ucfirst
* @ param str
* /
function ucfirst ( str ) {
if ( ! str ) {
return str ;
@ -55,26 +98,12 @@ function ucfirst(str) {
return firstLetter . toUpperCase ( ) + str . substr ( 1 ) ;
}
exports . ucfirst = ucfirst ;
/ * *
* @ deprecated Use log . debug
* @ since https : //github.com/louislam/uptime-kuma/pull/910
* @ param msg
* /
function debug ( msg ) {
exports . log . log ( "" , msg , "debug" ) ;
}
exports . debug = debug ;
class Logger {
constructor ( ) {
/ * *
* UPTIME _KUMA _HIDE _LOG = debug _monitor , info _monitor
*
* Example :
* [
* "debug_monitor" , // Hide all logs that level is debug and the module is monitor
* "info_monitor" ,
* ]
* /
this . hideLog = {
info : [ ] ,
warn : [ ] ,
@ -82,10 +111,9 @@ class Logger {
debug : [ ] ,
} ;
if ( typeof process !== "undefined" && process . env . UPTIME _KUMA _HIDE _LOG ) {
let list = process . env . UPTIME _KUMA _HIDE _LOG . split ( "," ) . map ( v => v . toLowerCase ( ) ) ;
for ( let pair of list ) {
// split first "_" only
let values = pair . split ( / _ ( . * ) / s ) ;
const list = process . env . UPTIME _KUMA _HIDE _LOG . split ( "," ) . map ( v => v . toLowerCase ( ) ) ;
for ( const pair of list ) {
const values = pair . split ( / _ ( . * ) / s ) ;
if ( values . length >= 2 ) {
this . hideLog [ values [ 0 ] ] . push ( values [ 1 ] ) ;
}
@ -94,12 +122,6 @@ class Logger {
this . debug ( "server" , this . hideLog ) ;
}
}
/ * *
* Write a message to the log
* @ param module The module the log comes from
* @ param msg Message to write
* @ param level Log level . One of INFO , WARN , ERROR , DEBUG or can be customized .
* /
log ( module , msg , level ) {
if ( this . hideLog [ level ] && this . hideLog [ level ] . includes ( module . toLowerCase ( ) ) ) {
return ;
@ -113,63 +135,56 @@ class Logger {
else {
now = dayjs ( ) . format ( ) ;
}
const formattedMessage = ( typeof msg === "string" ) ? ` ${ now } [ ${ module } ] ${ level } : ${ msg } ` : msg ;
const levelColor = consoleLevelColors [ level ] ;
const moduleColor = consoleModuleColors [ intHash ( module , consoleModuleColors . length ) ] ;
let timePart = exports . CONSOLE _STYLE _FgCyan + now + exports . CONSOLE _STYLE _Reset ;
let modulePart = "[" + moduleColor + module + exports . CONSOLE _STYLE _Reset + "]" ;
let levelPart = levelColor + ` ${ level } : ` + exports . CONSOLE _STYLE _Reset ;
if ( level === "INFO" ) {
console . info ( formattedMessage ) ;
console . info ( timePart, modulePart , levelPart , msg ) ;
}
else if ( level === "WARN" ) {
console . warn ( formattedMessage ) ;
console . warn ( timePart, modulePart , levelPart , msg ) ;
}
else if ( level === "ERROR" ) {
console . error ( formattedMessage ) ;
let msgPart ;
if ( typeof msg === "string" ) {
msgPart = exports . CONSOLE _STYLE _FgRed + msg + exports . CONSOLE _STYLE _Reset ;
}
else {
msgPart = msg ;
}
console . error ( timePart , modulePart , levelPart , msgPart ) ;
}
else if ( level === "DEBUG" ) {
if ( exports . isDev ) {
console . log ( formattedMessage ) ;
timePart = exports . CONSOLE _STYLE _FgGray + now + exports . CONSOLE _STYLE _Reset ;
let msgPart ;
if ( typeof msg === "string" ) {
msgPart = exports . CONSOLE _STYLE _FgGray + msg + exports . CONSOLE _STYLE _Reset ;
}
else {
msgPart = msg ;
}
console . debug ( timePart , modulePart , levelPart , msgPart ) ;
}
}
else {
console . log ( formattedMessage ) ;
console . log ( timePart, modulePart , msg ) ;
}
}
/ * *
* Log an INFO message
* @ param module Module log comes from
* @ param msg Message to write
* /
info ( module , msg ) {
this . log ( module , msg , "info" ) ;
}
/ * *
* Log a WARN message
* @ param module Module log comes from
* @ param msg Message to write
* /
warn ( module , msg ) {
this . log ( module , msg , "warn" ) ;
}
/ * *
* Log an ERROR message
* @ param module Module log comes from
* @ param msg Message to write
* /
error ( module , msg ) {
this . log ( module , msg , "error" ) ;
}
/ * *
* Log a DEBUG message
* @ param module Module log comes from
* @ param msg Message to write
* /
debug ( module , msg ) {
this . log ( module , msg , "debug" ) ;
}
/ * *
* Log an exeption as an ERROR
* @ param module Module log comes from
* @ param exception The exeption to include
* @ param msg The message to write
* /
exception ( module , exception , msg ) {
let finalMessage = exception ;
if ( msg ) {
@ -179,20 +194,12 @@ class Logger {
}
}
exports . log = new Logger ( ) ;
/ * *
* String . prototype . replaceAll ( ) polyfill
* https : //gomakethings.com/how-to-replace-a-section-of-a-string-with-another-one-with-vanilla-js/
* @ author Chris Ferdinandi
* @ license MIT
* /
function polyfill ( ) {
if ( ! String . prototype . replaceAll ) {
String . prototype . replaceAll = function ( str , newStr ) {
// If a regex pattern
if ( Object . prototype . toString . call ( str ) . toLowerCase ( ) === "[object regexp]" ) {
return this . replace ( str , newStr ) ;
}
// If a string
return this . replace ( new RegExp ( str , "g" ) , newStr ) ;
} ;
}
@ -202,10 +209,6 @@ class TimeLogger {
constructor ( ) {
this . startTime = dayjs ( ) . valueOf ( ) ;
}
/ * *
* Output time since start of monitor
* @ param name Name of monitor
* /
print ( name ) {
if ( exports . isDev && process . env . TIMELOGGER === "1" ) {
console . log ( name + ": " + ( dayjs ( ) . valueOf ( ) - this . startTime ) + "ms" ) ;
@ -213,66 +216,42 @@ class TimeLogger {
}
}
exports . TimeLogger = TimeLogger ;
/ * *
* Returns a random number between min ( inclusive ) and max ( exclusive )
* /
function getRandomArbitrary ( min , max ) {
return Math . random ( ) * ( max - min ) + min ;
}
exports . getRandomArbitrary = getRandomArbitrary ;
/ * *
* From : https : //stackoverflow.com/questions/1527803/generating-random-whole-numbers-in-javascript-in-a-specific-range
*
* Returns a random integer between min ( inclusive ) and max ( inclusive ) .
* The value is no lower than min ( or the next integer greater than min
* if min isn ' t an integer ) and no greater than max ( or the next integer
* lower than max if max isn ' t an integer ) .
* Using Math . round ( ) will give you a non - uniform distribution !
* /
function getRandomInt ( min , max ) {
min = Math . ceil ( min ) ;
max = Math . floor ( max ) ;
return Math . floor ( Math . random ( ) * ( max - min + 1 ) ) + min ;
}
exports . getRandomInt = getRandomInt ;
/ * *
* Returns either the NodeJS crypto . randomBytes ( ) function or its
* browser equivalent implemented via window . crypto . getRandomValues ( )
* /
let getRandomBytes = ( ( typeof window !== 'undefined' && window . crypto )
// Browsers
const getRandomBytes = ( ( typeof window !== "undefined" && window . crypto )
? function ( ) {
return ( numBytes ) => {
le t randomBytes = new Uint8Array ( numBytes ) ;
const randomBytes = new Uint8Array ( numBytes ) ;
for ( let i = 0 ; i < numBytes ; i += 65536 ) {
window . crypto . getRandomValues ( randomBytes . subarray ( i , i + Math . min ( numBytes - i , 65536 ) ) ) ;
}
return randomBytes ;
} ;
}
// Node
: function ( ) {
return require ( "crypto" ) . randomBytes ;
} ) ( ) ;
/ * *
* Get a random integer suitable for use in cryptography between upper
* and lower bounds .
* @ param min Minimum value of integer
* @ param max Maximum value of integer
* @ returns Cryptographically suitable random integer
* /
function getCryptoRandomInt ( min , max ) {
// synchronous version of: https://github.com/joepie91/node-random-number-csprng
const range = max - min ;
if ( range >= Math . pow ( 2 , 32 ) )
if ( range >= Math . pow ( 2 , 32 ) ) {
console . log ( "Warning! Range is too large." ) ;
}
let tmpRange = range ;
let bitsNeeded = 0 ;
let bytesNeeded = 0 ;
let mask = 1 ;
while ( tmpRange > 0 ) {
if ( bitsNeeded % 8 === 0 )
if ( bitsNeeded % 8 === 0 ) {
bytesNeeded += 1 ;
}
bitsNeeded += 1 ;
mask = mask << 1 | 1 ;
tmpRange = tmpRange >>> 1 ;
@ -291,11 +270,6 @@ function getCryptoRandomInt(min, max) {
}
}
exports . getCryptoRandomInt = getCryptoRandomInt ;
/ * *
* Generate a random alphanumeric string of fixed length
* @ param length Length of string to generate
* @ returns string
* /
function genSecret ( length = 64 ) {
let secret = "" ;
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ;
@ -306,29 +280,14 @@ function genSecret(length = 64) {
return secret ;
}
exports . genSecret = genSecret ;
/ * *
* Get the path of a monitor
* @ param id ID of monitor
* @ returns Formatted relative path
* /
function getMonitorRelativeURL ( id ) {
return "/dashboard/" + id ;
}
exports . getMonitorRelativeURL = getMonitorRelativeURL ;
/ * *
* Get relative path for maintenance
* @ param id ID of maintenance
* @ returns Formatted relative path
* /
function getMaintenanceRelativeURL ( id ) {
return "/maintenance/" + id ;
}
exports . getMaintenanceRelativeURL = getMaintenanceRelativeURL ;
/ * *
* Parse to Time Object that used in VueDatePicker
* @ param { string } time E . g . 12 : 00
* @ returns object
* /
function parseTimeObject ( time ) {
if ( ! time ) {
return {
@ -336,11 +295,11 @@ function parseTimeObject(time) {
minutes : 0 ,
} ;
}
le t array = time . split ( ":" ) ;
cons t array = time . split ( ":" ) ;
if ( array . length < 2 ) {
throw new Error ( "parseVueDatePickerTimeFormat: Invalid Time" ) ;
}
le t obj = {
cons t obj = {
hours : parseInt ( array [ 0 ] ) ,
minutes : parseInt ( array [ 1 ] ) ,
seconds : 0 ,
@ -351,9 +310,6 @@ function parseTimeObject(time) {
return obj ;
}
exports . parseTimeObject = parseTimeObject ;
/ * *
* @ returns string e . g . 12 : 00
* /
function parseTimeFromTimeObject ( obj ) {
if ( ! obj ) {
return obj ;
@ -366,36 +322,27 @@ function parseTimeFromTimeObject(obj) {
return result ;
}
exports . parseTimeFromTimeObject = parseTimeFromTimeObject ;
/ * *
* Convert ISO date to UTC
* @ param input Date
* @ returns ISO Date time
* /
function isoToUTCDateTime ( input ) {
return dayjs ( input ) . utc ( ) . format ( exports . SQL _DATETIME _FORMAT ) ;
}
exports . isoToUTCDateTime = isoToUTCDateTime ;
/ * *
* @ param input
* /
function utcToISODateTime ( input ) {
return dayjs . utc ( input ) . toISOString ( ) ;
}
exports . utcToISODateTime = utcToISODateTime ;
/ * *
* For SQL _DATETIME _FORMAT
* /
function utcToLocal ( input , format = exports . SQL _DATETIME _FORMAT ) {
return dayjs . utc ( input ) . local ( ) . format ( format ) ;
}
exports . utcToLocal = utcToLocal ;
/ * *
* Convert local datetime to UTC
* @ param input Local date
* @ param format Format to return
* @ returns Date in requested format
* /
function localToUTC ( input , format = exports . SQL _DATETIME _FORMAT ) {
return dayjs ( input ) . utc ( ) . format ( format ) ;
}
exports . localToUTC = localToUTC ;
function intHash ( str , length = 10 ) {
let hash = 0 ;
for ( let i = 0 ; i < str . length ; i ++ ) {
hash += str . charCodeAt ( i ) ;
}
return ( hash % length + length ) % length ;
}
exports . intHash = intHash ;