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