Provide logger to plugins
authorChocobozzz <me@florianbigard.com>
Thu, 18 Jul 2019 14:43:41 +0000 (16:43 +0200)
committerChocobozzz <chocobozzz@cpy.re>
Wed, 24 Jul 2019 08:58:16 +0000 (10:58 +0200)
server/lib/plugins/plugin-manager.ts
server/typings/plugins/index.d.ts [new file with mode: 0644]
server/typings/plugins/plugin-library.model.ts [new file with mode: 0644]
server/typings/plugins/register-options.model.ts [new file with mode: 0644]
shared/models/plugins/plugin-library.model.ts [deleted file]
shared/models/plugins/register-options.model.ts [deleted file]

index e76dbb53e00a8a5e8590206319aa7df9af480fd3..ac31b06dc1a3593f930541dfbecbea6bb1ad33dc 100644 (file)
@@ -4,7 +4,6 @@ import { basename, join } from 'path'
 import { CONFIG } from '../../initializers/config'
 import { isLibraryCodeValid, isPackageJSONValid } from '../../helpers/custom-validators/plugins'
 import { ClientScript, PluginPackageJson } from '../../../shared/models/plugins/plugin-package-json.model'
-import { PluginLibrary } from '../../../shared/models/plugins/plugin-library.model'
 import { createReadStream, createWriteStream } from 'fs'
 import { PLUGIN_GLOBAL_CSS_PATH } from '../../initializers/constants'
 import { PluginType } from '../../../shared/models/plugins/plugin.type'
@@ -14,10 +13,10 @@ import { RegisterSettingOptions } from '../../../shared/models/plugins/register-
 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 { ServerHookName, ServerHook } from '../../../shared/models/plugins/server-hook.model'
-import { isCatchable, isPromise } from '../../../shared/core-utils/miscs/miscs'
+import { ServerHook, ServerHookName } from '../../../shared/models/plugins/server-hook.model'
 import { getHookType, internalRunHook } from '../../../shared/core-utils/plugins/hooks'
