fix(chat): allow AI to finish and save responses even if client disconnects
This commit is contained in:
@@ -41,9 +41,15 @@ function startSse(res: Response) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sseWrite(res: Response, payload: Record<string, unknown>) {
|
function sseWrite(res: Response, payload: Record<string, unknown>) {
|
||||||
res.write(`data: ${JSON.stringify(payload)}\n\n`);
|
if (res.destroyed || res.writableEnded) return;
|
||||||
if (typeof (res as any).flush === 'function') {
|
try {
|
||||||
(res as any).flush();
|
res.write(`data: ${JSON.stringify(payload)}\n\n`);
|
||||||
|
if (typeof (res as any).flush === 'function') {
|
||||||
|
(res as any).flush();
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// Client disconnect olduysa yazma hatasını yoksay, arka planda AI'ın
|
||||||
|
// yanıt üretmeyi bitirip veritabanına kaydetmesine izin ver.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,15 +204,19 @@ export const chatMessage = async (req: AuthenticatedRequest, res: Response) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sseWrite(res, { done: true, newTitle, messageId: aiMessage?.id || null });
|
if (!res.destroyed && !res.writableEnded) {
|
||||||
res.end();
|
sseWrite(res, { done: true, newTitle, messageId: aiMessage?.id || null });
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('Chat Error:', error);
|
console.error('Chat Error:', error);
|
||||||
if (!res.headersSent) {
|
if (!res.destroyed && !res.writableEnded) {
|
||||||
res.status(500).json({ error: error.message || 'Internal Server Error' });
|
if (!res.headersSent) {
|
||||||
} else {
|
res.status(500).json({ error: error.message || 'Internal Server Error' });
|
||||||
sseWrite(res, { error: error.message || 'Internal Server Error' });
|
} else {
|
||||||
res.end();
|
sseWrite(res, { error: error.message || 'Internal Server Error' });
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -281,15 +291,19 @@ export const sendThreadMessage = async (req: AuthenticatedRequest, res: Response
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sseWrite(res, { done: true, newTitle, messageId: aiMessage?.id || null });
|
if (!res.destroyed && !res.writableEnded) {
|
||||||
res.end();
|
sseWrite(res, { done: true, newTitle, messageId: aiMessage?.id || null });
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('Send Thread Message Error:', error);
|
console.error('Send Thread Message Error:', error);
|
||||||
if (!res.headersSent) {
|
if (!res.destroyed && !res.writableEnded) {
|
||||||
res.status(500).json({ error: error.message || 'Internal Server Error' });
|
if (!res.headersSent) {
|
||||||
} else {
|
res.status(500).json({ error: error.message || 'Internal Server Error' });
|
||||||
sseWrite(res, { error: error.message || 'Internal Server Error' });
|
} else {
|
||||||
res.end();
|
sseWrite(res, { error: error.message || 'Internal Server Error' });
|
||||||
|
res.end();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user