import { remove } from 'fs-extra' import { logger } from '../../helpers/logger' import * as memoizee from 'memoizee' type GetFilePathResult = { isOwned: boolean, path: string } | undefined export abstract class AbstractVideoStaticFileCache { getFilePath: (params: T) => Promise abstract getFilePathImpl (params: T): Promise // Load and save the remote file, then return the local path from filesystem protected abstract loadRemoteFile (key: string): Promise init (max: number, maxAge: number) { this.getFilePath = memoizee(this.getFilePathImpl, { maxAge, max, promise: true, dispose: (result: GetFilePathResult) => { if (result.isOwned !== true) { remove(result.path) .then(() => logger.debug('%s removed from %s', result.path, this.constructor.name)) .catch(err => logger.error('Cannot remove %s from cache %s.', result.path, this.constructor.name, { err })) } } }) } }