Criei um SDK para tornar apps React Native mais resilientes a conexões ruins
Um aplicativo mobile não precisa estar completamente offline para se tornar praticamente inutilizável. Às vezes o dispositivo está tecnicamente conectado à internet, mas a conexão está extremamente lenta, instável ou sofrendo perdas constantes. E é aí que começam os problemas: requisições entram em timeout; telas ficam carregando indefinidamente; usuários tentam executar a mesma ação várias…
A criação de um SDK, chamado NetResilience, visa tornar os aplicativos React Native mais resilientes a conexões de internet ruins. Em vez de apenas considerar um dispositivo online ou offline, o SDK analisa a qualidade real da conexão. Com base nessa análise, a aplicação pode decidir como cada requisição deve ser tratada. A operação pode ser executada imediatamente, armazenada localmente, colocada em uma fila, repetida novamente ou rejeitada de acordo com uma política de resiliência.
Para demonstrar, imagine um usuário criando um pedido enquanto tem uma conexão móvel instável. Normalmente, o código poderia ser assim: await api.post('/orders', order); No entanto, com o NetResilience, o comportamento pode ser definido explicitamente. O código ficaria: const result = await net.post('/orders', order, { resilience: { queue: true, queueOnNetworkError: true, safety: IDEMPOTENCY_PROTECTED, priority: HIGH, } }); Se a requisição não puder ser enviada com segurança nesse momento, ela pode ser persistida no dispositivo. Se a conexão melhorar, o SDK pode sincronizar automaticamente as operações pendentes.
Uma parte importante do projeto é a fila de requisições. O NetResilience possui suporte para armazenamento persistente usando expo-sqlite. As operações pendentes sobrevivem mesmo se o aplicativo for fechado ou reiniciado, e a fila não existe apenas em memória. A autenticação também é tratada de forma interessante, um token de autenticação não é armazenado junto com as requisições pendentes para evitar problemas de segurança. Em vez disso, o SDK solicita um token atualizado através de um authProvider quando necessário.
O SDK utiliza uma estratégia de retry baseada em exponential backoff + jitter. Isso significa que, ao contrário de tentar várias vezes imediatamente, o SDK espera e, em seguida, tente novamente, com o tempo de espera aumentando e pequenas variações para evitar problemas. Além disso, é importante garantir a idempotência em operações críticas como pagamentos, criação de pedidos, reservas e transferências. Se uma operação não for idempotente, o backend também precisa ser implementado adequadamente para garantir a segurança.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.