1 import * as request from 'supertest'
2 import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
3 import { getDebug, makeGetRequest } from '../../../shared/extra-utils'
4 import { Job, JobState, JobType, ServerDebug } from '../../models'
5 import { wait } from '../miscs/miscs'
6 import { ServerInfo } from './servers'
8 function buildJobsUrl (state?: JobState) {
9 let path = '/api/v1/jobs'
11 if (state) path += '/' + state
16 function getJobsList (url: string, accessToken: string, state?: JobState) {
17 const path = buildJobsUrl(state)
21 .set('Accept', 'application/json')
22 .set('Authorization', 'Bearer ' + accessToken)
23 .expect(HttpStatusCode.OK_200)
24 .expect('Content-Type', /json/)
27 function getJobsListPaginationAndSort (options: {
36 const { url, accessToken, state, start, count, sort, jobType } = options
37 const path = buildJobsUrl(state)
46 return makeGetRequest({
50 statusCodeExpected: HttpStatusCode.OK_200,
55 async function waitJobs (serversArg: ServerInfo[] | ServerInfo) {
56 const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT
57 ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10)
60 let servers: ServerInfo[]
62 if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ]
63 else servers = serversArg as ServerInfo[]
65 const states: JobState[] = [ 'waiting', 'active', 'delayed' ]
66 const repeatableJobs = [ 'videos-views', 'activitypub-cleaner' ]
67 let pendingRequests: boolean
69 function tasksBuilder () {
70 const tasks: Promise<any>[] = []
72 // Check if each server has pending request
73 for (const server of servers) {
74 for (const state of states) {
75 const p = getJobsListPaginationAndSort({
77 accessToken: server.accessToken,
82 }).then(res => res.body.data)
83 .then((jobs: Job[]) => jobs.filter(j => !repeatableJobs.includes(j.type)))
85 if (jobs.length !== 0) {
86 pendingRequests = true
93 const p = getDebug(server.url, server.accessToken)
94 .then(res => res.body)
95 .then((obj: ServerDebug) => {
96 if (obj.activityPubMessagesWaiting !== 0) {
97 pendingRequests = true
108 pendingRequests = false
109 await Promise.all(tasksBuilder())
111 // Retry, in case of new jobs were created
112 if (pendingRequests === false) {
113 await wait(pendingJobWait)
114 await Promise.all(tasksBuilder())
117 if (pendingRequests) {
120 } while (pendingRequests)
123 // ---------------------------------------------------------------------------
128 getJobsListPaginationAndSort