Using types declarations from the official @peertube/peertube-types package.

This commit is contained in:
John Livingston
2022-01-11 01:29:33 +01:00
parent c1fb7b69ed
commit 7db856ce0f
35 changed files with 3131 additions and 275 deletions

View File

@ -1,177 +0,0 @@
interface RegisterServerHookOptions {
target: string // FIXME
handler: Function
priority?: number
}
type RegisterServerSettingOptionsType = 'input' | 'input-checkbox' | 'input-password' | 'input-textarea' |
'markdown-text' | 'markdown-enhanced' |
'select' | 'html'
interface RegisterServerSettingOptions {
name?: string
label?: string
type: RegisterServerSettingOptionsType
descriptionHTML?: string
default?: string | boolean
private: boolean
options?: Array<{ value: string, label: string }>
}
interface PluginSettingsManager {
getSetting: (name: string) => Promise<string | boolean>
getSettings: (names: string[]) => Promise<{ [settingName: string]: string | boolean }>
setSetting: (name: string, value: string) => Promise<any>
onSettingsChange: (cb: (names: string[]) => Promise<any>) => void
}
interface PluginStorageManager {
getData: (key: string) => Promise<string>
storeData: (key: string, data: any) => Promise<any>
}
interface PluginVideoCategoryManager {
addCategory: (categoryKey: number, categoryLabel: string) => boolean
deleteCategory: (categoryKey: number) => boolean
}
interface PluginVideoLicenceManager {
addLicence: (licenceKey: number, licenceLabel: string) => boolean
deleteLicence: (licenceKey: number) => boolean
}
interface PluginVideoLanguageManager {
addLanguage: (languageKey: string, languageLabel: string) => boolean
deleteLanguage: (languageKey: string) => boolean
}
enum VideoPrivacy {
PUBLIC = 1,
UNLISTED = 2,
PRIVATE = 3,
INTERNAL = 4
}
enum VideoState {
PUBLISHED = 1,
TO_TRANSCODE = 2,
TO_IMPORT = 3,
WAITING_FOR_LIVE = 4,
LIVE_ENDED = 5
}
interface MVideoThumbnail { // FIXME: this interface is not complete.
id?: number
uuid: string
name: string
category: number
licence: number
language: string
privacy: VideoPrivacy
nsfw: boolean
description: string
support: string
duration: number
videos: number
likes: number
dislikes: number
remote: boolean
isLive: boolean
url: string
commentsEnabled: boolean
downloadEnabled: boolean
state: VideoState
channelId: number
pluginData?: any
}
// Keep the order
enum UserRole {
ADMINISTRATOR = 0,
MODERATOR = 1,
USER = 2
}
interface MUserDefault { // FIXME: this interface is not complete
id?: string | number // FIXME: type is not clear... Documentation says string, but it seems to be number
username: string
email: string
blocked: boolean
role: UserRole
Account?: { // FIXME: can this be undefined?
name: string
}
}
interface VideoBlacklistCreate {
reason?: string
unfederate?: boolean
}
type ActorModel = any // FIXME
interface ServerConfig { // FIXME: this interface is not complete
serverVersion: string
serverCommit?: string
instance: {
name: string
shortDescription: string
isNSFW: boolean
// defaultNSFWPolicy: NSFWPolicyType
defaultClientRoute: string
customizations: {
javascript: string
css: string
}
}
}
interface PeerTubeHelpers {
logger: Logger
database: {
query: Function
}
videos: {
loadByUrl: (url: string) => Promise<MVideoThumbnail>
loadByIdOrUUID: (id: number | string) => Promise<MVideoThumbnail>
removeVideo: (videoId: number) => Promise<void>
}
config: {
getWebserverUrl: () => string
getServerConfig: () => Promise<ServerConfig>
}
moderation: {
blockServer: (options: { byAccountId: number, hostToBlock: string }) => Promise<void>
unblockServer: (options: { byAccountId: number, hostToUnblock: string }) => Promise<void>
blockAccount: (options: { byAccountId: number, handleToBlock: string }) => Promise<void>
unblockAccount: (options: { byAccountId: number, handleToUnblock: string }) => Promise<void>
blacklistVideo: (
options: { videoIdOrUUID: number | string, createOptions: VideoBlacklistCreate }
) => Promise<void>
unblacklistVideo: (options: { videoIdOrUUID: number | string }) => Promise<void>
}
server: {
getServerActor: () => Promise<ActorModel>
}
user: {
getAuthUser: (res: express.Response) => Promise<MUserDefault | undefined>
}
plugin: {
getBaseStaticRoute: () => string
getBaseRouterRoute: () => string
getDataDirectoryPath: () => string
}
}
interface RegisterServerOptions {
registerHook: (options: RegisterServerHookOptions) => void
registerSetting: (options: RegisterServerSettingOptions) => void
settingsManager: PluginSettingsManager
storageManager: PluginStorageManager
videoCategoryManager: PluginVideoCategoryManager
videoLicenceManager: PluginVideoLicenceManager
videoLanguageManager: PluginVideoLanguageManager
getRouter: () => Router
peertubeHelpers: PeerTubeHelpers
}

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
/*
For internal API, we will generate an api Key that must be provided as
GET parameter for every API call.

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions, MVideoThumbnail } from '@peertube/peertube-types'
async function initCustomFields (options: RegisterServerOptions): Promise<void> {
const registerHook = options.registerHook
const storageManager = options.storageManager
@ -17,11 +18,11 @@ async function initCustomFields (options: RegisterServerOptions): Promise<void>
const value = body.pluginData['livechat-active']
// NB: on Peertube 3.2.1, value is "true", "false", or "null", as strings.
if (value === true || value === 'true') {
logger.info(`Saving livechat-active=true for video ${video.id}`)
await storageManager.storeData(`livechat-active-${video.id}`, true)
logger.info(`Saving livechat-active=true for video ${video.id as string}`)
await storageManager.storeData(`livechat-active-${video.id as string}`, true)
} else if (value === false || value === 'false' || value === 'null') {
logger.info(`Saving livechat-active=false for video ${video.id}`)
await storageManager.storeData(`livechat-active-${video.id}`, false)
logger.info(`Saving livechat-active=false for video ${video.id as string}`)
await storageManager.storeData(`livechat-active-${video.id as string}`, false)
} else {
logger.error('Unknown value ' + JSON.stringify(value) + ' for livechat-active field.')
}
@ -38,7 +39,14 @@ async function initCustomFields (options: RegisterServerOptions): Promise<void>
})
}
async function fillVideoCustomFields (options: RegisterServerOptions, video: MVideoThumbnail): Promise<void> {
// FIXME: @peertube/peertube-types@4.0.0-beta.3 is pluginData missing?
interface MVideoThumbnailLiveChat extends MVideoThumbnail {
pluginData?: {
'livechat-active'?: boolean
}
}
async function fillVideoCustomFields (options: RegisterServerOptions, video: MVideoThumbnailLiveChat): Promise<void> {
if (!video) return video
if (!video.pluginData) video.pluginData = {}
if (!video.id) return
@ -46,8 +54,8 @@ async function fillVideoCustomFields (options: RegisterServerOptions, video: MVi
const logger = options.peertubeHelpers.logger
if (video.isLive) {
const result: any = await storageManager.getData(`livechat-active-${video.id}`)
logger.debug(`Video ${video.id} has livechat-active=` + JSON.stringify(result))
const result: any = await storageManager.getData(`livechat-active-${video.id as string}`)
logger.debug(`Video ${video.id as string} has livechat-active=` + JSON.stringify(result))
// NB: I got weird stuff here. Maybe Peertube 3.2.1 bug?
if (result === true || result === 'true') {
video.pluginData['livechat-active'] = true

View File

@ -1,3 +1,5 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
async function getChannelNameById (options: RegisterServerOptions, channelId: number): Promise<string | null> {
if (!channelId) {
throw new Error('Missing channelId')

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { newResult, TestResult } from './utils'
export async function diagBackend (test: string, _options: RegisterServerOptions): Promise<TestResult> {

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { newResult, TestResult } from './utils'
import type { ChatType } from '../../../shared/lib/types'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { newResult, TestResult } from './utils'
export async function diagConverse (test: string, { settingsManager }: RegisterServerOptions): Promise<TestResult> {

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { diagBackend } from './backend'
import { diagConverse } from './converse'
import { diagChatType } from './chat-type'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { getProsodyConfig, getProsodyConfigContentForDiagnostic, getWorkingDir } from '../prosody/config'
import { getProsodyAbout, testProsodyCorrectlyRunning } from '../prosody/ctl'
import { newResult, TestResult } from './utils'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { newResult, TestResult } from './utils'
export async function diagUri (test: string, { settingsManager }: RegisterServerOptions): Promise<TestResult> {

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { newResult, TestResult } from './utils'
export async function diagVideo (test: string, { settingsManager }: RegisterServerOptions): Promise<TestResult> {

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions, PeerTubeHelpers } from '@peertube/peertube-types'
import { Response } from 'express'
const packagejson: any = require('../../../package.json')
@ -39,7 +40,16 @@ async function isUserAdmin (options: RegisterServerOptions, res: Response): Prom
return true
}
async function getUserNickname (options: RegisterServerOptions, user: MUserDefault): Promise<string | undefined> {
// FIXME: @peertube/peertube-types@4.0.0-beta.3 is missing user.Account.name definition.
type Unpack<T> = T extends Promise<infer U | undefined> ? U : T
type AuthUser = Unpack<ReturnType<PeerTubeHelpers['user']['getAuthUser']>>
interface AuthUserFixed extends AuthUser {
Account?: {
name: string
}
}
async function getUserNickname (options: RegisterServerOptions, user: AuthUserFixed): Promise<string | undefined> {
const peertubeHelpers = options.peertubeHelpers
const logger = peertubeHelpers.logger

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { Request, Response, NextFunction } from 'express'
import { getAPIKey } from '../apikey'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { pluginShortName } from '../helpers'
import type { ChatType } from '../../../shared/lib/types'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { ProsodyLogLevel } from './config/content'
import * as fs from 'fs'
import * as path from 'path'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions, MVideoThumbnail } from '@peertube/peertube-types'
import { getProsodyDomain } from './domain'
import { getUserNameByChannelId } from '../../database/channel'

View File

@ -1,3 +1,5 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
async function getProsodyDomain (options: RegisterServerOptions): Promise<string> {
const url = options.peertubeHelpers.config.getWebserverUrl()
const matches = url.match(/^https?:\/\/([^:/]*)(:\d+)?(\/|$)/)

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { getProsodyConfig, getProsodyFilePaths, writeProsodyConfig } from './config'
import { startProsodyLogRotate, stopProsodyLogRotate } from './logrotate'
import { changeHttpBindRoute } from '../routers/webchat'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { ProsodyFilePaths } from './config/paths'
type Rotate = (file: string, options: {

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { Router, Request, Response, NextFunction } from 'express'
import { videoHasWebchat } from '../../../shared/lib/video'
import { asyncMiddleware } from '../middlewares/async'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { NextFunction, Request, Response } from 'express'
import { initWebchatRouter } from './webchat'
import { initSettingsRouter } from './settings'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { Router, Request, Response, NextFunction } from 'express'
import { diag } from '../diagnostic'
import { getBaseStaticRoute, isUserAdmin } from '../helpers'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions, MVideoThumbnail } from '@peertube/peertube-types'
import type { Router, RequestHandler, Request, Response, NextFunction } from 'express'
import type { ProxyOptions } from 'express-http-proxy'
import type {

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { ensureProsodyRunning, ensureProsodyNotRunning } from './prosody/ctl'
import type { ChatType, ConverseJSTheme } from '../../shared/lib/types'

View File

@ -1,3 +1,4 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { migrateSettings } from './lib/migration/settings'
import { initSettings } from './lib/settings'
import { initCustomFields } from './lib/custom-fields'