1 import * as request from 'supertest'
2 import { Job, JobState, JobType } from '../../models'
3 import { wait } from '../miscs/miscs'
4 import { ServerInfo } from './servers'
5 import { makeGetRequest } from '../../../shared/extra-utils'
7 function getJobsList (url: string, accessToken: string, state: JobState) {
8 const path = '/api/v1/jobs/' + state
12 .set('Accept', 'application/json')
13 .set('Authorization', 'Bearer ' + accessToken)
15 .expect('Content-Type', /json/)
18 function getJobsListPaginationAndSort (options: {
27 const { url, accessToken, state, start, count, sort, jobType } = options
28 const path = '/api/v1/jobs/' + state
37 return makeGetRequest({
41 statusCodeExpected: 200,
46 async function waitJobs (serversArg: ServerInfo[] | ServerInfo) {
47 const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10) : 2000
48 let servers: ServerInfo[]
50 if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ]
51 else servers = serversArg as ServerInfo[]
53 const states: JobState[] = [ 'waiting', 'active', 'delayed' ]
54 let pendingRequests: boolean
56 function tasksBuilder () {
57 const tasks: Promise<any>[] = []
59 // Check if each server has pending request
60 for (const server of servers) {
61 for (const state of states) {
62 const p = getJobsListPaginationAndSort({
64 accessToken: server.accessToken,
70 .then(res => res.body.data)
71 .then((jobs: Job[]) => jobs.filter(j => j.type !== 'videos-views'))
73 if (jobs.length !== 0) {
74 pendingRequests = true
85 pendingRequests = false
86 await Promise.all(tasksBuilder())
88 // Retry, in case of new jobs were created
89 if (pendingRequests === false) {
90 await wait(pendingJobWait)
91 await Promise.all(tasksBuilder())
94 if (pendingRequests) {
97 } while (pendingRequests)
100 // ---------------------------------------------------------------------------
105 getJobsListPaginationAndSort