raiden-ts
Version:
Raiden Light Client Typescript/Javascript SDK
61 lines • 3.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transferProcessedSendEpic = exports.transferProcessedReceivedEpic = void 0;
const operators_1 = require("rxjs/operators");
const actions_1 = require("../../messages/actions");
const types_1 = require("../../messages/types");
const utils_1 = require("../../messages/utils");
const actions_2 = require("../../utils/actions");
const types_2 = require("../../utils/types");
const actions_3 = require("../actions");
const state_1 = require("../state");
const utils_2 = require("../utils");
/**
* Handles receiving a signed Processed for some sent LockedTransfer, Unlock or LockExpired
* This will persist the Processed reply in transfer state and stop message retry
*
* @param action$ - Observable of messageReceived actions
* @param state$ - Observable of RaidenStates
* @returns Observable of transfer*Processed|transfer.success actions
*/
function transferProcessedReceivedEpic(action$, state$) {
return action$.pipe((0, operators_1.filter)((0, utils_1.isMessageReceivedOfType)((0, types_2.Signed)(types_1.Processed))), (0, operators_1.withLatestFrom)(state$), (0, operators_1.mergeMap)(function* ([action, { transfers }]) {
for (const transferState of Object.values(transfers)) {
if (transferState.direction !== state_1.Direction.SENT ||
transferState.partner !== action.meta.address)
continue;
const meta = { secrethash: transferState.secrethash, direction: state_1.Direction.SENT };
if (action.payload.message.message_identifier.eq(transferState.transfer.message_identifier)) {
yield (0, actions_3.transferProcessed)({ message: action.payload.message }, meta);
}
if (action.payload.message.message_identifier.eq(transferState.unlock?.message_identifier ?? -1)) {
// Unlock's Processed also notifies whole transfer as success
yield actions_3.transfer.success({ balanceProof: (0, utils_1.getBalanceProofFromEnvelopeMessage)(transferState.unlock) }, meta);
yield (0, actions_3.transferUnlockProcessed)({ message: action.payload.message }, meta);
}
if (action.payload.message.message_identifier.eq(transferState.expired?.message_identifier ?? -1)) {
yield (0, actions_3.transferExpireProcessed)({ message: action.payload.message }, meta);
}
}
}));
}
exports.transferProcessedReceivedEpic = transferProcessedReceivedEpic;
/**
* Handles sending Processed for a received EnvelopeMessages
*
* @param action$ - Observable of transferProcessed actions
* @param state$ - Observable of RaidenStates
* @param deps - Epics dependencies
* @param deps.db - Database instance
* @returns Observable of messageSend.request actions
*/
function transferProcessedSendEpic(action$, state$, { db }) {
return action$.pipe((0, operators_1.filter)((0, actions_2.isActionOf)([actions_3.transferProcessed, actions_3.transferUnlockProcessed, actions_3.transferExpireProcessed])),
// transfer direction is RECEIVED, not message direction (which is outbound)
(0, operators_1.filter)((action) => action.meta.direction === state_1.Direction.RECEIVED), (0, operators_1.withLatestFrom)(state$), (0, operators_1.mergeMap)(([action, state]) => (0, utils_2.getTransfer)(state, db, action.meta).then((transferState) => [action, transferState])), (0, operators_1.map)(([action, transferState]) => actions_1.messageSend.request(action.payload, {
address: transferState.partner,
msgId: action.payload.message.message_identifier.toString(),
})));
}
exports.transferProcessedSendEpic = transferProcessedSendEpic;
//# sourceMappingURL=processed.js.map