Pular para conteúdo principal

Carregando...

Bem-vindo ao RoomStream

Faça login para acessar a plataforma

RoomStream

Platform

Sobre

Conheça o desenvolvedor por trás do RoomStream

Sobre o RoomStream

O RoomStream é um projeto de API WebSocket em tempo real, desenvolvido para demonstrar competências em arquitetura de sistemas distribuídos e comunicação real-time.

Construído com NestJS, Socket.IO e Redis, o projeto implementa um sistema completo de gerenciamento de salas com autenticação, eventos customizados e persistência opcional.

Stack Tecnológico

NestJS TypeScript Socket.IO Redis Supabase Docker Alpine.js Tailwind CSS

Aplicações

Gerencie suas API Keys para integração

Total de aplicações:

Aplicação ativa

API Key

Mantenha esta chave em segredo!

Excluir Aplicação?

Tem certeza que deseja excluir ? Esta ação não pode ser desfeita.

Regenerar API Key?

A API Key atual de será invalidada. Todas as integrações usando a chave antiga deixarão de funcionar.

Dashboard

Visão geral do sistema RoomStream

Última atualização:
Total

Conexões (Total)

Ativas:
Salas

Salas Criadas

Ativas:
Mensagens

Mensagens Enviadas

Todas as salas
Uptime

Tempo Ativo

Segundos:

Status do Sistema

WebSocket

Conexão em tempo real

REST API

Endpoints HTTP

Operacional

Autenticação

Ações Rápidas

Salas Recentes

Guia de Integração

Conecte sua aplicação ao RoomStream WebSocket

Início Rápido

Antes de começar, crie uma aplicação em para obter sua APP Key.

1. Instalação

Instale o cliente Socket.IO no seu projeto:

npm
npm install socket.io-client
yarn
yarn add socket.io-client
pnpm
pnpm add socket.io-client

2. Configuração

URL do Servidor
Namespace /ws/rooms
JavaScript
import { io } from 'socket.io-client';

const socket = io(, {
  auth: {
    appKey: 'SUA_APP_KEY' // Obtida em Aplicações
  },
  transports: ['websocket', 'polling']
});

socket.on('connect', () => {
  console.log('✅ Conectado!', socket.id);
});

socket.on('connect_error', (error) => {
  console.error('❌ Erro de conexão:', error.message);
});

Substitua SUA_APP_KEY pela APP Key obtida em .

3. Métodos de Autenticação

Recomendado Via auth.appKey
{ auth: { appKey: 'app_xxx...' } }
Via Header
{ extraHeaders: { 'x-app-key': 'app_xxx...' } }
Via Query Parameter
'wss://servidor.com/ws/rooms?appKey=app_xxx...'

Eventos de Sala

Evento Direção Descrição
joinRoom Client → Server Entrar em uma sala
joinedRoom Server → Client Confirmação de entrada na sala
leaveRoom Client → Server Sair de uma sala
leftRoom Server → Client Confirmação de saída da sala
getRoomInfo Client → Server Solicitar informações da sala
roomInfo Server → Client Dados da sala solicitada

Eventos de Mensagem

Evento Direção Descrição
emit recomendado Client → Server Emitir evento customizado para a sala
sendMessage alias Client → Server Alias para emit (evento: message)
{event} Server → Broadcast Evento customizado recebido (ex: message, notification)

Sistema de Eventos Dinâmicos

O RoomStream permite emitir eventos com nomes customizados. O campo event define qual evento será disparado para os ouvintes.

  • Default: message
  • Exemplos: notification, typing, reaction

Eventos de Participantes

Evento Direção Descrição
updateParticipantName Client → Server Atualizar nome do participante
participantJoined Server → Broadcast Novo participante entrou na sala
participantLeft Server → Broadcast Participante saiu da sala
participantNameUpdated Server → Broadcast Nome de participante atualizado

Estrutura dos Payloads

joinRoom
socket.emit('joinRoom', {
  roomId: 'room_123456789',
  participantName: 'Meu Nome' // opcional
});
emit (recomendado)
socket.emit('emit', {
  roomId: 'room_123456789',
  message: 'Olá, mundo!',
  event: 'message' // opcional, default: 'message'
});
emit com evento customizado
socket.emit('emit', {
  roomId: 'room_123456789',
  message: 'Usuário está digitando...',
  event: 'typing'
});
Ouvindo eventos
// Ouvir evento 'message' (default)
socket.on('message', (data) => {
  console.log(`[${data.event}] ${data.message}`);
});

// Ouvir evento customizado 'typing'
socket.on('typing', (data) => {
  console.log(`${data.clientId} está digitando...`);
});

