]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/lib/schedulers/plugins-check-scheduler.ts
Fix server lint
[github/Chocobozzz/PeerTube.git] / server / lib / schedulers / plugins-check-scheduler.ts
CommitLineData
15a7eafb
C
1import { chunk } from 'lodash'
2import { compareSemVer } from '@shared/core-utils'
6702a1b2 3import { logger } from '../../helpers/logger'
6702a1b2 4import { CONFIG } from '../../initializers/config'
15a7eafb 5import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
6702a1b2 6import { PluginModel } from '../../models/server/plugin'
32a18cbf 7import { Notifier } from '../notifier'
15a7eafb
C
8import { getLatestPluginsVersion } from '../plugins/plugin-index'
9import { AbstractScheduler } from './abstract-scheduler'
6702a1b2
C
10
11export class PluginsCheckScheduler extends AbstractScheduler {
12
13 private static instance: AbstractScheduler
14
61953742 15 protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.CHECK_PLUGINS
6702a1b2
C
16
17 private constructor () {
18 super()
19 }
20
21 protected async internalExecute () {
e0ce715a 22 return this.checkLatestPluginsVersion()
6702a1b2
C
23 }
24
25 private async checkLatestPluginsVersion () {
26 if (CONFIG.PLUGINS.INDEX.ENABLED === false) return
27
e0ce715a 28 logger.info('Checking latest plugins version.')
6702a1b2
C
29
30 const plugins = await PluginModel.listInstalled()
31
32 // Process 10 plugins in 1 HTTP request
33 const chunks = chunk(plugins, 10)
34 for (const chunk of chunks) {
35 // Find plugins according to their npm name
99b75748 36 const pluginIndex: { [npmName: string]: PluginModel } = {}
6702a1b2
C
37 for (const plugin of chunk) {
38 pluginIndex[PluginModel.buildNpmName(plugin.name, plugin.type)] = plugin
39 }
40
41 const npmNames = Object.keys(pluginIndex)
6702a1b2 42
e0ce715a
C
43 try {
44 const results = await getLatestPluginsVersion(npmNames)
6702a1b2 45
e0ce715a 46 for (const result of results) {
a1587156 47 const plugin = pluginIndex[result.npmName]
e0ce715a
C
48 if (!result.latestVersion) continue
49
50 if (
51 !plugin.latestVersion ||
52 (plugin.latestVersion !== result.latestVersion && compareSemVer(plugin.latestVersion, result.latestVersion) < 0)
53 ) {
54 plugin.latestVersion = result.latestVersion
55 await plugin.save()
56
32a18cbf
C
57 // Notify if there is an higher plugin version available
58 if (compareSemVer(plugin.version, result.latestVersion) < 0) {
59 Notifier.Instance.notifyOfNewPluginVersion(plugin)
60 }
61
d133f385 62 logger.info('Plugin %s has a new latest version %s.', result.npmName, plugin.latestVersion)
e0ce715a 63 }
6702a1b2 64 }
e0ce715a
C
65 } catch (err) {
66 logger.error('Cannot get latest plugins version.', { npmNames, err })
6702a1b2
C
67 }
68 }
6702a1b2
C
69 }
70
71 static get Instance () {
72 return this.instance || (this.instance = new this())
73 }
74}