KamoCRM

An SI shows "typing…" through an internal endpoint, and a message's badges are recounted off the sender's request

PerformanceMediaService
Shipped
October 11, 2026 at 10:03 PM UTC
Author
Kamo
Commit
6b790b9

- POST /api/media/internal/chat/typing {memberId, conversationId, typing} (KamoAI internal secret, InteractionInternalAuth; under /api/media/internal, which the ingress cuts out and the API gateway reserves): for an SI seated in the conversation it sends the very frame a person's client sends, {sessionGuid, memberId, isTyping} on **************** through the cross-pod StompFanout, so every client shows it unchanged. A person, or an SI not in the conversation, is 404; the WebSocket path still trusts its frame, this one checks who it speaks for. - ChatFanoutService.announce: the unread cards are raised right after the incoming frames, and the recipients' badge recount (one COUNT per conversation of every recipient) runs on ChatBadgeRefresh (4 threads, one read-only transaction per message, caller-runs when full) instead of the sender's request. Badges are whole snapshots stamped before their read, the older dropped by the client, so their order to the sender's answer never mattered. An SI's chat_send to a person in 200 conversations spent ~1 s here (Luna's chat_send p50 1159 ms vs 364 ms for the test SI), and a person's message to an SI waited on the SI's own recount before its wake card went out.

All changes

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing