// Um "catálogo externo" que demora a responder, para os exemplos de tempo // limite e cancelamento. Não é a API da aula 10: é um servidor mínimo com o // módulo node:http, só para controlar a demora. // // npm run servidor-lento (porta 3100) // GET /ficha?atraso=2000 responde depois de 2000 ms // // O terminal registra cada pedido e, principalmente, os que o cliente // abandonou antes da resposta — é por aqui que se vê o cancelamento chegar // do outro lado da rede. import { createServer } from 'node:http'; const PORTA = Number(process.env.PORTA ?? 3100); const servidor = createServer((requisicao, resposta) => { const url = new URL(requisicao.url ?? '/', `http://localhost:${PORTA}`); const atraso = Number(url.searchParams.get('atraso') ?? 2000); const inicio = performance.now(); const rotulo = `${requisicao.method} ${url.pathname}${url.search}`; console.log(`recebido ${rotulo} · content-type: ${requisicao.headers['content-type'] ?? '(nenhum)'}`); const temporizador = setTimeout(() => { resposta.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); resposta.end(JSON.stringify({ fonte: 'catálogo externo', titulo: 'Dom Casmurro', atraso })); console.log(`respondido ${rotulo} · ${Math.round(performance.now() - inicio)} ms`); }, atraso); // O cliente fechou a conexão antes de a resposta sair: o pedido foi abortado. resposta.on('close', () => { if (!resposta.writableFinished) { clearTimeout(temporizador); console.log(`ABANDONADO ${rotulo} · o cliente desistiu aos ${Math.round(performance.now() - inicio)} ms`); } }); }); servidor.listen(PORTA, () => { console.log(`catálogo externo lento em http://localhost:${PORTA}`); });