Geek Social — Documentação
Referência

Eventos de socket

Catálogo dos eventos Socket.IO emitidos e consumidos.

Catálogo completo dos eventos do Socket.IO. Para entender como o socket se conecta e autentica, ver Realtime.

Todos os eventos são no namespace default (/). Não há rooms namespaced — apenas rooms-by-id (user:<id>, conv:<id>, friend-of:<id>).

Convenções

  • Direção significa "emit do servidor pro cliente"; significa "emit do cliente pro servidor"
  • Sala — quem recebe o evento (em )
  • Payload — JSON que vai junto

Notifications

EventoDireçãoSalaPayload
notification:newuser:<recipientId>{ id, type, actorId, entityId, read, createdAt, actor: {...} }

Chat — mensagens

EventoDireçãoSalaPayload
message:newconv:<conversationId>Message (objeto completo com attachments)
message:editedconv:<conversationId>{ id, content, updatedAt }
message:deletedconv:<conversationId>{ id, conversationId, deletedAt }
message:reactionconv:<conversationId>{ messageId, userId, emoji, action: 'add' | 'remove' }
conversation:read←/→conv:<conversationId>{ conversationId, userId, lastReadAt }
conversation:typing←/→conv:<conversationId>{ conversationId, userId, isTyping: bool }
conversation:refreshuser:<userId>{ conversationIds: string[] } — sinal pra frontend re-fetch da lista
conversation:createduser:<userId> (membros)Conversation
conversation:updatedconv:<conversationId>{ id, fields }

Presence

EventoDireçãoSalaPayload
presence:onlinefriend-of:<userId>{ userId, isOnline: true }
presence:offlinefriend-of:<userId>{ userId, isOnline: false, lastSeenAt }
presence:updatefriend-of:<userId>{ userId, isOnline, lastSeenAt } (genérico, usado em mudanças de show_presence)

Steam imports

Emitidos pelos workers steam.import-game e steam.enrich-game:

EventoDireçãoSalaPayload
import:progressuser:<userId>{ batchId, total, processed, failed, currentItem? }
import:doneuser:<userId>{ batchId, total, imported, updated, failed, collectionId }

Calls (vídeo/áudio 1-1)

Sinalização WebRTC. Roteamento end-to-end peer-to-peer; servidor só relays SDP.

EventoDireçãoSalaPayload
call:incominguser:<recipientId>{ callId, callerId, type: 'audio' | 'video', conversationId }
call:offer←/→peer{ callId, sdp }
call:answer←/→peer{ callId, sdp }
call:ice-candidate←/→peer{ callId, candidate }
call:hangup←/→peer{ callId, reason: 'completed' | 'rejected' | 'cancelled' | 'failed' }

Após hangup, backend cria messages row com call_metadata registrando o resultado.

Friend / Block side effects

Não são eventos próprios — são conversation:refresh ou presence:update com efeito secundário:

  • Blockconversation:refresh pros 2 envolvidos + unlink room conv:<...>
  • Unblockconversation:refresh pros 2
  • Friend accepted — pode disparar conversation:created se cria DM 1-1

Eventos consumidos pelo servidor (← do cliente)

EventoPayloadEfeito
conversation:read{ conversationId }UPDATE last_read_at; emit conversation:read outros membros
conversation:typing{ conversationId, isTyping }Emit pros outros (não persiste)
call:offer/answer/ice-candidate/hangup(above)Relay pro peer

Re-conexão

Cliente faz auto-reconnect (Socket.IO default). Ao reconectar, re-entra nas rooms (backend re-vincula via JWT). Mensagens enviadas durante desconexão não são re-entregues automaticamente — frontend faz GET /chat/conversations/:id/messages?since=... pra buscar lacunas.

Auditoria

Logs de socket appendam ao app.log do Fastify. Cada evento tem { event, userId, conversationId, ... }. Útil pra debug.

Relacionados

On this page