| const fs = require('fs'); |
| const path = require('path'); |
| const sharp = require('sharp'); |
| const { logger } = require('@librechat/data-schemas'); |
| const { getStrategyFunctions } = require('../strategies'); |
| const { resizeImageBuffer } = require('./resize'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| async function convertImage(req, file, resolution = 'high', basename = '') { |
| try { |
| const appConfig = req.config; |
| let inputBuffer; |
| let outputBuffer; |
| let extension = path.extname(file.path ?? basename).toLowerCase(); |
|
|
| |
| if (Buffer.isBuffer(file)) { |
| inputBuffer = file; |
| } else if (file && file.path) { |
| const inputFilePath = file.path; |
| inputBuffer = await fs.promises.readFile(inputFilePath); |
| } else { |
| throw new Error('Invalid input: file must be a buffer or contain a valid path.'); |
| } |
|
|
| |
| const { |
| buffer: resizedBuffer, |
| width, |
| height, |
| } = await resizeImageBuffer(inputBuffer, resolution); |
|
|
| |
| const targetExtension = `.${appConfig.imageOutputType}`; |
| if (extension === targetExtension) { |
| outputBuffer = resizedBuffer; |
| } else { |
| outputBuffer = await sharp(resizedBuffer).toFormat(appConfig.imageOutputType).toBuffer(); |
| extension = targetExtension; |
| } |
|
|
| |
| const newFileName = |
| path.basename(file.path ?? basename, path.extname(file.path ?? basename)) + extension; |
|
|
| const { saveBuffer } = getStrategyFunctions(appConfig.fileStrategy); |
|
|
| const savedFilePath = await saveBuffer({ |
| userId: req.user.id, |
| buffer: outputBuffer, |
| fileName: newFileName, |
| }); |
|
|
| const bytes = Buffer.byteLength(outputBuffer); |
| return { filepath: savedFilePath, bytes, width, height }; |
| } catch (err) { |
| logger.error(err); |
| throw err; |
| } |
| } |
|
|
| module.exports = { convertImage }; |
|
|