Como eu mandei milhares de requisições para a API do TabNews sem querer 😅
Primeiramente meu ultimo post chegou no "top 3" na aba dos posts relevantes, agradeço a todos que votaram!
Como já detelhei, a CLI que estou construindo foi feita utilizando o React, com a biblioteca Ink, (em breve farei um post sobre ela). E umas das funcionalidades que implementei foi a de fazer login:
Quando o usuário faz login, a sessão é salva em um arquivo json. Toda fez que ele entra na CLI, é possivel ver a quantidade de tabcoins e tabcash.
Para obter esses dados, estou fazendo da seguinte forma:
const [token, setToken] = useState<string | null>(null)
const { data: userData } = useSWR(
token ? "/user" : null,
(url: string) =>
request(
`https://www.tabnews.com.br/api/v1${url}`,
{
headers: {
"cookie": `session_id=${token}`
}
}
)
.then(res => res.body.json())
.then(data => data)
)
const [loadingUser, setLoadingUser] = useState(userData != undefined)
useEffect(() => {
readFile("session.json")
.then(async data => {
const dataJSON = JSON.parse(data.toString())
setToken(dataJSON.token)
})
.catch(() => setLoadingUser(false))
}, [])
Estou utilizando a biblioteca swr junto com a undici para fazer as requisições. Dentro do useEffect
(quem manja de React deve saber o que é, mas de maneira bem resumida para quem não sabe, a função passada para ela é executada sempre que o aplicativo abre), é lido o arquivo que armazena a sessão, logo após isso o token é salvo em um state, que faz com que a requisição para obter os dados do usuário seja executada.
Mas enquanto eu estava implementando isso, tudo isso (a leitura do arquivo, a requisição e a mudança de estados) estava aconteçendo dentro do useEffect
(não fiz commit disso, ent n vou ter o código completo de cm estava), ent creio que por conta de uma mistura de um bug do ink, junto com a grande quantidade de mudanças de estado que estavam ocorrendo, o componente estava sendo renderizado repetidamente, o que resultava nessa função ser chamada várias vezes, e em uma grande quantidade de requests (cerca de 1600 por minuto). E consequntemente, no bloqueio do meu IP (cm eu ainda não sabia do que estava aconteçendo, abri uma issue).
Foram tantas requisições que o Filipe até mandou um email perguntando o que havia acontecido:
É isso, não sei dizer detalhadamente oque aconteceu, mas creio que agora não irá acontecer de novo.
E Filipe, mais uma vez, obrigado pela compreensão e perdão pelo transtorno 😅
Digam ai, já tiveram algum problema parecido?