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