mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
import { logger } from '../../helpers/logger'
 | 
						|
import { AbstractScheduler } from './abstract-scheduler'
 | 
						|
import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants'
 | 
						|
import { CONFIG } from '../../initializers/config'
 | 
						|
import { PluginModel } from '../../models/server/plugin'
 | 
						|
import { chunk } from 'lodash'
 | 
						|
import { getLatestPluginsVersion } from '../plugins/plugin-index'
 | 
						|
import { compareSemVer } from '../../../shared/core-utils/miscs/miscs'
 | 
						|
 | 
						|
export class PluginsCheckScheduler extends AbstractScheduler {
 | 
						|
 | 
						|
  private static instance: AbstractScheduler
 | 
						|
 | 
						|
  protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.checkPlugins
 | 
						|
 | 
						|
  private constructor () {
 | 
						|
    super()
 | 
						|
  }
 | 
						|
 | 
						|
  protected async internalExecute () {
 | 
						|
    return this.checkLatestPluginsVersion()
 | 
						|
  }
 | 
						|
 | 
						|
  private async checkLatestPluginsVersion () {
 | 
						|
    if (CONFIG.PLUGINS.INDEX.ENABLED === false) return
 | 
						|
 | 
						|
    logger.info('Checking latest plugins version.')
 | 
						|
 | 
						|
    const plugins = await PluginModel.listInstalled()
 | 
						|
 | 
						|
    // Process 10 plugins in 1 HTTP request
 | 
						|
    const chunks = chunk(plugins, 10)
 | 
						|
    for (const chunk of chunks) {
 | 
						|
      // Find plugins according to their npm name
 | 
						|
      const pluginIndex: { [npmName: string]: PluginModel} = {}
 | 
						|
      for (const plugin of chunk) {
 | 
						|
        pluginIndex[PluginModel.buildNpmName(plugin.name, plugin.type)] = plugin
 | 
						|
      }
 | 
						|
 | 
						|
      const npmNames = Object.keys(pluginIndex)
 | 
						|
 | 
						|
      try {
 | 
						|
        const results = await getLatestPluginsVersion(npmNames)
 | 
						|
 | 
						|
        for (const result of results) {
 | 
						|
          const plugin = pluginIndex[result.npmName]
 | 
						|
          if (!result.latestVersion) continue
 | 
						|
 | 
						|
          if (
 | 
						|
            !plugin.latestVersion ||
 | 
						|
            (plugin.latestVersion !== result.latestVersion && compareSemVer(plugin.latestVersion, result.latestVersion) < 0)
 | 
						|
          ) {
 | 
						|
            plugin.latestVersion = result.latestVersion
 | 
						|
            await plugin.save()
 | 
						|
 | 
						|
            logger.info('Plugin %s has a new latest version %s.', result.npmName, plugin.latestVersion)
 | 
						|
          }
 | 
						|
        }
 | 
						|
      } catch (err) {
 | 
						|
        logger.error('Cannot get latest plugins version.', { npmNames, err })
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  static get Instance () {
 | 
						|
    return this.instance || (this.instance = new this())
 | 
						|
  }
 | 
						|
}
 |