Надёжная real-time доставка сообщений в чатах: SSE buffer, Last-Event-ID, polling fallback

This commit is contained in:
2026-07-08 21:15:40 +03:00
parent be3ee4e625
commit 7b830c658d
10 changed files with 232 additions and 51 deletions

View File

@@ -41,7 +41,8 @@ export function registerChatMessageRoutes(router: Router): void {
}
}
const messages = await storage.getTaskMessages(taskId, req.organizationId!);
const afterId = req.query.afterId ? parseInt(req.query.afterId as string) : undefined;
const messages = await storage.getTaskMessages(taskId, req.organizationId!, afterId);
res.json({ success: true, messages });
} catch (error) {
console.error('Get task messages error:', error);
@@ -178,8 +179,9 @@ export function registerChatMessageRoutes(router: Router): void {
if (bot.type === 'ai_assistant') {
if (!checkBotAccess(bot, req.user!)) {
let denialMessage;
try {
await storage.createTaskMessage({
denialMessage = await storage.createTaskMessage({
taskId,
formId: task.formId,
authorId: null,
@@ -193,12 +195,20 @@ export function registerChatMessageRoutes(router: Router): void {
} catch (err) {
console.error(`[AI-Bot] Failed to post denial message for bot ${bot.id}:`, err);
}
eventBus.publishEvent({
type: 'message_created',
data: { taskId },
organizationId: req.organizationId,
taskId,
});
if (denialMessage) {
eventBus.publishEvent({
type: 'message_created',
data: {
taskId,
message: {
...denialMessage,
bot: bot ? { id: bot.id, name: bot.name, avatarUrl: bot.avatarUrl ?? null } : null,
},
},
organizationId: req.organizationId,
taskId,
});
}
continue;
}
@@ -209,14 +219,8 @@ export function registerChatMessageRoutes(router: Router): void {
attachments: createdMessage.attachments || undefined,
user: req.user!,
organizationId: req.organizationId!,
}).then(() => {
eventBus.publishEvent({
type: 'message_created',
data: { taskId },
organizationId: req.organizationId,
taskId,
});
}).catch(err => console.error(`[AI-Bot] Error for bot ${bot.name}:`, err));
// postBotReply внутри handleAiBotMention сам публикует message_created с полным сообщением
continue;
}