More robust runner update handler

This commit is contained in:
Chocobozzz 2023-06-19 13:45:26 +02:00
parent 7d758898dc
commit a34c612f38
No known key found for this signature in database
GPG key ID: 583A612D890159BE
2 changed files with 25 additions and 5 deletions

View file

@ -1,5 +1,4 @@
import { remove } from 'fs-extra'
import { throttle } from 'lodash'
import { ConfigManager, downloadFile, logger } from 'packages/peertube-runner/shared'
import { join } from 'path'
import { buildUUID } from '@shared/extra-utils'
@ -60,17 +59,26 @@ export function buildFFmpegVOD (options: {
? 500
: 60000
const updateJobProgress = throttle((progress: number) => {
if (progress < 0 || progress > 100) progress = undefined
let progress: number
const interval = setInterval(() => {
updateTranscodingProgress({ server, job, runnerToken, progress })
.catch(err => logger.error({ err }, 'Cannot send job progress'))
}, updateInterval, { trailing: false })
}, updateInterval)
return new FFmpegVOD({
...getCommonFFmpegOptions(),
updateJobProgress
onError: () => clearInterval(interval),
onEnd: () => clearInterval(interval),
updateJobProgress: arg => {
if (arg < 0 || arg > 100) {
progress = undefined
} else {
progress = arg
}
}
})
}

View file

@ -21,6 +21,8 @@ export interface FFmpegCommandWrapperOptions {
lTags?: { tags: string[] }
updateJobProgress?: (progress?: number) => void
onEnd?: () => void
onError?: (err: Error) => void
}
export class FFmpegCommandWrapper {
@ -37,6 +39,8 @@ export class FFmpegCommandWrapper {
private readonly lTags: { tags: string[] }
private readonly updateJobProgress: (progress?: number) => void
private readonly onEnd?: () => void
private readonly onError?: (err: Error) => void
private command: FfmpegCommand
@ -48,7 +52,11 @@ export class FFmpegCommandWrapper {
this.threads = options.threads
this.logger = options.logger
this.lTags = options.lTags || { tags: [] }
this.updateJobProgress = options.updateJobProgress
this.onEnd = options.onEnd
this.onError = options.onError
}
getAvailableEncoders () {
@ -101,12 +109,16 @@ export class FFmpegCommandWrapper {
this.command.on('error', (err, stdout, stderr) => {
if (silent !== true) this.logger.error('Error in ffmpeg.', { stdout, stderr, shellCommand, ...this.lTags })
if (this.onError) this.onError(err)
rej(err)
})
this.command.on('end', (stdout, stderr) => {
this.logger.debug('FFmpeg command ended.', { stdout, stderr, shellCommand, ...this.lTags })
if (this.onEnd) this.onEnd()
res()
})