raiden-ts
Version:
Raiden Light Client Typescript/Javascript SDK
30 lines • 2.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transferAutoExpireEpic = void 0;
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const error_1 = require("../../utils/error");
const rx_1 = require("../../utils/rx");
const actions_1 = require("../actions");
const state_1 = require("../state");
/**
* Process newBlocks, emits transferExpire.request (request to compose&sign LockExpired for a
* transfer) if pending transfer's lock expired and transfer didn't unlock (succeed) in time
* Also, emits transfer.failure, to notify users that a transfer has failed (although it'll only be
* considered as completed with fail once the transferExpireProcessed arrives).
*
* @param action$ - Observable of newBlock|transferExpire.success|transferExpire.failure actions
* @param state$ - Observable of RaidenStates
* @param deps - Epics dependencies
* @param deps.config$ - Config observable
* @returns Observable of transferExpire.request|transfer.failure actions
*/
function transferAutoExpireEpic({}, state$, { config$ }) {
const transferIsGone$ = ({ key }) => state$.pipe((0, operators_1.filter)(({ transfers }) => !(key in transfers)));
return state$.pipe((0, operators_1.pluck)('transfers'), (0, operators_1.mergeMap)((transfers) => Object.values(transfers)), (0, operators_1.filter)(({ direction }) => direction === state_1.Direction.SENT), (0, operators_1.groupBy)(({ _id }) => _id, { duration: transferIsGone$ }), (0, operators_1.mergeMap)((grouped$) => grouped$.pipe((0, operators_1.withLatestFrom)(config$), (0, operators_1.exhaustMap)(([{ expiration, transfer: locked }, { httpTimeout }]) => {
const meta = { secrethash: locked.lock.secrethash, direction: state_1.Direction.SENT };
return (0, rxjs_1.timer)(new Date((expiration + 1) * 1e3)).pipe((0, operators_1.mergeMapTo)((0, rxjs_1.timer)(httpTimeout).pipe((0, operators_1.mapTo)(actions_1.transferExpire.request(undefined, meta)), (0, operators_1.startWith)(actions_1.transfer.failure(new error_1.RaidenError(error_1.ErrorCodes.XFER_EXPIRED, { expiration }), meta)))));
}), (0, operators_1.takeUntil)(grouped$.pipe((0, operators_1.filter)((t) => !!(t.unlock || t.expired || t.secretRegistered || t.channelClosed)), (0, operators_1.mergeWith)(transferIsGone$(grouped$)))), (0, rx_1.completeWith)(state$))));
}
exports.transferAutoExpireEpic = transferAutoExpireEpic;
//# sourceMappingURL=expire.js.map