Estágio 01 · CAPSTONE-fundamentos
LockedAo final do Fundamentos você implementou pequenos exercícios isolados (LRU cache, MyPromise, mygit, mini-shell, etc). O capstone integra tudo num projeto único de produção-grade simplificado: um servidor HTTP/1.1 que vai do TCP cru até resposta a clientes reais como curl e wrk.
O que ele força você a integrar:
accept() em loop, gestão de muitas conexões.Result-like.Este é o projeto que distingue fundamentos sólidos de decoração.
Implementar HTTP/1.1 (RFC 9112) com:
METHOD SP path SP HTTP/1.1 CRLFCRLF CRLFContent-Length ou Transfer-Encoding: chunkedHTTP/1.1 <code> <reason> CRLFContent-Length correto ou chunked)Connection: keep-alive (default em HTTP/1.1)Connection: close fecha após response.200, 201, 204, 301, 304, 400, 401, 403, 404, 405, 408, 409, 411, 413, 414, 416, 429, 500, 501, 503.Use uma state machine pra parser:
IDLE → READING_REQUEST_LINE → READING_HEADERS → READING_BODY → DISPATCH → WRITING_RESPONSE → IDLE
↓
ERROR → close
Cada conexão TCP é uma instância dessa state machine. Múltiplas conexões coexistem (lembre-se: Node é single-thread + event loop, você gerencia muitas via epoll indiretamente).
import { createServer } from './my-http-server'createServer({ port, routes, ... }).listen()GET /users/:id, POST /orders.req.params.id.req.query.foo.app.use((req, res, next) => { ... next(); })If-None-Match (ETag) → 304.{"ts":"...","method":"GET","path":"/x","status":200,"latency_ms":3,"ip":"..."}
SIGTERM → para de aceitar novas conexões, espera in-flight terminarem (timeout configurável), depois exit.--port 3000--max-connections 1000--keep-alive-timeout-ms 5000431 Request Header Fields Too Large.413 Payload Too Large.Content-Length E Transfer-Encoding. Validar chunks.node:http, http2, node:fetch, express, fastify, hono, libs de parser HTTP (llhttp, http-parser-js).node:net (sockets TCP), node:stream, node:url, node:fs, node:crypto (pra ETag), node:os.Testes obrigatórios (Vitest ou Jest):
curl http://localhost:3000/x, retorna corretamente status, headers, body.wrk -t4 -c100 -d10s http://localhost:3000/static/file.txt mantém 0 erros e responde >5k req/s no seu hardware (alvo razoável).Content-Length mentindo, chunked malformed, header gigante, devem ser rejeitados sem crash.Pra o capstone passar, você precisa demonstrar:
curl -v http://localhost:3000/... retorna respostas corretas, com headers HTTP/1.1 conformes.wrk -t4 -c100 -d10s sem erros, com latência p99 < 50ms em respostas estáticas pequenas.wrk com connection: keep-alive reutiliza conexões, você consegue provar isso com tcpdump/ss ou logs.\r\n\r\n final, você fecha a conexão após timeout.kill -TERM <pid> durante load test não causa erros nas in-flight requests.O mentor vai fazer code review profundo, focando em:
Você precisa explicar verbalmente cada decisão arquitetural. Se você não souber justificar uma linha, é sinal que copiou, falha o portão.
Cumprindo o threshold, você pode ir além:
node:tls). Aprende handshake na prática.Upgrade: websocket, frames.Content-Encoding: gzip ou br), usa node:zlib./metrics em formato Prometheus).node:cluster) pra usar múltiplos cores.Não há prazo. Mas se você quer um esqueleto mental:
net.createServer ecoando bytes.Quando esse capstone passar, você construiu de verdade um servidor HTTP funcional. Você nunca mais vai ler http.createServer((req,res)=>...) da mesma forma, vai ver o parser, o keep-alive, o backpressure, o graceful shutdown que estão por baixo.
Esse é também o fundamento pro próximo capstone (Plataforma, Logística v1), onde a aplicação vai usar HTTP via libs maduras, mas você já saberá o que cada coisa significa.