<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rafael Góes</title>
    <description>The latest articles on DEV Community by Rafael Góes (@rafael_ges_e03329a04a6bc).</description>
    <link>https://dev.to/rafael_ges_e03329a04a6bc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3831335%2Ff1009483-ad4c-41dc-94b4-e027f1ee3fbc.jpg</url>
      <title>DEV Community: Rafael Góes</title>
      <link>https://dev.to/rafael_ges_e03329a04a6bc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rafael_ges_e03329a04a6bc"/>
    <language>en</language>
    <item>
      <title>Criei um SDK para tornar apps React Native mais resilientes a conexões ruins</title>
      <dc:creator>Rafael Góes</dc:creator>
      <pubDate>Tue, 22 Sep 2026 20:46:54 +0000</pubDate>
      <link>https://dev.to/rafael_ges_e03329a04a6bc/criei-um-sdk-para-tornar-apps-react-native-mais-resilientes-a-conexoes-ruins-34lb</link>
      <guid>https://dev.to/rafael_ges_e03329a04a6bc/criei-um-sdk-para-tornar-apps-react-native-mais-resilientes-a-conexoes-ruins-34lb</guid>
      <description>&lt;p&gt;Um aplicativo mobile não precisa estar completamente offline para se tornar praticamente inutilizável.&lt;/p&gt;

&lt;p&gt;Às vezes o dispositivo está tecnicamente conectado à internet, mas a conexão está extremamente lenta, instável ou sofrendo perdas constantes.&lt;/p&gt;

&lt;p&gt;E é aí que começam os problemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requisições entram em timeout;&lt;/li&gt;
&lt;li&gt;telas ficam carregando indefinidamente;&lt;/li&gt;
&lt;li&gt;usuários tentam executar a mesma ação várias vezes;&lt;/li&gt;
&lt;li&gt;operações podem ser duplicadas;&lt;/li&gt;
&lt;li&gt;o aplicativo não sabe se deve tentar novamente, esperar ou simplesmente falhar;&lt;/li&gt;
&lt;li&gt;e, no final, o usuário fecha o app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grande parte das bibliotecas de conectividade responde muito bem a uma pergunta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O dispositivo está online ou offline?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mas, em aplicações mobile reais, isso nem sempre é suficiente.&lt;/p&gt;

&lt;p&gt;Foi pensando nisso que comecei a desenvolver o &lt;strong&gt;NetResilience SDK&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o NetResilience?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;NetResilience&lt;/strong&gt; é um SDK open source para React Native focado em tornar a comunicação HTTP mais resiliente em condições de internet ruim.&lt;/p&gt;

&lt;p&gt;Em vez de tratar a conectividade apenas como &lt;code&gt;online&lt;/code&gt; ou &lt;code&gt;offline&lt;/code&gt;, o SDK tenta entender a qualidade real da conexão.&lt;/p&gt;

&lt;p&gt;Atualmente, a rede pode ser classificada como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;EXCELLENT&lt;/span&gt;
&lt;span class="nx"&gt;MODERATE&lt;/span&gt;
&lt;span class="nx"&gt;POOR&lt;/span&gt;
&lt;span class="nx"&gt;OFFLINE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir disso, a aplicação pode decidir como cada requisição deve se comportar.&lt;/p&gt;

&lt;p&gt;Uma requisição pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ser executada imediatamente;&lt;/li&gt;
&lt;li&gt;ser armazenada localmente;&lt;/li&gt;
&lt;li&gt;entrar em uma fila;&lt;/li&gt;
&lt;li&gt;ser tentada novamente;&lt;/li&gt;
&lt;li&gt;aguardar uma conexão melhor;&lt;/li&gt;
&lt;li&gt;ou ser rejeitada conforme sua política de resiliência.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A ideia básica
&lt;/h2&gt;

&lt;p&gt;Imagine que um usuário esteja criando um pedido enquanto utiliza uma conexão móvel instável.&lt;/p&gt;

&lt;p&gt;Normalmente teríamos algo parecido com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/orders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a conexão falhar no momento errado, a aplicação precisa decidir o que fazer.&lt;/p&gt;

&lt;p&gt;Com o NetResilience, esse comportamento pode ser definido explicitamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/orders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;resilience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;queueOnNetworkError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;safety&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IDEMPOTENCY_PROTECTED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HIGH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a requisição não puder ser enviada com segurança naquele momento, ela pode ser persistida no dispositivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;queued&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;showMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pedido salvo no dispositivo e aguardando conexão.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando a conectividade melhorar, o SDK pode tentar sincronizar automaticamente as operações pendentes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fila persistente de requisições
&lt;/h2&gt;

&lt;p&gt;Uma das partes mais importantes do projeto é a fila de requisições.&lt;/p&gt;

