X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fplugins%2Fplugin-manager.ts;h=cfe63e50d1a681dc1d94028382572a88a0b15cdd;hb=7663e55a2cc46a413bceee2787d48902b15ae642;hp=ac31b06dc1a3593f930541dfbecbea6bb1ad33dc;hpb=32fe00138990627749da58ff9f845584013aa219;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/plugins/plugin-manager.ts b/server/lib/plugins/plugin-manager.ts index ac31b06dc..cfe63e50d 100644 --- a/server/lib/plugins/plugin-manager.ts +++ b/server/lib/plugins/plugin-manager.ts @@ -8,12 +8,12 @@ import { createReadStream, createWriteStream } from 'fs' import { PLUGIN_GLOBAL_CSS_PATH } from '../../initializers/constants' import { PluginType } from '../../../shared/models/plugins/plugin.type' import { installNpmPlugin, installNpmPluginFromDisk, removeNpmPlugin } from './yarn' -import { outputFile } from 'fs-extra' +import { outputFile, readJSON } from 'fs-extra' import { RegisterSettingOptions } from '../../../shared/models/plugins/register-setting.model' import { RegisterHookOptions } from '../../../shared/models/plugins/register-hook.model' import { PluginSettingsManager } from '../../../shared/models/plugins/plugin-settings-manager.model' import { PluginStorageManager } from '../../../shared/models/plugins/plugin-storage-manager.model' -import { ServerHook, ServerHookName } from '../../../shared/models/plugins/server-hook.model' +import { ServerHook, ServerHookName, serverHookObject } from '../../../shared/models/plugins/server-hook.model' import { getHookType, internalRunHook } from '../../../shared/core-utils/plugins/hooks' import { RegisterOptions } from '../../typings/plugins/register-options.model' import { PluginLibrary } from '../../typings/plugins' @@ -98,15 +98,15 @@ export class PluginManager implements ServerHook { // ###################### Hooks ###################### - async runHook (hookName: ServerHookName, param?: any) { - let result = param - - if (!this.hooks[hookName]) return result + async runHook (hookName: ServerHookName, result?: T, params?: any): Promise { + if (!this.hooks[hookName]) return Promise.resolve(result) const hookType = getHookType(hookName) for (const hook of this.hooks[hookName]) { - result = await internalRunHook(hook.handler, hookType, param, err => { + 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 }) }) } @@ -125,6 +125,13 @@ export class PluginManager implements ServerHook { try { await this.registerPluginOrTheme(plugin) } catch (err) { + // Try to unregister the plugin + try { + await this.unregister(PluginModel.buildNpmName(plugin.name, plugin.type)) + } catch { + // we don't care if we cannot unregister it + } + logger.error('Cannot register plugin %s, skipping.', plugin.name, { err }) } } @@ -174,7 +181,7 @@ export class PluginManager implements ServerHook { const pluginType = PluginModel.getTypeFromNpmName(npmName) const pluginName = PluginModel.normalizePluginName(npmName) - const packageJSON = this.getPackageJSON(pluginName, pluginType) + const packageJSON = await this.getPackageJSON(pluginName, pluginType) if (!isPackageJSONValid(packageJSON, pluginType)) { throw new Error('PackageJSON is invalid.') } @@ -251,7 +258,7 @@ export class PluginManager implements ServerHook { logger.info('Registering plugin or theme %s.', npmName) - const packageJSON = this.getPackageJSON(plugin.name, plugin.type) + const packageJSON = await this.getPackageJSON(plugin.name, plugin.type) const pluginPath = this.getPluginPath(plugin.name, plugin.type) if (!isPackageJSONValid(packageJSON, plugin.type)) { @@ -286,7 +293,10 @@ export class PluginManager implements ServerHook { private async registerPlugin (plugin: PluginModel, pluginPath: string, packageJSON: PluginPackageJson) { const npmName = PluginModel.buildNpmName(plugin.name, plugin.type) - const library: PluginLibrary = require(join(pluginPath, packageJSON.library)) + // Delete cache if needed + const modulePath = join(pluginPath, packageJSON.library) + delete require.cache[modulePath] + const library: PluginLibrary = require(modulePath) if (!isLibraryCodeValid(library)) { throw new Error('Library code is not valid (miss register or unregister function)') @@ -350,7 +360,7 @@ export class PluginManager implements ServerHook { private getPackageJSON (pluginName: string, pluginType: PluginType) { const pluginPath = join(this.getPluginPath(pluginName, pluginType), 'package.json') - return require(pluginPath) as PluginPackageJson + return readJSON(pluginPath) as Promise } private getPluginPath (pluginName: string, pluginType: PluginType) { @@ -378,6 +388,11 @@ export class PluginManager implements ServerHook { private getRegisterHelpers (npmName: string, plugin: PluginModel): RegisterOptions { const registerHook = (options: RegisterHookOptions) => { + if (serverHookObject[options.target] !== true) { + logger.warn('Unknown hook %s of plugin %s. Skipping.', options.target, npmName) + return + } + if (!this.hooks[options.target]) this.hooks[options.target] = [] this.hooks[options.target].push({