From 3c184e94109e36f072f7202ffe84936efbac2271 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Tue, 16 Apr 2024 16:34:19 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20fix:=20Ensure=20`imageO?= =?UTF-8?q?utputType`=20is=20Always=20Defined=20(#2438)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * avatar fix * chore: ensure `imageOutputType` is always defined * ci(AppService): extra test for default value * chore: replace default value for `desiredFormat` with `EImageOutputType` enum --- api/server/services/AppService.js | 8 +++++--- api/server/services/AppService.spec.js | 9 ++++++++- api/server/services/Files/images/avatar.js | 3 ++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/api/server/services/AppService.js b/api/server/services/AppService.js index 59d1163d79..e444594b4a 100644 --- a/api/server/services/AppService.js +++ b/api/server/services/AppService.js @@ -36,6 +36,7 @@ const AppService = async (app) => { const config = (await loadCustomConfig()) ?? {}; const fileStrategy = config.fileStrategy ?? FileSources.local; + const imageOutputType = config?.imageOutputType ?? EImageOutputType.PNG; process.env.CDN_PROVIDER = fileStrategy; if (fileStrategy === FileSources.firebase) { @@ -58,9 +59,10 @@ const AppService = async (app) => { if (!Object.keys(config).length) { app.locals = { - availableTools, fileStrategy, socialLogins, + availableTools, + imageOutputType, paths, }; @@ -177,12 +179,12 @@ const AppService = async (app) => { app.locals = { socialLogins, - availableTools, fileStrategy, + availableTools, + imageOutputType, fileConfig: config?.fileConfig, interface: config?.interface, secureImageLinks: config?.secureImageLinks, - imageOutputType: config?.imageOutputType?.toLowerCase() ?? EImageOutputType.PNG, paths, ...endpointLocals, }; diff --git a/api/server/services/AppService.spec.js b/api/server/services/AppService.spec.js index 572871e100..dd8e0c0068 100644 --- a/api/server/services/AppService.spec.js +++ b/api/server/services/AppService.spec.js @@ -139,7 +139,6 @@ describe('AppService', () => { ); await AppService(app); - expect(app.locals.imageOutputType).toEqual(EImageOutputType.WEBP); }); @@ -151,7 +150,15 @@ describe('AppService', () => { ); await AppService(app); + expect(app.locals.imageOutputType).toEqual(EImageOutputType.PNG); + }); + it('should default to `PNG` `imageOutputType` with no provided config', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve(undefined), + ); + + await AppService(app); expect(app.locals.imageOutputType).toEqual(EImageOutputType.PNG); }); diff --git a/api/server/services/Files/images/avatar.js b/api/server/services/Files/images/avatar.js index 1041e91b07..3c1068a453 100644 --- a/api/server/services/Files/images/avatar.js +++ b/api/server/services/Files/images/avatar.js @@ -1,6 +1,7 @@ const sharp = require('sharp'); const fs = require('fs').promises; const fetch = require('node-fetch'); +const { EImageOutputType } = require('librechat-data-provider'); const { resizeAndConvert } = require('./resize'); const { logger } = require('~/config'); @@ -20,7 +21,7 @@ const { logger } = require('~/config'); * @throws {Error} Throws an error if the user ID is undefined, the input type is invalid, the image fetching fails, * or any other error occurs during the processing. */ -async function resizeAvatar({ userId, input, desiredFormat }) { +async function resizeAvatar({ userId, input, desiredFormat = EImageOutputType.PNG }) { try { if (userId === undefined) { throw new Error('User ID is undefined');