Ильяс Султанов
9827b5df33
fix(chat): cross-tab lock реплея офлайн-очереди + идемпотентность мессенджера (conv_messages)
...
Клиентская часть гонки (вариант B): Web Locks API (navigator.locks) —
кросс-вкладочный мьютекс iistwin-offline-sync-replay на replay-проход в
useOfflineSync: первая вкладка под локом реплеит и удаляет записи, остальные
видят пустую очередь. Fallback для сред без Web Locks — старое поведение
(дубли гасит серверная идемпотентность). Race-тест: без locks → 2 POST,
с locks → 1 POST для одной записи очереди.
Мессенджер (conv_messages) — та же защита, что у task_messages:
- conversation_messages.client_message_id + partial unique (миграция 0087);
- POST /api/messenger/conversations/:id/messages: повтор с тем же
clientMessageId → существующее сообщение без insert и без SSE/уведомлений,
гонка insert'ов ловится по 23505;
- useChatController шлёт crypto.randomUUID(), attachment-реплей мессенджера
тоже использует id записи очереди.
2026-09-29 20:31:59 +03:00
..
2026-07-12 23:07:34 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-08 13:33:14 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-07 21:03:40 +03:00
2026-07-08 13:33:14 +03:00
2026-07-08 15:57:25 +03:00
2026-07-09 20:25:49 +03:00
2026-07-12 20:55:30 +03:00
2026-07-12 21:59:38 +03:00
2026-07-12 23:07:34 +03:00
2026-07-13 17:14:01 +03:00
2026-07-15 09:42:55 +03:00
2026-07-15 09:58:07 +03:00
2026-07-16 18:59:00 +03:00
2026-07-20 21:59:36 +03:00
2026-07-17 11:25:25 +03:00
2026-07-21 10:43:28 +03:00
2026-07-21 16:12:55 +03:00
2026-07-22 14:42:32 +03:00
2026-07-24 13:52:03 +03:00
2026-08-03 14:55:29 +03:00
2026-08-05 10:44:55 +03:00
2026-08-24 15:40:30 +03:00
2026-08-24 19:30:11 +03:00
2026-08-25 17:01:44 +03:00
2026-08-25 17:49:38 +03:00
2026-08-26 09:24:29 +03:00
2026-08-26 10:20:38 +03:00
2026-08-26 17:13:49 +03:00
2026-08-28 10:48:32 +03:00
2026-08-28 17:22:57 +03:00
2026-08-29 21:12:09 +03:00
2026-09-04 19:39:10 +03:00
2026-09-07 21:09:50 +03:00
2026-09-07 22:45:30 +03:00
2026-09-08 00:27:17 +03:00
2026-09-08 11:35:32 +03:00
2026-09-17 16:38:56 +03:00
2026-09-21 10:26:53 +03:00
2026-09-21 14:46:57 +03:00
2026-09-29 17:40:47 +03:00
2026-09-29 20:31:59 +03:00