&lt;p&gt;O NetResilience possui suporte a armazenamento persistente utilizando &lt;code&gt;expo-sqlite&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;SQLite&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expo-sqlite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ExpoSQLiteQueueStorage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;NetResilienceClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@netresilience/react-native&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SQLite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openDatabaseAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;netresilience.db&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NetResilienceClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExpoSQLiteQueueStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

  &lt;span class="na"&gt;authProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite que operações pendentes sobrevivam mesmo se o aplicativo for fechado ou reiniciado.&lt;/p&gt;

&lt;p&gt;Ou seja, a fila não existe apenas em memória.&lt;/p&gt;




&lt;h2&gt;
  
  
  Autenticação também virou um problema interessante
&lt;/h2&gt;

&lt;p&gt;Quando começamos a persistir requisições HTTP localmente, aparece uma preocupação importante:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;segurança.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não é uma boa ideia armazenar tokens de autenticação diretamente junto com as requisições pendentes.&lt;/p&gt;

&lt;p&gt;Por isso, o NetResilience remove informações sensíveis antes de persistir as operações.&lt;/p&gt;

&lt;p&gt;No momento da sincronização, o SDK solicita novamente um token atualizado através do &lt;code&gt;authProvider&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;authProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentToken&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso também evita um problema comum:&lt;/p&gt;

&lt;p&gt;uma requisição ficar horas na fila e depois tentar ser enviada utilizando um token expirado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Estratégia de retry
&lt;/h2&gt;

&lt;p&gt;Tentar novamente imediatamente várias vezes não é exatamente resiliência.&lt;/p&gt;

&lt;p&gt;Na prática, isso pode apenas aumentar o problema.&lt;/p&gt;

&lt;p&gt;Imagine centenas ou milhares de dispositivos tentando atingir uma API repetidamente durante uma instabilidade.&lt;/p&gt;

&lt;p&gt;Por isso, o SDK utiliza uma estratégia de:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;exponential backoff + jitter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;De forma simplificada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;requisição falha

↓
espera

retry

↓
espera mais tempo

retry

↓
conexão melhora

sincronização acontece
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;jitter&lt;/code&gt; adiciona pequenas variações ao tempo de espera.&lt;/p&gt;

&lt;p&gt;Isso ajuda a evitar que milhares de clientes tentem novamente exatamente no mesmo momento.&lt;/p&gt;

&lt;p&gt;Esse problema é conhecido como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thundering Herd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Idempotência é extremamente importante
&lt;/h2&gt;

&lt;p&gt;Retries podem se tornar perigosos quando estamos lidando com operações como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pagamentos;&lt;/li&gt;
&lt;li&gt;criação de pedidos;&lt;/li&gt;
&lt;li&gt;reservas;&lt;/li&gt;
&lt;li&gt;transferências;&lt;/li&gt;
&lt;li&gt;alteração de saldo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine o seguinte cenário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /payments

↓

servidor processa o pagamento

↓

conexão cai antes da resposta chegar ao aplicativo

↓

aplicativo entende que ocorreu erro

↓

requisição é enviada novamente
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;/p&gt;

&lt;p&gt;o pagamento pode ser processado duas vezes.&lt;/p&gt;

&lt;p&gt;Por isso, o NetResilience permite marcar determinadas operações como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;safety&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IDEMPOTENCY_PROTECTED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessas operações, o SDK pode gerar e reutilizar uma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Idempotency-Key
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;durante os retries.&lt;/p&gt;

&lt;p&gt;Mas existe uma regra importante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O backend também precisa implementar idempotência.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O SDK não consegue transformar automaticamente uma API não idempotente em uma API segura.&lt;/p&gt;




&lt;h2&gt;
  
  
  Qualidade da conexão
&lt;/h2&gt;

&lt;p&gt;Outro objetivo do projeto é não depender exclusivamente da informação fornecida pelo sistema operacional.&lt;/p&gt;

&lt;p&gt;Ter Wi-Fi conectado não significa necessariamente ter uma boa conexão com a API.&lt;/p&gt;

&lt;p&gt;Por isso, o SDK pode aprender com o tráfego HTTP real da aplicação.&lt;/p&gt;

&lt;p&gt;Algumas informações podem ser observadas, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latência;&lt;/li&gt;
&lt;li&gt;falhas;&lt;/li&gt;
&lt;li&gt;timeouts;&lt;/li&gt;
&lt;li&gt;quantidade de bytes transferidos;&lt;/li&gt;
&lt;li&gt;estabilidade das requisições.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também é possível realizar probes HTTP opcionais.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startProbing&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://probe.example.com/health&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;stableIntervalMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;poorIntervalMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia é utilizar essas informações para construir uma visão mais realista da conectividade do dispositivo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nem toda requisição deve entrar em uma fila
&lt;/h2&gt;

&lt;p&gt;Esse foi outro ponto importante durante o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Não faria sentido simplesmente armazenar qualquer requisição que falhasse.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /restaurants
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Provavelmente não precisa ser executada horas depois.&lt;/p&gt;

&lt;p&gt;Mas algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /orders
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pode precisar.&lt;/p&gt;

