]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Some plugins fixes and doc enhancements
authorChocobozzz <me@florianbigard.com>
Wed, 17 Jul 2019 13:46:51 +0000 (15:46 +0200)
committerChocobozzz <chocobozzz@cpy.re>
Wed, 24 Jul 2019 08:58:16 +0000 (10:58 +0200)
client/src/app/core/plugins/plugin.service.ts
server/initializers/constants.ts
server/lib/plugins/plugin-manager.ts
server/models/server/plugin.ts
shared/models/plugins/plugin-library.model.ts
support/doc/plugins/quickstart.md

index 525740a01b37cd31d3efa8b00567937460e33b07..af330c2eb204f617448074a10d163e3a75b058e7 100644 (file)
@@ -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)
       }
index 93ccb7da842e930388f8c7715a0b8d3d3b9750ca..1111fd97f3884ba5b030a2d942b8dfbde8fb48df 100644 (file)
@@ -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: {
index 9e4ec5adfd377979bfced494b45133b4353e02fe..570b561936a1188fd18f075a2d8c806ca4f57ac8 100644 (file)
@@ -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)
index 50963ba57a94bcd00c6b0e5aff18da32c0016048..f39b97ef00fa9b1059f5bee30793e4a3bd338cc4 100644 (file)
@@ -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
       })
index df6499b6b7de32fb800eeaae3060516db1984258..fd90a3b46dd5a1d96a1aa7e822ca63774ab9b137 100644 (file)
@@ -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>
 }
index a018aa50ac7ee08425f0dee01bd36ea4b1e02b8c..0e125e7070205b6c5838645bf6f533a20c70c12f 100644 (file)
@@ -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