diff --git a/backend/controllers/cln/channels.js b/backend/controllers/cln/channels.js index 6fe7283b..4cff1821 100644 --- a/backend/controllers/cln/channels.js +++ b/backend/controllers/cln/channels.js @@ -59,8 +59,8 @@ export const openChannel = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/fundchannel'; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Channel Opened', data: body }); res.status(201).json(body); @@ -76,8 +76,8 @@ export const setChannelFee = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/setchannel'; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updated Channel Policy', data: body }); res.status(201).json(body); @@ -94,7 +94,7 @@ export const closeChannel = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/close'; - options.body = { channelId: req.params.channelId, unilaterlaltimeout: req.query.force ? 1 : null }; + options.form = { channelId: req.params.channelId, unilaterlaltimeout: req.query.force ? 1 : null }; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Channel Closed', data: body }); @@ -149,7 +149,7 @@ export const listForwards = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards'; - options.body = { status: req.query.status || 'settled' }; + options.form = { status: req.query.status || 'settled' }; request.get(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + req.query.status, data: body }); res.status(200).json(!body.forwards ? [] : (req.query.status === 'failed' || req.query.status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse()); @@ -165,10 +165,8 @@ export const funderUpdatePolicy = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/funderupdate'; - // if (req.body && req.body.policy) { - // options.body = req.body; - // } - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Funder Policy Received', data: body }); body.channel_fee_max_base_msat = (body.channel_fee_max_base_msat && typeof body.channel_fee_max_base_msat === 'string' && body.channel_fee_max_base_msat.includes('msat')) ? +body.channel_fee_max_base_msat?.replace('msat', '') : body.channel_fee_max_base_msat; diff --git a/backend/controllers/cln/invoices.js b/backend/controllers/cln/invoices.js index bee29bb4..85dc4293 100644 --- a/backend/controllers/cln/invoices.js +++ b/backend/controllers/cln/invoices.js @@ -11,7 +11,7 @@ export const deleteExpiredInvoice = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/delexpiredinvoice'; - options.body = req.query.maxexpiry ? { maxexpiry: req.query.maxexpiry } : null; + options.form = req.query.maxexpiry ? { maxexpiry: req.query.maxexpiry } : null; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoices Deleted', data: body }); res.status(204).json({ status: 'Invoice Deleted Successfully' }); @@ -26,7 +26,7 @@ export const listInvoices = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.body = req.query.label ? { label: req.query.label } : null; + options.form = req.query.label ? { label: req.query.label } : null; options.url = req.session.selectedNode.ln_server_url + '/v1/listinvoices'; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List URL', data: options.url }); request.post(options).then((body) => { @@ -44,7 +44,7 @@ export const addInvoice = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/invoice'; - options.body = req.body; + options.form = req.body; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Created', data: body }); res.status(201).json(body); diff --git a/backend/controllers/cln/network.js b/backend/controllers/cln/network.js index 851cb5ed..fc034374 100644 --- a/backend/controllers/cln/network.js +++ b/backend/controllers/cln/network.js @@ -11,7 +11,7 @@ export const getRoute = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/getroute'; - options.body = { id: req.params.destPubkey, amount_msat: req.params.amount, riskfactor: (req.query.riskFactor || 0) }; + options.form = { id: req.params.destPubkey, amount_msat: req.params.amount, riskfactor: (req.query.riskFactor || 0) }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Routes Received', data: body }); res.status(200).json({ routes: body }); @@ -27,7 +27,7 @@ export const listChannels = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listchannels'; - options.body = req.params.channelShortId ? { short_channel_id: req.params.channelShortId } : null; + options.form = req.params.channelShortId ? { short_channel_id: req.params.channelShortId } : null; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup Finished', data: body }); res.status(200).json(body); @@ -43,7 +43,7 @@ export const feeRates = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/feerates'; - options.body = req.params.feeRateStyle ? { style: req.params.feeRateStyle } : null; + options.form = req.params.feeRateStyle ? { style: req.params.feeRateStyle } : null; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + req.params.feeRateStyle, data: body }); res.status(200).json(body); @@ -60,7 +60,7 @@ export const listNodes = (req, res, next) => { } const queryStr = req.query.liquidity_ads ? '?liquidity_ads=' + req.query.liquidity_ads : ''; options.url = req.session.selectedNode.ln_server_url + '/v1/listNodes'; - options.body = req.params.id ? { id: req.params.id } : null; + options.form = req.params.id ? { id: req.params.id } : null; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes Finished', data: body }); diff --git a/backend/controllers/cln/offers.js b/backend/controllers/cln/offers.js index 0b0a8e94..ed28265d 100644 --- a/backend/controllers/cln/offers.js +++ b/backend/controllers/cln/offers.js @@ -34,7 +34,7 @@ export const listOffers = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listoffers'; - options.body = { offer_id: (req.query.offer_id) ? req.query.offer_id : null, active_only: !(req.query.active_only === '0' || req.query.active_only === 'false' || !req.query.active_only) }; + options.form = { offer_id: (req.query.offer_id) ? req.query.offer_id : null, active_only: !(req.query.active_only === '0' || req.query.active_only === 'false' || !req.query.active_only) }; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offers List URL', data: options.url }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offers List Received', data: body }); @@ -61,7 +61,7 @@ export const createOffer = (req, res, next) => { req.body.recurrence_limit = (req.body.recurrence_limit) ? req.body.recurrence_limit : null; req.body.single_use = !(req.body.single_use === '0' || req.body.single_use === 'false' || !req.body.single_use); req.body.quantity_min = (req.body.quantity_min) ? req.body.quantity_min : null; - options.body = req.body; + options.form = req.body; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Created', data: body }); res.status(201).json(body); @@ -83,8 +83,8 @@ export const fetchOfferInvoice = (req, res, next) => { req.body.recurrence_start = (req.body.recurrence_start) ? req.body.recurrence_start : null; req.body.recurrence_label = (req.body.recurrence_label) ? req.body.recurrence_label : null; req.body.timeout = (req.body.timeout) ? req.body.timeout : null; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Invoice Received', data: body }); res.status(201).json(body); @@ -100,7 +100,7 @@ export const disableOffer = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/disableOffer'; - options.body = { offer_id: req.params.offerID }; + options.form = { offer_id: req.params.offerID }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Disabled', data: body }); res.status(202).json(body); diff --git a/backend/controllers/cln/onchain.js b/backend/controllers/cln/onchain.js index c1fa04ae..1217e366 100644 --- a/backend/controllers/cln/onchain.js +++ b/backend/controllers/cln/onchain.js @@ -11,7 +11,7 @@ export const getNewAddress = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/newaddr'; - options.body = { addresstype: req.query.type }; + options.form = { addresstype: req.query.type }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body }); res.status(200).json(body); @@ -31,8 +31,8 @@ export const onChainWithdraw = (req, res, next) => { req.body.feeRate = (req.body.feeRate) ? req.body.feeRate : null; req.body.minConf = (req.body.minConf) ? req.body.minConf : null; req.body.utxos = (req.body.utxos) ? req.body.utxos : null; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Withdraw Finished', data: body }); res.status(201).json(body); diff --git a/backend/controllers/cln/payments.js b/backend/controllers/cln/payments.js index 3af64fc1..ec56bc9b 100644 --- a/backend/controllers/cln/payments.js +++ b/backend/controllers/cln/payments.js @@ -70,9 +70,10 @@ export const listPayments = (req, res, next) => { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listsendpays'; - options.body.bolt11 = req.query.invoice || null; - options.body.payment_hash = req.query.payment_hash || null; - options.body.status = req.query.status || null; + req.body.bolt11 = req.query.invoice || null; + req.body.payment_hash = req.query.payment_hash || null; + req.body.status = req.query.status || null; + options.form = req.body; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments }); res.status(200).json(groupBy(body.payments)); @@ -96,7 +97,7 @@ export const postPayment = (req, res, next) => { req.body.retry_for = (req.body.retry_for) ? req.body.retry_for : null; req.body.maxdelay = (req.body.maxdelay) ? req.body.maxdelay : null; req.body.exemptfee = (req.body.exemptfee) ? req.body.exemptfee : null; - options.body = req.body; + options.form = req.body; } else { if (req.body.paymentType === 'OFFER') { @@ -117,7 +118,7 @@ export const postPayment = (req, res, next) => { req.body.exclude = (req.body.exclude) ? req.body.exclude : null; req.body.maxfee = (req.body.maxfee) ? req.body.maxfee : null; req.body.description = (req.body.description) ? req.body.description : null; - options.body = req.body; + options.form = req.body; options.url = req.session.selectedNode.ln_server_url + '/v1/pay'; } request.post(options).then((body) => { diff --git a/backend/controllers/cln/peers.js b/backend/controllers/cln/peers.js index 1cdcb265..bcf71292 100644 --- a/backend/controllers/cln/peers.js +++ b/backend/controllers/cln/peers.js @@ -10,15 +10,19 @@ export const getPeers = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/listPeers'; + options.url = req.session.selectedNode.ln_server_url + '/v1/listpeers'; request.post(options).then((body) => { - body.forEach((peer) => { - if (!peer.alias || peer.alias === '') { - peer.alias = peer.id.substring(0, 20); - } + body.peers.forEach((peer) => { + peer.alias = peer.peer_id.substring(0, 20); + return peer; }); - logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers with Alias Received', data: body }); - res.status(200).json(body || []); + // Promise.all(body.peers.map((peer) => getAliasForPeer(peer))).then((peerList) => { + // logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers with Alias Received', data: body }); + // res.status(200).json(peerList || []); + // }).catch((errRes) => { + // const err = common.handleError(errRes, 'Peers', 'List Peers Alias Error', req.session.selectedNode); + // return res.status(err.statusCode).json({ message: err.message, error: err.error }); + // }); }).catch((errRes) => { const err = common.handleError(errRes, 'Peers', 'List Peers Error', req.session.selectedNode); return res.status(err.statusCode).json({ message: err.message, error: err.error }); @@ -30,11 +34,11 @@ export const postPeer = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/connect'; - options.body = req.body; + options.url = req.session.selectedNode.ln_server_url + '/v1/connect'; + options.form = req.body; request.post(options).then((connectRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: connectRes }); - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/listPeers'; + options.url = req.session.selectedNode.ln_server_url + '/v1/listpeers'; request.post(options).then((listPeersRes) => { const peers = listPeersRes ? common.newestOnTop(listPeersRes, 'id', req.body.id) : []; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: peers }); @@ -54,7 +58,8 @@ export const deletePeer = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/disconnect/' + req.params.peerId + '?force=' + req.query.force; + options.url = req.session.selectedNode.ln_server_url + '/v1/disconnect'; + options.form = { id: req.params.peerId, force: !!req.query.force }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected', data: body }); res.status(204).json({}); diff --git a/backend/controllers/cln/utility.js b/backend/controllers/cln/utility.js index 8f12f893..684332f6 100644 --- a/backend/controllers/cln/utility.js +++ b/backend/controllers/cln/utility.js @@ -5,7 +5,8 @@ let options = null; const logger = Logger; const common = Common; export const decodePaymentFromPaymentRequest = (selNode, payment) => { - options.url = selNode.ln_server_url + '/v1/utility/decode/' + payment; + options.url = selNode.ln_server_url + '/v1/decode'; + options.form = { string: payment }; return request.post(options).then((res) => { logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: res }); return res; @@ -40,7 +41,8 @@ export const decodePayment = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/decode/' + req.params.payReq; + options.url = req.session.selectedNode.ln_server_url + '/v1/decode'; + options.form = { string: req.params.payReq }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body }); res.status(200).json(body); @@ -55,7 +57,7 @@ export const signMessage = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/signMessage'; + options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage'; options.form = { message: req.body.message }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); @@ -71,7 +73,8 @@ export const verifyMessage = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/checkMessage/' + req.body.message + '/' + req.body.signature; + options.url = req.session.selectedNode.ln_server_url + '/v1/checkmessage'; + options.form = { message: req.body.message, zbase: req.body.signature }; request.post(options, (error, response, body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); res.status(201).json(body); @@ -86,7 +89,7 @@ export const listConfigs = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/listConfigs'; + options.url = req.session.selectedNode.ln_server_url + '/v1/listconfigs'; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs Received', data: body }); res.status(200).json(body); diff --git a/backend/utils/common.js b/backend/utils/common.js index b842fbd1..f3a010ea 100644 --- a/backend/utils/common.js +++ b/backend/utils/common.js @@ -69,7 +69,7 @@ export class CommonService { }; this.getOptions = (req) => { if (req.session.selectedNode && req.session.selectedNode.options) { - req.session.selectedNode.options.method = (req.session.selectedNode.ln_implementation && req.session.selectedNode.ln_implementation.toUpperCase() !== 'ECL') ? 'GET' : 'POST'; + req.session.selectedNode.options.method = (req.session.selectedNode.ln_implementation && req.session.selectedNode.ln_implementation.toUpperCase() === 'LND') ? 'GET' : 'POST'; delete req.session.selectedNode.options.form; req.session.selectedNode.options.qs = {}; return req.session.selectedNode.options; diff --git a/server/controllers/cln/channels.ts b/server/controllers/cln/channels.ts index 04da6de1..8b6c1608 100644 --- a/server/controllers/cln/channels.ts +++ b/server/controllers/cln/channels.ts @@ -57,8 +57,8 @@ export const openChannel = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/fundchannel'; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Channel Opened', data: body }); res.status(201).json(body); @@ -73,8 +73,8 @@ export const setChannelFee = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/setchannel'; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updated Channel Policy', data: body }); res.status(201).json(body); @@ -90,7 +90,7 @@ export const closeChannel = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/close'; - options.body = { channelId: req.params.channelId, unilaterlaltimeout: req.query.force ? 1 : null }; + options.form = { channelId: req.params.channelId, unilaterlaltimeout: req.query.force ? 1 : null }; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Channel Closed', data: body }); @@ -141,7 +141,7 @@ export const listForwards = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listforwards'; - options.body = { status: req.query.status || 'settled' }; + options.form = { status: req.query.status || 'settled' }; request.get(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + req.query.status, data: body }); res.status(200).json(!body.forwards ? [] : (req.query.status === 'failed' || req.query.status === 'local_failed') ? body.forwards.slice(Math.max(0, body.forwards.length - 1000), Math.max(1000, body.forwards.length)).reverse() : body.forwards.reverse()); @@ -156,10 +156,8 @@ export const funderUpdatePolicy = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/funderupdate'; - // if (req.body && req.body.policy) { - // options.body = req.body; - // } - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Funder Policy Received', data: body }); body.channel_fee_max_base_msat = (body.channel_fee_max_base_msat && typeof body.channel_fee_max_base_msat === 'string' && body.channel_fee_max_base_msat.includes('msat')) ? +body.channel_fee_max_base_msat?.replace('msat', '') : body.channel_fee_max_base_msat; diff --git a/server/controllers/cln/invoices.ts b/server/controllers/cln/invoices.ts index 1ba8dc97..0a9a0f40 100644 --- a/server/controllers/cln/invoices.ts +++ b/server/controllers/cln/invoices.ts @@ -10,7 +10,7 @@ export const deleteExpiredInvoice = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/delexpiredinvoice'; - options.body = req.query.maxexpiry ? { maxexpiry: req.query.maxexpiry } : null; + options.form = req.query.maxexpiry ? { maxexpiry: req.query.maxexpiry } : null; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoices Deleted', data: body }); res.status(204).json({ status: 'Invoice Deleted Successfully' }); @@ -24,7 +24,7 @@ export const listInvoices = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Getting Invoices..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.body = req.query.label ? { label: req.query.label } : null; + options.form = req.query.label ? { label: req.query.label } : null; options.url = req.session.selectedNode.ln_server_url + '/v1/listinvoices'; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List URL', data: options.url }); request.post(options).then((body) => { @@ -41,7 +41,7 @@ export const addInvoice = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/invoice'; - options.body = req.body; + options.form = req.body; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Created', data: body }); res.status(201).json(body); diff --git a/server/controllers/cln/network.ts b/server/controllers/cln/network.ts index 9e6ceba9..268bd7d5 100644 --- a/server/controllers/cln/network.ts +++ b/server/controllers/cln/network.ts @@ -10,7 +10,7 @@ export const getRoute = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/getroute'; - options.body = { id: req.params.destPubkey, amount_msat: req.params.amount, riskfactor: (req.query.riskFactor || 0) }; + options.form = { id: req.params.destPubkey, amount_msat: req.params.amount, riskfactor: (req.query.riskFactor || 0) }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Routes Received', data: body }); res.status(200).json({ routes: body }); @@ -25,7 +25,7 @@ export const listChannels = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listchannels'; - options.body = req.params.channelShortId ? { short_channel_id: req.params.channelShortId } : null; + options.form = req.params.channelShortId ? { short_channel_id: req.params.channelShortId } : null; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup Finished', data: body }); res.status(200).json(body); @@ -40,7 +40,7 @@ export const feeRates = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/feerates'; - options.body = req.params.feeRateStyle ? { style : req.params.feeRateStyle } : null; + options.form = req.params.feeRateStyle ? { style : req.params.feeRateStyle } : null; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + req.params.feeRateStyle, data: body }); res.status(200).json(body); @@ -56,7 +56,7 @@ export const listNodes = (req, res, next) => { if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } const queryStr = req.query.liquidity_ads ? '?liquidity_ads=' + req.query.liquidity_ads : ''; options.url = req.session.selectedNode.ln_server_url + '/v1/listNodes'; - options.body = req.params.id ? { id: req.params.id } : null; + options.form = req.params.id ? { id: req.params.id } : null; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes Finished', data: body }); diff --git a/server/controllers/cln/offers.ts b/server/controllers/cln/offers.ts index 031eca78..b521ad0c 100644 --- a/server/controllers/cln/offers.ts +++ b/server/controllers/cln/offers.ts @@ -36,7 +36,7 @@ export const listOffers = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listoffers'; - options.body = { offer_id: (req.query.offer_id) ? req.query.offer_id : null, active_only: !(req.query.active_only === '0' || req.query.active_only === 'false' || !req.query.active_only) }; + options.form = { offer_id: (req.query.offer_id) ? req.query.offer_id : null, active_only: !(req.query.active_only === '0' || req.query.active_only === 'false' || !req.query.active_only) }; logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offers List URL', data: options.url }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offers List Received', data: body }); @@ -62,7 +62,7 @@ export const createOffer = (req, res, next) => { req.body.recurrence_limit = (req.body.recurrence_limit) ? req.body.recurrence_limit : null; req.body.single_use = !(req.body.single_use === '0' || req.body.single_use === 'false' || !req.body.single_use); req.body.quantity_min = (req.body.quantity_min) ? req.body.quantity_min : null; - options.body = req.body; + options.form = req.body; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Created', data: body }); res.status(201).json(body); @@ -83,8 +83,8 @@ export const fetchOfferInvoice = (req, res, next) => { req.body.recurrence_start = (req.body.recurrence_start) ? req.body.recurrence_start : null; req.body.recurrence_label = (req.body.recurrence_label) ? req.body.recurrence_label : null; req.body.timeout = (req.body.timeout) ? req.body.timeout : null; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Invoice Received', data: body }); res.status(201).json(body); @@ -99,7 +99,7 @@ export const disableOffer = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/disableOffer'; - options.body = { offer_id: req.params.offerID }; + options.form = { offer_id: req.params.offerID }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Disabled', data: body }); res.status(202).json(body); diff --git a/server/controllers/cln/onchain.ts b/server/controllers/cln/onchain.ts index ef7c6f37..daf2f6ad 100644 --- a/server/controllers/cln/onchain.ts +++ b/server/controllers/cln/onchain.ts @@ -10,7 +10,7 @@ export const getNewAddress = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/newaddr'; - options.body = { addresstype: req.query.type }; + options.form = { addresstype: req.query.type }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body }); res.status(200).json(body); @@ -29,8 +29,8 @@ export const onChainWithdraw = (req, res, next) => { req.body.feeRate = (req.body.feeRate) ? req.body.feeRate : null; req.body.minConf = (req.body.minConf) ? req.body.minConf : null; req.body.utxos = (req.body.utxos) ? req.body.utxos : null; - options.body = req.body; - logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body }); + options.form = req.body; + logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.form }); request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Withdraw Finished', data: body }); res.status(201).json(body); diff --git a/server/controllers/cln/payments.ts b/server/controllers/cln/payments.ts index 8cfadb19..a4e7b7fa 100644 --- a/server/controllers/cln/payments.ts +++ b/server/controllers/cln/payments.ts @@ -61,9 +61,10 @@ export const listPayments = (req, res, next) => { options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } options.url = req.session.selectedNode.ln_server_url + '/v1/listsendpays'; - options.body.bolt11 = req.query.invoice || null; - options.body.payment_hash = req.query.payment_hash || null; - options.body.status = req.query.status || null; + req.body.bolt11 = req.query.invoice || null; + req.body.payment_hash = req.query.payment_hash || null; + req.body.status = req.query.status || null; + options.form = req.body; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments }); res.status(200).json(groupBy(body.payments)); @@ -86,7 +87,7 @@ export const postPayment = (req, res, next) => { req.body.retry_for = (req.body.retry_for) ? req.body.retry_for : null; req.body.maxdelay = (req.body.maxdelay) ? req.body.maxdelay : null; req.body.exemptfee = (req.body.exemptfee) ? req.body.exemptfee : null; - options.body = req.body; + options.form = req.body; } else { if (req.body.paymentType === 'OFFER') { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Sending Offer Payment..' }); @@ -105,7 +106,7 @@ export const postPayment = (req, res, next) => { req.body.exclude = (req.body.exclude) ? req.body.exclude : null; req.body.maxfee = (req.body.maxfee) ? req.body.maxfee : null; req.body.description = (req.body.description) ? req.body.description : null; - options.body = req.body; + options.form = req.body; options.url = req.session.selectedNode.ln_server_url + '/v1/pay'; } request.post(options).then((body) => { diff --git a/server/controllers/cln/peers.ts b/server/controllers/cln/peers.ts index 728a5e8c..d130da6a 100644 --- a/server/controllers/cln/peers.ts +++ b/server/controllers/cln/peers.ts @@ -9,15 +9,19 @@ export const getPeers = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'List Peers..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/listPeers'; + options.url = req.session.selectedNode.ln_server_url + '/v1/listpeers'; request.post(options).then((body) => { - body.forEach((peer) => { - if (!peer.alias || peer.alias === '') { - peer.alias = peer.id.substring(0, 20); - } + body.peers.forEach((peer) => { + peer.alias = peer.peer_id.substring(0, 20); + return peer; }); - logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers with Alias Received', data: body }); - res.status(200).json(body || []); + // Promise.all(body.peers.map((peer) => getAliasForPeer(peer))).then((peerList) => { + // logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers with Alias Received', data: body }); + // res.status(200).json(peerList || []); + // }).catch((errRes) => { + // const err = common.handleError(errRes, 'Peers', 'List Peers Alias Error', req.session.selectedNode); + // return res.status(err.statusCode).json({ message: err.message, error: err.error }); + // }); }).catch((errRes) => { const err = common.handleError(errRes, 'Peers', 'List Peers Error', req.session.selectedNode); return res.status(err.statusCode).json({ message: err.message, error: err.error }); @@ -28,11 +32,11 @@ export const postPeer = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/connect'; - options.body = req.body; + options.url = req.session.selectedNode.ln_server_url + '/v1/connect'; + options.form = req.body; request.post(options).then((connectRes) => { logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: connectRes }); - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/listPeers'; + options.url = req.session.selectedNode.ln_server_url + '/v1/listpeers'; request.post(options).then((listPeersRes) => { const peers = listPeersRes ? common.newestOnTop(listPeersRes, 'id', req.body.id) : []; logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: peers }); @@ -51,7 +55,8 @@ export const deletePeer = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/peer/disconnect/' + req.params.peerId + '?force=' + req.query.force; + options.url = req.session.selectedNode.ln_server_url + '/v1/disconnect'; + options.form = { id: req.params.peerId, force: !!req.query.force }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected', data: body }); res.status(204).json({}); diff --git a/server/controllers/cln/utility.ts b/server/controllers/cln/utility.ts index 5ef0b9af..9c74ec94 100644 --- a/server/controllers/cln/utility.ts +++ b/server/controllers/cln/utility.ts @@ -8,7 +8,8 @@ const logger: LoggerService = Logger; const common: CommonService = Common; export const decodePaymentFromPaymentRequest = (selNode: CommonSelectedNode, payment) => { - options.url = selNode.ln_server_url + '/v1/utility/decode/' + payment; + options.url = selNode.ln_server_url + '/v1/decode'; + options.form = { string: payment }; return request.post(options).then((res) => { logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: res }); return res; @@ -40,7 +41,8 @@ export const decodePayment = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/decode/' + req.params.payReq; + options.url = req.session.selectedNode.ln_server_url + '/v1/decode'; + options.form = { string: req.params.payReq }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body }); res.status(200).json(body); @@ -54,7 +56,7 @@ export const signMessage = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/signMessage'; + options.url = req.session.selectedNode.ln_server_url + '/v1/signmessage'; options.form = { message: req.body.message }; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); @@ -69,7 +71,8 @@ export const verifyMessage = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/checkMessage/' + req.body.message + '/' + req.body.signature; + options.url = req.session.selectedNode.ln_server_url + '/v1/checkmessage'; + options.form = { message: req.body.message, zbase: req.body.signature }; request.post(options, (error, response, body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); res.status(201).json(body); @@ -83,7 +86,7 @@ export const listConfigs = (req, res, next) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs..' }); options = common.getOptions(req); if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } - options.url = req.session.selectedNode.ln_server_url + '/v1/utility/listConfigs'; + options.url = req.session.selectedNode.ln_server_url + '/v1/listconfigs'; request.post(options).then((body) => { logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs Received', data: body }); res.status(200).json(body); diff --git a/server/utils/common.ts b/server/utils/common.ts index 3c3d54dc..02725704 100644 --- a/server/utils/common.ts +++ b/server/utils/common.ts @@ -74,7 +74,7 @@ export class CommonService { public getOptions = (req) => { if (req.session.selectedNode && req.session.selectedNode.options) { - req.session.selectedNode.options.method = (req.session.selectedNode.ln_implementation && req.session.selectedNode.ln_implementation.toUpperCase() !== 'ECL') ? 'GET' : 'POST'; + req.session.selectedNode.options.method = (req.session.selectedNode.ln_implementation && req.session.selectedNode.ln_implementation.toUpperCase() === 'LND') ? 'GET' : 'POST'; delete req.session.selectedNode.options.form; req.session.selectedNode.options.qs = {}; return req.session.selectedNode.options;