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

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

Carregando publicação patrocinada...