Обробка socket-подій
Один pipeline для партнерських socket-подій. Task Factory, FavoriteService, BlockService та UI не розбирають проєктні payload напряму.
Наш Stack socket керує оператором/TU та live-view і сюди не входить.
Основні сигнали
✓ — подія і payload підтверджені; △ — подія є, але payload, повноту або обробку треба перевірити; — — корисної socket-події немає.
| Сигнал | Golden | Chathouse | Prime |
|---|---|---|---|
| Повідомлення | ✓ | ✓ | ✓ |
| Лист | — | △ | ✓ |
| Прочитання повідомлення | — | △ | ✓ |
| Typing | — | ✓ | ✓ |
| Зміна chat/mail limits | — | ✓ | ✓ |
| RU online/offline | — | △ | ✓ |
| Block/unblock | — | △ | ✓ |
| Нотифікація для тасків | — | ✓ | — |
| Створення діалогу | — | — | △ |
Структура в коді
Для кожного проєкту залишається свій socket-клієнт і parser: він підключає конкретну TU, робить reconnect, перевіряє проєктний payload і створює спільний SocketEvent.
Далі подія передається конкретним споживачам за type. Це може бути звичайний typed event bus, а не окремий великий сервіс.
SocketEvent {
eventId
project
tuId
ruId?
type
occurredAt
data
}Дедуп:
- Golden — socket message id;
- Chathouse —
message.id,notification.idабо fingerprintaction + RU + time; - Prime — id верхнього envelope;
- fallback-fingerprint використовується лише коли стабільного id немає.
Реєстр socket-подій
Кожен проєкт логуватиме унікальні типи та форми payload за механікою Prime socketTypeRegistry:
- Сира подія потрапляє в registry до allow-list, parser та будь-якого раннього
return. - Ключ містить проєкт,
type/action, відсортований набір полів і підтип повідомлення або notification, якщо він є. - Для нового ключа зберігаються час, форма та один приклад payload. Повторні події I/O не створюють.
- Нова форма вже відомого типу також вважається новим ключем.
- Registry працює постійно, щоб після змін партнерського API невідомі події та поля не губилися.
Невідомі події не запускають бізнес-логіку до перевірки їх payload.
Якщо socket є лише сигналом і даних недостатньо, точковий запит робить конкретна логіка, яка володіє цим API. Socket pipeline сам API не викликає.
Golden
Формат: { method, toId, message }, де message переважно є JSON-масивом.
receivePrivateMessageDTO:
[ruId, text, messageId]Обробка:
UnansweredMessageабоLikeдля🌹; LastContact; зупинка сендера; confirm назад у socket
paidChatStartedDTO:
[ruId, ...]Обробка: початок платного чату; ActiveChat state
paidChatStoppedDTO:
[ruId, ...]Обробка: завершення платного чату; ActiveChat state
confirmFromServer,confirmFromClientDTO:
[ruId, messageId, source]Обробка: підтвердження відправки для chat queue
limitSecond,limit,offlineUserDTO:
[ruId, error, messageId]Обробка: невдала відправка/ліміт
connectFromServer,reconnectFromServerDTO: —
Обробка: socket connected; відновлення стану
authError,errorDTO: текст помилки
Обробка: стан підключення та reconnect
closeStreamDTO:
[ruId]Обробка: RU завершив stream
receiveVideoModeDTO:
[ruId, isWatching]Обробка: RU почав/завершив дивитися stream TU
WebRTC:
offer,answer,iceCandidate*,initPeerConnectionPublishDTO: SDP/ICE + RU
Обробка: тільки stream transport
ping і clearNonSendMessages описані в enum, але цільова бізнес-обробка для них не потрібна.
Chathouse
Формат Centrifuge publication: { action, ...payload }.
Відомі та потрібні
sendDTO:
contact,user,message{id,sent_at,is_incoming,type,format,body}Обробка: chat/like; mail-формат може означати вхідний лист; TaskCandidate, LastContact, inline RU profile
inmail_sendDTO:
contact,user, mail messageОбробка: вхідний лист. Поточний parser пропускає подію через allow-list, але відсікає наступною перевіркою; виправити після фіксації живого payload
typingDTO:
user,contactОбробка: тимчасовий Typing state без збереження
new_notification,repeat_notificationDTO:
notification{id,type,sender,receiver,created_at,...}Обробка:
ONLINE_NOW/RECENT_PURCHASEє сигналом точково оновити діалог і перевірити Follow-up
done_notification,deleted_notificationDTO:
notification_idОбробка: завершення/видалення notification за id. Поточний код розпізнає ці actions, але
notificationLogic()обробляє лишеnew/repeat, тому зараз жоден стан або таск не закривається
limit_changedDTO:
limits{message,mail,sticker,...}Обробка: оновлення лімітів; потрібно перевірити, де в payload лежить RU id
trusted_user_blockDTO: payload не типізований
Обробка: сигнал блокування TU з боку RU. Payload та наявність окремого unblock-сигналу треба зафіксувати; зараз подія ігнорується
user_connectionsDTO: payload не типізований
Обробка: кандидат на incremental online/offline між проходами RUOnlineService. Треба перевірити, чи подія приходить на обидві зміни та де лежать RU id і status; зараз ігнорується
Невідомі події
Потрібно зібрати живі payload
read,fail,deleted,new_dialog_flag_removed,dialog_tab_changed,gift_opened,real_gift_process_status_changed,photo_moderation_fail,tab_counters_updated,unread_counters_updatedЗначення та потрібна обробка поки не визначені.
notification.type: visit, message, like, mutual like, profiles, added as favourite, inmail, credits, online now, recent purchase, connection reminder, gift та icebreaker moderation. Для тасків зараз важливі лише ONLINE_NOW (16) і RECENT_PURCHASE (17).
Поточний код фактично обробляє send, typing, new/repeat_notification і limit_changed. Решту actions треба пропустити через спільний registry та перевірити на живих подіях.
Prime
Формат envelope: { id, type, data?, email?, dateExpired }.
Відомі та потрібні
MessageSentDTO:
message{id,dateCreated,idUserFrom,idUserTo,type,content,...}Обробка: chat/like/gift; TaskCandidate, LastContact; платний підтип — сигнал майбутній Prime favorite-логіці
DTO: верхнє
email{id,id_user_from,id_user_to,id_correspondence,title,content,profile,...}Обробка: UnansweredMail candidate, LastContact, inline profile
Blocked,UnblockedDTO: плоскі
idUserFrom,idUserToОбробка:
BlockService.update(true/false); поточнийBlockedparser помилково читає вкладенеmessage
chat_DialogCreatedDTO:
idDialog,idRegularUser,idTrustedUserОбробка: кандидат на сигнал перевірити OpenLimits; треба протестувати, коли саме та для яких створених діалогів він приходить
chat_DialogLimitChangedDTO:
idInterlocutor,idUser,limitLeftОбробка: актуальний chat limit; шумна подія і сама по собі не означає OpenLimits
platform_CorrespondenceLimitChangedDTO:
idInterlocutor,idUser,limitLeftОбробка: актуальний mail limit
chat_InterlocutorStatusChangedDTO:
idInterlocutor,status,isBookmarked,changedAtОбробка: incremental online/offline між повними проходами
chat_DialogTypingDTO:
idInterlocutorОбробка: тимчасовий Typing state
chat_MessageReadDTO:
idInterlocutor,idMessageОбробка: поточний Prime передає подію на фронт; фронт оновлює
idLastReadMsgу відкритому чаті, фаворитах та чат-хісторі. Вплив на таски й сендер ще не визначений
Відомі допоміжні події
chat_MessageVideoPurchased,platform_AudioPurchased,virtual-gift_UniqueGiftSentDTO: RU/TU та id покупки
Обробка: сигнал платної дії для майбутнього Prime favorite-updater; суми в події немає
virtual-gift_GiftLimitUpdatedDTO:
idUserFrom,idUserTo,limit,dateUpdatedОбробка: gift limit
chat_MessageUpdated,correspondence_LetterUpdatedDTO: id повідомлення/листа + оновлений content
Обробка: переклад уже доставленого контенту
chat_MessageDisplayAttributesApplied,correspondence_*DisplayAttributesAppliedDTO: id + displayAttributes
Обробка: модерація/blur контенту
gallery_PhotoProcessed,gallery_VideoProcessed,news-feed_PostModeratedDTO: media/post id + status
Обробка: оновлення media/newsfeed UI.
news-feed_PostModeratedє у registry, але в поточному Prime handler ще не підключений
chat_RequestLimitChangedDTO:
dateAvailable,limitsAvailable,typeОбробка: Prime chat-request limit
chat_DraftUpdated,contactExchange_connectionDecisionCreated, video-call eventsDTO: проєктні поля
Обробка: окремі Prime UI-модулі
Треба перевірити
chat_DialogHighlightingChangedDTO:
idInterlocutor,highlightType,highlightExpireDate?У живому registry зафіксовано
highlightType: limit_reloadзhighlightExpireDateіhighlightType: none. Це схоже на socket-маркер Open Limits із REST, але подія зараз не обробляється і її повнота не перевірена.
- виправити
Blocked: payload плоский, а поточний parser читає вкладенеdata.message; - перевірити
chat_DialogCreatedяк тригер OpenLimits; - додати в parser побачений наживо підтип
MessageSent.reply_newsfeed_post; - накопичувати нові типи та нові форми відомих типів через registry.
Prime вже має живий registry форм станом на 20.07.2026; він є основним джерелом описаних payload. Типізовані підтипи MessageSent: message, photo, virtual_gift, wink, likephoto, sticker, like_newsfeed_post.
Точкові перевірки після socket
Socket pipeline: 0 партнерських запитів.
Точкові перевірки
Сигнал Поточна перевірка Chathouse new_notification1 × GET /dialogs/{ruId}Chathouse like/typing без актуальних limits до 1 × GET /dialogs/{ruId}Prime MessageSentперша сторінка criteria=[unanswered]+POST /chat/restrictionPrime chat_DialogCreatedперша сторінка criteria=[active]+ relation + restriction
Ціль — спочатку використовувати свіжі дані відповідного сервісу. Точковий запит робиться лише коли socket-подія несе недостатньо даних або наявний стан застарів.