Надёжная 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

@@ -2,7 +2,7 @@ import { users, forms, tasks, taskMessages, messageReads, bots, roles, type User
import { taskRelations } from "@shared/schema";
import { taskAssignees, type TaskAssignee } from "@shared/schema";
import { db } from "../db";
import { eq, and, desc, exists, sql } from "drizzle-orm";
import { eq, and, desc, exists, sql, gt } from "drizzle-orm";
import { formatUserName } from "../utils/formatUserName";
import { TasksCoreStorage } from "./tasks-core.storage";
import { fieldConditionsMatch, resolveFieldDisplayText } from "../utils/field-conditions";
@@ -239,7 +239,7 @@ export class TasksStorage extends TasksCoreStorage {
}
// Task Messages (Chat)
async getTaskMessages(taskId: number, organizationId: number): Promise<TaskMessageWithAuthor[]> {
async getTaskMessages(taskId: number, organizationId: number, afterId?: number): Promise<TaskMessageWithAuthor[]> {
const replyToMsg = db.select({
id: taskMessages.id,
message: taskMessages.message,
@@ -289,7 +289,8 @@ export class TasksStorage extends TasksCoreStorage {
.leftJoin(replyToAuthor, eq(replyToMsg.authorId, replyToAuthor.id))
.where(and(
eq(taskMessages.taskId, taskId),
eq(forms.organizationId, organizationId)
eq(forms.organizationId, organizationId),
...(afterId ? [gt(taskMessages.id, afterId)] : [])
))
.orderBy(taskMessages.createdAt);