From 498b44017491b515f1badd346017300a1dceac5c Mon Sep 17 00:00:00 2001 From: Veeck Date: Wed, 22 Feb 2023 18:58:29 +0100 Subject: [PATCH] Convert module-start to async (#3049) Similar to the node_helper async start PR... --------- Co-authored-by: veeck --- CHANGELOG.md | 1 + js/loader.js | 33 ++++++++++++++++------ js/module.js | 2 +- modules/default/alert/alert.js | 4 +-- modules/default/compliments/compliments.js | 9 +++--- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc999007e8..2d1badd15a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ _This release is scheduled to be released on 2023-04-01._ - Update dates in Calendar widgets every minute - Cleanup jest coverage for patches - Update `stylelint` dependencies, switch to `stylelint-config-standard` and handle `stylelint` issues +- Convert module start to async/await - Convert translator callbacks to async/await - Convert app-start/-stop callbacks to async/awaits diff --git a/js/loader.js b/js/loader.js index d48188bce4..a9c8ad5f86 100644 --- a/js/loader.js +++ b/js/loader.js @@ -47,20 +47,35 @@ const Loader = (function () { * Loops thru all modules and requests start for every module. */ const startModules = function () { + const modulePromises = []; for (const module of moduleObjects) { - module.start(); + try { + modulePromises.push(module.start()); + } catch (error) { + Log.error(`Error when starting node_helper for module ${module.name}:`); + Log.error(error); + } } - // Notify core of loaded modules. - MM.modulesStarted(moduleObjects); + Promise.allSettled(modulePromises).then((results) => { + // Log errors that happened during async node_helper startup + results.forEach((result) => { + if (result.status === "rejected") { + Log.error(result.reason); + } + }); + + // Notify core of loaded modules. + MM.modulesStarted(moduleObjects); - // Starting modules also hides any modules that have requested to be initially hidden - for (const thisModule of moduleObjects) { - if (thisModule.data.hiddenOnStartup) { - Log.info("Initially hiding " + thisModule.name); - thisModule.hide(); + // Starting modules also hides any modules that have requested to be initially hidden + for (const thisModule of moduleObjects) { + if (thisModule.data.hiddenOnStartup) { + Log.info("Initially hiding " + thisModule.name); + thisModule.hide(); + } } - } + }); }; /** diff --git a/js/module.js b/js/module.js index 0c5445c3fc..3786f61fb3 100644 --- a/js/module.js +++ b/js/module.js @@ -40,7 +40,7 @@ const Module = Class.extend({ /** * Called when the module is started. */ - start: function () { + start: async function () { Log.info("Starting module: " + this.name); }, diff --git a/modules/default/alert/alert.js b/modules/default/alert/alert.js index d1f42c8170..1bd11d02f6 100644 --- a/modules/default/alert/alert.js +++ b/modules/default/alert/alert.js @@ -44,7 +44,7 @@ Module.register("alert", { return `templates/${type}.njk`; }, - start() { + async start() { Log.info(`Starting module: ${this.name}`); if (this.config.effect === "slide") { @@ -53,7 +53,7 @@ Module.register("alert", { if (this.config.welcome_message) { const message = this.config.welcome_message === true ? this.translate("welcome") : this.config.welcome_message; - this.showNotification({ title: this.translate("sysTitle"), message }); + await this.showNotification({ title: this.translate("sysTitle"), message }); } }, diff --git a/modules/default/compliments/compliments.js b/modules/default/compliments/compliments.js index a1fffb8455..dae0a7d0e7 100644 --- a/modules/default/compliments/compliments.js +++ b/modules/default/compliments/compliments.js @@ -33,16 +33,15 @@ Module.register("compliments", { }, // Define start sequence. - start: function () { + start: async function () { Log.info("Starting module: " + this.name); this.lastComplimentIndex = -1; if (this.config.remoteFile !== null) { - this.loadComplimentFile().then((response) => { - this.config.compliments = JSON.parse(response); - this.updateDom(); - }); + const response = await this.loadComplimentFile(); + this.config.compliments = JSON.parse(response); + this.updateDom(); } // Schedule update timer.