Pular para o conteúdo
⚡ SUPERDB REALTIME

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.

app.superdb.com.br/projects/chat/realtime
Tabelas no projeto
6
schema proj_chat
Tabelas ao vivo
2
na publication supabase_realtime
Validade do token
1h
renove com client.setAuth()
TabelaEstado
messagesao vivoDesativar
reactionsao vivoDesativar
roomsdesligadaAtivar
membersdesligadaAtivar
attachmentsdesligadaAtivar
audit_logdesligadaAtivar
app.superdb.com.br/projects/chat/realtime
1// 1. Token de realtime do projeto: a credencial decide o que chega
2const { token, url } = await fetch('https://auth.superdb.com.br/rt/v1/token', {
3 method: 'POST', headers: { Authorization: `Bearer ${sessao}` },
4}).then((r) => r.json())
5// 2. Conecte no socket com o token
6const client = new RealtimeClient(url, { params: { apikey: token } })
7// 3. Escute as mudanças da tabela
8client.channel('db-changes')
9 .on('postgres_changes', { event: '*', schema: 'proj_chat', table: 'messages' }, mostrar)
10 .subscribe()
11// 4. O token vence em 1h: renove com client.setAuth(novoToken)

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.

⚡ COM O REALTIME-JS

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' })
🇧🇷 BRASIL-FIRST

Realtime para app brasileiro.

💸 Cobrança em real

Fatura em R$: cartão no mensal; PIX, boleto ou cartão no anual. Sem dólar e sem IOF.

🏢 Um projeto por cliente

Quem vende o mesmo app para vários clientes cria um projeto para cada um: o token e os canais privados de um não alcançam os do outro.

💬 Painel e suporte em PT-BR

Painel inteiro em português, com erros e dicas em PT-BR. Suporte humano por chamado, em horário comercial do Brasil.

Pronto pra deixar o app ao vivo?

O realtime já vem no plano Grátis. Sem cartão.