From 4baccc47010c678355455caf21eb2f1e45e31336 Mon Sep 17 00:00:00 2001 From: Sergey Stepanov Date: Mon, 11 Apr 2022 17:46:10 +0300 Subject: [PATCH] Allow adjusting log levels on the fly --- web/index.html | 10 ++++---- web/js/controller.js | 9 +++++++- web/js/gui/gui.js | 15 ++++++++---- web/js/init.js | 15 +++++++++++- web/js/log.js | 46 +++++++++++++++++++++++-------------- web/js/settings/settings.js | 16 +++++++------ 6 files changed, 76 insertions(+), 35 deletions(-) diff --git a/web/index.html b/web/index.html index 08f8e810..60daf856 100644 --- a/web/index.html +++ b/web/index.html @@ -119,15 +119,15 @@ - + - + - + @@ -138,12 +138,12 @@ - + - + {{if .Analytics.Inject}} diff --git a/web/js/controller.js b/web/js/controller.js index dfa6c292..e4b70086 100644 --- a/web/js/controller.js +++ b/web/js/controller.js @@ -50,7 +50,7 @@ state = newState; } - if (log.is(log.level.debug)) { + if (log.level === log.DEBUG) { const previous = prevState ? prevState.name : '???'; const current = state ? state.name : '???'; const kept = lastState ? lastState.name : '???'; @@ -462,6 +462,13 @@ event.sub(RECORDING_TOGGLED, handleRecording); event.sub(RECORDING_STATUS_CHANGED, handleRecordingStatus); + event.sub(SETTINGS_CHANGED, () => { + const newValue = settings.get()[opts.LOG_LEVEL]; + if (newValue !== log.level) { + log.level = newValue; + } + }); + // initial app state setState(app.state.eden); })(document, event, env, gameList, input, KEY, log, message, recording, room, rtcp, settings, socket, stats, stream, utils, workerManager); diff --git a/web/js/gui/gui.js b/web/js/gui/gui.js index 4a489605..e1d8c0c9 100644 --- a/web/js/gui/gui.js +++ b/web/js/gui/gui.js @@ -13,16 +13,21 @@ const gui = (() => { return el; } - const _option = (text = '', selected = false) => { + const _option = (text = '', selected = false, label) => { const el = _create('option'); - el.textContent = text; + if (label) { + el.textContent = label; + el.value = text; + } else { + el.textContent = text; + } if (selected) el.selected = true; return el; } const select = (key = '', callback = function () { - }, values = [], current = '') => { + }, values = {values: [], labels: []}, current = '') => { const el = _create(); const select = _create('select'); select.onchange = event => { @@ -31,7 +36,9 @@ const gui = (() => { el.append(select); select.append(_option('none', current === '')); - for (let value of values) select.append(_option(value, current === value)); + values.values.forEach((value, index) => { + select.append(_option(value, current === value, values.labels?.[index])); + }); return el; } diff --git a/web/js/init.js b/web/js/init.js index 782dfd05..d421bddb 100644 --- a/web/js/init.js +++ b/web/js/init.js @@ -1,5 +1,18 @@ settings.init(); -log.setLevel(settings.loadOr(opts.LOG_LEVEL, 'debug')); + +(() => { + let lvl = settings.loadOr(opts.LOG_LEVEL, log.DEFAULT); + // migrate old log level options + // !to remove at some point + if (isNaN(lvl)) { + console.warn( + `The log value [${lvl}] is not supported! ` + + `The default value [debug] will be used instead.`); + settings.set(opts.LOG_LEVEL, `${log.DEFAULT}`) + lvl = log.DEFAULT + } + log.level = lvl +})(); keyboard.init(); joystick.init(); diff --git a/web/js/log.js b/web/js/log.js index 3b80a48c..af138188 100644 --- a/web/js/log.js +++ b/web/js/log.js @@ -1,23 +1,35 @@ +/** + * Logging module. + * + * @version 2 + */ const log = (() => { - const levels = {'trace': 0, 'debug': 1, 'error': 2, 'warning': 3, 'info': 4}; - let level = -1; + const noop = () => ({}) - const atLeast = lv => (lv || -1) >= level; - const noop = () => ({}); + const _log = { + ASSERT: 1, + ERROR: 2, + WARN: 3, + INFO: 4, + DEBUG: 5, + TRACE: 6, - const - info = atLeast(levels.info) ? console.info.bind(window.console) : noop, - debug = atLeast(levels.debug) ? console.debug.bind(window.console) : noop, - error = atLeast(levels.error) ? console.error.bind(window.console) : noop, - warning = atLeast(levels.warning) ? console.warn.bind(window.console) : noop; + DEFAULT: 5, - return { - level: levels, - info, - debug, - error, - warning, - setLevel: (level_) => level = levels[level_] || -1, - is: (level_) => level === level_ + set level(level) { + this.assert = level >= this.ASSERT ? console.assert.bind(window.console) : noop; + this.error = level >= this.ERROR ? console.error.bind(window.console) : noop; + this.warn = level >= this.WARN ? console.warn.bind(window.console) : noop; + this.info = level >= this.INFO ? console.info.bind(window.console) : noop; + this.debug = level >= this.DEBUG ? console.debug.bind(window.console) : noop; + this.trace = level >= this.TRACE ? console.log.bind(window.console) : noop; + this._level = level; + }, + get level() { + return this._level; + } } + _log.level = _log.DEFAULT; + + return _log })(console, window); diff --git a/web/js/settings/settings.js b/web/js/settings/settings.js index c3686457..e3be8e81 100644 --- a/web/js/settings/settings.js +++ b/web/js/settings/settings.js @@ -15,7 +15,7 @@ */ const settings = (() => { // internal structure version - const revision = 1; + const revision = 1.1; // default settings // keep them for revert to defaults option @@ -169,7 +169,7 @@ const settings = (() => { if (revision > store.settings._version) { // !to handle this with migrations - log.warning(`Your settings are in older format (v${store.settings._version})`); + log.warn(`Your settings are in older format (v${store.settings._version})`); } } @@ -248,7 +248,7 @@ const settings = (() => { const remove = (key, subKey) => { const isRemoved = subKey !== undefined ? delete store.settings[key][subKey] : delete store.settings[key]; - if (!isRemoved) log.warning(`The key: ${key + (subKey ? '.' + subKey : '')} wasn't deleted!`); + if (!isRemoved) log.warn(`The key: ${key + (subKey ? '.' + subKey : '')} wasn't deleted!`); provider.remove(key, subKey); } @@ -390,7 +390,7 @@ settings._renderrer = (() => { const _settings = settings.get()[opts.INPUT_KEYBOARD_MAP]; if (_settings[newValue] !== undefined) { - log.warning(`There are old settings for key: ${_settings[newValue]}, won't change!`); + log.warn(`There are old settings for key: ${_settings[newValue]}, won't change!`); } else { settings.remove(opts.INPUT_KEYBOARD_MAP, oldValue); settings.set(opts.INPUT_KEYBOARD_MAP, {[newValue]: key}); @@ -446,8 +446,10 @@ settings._renderrer = (() => { break; case opts.LOG_LEVEL: _option(data).withName('Log level') - .restartNeeded() - .add(gui.select(k, onChange, ['trace', 'debug', 'warning', 'info'], value)) + .add(gui.select(k, onChange, { + labels: ['trace', 'debug', 'warning', 'info'], + values: [log.TRACE, log.DEBUG, log.WARN, log.INFO].map(String) + }, value)) .build(); break; case opts.INPUT_KEYBOARD_MAP: @@ -458,7 +460,7 @@ settings._renderrer = (() => { break; case opts.MIRROR_SCREEN: _option(data).withName('Video mirroring without smooth') - .add(gui.select(k, onChange, ['mirror'], value)) + .add(gui.select(k, onChange, {values: ['mirror']}, value)) .build(); break; default: