| 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 }; |
|
|