raiden-ts
Version:
Raiden Light Client Typescript/Javascript SDK
86 lines • 4.63 kB
JavaScript
;
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