Criei uma lib que implementa o pattern de Circuit Breaker, Zero-Dependência com Decorators em TypeScript (Open Source)
Olá, pessoal do TabNews!
Queria compartilhar com vocês a evolução de um projeto open-source que estou mantendo: o surge-kit.
A motivação inicial foi simples: eu estava estudando o pattern de Circuit Breaker e decidi me aventurar na construção de uma lib para pôr em prática o meu aprendizado. Cheguei a pesquisar outras soluções para me inspirar, mas as opções existentes (como o opossum) eram muitas vezes "pesadas" demais ou traziam dependências que eu não queria no meu projeto. Decidi criar algo leve, zero-dependência e focado em performance.
Recentemente, foquei em melhorar a DX (Developer Experience) da lib implementando Decorators do TypeScript.
O Desafio Técnico
O maior desafio da versão v0.5.0 foi criar um decorator polimórfico (@UseRelay) que funcionasse tanto em métodos individuais quanto em classes inteiras, mantendo o contexto do this correto e permitindo a injeção de uma instância Singleton opcional.
Além disso, implementei um sistema de Backoff Exponencial para o tempo de recuperação (cooldown). Em vez de tentar reabrir o circuito a cada 30s fixos, o tempo dobra a cada falha consecutiva, poupando recursos da API externa que já está sofrendo.
Exemplo de como ficou a sintaxe:
import { Relay, UseRelay, Fallback } from 'surge-kit';
// Configuração Global (Singleton)
const relay = new Relay({
failureThreshold: 3,
useExponentialBackoff: true
});
Relay.setDefault(relay);
class Service {
@Fallback(error => "Dados em Cache")
@UseRelay() // Usa a instância padrão automaticamente
async fetchData() {
// Se falhar aqui, o Circuit Breaker conta a falha
// e o Fallback retorna o cache.
}
}
O código é 100% TypeScript e coberto por testes com Jest.
Se você curte arquitetura de software, resiliência e código limpo, dê uma olhada no repositório. Feedbacks técnicos e PRs são muito bem-vindos!
Link do Repositório: https://github.com/Dev-Etto/surge-kit