From eb1dba8c70c1e5298b3eda9da9de411a52870529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Abadesso?= Date: Wed, 3 Jul 2024 10:30:35 -0300 Subject: [PATCH] refactor: rootSaga now restarts failed sagas and sends errors to sentry --- src/sagas/index.js | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/sagas/index.js b/src/sagas/index.js index 9506ad358..a5ca376eb 100644 --- a/src/sagas/index.js +++ b/src/sagas/index.js @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import { all, fork } from 'redux-saga/effects'; +import { all, call, put, spawn } from 'redux-saga/effects'; import { saga as walletSagas } from './wallet'; import { saga as tokensSagas } from './tokens'; import { saga as pushNotificationSaga } from './pushNotification'; @@ -15,23 +15,35 @@ import { saga as permissionsSagas } from './permissions'; import { saga as walletConnectSagas } from './walletConnect'; import { saga as networkSettingsSagas } from './networkSettings'; import { saga as nanoContractSagas } from './nanoContract'; +import { logger } from '../logger'; +import { onExceptionCaptured } from '../actions'; -const sagas = [ - walletSagas, - tokensSagas, - pushNotificationSaga, - networkSettingsSagas, - errorHandlerSagas, - featureToggleSagas, - permissionsSagas, - walletConnectSagas, - nanoContractSagas, -]; +function* rootSaga() { + const sagas = [ + ['walletSagas', walletSagas], + ['tokensSagas', tokensSagas], + ['pushNotificationSaga', pushNotificationSaga], + ['networkSettingsSagas', networkSettingsSagas], + ['errorHandlerSagas', errorHandlerSagas], + ['featureToggleSagas', featureToggleSagas], + ['permissionsSagas', permissionsSagas], + ['walletConnectSagas', walletConnectSagas], + ['nanoContractSagas', nanoContractSagas], + ]; -function* defaultSaga() { - yield all( - sagas.map((saga) => fork(saga)) - ); + yield all(sagas.map(([name, saga]) => spawn(function* supervisor() { + while (true) { + try { + logger('rootSaga').debug(`Starting saga: ${name}`); + yield call(saga) + break + } catch (e) { + // TODO: We should have a retry strategy, e.g. if the wallet saga restarts + // more than 3 times, we should restart the app and yield a fatal exception + yield put(onExceptionCaptured(e, false)); + } + } + }))); } -export default defaultSaga; +export default rootSaga;