From 3d60cc0e6a85372b5c9e269e0a9f540bd9e2fec6 Mon Sep 17 00:00:00 2001 From: Alex Ruzenhack Date: Thu, 5 Sep 2024 16:41:37 +0100 Subject: [PATCH 1/6] feat: add safeEffect as a saga helper --- src/sagas/helpers.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/sagas/helpers.js b/src/sagas/helpers.js index b95350e65..1f24e232c 100644 --- a/src/sagas/helpers.js +++ b/src/sagas/helpers.js @@ -353,3 +353,23 @@ export function* retryHandler(retryAction, dismissAction) { return retry != null; } + +/** + * A wrapper effect to catch unexpected error and provide a binding + * for the desired handling behavior. + * + * @param {Object} effect The targeted effect. + * @param {(error) => void} onError The error handling effect, + * which receives the error object as first argument. + * + * @returns An anonymous effect. + */ +export function safeEffect(effect, onError) { + return function* (payload) { + try { + yield call(effect, payload); + } catch (error) { + yield call(onError, error); + } + } +} From 0f05c95836a711c26a13474abec9eb6ee3612fb9 Mon Sep 17 00:00:00 2001 From: Alex Ruzenhack Date: Thu, 5 Sep 2024 16:42:24 +0100 Subject: [PATCH 2/6] feat: wrap registerNanoContract effect on safeEffect --- src/sagas/nanoContract.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/sagas/nanoContract.js b/src/sagas/nanoContract.js index 46615029a..d8fae9875 100644 --- a/src/sagas/nanoContract.js +++ b/src/sagas/nanoContract.js @@ -36,7 +36,7 @@ import { import { logger } from '../logger'; import { NANO_CONTRACT_TX_HISTORY_SIZE } from '../constants'; import { consumeGenerator, getNanoContractFeatureToggle } from '../utils'; -import { getRegisteredNanoContracts } from './helpers'; +import { getRegisteredNanoContracts, safeEffect } from './helpers'; import { isWalletServiceEnabled } from './wallet'; const log = logger('nano-contract-saga'); @@ -158,6 +158,16 @@ export function* registerNanoContract({ payload }) { // emit action NANOCONTRACT_REGISTER_SUCCESS with feedback to user yield put(nanoContractRegisterSuccess({ entryKey: ncId, entryValue: nc, hasFeedback: true })); } +/** + * Effect invoked by safeEffect if an unexpected error occurs. + * + * @param {Object} error The error captured. + */ +function* registerNanoContractOnError(error) { + log.error('Unexpected error while registering Nano Contract.', error); + yield put(nanoContractRegisterFailure(failureMessage.blueprintInfoFailure)); + yield put(onExceptionCaptured(new Error(failureMessage.nanoContractFailure), false)); +} /** * @typedef {Object} RawNcTxHistory @@ -440,7 +450,7 @@ export function* requestBlueprintInfo({ payload }) { export function* saga() { yield all([ debounce(500, [[types.START_WALLET_SUCCESS, types.NANOCONTRACT_INIT]], init), - takeEvery(types.NANOCONTRACT_REGISTER_REQUEST, registerNanoContract), + takeEvery(types.NANOCONTRACT_REGISTER_REQUEST, safeEffect(registerNanoContract, registerNanoContractOnError)), takeEvery(types.NANOCONTRACT_HISTORY_REQUEST, requestHistoryNanoContract), takeEvery(types.NANOCONTRACT_UNREGISTER_REQUEST, unregisterNanoContract), takeEvery(types.NANOCONTRACT_ADDRESS_CHANGE_REQUEST, requestNanoContractAddressChange), From 81a46daa6686b3e89717da1b412d4aa78680877a Mon Sep 17 00:00:00 2001 From: Alex Ruzenhack Date: Thu, 5 Sep 2024 16:54:35 +0100 Subject: [PATCH 3/6] lint: comply with rules --- src/sagas/helpers.js | 3 ++- src/sagas/nanoContract.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/sagas/helpers.js b/src/sagas/helpers.js index 1f24e232c..5905eb24d 100644 --- a/src/sagas/helpers.js +++ b/src/sagas/helpers.js @@ -361,10 +361,11 @@ export function* retryHandler(retryAction, dismissAction) { * @param {Object} effect The targeted effect. * @param {(error) => void} onError The error handling effect, * which receives the error object as first argument. - * + * * @returns An anonymous effect. */ export function safeEffect(effect, onError) { + // eslint-disable-next-line func-names return function* (payload) { try { yield call(effect, payload); diff --git a/src/sagas/nanoContract.js b/src/sagas/nanoContract.js index d8fae9875..b09ebdb5c 100644 --- a/src/sagas/nanoContract.js +++ b/src/sagas/nanoContract.js @@ -450,7 +450,10 @@ export function* requestBlueprintInfo({ payload }) { export function* saga() { yield all([ debounce(500, [[types.START_WALLET_SUCCESS, types.NANOCONTRACT_INIT]], init), - takeEvery(types.NANOCONTRACT_REGISTER_REQUEST, safeEffect(registerNanoContract, registerNanoContractOnError)), + takeEvery( + types.NANOCONTRACT_REGISTER_REQUEST, + safeEffect(registerNanoContract, registerNanoContractOnError) + ), takeEvery(types.NANOCONTRACT_HISTORY_REQUEST, requestHistoryNanoContract), takeEvery(types.NANOCONTRACT_UNREGISTER_REQUEST, unregisterNanoContract), takeEvery(types.NANOCONTRACT_ADDRESS_CHANGE_REQUEST, requestNanoContractAddressChange), From d9ce444b4449f923079c76e36a2e405629900cc9 Mon Sep 17 00:00:00 2001 From: Alex Ruzenhack Date: Thu, 5 Sep 2024 16:58:46 +0100 Subject: [PATCH 4/6] chore: change error object to received error --- src/sagas/nanoContract.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sagas/nanoContract.js b/src/sagas/nanoContract.js index b09ebdb5c..43f3b826a 100644 --- a/src/sagas/nanoContract.js +++ b/src/sagas/nanoContract.js @@ -166,7 +166,7 @@ export function* registerNanoContract({ payload }) { function* registerNanoContractOnError(error) { log.error('Unexpected error while registering Nano Contract.', error); yield put(nanoContractRegisterFailure(failureMessage.blueprintInfoFailure)); - yield put(onExceptionCaptured(new Error(failureMessage.nanoContractFailure), false)); + yield put(onExceptionCaptured(error, false)); } /** From b405bbe9ab8c9a0dbe0e5b98f3a9c094125f603e Mon Sep 17 00:00:00 2001 From: Alex Ruzenhack Date: Tue, 10 Sep 2024 14:51:26 +0100 Subject: [PATCH 5/6] fix: use correct failure message --- src/sagas/nanoContract.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sagas/nanoContract.js b/src/sagas/nanoContract.js index 43f3b826a..369fceced 100644 --- a/src/sagas/nanoContract.js +++ b/src/sagas/nanoContract.js @@ -165,7 +165,7 @@ export function* registerNanoContract({ payload }) { */ function* registerNanoContractOnError(error) { log.error('Unexpected error while registering Nano Contract.', error); - yield put(nanoContractRegisterFailure(failureMessage.blueprintInfoFailure)); + yield put(nanoContractRegisterFailure(failureMessage.nanoContractFailure)); yield put(onExceptionCaptured(error, false)); } From 611e63f7fc110837f07d3c182e24ae422cfe87b7 Mon Sep 17 00:00:00 2001 From: Alex Ruzenhack Date: Tue, 10 Sep 2024 14:54:15 +0100 Subject: [PATCH 6/6] refactor: give a name to _safeEffect function --- src/sagas/helpers.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sagas/helpers.js b/src/sagas/helpers.js index 5905eb24d..63f7710be 100644 --- a/src/sagas/helpers.js +++ b/src/sagas/helpers.js @@ -365,8 +365,7 @@ export function* retryHandler(retryAction, dismissAction) { * @returns An anonymous effect. */ export function safeEffect(effect, onError) { - // eslint-disable-next-line func-names - return function* (payload) { + return function* _safeEffect(payload) { try { yield call(effect, payload); } catch (error) {