Estudando nodejs http lib native

HTTP native nodejs module
Olá hoje vamos estudar um pouco sobre o modulo HTTP nativo do nodejs para isso usarei node 21.2.0.
Vamos primeiro começar criando um repositorio para testar nosso codigos.
mkdir lib_http
yarn init -y
# ou
npm init -y
Lembre-se de habilitar o module no package.json
Depois que vc ja criou o repositorio e ja inicializou o projeto, criei um arquivo index.js e vamos codar
Vamos comecar desse ponto da documentacao.
Conseguimos acesso ao codigo fonte pelo seguinte link.
No arquivo index.js importe a lib
import http from 'node:http'
Quando usamos node:lib garatimos que iremos usar a lib nativa do nodejs,
fazendo um resumo a lib http foi projetada para oferecer suporte a muitos
recursos do protocolo que têm sido tradicionalmente difíceis de usar. Em particular, mensagens grandes, possivelmente codificadas em blocos. Tenha
cuidado para nunca armazenar mensagens inteiras em Buffers por que o usuario pode acabar transmitindo dados e prejudicando a memoria do seu processo.
Os cabeçalhos das mensagens HTTP são representados por um objeto como este:
{
'content-length': '123',
'content-type': 'text/plain',
'connection': 'keep-alive',
'host': 'example.com',
'accept': '*/*'
}
Class:http.Agent
Um Agent e responsavel por gerenciar a persistencia e reutilização da conexão para Clientes HTTP. Ele mantem uma fila de solicitações pendentes para um determinado host e porta,
reutilizando uma unica conexão de socket para cada um ate que a fila esteja vazia, momento em que o socket é destruido ou colocado em um pool
onde é mantido para ser usado novamente pela mesma host e porta. Se sera destruido ou agrupado depende do KeepAlive
As conexões em pool têm TCP Keep-Alive habilitado para elas, mas os servidores ainda podem fechar conexões ociosas; nesse caso, elas serão removidas do pool e uma nova conexão será feita quando uma nova solicitação HTTP for feita para esse host e porta. Os servidores também podem se recusar a permitir múltiplas solicitações na mesma conexão; nesse caso, a conexão terá que ser refeita para cada solicitação e não poderá ser agrupada. O Agent ainda fará as solicitações para esse servidor, mas cada uma ocorrerá em uma nova conexão.
Quando uma conexão é fechado pelo cliente ou pelo servidor, ela é removida do pool. QuaisQuer soquetes não utilizados no pool não seram corrigidos para não manter o processo NodeJS em execução quando não houver solicitação pendente. (socket.unref())
É uma boa prática, para destroy()uma Agentinstância quando não estiver mais em uso, porque os soquetes não utilizados consomem recursos do sistema operacional.
Os soquetes são removidos de um agente quando o soquete emite um ‘close’ evento ou um ‘agentRemove’ evento. Ao pretender manter uma solicitação HTTP aberta por um longo período sem mantê-la no agente, algo como o seguinte pode ser feito:
http.get(options, () => {
}).on('socket', (socket) => {
socket.emit('agentRemove')
})