&lt;p&gt;Por isso, o comportamento é definido por requisição.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;resilience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;queueOnNetworkError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HIGH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite que a aplicação tenha políticas diferentes dependendo da importância da operação.&lt;/p&gt;




&lt;h2&gt;
  
  
  Onde esse tipo de SDK pode ser útil?
&lt;/h2&gt;

&lt;p&gt;A ideia do NetResilience não é simplesmente detectar se existe internet.&lt;/p&gt;

&lt;p&gt;O objetivo é criar uma camada entre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Aplicação
    ↓
NetResilience
    ↓
HTTP
    ↓
Backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;capaz de tomar decisões melhores quando a rede estiver instável.&lt;/p&gt;

&lt;p&gt;Esse tipo de abordagem pode ser útil principalmente em aplicações como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mobilidade urbana;&lt;/li&gt;
&lt;li&gt;delivery;&lt;/li&gt;
&lt;li&gt;logística;&lt;/li&gt;
&lt;li&gt;sistemas de campo;&lt;/li&gt;
&lt;li&gt;aplicativos financeiros;&lt;/li&gt;
&lt;li&gt;sistemas utilizados em regiões com cobertura móvel limitada;&lt;/li&gt;
&lt;li&gt;aplicativos que precisam continuar funcionando mesmo com internet instável.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em muitos desses cenários, o problema não é estar totalmente offline.&lt;/p&gt;

&lt;p&gt;O problema é ter uma conexão que existe, mas que não é confiável.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que resolvi tornar o projeto open source?
&lt;/h2&gt;

&lt;p&gt;O NetResilience ainda está em desenvolvimento.&lt;/p&gt;

&lt;p&gt;Algumas decisões de arquitetura provavelmente vão evoluir conforme novos cenários forem testados.&lt;/p&gt;

&lt;p&gt;E foi justamente por isso que resolvi deixar o projeto &lt;strong&gt;open source&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Acredito que esse tipo de problema pode ser melhor resolvido com a participação de outros desenvolvedores.&lt;/p&gt;

&lt;p&gt;Existem vários cenários que uma única pessoa dificilmente consegue testar sozinha:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;diferentes dispositivos;&lt;/li&gt;
&lt;li&gt;diferentes versões do Android e iOS;&lt;/li&gt;
&lt;li&gt;conexões móveis instáveis;&lt;/li&gt;
&lt;li&gt;redes congestionadas;&lt;/li&gt;
&lt;li&gt;APIs com comportamentos diferentes;&lt;/li&gt;
&lt;li&gt;aplicações com milhares de requisições;&lt;/li&gt;
&lt;li&gt;diferentes estratégias de sincronização.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quanto mais cenários reais forem testados, mais robusto o SDK pode se tornar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quer contribuir?
&lt;/h2&gt;

&lt;p&gt;Se você trabalha com React Native, redes, sistemas distribuídos, backend ou simplesmente achou a ideia interessante, &lt;strong&gt;contribuições são muito bem-vindas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você pode ajudar de várias formas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sugerindo melhorias;&lt;/li&gt;
&lt;li&gt;abrindo Issues;&lt;/li&gt;
&lt;li&gt;reportando bugs;&lt;/li&gt;
&lt;li&gt;propondo novas funcionalidades;&lt;/li&gt;
&lt;li&gt;melhorando a documentação;&lt;/li&gt;
&lt;li&gt;criando testes;&lt;/li&gt;
&lt;li&gt;analisando a arquitetura;&lt;/li&gt;
&lt;li&gt;enviando Pull Requests;&lt;/li&gt;
&lt;li&gt;compartilhando experiências reais com conexões instáveis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também tenho interesse em receber feedback principalmente sobre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;arquitetura da fila;&lt;/li&gt;
&lt;li&gt;estratégias de retry;&lt;/li&gt;
&lt;li&gt;detecção da qualidade da rede;&lt;/li&gt;
&lt;li&gt;idempotência;&lt;/li&gt;
&lt;li&gt;sincronização;&lt;/li&gt;
&lt;li&gt;performance;&lt;/li&gt;
&lt;li&gt;experiência da API do SDK.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Repositório
&lt;/h2&gt;

&lt;p&gt;O projeto está disponível no GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rafaelgoesti/netresilience-sdk" rel="noopener noreferrer"&gt;https://github.com/rafaelgoesti/netresilience-sdk&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se quiser contribuir com o desenvolvimento, fique à vontade para abrir uma &lt;strong&gt;Issue&lt;/strong&gt; ou enviar um &lt;strong&gt;Pull Request&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E se você gostar da ideia, deixar uma ⭐ no repositório também ajuda bastante a dar visibilidade ao projeto.&lt;/p&gt;

&lt;p&gt;A ideia é fazer o NetResilience crescer como um projeto realmente construído com a comunidade.&lt;/p&gt;

&lt;p&gt;🚀&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>typescript</category>
      <category>opensource</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
