]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/schedulers/remove-dangling-resumable-uploads-scheduler.ts
esModuleInterop to true
[github/Chocobozzz/PeerTube.git] / server / lib / schedulers / remove-dangling-resumable-uploads-scheduler.ts
1 import { map } from 'bluebird'
2 import { readdir, remove, stat } from 'fs-extra'
3 import { logger, loggerTagsFactory } from '@server/helpers/logger'
4 import { getResumableUploadPath } from '@server/helpers/upload'
5 import { SCHEDULER_INTERVALS_MS } from '@server/initializers/constants'
6 import { METAFILE_EXTNAME } from '@uploadx/core'
7 import { AbstractScheduler } from './abstract-scheduler'
8
9 const lTags = loggerTagsFactory('scheduler', 'resumable-upload', 'cleaner')
10
11 export class RemoveDanglingResumableUploadsScheduler extends AbstractScheduler {
12
13 private static instance: AbstractScheduler
14 private lastExecutionTimeMs: number
15
16 protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.removeDanglingResumableUploads
17
18 private constructor () {
19 super()
20
21 this.lastExecutionTimeMs = new Date().getTime()
22 }
23
24 protected async internalExecute () {
25 const path = getResumableUploadPath()
26 const files = await readdir(path)
27
28 const metafiles = files.filter(f => f.endsWith(METAFILE_EXTNAME))
29
30 if (metafiles.length === 0) return
31
32 logger.debug('Reading resumable video upload folder %s with %d files', path, metafiles.length, lTags())
33
34 try {
35 await map(metafiles, metafile => {
36 return this.deleteIfOlderThan(metafile, this.lastExecutionTimeMs)
37 }, { concurrency: 5 })
38 } catch (error) {
39 logger.error('Failed to handle file during resumable video upload folder cleanup', { error, ...lTags() })
40 } finally {
41 this.lastExecutionTimeMs = new Date().getTime()
42 }
43 }
44
45 private async deleteIfOlderThan (metafile: string, olderThan: number) {
46 const metafilePath = getResumableUploadPath(metafile)
47 const statResult = await stat(metafilePath)
48
49 // Delete uploads that started since a long time
50 if (statResult.ctimeMs < olderThan) {
51 await remove(metafilePath)
52
53 const datafile = metafilePath.replace(new RegExp(`${METAFILE_EXTNAME}$`), '')
54 await remove(datafile)
55 }
56 }
57
58 static get Instance () {
59 return this.instance || (this.instance = new this())
60 }
61 }