const LOGGER_LEVEL = { DEBUG: 1, INFO: 2, WARNING: 3, ERROR: 4, DISABLED: 100, properties: { 1: { name: "debug", value: 1, prefix: "DEBUG" }, 2: { name: "info", value: 2, prefix: "INFO" }, 3: { name: "warning", value: 3, prefix: "WARN" }, 4: { name: "error", value: 3, prefix: "ERROR" } } }; class Logger { _notificationId = undefined; _log_level = LOGGER_LEVEL.INFO; _notify_level = LOGGER_LEVEL.ERROR; constructor(logLevel, notifyLevel) { if (logLevel) this._log_level = logLevel; if (notifyLevel) this._notify_level = notifyLevel; chrome.notifications.onClosed.addListener((id, byUser) => { this._notify_level = undefined }); } get logLevel() { return this._log_level; } set logLevel(val) { this._log_level = val; } get notifyLevel() { return this._notify_level; } set notifyLevel(val) { this._notify_level = val; } log(level, loggerFn, ...msgs) { if (level < this._log_level) return; let time = new Date().toLocaleString(); loggerFn(`${time} [${LOGGER_LEVEL.properties[level].prefix}]`, ...msgs); if (level < this._notify_level) return; this.notify(...msgs); } debug(...msgs) { this.log(LOGGER_LEVEL.DEBUG, console.debug, ...msgs); } info(...msgs) { this.log(LOGGER_LEVEL.INFO, console.info, ...msgs); } warn(...msgs) { this.log(LOGGER_LEVEL.WARNING, console.info, ...msgs); } error(...msgs) { this.log(LOGGER_LEVEL.ERROR, console.info, ...msgs); } notify(...msgs) { let msg = msgs.join(' '); if (!this._notificationId) { chrome.notifications.create( null, { "type": "basic", "iconUrl": chrome.extension.getURL('icon.png'), "title": "Data Extractor", "message": msg, "priority": 0, "requireInteraction": true, }, notificationId => { this._notificationId = notificationId; } ); return; } chrome.notifications.update( this._notificationId, { "message": msg } ); } } const logger = new Logger(LOGGER_LEVEL.DEBUG, LOGGER_LEVEL.DISABLED);