Fix lint and tests
This commit is contained in:
parent
4f4d3adf73
commit
985e79f61e
|
@ -96,14 +96,14 @@ describe('Test server plugins API validators', function () {
|
||||||
it('Should fail with invalid paths', async function () {
|
it('Should fail with invalid paths', async function () {
|
||||||
const paths = [
|
const paths = [
|
||||||
'/plugins/' + pluginName + '/' + npmVersion + '/static/images/../chocobo.png',
|
'/plugins/' + pluginName + '/' + npmVersion + '/static/images/../chocobo.png',
|
||||||
'/plugins/' + pluginName + '/' + npmVersion + '/client-scripts/../client/common-client-plugin.js',
|
'/plugins/' + pluginName + '/' + npmVersion + '/client-scripts/h/o/../client/common-client-plugin.js',
|
||||||
'/themes/' + themeName + '/' + themeVersion + '/static/../images/chocobo.png',
|
'/themes/' + themeName + '/' + themeVersion + '/static/hola/a/../images/chocobo.png',
|
||||||
'/themes/' + themeName + '/' + themeVersion + '/client-scripts/client/video-watch-client-plugin.js/..',
|
'/themes/' + themeName + '/' + themeVersion + '/client-scripts/client/video-watch-client-plugin.js/..',
|
||||||
'/themes/' + themeName + '/' + themeVersion + '/css/../assets/style1.css'
|
'/themes/' + themeName + '/' + themeVersion + '/css/hiha//j../assets/style1.css'
|
||||||
]
|
]
|
||||||
|
|
||||||
for (const p of paths) {
|
for (const p of paths) {
|
||||||
await makeGetRequest({ url: server.url, path: p, expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
|
await makeGetRequest({ url: server.url, path: p, expectedStatus: HttpStatusCode.NOT_FOUND_404 })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await,@typescript-eslint/no-floating-promises */
|
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await,@typescript-eslint/no-floating-promises */
|
||||||
|
|
||||||
import WebTorrent from 'webtorrent'
|
|
||||||
import {
|
import {
|
||||||
cleanupTests,
|
cleanupTests,
|
||||||
createSingleServer,
|
createSingleServer,
|
||||||
|
@ -9,11 +8,13 @@ import {
|
||||||
setAccessTokensToServers
|
setAccessTokensToServers
|
||||||
} from '@peertube/peertube-server-commands'
|
} from '@peertube/peertube-server-commands'
|
||||||
import { magnetUriDecode, magnetUriEncode } from '@tests/shared/webtorrent.js'
|
import { magnetUriDecode, magnetUriEncode } from '@tests/shared/webtorrent.js'
|
||||||
|
import WebTorrent from 'webtorrent'
|
||||||
|
|
||||||
describe('Test tracker', function () {
|
describe('Test tracker', function () {
|
||||||
let server: PeerTubeServer
|
let server: PeerTubeServer
|
||||||
let badMagnet: string
|
let badMagnet: string
|
||||||
let goodMagnet: string
|
let goodMagnet: string
|
||||||
|
let webtorrent: WebTorrent.Instance
|
||||||
|
|
||||||
before(async function () {
|
before(async function () {
|
||||||
this.timeout(60000)
|
this.timeout(60000)
|
||||||
|
@ -32,9 +33,15 @@ describe('Test tracker', function () {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should succeed with the correct infohash', function (done) {
|
beforeEach(() => {
|
||||||
const webtorrent = new WebTorrent()
|
webtorrent = new WebTorrent()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
webtorrent.destroy()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Should succeed with the correct infohash', function (done) {
|
||||||
const torrent = webtorrent.add(goodMagnet)
|
const torrent = webtorrent.add(goodMagnet)
|
||||||
|
|
||||||
torrent.on('error', done)
|
torrent.on('error', done)
|
||||||
|
@ -54,8 +61,6 @@ describe('Test tracker', function () {
|
||||||
killallServers([ server ])
|
killallServers([ server ])
|
||||||
.then(() => server.run({ tracker: { enabled: false } }))
|
.then(() => server.run({ tracker: { enabled: false } }))
|
||||||
.then(() => {
|
.then(() => {
|
||||||
const webtorrent = new WebTorrent()
|
|
||||||
|
|
||||||
const torrent = webtorrent.add(goodMagnet)
|
const torrent = webtorrent.add(goodMagnet)
|
||||||
|
|
||||||
torrent.on('error', done)
|
torrent.on('error', done)
|
||||||
|
@ -78,14 +83,16 @@ describe('Test tracker', function () {
|
||||||
killallServers([ server ])
|
killallServers([ server ])
|
||||||
.then(() => server.run())
|
.then(() => server.run())
|
||||||
.then(() => {
|
.then(() => {
|
||||||
const webtorrent = new WebTorrent()
|
|
||||||
|
|
||||||
const torrent = webtorrent.add(badMagnet)
|
const torrent = webtorrent.add(badMagnet)
|
||||||
|
|
||||||
torrent.on('error', done)
|
torrent.on('error', done)
|
||||||
torrent.on('warning', warn => {
|
torrent.on('warning', function onWarn (warn) {
|
||||||
const message = typeof warn === 'string' ? warn : warn.message
|
const message = typeof warn === 'string' ? warn : warn.message
|
||||||
if (message.includes('Unknown infoHash ')) return done()
|
if (message.includes('Unknown infoHash ')) {
|
||||||
|
torrent.off('warning', onWarn)
|
||||||
|
|
||||||
|
return done()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
torrent.on('done', () => done(new Error('No error on infohash')))
|
torrent.on('done', () => done(new Error('No error on infohash')))
|
||||||
|
@ -100,7 +107,7 @@ describe('Test tracker', function () {
|
||||||
torrent.on('error', done)
|
torrent.on('error', done)
|
||||||
torrent.on('warning', warn => {
|
torrent.on('warning', warn => {
|
||||||
const message = typeof warn === 'string' ? warn : warn.message
|
const message = typeof warn === 'string' ? warn : warn.message
|
||||||
if (message.includes('Unsupported tracker protocol')) return done()
|
if (message.includes('Error connecting')) return done()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import config from 'config'
|
|
||||||
import { readFileSync, writeFileSync } from 'fs'
|
|
||||||
import { URL } from 'url'
|
|
||||||
import { uniqify } from '@peertube/peertube-core-utils'
|
import { uniqify } from '@peertube/peertube-core-utils'
|
||||||
import { getFFmpegVersion } from '@peertube/peertube-ffmpeg'
|
import { getFFmpegVersion } from '@peertube/peertube-ffmpeg'
|
||||||
import { RecentlyAddedStrategy, VideoRedundancyConfigFilter } from '@peertube/peertube-models'
|
import { VideoRedundancyConfigFilter } from '@peertube/peertube-models'
|
||||||
import { isProdInstance } from '@peertube/peertube-node-utils'
|
import { isProdInstance } from '@peertube/peertube-node-utils'
|
||||||
|
import config from 'config'
|
||||||
|
import { readFileSync, writeFileSync } from 'fs'
|
||||||
|
import { basename } from 'path'
|
||||||
|
import { URL } from 'url'
|
||||||
import { parseBytes, parseSemVersion } from '../helpers/core-utils.js'
|
import { parseBytes, parseSemVersion } from '../helpers/core-utils.js'
|
||||||
import { isArray } from '../helpers/custom-validators/misc.js'
|
import { isArray } from '../helpers/custom-validators/misc.js'
|
||||||
import { logger } from '../helpers/logger.js'
|
import { logger } from '../helpers/logger.js'
|
||||||
|
@ -13,7 +14,6 @@ import { OAuthClientModel } from '../models/oauth/oauth-client.js'
|
||||||
import { UserModel } from '../models/user/user.js'
|
import { UserModel } from '../models/user/user.js'
|
||||||
import { CONFIG, getLocalConfigFilePath, isEmailEnabled, reloadConfig } from './config.js'
|
import { CONFIG, getLocalConfigFilePath, isEmailEnabled, reloadConfig } from './config.js'
|
||||||
import { WEBSERVER } from './constants.js'
|
import { WEBSERVER } from './constants.js'
|
||||||
import { basename } from 'path'
|
|
||||||
|
|
||||||
async function checkActivityPubUrls () {
|
async function checkActivityPubUrls () {
|
||||||
const actor = await getServerActor()
|
const actor = await getServerActor()
|
||||||
|
@ -101,12 +101,8 @@ async function checkFFmpegVersion () {
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
export {
|
export {
|
||||||
checkConfig,
|
|
||||||
clientsExist,
|
|
||||||
checkFFmpegVersion,
|
|
||||||
usersExist,
|
|
||||||
applicationExist,
|
applicationExist,
|
||||||
checkActivityPubUrls
|
checkActivityPubUrls, checkConfig, checkFFmpegVersion, clientsExist, usersExist
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -194,7 +190,7 @@ function checkLocalRedundancyConfig () {
|
||||||
throw new Error('Redundancy video entries should have unique strategies')
|
throw new Error('Redundancy video entries should have unique strategies')
|
||||||
}
|
}
|
||||||
|
|
||||||
const recentlyAddedStrategy = redundancyVideos.find(r => r.strategy === 'recently-added') as RecentlyAddedStrategy
|
const recentlyAddedStrategy = redundancyVideos.find(r => r.strategy === 'recently-added')
|
||||||
if (recentlyAddedStrategy && isNaN(recentlyAddedStrategy.minViews)) {
|
if (recentlyAddedStrategy && isNaN(recentlyAddedStrategy.minViews)) {
|
||||||
throw new Error('Min views in recently added strategy is not a number')
|
throw new Error('Min views in recently added strategy is not a number')
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ export function getFileAttributesFromUrl (
|
||||||
videoOrPlaylist: MVideo | MStreamingPlaylistVideo,
|
videoOrPlaylist: MVideo | MStreamingPlaylistVideo,
|
||||||
urls: (ActivityTagObject | ActivityUrlObject)[]
|
urls: (ActivityTagObject | ActivityUrlObject)[]
|
||||||
) {
|
) {
|
||||||
const fileUrls = urls.filter(u => isAPVideoUrlObject(u)) as ActivityVideoUrlObject[]
|
const fileUrls = urls.filter(u => isAPVideoUrlObject(u))
|
||||||
if (fileUrls.length === 0) return []
|
if (fileUrls.length === 0) return []
|
||||||
|
|
||||||
const attributes: FilteredModelAttributes<VideoFileModel>[] = []
|
const attributes: FilteredModelAttributes<VideoFileModel>[] = []
|
||||||
|
@ -107,14 +107,14 @@ export function getFileAttributesFromUrl (
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getStreamingPlaylistAttributesFromObject (video: MVideoId, videoObject: VideoObject) {
|
export function getStreamingPlaylistAttributesFromObject (video: MVideoId, videoObject: VideoObject) {
|
||||||
const playlistUrls = videoObject.url.filter(u => isAPStreamingPlaylistUrlObject(u)) as ActivityPlaylistUrlObject[]
|
const playlistUrls = videoObject.url.filter(u => isAPStreamingPlaylistUrlObject(u))
|
||||||
if (playlistUrls.length === 0) return []
|
if (playlistUrls.length === 0) return []
|
||||||
|
|
||||||
const attributes: (FilteredModelAttributes<VideoStreamingPlaylistModel> & { tagAPObject?: ActivityTagObject[] })[] = []
|
const attributes: (FilteredModelAttributes<VideoStreamingPlaylistModel> & { tagAPObject?: ActivityTagObject[] })[] = []
|
||||||
for (const playlistUrlObject of playlistUrls) {
|
for (const playlistUrlObject of playlistUrls) {
|
||||||
const segmentsSha256UrlObject = playlistUrlObject.tag.find(isAPPlaylistSegmentHashesUrlObject)
|
const segmentsSha256UrlObject = playlistUrlObject.tag.find(isAPPlaylistSegmentHashesUrlObject)
|
||||||
|
|
||||||
const files: unknown[] = playlistUrlObject.tag.filter(u => isAPVideoUrlObject(u)) as ActivityVideoUrlObject[]
|
const files: unknown[] = playlistUrlObject.tag.filter(u => isAPVideoUrlObject(u))
|
||||||
|
|
||||||
const attribute = {
|
const attribute = {
|
||||||
type: VideoStreamingPlaylistType.HLS,
|
type: VideoStreamingPlaylistType.HLS,
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Job } from 'bullmq'
|
import { RefreshPayload } from '@peertube/peertube-models'
|
||||||
import { refreshVideoPlaylistIfNeeded } from '@server/lib/activitypub/playlists/index.js'
|
import { refreshVideoPlaylistIfNeeded } from '@server/lib/activitypub/playlists/index.js'
|
||||||
import { refreshVideoIfNeeded } from '@server/lib/activitypub/videos/index.js'
|
import { refreshVideoIfNeeded } from '@server/lib/activitypub/videos/index.js'
|
||||||
import { loadVideoByUrl } from '@server/lib/model-loaders/index.js'
|
import { loadVideoByUrl, VideoLoadByUrlType } from '@server/lib/model-loaders/index.js'
|
||||||
import { RefreshPayload } from '@peertube/peertube-models'
|
import { Job } from 'bullmq'
|
||||||
import { logger } from '../../../helpers/logger.js'
|
import { logger } from '../../../helpers/logger.js'
|
||||||
import { ActorModel } from '../../../models/actor/actor.js'
|
import { ActorModel } from '../../../models/actor/actor.js'
|
||||||
import { VideoPlaylistModel } from '../../../models/video/video-playlist.js'
|
import { VideoPlaylistModel } from '../../../models/video/video-playlist.js'
|
||||||
|
@ -27,14 +27,14 @@ export {
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
async function refreshVideo (videoUrl: string) {
|
async function refreshVideo (videoUrl: string) {
|
||||||
const fetchType = 'all' as 'all'
|
const fetchType = 'all'
|
||||||
const syncParam = { rates: true, shares: true, comments: true }
|
const syncParam = { rates: true, shares: true, comments: true }
|
||||||
|
|
||||||
const videoFromDatabase = await loadVideoByUrl(videoUrl, fetchType)
|
const videoFromDatabase = await loadVideoByUrl(videoUrl, fetchType)
|
||||||
if (videoFromDatabase) {
|
if (videoFromDatabase) {
|
||||||
const refreshOptions = {
|
const refreshOptions = {
|
||||||
video: videoFromDatabase,
|
video: videoFromDatabase,
|
||||||
fetchedType: fetchType,
|
fetchedType: fetchType as VideoLoadByUrlType,
|
||||||
syncParam
|
syncParam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ async function refreshVideo (videoUrl: string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function refreshActor (actorUrl: string) {
|
async function refreshActor (actorUrl: string) {
|
||||||
const fetchType = 'all' as 'all'
|
const fetchType = 'all'
|
||||||
const actor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorUrl)
|
const actor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorUrl)
|
||||||
|
|
||||||
if (actor) {
|
if (actor) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { ExpressPromiseHandler } from '@server/types/express-handler.js'
|
||||||
import { NextFunction, Request, RequestHandler, Response } from 'express'
|
import { NextFunction, Request, RequestHandler, Response } from 'express'
|
||||||
import { ValidationChain } from 'express-validator'
|
import { ValidationChain } from 'express-validator'
|
||||||
import { ExpressPromiseHandler } from '@server/types/express-handler.js'
|
|
||||||
import { retryTransactionWrapper } from '../helpers/database-utils.js'
|
import { retryTransactionWrapper } from '../helpers/database-utils.js'
|
||||||
|
|
||||||
// Syntactic sugar to avoid try/catch in express controllers/middlewares
|
// Syntactic sugar to avoid try/catch in express controllers/middlewares
|
||||||
|
@ -15,7 +15,7 @@ function asyncMiddleware (fun: RequestPromiseHandler | RequestPromiseHandler[])
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (const f of (fun as RequestPromiseHandler[])) {
|
for (const f of fun) {
|
||||||
await new Promise<void>((resolve, reject) => {
|
await new Promise<void>((resolve, reject) => {
|
||||||
return asyncMiddleware(f)(req, res, err => {
|
return asyncMiddleware(f)(req, res, err => {
|
||||||
if (err) return reject(err)
|
if (err) return reject(err)
|
||||||
|
|
|
@ -354,7 +354,7 @@ export class ActorModel extends SequelizeModel<ActorModel> {
|
||||||
const options = {
|
const options = {
|
||||||
type: QueryTypes.SELECT as QueryTypes.SELECT,
|
type: QueryTypes.SELECT as QueryTypes.SELECT,
|
||||||
replacements: { videoId },
|
replacements: { videoId },
|
||||||
plain: true as true,
|
plain: true,
|
||||||
transaction
|
transaction
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue