From cf069671f44a4b03d6d5d34f17160b2253f29654 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Jun 2023 15:42:29 +0200 Subject: Use promise cache to load remote thumbnails --- .../shared/abstract-permanent-file-cache.ts | 35 ++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'server/lib/files-cache/shared/abstract-permanent-file-cache.ts') diff --git a/server/lib/files-cache/shared/abstract-permanent-file-cache.ts b/server/lib/files-cache/shared/abstract-permanent-file-cache.ts index 297461035..f990e9872 100644 --- a/server/lib/files-cache/shared/abstract-permanent-file-cache.ts +++ b/server/lib/files-cache/shared/abstract-permanent-file-cache.ts @@ -1,10 +1,11 @@ import express from 'express' import { LRUCache } from 'lru-cache' +import { Model } from 'sequelize' import { logger } from '@server/helpers/logger' +import { CachePromise } from '@server/helpers/promise-cache' import { LRU_CACHE, STATIC_MAX_AGE } from '@server/initializers/constants' import { downloadImageFromWorker } from '@server/lib/worker/parent-process' import { HttpStatusCode } from '@shared/models' -import { Model } from 'sequelize' type ImageModel = { fileUrl: string @@ -41,29 +42,39 @@ export abstract class AbstractPermanentFileCache { return res.sendFile(this.filenameToPathUnsafeCache.get(filename), { maxAge: STATIC_MAX_AGE.SERVER }) } - const image = await this.loadModel(filename) + const image = await this.lazyLoadIfNeeded(filename) if (!image) return res.status(HttpStatusCode.NOT_FOUND_404).end() + const path = image.getPath() + this.filenameToPathUnsafeCache.set(filename, path) + + return res.sendFile(path, { maxAge: STATIC_MAX_AGE.LAZY_SERVER }, (err: any) => { + if (!err) return + + this.onServeError({ err, image, next, filename }) + }) + } + + @CachePromise({ + keyBuilder: filename => filename + }) + private async lazyLoadIfNeeded (filename: string) { + const image = await this.loadModel(filename) + if (!image) return undefined + if (image.onDisk === false) { - if (!image.fileUrl) return res.status(HttpStatusCode.NOT_FOUND_404).end() + if (!image.fileUrl) return undefined try { await this.downloadRemoteFile(image) } catch (err) { logger.warn('Cannot process remote image %s.', image.fileUrl, { err }) - return res.status(HttpStatusCode.NOT_FOUND_404).end() + return undefined } } - const path = image.getPath() - this.filenameToPathUnsafeCache.set(filename, path) - - return res.sendFile(path, { maxAge: STATIC_MAX_AGE.LAZY_SERVER }, (err: any) => { - if (!err) return - - this.onServeError({ err, image, next, filename }) - }) + return image } async downloadRemoteFile (image: M) { -- cgit v1.2.3