-import { HookType } from '../../../shared/models/plugins/hook-type.enum'
+import { RegisterOptions } from '../../typings/plugins/register-options.model'
+import { PluginLibrary } from '../../typings/plugins'
 
 export interface RegisteredPlugin {
   npmName: string
@@ -287,47 +286,15 @@ export class PluginManager implements ServerHook {
   private async registerPlugin (plugin: PluginModel, pluginPath: string, packageJSON: PluginPackageJson) {
     const npmName = PluginModel.buildNpmName(plugin.name, plugin.type)
 
-    const registerHook = (options: RegisterHookOptions) => {
-      if (!this.hooks[options.target]) this.hooks[options.target] = []
-
-      this.hooks[options.target].push({
-        npmName,
-        pluginName: plugin.name,
-        handler: options.handler,
-        priority: options.priority || 0
-      })
-    }
-
-    const registerSetting = (options: RegisterSettingOptions) => {
-      if (!this.settings[npmName]) this.settings[npmName] = []
-
-      this.settings[npmName].push(options)
-    }
-
-    const settingsManager: PluginSettingsManager = {
-      getSetting: (name: string) => PluginModel.getSetting(plugin.name, plugin.type, name),
-
-      setSetting: (name: string, value: string) => PluginModel.setSetting(plugin.name, plugin.type, name, value)
-    }
-
-    const storageManager: PluginStorageManager = {
-      getData: (key: string) => PluginModel.getData(plugin.name, plugin.type, key),
-
-      storeData: (key: string, data: any) => PluginModel.storeData(plugin.name, plugin.type, key, data)
-    }
-
     const library: PluginLibrary = require(join(pluginPath, packageJSON.library))
 
     if (!isLibraryCodeValid(library)) {
       throw new Error('Library code is not valid (miss register or unregister function)')
     }
 
-    library.register({
-      registerHook,
-      registerSetting,
-      settingsManager,
-      storageManager
-    }).catch(err => logger.error('Cannot register plugin %s.', npmName, { err }))
+    const registerHelpers = this.getRegisterHelpers(npmName, plugin)
+    library.register(registerHelpers)
+           .catch(err => logger.error('Cannot register plugin %s.', npmName, { err }))
 
     logger.info('Add plugin %s CSS to global file.', npmName)
 
@@ -407,6 +374,51 @@ export class PluginManager implements ServerHook {
     return plugins
   }
 
+  // ###################### Generate register helpers ######################
+
+  private getRegisterHelpers (npmName: string, plugin: PluginModel): RegisterOptions {
+    const registerHook = (options: RegisterHookOptions) => {
+      if (!this.hooks[options.target]) this.hooks[options.target] = []
+
+      this.hooks[options.target].push({
+        npmName,
+        pluginName: plugin.name,
+        handler: options.handler,
+        priority: options.priority || 0
+      })
+    }
+
+    const registerSetting = (options: RegisterSettingOptions) => {
+      if (!this.settings[npmName]) this.settings[npmName] = []
+
+      this.settings[npmName].push(options)
+    }
+
+    const settingsManager: PluginSettingsManager = {
+      getSetting: (name: string) => PluginModel.getSetting(plugin.name, plugin.type, name),
+
+      setSetting: (name: string, value: string) => PluginModel.setSetting(plugin.name, plugin.type, name, value)
+    }
+
+    const storageManager: PluginStorageManager = {
+      getData: (key: string) => PluginModel.getData(plugin.name, plugin.type, key),
+
+      storeData: (key: string, data: any) => PluginModel.storeData(plugin.name, plugin.type, key, data)
+    }
+
+    const peertubeHelpers = {
+      logger
+    }
+
+    return {
+      registerHook,
+      registerSetting,
+      settingsManager,
+      storageManager,
+      peertubeHelpers
+    }
+  }
+
   static get Instance () {
     return this.instance || (this.instance = new this())
   }
diff --git a/server/typings/plugins/index.d.ts b/server/typings/plugins/index.d.ts
new file mode 100644 (file)
index 0000000..bddb308
--- /dev/null
@@ -0,0 +1,2 @@
+export * from './register-options.model'
+export * from './plugin-library.model'
diff --git a/server/typings/plugins/plugin-library.model.ts b/server/typings/plugins/plugin-library.model.ts
new file mode 100644 (file)
index 0000000..fd90a3b
--- /dev/null
@@ -0,0 +1,7 @@
+import { RegisterOptions } from './register-options.model'
+
+export interface PluginLibrary {
+  register: (options: RegisterOptions) => Promise<any>
+
+  unregister: () => Promise<any>
+}
diff --git a/server/typings/plugins/register-options.model.ts b/server/typings/plugins/register-options.model.ts
new file mode 100644 (file)
index 0000000..007ef5e
--- /dev/null
@@ -0,0 +1,19 @@
+import { logger } from '../../helpers/logger'
+import { RegisterHookOptions } from '../../../shared/models/plugins/register-hook.model'
+import { RegisterSettingOptions } from '../../../shared/models/plugins/register-setting.model'
+import { PluginSettingsManager } from '../../../shared/models/plugins/plugin-settings-manager.model'
+import { PluginStorageManager } from '../../../shared/models/plugins/plugin-storage-manager.model'
+
+export type RegisterOptions = {
+  registerHook: (options: RegisterHookOptions) => void
+
+  registerSetting: (options: RegisterSettingOptions) => void
+
+  settingsManager: PluginSettingsManager
+
+  storageManager: PluginStorageManager
+
+  peertubeHelpers: {
+    logger: typeof logger
+  }
+}
diff --git a/shared/models/plugins/plugin-library.model.ts b/shared/models/plugins/plugin-library.model.ts
deleted file mode 100644 (file)
index fd90a3b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-import { RegisterOptions } from './register-options.model'
-
-export interface PluginLibrary {
-  register: (options: RegisterOptions) => Promise<any>
-
-  unregister: () => Promise<any>
-}
diff --git a/shared/models/plugins/register-options.model.ts b/shared/models/plugins/register-options.model.ts
deleted file mode 100644 (file)
index e3a7cff..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-import { RegisterHookOptions } from './register-hook.model'
-import { RegisterSettingOptions } from './register-setting.model'
-import { PluginSettingsManager } from './plugin-settings-manager.model'
-import { PluginStorageManager } from './plugin-storage-manager.model'
-
-export type RegisterOptions = {
-  registerHook: (options: RegisterHookOptions) => void
-
-  registerSetting: (options: RegisterSettingOptions) => void
-
-  settingsManager: PluginSettingsManager
-
-  storageManager: PluginStorageManager
-}