]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - shared/extra-utils/server/jobs.ts
modularize abstract video list header and implement video hotness recommendation...
[github/Chocobozzz/PeerTube.git] / shared / extra-utils / server / jobs.ts
1 import * as request from 'supertest'
2 import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
3 import { makeGetRequest } from '../../../shared/extra-utils'
4 import { Job, JobState, JobType } from '../../models'
5 import { wait } from '../miscs/miscs'
6 import { ServerInfo } from './servers'
7
8 function buildJobsUrl (state?: JobState) {
9 let path = '/api/v1/jobs'
10
11 if (state) path += '/' + state
12
13 return path
14 }
15
16 function getJobsList (url: string, accessToken: string, state?: JobState) {
17 const path = buildJobsUrl(state)
18
19 return request(url)
20 .get(path)
21 .set('Accept', 'application/json')
22 .set('Authorization', 'Bearer ' + accessToken)
23 .expect(HttpStatusCode.OK_200)
24 .expect('Content-Type', /json/)
25 }
26
27 function getJobsListPaginationAndSort (options: {
28 url: string
29 accessToken: string
30 start: number
31 count: number
32 sort: string
33 state?: JobState
34 jobType?: JobType
35 }) {
36 const { url, accessToken, state, start, count, sort, jobType } = options
37 const path = buildJobsUrl(state)
38
39 const query = {
40 start,
41 count,
42 sort,
43 jobType
44 }
45
46 return makeGetRequest({
47 url,
48 path,
49 token: accessToken,
50 statusCodeExpected: HttpStatusCode.OK_200,
51 query
52 })
53 }
54
55 async function waitJobs (serversArg: ServerInfo[] | ServerInfo) {
56 const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10) : 2000
57 let servers: ServerInfo[]
58
59 if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ]
60 else servers = serversArg as ServerInfo[]
61
62 const states: JobState[] = [ 'waiting', 'active', 'delayed' ]
63 let pendingRequests: boolean
64
65 function tasksBuilder () {
66 const tasks: Promise<any>[] = []
67
68 // Check if each server has pending request
69 for (const server of servers) {
70 for (const state of states) {
71 const p = getJobsListPaginationAndSort({
72 url: server.url,
73 accessToken: server.accessToken,
74 state: state,
75 start: 0,
76 count: 10,
77 sort: '-createdAt'
78 })
79 .then(res => res.body.data)
80 .then((jobs: Job[]) => jobs.filter(j => j.type !== 'videos-views'))
81 .then(jobs => {
82 if (jobs.length !== 0) {
83 pendingRequests = true
84 }
85 })
86 tasks.push(p)
87 }
88 }
89
90 return tasks
91 }
92
93 do {
94 pendingRequests = false
95 await Promise.all(tasksBuilder())
96
97 // Retry, in case of new jobs were created
98 if (pendingRequests === false) {
99 await wait(pendingJobWait)
100 await Promise.all(tasksBuilder())
101 }
102
103 if (pendingRequests) {
104 await wait(1000)
105 }
106 } while (pendingRequests)
107 }
108
109 // ---------------------------------------------------------------------------
110
111 export {
112 getJobsList,
113 waitJobs,
114 getJobsListPaginationAndSort
115 }