// Laboratório 3 — Tempo limite e cancelamento // Antes, em outro terminal: npm run servidor-lento // Execute: npx tsx praticar/03-tempo-limite.ts // Observe o terminal do servidor: ele registra os pedidos ABANDONADOS. import axios from 'axios'; import { descrever, ms } from '../src/api.js'; const LENTO = 'http://localhost:3100'; // TODO 1: busque a ficha com fetch e desista depois de `limite` ms. async function fichaComFetch(atraso: number, limite: number): Promise { void atraso; void limite; throw new Error('TODO: fichaComFetch'); } // TODO 2: a mesma coisa com axios. async function fichaComAxios(atraso: number, limite: number): Promise { void atraso; void limite; throw new Error('TODO: fichaComAxios'); } for (const [nome, ficha] of [ ['fetch', fichaComFetch], ['axios', fichaComAxios], ] as const) { for (const [atraso, limite] of [ [300, 1000], [1500, 500], ]) { const inicio = performance.now(); try { await ficha(atraso, limite); console.log(`${ms(inicio)} ${nome} atraso ${atraso}, limite ${limite} → respondeu`); } catch (erro) { console.log(`${ms(inicio)} ${nome} atraso ${atraso}, limite ${limite} → ${descrever(erro)}`); } } } // TODO 3: a busca "enquanto digita". Cada letra dispara uma busca nova e a // anterior deixa de interessar. Implemente `digitar` de modo que, ao chegar // uma letra, a busca anterior seja CANCELADA (não apenas ignorada), com um // AbortController guardado fora da função. Cada busca é um // GET ${LENTO}/ficha?atraso=1000&termo=, e deve imprimir o tempo e o // desfecho, como as linhas acima. // Esperado no terminal do servidor: dois pedidos ABANDONADOS e um respondido. async function digitar(termo: string): Promise { void termo; throw new Error('TODO: digitar'); } const letras = ['c', 'cl', 'cla']; await Promise.allSettled( letras.map( (termo, i) => new Promise((resolver) => setTimeout(() => { digitar(termo).finally(resolver); }, i * 150), ), ), ); void axios; void LENTO;