@raiden_network/raiden-cli
Version:
Raiden Light Client standalone app with a REST API via HTTP
98 lines (97 loc) • 4.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.makePaymentsRouter = void 0;
const express_1 = require("express");
const raiden_ts_1 = require("raiden-ts");
const validation_1 = require("../utils/validation");
var ApiPaymentEvent;
(function (ApiPaymentEvent) {
ApiPaymentEvent["sent"] = "EventPaymentSentSuccess";
ApiPaymentEvent["received"] = "EventPaymentReceivedSuccess";
})(ApiPaymentEvent || (ApiPaymentEvent = {}));
function transformSdkTransferToApiPayment(transfer) {
// TODO: The payment object representation of the API spec is not clear
// enough. We need to clarify this and agree on a single representation.
return {
event: ApiPaymentEvent[transfer.direction],
initiator: transfer.initiator,
target: transfer.target,
token_address: transfer.token,
amount: transfer.value.toString(),
identifier: transfer.paymentId.toString(),
secret: transfer.secret ?? '',
secret_hash: transfer.secrethash,
log_time: transfer.startedAt.toISOString().slice(0, 23),
};
}
function isTransferConflictError(error) {
return [
raiden_ts_1.ErrorCodes.PFS_INVALID_INFO,
raiden_ts_1.ErrorCodes.PFS_NO_ROUTES_FOUND,
raiden_ts_1.ErrorCodes.PFS_ERROR_RESPONSE,
raiden_ts_1.ErrorCodes.PFS_DISABLED,
raiden_ts_1.ErrorCodes.PFS_UNKNOWN_TOKEN_NETWORK,
raiden_ts_1.ErrorCodes.PFS_TARGET_OFFLINE,
raiden_ts_1.ErrorCodes.PFS_TARGET_NO_RECEIVE,
raiden_ts_1.ErrorCodes.PFS_LAST_IOU_REQUEST_FAILED,
raiden_ts_1.ErrorCodes.PFS_IOU_SIGNATURE_MISMATCH,
raiden_ts_1.ErrorCodes.PFS_NO_ROUTES_BETWEEN_NODES,
// PFS errors are passed through by the SDK, so we need to test literally
'There is no user found online for given address.',
].includes(error.message);
}
function getPayments(request, response) {
let filter;
if (request.params.tokenAddress) {
filter = { token: request.params.tokenAddress };
if (request.params.endAddress)
filter['end'] = request.params.endAddress;
}
this.raiden
.getTransfers(filter, (0, validation_1.queryAsNumbers)(request.query))
.then((transfers) => transfers.map(transformSdkTransferToApiPayment))
.then((r) => response.json(r), (e) => {
this.log.error(e);
response.status(400).send(e);
});
}
async function doTransfer(request, response, next) {
try {
const transferKey = await this.raiden.transfer(request.params.tokenAddress, request.params.targetAddress, request.body.amount.toString(), {
...request.body,
paymentId: request.body.identifier?.toString(),
lockTimeout: request.body.lock_timeout,
});
const transfer = await this.raiden.waitTransfer(transferKey);
response.send(transformSdkTransferToApiPayment(transfer));
}
catch (error) {
if ((0, validation_1.isInvalidParameterError)(error)) {
response.status(400).send(error.message);
}
else if ((0, validation_1.isInsuficientFundsError)(error)) {
response.status(402).send(error.message);
}
else if ((0, validation_1.isTransferFailedError)(error)) {
response.status(409).send(error.message);
}
else if (isTransferConflictError(error)) {
response.status(409).json({ message: error.message, details: error.details });
}
else {
next(error);
}
}
}
/**
* @param this - Cli object
* @returns Router instance
*/
function makePaymentsRouter() {
const router = (0, express_1.Router)();
// end is either initiator (for received transfers) or target (for sent)
router.get('/:tokenAddress?/:endAddress?', validation_1.validateOptionalAddressParameter.bind('tokenAddress'), validation_1.validateOptionalAddressParameter.bind('endAddress'), getPayments.bind(this));
router.post('/:tokenAddress/:targetAddress', validation_1.validateAddressParameter.bind('tokenAddress'), validation_1.validateAddressParameter.bind('targetAddress'), doTransfer.bind(this));
return router;
}
exports.makePaymentsRouter = makePaymentsRouter;