Exemplo Completo (JavaScript)

client.js
import { io } from 'socket.io-client';

// Configuração
const APP_KEY = 'SUA_APP_KEY'; // Obtida em Aplicações
const SERVER_URL = ;

// Conectar
const socket = io(SERVER_URL, {
  auth: { appKey: APP_KEY },
  transports: ['websocket', 'polling']
});

// Eventos de conexão
socket.on('connect', () => {
  console.log('✅ Conectado:', socket.id);
  
  // Entrar em uma sala
  socket.emit('joinRoom', {
    roomId: 'room_123456789',
    participantName: 'Usuário Demo'
  });
});

socket.on('connect_error', (error) => {
  console.error('❌ Erro:', error.message);
});

// Eventos de sala
socket.on('joinedRoom', (data) => {
  console.log('🚪 Entrou na sala:', data.room.name);
  console.log('👥 Participantes:', data.participants);
  console.log('💬 Mensagens recentes:', data.recentMessages);
});

// Eventos de mensagem (ouve o evento definido, default: 'message')
socket.on('message', (data) => {
  console.log(`[${data.event}]: ${data.message}`);
});

// Eventos de participantes
socket.on('participantJoined', (data) => {
  console.log(`➡️ ${data.participantName} entrou`);
});

socket.on('participantLeft', (data) => {
  console.log(`⬅️ ${data.participantName} saiu`);
});

// Enviar mensagem (evento customizável)
function sendMessage(roomId, message, event = 'message') {
  socket.emit('emit', { roomId, message, event });
}

// Sair da sala
function leaveRoom(roomId) {
  socket.emit('leaveRoom', { roomId });
}

React Hook

useRoomStream.ts
import { useEffect, useState, useCallback } from 'react';
import { io, Socket } from 'socket.io-client';

export function useRoomStream(appKey: string, serverUrl: string) {
  const [socket, setSocket] = useState<Socket | null>(null);
  const [isConnected, setIsConnected] = useState(false);
  const [messages, setMessages] = useState<any[]>([]);

  useEffect(() => {
    const newSocket = io(serverUrl, {
      auth: { appKey },
      transports: ['websocket', 'polling']
    });

    newSocket.on('connect', () => setIsConnected(true));
    newSocket.on('disconnect', () => setIsConnected(false));
    newSocket.on('message', (data) => {
      setMessages((prev) => [...prev, data]);
    });

    setSocket(newSocket);
    return () => { newSocket.close(); };
  }, [appKey, serverUrl]);

  return { socket, isConnected, messages, joinRoom, sendMessage };
}

Erros Comuns

❌ "Authentication failed" ou "Invalid APP Key"

A APP Key fornecida é inválida ou a aplicação está desativada.

Solução: Verifique se a APP Key está correta em e se a aplicação está ativa.

❌ "Connection timeout" ou "CORS error"

O servidor não está acessível ou há bloqueio de CORS.

Solução: Verifique se a URL do servidor está correta e se o CORS está configurado para aceitar sua origem.

❌ "Room not found"

A sala especificada não existe.

Solução: Crie a sala primeiro via API REST ou verifique o roomId.

❌ Conexão desconecta frequentemente

Problemas de rede ou timeout de inatividade.

Solução: Implemente reconexão automática e adicione handlers de erro.

Debug

Ative o debug do Socket.IO para ver logs detalhados:

Browser Console
localStorage.setItem('debug', 'socket.io-client:*');

Recarregue a página após executar este comando.

Bem-vindo ao RoomStream

Faça login para acessar a plataforma

Perfil Supabase

Informações autenticadas pelo Supabase

ℹ️ Nome derivado automaticamente do Supabase (não editável)

Perfil API Key

Informações editáveis

Este nome será exibido nas salas de chat

🔒 Salva localmente no navegador

Informações de Conexão

Status WebSocket:
Namespace:
Base URL:

Salas

Gerencie e entre nas salas de chat

Total de salas:

Criar Nova Sala

Enviando como:

Tipo de Evento

Selecione ou crie um evento customizado

Atalhos de Teclado

Navegue mais rápido pela plataforma

Navegação

Ir para Dashboard Ctrl+1
Ir para Salas Ctrl+2

Interface

Expandir/Recolher Sidebar Ctrl+B
Abrir Atalhos Ctrl+K
Fechar Modal Esc

Chat

Enviar Mensagem Ctrl+Enter
Focar no Input de Mensagem Ctrl+M

Ações

Conectar/Desconectar WebSocket Ctrl+Q

💡 Use Cmd no macOS ao invés de Ctrl