UNPKG

@raiden_network/raiden-cli

Version:

Raiden Light Client standalone app with a REST API via HTTP

98 lines (97 loc) 4.23 kB
"use strict"; 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;