+ return true
+ }
+
+ // ###################### External events ######################
+
+ onLogout (npmName: string, authName: string, user: MUser) {
+ const auth = this.getAuth(npmName, authName)
+
+ if (auth?.onLogout) {
+ logger.info('Running onLogout function from auth %s of plugin %s', authName, npmName)
+
+ try {
+ auth.onLogout(user)
+ } catch (err) {
+ logger.warn('Cannot run onLogout function from auth %s of plugin %s.', authName, npmName, { err })
+ }
+ }
+ }
+
+ onSettingsChanged (name: string, settings: any) {
+ const registered = this.getRegisteredPluginByShortName(name)
+ if (!registered) {
+ logger.error('Cannot find plugin %s to call on settings changed.', name)
+ }
+
+ for (const cb of registered.registerHelpersStore.getOnSettingsChangedCallbacks()) {
+ try {
+ cb(settings)
+ } catch (err) {
+ logger.error('Cannot run on settings changed callback for %s.', registered.npmName, { err })
+ }
+ }
+ }
+
+ // ###################### Hooks ######################
+
+ async runHook<T> (hookName: ServerHookName, result?: T, params?: any): Promise<T> {
+ if (!this.hooks[hookName]) return Promise.resolve(result)
+
+ const hookType = getHookType(hookName)
+
+ for (const hook of this.hooks[hookName]) {
+ logger.debug('Running hook %s of plugin %s.', hookName, hook.npmName)
+
+ result = await internalRunHook(hook.handler, hookType, result, params, err => {
+ logger.error('Cannot run hook %s of plugin %s.', hookName, hook.pluginName, { err })
+ })
+ }
+