const timestampFormatter = winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss.SSS'
})
-const labelFormatter = winston.format.label({
- label
-})
+const labelFormatter = (suffix?: string) => {
+ return winston.format.label({
+ label: suffix ? `${label} ${suffix}` : label
+ })
+}
const fileLoggerOptions: FileTransportOptions = {
filename: path.join(CONFIG.STORAGE.LOG_DIR, LOG_FILENAME),
fileLoggerOptions.maxFiles = CONFIG.LOG.ROTATION.MAX_FILES
}
-const logger = winston.createLogger({
- level: CONFIG.LOG.LEVEL,
- format: winston.format.combine(
- labelFormatter,
- winston.format.splat()
- ),
- transports: [
- new winston.transports.File(fileLoggerOptions),
- new winston.transports.Console({
- handleExceptions: true,
- format: winston.format.combine(
- timestampFormatter,
- winston.format.colorize(),
- consoleLoggerFormat
- )
- })
- ],
- exitOnError: true
-})
+const logger = buildLogger()
+
+function buildLogger (labelSuffix?: string) {
+ return winston.createLogger({
+ level: CONFIG.LOG.LEVEL,
+ format: winston.format.combine(
+ labelFormatter(labelSuffix),
+ winston.format.splat()
+ ),
+ transports: [
+ new winston.transports.File(fileLoggerOptions),
+ new winston.transports.Console({
+ handleExceptions: true,
+ format: winston.format.combine(
+ timestampFormatter,
+ winston.format.colorize(),
+ consoleLoggerFormat
+ )
+ })
+ ],
+ exitOnError: true
+ })
+}
function bunyanLogFactory (level: string) {
return function () {
// ---------------------------------------------------------------------------
export {
+ buildLogger,
timestampFormatter,
labelFormatter,
consoleLoggerFormat,
--- /dev/null
+import { PluginModel } from '@server/models/server/plugin'
+import { PeerTubeHelpers } from '@server/typings/plugins'
+
+function buildPluginHelpers (npmName: string, plugin: PluginModel): PeerTubeHelpers {
+ const logger = buildLogger(npmName)
+
+ return {
+ logger
+ }
+}
+
+export {
+ buildPluginHelpers
+}
+
+// ---------------------------------------------------------------------------
+
+function buildLogger (npmName: string) {
+ return buildLogger(npmName)
+}
PluginTranslationPaths as PackagePluginTranslations
} from '../../../shared/models/plugins/plugin-package-json.model'
import { createReadStream, createWriteStream } from 'fs'
-import { PLUGIN_GLOBAL_CSS_PATH, VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES } from '../../initializers/constants'
+import { PLUGIN_GLOBAL_CSS_PATH } from '../../initializers/constants'
import { PluginType } from '../../../shared/models/plugins/plugin.type'
import { installNpmPlugin, installNpmPluginFromDisk, removeNpmPlugin } from './yarn'
import { outputFile, readJSON } from 'fs-extra'
-import { PluginSettingsManager } from '../../../shared/models/plugins/plugin-settings-manager.model'
-import { PluginStorageManager } from '../../../shared/models/plugins/plugin-storage-manager.model'
import { ServerHook, ServerHookName, serverHookObject } from '../../../shared/models/plugins/server-hook.model'
import { getHookType, internalRunHook } from '../../../shared/core-utils/plugins/hooks'
import { RegisterServerOptions } from '../../typings/plugins/register-server-option.model'
import { ClientHtml } from '../client-html'
import { RegisterServerHookOptions } from '../../../shared/models/plugins/register-server-hook.model'
import { RegisterServerSettingOptions } from '../../../shared/models/plugins/register-server-setting.model'
-import { PluginVideoLanguageManager } from '../../../shared/models/plugins/plugin-video-language-manager.model'
-import { PluginVideoCategoryManager } from '../../../shared/models/plugins/plugin-video-category-manager.model'
-import { PluginVideoLicenceManager } from '../../../shared/models/plugins/plugin-video-licence-manager.model'
import { PluginTranslation } from '../../../shared/models/plugins/plugin-translation.model'
+import { buildRegisterHelpers, reinitVideoConstants } from './register-helpers'
export interface RegisteredPlugin {
npmName: string
priority: number
}
-type AlterableVideoConstant = 'language' | 'licence' | 'category'
-type VideoConstant = { [key in number | string]: string }
-type UpdatedVideoConstant = {
- [name in AlterableVideoConstant]: {
- [npmName: string]: {
- added: { key: number | string, label: string }[]
- deleted: { key: number | string, label: string }[]
- }
- }
-}
-
type PluginLocalesTranslations = {
[locale: string]: PluginTranslation
}
private hooks: { [name: string]: HookInformationValue[] } = {}
private translations: PluginLocalesTranslations = {}
- private readonly updatedVideoConstants: UpdatedVideoConstant = {
- language: {},
- licence: {},
- category: {}
- }
-
private constructor () {
}
this.hooks[key] = this.hooks[key].filter(h => h.npmName !== npmName)
}
- this.reinitVideoConstants(plugin.npmName)
+ reinitVideoConstants(plugin.npmName)
logger.info('Regenerating registered plugin CSS to global file.')
await this.regeneratePluginGlobalCSS()
this.settings[npmName].push(options)
}
- const settingsManager: PluginSettingsManager = {
- getSetting: (name: string) => PluginModel.getSetting(plugin.name, plugin.type, name),
+ const registerHelpers = buildRegisterHelpers(npmName, plugin)
- 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 videoLanguageManager: PluginVideoLanguageManager = {
- addLanguage: (key: string, label: string) => this.addConstant({ npmName, type: 'language', obj: VIDEO_LANGUAGES, key, label }),
-
- deleteLanguage: (key: string) => this.deleteConstant({ npmName, type: 'language', obj: VIDEO_LANGUAGES, key })
- }
-
- const videoCategoryManager: PluginVideoCategoryManager = {
- addCategory: (key: number, label: string) => this.addConstant({ npmName, type: 'category', obj: VIDEO_CATEGORIES, key, label }),
-
- deleteCategory: (key: number) => this.deleteConstant({ npmName, type: 'category', obj: VIDEO_CATEGORIES, key })
- }
-
- const videoLicenceManager: PluginVideoLicenceManager = {
- addLicence: (key: number, label: string) => this.addConstant({ npmName, type: 'licence', obj: VIDEO_LICENCES, key, label }),
-
- deleteLicence: (key: number) => this.deleteConstant({ npmName, type: 'licence', obj: VIDEO_LICENCES, key })
- }
-
- const peertubeHelpers = {
- logger
- }
-
- return {
+ return Object.assign(registerHelpers, {
registerHook,
- registerSetting,
- settingsManager,
- storageManager,
- videoLanguageManager,
- videoCategoryManager,
- videoLicenceManager,
- peertubeHelpers
- }
- }
-
- private addConstant<T extends string | number> (parameters: {
- npmName: string
- type: AlterableVideoConstant
- obj: VideoConstant
- key: T
- label: string
- }) {
- const { npmName, type, obj, key, label } = parameters
-
- if (obj[key]) {
- logger.warn('Cannot add %s %s by plugin %s: key already exists.', type, npmName, key)
- return false
- }
-
- if (!this.updatedVideoConstants[type][npmName]) {
- this.updatedVideoConstants[type][npmName] = {
- added: [],
- deleted: []
- }
- }
-
- this.updatedVideoConstants[type][npmName].added.push({ key, label })
- obj[key] = label
-
- return true
- }
-
- private deleteConstant<T extends string | number> (parameters: {
- npmName: string
- type: AlterableVideoConstant
- obj: VideoConstant
- key: T
- }) {
- const { npmName, type, obj, key } = parameters
-
- if (!obj[key]) {
- logger.warn('Cannot delete %s %s by plugin %s: key does not exist.', type, npmName, key)
- return false
- }
-
- if (!this.updatedVideoConstants[type][npmName]) {
- this.updatedVideoConstants[type][npmName] = {
- added: [],
- deleted: []
- }
- }
-
- this.updatedVideoConstants[type][npmName].deleted.push({ key, label: obj[key] })
- delete obj[key]
-
- return true
- }
-
- private reinitVideoConstants (npmName: string) {
- const hash = {
- language: VIDEO_LANGUAGES,
- licence: VIDEO_LICENCES,
- category: VIDEO_CATEGORIES
- }
- const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category' ]
-
- for (const type of types) {
- const updatedConstants = this.updatedVideoConstants[type][npmName]
- if (!updatedConstants) continue
-
- for (const added of updatedConstants.added) {
- delete hash[type][added.key]
- }
-
- for (const deleted of updatedConstants.deleted) {
- hash[type][deleted.key] = deleted.label
- }
-
- delete this.updatedVideoConstants[type][npmName]
- }
+ registerSetting
+ })
}
private sanitizeAndCheckPackageJSONOrThrow (packageJSON: PluginPackageJson, pluginType: PluginType) {
--- /dev/null
+import { PluginSettingsManager } from '@shared/models/plugins/plugin-settings-manager.model'
+import { PluginModel } from '@server/models/server/plugin'
+import { PluginStorageManager } from '@shared/models/plugins/plugin-storage-manager.model'
+import { PluginVideoLanguageManager } from '@shared/models/plugins/plugin-video-language-manager.model'
+import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES } from '@server/initializers/constants'
+import { PluginVideoLicenceManager } from '@shared/models/plugins/plugin-video-licence-manager.model'
+import { PluginVideoCategoryManager } from '@shared/models/plugins/plugin-video-category-manager.model'
+import { RegisterServerOptions } from '@server/typings/plugins'
+import { buildPluginHelpers } from './plugin-helpers'
+import { logger } from '@server/helpers/logger'
+
+type AlterableVideoConstant = 'language' | 'licence' | 'category'
+type VideoConstant = { [key in number | string]: string }
+type UpdatedVideoConstant = {
+ [name in AlterableVideoConstant]: {
+ [npmName: string]: {
+ added: { key: number | string, label: string }[]
+ deleted: { key: number | string, label: string }[]
+ }
+ }
+}
+
+const updatedVideoConstants: UpdatedVideoConstant = {
+ language: {},
+ licence: {},
+ category: {}
+}
+
+function buildRegisterHelpers (npmName: string, plugin: PluginModel): Omit<RegisterServerOptions, 'registerHook' | 'registerSetting'> {
+ const settingsManager = buildSettingsManager(plugin)
+ const storageManager = buildStorageManager(plugin)
+
+ const videoLanguageManager = buildVideoLanguageManager(npmName)
+
+ const videoCategoryManager = buildVideoCategoryManager(npmName)
+ const videoLicenceManager = buildVideoLicenceManager(npmName)
+
+ const peertubeHelpers = buildPluginHelpers(npmName, plugin)
+
+ return {
+ settingsManager,
+ storageManager,
+ videoLanguageManager,
+ videoCategoryManager,
+ videoLicenceManager,
+ peertubeHelpers
+ }
+}
+
+function reinitVideoConstants (npmName: string) {
+ const hash = {
+ language: VIDEO_LANGUAGES,
+ licence: VIDEO_LICENCES,
+ category: VIDEO_CATEGORIES
+ }
+ const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category' ]
+
+ for (const type of types) {
+ const updatedConstants = updatedVideoConstants[type][npmName]
+ if (!updatedConstants) continue
+
+ for (const added of updatedConstants.added) {
+ delete hash[type][added.key]
+ }
+
+ for (const deleted of updatedConstants.deleted) {
+ hash[type][deleted.key] = deleted.label
+ }
+
+ delete updatedVideoConstants[type][npmName]
+ }
+}
+
+export {
+ buildRegisterHelpers,
+ reinitVideoConstants
+}
+
+// ---------------------------------------------------------------------------
+
+function buildSettingsManager (plugin: PluginModel): PluginSettingsManager {
+ return {
+ getSetting: (name: string) => PluginModel.getSetting(plugin.name, plugin.type, name),
+
+ setSetting: (name: string, value: string) => PluginModel.setSetting(plugin.name, plugin.type, name, value)
+ }
+}
+
+function buildStorageManager (plugin: PluginModel): PluginStorageManager {
+ return {
+ getData: (key: string) => PluginModel.getData(plugin.name, plugin.type, key),
+
+ storeData: (key: string, data: any) => PluginModel.storeData(plugin.name, plugin.type, key, data)
+ }
+}
+
+function buildVideoLanguageManager (npmName: string): PluginVideoLanguageManager {
+ return {
+ addLanguage: (key: string, label: string) => addConstant({ npmName, type: 'language', obj: VIDEO_LANGUAGES, key, label }),
+
+ deleteLanguage: (key: string) => deleteConstant({ npmName, type: 'language', obj: VIDEO_LANGUAGES, key })
+ }
+}
+
+function buildVideoCategoryManager (npmName: string): PluginVideoCategoryManager {
+ return {
+ addCategory: (key: number, label: string) => {
+ return addConstant({ npmName, type: 'category', obj: VIDEO_CATEGORIES, key, label })
+ },
+
+ deleteCategory: (key: number) => {
+ return deleteConstant({ npmName, type: 'category', obj: VIDEO_CATEGORIES, key })
+ }
+ }
+}
+
+function buildVideoLicenceManager (npmName: string): PluginVideoLicenceManager {
+ return {
+ addLicence: (key: number, label: string) => {
+ return addConstant({ npmName, type: 'licence', obj: VIDEO_LICENCES, key, label })
+ },
+
+ deleteLicence: (key: number) => {
+ return deleteConstant({ npmName, type: 'licence', obj: VIDEO_LICENCES, key })
+ }
+ }
+}
+
+function addConstant<T extends string | number> (parameters: {
+ npmName: string
+ type: AlterableVideoConstant
+ obj: VideoConstant
+ key: T
+ label: string
+}) {
+ const { npmName, type, obj, key, label } = parameters
+
+ if (obj[key]) {
+ logger.warn('Cannot add %s %s by plugin %s: key already exists.', type, npmName, key)
+ return false
+ }
+
+ if (!updatedVideoConstants[type][npmName]) {
+ updatedVideoConstants[type][npmName] = {
+ added: [],
+ deleted: []
+ }
+ }
+
+ updatedVideoConstants[type][npmName].added.push({ key, label })
+ obj[key] = label
+
+ return true
+}
+
+function deleteConstant<T extends string | number> (parameters: {
+ npmName: string
+ type: AlterableVideoConstant
+ obj: VideoConstant
+ key: T
+}) {
+ const { npmName, type, obj, key } = parameters
+
+ if (!obj[key]) {
+ logger.warn('Cannot delete %s %s by plugin %s: key does not exist.', type, npmName, key)
+ return false
+ }
+
+ if (!updatedVideoConstants[type][npmName]) {
+ updatedVideoConstants[type][npmName] = {
+ added: [],
+ deleted: []
+ }
+ }
+
+ updatedVideoConstants[type][npmName].deleted.push({ key, label: obj[key] })
+ delete obj[key]
+
+ return true
+}
-import { logger } from '../../helpers/logger'
import { PluginSettingsManager } from '../../../shared/models/plugins/plugin-settings-manager.model'
import { PluginStorageManager } from '../../../shared/models/plugins/plugin-storage-manager.model'
import { RegisterServerHookOptions } from '../../../shared/models/plugins/register-server-hook.model'
import { PluginVideoCategoryManager } from '../../../shared/models/plugins/plugin-video-category-manager.model'
import { PluginVideoLanguageManager } from '../../../shared/models/plugins/plugin-video-language-manager.model'
import { PluginVideoLicenceManager } from '../../../shared/models/plugins/plugin-video-licence-manager.model'
+import { Logger } from 'winston'
+
+export type PeerTubeHelpers = {
+ logger: Logger
+}
export type RegisterServerOptions = {
registerHook: (options: RegisterServerHookOptions) => void
videoLanguageManager: PluginVideoLanguageManager
videoLicenceManager: PluginVideoLicenceManager
- peertubeHelpers: {
- logger: typeof logger
- }
+ peertubeHelpers: PeerTubeHelpers
}