]>
Commit | Line | Data |
---|---|---|
1 | import * as bluebird 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 bluebird.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 | } |