npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@crawly/proxy

v1.0.0

Published

Proxy loader/parser

Downloads

29

Readme

@crawly/grasshopper-lib-proxy

Está biblioteca tem como objetivo gerenciar as configurações de proxy utilizadas nos projetos.

Utilização

Instalação

npm install @crawly/proxy

Valores padrão

Os valores abaixo são hardcoded, mas podem ser sobrescritos conforme a necessidade.

  • PROXY_LIST: nome da variável de ambiente para a lista de proxies;
  • PROXY_TUNNEL: nome da variável de ambiente para a configuração tunnel;
  • PROXY_DYNAMIC: nome da variável de ambiente que deverá conter a URL para requisição em proxies obtidas de forma dinamica;

Como funciona

A biblioteca segue o padrão Builder, adicionando as configurações ao contexto, e ao chamar o método .getInstance() é retornada a proxy atual.

import { ProxyBuilder } from '@crawly/proxy';

const proxy = await (new ProxyBuilder())
  .withProxyList()
  .withRandomToken()
  .withRandomInstance()
  .getInstance();

Utilizando com uma variável de ambiente customizada

Para utilizar uma variável de ambiente diferente de PROXY_LIST, basta fazer uma chamada ao método .withKey(key: string) informando o nome da nova variável de ambiente.

const proxy = await (new ProxyBuilder())
  .withKey('PROXY_LIST_GOL')
  .withProxyList()
  .withRandomToken()
  .withRandomInstance()
  .getInstance();

Utilizando com uma lista de proxies pré-definida

Para utilizar uma lista de proxies, sobrescrevendo a configuração da variável de ambiente PROXY_LIST, basta informar as proxies desejadas na chamada do método .withProxyList(proxies). O parâmetro deve ser uma string separada por vírgulas, semelhante ao formato utilizado para a variável de ambiente.

const proxyList = 'http://proxy1.com:2222'
  + ',http://proxy2.com:3333'
  + ',http://proxy3.com:5555'
  + ',http://proxy4.com:2289';

const proxy = await (new ProxyBuilder())
  .withProxyList(proxyList)
  .withRandomToken()
  .withRandomInstance()
  .getInstance();

Utilizando proxy com configuração dinâmica

A configuração dinâmica consiste em fazer uma requisição a um endpoint pré-definido, que deverá retornar um objeto contendo as informações: username, password, hostname, port.

Para utilizar a configuração dinâmica, o valor da variável de ambiente PROXY_LIST precisa estar definido como DYNAMIC. O endpoint a ser requisitado precisa estar definido na variável de ambiente PROXY_DYNAMIC, conforme exemplo abaixo.

PROXY_LIST=DYNAMIC
PROXY_DYNAMIC=http://exemplo.com
const proxy = await (new ProxyBuilder())
  .withProxyList()
  .withRandomToken()
  .withRandomInstance()
  .getInstance();

NOTA: Assim como podemos utilizar uma variável de ambiente diferente para a lista de proxies, podemos utilizar o método .withDynamicKey(key) para redefinir a variável de ambiente que contém o endpoint para a proxy dinâmica.

Obter metadados da instância atual de proxy

Ao utilizar o método .getMetadata(), será retornado um objeto contendo as informações da instancia atual de proxy, conforme exemplo.

const proxyList = `http://sb7257jvigmyz0:[email protected]:2222`;

const proxyData = await (new ProxyBuilder())
  .withProxyList(proxyList)
  .withRandomToken()
  .withRandomInstance()
  .getMetadata();

Retorno:

{
  username: 'sb7257jvigmyz0',
  password: 'sb7257jvigmyz1',
  hostname: 'hostname.com',
  protocol: 'http',
  port: '2222'
}

Sobrescrever o valor da instância atual de proxy

Ver utilização da função proxyOverride.

Métodos

.withKey(key: string): Proxy

Utilizado para redefinir o nome da variável de ambiente a ser utilizada para a lista de proxies.

NOTA: ver utilizando com uma variável de ambiente customizada.

.withDynamicKey(key: string): Proxy

