@ -1,4 +1,5 @@
"use strict" ;
/ * !
// Common Util for frontend and backend
//
// DOT NOT MODIFY util.js!
@ -6,6 +7,7 @@
//
// 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 ;
const dayjs = require ( "dayjs" ) ;
@ -22,9 +24,8 @@ 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 ;
function flipStatus ( s ) {
if ( s === exports . UP ) {
return exports . DOWN ;
@ -35,18 +36,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 +48,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 +61,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 +72,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 ;
@ -132,44 +104,18 @@ class Logger {
console . log ( formattedMessage ) ;
}
}
/ * *
* 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 +125,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 +140,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 +147,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 +201,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 +211,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 +226,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 +241,6 @@ function parseTimeObject(time) {
return obj ;
}
exports . parseTimeObject = parseTimeObject ;
/ * *
* @ returns string e . g . 12 : 00
* /
function parseTimeFromTimeObject ( obj ) {
if ( ! obj ) {
return obj ;
@ -366,35 +253,18 @@ 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 ) ;
}