O Browser4j possui um sistema de cache persistente, inteligente e isolado por perfil, projetado para reduzir o consumo de banda e acelerar o carregamento de páginas repetitivas através da intercepção nativa do Chromium (JCEF).
O gerenciador de cache é acessado diretamente pela instância do Browser:
import balbucio.browser4j.cache.api.CacheManager;
CacheManager cm = browser.cache();O sistema utiliza três componentes coordenados para garantir eficiência e performance:
CacheIndex(Metadados): Utiliza SQLite para indexar metadados de cada recurso (URL, hash do conteúdo, tipo MIME, status HTTP, expiração e headers originais).CacheStorage(Arquivos): Armazena o conteúdo físico no disco usando o hash SHA-256 do conteúdo como nome do arquivo.- Deduplicação: Se o mesmo arquivo (ex: uma biblioteca jQuery ou fonte comum) for baixado de URLs diferentes ou em perfis diferentes, ele será armazenado apenas uma vez no disco.
- Compressão GZIP: Recursos de texto (HTML, JS, CSS, JSON) acima de 5KB são compactados automaticamente, reduzindo o uso de disco em até 70%.
CachePolicyEngine(Inteligência): Decide o que deve ser cacheado e por quanto tempo, respeitando headers HTTP (Cache-Control,Expires) e utilizando heurísticas para recursos sem política definida.
- Cache HIT Instantâneo: Recursos cacheados são servidos diretamente do disco via
CachedResourceHandler, ignorando totalmente a latência de rede. - Captura via Proxy: Quando ocorre um "MISS", o sistema utiliza um proxy de rede interno para baixar e simultaneamente armazenar o recurso, garantindo que a próxima visita seja um "HIT".
- Isolamento por Perfil: O diretório de cache é localizado dentro da pasta do perfil (
<profileDir>/cache/), garantindo isolamento total de dados entre usuários. - Filtros de Sensibilidade: O motor nunca armazena recursos que contenham headers sensíveis, como
AuthorizationouSet-Cookie, para evitar vazamento de sessões. - Exclusão de Binários Gigantes: Por padrão, o cache ignora fluxos de vídeo/áudio e arquivos multipart para não esgotar o limite de disco rapidamente.
Você pode monitorar a eficiência do sistema em tempo real:
import balbucio.browser4j.cache.model.CacheStats;
CacheStats stats = browser.cache().getStats();
System.out.println("Espaço em disco: " + (stats.getTotalSize() / 1024 / 1024) + " MB");
System.out.println("Taxa de sucesso (Hits): " + stats.getHits());Embora o sistema seja 100% automatizado, a API permite controle manual:
// Limpar todo o cache do perfil atual (limpa SQLite e arquivos)
browser.cache().clearAll();
// Invalida uma entrada específica
browser.cache().invalidate("https://cdn.example.com/logo.png");A configuração é definida via CacheConfig no momento da criação da instância:
maxCacheSizeBytes: Limite de armazenamento (ex: 1GB). Ao atingir o limite, o sistema remove itens via algoritmo LRU (Least Recently Used).enabled: Feature flag para ligar/desligar todo o módulo de cache.compressionThresholdBytes: Tamanho mínimo para disparar a compressão GZIP (Padrão: 5KB).