Um evento live
Comece com um evento que muda a UI ou confirma um comando de forma visível.
Fatia realtimeExecute Socket.IO ou gRPC como interface principal enquanto um processo REST separado oferece fallback e documentação AsyncAPI.

const socket = io('http://localhost:3001');
socket.emit('request', {
id: crypto.randomUUID(),
subject: 'tasks.create',
payload: { title: 'Realtime task' },
});
socket.on('response', ({ id, payload }) => {
console.log(id, payload);
});Do zero ao primeiro MVP
Use este caminho quando o primeiro MVP precisa parecer vivo: progresso, colaboração, notificações ou resultados de comando voltando por canal bidirecional.
Escolha o único evento que usuários precisam ver sem refresh, como task.created ou task.statusChanged.
Saída MVP: um canal AsyncAPI e um subject request/response correlacionado.
type Task = { id: string; title: string; categoryId: string; completed: boolean };
type TaskCommand = {
subject: 'tasks.create';
payload: { title: string; categoryId: string };
};
type TaskEvent =
| { subject: 'tasks.ready'; payload: { total: number } }
| { subject: 'tasks.created'; payload: Task };Escopo MVP
Comece com um evento que muda a UI ou confirma um comando de forma visível.
Fatia realtimeMantenha REST disponível para que o primeiro MVP tenha recuperação suportável.
Fatia de confiabilidadeRode realtime e fallback explicitamente com perfis locais ou PM2.
Fatia operacional| Área de prova | Pergunta a responder | Mecanismo Jumentix | Evidência MVP |
|---|---|---|---|
| Correlação | O client relaciona toda resposta ao request? | Message id, contrato de subject, testes do response handler. | Sem efeitos realtime anônimos. |
| Fallback | REST retorna o mesmo resultado quando realtime cai? | Rota fallback e contrato de use-case compartilhado. | Modo degradado continua usável. |
| Operação | O processo pode iniciar, ser inspecionado e reiniciado? | Perfil PM2/runtime e logs. | O MVP é demonstrável fora do terminal de dev. |
Implementação prática
Estes exemplos mantêm Category e Task como vocabulário de produto e mostram controller, contrato, client, worker ou camada de estado necessários para chegar a um MVP executável.
type Task = { id: string; title: string; categoryId: string; completed: boolean };
type Client = { send: (message: string) => void };
const tasks = new Map<string, Task>();
const clients = new Set<Client>();
function broadcast(subject: string, payload: unknown) {
const message = JSON.stringify({ subject, payload });
for (const client of clients) client.send(message);
}
export function connectTaskSocket(client: Client) {
clients.add(client);
client.send(JSON.stringify({ subject: 'tasks.ready', payload: { total: tasks.size } }));
return () => clients.delete(client);
}
export async function handleTaskMessage(message: { subject: string; payload: { title: string; categoryId: string } }) {
if (message.subject !== 'tasks.create') return { ok: false, error: 'unsupported subject' };
const task: Task = {
id: crypto.randomUUID(),
title: message.payload.title,
categoryId: message.payload.categoryId,
completed: false
};
tasks.set(task.id, task);
broadcast('tasks.created', task);
return { ok: true, result: task };
}Continue explorando
Entregue serviços OpenAPI 3.1 com adaptadores HTTP nativos intercambiáveis.
Explore o blueprintExecute Socket.IO ou gRPC ao lado de fallback REST e documentação AsyncAPI.
Explore o blueprintLance um deploy com limites de domínio prontos para virar serviços.
Explore o blueprintMantenha a comunicação entre serviços baseada em contratos com o Message Mediator.
Explore o blueprintCrie produtos frontend que compartilham SDKs gerados e funcionam offline.
Explore o blueprintExplore o código, execute a fábrica localmente e transforme seu próximo serviço Node.js em uma capacidade repetível de plataforma.