UNPKG

raiden-ts

Version:

Raiden Light Client Typescript/Javascript SDK

86 lines 4.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transferRetryMessageEpic = void 0; const rxjs_1 = require("rxjs"); const operators_1 = require("rxjs/operators"); const config_1 = require("../../config"); const actions_1 = require("../../messages/actions"); const actions_2 = require("../../utils/actions"); const rx_1 = require("../../utils/rx"); const actions_3 = require("../actions"); const state_1 = require("../state"); const utils_1 = require("../utils"); const utils_2 = require("./utils"); /** * Retry sending protocol messages until stop conditions are met. * * @param action$ - Observable of transferExpire.success actions * @param state$ - Observable of RaidenStates * @param deps - Epics dependencies * @param deps.config$ - Config observable * @returns Observable of messageSend.request actions */ function transferRetryMessageEpic(action$, state$, { config$ }) { return action$.pipe((0, operators_1.filter)((0, actions_2.isActionOf)([ actions_3.transferSigned, actions_3.transferUnlock.success, actions_3.transferExpire.success, actions_3.transferSecretRequest, actions_3.transferSecretReveal, ])), (0, operators_1.withLatestFrom)(state$, config$), (0, operators_1.mergeMap)(([action, state, { revealTimeout }]) => { const transfer = state.transfers[(0, utils_1.transferKey)(action.meta)]; const transfer$ = state$.pipe((0, rx_1.pluckDistinct)('transfers', (0, utils_1.transferKey)(action.meta))); let to; let viaUserId; let stop$; switch (action.type) { case actions_3.transferSigned.type: if (action.meta.direction === state_1.Direction.SENT) { to = action.payload.partner; viaUserId = action.payload.userId; stop$ = transfer$.pipe((0, operators_1.filter)((transfer) => !!(transfer.transferProcessed || transfer.unlockProcessed || // unlock|expired shouldn't happen before transferProcessed transfer.expiredProcessed || transfer.channelClosed))); } break; case actions_3.transferUnlock.success.type: if (action.meta.direction === state_1.Direction.SENT) { to = action.payload.partner; viaUserId = action.payload.userId; stop$ = transfer$.pipe((0, operators_1.filter)((transfer) => !!(transfer.unlockProcessed || transfer.channelClosed))); } break; case actions_3.transferExpire.success.type: if (action.meta.direction === state_1.Direction.SENT) { to = action.payload.partner; stop$ = transfer$.pipe((0, operators_1.filter)((transfer) => !!(transfer.expiredProcessed || transfer.channelClosed))); } break; case actions_3.transferSecretRequest.type: if (action.meta.direction === state_1.Direction.RECEIVED && transfer) { to = transfer.transfer.initiator; viaUserId = action.payload.userId; stop$ = transfer$.pipe((0, operators_1.filter)((transfer) => /* transfer.secret would be enough, but let's test secretReveal to possibly retry * failed RevealSecret sign prompts */ !!(transfer.secretReveal || transfer.channelClosed)), // or when we get inside the danger zone (0, operators_1.mergeWith)((0, rxjs_1.timer)(new Date((transfer.expiration - revealTimeout) * 1e3)))); } break; case actions_3.transferSecretReveal.type: if (action.meta.direction === state_1.Direction.RECEIVED && transfer) { to = transfer.partner; viaUserId = action.payload.userId; stop$ = transfer$.pipe((0, operators_1.filter)((transfer) => !!(transfer.unlock || transfer.channelClosed))); } break; } if (!to || !stop$) return rxjs_1.EMPTY; return (0, utils_2.retrySendUntil$)(actions_1.messageSend.request({ message: action.payload.message, userId: viaUserId }, { address: to, msgId: action.payload.message.message_identifier.toString() }), action$, stop$, (0, config_1.intervalFromConfig)(config$)); })); } exports.transferRetryMessageEpic = transferRetryMessageEpic; //# sourceMappingURL=retry.js.map