| | const sharp = require('sharp'); |
| | const fs = require('fs').promises; |
| | const fetch = require('node-fetch'); |
| | const { logger } = require('@librechat/data-schemas'); |
| | const { EImageOutputType } = require('librechat-data-provider'); |
| | const { resizeAndConvert } = require('./resize'); |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | async function resizeAvatar({ userId, input, desiredFormat = EImageOutputType.PNG }) { |
| | try { |
| | if (userId === undefined) { |
| | throw new Error('User ID is undefined'); |
| | } |
| |
|
| | let imageBuffer; |
| | if (typeof input === 'string') { |
| | const response = await fetch(input); |
| |
|
| | if (!response.ok) { |
| | throw new Error(`Failed to fetch image from URL. Status: ${response.status}`); |
| | } |
| | imageBuffer = await response.buffer(); |
| | } else if (input instanceof Buffer) { |
| | imageBuffer = input; |
| | } else if (typeof input === 'object' && input instanceof File) { |
| | const fileContent = await fs.readFile(input.path); |
| | imageBuffer = Buffer.from(fileContent); |
| | } else { |
| | throw new Error('Invalid input type. Expected URL, Buffer, or File.'); |
| | } |
| |
|
| | const metadata = await sharp(imageBuffer).metadata(); |
| | const { width, height } = metadata; |
| | const minSize = Math.min(width, height); |
| |
|
| | if (metadata.format === 'gif') { |
| | const resizedBuffer = await sharp(imageBuffer, { animated: true }) |
| | .extract({ |
| | left: Math.floor((width - minSize) / 2), |
| | top: Math.floor((height - minSize) / 2), |
| | width: minSize, |
| | height: minSize, |
| | }) |
| | .resize(250, 250) |
| | .gif() |
| | .toBuffer(); |
| |
|
| | return resizedBuffer; |
| | } |
| |
|
| | const squaredBuffer = await sharp(imageBuffer) |
| | .extract({ |
| | left: Math.floor((width - minSize) / 2), |
| | top: Math.floor((height - minSize) / 2), |
| | width: minSize, |
| | height: minSize, |
| | }) |
| | .toBuffer(); |
| |
|
| | const { buffer } = await resizeAndConvert({ |
| | inputBuffer: squaredBuffer, |
| | desiredFormat, |
| | }); |
| | return buffer; |
| | } catch (error) { |
| | logger.error('Error uploading the avatar:', error); |
| | throw error; |
| | } |
| | } |
| |
|
| | module.exports = { resizeAvatar }; |
| |
|