| const crypto = require('crypto'); |
| const { parseConvo } = require('librechat-data-provider'); |
| const { saveMessage, getMessages } = require('~/models/Message'); |
| const { getConvo } = require('~/models/Conversation'); |
| const { logger } = require('~/config'); |
|
|
| |
| |
| |
| |
| |
| const handleError = (res, message) => { |
| res.write(`event: error\ndata: ${JSON.stringify(message)}\n\n`); |
| res.end(); |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| const sendMessage = (res, message, event = 'message') => { |
| if (typeof message === 'string' && message.length === 0) { |
| return; |
| } |
| res.write(`event: ${event}\ndata: ${JSON.stringify(message)}\n\n`); |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const sendError = async (res, options, callback) => { |
| const { |
| user, |
| sender, |
| conversationId, |
| messageId, |
| parentMessageId, |
| text, |
| shouldSaveMessage, |
| ...rest |
| } = options; |
| const errorMessage = { |
| sender, |
| messageId: messageId ?? crypto.randomUUID(), |
| conversationId, |
| parentMessageId, |
| unfinished: false, |
| error: true, |
| final: true, |
| text, |
| isCreatedByUser: false, |
| ...rest, |
| }; |
| if (callback && typeof callback === 'function') { |
| await callback(); |
| } |
|
|
| if (shouldSaveMessage) { |
| await saveMessage({ ...errorMessage, user }); |
| } |
|
|
| if (!errorMessage.error) { |
| const requestMessage = { messageId: parentMessageId, conversationId }; |
| let query = [], |
| convo = {}; |
| try { |
| query = await getMessages(requestMessage); |
| convo = await getConvo(user, conversationId); |
| } catch (err) { |
| logger.error('[sendError] Error retrieving conversation data:', err); |
| convo = parseConvo(errorMessage); |
| } |
|
|
| return sendMessage(res, { |
| final: true, |
| requestMessage: query?.[0] ? query[0] : requestMessage, |
| responseMessage: errorMessage, |
| conversation: convo, |
| }); |
| } |
|
|
| handleError(res, errorMessage); |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| const sendResponse = (res, data, errorMessage) => { |
| if (!res.headersSent) { |
| if (errorMessage) { |
| return res.status(500).json({ error: errorMessage }); |
| } |
| return res.json(data); |
| } |
|
|
| if (errorMessage) { |
| return sendError(res, { ...data, text: errorMessage }); |
| } |
| return sendMessage(res, data); |
| }; |
|
|
| module.exports = { |
| sendResponse, |
| handleError, |
| sendMessage, |
| sendError, |
| }; |
|
|