Skip to content

Commit 2dd61dd

Browse files
perf(solid): fetch message files in parallel in getMessagesFromSolid
Use Promise.all over messageFiles so getFile + file.text() run in parallel instead of sequentially; keep per-file error handling and validation.
1 parent 0e70e2f commit 2dd61dd

1 file changed

Lines changed: 42 additions & 36 deletions

File tree

api/server/services/SolidStorage.js

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -811,49 +811,55 @@ async function getMessagesFromSolid(req, conversationId) {
811811
fileCount: messageFiles.length,
812812
});
813813

814-
// Read all message files
815-
const messages = [];
816-
for (const fileInfo of messageFiles) {
817-
try {
814+
// Read all message files in parallel
815+
const messageDataResults = await Promise.all(
816+
messageFiles.map(async (fileInfo) => {
818817
const fileUrl = fileInfo.url;
819-
logger.debug('[SolidStorage] Reading message file', {
820-
fileUrl,
821-
conversationId,
822-
});
823-
824-
const file = await getFile(fileUrl, { fetch: authenticatedFetch });
825-
const fileText = await file.text();
826-
const messageData = JSON.parse(fileText);
827-
828-
// Validate that this message belongs to the current user
829-
if (messageData.user !== req.user.id) {
830-
logger.warn('[SolidStorage] Message belongs to different user, skipping', {
831-
messageId: messageData.messageId,
832-
messageUserId: messageData.user,
833-
currentUserId: req.user.id,
818+
try {
819+
logger.debug('[SolidStorage] Reading message file', {
820+
fileUrl,
821+
conversationId,
834822
});
835-
continue;
836-
}
837-
838-
// Validate that this message belongs to the requested conversation
839-
if (messageData.conversationId !== conversationId) {
840-
logger.warn('[SolidStorage] Message belongs to different conversation, skipping', {
841-
messageId: messageData.messageId,
842-
messageConversationId: messageData.conversationId,
843-
requestedConversationId: conversationId,
823+
const file = await getFile(fileUrl, { fetch: authenticatedFetch });
824+
const fileText = await file.text();
825+
const messageData = JSON.parse(fileText);
826+
return messageData;
827+
} catch (error) {
828+
logger.error('[SolidStorage] Error reading message file', {
829+
fileUrl,
830+
conversationId,
831+
error: error.message,
844832
});
845-
continue;
833+
return null;
846834
}
835+
}),
836+
);
847837

848-
messages.push(messageData);
849-
} catch (error) {
850-
logger.error('[SolidStorage] Error reading message file', {
851-
fileUrl: fileInfo.url,
852-
conversationId,
853-
error: error.message,
838+
const messages = [];
839+
for (const messageData of messageDataResults) {
840+
if (!messageData) continue;
841+
842+
// Validate that this message belongs to the current user
843+
if (messageData.user !== req.user.id) {
844+
logger.warn('[SolidStorage] Message belongs to different user, skipping', {
845+
messageId: messageData.messageId,
846+
messageUserId: messageData.user,
847+
currentUserId: req.user.id,
854848
});
855-
// Continue with other files even if one fails
849+
continue;
850+
}
851+
852+
// Validate that this message belongs to the requested conversation
853+
if (messageData.conversationId !== conversationId) {
854+
logger.warn('[SolidStorage] Message belongs to different conversation, skipping', {
855+
messageId: messageData.messageId,
856+
messageConversationId: messageData.conversationId,
857+
requestedConversationId: conversationId,
858+
});
859+
continue;
856860
}
861+
862+
messages.push(messageData);
857863
}
858864

859865
// Sort messages by createdAt (ascending)

0 commit comments

Comments
 (0)