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