Realtime nativo
sobre Postgres.
Subscriptions a postgres_changes, presença multi-usuário e broadcast de eventos efêmeros — tudo num único WebSocket. O mesmo servidor de realtime do Supabase, com o cliente @supabase/realtime-js.
Ligue o realtime tabela por tabela.
No painel, você escolhe quais tabelas entram ao vivo e copia o código de conexão do projeto.
| Tabela | Estado | |
|---|---|---|
| messages | ao vivo | Desativar |
| reactions | ao vivo | Desativar |
| rooms | desligada | Ativar |
| members | desligada | Ativar |
| attachments | desligada | Ativar |
| audit_log | desligada | Ativar |
O que tem dentro.
O que o servidor de realtime entrega para o seu app.
postgres_changes
INSERT, UPDATE e DELETE das tabelas que você ligar, com filtro por coluna. Cada inscrito recebe só as linhas que ele leria pela API: o realtime segue a RLS da tabela.
Presença
Quem está online no canal, com o estado que cada cliente publica: digitando, em qual tela, onde está o cursor.
Broadcast
Mensagens entre clientes que não passam pelo banco: indicador de digitação, cursor, reação.
Canal privado do projeto
Com private: true e o nome começando por proj_<projeto>:, só entra no canal quem tem token do seu projeto.
Token de 1 hora
Sai de /rt/v1/token com a sessão do usuário ou com a anon key. Renove com setAuth antes de vencer e ao entrar ou sair da conta.
Liga no painel
Você escolhe quais tabelas entram ao vivo. Um clique liga, outro desliga; tabela que ninguém ligou não sai pelo realtime.
Reconexão
O realtime-js reconecta sozinho. O que mudou durante a queda não é reenviado: ao voltar, busque o estado atual pela API.
Lê o log do Postgres
As mudanças saem do log de replicação do banco (WAL), sem trigger na sua tabela.
WSS na porta 443
O socket usa a mesma porta do HTTPS.
Compatível com Supabase
Mesma API do @supabase/realtime-js: .on('postgres_changes') e .subscribe(). Você minta o token em /rt/v1/token e conecta no socket.
Subscriba a um canal
com o realtime-js.
Você minta o token de realtime em /rt/v1/token com a sessão do usuário e conecta com @supabase/realtime-js. O realtime segue o RLS da tabela: cada inscrito recebe só as linhas que ele leria pela API. Os métodos .on('postgres_changes'), .on('presence') e .on('broadcast') funcionam exatamente igual.
Você combina os três tipos de evento no mesmo canal — mudanças de tabela, sincronização de presença e broadcasts efêmeros — num único WebSocket.
import { createClient } from '@superdb/client'
import { RealtimeClient } from '@supabase/realtime-js'
const db = createClient('https://auth.superdb.com.br', anonKey, { project: 'chat' })
// 1. Minta o token de realtime com a sessão: o RLS decide o que chega
const sessao = await db.auth.getDataPlaneToken()
const res = await fetch('https://auth.superdb.com.br/rt/v1/token', {
method: 'POST',
headers: { Authorization: `Bearer ${sessao}` }
})
const { token, url } = await res.json()
// 2. Conecta no socket com o token mintado
const rt = new RealtimeClient(url, {
params: { apikey: token }
})
// canal PRIVADO com o nome do projeto: só entra quem tem token do proj_chat
const channel = rt.channel('proj_chat:sala-1', { config: { private: true } })
.on('postgres_changes',
{ event: 'INSERT', schema: 'proj_chat', table: 'messages' },
(payload) => addToUI(payload.new)
)
.on('presence', { event: 'sync' }, () => {
const online = Object.keys(channel.presenceState()).length
setOnline(online)
})
.on('broadcast', { event: 'typing' }, ({ payload }) => {
showTyping(payload.user_id)
})
.subscribe()
await channel.track({ nome: 'Maria' })
Realtime para app brasileiro.
Pronto pra deixar o app ao vivo?
O realtime já vem no plano Grátis. Sem cartão.