--- /dev/null
+
+import { OutgoingHttpHeaders } from 'http'
+import { RegisterServerAuthExternalOptions } from '@server/types'
+import {
+ MAbuseMessage,
+ MAbuseReporter,
+ MAccountBlocklist,
+ MActorFollowActorsDefault,
+ MActorUrl,
+ MChannelBannerAccountDefault,
+ MStreamingPlaylist,
+ MVideoChangeOwnershipFull,
+ MVideoFile,
+ MVideoFormattableDetails,
+ MVideoId,
+ MVideoImmutable,
+ MVideoLive,
+ MVideoPlaylistFull,
+ MVideoPlaylistFullSummary
+} from '@server/types/models'
+import { MOAuthTokenUser } from '@server/types/models/oauth/oauth-token'
+import { MPlugin, MServer, MServerBlocklist } from '@server/types/models/server'
+import { MVideoImportDefault } from '@server/types/models/video/video-import'
+import { MVideoPlaylistElement, MVideoPlaylistElementVideoUrlPlaylistPrivacy } from '@server/types/models/video/video-playlist-element'
+import { MAccountVideoRateAccountVideo } from '@server/types/models/video/video-rate'
+import { HttpMethod, PeerTubeProblemDocumentData, ServerErrorCode, VideoCreate } from '@shared/models'
+import { File as UploadXFile, Metadata } from '@uploadx/core'
+import { RegisteredPlugin } from '../../lib/plugins/plugin-manager'
+import {
+ MAccountDefault,
+ MActorAccountChannelId,
+ MActorFollowActorsDefaultSubscription,
+ MActorFull,
+ MComment,
+ MCommentOwnerVideoReply,
+ MUserDefault,
+ MVideoBlacklist,
+ MVideoCaptionVideo,
+ MVideoFullLight,
+ MVideoRedundancyVideo,
+ MVideoShareActor,
+ MVideoThumbnail
+} from '../../types/models'
+import { Writable } from 'stream'
+
+declare module 'express' {
+ export interface Request {
+ query: any
+ method: HttpMethod
+ }
+
+ // Upload using multer or uploadx middleware
+ export type MulterOrUploadXFile = UploadXFile | Express.Multer.File
+
+ export type UploadFiles = {
+ [fieldname: string]: MulterOrUploadXFile[]
+ } | MulterOrUploadXFile[]
+
+ // Partial object used by some functions to check the file mimetype/extension
+ export type UploadFileForCheck = {
+ originalname: string
+ mimetype: string
+ }
+
+ export type UploadFilesForCheck = {
+ [fieldname: string]: UploadFileForCheck[]
+ } | UploadFileForCheck[]
+
+ // Upload file with a duration added by our middleware
+ export type VideoUploadFile = Pick<Express.Multer.File, 'path' | 'filename' | 'size'> & {
+ duration: number
+ }
+
+ // Extends Metadata property of UploadX object
+ export type UploadXFileMetadata = Metadata & VideoCreate & {
+ previewfile: Express.Multer.File[]
+ thumbnailfile: Express.Multer.File[]
+ }
+
+ // Our custom UploadXFile object using our custom metadata
+ export type CustomUploadXFile <T extends Metadata> = UploadXFile & { metadata: T }
+
+ export type EnhancedUploadXFile = CustomUploadXFile<UploadXFileMetadata> & {
+ duration: number
+ path: string
+ filename: string
+ }
+
+ // Extends Response with added functions and potential variables passed by middlewares
+ interface Response {
+ fail: (options: {
+ message: string
+
+ title?: string
+ status?: number
+ type?: ServerErrorCode
+ instance?: string
+
+ data?: PeerTubeProblemDocumentData
+ }) => void
+
+ locals: {
+ apicache: {
+ content: string | Buffer
+ write: Writable['write']
+ writeHead: Response['writeHead']
+ end: Response['end']
+ cacheable: boolean
+ headers: OutgoingHttpHeaders
+ }
+
+ docUrl?: string
+
+ videoAPI?: MVideoFormattableDetails
+ videoAll?: MVideoFullLight
+ onlyImmutableVideo?: MVideoImmutable
+ onlyVideo?: MVideoThumbnail
+ videoId?: MVideoId
+
+ videoLive?: MVideoLive
+
+ videoShare?: MVideoShareActor
+
+ videoFile?: MVideoFile
+
+ videoFileResumable?: EnhancedUploadXFile
+
+ videoImport?: MVideoImportDefault
+
+ videoBlacklist?: MVideoBlacklist
+
+ videoCaption?: MVideoCaptionVideo
+
+ abuse?: MAbuseReporter
+ abuseMessage?: MAbuseMessage
+
+ videoStreamingPlaylist?: MStreamingPlaylist
+
+ videoChannel?: MChannelBannerAccountDefault
+
+ videoPlaylistFull?: MVideoPlaylistFull
+ videoPlaylistSummary?: MVideoPlaylistFullSummary
+
+ videoPlaylistElement?: MVideoPlaylistElement
+ videoPlaylistElementAP?: MVideoPlaylistElementVideoUrlPlaylistPrivacy
+
+ accountVideoRate?: MAccountVideoRateAccountVideo
+
+ videoCommentFull?: MCommentOwnerVideoReply
+ videoCommentThread?: MComment
+
+ follow?: MActorFollowActorsDefault
+ subscription?: MActorFollowActorsDefaultSubscription
+
+ nextOwner?: MAccountDefault
+ videoChangeOwnership?: MVideoChangeOwnershipFull
+
+ account?: MAccountDefault
+
+ actorUrl?: MActorUrl
+ actorFull?: MActorFull
+
+ user?: MUserDefault
+
+ server?: MServer
+
+ videoRedundancy?: MVideoRedundancyVideo
+
+ accountBlock?: MAccountBlocklist
+ serverBlock?: MServerBlocklist
+
+ oauth?: {
+ token: MOAuthTokenUser
+ }
+
+ signature?: {
+ actor: MActorAccountChannelId
+ }
+
+ authenticated?: boolean
+
+ registeredPlugin?: RegisteredPlugin
+
+ externalAuth?: RegisterServerAuthExternalOptions
+
+ plugin?: MPlugin
+ }
+ }
+}