Utilizado para redefinir o nome da variável de ambiente a ser utilizada para a lista de proxies.

const proxy = await (new ProxyBuilder())
  .withKey('PROXY_LIST_GOL')
  .withDynamicKey('PROXY_DYNAMIC_GOL')
  .withProxyList()
  .withRandomToken()
  .withRandomInstance()
  .getInstance();

.withTunnelKey(key: string): Proxy

Utilizado para redefinir o nome da variável de ambiente a ser utilizada para definir se a configuração tunnel estará habilitada nas requisições.

const proxyTunnel = await (new ProxyBuilder())
  .withTunnelKey('PROXY_TUNNEL_GOL')
  .getTunnel();

.withRandomToken(): Proxy

Define o token randômico para ser concatenado ao nome de usuário da proxy atual, conforme a documentação das proxies: É possível adicionar flags ao Username, como -session-<string> para manter sticky ips.

.withProxyList(list?: string): Proxy

Define a lista de proxies que será utilizada. Por padrão, o valor é obtido a partir da variável de ambiente PROXY_LIST, ou utilizando o parametro recebido (string de elementos separados por vírgulas).

A lista de proxies informada por parâmetro, tem maior prioridade sobre a variável de ambiente PROXY_LIST.

.withProxyDynamic(url?: string): Proxy

Define a URL que será utilizada para obter a proxy dinâmica. Por padrão, o valor é obtido a partir da variável de ambiente PROXY_DYNAMIC, ou utilizando o parametro recebido (string).

A URL informada por parâmetro tem maior prioridade sobre a variável de embiente PROXY_DYNAMIC.

.withRandomInstance(): Proxy

Define, de forma randômica, qual item da lista de proxies será utilizada para a instância atual.

.getRandomToken(): string

Retorna o valor do token utilizado pela intancia de proxy atual.

const builder = new ProxyBuilder();
const proxy = await builder
  .withProxyList()
  .withRandomToken()
  .withRandomInstance()
  .getInstance();
const token = builder.getRandomToken();

.getDynamicInstance(): Promise

Retorna uma instância de proxy conforme a requisição feita para um endpoint externo.

Este método é chamado internamente de .getInstance() quando o valor da variável de ambiente PROXY_LIST for igual a DYNAMIC, mas pode ser chamado diretamente.

const proxy = (new ProxyBuilder())
  .getDynamicInstance();

.getInstance(): Promise

Método final do Builder, retorna uma promise com a string final da proxy atual.

const proxy = await (new ProxyBuilder())
  .withProxyList()
  .withRandomInstance()
  .getInstance();

.getTunnel(): boolean | undefined

Retorna o valor atual da variável de ambiente PROXY_TUNNEL, ou variável redefinida pelo método .withTunnelKey(key;

const proxyTunnel = await (new ProxyBuilder())
  .getTunnel();

.getProxyList(): string[]

Retorna a lista de proxies conforme o valor definido na variável de ambiente, ou valor redefinido pelo metódo .withProxyList(list).

const proxyList = await (new ProxyBuilder())
  .withProxyList()
  .getProxyList();

.getMetadata(url?: string): Promise

Método final do Builder, retorna uma promise que contém os dados da instância de proxy atual.

Ver obter metadados da instância atual de proxy.

proxyOverride(event: any): void

Função utilizada para sobrescrever o valor das variáveis de ambiente relacionadas à proxy atual.

Recebe como parametro um objeto, que pode ser um event quando usado com lambda, ou uma request quando usado com express.

A função busca pela variável de ambiente contendo o prefixo PROXY_LIST, se o header contiver uma propriedade correspondente X-PROXY_LIST, o valor da variável de ambiente será redefinido.

Ex.: se existe uma variável de ambiente PROXY_LIST_GOL, a função irá procurar no header a propriedade X-PROXY_LIST_GOL.

// lambda
export const lambda: Handler = async (event: any, context: Context, callback: Callback) => {
  proxyOverride(event);
  ...
}
// express
const searchHandler = async (req: Request, res: Response): Promise<void> => {
  proxyOverride(req);
  ...
}