Skip to content

Fallback manual (código)

Implemente fallback manualmente sem arquivo de configuração.

Exemplo básico

typescript
import { createSender } from "@jcsolutions/sender";

async function sendWithFallback(phone: string, message: string) {
  const providers = [
    { 
      name: "ombala", 
      config: { 
        token: process.env.OMBALA_TOKEN, 
        baseUrl: "https://api.useombala.ao/v1", 
        from: "LEVAJA" 
      } 
    },
    { 
      name: "kambasms", 
      config: { 
        token: process.env.KAMBASMS_TOKEN, 
        baseUrl: "https://api.kambasms.ao/v1" 
      } 
    },
  ];

  for (const provider of providers) {
    try {
      console.log(`📤 Tentando com ${provider.name}...`);
      const sms = await createSender(provider.name, provider.config);
      const result = await sms.send({ to: phone, message });
      
      console.log(`✅ Enviado com ${provider.name}! ID: ${result.messageId}`);
      return { success: true, provider: provider.name, result };
    } catch (error) {
      console.log(`⚠️ Falha com ${provider.name}:`, error.message);
    }
  }

  console.log("❌ Todos os providers falharam");
  return { success: false };
}

Uso

typescript
const result = await sendWithFallback("923000000", "Mensagem importante!");

if (result.success) {
  console.log(`Mensagem enviada via ${result.provider}`);
} else {
  console.log("Falha ao enviar mensagem");
}

Com retorno do último erro

typescript
async function sendWithFallbackDetailed(phone: string, message: string) {
  const providers = [
    { name: "ombala", config: { token: process.env.OMBALA_TOKEN, baseUrl: "https://api.useombala.ao/v1", from: "LEVAJA" } },
    { name: "kambasms", config: { token: process.env.KAMBASMS_TOKEN, baseUrl: "https://api.kambasms.ao/v1" } },
  ];

  let lastError: Error | null = null;

  for (const provider of providers) {
    try {
      const sms = await createSender(provider.name, provider.config);
      const result = await sms.send({ to: phone, message });
      return { success: true, provider: provider.name, result };
    } catch (error) {
      lastError = error as Error;
      console.log(`⚠️ ${provider.name} falhou:`, error.message);
    }
  }

  return { success: false, error: lastError };
}

Com fallback condicional

typescript
async function sendWithConditionalFallback(phone: string, message: string) {
  // Tenta Ombala primeiro
  try {
    const ombala = await createSender("ombala", {
      token: process.env.OMBALA_TOKEN,
      baseUrl: "https://api.useombala.ao/v1",
      from: "LEVAJA",
    });
    
    const result = await ombala.send({ to: phone, message });
    console.log("✅ Enviado via Ombala");
    return result;
  } catch (error) {
    console.log("⚠️ Ombala falhou, tentando KambaSMS...");
  }

  // Fallback para KambaSMS
  const kambasms = await createSender("kambasms", {
    token: process.env.KAMBASMS_TOKEN,
    baseUrl: "https://api.kambasms.ao/v1",
  });
  
  const result = await kambasms.send({ to: phone, message });
  console.log("✅ Enviado via KambaSMS (fallback)");
  return result;
}

Quando usar fallback manual

CenárioRecomendação
Configuração simplesUsar fallback automático no sender.config.ts
Lógica condicional complexaUsar fallback manual
Testes específicosUsar fallback manual
Integração com sistemas legadosUsar fallback manual

Próximo exemplo

MIT License