>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
TypeScript

Como testar filtros jq complexos no navegador sem arriscar vazar dados de produção

Quantas vezes você teve que montar uma expressão jq longa às cegas diretamente no terminal? Este é um cenário familiar para muitos: você faz uma requisição à API, recebe uma parede de texto com alguns milhares de linhas, e então pressiona repetidamente a seta para cima no console, adicionando pipes, seletores e slices. Cometeu um erro em um colchete — o terminal cospe um erro ou um array vazio.

O primeiro pensamento em tal situação é abrir algum formatador online. Mas se você está trabalhando com logs de produção, respostas de pagamento ou dados pessoais de usuários, colá-los em um site aleatório dos resultados de busca não é uma opção.

A equipe de desenvolvimento do jq resolveu esse problema nativamente lançando um sandbox oficial chamado playground. O código-fonte está disponível no GitHub sob a licença MIT, e uma versão funcional está acessível em play.jqlang.org.

O que é

O projeto é um shell web interativo para trabalhar com jq. No lado esquerdo da tela você cola o JSON fonte ou puxa via URL, você escreve o filtro no topo, e na direita você obtém instantaneamente o resultado da transformação.

A principal característica aqui está sob o capô. Todo o parsing e execução de filtros acontecem localmente na sua máquina. O serviço não envia seu corpo JSON para um servidor remoto.

Isso foi possível graças à porta jq-wasm — o código C original do utilitário foi compilado para WebAssembly. Como resultado, o navegador executa transformações pesadas de forma independente, sem dependências nativas do lado do sistema operacional.

Como o sandbox é útil na prática

Ao contrário de dezenas de serviços sem nome de origem duvidosa, esta ferramenta resolve várias tarefas aplicadas de uma vez.

Primeiro, privacidade por padrão. Como o processador roda dentro do WebAssembly diretamente no cliente, você pode fazer upload seguro de dumps de bancos de dados internos, configurações de infraestrutura ou dumps de API para o sandbox. Requisições de rede só acontecem quando você mesmo cola uma URL externa para carregar JSON.

Segundo, compartilhamento conveniente de snippets. Quando você precisa mostrar a um colega como analisar corretamente uma resposta torta de um serviço de terceiros, basta pressionar o botão Share. O servidor salvará o código do filtro e gerará um link curto. O destinatário do link terá os cálculos executados localmente no navegador dele novamente.

Terceiro, uma interface responsiva. Graças à ausência de overhead de rede para enviar dados de um lado para outro, o resultado é recalculado em tempo real conforme você digita o filtro. Para depurar construções complicadas como walk(), descidas recursivas ou funções personalizadas, isso economiza muito tempo.

Quarto, o sandbox pode ser implantado dentro do seu próprio perímetro. Se sua empresa opera em um segmento fechado sem acesso à internet, o projeto pode ser facilmente iniciado localmente ou em um servidor interno da equipe.

Por dentro: arquitetura e stack

O sandbox é escrito em TypeScript usando Next.js. A estrutura da aplicação é extremamente concisa:

  • Frontend em React com um editor de código e integração com jq-wasm.
  • Banco de dados PostgreSQL, que é necessário exclusivamente para armazenar snippets compartilhados.
  • Endpoint de API do lado do servidor (POST /api/jq) que executa requisições no backend através de um pool de workers.

Um detalhe interessante no código-fonte: o pool de workers do lado do servidor para /api/jq é fortemente acoplado à RAM disponível na instância. Como instâncias WebAssembly em Node.js são intensivas em memória, a aplicação calcula automaticamente o limite de threads baseado na quantidade de RAM. Por exemplo, em uma instância com 512 MB de memória, exatamente 2 threads paralelas serão iniciadas, e a fila máxima será de 40 tarefas.

Se necessário, esses parâmetros podem ser sobrescritos via variáveis de ambiente:

# Максимальное число параллельных потоков jq
JQ_POOL_MAX_THREADS=4

# Максимальный размер очереди запросов
JQ_POOL_MAX_QUEUE=80

Se a fila transbordar, a API retorna honestamente o status HTTP 429 Too Many Requests, protegendo o serviço de crash devido a Out of Memory.

Como fazer deploy do projeto localmente

Se você não quer usar hospedagem pública ou precisa da sua própria instância dentro de uma rede corporativa, a inicialização levará alguns minutos.

Você vai precisar do Node.js versão 14 ou superior e Docker (para o banco de dados).

Clone o repositório:

git clone https://github.com/jqlang/playground
cd playground

A forma mais rápida para desenvolvimento local e testes é executar o Docker Compose pronto, que vai iniciar a aplicação junto com uma instância PostgreSQL local:

docker compose up

Após a inicialização, abra seu navegador em http://localhost:3000.

Para construir uma versão de produção sem containers, comandos padrão são suficientes:

npm run build
npm run start

A única variável de ambiente necessária para produção é DATABASE_URL com a string de conexão do PostgreSQL. Se a funcionalidade de geração de link não for necessária, as outras configurações podem ser deixadas em seus padrões.

Para quem é útil

O projeto vale a pena favoritar para qualquer pessoa que lida frequentemente com código de infraestrutura, logs no Kubernetes, pipelines de CI/CD ou APIs REST complexas.

O sandbox elimina a necessidade de escrever scripts bash improvisados só para verificar a sintaxe de uma única linha de filtro. E a capacidade de iniciar sua própria instância em dois comandos o torna um excelente candidato para adicionar ao toolkit interno de uma equipe de desenvolvimento.

Projetos relacionados