Преглед на файлове

Some plugins fixes and doc enhancements

Chocobozzz преди 4 години
родител
ревизия
9fa6ca160a

+ 9 - 2
client/src/app/core/plugins/plugin.service.ts

@@ -125,8 +125,15 @@ export class PluginService {
 
     for (const hook of this.hooks[hookName]) {
       try {
-        if (wait) result = await hook.handler(param)
-        else result = hook.handler()
+        const p = hook.handler(param)
+
+        if (wait) {
+          result = await p
+        } else if (p.catch) {
+          p.catch((err: Error) => {
+            console.error('Cannot run hook %s of script %s of plugin %s.', hookName, hook.plugin, hook.clientScript, err)
+          })
+        }
       } catch (err) {
         console.error('Cannot run hook %s of script %s of plugin %s.', hookName, hook.plugin, hook.clientScript, err)
       }

+ 1 - 1
server/initializers/constants.ts

@@ -19,7 +19,7 @@ const LAST_MIGRATION_VERSION = 400
 // ---------------------------------------------------------------------------
 
 const API_VERSION = 'v1'
-const PEERTUBE_VERSION = process.env.npm_package_version || 'unknown'
+const PEERTUBE_VERSION = require(join(root(), 'package.json')).version
 
 const PAGINATION = {
   COUNT: {

+ 7 - 5
server/lib/plugins/plugin-manager.ts

@@ -104,10 +104,12 @@ export class PluginManager {
 
     for (const hook of this.hooks[hookName]) {
       try {
+        const p = hook.handler(param)
+
         if (wait) {
-          result = await hook.handler(param)
-        } else {
-          result = hook.handler()
+          result = await p
+        } else if (p.catch) {
+          p.catch(err => logger.warn('Hook %s of plugin %s thrown an error.', hookName, hook.pluginName, { err }))
         }
       } catch (err) {
         logger.error('Cannot run hook %s of plugin %s.', hookName, hook.pluginName, { err })
@@ -329,7 +331,7 @@ export class PluginManager {
       registerSetting,
       settingsManager,
       storageManager
-    })
+    }).catch(err => logger.error('Cannot register plugin %s.', npmName, { err }))
 
     logger.info('Add plugin %s CSS to global file.', npmName)
 
@@ -365,7 +367,7 @@ export class PluginManager {
   private async regeneratePluginGlobalCSS () {
     await this.resetCSSGlobalFile()
 
-    for (const key of Object.keys(this.registeredPlugins)) {
+    for (const key of Object.keys(this.getRegisteredPlugins())) {
       const plugin = this.registeredPlugins[key]
 
       await this.addCSSToGlobalFile(plugin.path, plugin.css)

+ 9 - 0
server/models/server/plugin.ts

@@ -156,6 +156,15 @@ export class PluginModel extends Model<PluginModel> {
     return PluginModel.findOne(query)
       .then((c: any) => {
         if (!c) return undefined
+        const value = c.value
+
+        if (typeof value === 'string' && value.startsWith('{')) {
+          try {
+            return JSON.parse(value)
+          } catch {
+            return value
+          }
+        }
 
         return c.value
       })

+ 1 - 1
shared/models/plugins/plugin-library.model.ts

@@ -1,7 +1,7 @@
 import { RegisterOptions } from './register-options.model'
 
 export interface PluginLibrary {
-  register: (options: RegisterOptions) => void
+  register: (options: RegisterOptions) => Promise<any>
 
   unregister: () => Promise<any>
 }

+ 18 - 10
support/doc/plugins/quickstart.md

@@ -18,10 +18,13 @@ A plugin registers functions in JavaScript to execute when PeerTube (server and
 Example:
 
 ```js
-registerHook({
-  target: 'action:application.listening',
-  handler: () => displayHelloWorld()
-})
+// This register function is called by PeerTube, and **must** return a promise
+async function register ({ registerHook }) {
+  registerHook({
+    target: 'action:application.listening',
+    handler: () => displayHelloWorld()
+  })
+}
 ```
 
 On server side, these hooks are registered by the `library` file defined in `package.json`.
@@ -65,9 +68,7 @@ or `/themes/{theme-name}/{theme-version}/static/` routes.
 
 Plugins can declare CSS files that PeerTube will automatically inject in the client.
 
-### Server helpers
-
-**Only for plugins**
+### Server helpers (only for plugins)
 
 #### Settings
 
@@ -94,7 +95,7 @@ Example:
 
 ```js
 const value = await storageManager.getData('mykey')
-await storageManager.storeData('mykey', 'myvalue')
+await storageManager.storeData('mykey', { subkey: 'value' })
 ```
 
 ### Publishing
@@ -169,12 +170,13 @@ If you don't need static directories, use an empty `object`:
 }
 ```
 
-And if you don't need CSS files, use an empty `array`:
+And if you don't need CSS or client script files, use an empty `array`:
 
 ```json
 {
   ...,
   "css": [],
+  "clientScripts": [],
   ...
 }
 ```
@@ -196,9 +198,15 @@ You'll need to have a local PeerTube instance:
 
 ```
 $ npm run build -- --light
+```
+
+ * Build the CLI:
+ 
+```
+$ npm run setup:cli
 ```
  
- * Run it  (you can access to your instance on http://localhost:9000): 
+ * Run PeerTube (you can access to your instance on http://localhost:9000): 
 
 ```
 $ NODE_ENV=test npm start