Executando verificação de segurança...
2

Dúvida: JS Functions Pattern ?

Filipe, vejo em varias partes do projeto que vc cria uma funcao e utiliza funcoes helpers, mas as declara no corpo da main function. Primeio pensei que fazia isso para usar clousure ou algo assim, mas em muitos casos vejo essas funcoes nao usam clousures.
Isso eh um pattern ? Algum motivo para isso?

async function checkForTooManyConnections(client) { // Main Function
  const currentTime = new Date().getTime();
  const openedConnectionsMaxAge = 10000;
  const maxConnectionsTolerance = 0.9;

  if (cache.maxConnections === null || cache.reservedConnections === null) {
    const [maxConnections, reservedConnections] = await getConnectionLimits();
    cache.maxConnections = maxConnections;
    cache.reservedConnections = reservedConnections;
  }

  if (
    !cache.openedConnections === null ||
    !cache.openedConnectionsLastUpdate === null ||
    currentTime - cache.openedConnectionsLastUpdate > openedConnectionsMaxAge
  ) {
    const openedConnections = await getOpenedConnections();
    cache.openedConnections = openedConnections;
    cache.openedConnectionsLastUpdate = currentTime;
  }

  if (cache.openedConnections > (cache.maxConnections - cache.reservedConnections) * maxConnectionsTolerance) {
    return true;
  }

  return false;

  async function getConnectionLimits() { // helper Function
    const [maxConnectionsResult, reservedConnectionResult] = await client.query(
      'SHOW max_connections; SHOW superuser_reserved_connections;'
    );
    return [
      maxConnectionsResult.rows[0].max_connections,
      reservedConnectionResult.rows[0].superuser_reserved_connections,
    ];
  }

  async function getOpenedConnections() {  helper Function
    const openConnectionsResult = await client.query({
      text: 'SELECT numbackends as opened_connections FROM pg_stat_database where datname = $1',
      values: [process.env.POSTGRES_DB],
    });
    return openConnectionsResult.rows[0].opened_connections;
  }
}
Carregando publicação patrocinada...
3

Excelente pergunta Carlos! Para quem ficou com dúvida sobre o que é esse código, é um trecho do módulo que controla e administra a conexão com o banco de dados: database.js

E a função checkForTooManyConnections() tenta lidar de uma forma otimizada a quantidade de conexões com o banco de dados dentro de um ambiente serverless.

Isso eh um pattern ?

Não é um pattern, é só uma forma de organização de código.

Nesse caso em específico, as funções getConnectionLimits() e getOpenedConnections() que você anotou ali como helper Function de fato não saem do closure da função principal e são detalhes de implementação que eu queria esconder de dentro da função principal. E analizando agora, eu deveria passar o client para dentro delas, mas tudo bem, elas acabam pegando pelo closure de cima.

Então essas funções conseguem ser acessadas pelo código que está acima delas pelo fato do hoisting do JavaScript, que antes de executar o código, ele move para cima funções declaradas dessa forma (e outras coisas, como a inicialização de variáveis declaradas com var) e isso faz qualquer parte daquele closure ter acesso.

3

Apesar de não ser um pattern, parece um "sotaque" de POO (Programação Orientada a Objetos), onde checkForTooManyConnections seria um método público e getConnectionLimits e getOpenedConnections métodos privados, com client sendo passado para o construtor da classe, que poderia ter o nome de TooManyConnectionsValidator, ou algo parecido.

class TooManyConnectionsValidator() {
  private client;

  constructor() {
    this.client = client;
  }
  
  public checkForTooManyConnections() {
    // ...
  }
  
  private getConnectionLimits() {
    // ...
  }
  
  private getOpenedConnections() {
    // ...
  }
}
0
1