Compare commits

...

2 Commits

Author SHA1 Message Date
ShahanaFarooqui 93b6f02ed5 Config Settings and Authentication case fixed 4 weeks ago
ShahanaFarooqui b9caa5a00d Final application settings update 4 weeks ago

4
.github/README.md vendored

@ -95,7 +95,7 @@ Example RTL-Config.json:
"index": 1, "index": 1,
"lnNode": "LND Testnet", "lnNode": "LND Testnet",
"lnImplementation": "LND", "lnImplementation": "LND",
"Authentication": { "authentication": {
"macaroonPath": "<Complete path of the folder containing LND admin.macaroon for the node>", "macaroonPath": "<Complete path of the folder containing LND admin.macaroon for the node>",
"runePath": "<Complete path including filename for CLN rune for the node, rune format 'LIGHTNING_RUNE="your-rune"'>", "runePath": "<Complete path including filename for CLN rune for the node, rune format 'LIGHTNING_RUNE="your-rune"'>",
"lnApiPassword": "<Can be used to provide password in ECL implementation>", "lnApiPassword": "<Can be used to provide password in ECL implementation>",
@ -103,7 +103,7 @@ Example RTL-Config.json:
"boltzMacaroonPath": "<Complete path of the folder containing Boltz admin.macaroon for the node>", "boltzMacaroonPath": "<Complete path of the folder containing Boltz admin.macaroon for the node>",
"configPath": "<Optional:Path of the .conf if present locally or empty>", "configPath": "<Optional:Path of the .conf if present locally or empty>",
}, },
"Settings": { "settings": {
"userPersona": "OPERATOR", "userPersona": "OPERATOR",
"themeMode": "DAY", "themeMode": "DAY",
"themeColor": "PURPLE", "themeColor": "PURPLE",

@ -20,7 +20,7 @@ parameters have `default` values for initial setup and can be updated after RTL
"index": <Incremental node indices starting from 1, Required>, "index": <Incremental node indices starting from 1, Required>,
"lnNode": "<Node name to uniquely identify the node in the UI, Required>", "lnNode": "<Node name to uniquely identify the node in the UI, Required>",
"lnImplementation": "<LNP implementation, Allowed values LND/CLN/ECL, Required>", "lnImplementation": "<LNP implementation, Allowed values LND/CLN/ECL, Required>",
"Authentication": { "authentication": {
"macaroonPath": "<Path for the folder containing 'admin.macaroon' for LND node, Required for LND>", "macaroonPath": "<Path for the folder containing 'admin.macaroon' for LND node, Required for LND>",
"runePath": "<Complete path including filename for CLN rune for the node, Required for CLN>", "runePath": "<Complete path including filename for CLN rune for the node, Required for CLN>",
"lnApiPassword": "<Password to be used for ECL API authentication. Mandatory only for ECL if the configPath is missing>" "lnApiPassword": "<Password to be used for ECL API authentication. Mandatory only for ECL if the configPath is missing>"
@ -28,7 +28,7 @@ parameters have `default` values for initial setup and can be updated after RTL
"boltzMacaroonPath": "<Path for the folder containing 'admin.macaroon' (Boltz), Required for Boltz Swaps>", "boltzMacaroonPath": "<Path for the folder containing 'admin.macaroon' (Boltz), Required for Boltz Swaps>",
"configPath": "<Full path of the lnd.conf/core lightning config/eclair.conf file including the file name, if present locally, Optional, only mandatory for ECL if the lnApiPassword is missing>", "configPath": "<Full path of the lnd.conf/core lightning config/eclair.conf file including the file name, if present locally, Optional, only mandatory for ECL if the lnApiPassword is missing>",
}, },
"Settings": { "settings": {
"userPersona": "<User persona to tailor the data on UI. Allowed values MERCHANT/OPERATOR. Default MERCHANT, Optional>", "userPersona": "<User persona to tailor the data on UI. Allowed values MERCHANT/OPERATOR. Default MERCHANT, Optional>",
"themeMode": "<Theme modes, Allowed values DAY, NIGHT. Default DAY, Optional>", "themeMode": "<Theme modes, Allowed values DAY, NIGHT. Default DAY, Optional>",
"themeColor": "<Theme colors, Allowed values PURPLE, TEAL, INDIGO, PINK, YELLOW. Default PURPLE, Optional>", "themeColor": "<Theme colors, Allowed values PURPLE, TEAL, INDIGO, PINK, YELLOW. Default PURPLE, Optional>",

@ -77,11 +77,11 @@ Ensure that the follow values are correct per your config:
"index": 1, "index": 1,
"lnNode": "Core Lightning Testnet # 1", "lnNode": "Core Lightning Testnet # 1",
"lnImplementation": "CLN", "lnImplementation": "CLN",
"Authentication": { "authentication": {
"runePath": "<Modify to include the path of the folder including filename which contains `rune`>", "runePath": "<Modify to include the path of the folder including filename which contains `rune`>",
"configPath": "<Optional - Config file path for core lightning>" "configPath": "<Optional - Config file path for core lightning>"
}, },
"Settings": { "settings": {
"userPersona": "OPERATOR", "userPersona": "OPERATOR",
"themeMode": "DAY", "themeMode": "DAY",
"themeColor": "PURPLE", "themeColor": "PURPLE",

@ -71,11 +71,11 @@ Ensure that the follow values are correct per your config:
"index": 1, "index": 1,
"lnNode": "Eclair Testnet # 1", "lnNode": "Eclair Testnet # 1",
"lnImplementation": "ECL", "lnImplementation": "ECL",
"Authentication": { "authentication": {
"configPath": "<Optional - Config file path, including .conf file>", "configPath": "<Optional - Config file path, including .conf file>",
"lnApiPassword": "<Mandatory if the configPath is missing - Password used for API authentication>", "lnApiPassword": "<Mandatory if the configPath is missing - Password used for API authentication>",
}, },
"Settings": { "settings": {
"userPersona": "OPERATOR", "userPersona": "OPERATOR",
"themeMode": "DAY", "themeMode": "DAY",
"themeColor": "PURPLE", "themeColor": "PURPLE",

@ -26,13 +26,13 @@ If your running RTL and LND on different devices on your local LAN, certain conf
"index": 1, "index": 1,
"lnNode": "LND Testnet", "lnNode": "LND Testnet",
"lnImplementation": "LND", "lnImplementation": "LND",
"Authentication": { "authentication": {
"macaroonPath": "<Path of the folder containing 'admin.macaroon' on the device running RTL>", "macaroonPath": "<Path of the folder containing 'admin.macaroon' on the device running RTL>",
"swapMacaroonPath": "<Path of the folder containing 'loop.macaroon' on the device running RTL>", "swapMacaroonPath": "<Path of the folder containing 'loop.macaroon' on the device running RTL>",
"boltzMacaroonPath": "<Path of the folder containing 'admin.macaroon' on the device running RTL>", "boltzMacaroonPath": "<Path of the folder containing 'admin.macaroon' on the device running RTL>",
"configPath": "<Optional:Path of the lnd.conf if present locally or empty>" "configPath": "<Optional:Path of the lnd.conf if present locally or empty>"
}, },
"Settings": { "settings": {
"userPersona": "OPERATOR", "userPersona": "OPERATOR",
"themeMode": "DAY", "themeMode": "DAY",
"themeColor": "PURPLE", "themeColor": "PURPLE",

@ -13,13 +13,13 @@
"index": 1, "index": 1,
"lnNode": "Node 1", "lnNode": "Node 1",
"lnImplementation": "LND", "lnImplementation": "LND",
"Authentication": { "authentication": {
"macaroonPath": "C:\\Users\\xyz\\AppData\\Local\\Lnd\\data\\chain\\bitcoin\\mainnet", "macaroonPath": "C:\\Users\\xyz\\AppData\\Local\\Lnd\\data\\chain\\bitcoin\\mainnet",
"configPath": "C:\\Users\\xyz\\AppData\\Local\\Lnd\\lnd.conf", "configPath": "C:\\Users\\xyz\\AppData\\Local\\Lnd\\lnd.conf",
"swapMacaroonPath": "C:\\Users\\xyz\\AppData\\Local\\Loop\\mainnet", "swapMacaroonPath": "C:\\Users\\xyz\\AppData\\Local\\Loop\\mainnet",
"boltzMacaroonPath": "C:\\Users\\xyz\\AppData\\Boltz\\mainnet" "boltzMacaroonPath": "C:\\Users\\xyz\\AppData\\Boltz\\mainnet"
}, },
"Settings": { "settings": {
"userPersona": "MERCHANT", "userPersona": "MERCHANT",
"themeMode": "DAY", "themeMode": "DAY",
"themeColor": "PURPLE", "themeColor": "PURPLE",

@ -11,7 +11,7 @@ export const listPeerChannels = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listpeerchannels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listpeerchannels';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Peer Channels List Received', data: body.channels }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Peer Channels List Received', data: body.channels });
return Promise.all(body.channels?.map((channel) => { return Promise.all(body.channels?.map((channel) => {
@ -33,7 +33,7 @@ export const openChannel = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/fundchannel'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/fundchannel';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -50,7 +50,7 @@ export const setChannelFee = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/setchannel'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/setchannel';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -68,7 +68,7 @@ export const closeChannel = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/close'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/close';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -86,7 +86,7 @@ export const listForwards = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listforwards'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listforwards';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body });
@ -103,7 +103,7 @@ export const funderUpdatePolicy = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/funderupdate'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/funderupdate';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {

@ -1,23 +0,0 @@
import request from 'request-promise';
import { Logger } from '../../utils/logger.js';
import { Common } from '../../utils/common.js';
let options = null;
const logger = Logger;
const common = Common;
export const getFees = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..' });
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/getinfo';
request.post(options).then((body) => {
const versionCompatible = common.isVersionCompatible(req.session.selectedNode.ln_version, '23.02');
const feeData = { feeCollected: ((versionCompatible ? body.fees_collected_msat : body.msatoshi_fees_collected) || 0) };
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Fee Received', data: feeData });
res.status(200).json(feeData);
}).catch((errRes) => {
const err = common.handleError(errRes, 'Fees', 'Get Fees Error', req.session.selectedNode);
return res.status(err.statusCode).json({ message: err.message, error: err.error });
});
};

@ -16,7 +16,7 @@ export const getInfo = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/getinfo'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/getinfo';
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode });
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Core Lightning server url ' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Core Lightning server url ' + options.url });
if (!options.headers || !options.headers.rune) { if (!options.headers || !options.headers.rune) {

@ -10,7 +10,7 @@ export const deleteExpiredInvoice = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/delexpiredinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/delexpiredinvoice';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoices Deleted', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoices Deleted', data: body });
@ -26,7 +26,7 @@ export const listInvoices = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listinvoices'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listinvoices';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List URL', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List URL', data: options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -43,7 +43,7 @@ export const addInvoice = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoice';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Created', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Created', data: body });

@ -10,7 +10,7 @@ export const getRoute = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/getroute'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/getroute';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Routes Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Routes Received', data: body });
@ -29,7 +29,7 @@ export const listChannels = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listchannels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listchannels';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup Finished', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup Finished', data: body });
@ -46,7 +46,7 @@ export const feeRates = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/feerates'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/feerates';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body });
@ -64,7 +64,7 @@ export const listNodes = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listnodes'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listnodes';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -80,7 +80,7 @@ export const listNodes = (req, res, next) => {
}); });
}; };
export const getAlias = (selNode, peer, id) => { export const getAlias = (selNode, peer, id) => {
options.url = selNode.Settings.lnServerUrl + '/v1/listnodes'; options.url = selNode.settings.lnServerUrl + '/v1/listnodes';
if (!peer[id]) { if (!peer[id]) {
logger.log({ selectedNode: selNode, level: 'ERROR', fileName: 'Network', msg: 'Empty Peer ID' }); logger.log({ selectedNode: selNode, level: 'ERROR', fileName: 'Network', msg: 'Empty Peer ID' });
peer.alias = ''; peer.alias = '';

@ -34,7 +34,7 @@ export const listOffers = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listoffers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listoffers';
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offers List URL', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offers List URL', data: options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offers List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offers List Received', data: body });
@ -50,7 +50,7 @@ export const createOffer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/offer'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/offer';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Created', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Created', data: body });
@ -66,7 +66,7 @@ export const fetchOfferInvoice = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/fetchinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/fetchinvoice';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -83,7 +83,7 @@ export const disableOffer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/disableOffer'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/disableOffer';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Disabled', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Disabled', data: body });

@ -10,7 +10,7 @@ export const getNewAddress = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/newaddr'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/newaddr';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body });
@ -26,7 +26,7 @@ export const onChainWithdraw = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/withdraw'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/withdraw';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -43,7 +43,7 @@ export const getUTXOs = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listfunds'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listfunds';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Funds List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Funds List Received', data: body });
// Local Remote Balance Calculation // Local Remote Balance Calculation

@ -8,7 +8,7 @@ const logger = Logger;
const common = Common; const common = Common;
const databaseService = Database; const databaseService = Database;
export const getMemo = (selNode, payment) => { export const getMemo = (selNode, payment) => {
options.url = selNode.Settings.lnServerUrl + '/v1/decode'; options.url = selNode.settings.lnServerUrl + '/v1/decode';
options.body = { string: payment.bolt11 }; options.body = { string: payment.bolt11 };
return request.post(options).then((res) => { return request.post(options).then((res) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: res }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: res });
@ -81,7 +81,7 @@ export const listPayments = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listsendpays'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listsendpays';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments });
body.payments = body.payments && body.payments.length && body.payments.length > 0 ? groupBy(body.payments) : []; body.payments = body.payments && body.payments.length && body.payments.length > 0 ? groupBy(body.payments) : [];
@ -103,7 +103,7 @@ export const postPayment = (req, res, next) => {
const options_body = JSON.parse(JSON.stringify(req.body)); const options_body = JSON.parse(JSON.stringify(req.body));
if (paymentType === 'KEYSEND') { if (paymentType === 'KEYSEND') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/keysend'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/keysend';
delete options_body.uiMessage; delete options_body.uiMessage;
delete options_body.fromDialog; delete options_body.fromDialog;
delete options_body.paymentType; delete options_body.paymentType;
@ -144,7 +144,7 @@ export const postPayment = (req, res, next) => {
delete options_body.pubkey; delete options_body.pubkey;
delete options_body.saveToDB; delete options_body.saveToDB;
options.body = options_body; options.body = options_body;
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/pay'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/pay';
} }
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body });

@ -11,7 +11,7 @@ export const getPeers = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listpeers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listpeers';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body });
const peers = !body.peers ? [] : body.peers; const peers = !body.peers ? [] : body.peers;
@ -30,12 +30,12 @@ export const postPeer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/connect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/connect';
options.body = req.body; options.body = req.body;
request.post(options).then((connectRes) => { request.post(options).then((connectRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: connectRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: connectRes });
const listOptions = common.getOptions(req); const listOptions = common.getOptions(req);
listOptions.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listpeers'; listOptions.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listpeers';
request.post(listOptions).then((listPeersRes) => { request.post(listOptions).then((listPeersRes) => {
const peers = listPeersRes && listPeersRes.peers ? common.newestOnTop(listPeersRes.peers, 'id', connectRes.id) : []; const peers = listPeersRes && listPeersRes.peers ? common.newestOnTop(listPeersRes.peers, 'id', connectRes.id) : [];
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: peers }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: peers });
@ -55,7 +55,7 @@ export const deletePeer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/disconnect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/disconnect';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected', data: body });

@ -10,7 +10,7 @@ export const decodePayment = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/decode'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/decode';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body });
@ -26,7 +26,7 @@ export const signMessage = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/signmessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/signmessage';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body });
@ -42,7 +42,7 @@ export const verifyMessage = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/checkmessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/checkmessage';
options.body = req.body; options.body = req.body;
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body });
@ -58,7 +58,7 @@ export const listConfigs = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listconfigs'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listconfigs';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs Received', data: body });
res.status(200).json(body); res.status(200).json(body);

@ -27,14 +27,14 @@ export class CLWebSocketClient {
try { try {
const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index); const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index);
if (!clientExists) { if (!clientExists) {
if (selectedNode.Settings.lnServerUrl) { if (selectedNode.settings.lnServerUrl) {
const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null }; const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null };
this.connectWithClient(newWebSocketClient); this.connectWithClient(newWebSocketClient);
this.webSocketClients.push(newWebSocketClient); this.webSocketClients.push(newWebSocketClient);
} }
} }
else { else {
if ((!clientExists.webSocketClient || !clientExists.webSocketClient.connected) && selectedNode.Settings.lnServerUrl) { if ((!clientExists.webSocketClient || !clientExists.webSocketClient.connected) && selectedNode.settings.lnServerUrl) {
clientExists.reConnect = true; clientExists.reConnect = true;
this.connectWithClient(clientExists); this.connectWithClient(clientExists);
} }
@ -47,11 +47,11 @@ export class CLWebSocketClient {
this.connectWithClient = (clWsClt) => { this.connectWithClient = (clWsClt) => {
this.logger.log({ selectedNode: clWsClt.selectedNode, level: 'INFO', fileName: 'CLWebSocket', msg: 'Connecting to the Core Lightning\'s Websocket Server..' }); this.logger.log({ selectedNode: clWsClt.selectedNode, level: 'INFO', fileName: 'CLWebSocket', msg: 'Connecting to the Core Lightning\'s Websocket Server..' });
try { try {
if (!clWsClt.selectedNode.Authentication.runeValue) { if (!clWsClt.selectedNode.authentication.runeValue) {
clWsClt.selectedNode.Authentication.runeValue = this.common.getRuneValue(clWsClt.selectedNode.Authentication.runePath); clWsClt.selectedNode.authentication.runeValue = this.common.getRuneValue(clWsClt.selectedNode.authentication.runePath);
} }
clWsClt.webSocketClient = socketIOClient(clWsClt.selectedNode.Settings.lnServerUrl, { clWsClt.webSocketClient = socketIOClient(clWsClt.selectedNode.settings.lnServerUrl, {
extraHeaders: { rune: clWsClt.selectedNode.Authentication.runeValue }, extraHeaders: { rune: clWsClt.selectedNode.authentication.runeValue },
transports: ['websocket'], transports: ['websocket'],
secure: true, secure: true,
rejectUnauthorized: false rejectUnauthorized: false

@ -27,7 +27,7 @@ export const simplifyAllChannels = (selNode, channels) => {
}); });
}); });
channelNodeIds = channelNodeIds.substring(1); channelNodeIds = channelNodeIds.substring(1);
options.url = selNode.Settings.lnServerUrl + '/nodes'; options.url = selNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: channelNodeIds }; options.form = { nodeIds: channelNodeIds };
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Node Ids to find alias', data: channelNodeIds }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Node Ids to find alias', data: channelNodeIds });
return request.post(options).then((nodes) => { return request.post(options).then((nodes) => {
@ -47,7 +47,7 @@ export const getChannels = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/channels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/channels';
options.form = {}; options.form = {};
if (req.query && req.query.nodeId) { if (req.query && req.query.nodeId) {
options.form = req.query; options.form = req.query;
@ -83,7 +83,7 @@ export const getChannelStats = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/channelstats'; options.url = req.session.selectedNode.settings.lnServerUrl + '/channelstats';
const today = new Date(Date.now()); const today = new Date(Date.now());
const tillToday = (Math.round(today.getTime() / 1000)).toString(); const tillToday = (Math.round(today.getTime() / 1000)).toString();
const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString(); const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString();
@ -105,7 +105,7 @@ export const openChannel = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/open'; options.url = req.session.selectedNode.settings.lnServerUrl + '/open';
options.form = req.body; options.form = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Params', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Params', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -122,7 +122,7 @@ export const updateChannelRelayFee = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/updaterelayfee'; options.url = req.session.selectedNode.settings.lnServerUrl + '/updaterelayfee';
options.form = req.query; options.form = req.query;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Relay Fee Params', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Relay Fee Params', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -140,11 +140,11 @@ export const closeChannel = (req, res, next) => {
} }
if (req.query.force !== 'true') { if (req.query.force !== 'true') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Closing Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Closing Channel..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/close'; options.url = req.session.selectedNode.settings.lnServerUrl + '/close';
} }
else { else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Force Closing Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Force Closing Channel..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/forceclose'; options.url = req.session.selectedNode.settings.lnServerUrl + '/forceclose';
} }
options.form = { channelId: req.query.channelId }; options.form = { channelId: req.query.channelId };
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Close URL', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Close URL', data: options.url });

@ -99,7 +99,7 @@ export const getFees = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/audit'; options.url = req.session.selectedNode.settings.lnServerUrl + '/audit';
const today = new Date(Date.now()); const today = new Date(Date.now());
const tillToday = (Math.round(today.getTime() / 1000)).toString(); const tillToday = (Math.round(today.getTime() / 1000)).toString();
const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString(); const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString();
@ -127,7 +127,7 @@ export const getPayments = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/audit'; options.url = req.session.selectedNode.settings.lnServerUrl + '/audit';
const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString();
options.form = { from: 0, to: tillToday }; options.form = { from: 0, to: tillToday };
if (common.read_dummy_data) { if (common.read_dummy_data) {

@ -16,7 +16,7 @@ export const getInfo = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/getinfo'; options.url = req.session.selectedNode.settings.lnServerUrl + '/getinfo';
options.form = {}; options.form = {};
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode });
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Eclair server url ' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Eclair server url ' + options.url });

@ -39,7 +39,7 @@ export const getInvoice = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/getinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/getinvoice';
options.form = { paymentHash: req.params.paymentHash }; options.form = { paymentHash: req.params.paymentHash };
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Found', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Found', data: body });
@ -55,8 +55,8 @@ export const getInvoice = (req, res, next) => {
}; };
export const listPendingInvoicesRequestCall = (selectedNode) => { export const listPendingInvoicesRequestCall = (selectedNode) => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'List Pending Invoices..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'List Pending Invoices..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/listpendinginvoices'; options.url = selectedNode.settings.lnServerUrl + '/listpendinginvoices';
options.form = { from: 0, to: (Math.round(new Date(Date.now()).getTime() / 1000)).toString() }; options.form = { from: 0, to: (Math.round(new Date(Date.now()).getTime() / 1000)).toString() };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request.post(options).then((pendingInvoicesResponse) => { request.post(options).then((pendingInvoicesResponse) => {
@ -76,16 +76,16 @@ export const listInvoices = (req, res, next) => {
const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString();
options.form = { from: 0, to: tillToday }; options.form = { from: 0, to: tillToday };
const options1 = JSON.parse(JSON.stringify(options)); const options1 = JSON.parse(JSON.stringify(options));
options1.url = req.session.selectedNode.Settings.lnServerUrl + '/listinvoices'; options1.url = req.session.selectedNode.settings.lnServerUrl + '/listinvoices';
options1.form = { from: 0, to: tillToday }; options1.form = { from: 0, to: tillToday };
const options2 = JSON.parse(JSON.stringify(options)); const options2 = JSON.parse(JSON.stringify(options));
options2.url = req.session.selectedNode.Settings.lnServerUrl + '/listpendinginvoices'; options2.url = req.session.selectedNode.settings.lnServerUrl + '/listpendinginvoices';
options2.form = { from: 0, to: tillToday }; options2.form = { from: 0, to: tillToday };
if (common.read_dummy_data) { if (common.read_dummy_data) {
return common.getDummyData('Invoices', req.session.selectedNode.lnImplementation).then((body) => { return common.getDummyData('Invoices', req.session.selectedNode.lnImplementation).then((body) => {
const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0]; const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0];
pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1]; pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1];
return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.Settings.lnServerUrl, invoice))). return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.settings.lnServerUrl, invoice))).
then((values) => res.status(200).json(invoices)); then((values) => res.status(200).json(invoices));
}); });
} }
@ -96,7 +96,7 @@ export const listInvoices = (req, res, next) => {
const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0]; const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0];
pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1]; pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1];
if (invoices && invoices.length > 0) { if (invoices && invoices.length > 0) {
return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.Settings.lnServerUrl, invoice))). return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.settings.lnServerUrl, invoice))).
then((values) => { then((values) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Sorted Invoices List Received', data: invoices }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Sorted Invoices List Received', data: invoices });
return res.status(200).json(invoices); return res.status(200).json(invoices);
@ -119,8 +119,8 @@ export const listInvoices = (req, res, next) => {
}; };
export const createInvoiceRequestCall = (selectedNode, description, amount) => { export const createInvoiceRequestCall = (selectedNode, description, amount) => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/createinvoice'; options.url = selectedNode.settings.lnServerUrl + '/createinvoice';
options.form = { description: description, amountMsat: amount }; options.form = { description: description, amountMsat: amount };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request.post(options).then((invResponse) => { request.post(options).then((invResponse) => {

@ -10,7 +10,7 @@ export const getNodes = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/nodes'; options.url = req.session.selectedNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: req.params.id }; options.form = { nodeIds: req.params.id };
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Node Lookup Finished', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Node Lookup Finished', data: body });
@ -22,8 +22,8 @@ export const getNodes = (req, res, next) => {
}; };
export const findRouteBetweenNodesRequestCall = (selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds = [], format = 'shortChannelId') => { export const findRouteBetweenNodesRequestCall = (selectedNode, amountMsat, sourceNodeId, targetNodeId, ignoreNodeIds = [], format = 'shortChannelId') => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Network', msg: 'Find Route Between Nodes..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Network', msg: 'Find Route Between Nodes..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/findroutebetweennodes'; options.url = selectedNode.settings.lnServerUrl + '/findroutebetweennodes';
options.form = { amountMsat: amountMsat, sourceNodeId: sourceNodeId, targetNodeId: targetNodeId, ignoreNodeIds: ignoreNodeIds, format: format }; options.form = { amountMsat: amountMsat, sourceNodeId: sourceNodeId, targetNodeId: targetNodeId, ignoreNodeIds: ignoreNodeIds, format: format };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request.post(options).then((body) => { request.post(options).then((body) => {

@ -21,7 +21,7 @@ export const getNewAddress = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/getnewaddress'; options.url = req.session.selectedNode.settings.lnServerUrl + '/getnewaddress';
options.form = {}; options.form = {};
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body });
@ -37,7 +37,7 @@ export const getBalance = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/onchainbalance'; options.url = req.session.selectedNode.settings.lnServerUrl + '/onchainbalance';
options.form = {}; options.form = {};
if (common.read_dummy_data) { if (common.read_dummy_data) {
common.getDummyData('OnChainBalance', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(arrangeBalances(data)); }); common.getDummyData('OnChainBalance', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(arrangeBalances(data)); });
@ -59,7 +59,7 @@ export const getTransactions = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/onchaintransactions'; options.url = req.session.selectedNode.settings.lnServerUrl + '/onchaintransactions';
options.form = { options.form = {
count: req.query.count, count: req.query.count,
skip: req.query.skip skip: req.query.skip
@ -80,7 +80,7 @@ export const sendFunds = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/sendonchain'; options.url = req.session.selectedNode.settings.lnServerUrl + '/sendonchain';
options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks }; options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks };
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {

@ -5,7 +5,7 @@ let options = null;
const logger = Logger; const logger = Logger;
const common = Common; const common = Common;
export const getSentInfoFromPaymentRequest = (selNode, payment) => { export const getSentInfoFromPaymentRequest = (selNode, payment) => {
options.url = selNode.Settings.lnServerUrl + '/getsentinfo'; options.url = selNode.settings.lnServerUrl + '/getsentinfo';
options.form = { paymentHash: payment }; options.form = { paymentHash: payment };
return request.post(options).then((body) => { return request.post(options).then((body) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Sent Information Received', data: body }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Sent Information Received', data: body });
@ -21,7 +21,7 @@ export const getSentInfoFromPaymentRequest = (selNode, payment) => {
}).catch((err) => err); }).catch((err) => err);
}; };
export const getQueryNodes = (selNode, nodeIds) => { export const getQueryNodes = (selNode, nodeIds) => {
options.url = selNode.Settings.lnServerUrl + '/nodes'; options.url = selNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: nodeIds?.reduce((acc, curr) => acc + ',' + curr) }; options.form = { nodeIds: nodeIds?.reduce((acc, curr) => acc + ',' + curr) };
return request.post(options).then((nodes) => { return request.post(options).then((nodes) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Query Nodes Received', data: nodes }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Query Nodes Received', data: nodes });
@ -34,7 +34,7 @@ export const decodePayment = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/parseinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/parseinvoice';
options.form = { invoice: req.params.invoice }; options.form = { invoice: req.params.invoice };
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body });
@ -53,7 +53,7 @@ export const postPayment = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/payinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/payinvoice';
options.form = req.body; options.form = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -70,7 +70,7 @@ export const queryPaymentRoute = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/findroutetonode'; options.url = req.session.selectedNode.settings.lnServerUrl + '/findroutetonode';
options.form = { options.form = {
nodeId: req.query.nodeId, nodeId: req.query.nodeId,
amountMsat: req.query.amountMsat amountMsat: req.query.amountMsat
@ -129,8 +129,8 @@ export const getSentPaymentsInformation = (req, res, next) => {
}; };
export const sendPaymentToRouteRequestCall = (selectedNode, shortChannelIds, invoice, amountMsat) => { export const sendPaymentToRouteRequestCall = (selectedNode, shortChannelIds, invoice, amountMsat) => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/sendtoroute'; options.url = selectedNode.settings.lnServerUrl + '/sendtoroute';
options.form = { shortChannelIds: shortChannelIds, amountMsat: amountMsat, invoice: invoice }; options.form = { shortChannelIds: shortChannelIds, amountMsat: amountMsat, invoice: invoice };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
logger.log({ selectedNode: selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment To Route Options', data: options.form }); logger.log({ selectedNode: selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment To Route Options', data: options.form });

@ -5,7 +5,7 @@ let options = null;
const logger = Logger; const logger = Logger;
const common = Common; const common = Common;
export const getFilteredNodes = (selNode, peersNodeIds) => { export const getFilteredNodes = (selNode, peersNodeIds) => {
options.url = selNode.Settings.lnServerUrl + '/nodes'; options.url = selNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: peersNodeIds }; options.form = { nodeIds: peersNodeIds };
return request.post(options).then((nodes) => { return request.post(options).then((nodes) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Filtered Nodes Received', data: nodes }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Filtered Nodes Received', data: nodes });
@ -18,7 +18,7 @@ export const getPeers = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/peers';
options.form = {}; options.form = {};
if (common.read_dummy_data) { if (common.read_dummy_data) {
common.getDummyData('Peers', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(data); }); common.getDummyData('Peers', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(data); });
@ -58,7 +58,7 @@ export const connectPeer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/connect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/connect';
options.form = {}; options.form = {};
if (req.query) { if (req.query) {
options.form = req.query; options.form = req.query;
@ -74,7 +74,7 @@ export const connectPeer = (req, res, next) => {
const err = common.handleError({ statusCode: 500, message: 'Connect Peer Error', error: body }, 'Peers', body, req.session.selectedNode); const err = common.handleError({ statusCode: 500, message: 'Connect Peer Error', error: body }, 'Peers', body, req.session.selectedNode);
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/peers';
options.form = {}; options.form = {};
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List after Connect', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List after Connect', data: body });
@ -112,7 +112,7 @@ export const deletePeer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/disconnect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/disconnect';
options.form = {}; options.form = {};
if (req.params.nodeId) { if (req.params.nodeId) {
options.form = { nodeId: req.params.nodeId }; options.form = { nodeId: req.params.nodeId };

@ -28,14 +28,14 @@ export class ECLWebSocketClient {
try { try {
const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index); const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index);
if (!clientExists) { if (!clientExists) {
if (selectedNode.Settings.lnServerUrl) { if (selectedNode.settings.lnServerUrl) {
const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null }; const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null };
this.connectWithClient(newWebSocketClient); this.connectWithClient(newWebSocketClient);
this.webSocketClients.push(newWebSocketClient); this.webSocketClients.push(newWebSocketClient);
} }
} }
else { else {
if ((!clientExists.webSocketClient || clientExists.webSocketClient.readyState !== WebSocket.OPEN) && selectedNode.Settings.lnServerUrl) { if ((!clientExists.webSocketClient || clientExists.webSocketClient.readyState !== WebSocket.OPEN) && selectedNode.settings.lnServerUrl) {
clientExists.reConnect = true; clientExists.reConnect = true;
this.connectWithClient(clientExists); this.connectWithClient(clientExists);
} }
@ -47,9 +47,9 @@ export class ECLWebSocketClient {
}; };
this.connectWithClient = (eclWsClt) => { this.connectWithClient = (eclWsClt) => {
this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connecting to the Eclair\'s Websocket Server..' }); this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connecting to the Eclair\'s Websocket Server..' });
const UpdatedLNServerURL = (eclWsClt.selectedNode.Settings.lnServerUrl)?.replace(/^http/, 'ws'); const UpdatedLNServerURL = (eclWsClt.selectedNode.settings.lnServerUrl)?.replace(/^http/, 'ws');
const firstSubStrIndex = (UpdatedLNServerURL.indexOf('//') + 2); const firstSubStrIndex = (UpdatedLNServerURL.indexOf('//') + 2);
const WS_LINK = UpdatedLNServerURL.slice(0, firstSubStrIndex) + ':' + eclWsClt.selectedNode.Authentication.lnApiPassword + '@' + UpdatedLNServerURL.slice(firstSubStrIndex) + '/ws'; const WS_LINK = UpdatedLNServerURL.slice(0, firstSubStrIndex) + ':' + eclWsClt.selectedNode.authentication.lnApiPassword + '@' + UpdatedLNServerURL.slice(firstSubStrIndex) + '/ws';
eclWsClt.webSocketClient = new WebSocket(WS_LINK); eclWsClt.webSocketClient = new WebSocket(WS_LINK);
eclWsClt.webSocketClient.onopen = () => { eclWsClt.webSocketClient.onopen = () => {
this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connected to the Eclair\'s Websocket Server..' }); this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connected to the Eclair\'s Websocket Server..' });

@ -10,7 +10,7 @@ export const getBlockchainBalance = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/balance/blockchain'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/balance/blockchain';
options.qs = req.query; options.qs = req.query;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request params', data: req.params }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request params', data: req.params });
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request Query', data: req.query }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request Query', data: req.query });

@ -6,7 +6,7 @@ const logger = Logger;
const common = Common; const common = Common;
export const getAliasForChannel = (selNode, channel) => { export const getAliasForChannel = (selNode, channel) => {
const pubkey = (channel.remote_pubkey) ? channel.remote_pubkey : (channel.remote_node_pub) ? channel.remote_node_pub : ''; const pubkey = (channel.remote_pubkey) ? channel.remote_pubkey : (channel.remote_node_pub) ? channel.remote_node_pub : '';
options.url = selNode.Settings.lnServerUrl + '/v1/graph/node/' + pubkey; options.url = selNode.settings.lnServerUrl + '/v1/graph/node/' + pubkey;
return request(options).then((aliasBody) => { return request(options).then((aliasBody) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Alias Received', data: aliasBody.node.alias }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Alias Received', data: aliasBody.node.alias });
channel.remote_alias = aliasBody.node.alias && aliasBody.node.alias !== '' ? aliasBody.node.alias : aliasBody.node.pub_key.slice(0, 20); channel.remote_alias = aliasBody.node.alias && aliasBody.node.alias !== '' ? aliasBody.node.alias : aliasBody.node.pub_key.slice(0, 20);
@ -22,7 +22,7 @@ export const getAllChannels = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels';
options.qs = req.query; options.qs = req.query;
let local = 0; let local = 0;
let remote = 0; let remote = 0;
@ -60,7 +60,7 @@ export const getPendingChannels = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/pending'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/pending';
options.qs = req.query; options.qs = req.query;
request(options).then((body) => { request(options).then((body) => {
if (!body.total_limbo_balance) { if (!body.total_limbo_balance) {
@ -98,7 +98,7 @@ export const getClosedChannels = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/closed'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/closed';
options.qs = req.query; options.qs = req.query;
request(options).then((body) => { request(options).then((body) => {
if (body.channels && body.channels.length > 0) { if (body.channels && body.channels.length > 0) {
@ -129,7 +129,7 @@ export const postChannel = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels';
options.form = { options.form = {
node_pubkey_string: node_pubkey, node_pubkey_string: node_pubkey,
local_funding_amount: local_funding_amount, local_funding_amount: local_funding_amount,
@ -162,7 +162,7 @@ export const postTransactions = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/transaction-stream'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/transaction-stream';
options.form = { payment_request: paymentReq }; options.form = { payment_request: paymentReq };
if (paymentAmount) { if (paymentAmount) {
options.form.amt = paymentAmount; options.form.amt = paymentAmount;
@ -208,7 +208,7 @@ export const closeChannel = (req, res, next) => {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
const channelpoint = req.params.channelPoint?.replace(':', '/'); const channelpoint = req.params.channelPoint?.replace(':', '/');
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/' + channelpoint + '?force=' + req.query.force; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/' + channelpoint + '?force=' + req.query.force;
if (req.query.target_conf) { if (req.query.target_conf) {
options.url = options.url + '&target_conf=' + req.query.target_conf; options.url = options.url + '&target_conf=' + req.query.target_conf;
} }
@ -232,7 +232,7 @@ export const postChanPolicy = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/chanpolicy'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/chanpolicy';
if (chanPoint === 'all') { if (chanPoint === 'all') {
options.form = JSON.stringify({ options.form = JSON.stringify({
global: true, global: true,

@ -39,15 +39,15 @@ export const getBackup = (req, res, next) => {
let channel_backup_file = ''; let channel_backup_file = '';
let message = ''; let message = '';
if (req.params.channelPoint === 'ALL') { if (req.params.channelPoint === 'ALL') {
channel_backup_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-all.bak'; channel_backup_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-all.bak';
message = 'All Channels Backup Successful.'; message = 'All Channels Backup Successful.';
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup';
} }
else { else {
channel_backup_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak'; channel_backup_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak';
message = 'Channel Backup Successful.'; message = 'Channel Backup Successful.';
const channelpoint = req.params.channelPoint?.replace(':', '/'); const channelpoint = req.params.channelPoint?.replace(':', '/');
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup/' + channelpoint; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup/' + channelpoint;
const exists = fs.existsSync(channel_backup_file); const exists = fs.existsSync(channel_backup_file);
if (exists) { if (exists) {
fs.writeFile(channel_backup_file, '', () => { }); fs.writeFile(channel_backup_file, '', () => { });
@ -86,13 +86,13 @@ export const postBackupVerify = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup/verify'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup/verify';
let channel_verify_file = ''; let channel_verify_file = '';
let message = ''; let message = '';
let verify_backup = ''; let verify_backup = '';
if (req.params.channelPoint === 'ALL') { if (req.params.channelPoint === 'ALL') {
message = 'All Channels Verify Successful.'; message = 'All Channels Verify Successful.';
channel_verify_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-all.bak'; channel_verify_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-all.bak';
const exists = fs.existsSync(channel_verify_file); const exists = fs.existsSync(channel_verify_file);
if (exists) { if (exists) {
verify_backup = fs.readFileSync(channel_verify_file, 'utf-8'); verify_backup = fs.readFileSync(channel_verify_file, 'utf-8');
@ -116,7 +116,7 @@ export const postBackupVerify = (req, res, next) => {
} }
else { else {
message = 'Channel Verify Successful.'; message = 'Channel Verify Successful.';
channel_verify_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak'; channel_verify_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak';
const exists = fs.existsSync(channel_verify_file); const exists = fs.existsSync(channel_verify_file);
if (exists) { if (exists) {
verify_backup = fs.readFileSync(channel_verify_file, 'utf-8'); verify_backup = fs.readFileSync(channel_verify_file, 'utf-8');
@ -146,13 +146,13 @@ export const postRestore = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup/restore'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup/restore';
let channel_restore_file = ''; let channel_restore_file = '';
let message = ''; let message = '';
let restore_backup = ''; let restore_backup = '';
if (req.params.channelPoint === 'ALL') { if (req.params.channelPoint === 'ALL') {
message = 'All Channels Restore Successful.'; message = 'All Channels Restore Successful.';
channel_restore_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'restore' + sep; channel_restore_file = req.session.selectedNode.settings.channelBackupPath + sep + 'restore' + sep;
const exists = fs.existsSync(channel_restore_file + 'channel-all.bak'); const exists = fs.existsSync(channel_restore_file + 'channel-all.bak');
const downloaded_exists = fs.existsSync(channel_restore_file + 'backup-channel-all.bak'); const downloaded_exists = fs.existsSync(channel_restore_file + 'backup-channel-all.bak');
if (exists) { if (exists) {
@ -188,7 +188,7 @@ export const postRestore = (req, res, next) => {
} }
else { else {
message = 'Channel Restore Successful.'; message = 'Channel Restore Successful.';
channel_restore_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'restore' + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak'; channel_restore_file = req.session.selectedNode.settings.channelBackupPath + sep + 'restore' + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak';
const exists = fs.existsSync(channel_restore_file); const exists = fs.existsSync(channel_restore_file);
if (exists) { if (exists) {
restore_backup = fs.readFileSync(channel_restore_file, 'utf-8'); restore_backup = fs.readFileSync(channel_restore_file, 'utf-8');
@ -208,7 +208,7 @@ export const postRestore = (req, res, next) => {
channel_restore_file = channel_restore_file + 'channel-all.bak'; channel_restore_file = channel_restore_file + 'channel-all.bak';
} }
fs.rename(channel_restore_file, channel_restore_file + '.restored', () => { fs.rename(channel_restore_file, channel_restore_file + '.restored', () => {
getFilesList(req.session.selectedNode.Settings.channelBackupPath, (getFilesListRes) => { getFilesList(req.session.selectedNode.settings.channelBackupPath, (getFilesListRes) => {
if (getFilesListRes.error) { if (getFilesListRes.error) {
const errMsg = getFilesListRes.error; const errMsg = getFilesListRes.error;
const err = common.handleError({ statusCode: 500, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg, req.session.selectedNode); const err = common.handleError({ statusCode: 500, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg, req.session.selectedNode);
@ -228,7 +228,7 @@ export const postRestore = (req, res, next) => {
} }
}; };
export const getRestoreList = (req, res, next) => { export const getRestoreList = (req, res, next) => {
getFilesList(req.session.selectedNode.Settings.channelBackupPath, (getFilesListRes) => { getFilesList(req.session.selectedNode.settings.channelBackupPath, (getFilesListRes) => {
if (getFilesListRes.error) { if (getFilesListRes.error) {
return res.status(getFilesListRes.statusCode).json(getFilesListRes); return res.status(getFilesListRes.statusCode).json(getFilesListRes);
} }

@ -11,7 +11,7 @@ export const getFees = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/fees'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/fees';
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Fee Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Fee Received', data: body });
const today = new Date(Date.now()); const today = new Date(Date.now());

@ -16,7 +16,7 @@ export const getInfo = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/getinfo'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/getinfo';
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode });
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from LND server url ' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from LND server url ' + options.url });
if (!options.headers || !options.headers['Grpc-Metadata-macaroon']) { if (!options.headers || !options.headers['Grpc-Metadata-macaroon']) {

@ -5,7 +5,7 @@ let options = null;
const logger = Logger; const logger = Logger;
const common = Common; const common = Common;
export const getAliasFromPubkey = (selNode, pubkey) => { export const getAliasFromPubkey = (selNode, pubkey) => {
options.url = selNode.Settings.lnServerUrl + '/v1/graph/node/' + pubkey; options.url = selNode.settings.lnServerUrl + '/v1/graph/node/' + pubkey;
return request(options).then((res) => { return request(options).then((res) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Graph', msg: 'Alias Received', data: res.node.alias }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Graph', msg: 'Alias Received', data: res.node.alias });
return res.node.alias; return res.node.alias;
@ -18,7 +18,7 @@ export const getDescribeGraph = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph';
request.get(options).then((body) => { request.get(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Network Graph Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Network Graph Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -33,7 +33,7 @@ export const getGraphInfo = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/info'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/info';
request.get(options).then((body) => { request.get(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Information Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Information Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -48,7 +48,7 @@ export const getGraphNode = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/node/' + req.params.pubKey; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/node/' + req.params.pubKey;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Node Information Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Node Information Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -63,7 +63,7 @@ export const getGraphEdge = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Edge Information Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Edge Information Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -78,7 +78,7 @@ export const getQueryRoutes = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/routes/' + req.params.destPubkey + '/' + req.params.amount; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/routes/' + req.params.destPubkey + '/' + req.params.amount;
if (req.query.outgoing_chan_id) { if (req.query.outgoing_chan_id) {
options.url = options.url + '?outgoing_chan_id=' + req.query.outgoing_chan_id; options.url = options.url + '?outgoing_chan_id=' + req.query.outgoing_chan_id;
} }
@ -116,7 +116,7 @@ export const getRemoteFeePolicy = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body });
let remoteNodeFee = {}; let remoteNodeFee = {};

@ -12,7 +12,7 @@ export const invoiceLookup = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/invoices/lookup'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/invoices/lookup';
if (req.query.payment_addr) { if (req.query.payment_addr) {
options.url = options.url + '?payment_addr=' + req.query.payment_addr; options.url = options.url + '?payment_addr=' + req.query.payment_addr;
} }
@ -36,7 +36,7 @@ export const listInvoices = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoices?num_max_invoices=' + req.query.num_max_invoices + '&index_offset=' + req.query.index_offset + options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoices?num_max_invoices=' + req.query.num_max_invoices + '&index_offset=' + req.query.index_offset +
'&reversed=' + req.query.reversed; '&reversed=' + req.query.reversed;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body });
@ -60,7 +60,7 @@ export const addInvoice = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoices'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoices';
options.form = JSON.stringify(req.body); options.form = JSON.stringify(req.body);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Added', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Added', data: body });

@ -11,7 +11,7 @@ export const signMessage = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/signmessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/signmessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(message).toString('base64') msg: Buffer.from(message).toString('base64')
}); });
@ -30,7 +30,7 @@ export const verifyMessage = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/verifymessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/verifymessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(message).toString('base64'), msg: Buffer.from(message).toString('base64'),
signature: signature signature: signature

@ -10,7 +10,7 @@ export const getNewAddress = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/newaddress?type=' + req.query.type; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/newaddress?type=' + req.query.type;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'NewAddress', msg: 'New Address Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'NewAddress', msg: 'New Address Generated', data: body });
res.status(200).json(body); res.status(200).json(body);

@ -5,7 +5,7 @@ let options = null;
const logger = Logger; const logger = Logger;
const common = Common; const common = Common;
export const decodePaymentFromPaymentRequest = (selNode, payment) => { export const decodePaymentFromPaymentRequest = (selNode, payment) => {
options.url = selNode.Settings.lnServerUrl + '/v1/payreq/' + payment; options.url = selNode.settings.lnServerUrl + '/v1/payreq/' + payment;
return request(options).then((res) => { return request(options).then((res) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'PayReq', msg: 'Description Received', data: res.description }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'PayReq', msg: 'Description Received', data: res.description });
return res; return res;
@ -17,7 +17,7 @@ export const decodePayment = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/payreq/' + req.params.payRequest; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/payreq/' + req.params.payRequest;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment Decoded', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment Decoded', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -56,7 +56,7 @@ export const getPayments = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/payments?max_payments=' + req.query.max_payments + '&index_offset=' + req.query.index_offset + '&reversed=' + req.query.reversed; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/payments?max_payments=' + req.query.max_payments + '&index_offset=' + req.query.index_offset + '&reversed=' + req.query.reversed;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -69,8 +69,8 @@ export const getAllLightningTransactions = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting All Lightning Transactions..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting All Lightning Transactions..' });
const options1 = JSON.parse(JSON.stringify(common.getOptions(req))); const options1 = JSON.parse(JSON.stringify(common.getOptions(req)));
const options2 = JSON.parse(JSON.stringify(common.getOptions(req))); const options2 = JSON.parse(JSON.stringify(common.getOptions(req)));
// options1.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/payments?max_payments=100000&index_offset=0&reversed=true'; // options1.url = req.session.selectedNode.settings.lnServerUrl + '/v1/payments?max_payments=100000&index_offset=0&reversed=true';
options2.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoices?num_max_invoices=100000&index_offset=0&reversed=true'; options2.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoices?num_max_invoices=100000&index_offset=0&reversed=true';
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Payments Options', data: options1 }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Payments Options', data: options1 });
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Invoices Options', data: options2 }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Invoices Options', data: options2 });
// return Promise.all([request(options1), request(options2)]).then((values) => { // return Promise.all([request(options1), request(options2)]).then((values) => {
@ -88,7 +88,7 @@ export const paymentLookup = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/router/track/' + req.params.paymentHash; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/router/track/' + req.params.paymentHash;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Information Received for ' + req.params.paymentHash, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Information Received for ' + req.params.paymentHash, data: body });
res.status(200).json(body.result || body); res.status(200).json(body.result || body);

@ -5,7 +5,7 @@ let options = null;
const logger = Logger; const logger = Logger;
const common = Common; const common = Common;
export const getAliasForPeers = (selNode, peer) => { export const getAliasForPeers = (selNode, peer) => {
options.url = selNode.Settings.lnServerUrl + '/v1/graph/node/' + peer.pub_key; options.url = selNode.settings.lnServerUrl + '/v1/graph/node/' + peer.pub_key;
return request(options).then((aliasBody) => { return request(options).then((aliasBody) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Alias Received', data: aliasBody.node.alias }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Alias Received', data: aliasBody.node.alias });
peer.alias = aliasBody.node.alias; peer.alias = aliasBody.node.alias;
@ -21,7 +21,7 @@ export const getPeers = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers';
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body });
const peers = !body.peers ? [] : body.peers; const peers = !body.peers ? [] : body.peers;
@ -41,14 +41,14 @@ export const postPeer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers';
options.form = JSON.stringify({ options.form = JSON.stringify({
addr: { host: host, pubkey: pubkey }, addr: { host: host, pubkey: pubkey },
perm: perm perm: perm
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers';
request(options).then((body) => { request(options).then((body) => {
const peers = (!body.peers) ? [] : body.peers; const peers = (!body.peers) ? [] : body.peers;
return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => { return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => {
@ -76,7 +76,7 @@ export const deletePeer = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers/' + req.params.peerPubKey; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers/' + req.params.peerPubKey;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnect Pubkey', data: req.params.peerPubKey }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnect Pubkey', data: req.params.peerPubKey });
request.delete(options).then((body) => { request.delete(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconneted', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconneted', data: body });

@ -27,7 +27,7 @@ export const getAllForwardingEvents = (req, start, end, offset, caller, callback
return callback({ message: err.message, error: err.error, statusCode: err.statusCode }); return callback({ message: err.message, error: err.error, statusCode: err.statusCode });
} }
options = common.getOptions(req); options = common.getOptions(req);
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/switch'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/switch';
options.form = {}; options.form = {};
if (start) { if (start) {
options.form.start_time = start; options.form.start_time = start;

@ -10,7 +10,7 @@ export const getTransactions = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/transactions'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/transactions';
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Transactions', msg: 'Transactions List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Transactions', msg: 'Transactions List Received', data: body });
res.status(200).json(body.transactions); res.status(200).json(body.transactions);
@ -26,7 +26,7 @@ export const postTransactions = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/transactions'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/transactions';
options.form = { options.form = {
amount: amount, amount: amount,
addr: address, addr: address,

@ -12,10 +12,10 @@ export const genSeed = (req, res, next) => {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
if (req.params.passphrase) { if (req.params.passphrase) {
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/genseed?aezeed_passphrase=' + Buffer.from(atob(req.params.passphrase)).toString('base64'); options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/genseed?aezeed_passphrase=' + Buffer.from(atob(req.params.passphrase)).toString('base64');
} }
else { else {
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/genseed'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/genseed';
} }
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Seed Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Seed Generated', data: body });
@ -35,7 +35,7 @@ export const operateWallet = (req, res, next) => {
options.method = 'POST'; options.method = 'POST';
if (!req.params.operation || req.params.operation === 'unlockwallet') { if (!req.params.operation || req.params.operation === 'unlockwallet') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/unlockwallet'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/unlockwallet';
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(wallet_password)).toString('base64') wallet_password: Buffer.from(atob(wallet_password)).toString('base64')
}); });
@ -43,7 +43,7 @@ export const operateWallet = (req, res, next) => {
} }
else { else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/initwallet'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/initwallet';
if (aezeed_passphrase && aezeed_passphrase !== '') { if (aezeed_passphrase && aezeed_passphrase !== '') {
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(wallet_password)).toString('base64'), wallet_password: Buffer.from(atob(wallet_password)).toString('base64'),
@ -104,7 +104,7 @@ export const getUTXOs = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/utxos'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/utxos';
if (common.isVersionCompatible(req.session.selectedNode.lnVersion, '0.14.0')) { if (common.isVersionCompatible(req.session.selectedNode.lnVersion, '0.14.0')) {
options.form = JSON.stringify({ max_confs: req.query.max_confs }); options.form = JSON.stringify({ max_confs: req.query.max_confs });
} }
@ -126,7 +126,7 @@ export const bumpFee = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/bumpfee'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/bumpfee';
options.form = {}; options.form = {};
options.form.outpoint = { options.form.outpoint = {
txid_str: txid, txid_str: txid,
@ -153,7 +153,7 @@ export const labelTransaction = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/tx/label'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/tx/label';
options.form = JSON.parse(JSON.stringify(options.form)); options.form = JSON.parse(JSON.stringify(options.form));
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -171,7 +171,7 @@ export const leaseUTXO = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/utxos/lease'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/utxos/lease';
options.form = {}; options.form = {};
options.form.id = txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {
@ -195,7 +195,7 @@ export const releaseUTXO = (req, res, next) => {
if (options.error) { if (options.error) {
return res.status(options.statusCode).json({ message: options.message, error: options.error }); return res.status(options.statusCode).json({ message: options.message, error: options.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/utxos/release'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/utxos/release';
options.form = {}; options.form = {};
options.form.id = txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {

@ -13,7 +13,7 @@ export class LNDWebSocketClient {
this.connect = (selectedNode) => { this.connect = (selectedNode) => {
try { try {
const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index); const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index);
if (!clientExists && selectedNode.Settings.lnServerUrl) { if (!clientExists && selectedNode.settings.lnServerUrl) {
const newWebSocketClient = { selectedNode: selectedNode }; const newWebSocketClient = { selectedNode: selectedNode };
this.webSocketClients.push(newWebSocketClient); this.webSocketClients.push(newWebSocketClient);
} }
@ -25,7 +25,7 @@ export class LNDWebSocketClient {
this.fetchUnpaidInvoices = (selectedNode) => { this.fetchUnpaidInvoices = (selectedNode) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Getting Unpaid Invoices..' }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Getting Unpaid Invoices..' });
const options = this.setOptionsForSelNode(selectedNode); const options = this.setOptionsForSelNode(selectedNode);
options.url = selectedNode.Settings.lnServerUrl + '/v1/invoices?pending_only=true'; options.url = selectedNode.settings.lnServerUrl + '/v1/invoices?pending_only=true';
return request(options).then((body) => { return request(options).then((body) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Unpaid Invoices Received', data: body }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Unpaid Invoices Received', data: body });
if (body.invoices && body.invoices.length > 0) { if (body.invoices && body.invoices.length > 0) {
@ -44,7 +44,7 @@ export class LNDWebSocketClient {
this.subscribeToInvoice = (options, selectedNode, rHash) => { this.subscribeToInvoice = (options, selectedNode, rHash) => {
rHash = rHash?.replace(/\+/g, '-')?.replace(/[/]/g, '_'); rHash = rHash?.replace(/\+/g, '-')?.replace(/[/]/g, '_');
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Invoice ' + rHash + ' ..' }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Invoice ' + rHash + ' ..' });
options.url = selectedNode.Settings.lnServerUrl + '/v2/invoices/subscribe/' + rHash; options.url = selectedNode.settings.lnServerUrl + '/v2/invoices/subscribe/' + rHash;
request(options).then((msg) => { request(options).then((msg) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Invoice Information Received for ' + rHash }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Invoice Information Received for ' + rHash });
if (typeof msg === 'string') { if (typeof msg === 'string') {
@ -67,7 +67,7 @@ export class LNDWebSocketClient {
}; };
this.subscribeToPayment = (options, selectedNode, paymentHash) => { this.subscribeToPayment = (options, selectedNode, paymentHash) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Payment ' + paymentHash + ' ..' }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Payment ' + paymentHash + ' ..' });
options.url = selectedNode.Settings.lnServerUrl + '/v2/router/track/' + paymentHash; options.url = selectedNode.settings.lnServerUrl + '/v2/router/track/' + paymentHash;
request(options).then((msg) => { request(options).then((msg) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Payment Information Received for ' + paymentHash }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Payment Information Received for ' + paymentHash });
msg['type'] = 'payment'; msg['type'] = 'payment';
@ -84,7 +84,7 @@ export class LNDWebSocketClient {
this.setOptionsForSelNode = (selectedNode) => { this.setOptionsForSelNode = (selectedNode) => {
const options = { url: '', rejectUnauthorized: false, json: true, form: null }; const options = { url: '', rejectUnauthorized: false, json: true, form: null };
try { try {
options['headers'] = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(selectedNode.Authentication.macaroonPath, 'admin.macaroon')).toString('hex') }; options['headers'] = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(selectedNode.authentication.macaroonPath, 'admin.macaroon')).toString('hex') };
} }
catch (err) { catch (err) {
this.logger.log({ selectedNode: selectedNode, level: 'ERROR', fileName: 'WebSocketClient', msg: 'Set Options Error', error: JSON.stringify(err) }); this.logger.log({ selectedNode: selectedNode, level: 'ERROR', fileName: 'WebSocketClient', msg: 'Set Options Error', error: JSON.stringify(err) });

@ -39,9 +39,9 @@ export const removeSecureData = (config) => {
delete config.multiPassHashed; delete config.multiPassHashed;
delete config.secret2FA; delete config.secret2FA;
config.nodes.map((node) => { config.nodes.map((node) => {
delete node.Authentication.macaroonPath; delete node.authentication.macaroonPath;
delete node.Authentication.runePath; delete node.authentication.runePath;
delete node.Authentication.lnApiPassword; delete node.authentication.lnApiPassword;
return node; return node;
}); });
return config; return config;
@ -58,14 +58,14 @@ export const addSecureData = (config) => {
config.secret2FA = common.appConfig.secret2FA; config.secret2FA = common.appConfig.secret2FA;
} }
config.nodes.map((node, i) => { config.nodes.map((node, i) => {
if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].Authentication && common.appConfig.nodes[i].Authentication.macaroonPath) { if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].authentication && common.appConfig.nodes[i].authentication.macaroonPath) {
node.Authentication.macaroonPath = common.appConfig.nodes[i].Authentication.macaroonPath; node.authentication.macaroonPath = common.appConfig.nodes[i].authentication.macaroonPath;
} }
if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].Authentication && common.appConfig.nodes[i].Authentication.runePath) { if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].authentication && common.appConfig.nodes[i].authentication.runePath) {
node.Authentication.runePath = common.appConfig.nodes[i].Authentication.runePath; node.authentication.runePath = common.appConfig.nodes[i].authentication.runePath;
} }
if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].Authentication && common.appConfig.nodes[i].Authentication.lnApiPassword) { if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].authentication && common.appConfig.nodes[i].authentication.lnApiPassword) {
node.Authentication.lnApiPassword = common.appConfig.nodes[i].Authentication.lnApiPassword; node.authentication.lnApiPassword = common.appConfig.nodes[i].authentication.lnApiPassword;
} }
return node; return node;
}); });
@ -85,7 +85,7 @@ export const getCurrencyRates = (req, res, next) => {
}; };
export const getFile = (req, res, next) => { export const getFile = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Getting File..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Getting File..' });
const file = req.query.path ? req.query.path : (req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-' + req.query.channel?.replace(':', '-') + '.bak'); const file = req.query.path ? req.query.path : (req.session.selectedNode.settings.channelBackupPath + sep + 'channel-' + req.query.channel?.replace(':', '-') + '.bak');
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'Channel Point', data: req.query.channel }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'Channel Point', data: req.query.channel });
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'File Path', data: file }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'File Path', data: file });
fs.readFile(file, 'utf8', (errRes, data) => { fs.readFile(file, 'utf8', (errRes, data) => {
@ -126,14 +126,14 @@ export const getApplicationSettings = (req, res, next) => {
appConfData.SSO = new SSO(); appConfData.SSO = new SSO();
appConfData.secret2FA = ''; appConfData.secret2FA = '';
appConfData.dbDirectoryPath = ''; appConfData.dbDirectoryPath = '';
appConfData.nodes[selNodeIdx].Authentication = new Authentication(); appConfData.nodes[selNodeIdx].authentication = new Authentication();
delete appConfData.nodes[selNodeIdx].Settings.bitcoindConfigPath; delete appConfData.nodes[selNodeIdx].settings.bitcoindConfigPath;
delete appConfData.nodes[selNodeIdx].Settings.lnServerUrl; delete appConfData.nodes[selNodeIdx].settings.lnServerUrl;
delete appConfData.nodes[selNodeIdx].Settings.swapServerUrl; delete appConfData.nodes[selNodeIdx].settings.swapServerUrl;
delete appConfData.nodes[selNodeIdx].Settings.boltzServerUrl; delete appConfData.nodes[selNodeIdx].settings.boltzServerUrl;
delete appConfData.nodes[selNodeIdx].Settings.enableOffers; delete appConfData.nodes[selNodeIdx].settings.enableOffers;
delete appConfData.nodes[selNodeIdx].Settings.enablePeerswap; delete appConfData.nodes[selNodeIdx].settings.enablePeerswap;
delete appConfData.nodes[selNodeIdx].Settings.channelBackupPath; delete appConfData.nodes[selNodeIdx].settings.channelBackupPath;
appConfData.nodes = [appConfData.nodes[selNodeIdx]]; appConfData.nodes = [appConfData.nodes[selNodeIdx]];
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'RTL Configuration Received', data: appConfData }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'RTL Configuration Received', data: appConfData });
@ -165,10 +165,10 @@ export const getConfig = (req, res, next) => {
let fileFormat = 'INI'; let fileFormat = 'INI';
switch (req.params.nodeType) { switch (req.params.nodeType) {
case 'ln': case 'ln':
confFile = req.session.selectedNode.Authentication.configPath; confFile = req.session.selectedNode.authentication.configPath;
break; break;
case 'bitcoind': case 'bitcoind':
confFile = req.session.selectedNode.Settings.bitcoindConfigPath; confFile = req.session.selectedNode.settings.bitcoindConfigPath;
break; break;
case 'rtl': case 'rtl':
fileFormat = 'JSON'; fileFormat = 'JSON';
@ -215,14 +215,14 @@ export const updateNodeSettings = (req, res, next) => {
const RTLConfFile = common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json'; const RTLConfFile = common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index)); const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index));
if (node && node.Settings) { if (node && node.settings) {
node.Settings = req.body; node.settings = req.body;
} }
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
const selectedNode = common.findNode(req.session.selectedNode.index); const selectedNode = common.findNode(req.session.selectedNode.index);
if (selectedNode && selectedNode.Settings) { if (selectedNode && selectedNode.settings) {
selectedNode.Settings = req.body; selectedNode.settings = req.body;
common.replaceNode(req, selectedNode); common.replaceNode(req, selectedNode);
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Node Settings Updated', data: maskPasswords(config) }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Node Settings Updated', data: maskPasswords(config) });

@ -55,15 +55,15 @@ export class ApplicationConfig {
} }
} }
export class SelectedNode { export class SelectedNode {
constructor(logLevel, logFile, index, lnNode, lnImplementation, lnVersion, Settings, Authentication) { constructor(logLevel, logFile, index, lnNode, lnImplementation, lnVersion, settings, authentication) {
this.logLevel = logLevel; this.logLevel = logLevel;
this.logFile = logFile; this.logFile = logFile;
this.index = index; this.index = index;
this.lnNode = lnNode; this.lnNode = lnNode;
this.lnImplementation = lnImplementation; this.lnImplementation = lnImplementation;
this.lnVersion = lnVersion; this.lnVersion = lnVersion;
this.Settings = Settings; this.settings = settings;
this.Authentication = Authentication; this.authentication = authentication;
} }
} }
export class LogJSONObj { export class LogJSONObj {

@ -1,7 +0,0 @@
import exprs from 'express';
const { Router } = exprs;
import { isAuthenticated } from '../../utils/authCheck.js';
import { getBalance } from '../../controllers/cln/balance.js';
const router = Router();
router.get('/', isAuthenticated, getBalance);
export default router;

@ -1,7 +0,0 @@
import exprs from 'express';
const { Router } = exprs;
import { isAuthenticated } from '../../utils/authCheck.js';
import { getFees } from '../../controllers/cln/fees.js';
const router = Router();
router.get('/', isAuthenticated, getFees);
export default router;

@ -23,15 +23,15 @@ export class CommonService {
]; ];
this.setSwapServerOptions = (req) => { this.setSwapServerOptions = (req) => {
const swapOptions = { const swapOptions = {
baseUrl: req.session.selectedNode.Settings.swapServerUrl, baseUrl: req.session.selectedNode.settings.swapServerUrl,
uri: '', uri: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
headers: { 'Grpc-Metadata-macaroon': '' } headers: { 'Grpc-Metadata-macaroon': '' }
}; };
if (req.session.selectedNode.Authentication.swapMacaroonPath) { if (req.session.selectedNode.authentication.swapMacaroonPath) {
try { try {
swapOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.Authentication.swapMacaroonPath, 'loop.macaroon')).toString('hex') }; swapOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.authentication.swapMacaroonPath, 'loop.macaroon')).toString('hex') };
} }
catch (err) { catch (err) {
this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Loop macaroon Error', error: err }); this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Loop macaroon Error', error: err });
@ -42,14 +42,14 @@ export class CommonService {
}; };
this.getBoltzServerOptions = (req) => { this.getBoltzServerOptions = (req) => {
const boltzOptions = { const boltzOptions = {
url: req.session.selectedNode.Settings.boltzServerUrl, url: req.session.selectedNode.settings.boltzServerUrl,
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
headers: { 'Grpc-Metadata-macaroon': '' } headers: { 'Grpc-Metadata-macaroon': '' }
}; };
if (req.session.selectedNode.Authentication.boltzMacaroonPath) { if (req.session.selectedNode.authentication.boltzMacaroonPath) {
try { try {
boltzOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.Authentication.boltzMacaroonPath, 'admin.macaroon')).toString('hex') }; boltzOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.authentication.boltzMacaroonPath, 'admin.macaroon')).toString('hex') };
} }
catch (err) { catch (err) {
this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Boltz macaroon Error', error: err }); this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Boltz macaroon Error', error: err });
@ -59,12 +59,12 @@ export class CommonService {
return boltzOptions; return boltzOptions;
}; };
this.getOptions = (req) => { this.getOptions = (req) => {
if (req.session.selectedNode && req.session.selectedNode.Authentication.options) { if (req.session.selectedNode && req.session.selectedNode.authentication.options) {
req.session.selectedNode.Authentication.options.method = (req.session.selectedNode.lnImplementation && req.session.selectedNode.lnImplementation.toUpperCase() === 'LND') ? 'GET' : 'POST'; req.session.selectedNode.authentication.options.method = (req.session.selectedNode.lnImplementation && req.session.selectedNode.lnImplementation.toUpperCase() === 'LND') ? 'GET' : 'POST';
delete req.session.selectedNode.Authentication.options.form; delete req.session.selectedNode.authentication.options.form;
delete req.session.selectedNode.Authentication.options.body; delete req.session.selectedNode.authentication.options.body;
req.session.selectedNode.Authentication.options.qs = {}; req.session.selectedNode.authentication.options.qs = {};
return req.session.selectedNode.Authentication.options; return req.session.selectedNode.authentication.options;
} }
return this.handleError({ statusCode: 401, message: 'Session expired after a day\'s inactivity' }, 'Session Expired', 'Session Expiry Error', this.selectedNode); return this.handleError({ statusCode: 401, message: 'Session expired after a day\'s inactivity' }, 'Session Expired', 'Session Expiry Error', this.selectedNode);
}; };
@ -72,7 +72,7 @@ export class CommonService {
if (!req.session.selectedNode) { if (!req.session.selectedNode) {
req.session.selectedNode = {}; req.session.selectedNode = {};
} }
req.session.selectedNode.Authentication.options = { req.session.selectedNode.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
@ -83,30 +83,30 @@ export class CommonService {
switch (req.session.selectedNode.lnImplementation.toUpperCase()) { switch (req.session.selectedNode.lnImplementation.toUpperCase()) {
case 'CLN': case 'CLN':
try { try {
if (!req.session.selectedNode.Authentication.runeValue) { if (!req.session.selectedNode.authentication.runeValue) {
req.session.selectedNode.Authentication.runeValue = this.getRuneValue(req.session.selectedNode.Authentication.runePath); req.session.selectedNode.authentication.runeValue = this.getRuneValue(req.session.selectedNode.authentication.runePath);
} }
req.session.selectedNode.Authentication.options.headers = { rune: req.session.selectedNode.Authentication.runeValue }; req.session.selectedNode.authentication.options.headers = { rune: req.session.selectedNode.authentication.runeValue };
} }
catch (err) { catch (err) {
throw new Error(err); throw new Error(err);
} }
break; break;
case 'ECL': case 'ECL':
req.session.selectedNode.Authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + req.session.selectedNode.Authentication.lnApiPassword).toString('base64') }; req.session.selectedNode.authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + req.session.selectedNode.authentication.lnApiPassword).toString('base64') };
break; break;
default: default:
req.session.selectedNode.Authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.Authentication.macaroonPath, 'admin.macaroon')).toString('hex') }; req.session.selectedNode.authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.authentication.macaroonPath, 'admin.macaroon')).toString('hex') };
break; break;
} }
} }
if (req.session.selectedNode) { if (req.session.selectedNode) {
this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Updated Node Options for ' + req.session.selectedNode.lnNode, data: req.session.selectedNode.Authentication.options }); this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Updated Node Options for ' + req.session.selectedNode.lnNode, data: req.session.selectedNode.authentication.options });
} }
return { status: 200, message: 'Updated Successfully' }; return { status: 200, message: 'Updated Successfully' };
} }
catch (err) { catch (err) {
req.session.selectedNode.Authentication.options = { req.session.selectedNode.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
@ -128,12 +128,12 @@ export class CommonService {
} }
}; };
this.setOptions = (req) => { this.setOptions = (req) => {
if (this.nodes[0].Authentication.options && this.nodes[0].Authentication.options.headers) { if (this.nodes[0].authentication.options && this.nodes[0].authentication.options.headers) {
return; return;
} }
if (this.nodes && this.nodes.length > 0) { if (this.nodes && this.nodes.length > 0) {
this.nodes.forEach((node) => { this.nodes.forEach((node) => {
node.Authentication.options = { node.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
@ -144,34 +144,34 @@ export class CommonService {
switch (node.lnImplementation.toUpperCase()) { switch (node.lnImplementation.toUpperCase()) {
case 'CLN': case 'CLN':
try { try {
if (!node.Authentication.runeValue) { if (!node.authentication.runeValue) {
node.Authentication.runeValue = this.getRuneValue(node.Authentication.runePath); node.authentication.runeValue = this.getRuneValue(node.authentication.runePath);
} }
node.Authentication.options.headers = { rune: node.Authentication.runeValue }; node.authentication.options.headers = { rune: node.authentication.runeValue };
} }
catch (err) { catch (err) {
throw new Error(err); throw new Error(err);
} }
break; break;
case 'ECL': case 'ECL':
node.Authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + node.Authentication.lnApiPassword).toString('base64') }; node.authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + node.authentication.lnApiPassword).toString('base64') };
break; break;
default: default:
node.Authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(node.Authentication.macaroonPath, 'admin.macaroon')).toString('hex') }; node.authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(node.authentication.macaroonPath, 'admin.macaroon')).toString('hex') };
break; break;
} }
} }
} }
catch (err) { catch (err) {
this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Common Set Options Error', error: err }); this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Common Set Options Error', error: err });
node.Authentication.options = { node.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
form: '' form: ''
}; };
} }
this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Set Node Options for ' + node.lnNode, data: node.Authentication.options }); this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Set Node Options for ' + node.lnNode, data: node.authentication.options });
}); });
this.updateSelectedNodeOptions(req); this.updateSelectedNodeOptions(req);
} }
@ -411,12 +411,12 @@ export class CommonService {
} }
}; };
this.getAllNodeAllChannelBackup = (node) => { this.getAllNodeAllChannelBackup = (node) => {
const channel_backup_file = node.Settings.channelBackupPath + sep + 'channel-all.bak'; const channel_backup_file = node.settings.channelBackupPath + sep + 'channel-all.bak';
const options = { const options = {
url: node.Settings.lnServerUrl + '/v1/channels/backup', url: node.settings.lnServerUrl + '/v1/channels/backup',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
headers: { 'Grpc-Metadata-macaroon': fs.readFileSync(node.Authentication.macaroonPath + '/admin.macaroon').toString('hex') } headers: { 'Grpc-Metadata-macaroon': fs.readFileSync(node.authentication.macaroonPath + '/admin.macaroon').toString('hex') }
}; };
this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Getting Channel Backup for Node ' + node.lnNode + '..' }); this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Getting Channel Backup for Node ' + node.lnNode + '..' });
request(options).then((body) => { request(options).then((body) => {
@ -478,9 +478,9 @@ export class CommonService {
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'INDEX: ' + selNode.index }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'INDEX: ' + selNode.index });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN NODE: ' + selNode.lnNode }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN NODE: ' + selNode.lnNode });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + selNode.lnImplementation }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + selNode.lnImplementation });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + selNode.Settings.fiatConversion }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + selNode.settings.fiatConversion });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + selNode.Settings.currencyUnit }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + selNode.settings.currencyUnit });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + selNode.Settings.lnServerUrl }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + selNode.settings.lnServerUrl });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + this.appConfig.SSO.logoutRedirectLink + '\r\n' }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + this.appConfig.SSO.logoutRedirectLink + '\r\n' });
} }
}; };

@ -61,11 +61,11 @@ export class ConfigService {
index: 1, index: 1,
lnNode: 'Node 1', lnNode: 'Node 1',
lnImplementation: 'LND', lnImplementation: 'LND',
Authentication: { authentication: {
macaroonPath: macaroonPath, macaroonPath: macaroonPath,
configPath: configPath configPath: configPath
}, },
Settings: { settings: {
userPersona: 'MERCHANT', userPersona: 'MERCHANT',
themeMode: 'DAY', themeMode: 'DAY',
themeColor: 'PURPLE', themeColor: 'PURPLE',
@ -100,10 +100,10 @@ export class ConfigService {
const RTLConfFile = this.common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json'; const RTLConfFile = this.common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.nodes.forEach((node) => { config.nodes.forEach((node) => {
if (node.Settings.hasOwnProperty('enableLogging')) { if (node.settings.hasOwnProperty('enableLogging')) {
updateLogFlag = true; updateLogFlag = true;
node.Settings.logLevel = node.Settings.enableLogging ? 'INFO' : 'ERROR'; node.settings.logLevel = node.settings.enableLogging ? 'INFO' : 'ERROR';
delete node.Settings.enableLogging; delete node.settings.enableLogging;
} }
}); });
if (updateLogFlag) { if (updateLogFlag) {
@ -142,7 +142,7 @@ export class ConfigService {
config.dbDirectoryPath = (process?.env?.DB_DIRECTORY_PATH) ? process?.env?.DB_DIRECTORY_PATH : (config.dbDirectoryPath) ? config.dbDirectoryPath : join(dirname(fileURLToPath(import.meta.url)), '..', '..'); config.dbDirectoryPath = (process?.env?.DB_DIRECTORY_PATH) ? process?.env?.DB_DIRECTORY_PATH : (config.dbDirectoryPath) ? config.dbDirectoryPath : join(dirname(fileURLToPath(import.meta.url)), '..', '..');
if (config.nodes && config.nodes.length > 0) { if (config.nodes && config.nodes.length > 0) {
config.nodes.forEach((node, idx) => { config.nodes.forEach((node, idx) => {
this.common.nodes[idx] = { Settings: {}, Authentication: {} }; this.common.nodes[idx] = { settings: {}, authentication: {} };
this.common.nodes[idx].index = node.index; this.common.nodes[idx].index = node.index;
this.common.nodes[idx].lnNode = node.lnNode; this.common.nodes[idx].lnNode = node.lnNode;
this.common.nodes[idx].lnImplementation = (process?.env?.lnImplementation) ? process?.env?.lnImplementation : node.lnImplementation ? node.lnImplementation : 'LND'; this.common.nodes[idx].lnImplementation = (process?.env?.lnImplementation) ? process?.env?.lnImplementation : node.lnImplementation ? node.lnImplementation : 'LND';
@ -152,10 +152,10 @@ export class ConfigService {
switch (this.common.nodes[idx].lnImplementation) { switch (this.common.nodes[idx].lnImplementation) {
case 'CLN': case 'CLN':
if (process?.env?.RUNE_PATH && process?.env?.RUNE_PATH.trim() !== '') { if (process?.env?.RUNE_PATH && process?.env?.RUNE_PATH.trim() !== '') {
this.common.nodes[idx].Authentication.runePath = process?.env?.RUNE_PATH; this.common.nodes[idx].authentication.runePath = process?.env?.RUNE_PATH;
} }
else if (node.Authentication && node.Authentication.runePath && node.Authentication.runePath.trim() !== '') { else if (node.authentication && node.authentication.runePath && node.authentication.runePath.trim() !== '') {
this.common.nodes[idx].Authentication.runePath = node.Authentication.runePath; this.common.nodes[idx].authentication.runePath = node.authentication.runePath;
} }
else { else {
this.errMsg = 'Please set rune path for node index ' + node.index + ' in RTL-Config.json!'; this.errMsg = 'Please set rune path for node index ' + node.index + ' in RTL-Config.json!';
@ -163,21 +163,21 @@ export class ConfigService {
break; break;
case 'ECL': case 'ECL':
if (process?.env?.LN_API_PASSWORD) { if (process?.env?.LN_API_PASSWORD) {
this.common.nodes[idx].Authentication.lnApiPassword = process?.env?.LN_API_PASSWORD; this.common.nodes[idx].authentication.lnApiPassword = process?.env?.LN_API_PASSWORD;
} }
else if (node.Authentication && node.Authentication.lnApiPassword) { else if (node.authentication && node.authentication.lnApiPassword) {
this.common.nodes[idx].Authentication.lnApiPassword = node.Authentication.lnApiPassword; this.common.nodes[idx].authentication.lnApiPassword = node.authentication.lnApiPassword;
} }
else { else {
this.common.nodes[idx].Authentication.lnApiPassword = ''; this.common.nodes[idx].authentication.lnApiPassword = '';
} }
break; break;
default: default:
if (process?.env?.MACAROON_PATH && process?.env?.MACAROON_PATH.trim() !== '') { if (process?.env?.MACAROON_PATH && process?.env?.MACAROON_PATH.trim() !== '') {
this.common.nodes[idx].Authentication.macaroonPath = process?.env?.MACAROON_PATH; this.common.nodes[idx].authentication.macaroonPath = process?.env?.MACAROON_PATH;
} }
else if (node.Authentication && node.Authentication.macaroonPath && node.Authentication.macaroonPath.trim() !== '') { else if (node.authentication && node.authentication.macaroonPath && node.authentication.macaroonPath.trim() !== '') {
this.common.nodes[idx].Authentication.macaroonPath = node.Authentication.macaroonPath; this.common.nodes[idx].authentication.macaroonPath = node.authentication.macaroonPath;
} }
else { else {
this.errMsg = 'Please set macaroon path for node index ' + node.index + ' in RTL-Config.json!'; this.errMsg = 'Please set macaroon path for node index ' + node.index + ' in RTL-Config.json!';
@ -185,100 +185,100 @@ export class ConfigService {
break; break;
} }
if (process?.env?.CONFIG_PATH) { if (process?.env?.CONFIG_PATH) {
this.common.nodes[idx].Authentication.configPath = process?.env?.CONFIG_PATH; this.common.nodes[idx].authentication.configPath = process?.env?.CONFIG_PATH;
} }
else if (node.Authentication && node.Authentication.configPath) { else if (node.authentication && node.authentication.configPath) {
this.common.nodes[idx].Authentication.configPath = node.Authentication.configPath; this.common.nodes[idx].authentication.configPath = node.authentication.configPath;
} }
else { else {
this.common.nodes[idx].Authentication.configPath = ''; this.common.nodes[idx].authentication.configPath = '';
} }
if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].Authentication.lnApiPassword === '' && this.common.nodes[idx].Authentication.configPath !== '') { if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].authentication.lnApiPassword === '' && this.common.nodes[idx].authentication.configPath !== '') {
try { try {
const exists = fs.existsSync(this.common.nodes[idx].Authentication.configPath || ''); const exists = fs.existsSync(this.common.nodes[idx].authentication.configPath || '');
if (exists) { if (exists) {
try { try {
const configFile = fs.readFileSync((this.common.nodes[idx].Authentication.configPath || ''), 'utf-8'); const configFile = fs.readFileSync((this.common.nodes[idx].authentication.configPath || ''), 'utf-8');
const iniParsed = ini.parse(configFile); const iniParsed = ini.parse(configFile);
this.common.nodes[idx].Authentication.lnApiPassword = iniParsed['eclair.api.password'] ? iniParsed['eclair.api.password'] : parseHocon(configFile).eclair.api.password; this.common.nodes[idx].authentication.lnApiPassword = iniParsed['eclair.api.password'] ? iniParsed['eclair.api.password'] : parseHocon(configFile).eclair.api.password;
} }
catch (err) { catch (err) {
this.errMsg = this.errMsg + '\nSomething went wrong while reading config file: \n' + err; this.errMsg = this.errMsg + '\nSomething went wrong while reading config file: \n' + err;
} }
} }
else { else {
this.errMsg = this.errMsg + '\nInvalid config path: ' + this.common.nodes[idx].Authentication.configPath; this.errMsg = this.errMsg + '\nInvalid config path: ' + this.common.nodes[idx].authentication.configPath;
} }
} }
catch (err) { catch (err) {
this.errMsg = this.errMsg + '\nUnable to read config file: \n' + err; this.errMsg = this.errMsg + '\nUnable to read config file: \n' + err;
} }
} }
if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].Authentication.lnApiPassword === '') { if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].authentication.lnApiPassword === '') {
this.errMsg = this.errMsg + '\nPlease set config path Or api password for node index ' + node.index + ' in RTL-Config.json! It is mandatory for Eclair authentication!'; this.errMsg = this.errMsg + '\nPlease set config path Or api password for node index ' + node.index + ' in RTL-Config.json! It is mandatory for Eclair authentication!';
} }
if (process?.env?.LN_SERVER_URL && process?.env?.LN_SERVER_URL.trim() !== '') { if (process?.env?.LN_SERVER_URL && process?.env?.LN_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = process?.env?.LN_SERVER_URL.endsWith('/v1') ? process?.env?.LN_SERVER_URL.slice(0, -3) : process?.env?.LN_SERVER_URL; this.common.nodes[idx].settings.lnServerUrl = process?.env?.LN_SERVER_URL.endsWith('/v1') ? process?.env?.LN_SERVER_URL.slice(0, -3) : process?.env?.LN_SERVER_URL;
} }
else if (process?.env?.LND_SERVER_URL && process?.env?.LND_SERVER_URL.trim() !== '') { else if (process?.env?.LND_SERVER_URL && process?.env?.LND_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = process?.env?.LND_SERVER_URL.endsWith('/v1') ? process?.env?.LND_SERVER_URL.slice(0, -3) : process?.env?.LND_SERVER_URL; this.common.nodes[idx].settings.lnServerUrl = process?.env?.LND_SERVER_URL.endsWith('/v1') ? process?.env?.LND_SERVER_URL.slice(0, -3) : process?.env?.LND_SERVER_URL;
} }
else if (node.Settings.lnServerUrl && node.Settings.lnServerUrl.trim() !== '') { else if (node.settings.lnServerUrl && node.settings.lnServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = node.Settings.lnServerUrl.endsWith('/v1') ? node.Settings.lnServerUrl.slice(0, -3) : node.Settings.lnServerUrl; this.common.nodes[idx].settings.lnServerUrl = node.settings.lnServerUrl.endsWith('/v1') ? node.settings.lnServerUrl.slice(0, -3) : node.settings.lnServerUrl;
} }
else if (node.Settings.lndServerUrl && node.Settings.lndServerUrl.trim() !== '') { else if (node.settings.lndServerUrl && node.settings.lndServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = node.Settings.lndServerUrl.endsWith('/v1') ? node.Settings.lndServerUrl.slice(0, -3) : node.Settings.lndServerUrl; this.common.nodes[idx].settings.lnServerUrl = node.settings.lndServerUrl.endsWith('/v1') ? node.settings.lndServerUrl.slice(0, -3) : node.settings.lndServerUrl;
} }
else { else {
this.errMsg = this.errMsg + '\nPlease set LN Server URL for node index ' + node.index + ' in RTL-Config.json!'; this.errMsg = this.errMsg + '\nPlease set LN Server URL for node index ' + node.index + ' in RTL-Config.json!';
} }
this.common.nodes[idx].Settings.userPersona = node.Settings.userPersona ? node.Settings.userPersona : 'MERCHANT'; this.common.nodes[idx].settings.userPersona = node.settings.userPersona ? node.settings.userPersona : 'MERCHANT';
this.common.nodes[idx].Settings.themeMode = node.Settings.themeMode ? node.Settings.themeMode : 'DAY'; this.common.nodes[idx].settings.themeMode = node.settings.themeMode ? node.settings.themeMode : 'DAY';
this.common.nodes[idx].Settings.themeColor = node.Settings.themeColor ? node.Settings.themeColor : 'PURPLE'; this.common.nodes[idx].settings.themeColor = node.settings.themeColor ? node.settings.themeColor : 'PURPLE';
this.common.nodes[idx].Settings.unannouncedChannels = node.Settings.unannouncedChannels ? !!node.Settings.unannouncedChannels : false; this.common.nodes[idx].settings.unannouncedChannels = node.settings.unannouncedChannels ? !!node.settings.unannouncedChannels : false;
this.common.nodes[idx].Settings.logLevel = node.Settings.logLevel ? node.Settings.logLevel : 'ERROR'; this.common.nodes[idx].settings.logLevel = node.settings.logLevel ? node.settings.logLevel : 'ERROR';
this.common.nodes[idx].Settings.fiatConversion = node.Settings.fiatConversion ? !!node.Settings.fiatConversion : false; this.common.nodes[idx].settings.fiatConversion = node.settings.fiatConversion ? !!node.settings.fiatConversion : false;
if (this.common.nodes[idx].Settings.fiatConversion) { if (this.common.nodes[idx].settings.fiatConversion) {
this.common.nodes[idx].Settings.currencyUnit = node.Settings.currencyUnit ? node.Settings.currencyUnit : 'USD'; this.common.nodes[idx].settings.currencyUnit = node.settings.currencyUnit ? node.settings.currencyUnit : 'USD';
} }
if (process?.env?.SWAP_SERVER_URL && process?.env?.SWAP_SERVER_URL.trim() !== '') { if (process?.env?.SWAP_SERVER_URL && process?.env?.SWAP_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.swapServerUrl = process?.env?.SWAP_SERVER_URL.endsWith('/v1') ? process?.env?.SWAP_SERVER_URL.slice(0, -3) : process?.env?.SWAP_SERVER_URL; this.common.nodes[idx].settings.swapServerUrl = process?.env?.SWAP_SERVER_URL.endsWith('/v1') ? process?.env?.SWAP_SERVER_URL.slice(0, -3) : process?.env?.SWAP_SERVER_URL;
this.common.nodes[idx].Authentication.swapMacaroonPath = process?.env?.SWAP_MACAROON_PATH; this.common.nodes[idx].authentication.swapMacaroonPath = process?.env?.SWAP_MACAROON_PATH;
} }
else if (node.Settings.swapServerUrl && node.Settings.swapServerUrl.trim() !== '') { else if (node.settings.swapServerUrl && node.settings.swapServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.swapServerUrl = node.Settings.swapServerUrl.endsWith('/v1') ? node.Settings.swapServerUrl.slice(0, -3) : node.Settings.swapServerUrl; this.common.nodes[idx].settings.swapServerUrl = node.settings.swapServerUrl.endsWith('/v1') ? node.settings.swapServerUrl.slice(0, -3) : node.settings.swapServerUrl;
this.common.nodes[idx].Authentication.swapMacaroonPath = node.Authentication.swapMacaroonPath ? node.Authentication.swapMacaroonPath : ''; this.common.nodes[idx].authentication.swapMacaroonPath = node.authentication.swapMacaroonPath ? node.authentication.swapMacaroonPath : '';
} }
else { else {
this.common.nodes[idx].Settings.swapServerUrl = ''; this.common.nodes[idx].settings.swapServerUrl = '';
this.common.nodes[idx].Authentication.swapMacaroonPath = ''; this.common.nodes[idx].authentication.swapMacaroonPath = '';
} }
if (process?.env?.BOLTZ_SERVER_URL && process?.env?.BOLTZ_SERVER_URL.trim() !== '') { if (process?.env?.BOLTZ_SERVER_URL && process?.env?.BOLTZ_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.boltzServerUrl = process?.env?.BOLTZ_SERVER_URL.endsWith('/v1') ? process?.env?.BOLTZ_SERVER_URL.slice(0, -3) : process?.env?.BOLTZ_SERVER_URL; this.common.nodes[idx].settings.boltzServerUrl = process?.env?.BOLTZ_SERVER_URL.endsWith('/v1') ? process?.env?.BOLTZ_SERVER_URL.slice(0, -3) : process?.env?.BOLTZ_SERVER_URL;
this.common.nodes[idx].Authentication.boltzMacaroonPath = process?.env?.BOLTZ_MACAROON_PATH; this.common.nodes[idx].authentication.boltzMacaroonPath = process?.env?.BOLTZ_MACAROON_PATH;
} }
else if (node.Settings.boltzServerUrl && node.Settings.boltzServerUrl.trim() !== '') { else if (node.settings.boltzServerUrl && node.settings.boltzServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.boltzServerUrl = node.Settings.boltzServerUrl.endsWith('/v1') ? node.Settings.boltzServerUrl.slice(0, -3) : node.Settings.boltzServerUrl; this.common.nodes[idx].settings.boltzServerUrl = node.settings.boltzServerUrl.endsWith('/v1') ? node.settings.boltzServerUrl.slice(0, -3) : node.settings.boltzServerUrl;
this.common.nodes[idx].Authentication.boltzMacaroonPath = node.Authentication.boltzMacaroonPath ? node.Authentication.boltzMacaroonPath : ''; this.common.nodes[idx].authentication.boltzMacaroonPath = node.authentication.boltzMacaroonPath ? node.authentication.boltzMacaroonPath : '';
} }
else { else {
this.common.nodes[idx].Settings.boltzServerUrl = ''; this.common.nodes[idx].settings.boltzServerUrl = '';
this.common.nodes[idx].Authentication.boltzMacaroonPath = ''; this.common.nodes[idx].authentication.boltzMacaroonPath = '';
} }
this.common.nodes[idx].Settings.enableOffers = process?.env?.ENABLE_OFFERS ? process?.env?.ENABLE_OFFERS : (node.Settings.enableOffers) ? node.Settings.enableOffers : false; this.common.nodes[idx].settings.enableOffers = process?.env?.ENABLE_OFFERS ? process?.env?.ENABLE_OFFERS : (node.settings.enableOffers) ? node.settings.enableOffers : false;
this.common.nodes[idx].Settings.enablePeerswap = process?.env?.ENABLE_PEERSWAP ? process?.env?.ENABLE_PEERSWAP : (node.Settings.enablePeerswap) ? node.Settings.enablePeerswap : false; this.common.nodes[idx].settings.enablePeerswap = process?.env?.ENABLE_PEERSWAP ? process?.env?.ENABLE_PEERSWAP : (node.settings.enablePeerswap) ? node.settings.enablePeerswap : false;
this.common.nodes[idx].Settings.bitcoindConfigPath = process?.env?.BITCOIND_CONFIG_PATH ? process?.env?.BITCOIND_CONFIG_PATH : (node.Settings.bitcoindConfigPath) ? node.Settings.bitcoindConfigPath : ''; this.common.nodes[idx].settings.bitcoindConfigPath = process?.env?.BITCOIND_CONFIG_PATH ? process?.env?.BITCOIND_CONFIG_PATH : (node.settings.bitcoindConfigPath) ? node.settings.bitcoindConfigPath : '';
this.common.nodes[idx].Settings.channelBackupPath = process?.env?.CHANNEL_BACKUP_PATH ? process?.env?.CHANNEL_BACKUP_PATH : (node.Settings.channelBackupPath) ? node.Settings.channelBackupPath : this.common.appConfig.rtlConfFilePath + sep + 'channels-backup' + sep + 'node-' + node.index; this.common.nodes[idx].settings.channelBackupPath = process?.env?.CHANNEL_BACKUP_PATH ? process?.env?.CHANNEL_BACKUP_PATH : (node.settings.channelBackupPath) ? node.settings.channelBackupPath : this.common.appConfig.rtlConfFilePath + sep + 'channels-backup' + sep + 'node-' + node.index;
try { try {
this.common.createDirectory(this.common.nodes[idx].Settings.channelBackupPath); this.common.createDirectory(this.common.nodes[idx].settings.channelBackupPath);
const exists = fs.existsSync(this.common.nodes[idx].Settings.channelBackupPath + sep + 'channel-all.bak'); const exists = fs.existsSync(this.common.nodes[idx].settings.channelBackupPath + sep + 'channel-all.bak');
if (!exists) { if (!exists) {
try { try {
if (this.common.nodes[idx].lnImplementation === 'LND') { if (this.common.nodes[idx].lnImplementation === 'LND') {
this.common.getAllNodeAllChannelBackup(this.common.nodes[idx]); this.common.getAllNodeAllChannelBackup(this.common.nodes[idx]);
} }
else { else {
const createStream = fs.createWriteStream(this.common.nodes[idx].Settings.channelBackupPath + sep + 'channel-all.bak'); const createStream = fs.createWriteStream(this.common.nodes[idx].settings.channelBackupPath + sep + 'channel-all.bak');
createStream.end(); createStream.end();
} }
} }
@ -290,9 +290,9 @@ export class ConfigService {
catch (err) { catch (err) {
this.logger.log({ selectedNode: this.common.selectedNode, level: 'ERROR', fileName: 'Config', msg: 'Something went wrong while creating the backup directory: \n' + err }); this.logger.log({ selectedNode: this.common.selectedNode, level: 'ERROR', fileName: 'Config', msg: 'Something went wrong while creating the backup directory: \n' + err });
} }
this.common.nodes[idx].Settings.logFile = config.rtlConfFilePath + '/logs/RTL-Node-' + node.index + '.log'; this.common.nodes[idx].settings.logFile = config.rtlConfFilePath + '/logs/RTL-Node-' + node.index + '.log';
this.logger.log({ selectedNode: this.common.selectedNode, level: 'INFO', fileName: 'Config', msg: 'Node Config: ' + JSON.stringify(this.common.nodes[idx]) }); this.logger.log({ selectedNode: this.common.selectedNode, level: 'INFO', fileName: 'Config', msg: 'Node Config: ' + JSON.stringify(this.common.nodes[idx]) });
const log_file = this.common.nodes[idx].Settings.logFile; const log_file = this.common.nodes[idx].settings.logFile;
if (fs.existsSync(log_file || '')) { if (fs.existsSync(log_file || '')) {
fs.writeFile((log_file || ''), '', () => { }); fs.writeFile((log_file || ''), '', () => { });
} }
@ -353,14 +353,34 @@ export class ConfigService {
this.common.selectedNode = this.common.findNode(this.common.nodes[0].index) || {}; this.common.selectedNode = this.common.findNode(this.common.nodes[0].index) || {};
} }
}; };
this.updateConfig = (confFileFullPath, config) => {
// Update Config file to change Settings to settings and Authentication to authentication
// Added in v0.15.1, remove in a year?
if (!config.nodes || config.nodes[0].settings) {
return;
}
config.nodes.map((node) => {
if (node.Authentication) {
node.authentication = JSON.parse(JSON.stringify(node.Authentication));
delete node.Authentication;
}
if (node.Settings) {
node.settings = JSON.parse(JSON.stringify(node.Settings));
delete node.Settings;
}
return node;
});
fs.writeFileSync(confFileFullPath, JSON.stringify(config, null, 2), 'utf-8');
};
this.setServerConfiguration = () => { this.setServerConfiguration = () => {
try { try {
const rtlConfFilePath = (process?.env?.RTL_CONFIG_PATH) ? process?.env?.RTL_CONFIG_PATH : join(this.directoryName, '../..'); const rtlConfFilePath = (process?.env?.RTL_CONFIG_PATH) ? process?.env?.RTL_CONFIG_PATH : join(this.directoryName, '../..');
const confFileFullPath = rtlConfFilePath + sep + 'RTL-Config.json'; const confFileFullPath = rtlConfFilePath + sep + 'RTL-Config.json';
if (!fs.existsSync(confFileFullPath)) { if (!fs.existsSync(confFileFullPath)) {
fs.writeFileSync(confFileFullPath, JSON.stringify(this.setDefaultConfig())); fs.writeFileSync(confFileFullPath, JSON.stringify(this.setDefaultConfig(), null, 2), 'utf-8');
} }
const config = JSON.parse(fs.readFileSync(confFileFullPath, 'utf-8')); const config = JSON.parse(fs.readFileSync(confFileFullPath, 'utf-8'));
this.updateConfig(confFileFullPath, config);
config.rtlConfFilePath = rtlConfFilePath; config.rtlConfFilePath = rtlConfFilePath;
this.updateLogByLevel(); this.updateLogByLevel();
this.validateNodeConfig(config); this.validateNodeConfig(config);

@ -16,15 +16,15 @@ export class LoggerService {
msgStr = msgStr + '.\r\n'; msgStr = msgStr + '.\r\n';
} }
console.error(msgStr); console.error(msgStr);
if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
break; break;
case 'WARN': case 'WARN':
msgStr = prepMsgData(msgJSON, msgStr); msgStr = prepMsgData(msgJSON, msgStr);
if (!msgJSON.selectedNode || msgJSON.selectedNode.Settings.logLevel === 'WARN' || msgJSON.selectedNode.Settings.logLevel === 'INFO' || msgJSON.selectedNode.Settings.logLevel === 'DEBUG') { if (!msgJSON.selectedNode || msgJSON.selectedNode.settings.logLevel === 'WARN' || msgJSON.selectedNode.settings.logLevel === 'INFO' || msgJSON.selectedNode.settings.logLevel === 'DEBUG') {
if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} }
break; break;
@ -32,18 +32,18 @@ export class LoggerService {
if (!msgJSON.selectedNode && msgJSON.fileName === 'RTL') { if (!msgJSON.selectedNode && msgJSON.fileName === 'RTL') {
console.log(msgStr + '.\r\n'); console.log(msgStr + '.\r\n');
} }
else if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logLevel === 'INFO') { else if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logLevel === 'INFO') {
msgStr = msgStr + '.\r\n'; msgStr = msgStr + '.\r\n';
console.log(msgStr); console.log(msgStr);
if (msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} }
else if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logLevel === 'DEBUG') { else if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logLevel === 'DEBUG') {
msgStr = prepMsgData(msgJSON, msgStr); msgStr = prepMsgData(msgJSON, msgStr);
console.log(msgStr); console.log(msgStr);
if (msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} }
break; break;
@ -51,11 +51,11 @@ export class LoggerService {
if (!msgJSON.selectedNode) { if (!msgJSON.selectedNode) {
console.log(msgStr + '.\r\n'); console.log(msgStr + '.\r\n');
} }
else if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logLevel === 'DEBUG') { else if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logLevel === 'DEBUG') {
msgStr = prepMsgData(msgJSON, msgStr); msgStr = prepMsgData(msgJSON, msgStr);
console.log(msgStr); console.log(msgStr);
if (msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} }
break; break;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
(()=>{"use strict";var e,v={},m={};function r(e){var o=m[e];if(void 0!==o)return o.exports;var t=m[e]={id:e,loaded:!1,exports:{}};return v[e].call(t.exports,t,t.exports,r),t.loaded=!0,t.exports}r.m=v,e=[],r.O=(o,t,i,f)=>{if(!t){var a=1/0;for(n=0;n<e.length;n++){for(var[t,i,f]=e[n],s=!0,d=0;d<t.length;d++)(!1&f||a>=f)&&Object.keys(r.O).every(b=>r.O[b](t[d]))?t.splice(d--,1):(s=!1,f<a&&(a=f));if(s){e.splice(n--,1);var u=i();void 0!==u&&(o=u)}}return o}f=f||0;for(var n=e.length;n>0&&e[n-1][2]>f;n--)e[n]=e[n-1];e[n]=[t,i,f]},r.d=(e,o)=>{for(var t in o)r.o(o,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:o[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((o,t)=>(r.f[t](e,o),o),[])),r.u=e=>e+"."+{125:"708b87b4f08ae30f",456:"21f2112ce22ca275",570:"1e18345ecab5f7fe",758:"8736aa34f95f1235"}[e]+".js",r.miniCssF=e=>{},r.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),(()=>{var e={},o="RTLApp:";r.l=(t,i,f,n)=>{if(e[t])e[t].push(i);else{var a,s;if(void 0!==f)for(var d=document.getElementsByTagName("script"),u=0;u<d.length;u++){var l=d[u];if(l.getAttribute("src")==t||l.getAttribute("data-webpack")==o+f){a=l;break}}a||(s=!0,(a=document.createElement("script")).type="module",a.charset="utf-8",a.timeout=120,r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",o+f),a.src=r.tu(t)),e[t]=[i];var c=(g,b)=>{a.onerror=a.onload=null,clearTimeout(p);var h=e[t];if(delete e[t],a.parentNode&&a.parentNode.removeChild(a),h&&h.forEach(y=>y(b)),g)return g(b)},p=setTimeout(c.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=c.bind(null,a.onerror),a.onload=c.bind(null,a.onload),s&&document.head.appendChild(a)}}})(),r.r=e=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:o=>o},typeof trustedTypes<"u"&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="",(()=>{var e={666:0};r.f.j=(i,f)=>{var n=r.o(e,i)?e[i]:void 0;if(0!==n)if(n)f.push(n[2]);else if(666!=i){var a=new Promise((l,c)=>n=e[i]=[l,c]);f.push(n[2]=a);var s=r.p+r.u(i),d=new Error;r.l(s,l=>{if(r.o(e,i)&&(0!==(n=e[i])&&(e[i]=void 0),n)){var c=l&&("load"===l.type?"missing":l.type),p=l&&l.target&&l.target.src;d.message="Loading chunk "+i+" failed.\n("+c+": "+p+")",d.name="ChunkLoadError",d.type=c,d.request=p,n[1](d)}},"chunk-"+i,i)}else e[i]=0},r.O.j=i=>0===e[i];var o=(i,f)=>{var d,u,[n,a,s]=f,l=0;if(n.some(p=>0!==e[p])){for(d in a)r.o(a,d)&&(r.m[d]=a[d]);if(s)var c=s(r)}for(i&&i(f);l<n.length;l++)r.o(e,u=n[l])&&e[u]&&e[u][0](),e[u]=0;return r.O(c)},t=self.webpackChunkRTLApp=self.webpackChunkRTLApp||[];t.forEach(o.bind(null,0)),t.push=o.bind(null,t.push.bind(t))})()})(); (()=>{"use strict";var e,v={},m={};function r(e){var o=m[e];if(void 0!==o)return o.exports;var t=m[e]={id:e,loaded:!1,exports:{}};return v[e].call(t.exports,t,t.exports,r),t.loaded=!0,t.exports}r.m=v,e=[],r.O=(o,t,i,f)=>{if(!t){var a=1/0;for(n=0;n<e.length;n++){for(var[t,i,f]=e[n],c=!0,l=0;l<t.length;l++)(!1&f||a>=f)&&Object.keys(r.O).every(b=>r.O[b](t[l]))?t.splice(l--,1):(c=!1,f<a&&(a=f));if(c){e.splice(n--,1);var d=i();void 0!==d&&(o=d)}}return o}f=f||0;for(var n=e.length;n>0&&e[n-1][2]>f;n--)e[n]=e[n-1];e[n]=[t,i,f]},r.d=(e,o)=>{for(var t in o)r.o(o,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:o[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((o,t)=>(r.f[t](e,o),o),[])),r.u=e=>e+"."+{125:"ac0756e22ea9cb9a",456:"63bc51caab0d66e7",570:"a3145b37b782ee55",758:"8736aa34f95f1235"}[e]+".js",r.miniCssF=e=>{},r.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),(()=>{var e={},o="RTLApp:";r.l=(t,i,f,n)=>{if(e[t])e[t].push(i);else{var a,c;if(void 0!==f)for(var l=document.getElementsByTagName("script"),d=0;d<l.length;d++){var u=l[d];if(u.getAttribute("src")==t||u.getAttribute("data-webpack")==o+f){a=u;break}}a||(c=!0,(a=document.createElement("script")).type="module",a.charset="utf-8",a.timeout=120,r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",o+f),a.src=r.tu(t)),e[t]=[i];var s=(g,b)=>{a.onerror=a.onload=null,clearTimeout(p);var h=e[t];if(delete e[t],a.parentNode&&a.parentNode.removeChild(a),h&&h.forEach(y=>y(b)),g)return g(b)},p=setTimeout(s.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=s.bind(null,a.onerror),a.onload=s.bind(null,a.onload),c&&document.head.appendChild(a)}}})(),r.r=e=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;r.tt=()=>(void 0===e&&(e={createScriptURL:o=>o},typeof trustedTypes<"u"&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e)})(),r.tu=e=>r.tt().createScriptURL(e),r.p="",(()=>{var e={666:0};r.f.j=(i,f)=>{var n=r.o(e,i)?e[i]:void 0;if(0!==n)if(n)f.push(n[2]);else if(666!=i){var a=new Promise((u,s)=>n=e[i]=[u,s]);f.push(n[2]=a);var c=r.p+r.u(i),l=new Error;r.l(c,u=>{if(r.o(e,i)&&(0!==(n=e[i])&&(e[i]=void 0),n)){var s=u&&("load"===u.type?"missing":u.type),p=u&&u.target&&u.target.src;l.message="Loading chunk "+i+" failed.\n("+s+": "+p+")",l.name="ChunkLoadError",l.type=s,l.request=p,n[1](l)}},"chunk-"+i,i)}else e[i]=0},r.O.j=i=>0===e[i];var o=(i,f)=>{var l,d,[n,a,c]=f,u=0;if(n.some(p=>0!==e[p])){for(l in a)r.o(a,l)&&(r.m[l]=a[l]);if(c)var s=c(r)}for(i&&i(f);u<n.length;u++)r.o(e,d=n[u])&&e[d]&&e[d][0](),e[d]=0;return r.O(s)},t=self.webpackChunkRTLApp=self.webpackChunkRTLApp||[];t.forEach(o.bind(null,0)),t.push=o.bind(null,t.push.bind(t))})()})();

@ -11,7 +11,7 @@ export const listPeerChannels = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Peer Channels..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Peer Channels..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listpeerchannels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listpeerchannels';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Peer Channels List Received', data: body.channels }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Peer Channels List Received', data: body.channels });
return Promise.all(body.channels?.map((channel) => { return Promise.all(body.channels?.map((channel) => {
@ -32,7 +32,7 @@ export const openChannel = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/fundchannel'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/fundchannel';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -48,7 +48,7 @@ export const setChannelFee = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Setting Channel Fee..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Setting Channel Fee..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/setchannel'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/setchannel';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -65,7 +65,7 @@ export const closeChannel = (req, res, next) => {
req.setTimeout(60000 * 10); // timeout 10 mins req.setTimeout(60000 * 10); // timeout 10 mins
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/close'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/close';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -82,7 +82,7 @@ export const listForwards = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listforwards'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listforwards';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received For Status ' + status, data: body });
@ -98,7 +98,7 @@ export const funderUpdatePolicy = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting or Updating Funder Policy..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting or Updating Funder Policy..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/funderupdate'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/funderupdate';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Funder Update Body', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {

@ -16,7 +16,7 @@ export const getInfo = (req, res, next) => {
common.setOptions(req); common.setOptions(req);
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/getinfo'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/getinfo';
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode });
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Core Lightning server url ' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Core Lightning server url ' + options.url });
if (!options.headers || !options.headers.rune) { if (!options.headers || !options.headers.rune) {

@ -9,7 +9,7 @@ export const deleteExpiredInvoice = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Deleting Expired Invoices..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Deleting Expired Invoices..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/delexpiredinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/delexpiredinvoice';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoices Deleted', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoices Deleted', data: body });
@ -24,7 +24,7 @@ export const listInvoices = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Getting Invoices..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Getting Invoices..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listinvoices'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listinvoices';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List URL', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List URL', data: options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -40,7 +40,7 @@ export const addInvoice = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoice';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Created', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Created', data: body });

@ -11,7 +11,7 @@ export const getRoute = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Routes..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Routes..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/getroute'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/getroute';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Routes Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Routes Received', data: body });
@ -29,7 +29,7 @@ export const listChannels = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listchannels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listchannels';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup Finished', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Channel Lookup Finished', data: body });
@ -45,7 +45,7 @@ export const feeRates = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/feerates'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/feerates';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received for ' + style, data: body });
@ -62,7 +62,7 @@ export const listNodes = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'List Nodes..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listnodes'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listnodes';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Network', msg: 'List Nodes URL' + options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -79,7 +79,7 @@ export const listNodes = (req, res, next) => {
}; };
export const getAlias = (selNode: SelectedNode, peer: any, id: string) => { export const getAlias = (selNode: SelectedNode, peer: any, id: string) => {
options.url = selNode.Settings.lnServerUrl + '/v1/listnodes'; options.url = selNode.settings.lnServerUrl + '/v1/listnodes';
if (!peer[id]) { if (!peer[id]) {
logger.log({ selectedNode: selNode, level: 'ERROR', fileName: 'Network', msg: 'Empty Peer ID' }); logger.log({ selectedNode: selNode, level: 'ERROR', fileName: 'Network', msg: 'Empty Peer ID' });
peer.alias = ''; peer.alias = '';

@ -36,7 +36,7 @@ export const listOffers = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Getting Offers..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Getting Offers..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listoffers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listoffers';
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offers List URL', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offers List URL', data: options.url });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offers List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offers List Received', data: body });
@ -51,7 +51,7 @@ export const createOffer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Creating Offer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Creating Offer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/offer'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/offer';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Created', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Created', data: body });
@ -66,7 +66,7 @@ export const fetchOfferInvoice = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Getting Offer Invoice..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Getting Offer Invoice..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/fetchinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/fetchinvoice';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Offers', msg: 'Offer Invoice Body', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -82,7 +82,7 @@ export const disableOffer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Disabling Offer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Disabling Offer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/disableOffer'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/disableOffer';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Disabled', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Offers', msg: 'Offer Disabled', data: body });

@ -9,7 +9,7 @@ export const getNewAddress = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Generating New Address..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Generating New Address..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/newaddr'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/newaddr';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body });
@ -24,7 +24,7 @@ export const onChainWithdraw = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Withdrawing from On Chain..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Withdrawing from On Chain..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/withdraw'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/withdraw';
options.body = req.body; options.body = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -40,7 +40,7 @@ export const getUTXOs = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Listing Funds..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Listing Funds..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listfunds'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listfunds';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Funds List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Funds List Received', data: body });
// Local Remote Balance Calculation // Local Remote Balance Calculation

@ -11,7 +11,7 @@ const common: CommonService = Common;
const databaseService: DatabaseService = Database; const databaseService: DatabaseService = Database;
export const getMemo = (selNode: SelectedNode, payment: any) => { export const getMemo = (selNode: SelectedNode, payment: any) => {
options.url = selNode.Settings.lnServerUrl + '/v1/decode'; options.url = selNode.settings.lnServerUrl + '/v1/decode';
options.body = { string: payment.bolt11 }; options.body = { string: payment.bolt11 };
return request.post(options).then((res) => { return request.post(options).then((res) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: res }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: res });
@ -74,7 +74,7 @@ export const listPayments = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'List Payments..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'List Payments..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listsendpays'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listsendpays';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments });
body.payments = body.payments && body.payments.length && body.payments.length > 0 ? groupBy(body.payments) : []; body.payments = body.payments && body.payments.length && body.payments.length > 0 ? groupBy(body.payments) : [];
@ -95,7 +95,7 @@ export const postPayment = (req, res, next) => {
const options_body = JSON.parse(JSON.stringify(req.body)); const options_body = JSON.parse(JSON.stringify(req.body));
if (paymentType === 'KEYSEND') { if (paymentType === 'KEYSEND') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/keysend'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/keysend';
delete options_body.uiMessage; delete options_body.uiMessage;
delete options_body.fromDialog; delete options_body.fromDialog;
delete options_body.paymentType; delete options_body.paymentType;
@ -134,7 +134,7 @@ export const postPayment = (req, res, next) => {
delete options_body.pubkey; delete options_body.pubkey;
delete options_body.saveToDB; delete options_body.saveToDB;
options.body = options_body; options.body = options_body;
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/pay'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/pay';
} }
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Sent', data: body });

@ -11,7 +11,7 @@ export const getPeers = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'List Peers..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'List Peers..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listpeers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listpeers';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body });
const peers = !body.peers ? [] : body.peers; const peers = !body.peers ? [] : body.peers;
@ -29,12 +29,12 @@ export const postPeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/connect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/connect';
options.body = req.body; options.body = req.body;
request.post(options).then((connectRes) => { request.post(options).then((connectRes) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: connectRes }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: connectRes });
const listOptions = common.getOptions(req); const listOptions = common.getOptions(req);
listOptions.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listpeers'; listOptions.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listpeers';
request.post(listOptions).then((listPeersRes) => { request.post(listOptions).then((listPeersRes) => {
const peers = listPeersRes && listPeersRes.peers ? common.newestOnTop(listPeersRes.peers, 'id', connectRes.id) : []; const peers = listPeersRes && listPeersRes.peers ? common.newestOnTop(listPeersRes.peers, 'id', connectRes.id) : [];
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: peers }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: peers });
@ -53,7 +53,7 @@ export const deletePeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/disconnect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/disconnect';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected', data: body });

@ -10,7 +10,7 @@ export const decodePayment = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/decode'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/decode';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body });
@ -25,7 +25,7 @@ export const signMessage = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/signmessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/signmessage';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Signed', data: body });
@ -40,7 +40,7 @@ export const verifyMessage = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/checkmessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/checkmessage';
options.body = req.body; options.body = req.body;
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Message Verified', data: body });
@ -55,7 +55,7 @@ export const listConfigs = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/listconfigs'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/listconfigs';
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Utility', msg: 'List Configs Received', data: body });
res.status(200).json(body); res.status(200).json(body);

@ -38,13 +38,13 @@ export class CLWebSocketClient {
try { try {
const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index); const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index);
if (!clientExists) { if (!clientExists) {
if (selectedNode.Settings.lnServerUrl) { if (selectedNode.settings.lnServerUrl) {
const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null }; const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null };
this.connectWithClient(newWebSocketClient); this.connectWithClient(newWebSocketClient);
this.webSocketClients.push(newWebSocketClient); this.webSocketClients.push(newWebSocketClient);
} }
} else { } else {
if ((!clientExists.webSocketClient || !clientExists.webSocketClient.connected) && selectedNode.Settings.lnServerUrl) { if ((!clientExists.webSocketClient || !clientExists.webSocketClient.connected) && selectedNode.settings.lnServerUrl) {
clientExists.reConnect = true; clientExists.reConnect = true;
this.connectWithClient(clientExists); this.connectWithClient(clientExists);
} }
@ -57,11 +57,11 @@ export class CLWebSocketClient {
public connectWithClient = (clWsClt) => { public connectWithClient = (clWsClt) => {
this.logger.log({ selectedNode: clWsClt.selectedNode, level: 'INFO', fileName: 'CLWebSocket', msg: 'Connecting to the Core Lightning\'s Websocket Server..' }); this.logger.log({ selectedNode: clWsClt.selectedNode, level: 'INFO', fileName: 'CLWebSocket', msg: 'Connecting to the Core Lightning\'s Websocket Server..' });
try { try {
if (!clWsClt.selectedNode.Authentication.runeValue) { if (!clWsClt.selectedNode.authentication.runeValue) {
clWsClt.selectedNode.Authentication.runeValue = this.common.getRuneValue(clWsClt.selectedNode.Authentication.runePath); clWsClt.selectedNode.authentication.runeValue = this.common.getRuneValue(clWsClt.selectedNode.authentication.runePath);
} }
clWsClt.webSocketClient = socketIOClient(clWsClt.selectedNode.Settings.lnServerUrl, { clWsClt.webSocketClient = socketIOClient(clWsClt.selectedNode.settings.lnServerUrl, {
extraHeaders: { rune: clWsClt.selectedNode.Authentication.runeValue }, extraHeaders: { rune: clWsClt.selectedNode.authentication.runeValue },
transports: ['websocket'], transports: ['websocket'],
secure: true, secure: true,
rejectUnauthorized: false rejectUnauthorized: false

@ -30,7 +30,7 @@ export const simplifyAllChannels = (selNode: SelectedNode, channels) => {
}); });
}); });
channelNodeIds = channelNodeIds.substring(1); channelNodeIds = channelNodeIds.substring(1);
options.url = selNode.Settings.lnServerUrl + '/nodes'; options.url = selNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: channelNodeIds }; options.form = { nodeIds: channelNodeIds };
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Node Ids to find alias', data: channelNodeIds }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Node Ids to find alias', data: channelNodeIds });
return request.post(options).then((nodes) => { return request.post(options).then((nodes) => {
@ -49,7 +49,7 @@ export const getChannels = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'List Channels..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'List Channels..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/channels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/channels';
options.form = {}; options.form = {};
if (req.query && req.query.nodeId) { if (req.query && req.query.nodeId) {
options.form = req.query; options.form = req.query;
@ -82,7 +82,7 @@ export const getChannelStats = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel States..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channel States..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/channelstats'; options.url = req.session.selectedNode.settings.lnServerUrl + '/channelstats';
const today = new Date(Date.now()); const today = new Date(Date.now());
const tillToday = (Math.round(today.getTime() / 1000)).toString(); const tillToday = (Math.round(today.getTime() / 1000)).toString();
const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString(); const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString();
@ -103,7 +103,7 @@ export const openChannel = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/open'; options.url = req.session.selectedNode.settings.lnServerUrl + '/open';
options.form = req.body; options.form = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Params', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Params', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -119,7 +119,7 @@ export const updateChannelRelayFee = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Relay Fee..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Relay Fee..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/updaterelayfee'; options.url = req.session.selectedNode.settings.lnServerUrl + '/updaterelayfee';
options.form = req.query; options.form = req.query;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Relay Fee Params', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Update Relay Fee Params', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -136,10 +136,10 @@ export const closeChannel = (req, res, next) => {
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
if (req.query.force !== 'true') { if (req.query.force !== 'true') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Closing Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Closing Channel..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/close'; options.url = req.session.selectedNode.settings.lnServerUrl + '/close';
} else { } else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Force Closing Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Force Closing Channel..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/forceclose'; options.url = req.session.selectedNode.settings.lnServerUrl + '/forceclose';
} }
options.form = { channelId: req.query.channelId }; options.form = { channelId: req.query.channelId };
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Close URL', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Close URL', data: options.url });

@ -84,7 +84,7 @@ export const getFees = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/audit'; options.url = req.session.selectedNode.settings.lnServerUrl + '/audit';
const today = new Date(Date.now()); const today = new Date(Date.now());
const tillToday = (Math.round(today.getTime() / 1000)).toString(); const tillToday = (Math.round(today.getTime() / 1000)).toString();
const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString(); const fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime() / 1000)).toString();
@ -110,7 +110,7 @@ export const getPayments = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Getting Payments..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Getting Payments..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/audit'; options.url = req.session.selectedNode.settings.lnServerUrl + '/audit';
const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString();
options.form = { from: 0, to: tillToday }; options.form = { from: 0, to: tillToday };
if (common.read_dummy_data) { if (common.read_dummy_data) {

@ -16,7 +16,7 @@ export const getInfo = (req, res, next) => {
common.setOptions(req); common.setOptions(req);
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/getinfo'; options.url = req.session.selectedNode.settings.lnServerUrl + '/getinfo';
options.form = {}; options.form = {};
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode });
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Eclair server url ' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from Eclair server url ' + options.url });

@ -37,7 +37,7 @@ export const getInvoice = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Invoice..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Invoice..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/getinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/getinvoice';
options.form = { paymentHash: req.params.paymentHash }; options.form = { paymentHash: req.params.paymentHash };
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Found', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Found', data: body });
@ -54,8 +54,8 @@ export const getInvoice = (req, res, next) => {
export const listPendingInvoicesRequestCall = (selectedNode: SelectedNode) => { export const listPendingInvoicesRequestCall = (selectedNode: SelectedNode) => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'List Pending Invoices..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'List Pending Invoices..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/listpendinginvoices'; options.url = selectedNode.settings.lnServerUrl + '/listpendinginvoices';
options.form = { from: 0, to: (Math.round(new Date(Date.now()).getTime() / 1000)).toString() }; options.form = { from: 0, to: (Math.round(new Date(Date.now()).getTime() / 1000)).toString() };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request.post(options).then((pendingInvoicesResponse) => { request.post(options).then((pendingInvoicesResponse) => {
@ -74,16 +74,16 @@ export const listInvoices = (req, res, next) => {
const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString(); const tillToday = (Math.round(new Date(Date.now()).getTime() / 1000)).toString();
options.form = { from: 0, to: tillToday }; options.form = { from: 0, to: tillToday };
const options1 = JSON.parse(JSON.stringify(options)); const options1 = JSON.parse(JSON.stringify(options));
options1.url = req.session.selectedNode.Settings.lnServerUrl + '/listinvoices'; options1.url = req.session.selectedNode.settings.lnServerUrl + '/listinvoices';
options1.form = { from: 0, to: tillToday }; options1.form = { from: 0, to: tillToday };
const options2 = JSON.parse(JSON.stringify(options)); const options2 = JSON.parse(JSON.stringify(options));
options2.url = req.session.selectedNode.Settings.lnServerUrl + '/listpendinginvoices'; options2.url = req.session.selectedNode.settings.lnServerUrl + '/listpendinginvoices';
options2.form = { from: 0, to: tillToday }; options2.form = { from: 0, to: tillToday };
if (common.read_dummy_data) { if (common.read_dummy_data) {
return common.getDummyData('Invoices', req.session.selectedNode.lnImplementation).then((body) => { return common.getDummyData('Invoices', req.session.selectedNode.lnImplementation).then((body) => {
const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0]; const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0];
pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1]; pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1];
return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.Settings.lnServerUrl, invoice))). return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.settings.lnServerUrl, invoice))).
then((values) => res.status(200).json(invoices)); then((values) => res.status(200).json(invoices));
}); });
} else { } else {
@ -93,7 +93,7 @@ export const listInvoices = (req, res, next) => {
const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0]; const invoices = (!body[0] || body[0].length <= 0) ? [] : body[0];
pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1]; pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1];
if (invoices && invoices.length > 0) { if (invoices && invoices.length > 0) {
return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.Settings.lnServerUrl, invoice))). return Promise.all(invoices?.map((invoice) => getReceivedPaymentInfo(req.session.selectedNode.settings.lnServerUrl, invoice))).
then((values) => { then((values) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Sorted Invoices List Received', data: invoices }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Sorted Invoices List Received', data: invoices });
return res.status(200).json(invoices); return res.status(200).json(invoices);
@ -116,8 +116,8 @@ export const listInvoices = (req, res, next) => {
export const createInvoiceRequestCall = (selectedNode: SelectedNode, description: string, amount: number) => { export const createInvoiceRequestCall = (selectedNode: SelectedNode, description: string, amount: number) => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/createinvoice'; options.url = selectedNode.settings.lnServerUrl + '/createinvoice';
options.form = { description: description, amountMsat: amount }; options.form = { description: description, amountMsat: amount };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request.post(options).then((invResponse) => { request.post(options).then((invResponse) => {

@ -10,7 +10,7 @@ export const getNodes = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Node Lookup..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Node Lookup..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/nodes'; options.url = req.session.selectedNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: req.params.id }; options.form = { nodeIds: req.params.id };
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Node Lookup Finished', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Network', msg: 'Node Lookup Finished', data: body });
@ -23,8 +23,8 @@ export const getNodes = (req, res, next) => {
export const findRouteBetweenNodesRequestCall = (selectedNode: SelectedNode, amountMsat: number, sourceNodeId: string, targetNodeId: string, ignoreNodeIds: string[] = [], format: string = 'shortChannelId') => { export const findRouteBetweenNodesRequestCall = (selectedNode: SelectedNode, amountMsat: number, sourceNodeId: string, targetNodeId: string, ignoreNodeIds: string[] = [], format: string = 'shortChannelId') => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Network', msg: 'Find Route Between Nodes..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Network', msg: 'Find Route Between Nodes..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/findroutebetweennodes'; options.url = selectedNode.settings.lnServerUrl + '/findroutebetweennodes';
options.form = { amountMsat: amountMsat, sourceNodeId: sourceNodeId, targetNodeId: targetNodeId, ignoreNodeIds: ignoreNodeIds, format: format }; options.form = { amountMsat: amountMsat, sourceNodeId: sourceNodeId, targetNodeId: targetNodeId, ignoreNodeIds: ignoreNodeIds, format: format };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request.post(options).then((body) => { request.post(options).then((body) => {

@ -17,7 +17,7 @@ export const getNewAddress = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Generating New Address..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Generating New Address..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/getnewaddress'; options.url = req.session.selectedNode.settings.lnServerUrl + '/getnewaddress';
options.form = {}; options.form = {};
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated', data: body });
@ -32,7 +32,7 @@ export const getBalance = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Getting On Chain Balance..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Getting On Chain Balance..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/onchainbalance'; options.url = req.session.selectedNode.settings.lnServerUrl + '/onchainbalance';
options.form = {}; options.form = {};
if (common.read_dummy_data) { if (common.read_dummy_data) {
common.getDummyData('OnChainBalance', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(arrangeBalances(data)); }); common.getDummyData('OnChainBalance', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(arrangeBalances(data)); });
@ -52,7 +52,7 @@ export const getTransactions = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Getting On Chain Transactions..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Getting On Chain Transactions..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/onchaintransactions'; options.url = req.session.selectedNode.settings.lnServerUrl + '/onchaintransactions';
options.form = { options.form = {
count: req.query.count, count: req.query.count,
skip: req.query.skip skip: req.query.skip
@ -72,7 +72,7 @@ export const sendFunds = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/sendonchain'; options.url = req.session.selectedNode.settings.lnServerUrl + '/sendonchain';
options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks }; options.form = { address: address, amountSatoshis: amount, confirmationTarget: blocks };
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {

@ -7,7 +7,7 @@ const logger: LoggerService = Logger;
const common: CommonService = Common; const common: CommonService = Common;
export const getSentInfoFromPaymentRequest = (selNode: SelectedNode, payment) => { export const getSentInfoFromPaymentRequest = (selNode: SelectedNode, payment) => {
options.url = selNode.Settings.lnServerUrl + '/getsentinfo'; options.url = selNode.settings.lnServerUrl + '/getsentinfo';
options.form = { paymentHash: payment }; options.form = { paymentHash: payment };
return request.post(options).then((body) => { return request.post(options).then((body) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Sent Information Received', data: body }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment Sent Information Received', data: body });
@ -20,7 +20,7 @@ export const getSentInfoFromPaymentRequest = (selNode: SelectedNode, payment) =>
}; };
export const getQueryNodes = (selNode: SelectedNode, nodeIds) => { export const getQueryNodes = (selNode: SelectedNode, nodeIds) => {
options.url = selNode.Settings.lnServerUrl + '/nodes'; options.url = selNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: nodeIds?.reduce((acc, curr) => acc + ',' + curr) }; options.form = { nodeIds: nodeIds?.reduce((acc, curr) => acc + ',' + curr) };
return request.post(options).then((nodes) => { return request.post(options).then((nodes) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Query Nodes Received', data: nodes }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Payments', msg: 'Query Nodes Received', data: nodes });
@ -32,7 +32,7 @@ export const decodePayment = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/parseinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/parseinvoice';
options.form = { invoice: req.params.invoice }; options.form = { invoice: req.params.invoice };
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded', data: body });
@ -48,7 +48,7 @@ export const postPayment = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Paying Invoice..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Paying Invoice..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/payinvoice'; options.url = req.session.selectedNode.settings.lnServerUrl + '/payinvoice';
options.form = req.body; options.form = req.body;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -64,7 +64,7 @@ export const queryPaymentRoute = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Querying Payment Route..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Querying Payment Route..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/findroutetonode'; options.url = req.session.selectedNode.settings.lnServerUrl + '/findroutetonode';
options.form = { options.form = {
nodeId: req.query.nodeId, nodeId: req.query.nodeId,
amountMsat: req.query.amountMsat amountMsat: req.query.amountMsat
@ -121,8 +121,8 @@ export const getSentPaymentsInformation = (req, res, next) => {
export const sendPaymentToRouteRequestCall = (selectedNode: SelectedNode, shortChannelIds: string, invoice: string, amountMsat: number) => { export const sendPaymentToRouteRequestCall = (selectedNode: SelectedNode, shortChannelIds: string, invoice: string, amountMsat: number) => {
logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' }); logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..' });
options = selectedNode.Authentication.options; options = selectedNode.authentication.options;
options.url = selectedNode.Settings.lnServerUrl + '/sendtoroute'; options.url = selectedNode.settings.lnServerUrl + '/sendtoroute';
options.form = { shortChannelIds: shortChannelIds, amountMsat: amountMsat, invoice: invoice }; options.form = { shortChannelIds: shortChannelIds, amountMsat: amountMsat, invoice: invoice };
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
logger.log({ selectedNode: selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment To Route Options', data: options.form }); logger.log({ selectedNode: selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment To Route Options', data: options.form });

@ -7,7 +7,7 @@ const logger: LoggerService = Logger;
const common: CommonService = Common; const common: CommonService = Common;
export const getFilteredNodes = (selNode: SelectedNode, peersNodeIds) => { export const getFilteredNodes = (selNode: SelectedNode, peersNodeIds) => {
options.url = selNode.Settings.lnServerUrl + '/nodes'; options.url = selNode.settings.lnServerUrl + '/nodes';
options.form = { nodeIds: peersNodeIds }; options.form = { nodeIds: peersNodeIds };
return request.post(options).then((nodes) => { return request.post(options).then((nodes) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Filtered Nodes Received', data: nodes }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Filtered Nodes Received', data: nodes });
@ -19,7 +19,7 @@ export const getPeers = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Getting Peers..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Getting Peers..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/peers';
options.form = {}; options.form = {};
if (common.read_dummy_data) { if (common.read_dummy_data) {
common.getDummyData('Peers', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(data); }); common.getDummyData('Peers', req.session.selectedNode.lnImplementation).then((data) => { res.status(200).json(data); });
@ -56,7 +56,7 @@ export const connectPeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Conneting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Conneting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/connect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/connect';
options.form = {}; options.form = {};
if (req.query) { if (req.query) {
options.form = req.query; options.form = req.query;
@ -71,7 +71,7 @@ export const connectPeer = (req, res, next) => {
const err = common.handleError({ statusCode: 500, message: 'Connect Peer Error', error: body }, 'Peers', body, req.session.selectedNode); const err = common.handleError({ statusCode: 500, message: 'Connect Peer Error', error: body }, 'Peers', body, req.session.selectedNode);
return res.status(err.statusCode).json({ message: err.message, error: err.error }); return res.status(err.statusCode).json({ message: err.message, error: err.error });
} }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/peers';
options.form = {}; options.form = {};
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List after Connect', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List after Connect', data: body });
@ -107,7 +107,7 @@ export const deletePeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconneting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconneting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/disconnect'; options.url = req.session.selectedNode.settings.lnServerUrl + '/disconnect';
options.form = {}; options.form = {};
if (req.params.nodeId) { if (req.params.nodeId) {
options.form = { nodeId: req.params.nodeId }; options.form = { nodeId: req.params.nodeId };

@ -40,13 +40,13 @@ export class ECLWebSocketClient {
try { try {
const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index); const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index);
if (!clientExists) { if (!clientExists) {
if (selectedNode.Settings.lnServerUrl) { if (selectedNode.settings.lnServerUrl) {
const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null }; const newWebSocketClient = { selectedNode: selectedNode, reConnect: true, webSocketClient: null };
this.connectWithClient(newWebSocketClient); this.connectWithClient(newWebSocketClient);
this.webSocketClients.push(newWebSocketClient); this.webSocketClients.push(newWebSocketClient);
} }
} else { } else {
if ((!clientExists.webSocketClient || clientExists.webSocketClient.readyState !== WebSocket.OPEN) && selectedNode.Settings.lnServerUrl) { if ((!clientExists.webSocketClient || clientExists.webSocketClient.readyState !== WebSocket.OPEN) && selectedNode.settings.lnServerUrl) {
clientExists.reConnect = true; clientExists.reConnect = true;
this.connectWithClient(clientExists); this.connectWithClient(clientExists);
} }
@ -58,9 +58,9 @@ export class ECLWebSocketClient {
public connectWithClient = (eclWsClt) => { public connectWithClient = (eclWsClt) => {
this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connecting to the Eclair\'s Websocket Server..' }); this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connecting to the Eclair\'s Websocket Server..' });
const UpdatedLNServerURL = (eclWsClt.selectedNode.Settings.lnServerUrl)?.replace(/^http/, 'ws'); const UpdatedLNServerURL = (eclWsClt.selectedNode.settings.lnServerUrl)?.replace(/^http/, 'ws');
const firstSubStrIndex = (UpdatedLNServerURL.indexOf('//') + 2); const firstSubStrIndex = (UpdatedLNServerURL.indexOf('//') + 2);
const WS_LINK = UpdatedLNServerURL.slice(0, firstSubStrIndex) + ':' + eclWsClt.selectedNode.Authentication.lnApiPassword + '@' + UpdatedLNServerURL.slice(firstSubStrIndex) + '/ws'; const WS_LINK = UpdatedLNServerURL.slice(0, firstSubStrIndex) + ':' + eclWsClt.selectedNode.authentication.lnApiPassword + '@' + UpdatedLNServerURL.slice(firstSubStrIndex) + '/ws';
eclWsClt.webSocketClient = new WebSocket(WS_LINK); eclWsClt.webSocketClient = new WebSocket(WS_LINK);
eclWsClt.webSocketClient.onopen = () => { eclWsClt.webSocketClient.onopen = () => {
this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connected to the Eclair\'s Websocket Server..' }); this.logger.log({ selectedNode: eclWsClt.selectedNode, level: 'INFO', fileName: 'ECLWebSocket', msg: 'Connected to the Eclair\'s Websocket Server..' });

@ -9,7 +9,7 @@ export const getBlockchainBalance = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Balance', msg: 'Getting Balance..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Balance', msg: 'Getting Balance..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/balance/blockchain'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/balance/blockchain';
options.qs = req.query; options.qs = req.query;
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request params', data: req.params }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request params', data: req.params });
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request Query', data: req.query }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Balance', msg: 'Request Query', data: req.query });

@ -8,7 +8,7 @@ const common: CommonService = Common;
export const getAliasForChannel = (selNode: SelectedNode, channel) => { export const getAliasForChannel = (selNode: SelectedNode, channel) => {
const pubkey = (channel.remote_pubkey) ? channel.remote_pubkey : (channel.remote_node_pub) ? channel.remote_node_pub : ''; const pubkey = (channel.remote_pubkey) ? channel.remote_pubkey : (channel.remote_node_pub) ? channel.remote_node_pub : '';
options.url = selNode.Settings.lnServerUrl + '/v1/graph/node/' + pubkey; options.url = selNode.settings.lnServerUrl + '/v1/graph/node/' + pubkey;
return request(options).then((aliasBody) => { return request(options).then((aliasBody) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Alias Received', data: aliasBody.node.alias }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Channels', msg: 'Alias Received', data: aliasBody.node.alias });
channel.remote_alias = aliasBody.node.alias && aliasBody.node.alias !== '' ? aliasBody.node.alias : aliasBody.node.pub_key.slice(0, 20); channel.remote_alias = aliasBody.node.alias && aliasBody.node.alias !== '' ? aliasBody.node.alias : aliasBody.node.pub_key.slice(0, 20);
@ -23,7 +23,7 @@ export const getAllChannels = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channels..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Channels..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels';
options.qs = req.query; options.qs = req.query;
let local = 0; let local = 0;
let remote = 0; let remote = 0;
@ -61,7 +61,7 @@ export const getPendingChannels = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Pending Channels..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Pending Channels..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/pending'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/pending';
options.qs = req.query; options.qs = req.query;
request(options).then((body) => { request(options).then((body) => {
if (!body.total_limbo_balance) { if (!body.total_limbo_balance) {
@ -98,7 +98,7 @@ export const getClosedChannels = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Closed Channels..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Getting Closed Channels..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/closed'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/closed';
options.qs = req.query; options.qs = req.query;
request(options).then((body) => { request(options).then((body) => {
if (body.channels && body.channels.length > 0) { if (body.channels && body.channels.length > 0) {
@ -129,7 +129,7 @@ export const postChannel = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels';
options.form = { options.form = {
node_pubkey_string: node_pubkey, node_pubkey_string: node_pubkey,
local_funding_amount: local_funding_amount, local_funding_amount: local_funding_amount,
@ -160,7 +160,7 @@ export const postTransactions = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/transaction-stream'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/transaction-stream';
options.form = { payment_request: paymentReq }; options.form = { payment_request: paymentReq };
if (paymentAmount) { if (paymentAmount) {
options.form.amt = paymentAmount; options.form.amt = paymentAmount;
@ -196,7 +196,7 @@ export const closeChannel = (req, res, next) => {
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
const channelpoint = req.params.channelPoint?.replace(':', '/'); const channelpoint = req.params.channelPoint?.replace(':', '/');
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/' + channelpoint + '?force=' + req.query.force; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/' + channelpoint + '?force=' + req.query.force;
if (req.query.target_conf) { options.url = options.url + '&target_conf=' + req.query.target_conf; } if (req.query.target_conf) { options.url = options.url + '&target_conf=' + req.query.target_conf; }
if (req.query.sat_per_byte) { options.url = options.url + '&sat_per_byte=' + req.query.sat_per_byte; } if (req.query.sat_per_byte) { options.url = options.url + '&sat_per_byte=' + req.query.sat_per_byte; }
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel Options URL', data: options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel Options URL', data: options.url });
@ -214,7 +214,7 @@ export const postChanPolicy = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/chanpolicy'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/chanpolicy';
if (chanPoint === 'all') { if (chanPoint === 'all') {
options.form = JSON.stringify({ options.form = JSON.stringify({
global: true, global: true,

@ -39,14 +39,14 @@ export const getBackup = (req, res, next) => {
let channel_backup_file = ''; let channel_backup_file = '';
let message = ''; let message = '';
if (req.params.channelPoint === 'ALL') { if (req.params.channelPoint === 'ALL') {
channel_backup_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-all.bak'; channel_backup_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-all.bak';
message = 'All Channels Backup Successful.'; message = 'All Channels Backup Successful.';
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup';
} else { } else {
channel_backup_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak'; channel_backup_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak';
message = 'Channel Backup Successful.'; message = 'Channel Backup Successful.';
const channelpoint = req.params.channelPoint?.replace(':', '/'); const channelpoint = req.params.channelPoint?.replace(':', '/');
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup/' + channelpoint; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup/' + channelpoint;
const exists = fs.existsSync(channel_backup_file); const exists = fs.existsSync(channel_backup_file);
if (exists) { if (exists) {
fs.writeFile(channel_backup_file, '', () => { }); fs.writeFile(channel_backup_file, '', () => { });
@ -81,13 +81,13 @@ export const postBackupVerify = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'ChannelBackup', msg: 'Verifying Channel Backup..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'ChannelBackup', msg: 'Verifying Channel Backup..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup/verify'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup/verify';
let channel_verify_file = ''; let channel_verify_file = '';
let message = ''; let message = '';
let verify_backup = ''; let verify_backup = '';
if (req.params.channelPoint === 'ALL') { if (req.params.channelPoint === 'ALL') {
message = 'All Channels Verify Successful.'; message = 'All Channels Verify Successful.';
channel_verify_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-all.bak'; channel_verify_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-all.bak';
const exists = fs.existsSync(channel_verify_file); const exists = fs.existsSync(channel_verify_file);
if (exists) { if (exists) {
verify_backup = fs.readFileSync(channel_verify_file, 'utf-8'); verify_backup = fs.readFileSync(channel_verify_file, 'utf-8');
@ -108,7 +108,7 @@ export const postBackupVerify = (req, res, next) => {
} }
} else { } else {
message = 'Channel Verify Successful.'; message = 'Channel Verify Successful.';
channel_verify_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak'; channel_verify_file = req.session.selectedNode.settings.channelBackupPath + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak';
const exists = fs.existsSync(channel_verify_file); const exists = fs.existsSync(channel_verify_file);
if (exists) { if (exists) {
verify_backup = fs.readFileSync(channel_verify_file, 'utf-8'); verify_backup = fs.readFileSync(channel_verify_file, 'utf-8');
@ -136,13 +136,13 @@ export const postRestore = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'ChannelBackup', msg: 'Restoring Channel Backup..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'ChannelBackup', msg: 'Restoring Channel Backup..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/channels/backup/restore'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/channels/backup/restore';
let channel_restore_file = ''; let channel_restore_file = '';
let message = ''; let message = '';
let restore_backup = ''; let restore_backup = '';
if (req.params.channelPoint === 'ALL') { if (req.params.channelPoint === 'ALL') {
message = 'All Channels Restore Successful.'; message = 'All Channels Restore Successful.';
channel_restore_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'restore' + sep; channel_restore_file = req.session.selectedNode.settings.channelBackupPath + sep + 'restore' + sep;
const exists = fs.existsSync(channel_restore_file + 'channel-all.bak'); const exists = fs.existsSync(channel_restore_file + 'channel-all.bak');
const downloaded_exists = fs.existsSync(channel_restore_file + 'backup-channel-all.bak'); const downloaded_exists = fs.existsSync(channel_restore_file + 'backup-channel-all.bak');
if (exists) { if (exists) {
@ -173,7 +173,7 @@ export const postRestore = (req, res, next) => {
} }
} else { } else {
message = 'Channel Restore Successful.'; message = 'Channel Restore Successful.';
channel_restore_file = req.session.selectedNode.Settings.channelBackupPath + sep + 'restore' + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak'; channel_restore_file = req.session.selectedNode.settings.channelBackupPath + sep + 'restore' + sep + 'channel-' + req.params.channelPoint?.replace(':', '-') + '.bak';
const exists = fs.existsSync(channel_restore_file); const exists = fs.existsSync(channel_restore_file);
if (exists) { if (exists) {
restore_backup = fs.readFileSync(channel_restore_file, 'utf-8'); restore_backup = fs.readFileSync(channel_restore_file, 'utf-8');
@ -190,7 +190,7 @@ export const postRestore = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'ChannelBackup', msg: 'Channel Restored', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'ChannelBackup', msg: 'Channel Restored', data: body });
if (req.params.channelPoint === 'ALL') { channel_restore_file = channel_restore_file + 'channel-all.bak'; } if (req.params.channelPoint === 'ALL') { channel_restore_file = channel_restore_file + 'channel-all.bak'; }
fs.rename(channel_restore_file, channel_restore_file + '.restored', () => { fs.rename(channel_restore_file, channel_restore_file + '.restored', () => {
getFilesList(req.session.selectedNode.Settings.channelBackupPath, (getFilesListRes) => { getFilesList(req.session.selectedNode.settings.channelBackupPath, (getFilesListRes) => {
if (getFilesListRes.error) { if (getFilesListRes.error) {
const errMsg = getFilesListRes.error; const errMsg = getFilesListRes.error;
const err = common.handleError({ statusCode: 500, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg, req.session.selectedNode); const err = common.handleError({ statusCode: 500, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg, req.session.selectedNode);
@ -210,7 +210,7 @@ export const postRestore = (req, res, next) => {
}; };
export const getRestoreList = (req, res, next) => { export const getRestoreList = (req, res, next) => {
getFilesList(req.session.selectedNode.Settings.channelBackupPath, (getFilesListRes) => { getFilesList(req.session.selectedNode.settings.channelBackupPath, (getFilesListRes) => {
if (getFilesListRes.error) { if (getFilesListRes.error) {
return res.status(getFilesListRes.statusCode).json(getFilesListRes); return res.status(getFilesListRes.statusCode).json(getFilesListRes);
} else { } else {

@ -10,7 +10,7 @@ export const getFees = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/fees'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/fees';
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Fee Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Fees', msg: 'Fee Received', data: body });
const today = new Date(Date.now()); const today = new Date(Date.now());

@ -16,7 +16,7 @@ export const getInfo = (req, res, next) => {
common.setOptions(req); common.setOptions(req);
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/getinfo'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/getinfo';
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Selected Node ' + req.session.selectedNode.lnNode });
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from LND server url ' + options.url }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'GetInfo', msg: 'Calling Info from LND server url ' + options.url });
if (!options.headers || !options.headers['Grpc-Metadata-macaroon']) { if (!options.headers || !options.headers['Grpc-Metadata-macaroon']) {

@ -7,7 +7,7 @@ const logger: LoggerService = Logger;
const common: CommonService = Common; const common: CommonService = Common;
export const getAliasFromPubkey = (selNode: SelectedNode, pubkey) => { export const getAliasFromPubkey = (selNode: SelectedNode, pubkey) => {
options.url = selNode.Settings.lnServerUrl + '/v1/graph/node/' + pubkey; options.url = selNode.settings.lnServerUrl + '/v1/graph/node/' + pubkey;
return request(options).then((res) => { return request(options).then((res) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Graph', msg: 'Alias Received', data: res.node.alias }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Graph', msg: 'Alias Received', data: res.node.alias });
return res.node.alias; return res.node.alias;
@ -19,7 +19,7 @@ export const getDescribeGraph = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Network Graph..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Network Graph..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph';
request.get(options).then((body) => { request.get(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Network Graph Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Network Graph Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -33,7 +33,7 @@ export const getGraphInfo = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Information..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Information..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/info'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/info';
request.get(options).then((body) => { request.get(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Information Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Information Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -47,7 +47,7 @@ export const getGraphNode = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Node Information..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Node Information..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/node/' + req.params.pubKey; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/node/' + req.params.pubKey;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Node Information Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Node Information Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -61,7 +61,7 @@ export const getGraphEdge = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Edge Information..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Edge Information..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Edge Information Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Graph Edge Information Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -75,7 +75,7 @@ export const getQueryRoutes = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Routes..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Routes..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/routes/' + req.params.destPubkey + '/' + req.params.amount; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/routes/' + req.params.destPubkey + '/' + req.params.amount;
if (req.query.outgoing_chan_id) { if (req.query.outgoing_chan_id) {
options.url = options.url + '?outgoing_chan_id=' + req.query.outgoing_chan_id; options.url = options.url + '?outgoing_chan_id=' + req.query.outgoing_chan_id;
} }
@ -111,7 +111,7 @@ export const getRemoteFeePolicy = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Remote Fee Policy..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Graph', msg: 'Getting Remote Fee Policy..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body });
let remoteNodeFee = {}; let remoteNodeFee = {};

@ -12,7 +12,7 @@ export const invoiceLookup = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Getting Invoice Information..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Getting Invoice Information..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/invoices/lookup'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/invoices/lookup';
if (req.query.payment_addr) { if (req.query.payment_addr) {
options.url = options.url + '?payment_addr=' + req.query.payment_addr; options.url = options.url + '?payment_addr=' + req.query.payment_addr;
} else { } else {
@ -34,7 +34,7 @@ export const listInvoices = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Getting List Invoices..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Getting List Invoices..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoices?num_max_invoices=' + req.query.num_max_invoices + '&index_offset=' + req.query.index_offset + options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoices?num_max_invoices=' + req.query.num_max_invoices + '&index_offset=' + req.query.index_offset +
'&reversed=' + req.query.reversed; '&reversed=' + req.query.reversed;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body });
@ -57,7 +57,7 @@ export const addInvoice = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Adding Invoice..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Adding Invoice..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoices'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoices';
options.form = JSON.stringify(req.body); options.form = JSON.stringify(req.body);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Added', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Invoice', msg: 'Invoice Added', data: body });

@ -10,7 +10,7 @@ export const signMessage = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Signing Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/signmessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/signmessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(message).toString('base64') msg: Buffer.from(message).toString('base64')
}); });
@ -28,7 +28,7 @@ export const verifyMessage = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Message', msg: 'Verifying Message..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/verifymessage'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/verifymessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(message).toString('base64'), msg: Buffer.from(message).toString('base64'),
signature: signature signature: signature

@ -9,7 +9,7 @@ export const getNewAddress = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'NewAddress', msg: 'Getting New Address..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'NewAddress', msg: 'Getting New Address..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/newaddress?type=' + req.query.type; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/newaddress?type=' + req.query.type;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'NewAddress', msg: 'New Address Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'NewAddress', msg: 'New Address Generated', data: body });
res.status(200).json(body); res.status(200).json(body);

@ -8,7 +8,7 @@ const logger: LoggerService = Logger;
const common: CommonService = Common; const common: CommonService = Common;
export const decodePaymentFromPaymentRequest = (selNode: SelectedNode, payment) => { export const decodePaymentFromPaymentRequest = (selNode: SelectedNode, payment) => {
options.url = selNode.Settings.lnServerUrl + '/v1/payreq/' + payment; options.url = selNode.settings.lnServerUrl + '/v1/payreq/' + payment;
return request(options).then((res) => { return request(options).then((res) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'PayReq', msg: 'Description Received', data: res.description }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'PayReq', msg: 'Description Received', data: res.description });
return res; return res;
@ -19,7 +19,7 @@ export const decodePayment = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payment..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/payreq/' + req.params.payRequest; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/payreq/' + req.params.payRequest;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment Decoded', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'PayRequest', msg: 'Payment Decoded', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -55,7 +55,7 @@ export const getPayments = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Payments List..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting Payments List..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/payments?max_payments=' + req.query.max_payments + '&index_offset=' + req.query.index_offset + '&reversed=' + req.query.reversed; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/payments?max_payments=' + req.query.max_payments + '&index_offset=' + req.query.index_offset + '&reversed=' + req.query.reversed;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body });
res.status(200).json(body); res.status(200).json(body);
@ -69,8 +69,8 @@ export const getAllLightningTransactions = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting All Lightning Transactions..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Getting All Lightning Transactions..' });
const options1 = JSON.parse(JSON.stringify(common.getOptions(req))); const options1 = JSON.parse(JSON.stringify(common.getOptions(req)));
const options2 = JSON.parse(JSON.stringify(common.getOptions(req))); const options2 = JSON.parse(JSON.stringify(common.getOptions(req)));
// options1.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/payments?max_payments=100000&index_offset=0&reversed=true'; // options1.url = req.session.selectedNode.settings.lnServerUrl + '/v1/payments?max_payments=100000&index_offset=0&reversed=true';
options2.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/invoices?num_max_invoices=100000&index_offset=0&reversed=true'; options2.url = req.session.selectedNode.settings.lnServerUrl + '/v1/invoices?num_max_invoices=100000&index_offset=0&reversed=true';
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Payments Options', data: options1 }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Payments Options', data: options1 });
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Invoices Options', data: options2 }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Payments', msg: 'All Invoices Options', data: options2 });
// return Promise.all([request(options1), request(options2)]).then((values) => { // return Promise.all([request(options1), request(options2)]).then((values) => {
@ -87,7 +87,7 @@ export const paymentLookup = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Looking up Payment..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Looking up Payment..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/router/track/' + req.params.paymentHash; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/router/track/' + req.params.paymentHash;
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Information Received for ' + req.params.paymentHash, data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Payments', msg: 'Payment Information Received for ' + req.params.paymentHash, data: body });
res.status(200).json(body.result || body); res.status(200).json(body.result || body);

@ -7,7 +7,7 @@ const logger: LoggerService = Logger;
const common: CommonService = Common; const common: CommonService = Common;
export const getAliasForPeers = (selNode: SelectedNode, peer) => { export const getAliasForPeers = (selNode: SelectedNode, peer) => {
options.url = selNode.Settings.lnServerUrl + '/v1/graph/node/' + peer.pub_key; options.url = selNode.settings.lnServerUrl + '/v1/graph/node/' + peer.pub_key;
return request(options).then((aliasBody) => { return request(options).then((aliasBody) => {
logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Alias Received', data: aliasBody.node.alias }); logger.log({ selectedNode: selNode, level: 'DEBUG', fileName: 'Peers', msg: 'Alias Received', data: aliasBody.node.alias });
peer.alias = aliasBody.node.alias; peer.alias = aliasBody.node.alias;
@ -22,7 +22,7 @@ export const getPeers = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Getting Peers..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Getting Peers..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers';
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peers List Received', data: body });
const peers = !body.peers ? [] : body.peers; const peers = !body.peers ? [] : body.peers;
@ -41,14 +41,14 @@ export const postPeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers';
options.form = JSON.stringify({ options.form = JSON.stringify({
addr: { host: host, pubkey: pubkey }, addr: { host: host, pubkey: pubkey },
perm: perm perm: perm
}); });
request.post(options).then((body) => { request.post(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers';
request(options).then((body) => { request(options).then((body) => {
const peers = (!body.peers) ? [] : body.peers; const peers = (!body.peers) ? [] : body.peers;
return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => { return Promise.all(peers?.map((peer) => getAliasForPeers(req.session.selectedNode, peer))).then((values) => {
@ -75,7 +75,7 @@ export const deletePeer = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/peers/' + req.params.peerPubKey; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/peers/' + req.params.peerPubKey;
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnect Pubkey', data: req.params.peerPubKey }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnect Pubkey', data: req.params.peerPubKey });
request.delete(options).then((body) => { request.delete(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconneted', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconneted', data: body });

@ -25,7 +25,7 @@ export const getAllForwardingEvents = (req, start, end, offset, caller, callback
const err = common.handleError({ message: 'Session Expired after a day\'s inactivity.', statusCode: 401 }, 'Balance', 'Get Balance Error', req.session.selectedNode); const err = common.handleError({ message: 'Session Expired after a day\'s inactivity.', statusCode: 401 }, 'Balance', 'Get Balance Error', req.session.selectedNode);
return callback({ message: err.message, error: err.error, statusCode: err.statusCode }); return callback({ message: err.message, error: err.error, statusCode: err.statusCode });
} options = common.getOptions(req); } options = common.getOptions(req);
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/switch'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/switch';
options.form = {}; options.form = {};
if (start) { options.form.start_time = start; } if (start) { options.form.start_time = start; }
if (end) { options.form.end_time = end; } if (end) { options.form.end_time = end; }

@ -9,7 +9,7 @@ export const getTransactions = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Getting Transactions..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Getting Transactions..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/transactions'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/transactions';
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Transactions', msg: 'Transactions List Received', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Transactions', msg: 'Transactions List Received', data: body });
res.status(200).json(body.transactions); res.status(200).json(body.transactions);
@ -24,7 +24,7 @@ export const postTransactions = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/transactions'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/transactions';
options.form = { options.form = {
amount: amount, amount: amount,
addr: address, addr: address,

@ -11,9 +11,9 @@ export const genSeed = (req, res, next) => {
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
if (req.params.passphrase) { if (req.params.passphrase) {
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/genseed?aezeed_passphrase=' + Buffer.from(atob(req.params.passphrase)).toString('base64'); options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/genseed?aezeed_passphrase=' + Buffer.from(atob(req.params.passphrase)).toString('base64');
} else { } else {
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/genseed'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/genseed';
} }
request(options).then((body) => { request(options).then((body) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Seed Generated', data: body }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Seed Generated', data: body });
@ -32,14 +32,14 @@ export const operateWallet = (req, res, next) => {
options.method = 'POST'; options.method = 'POST';
if (!req.params.operation || req.params.operation === 'unlockwallet') { if (!req.params.operation || req.params.operation === 'unlockwallet') {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/unlockwallet'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/unlockwallet';
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(wallet_password)).toString('base64') wallet_password: Buffer.from(atob(wallet_password)).toString('base64')
}); });
err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!'; err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!';
} else { } else {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..' });
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v1/initwallet'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v1/initwallet';
if (aezeed_passphrase && aezeed_passphrase !== '') { if (aezeed_passphrase && aezeed_passphrase !== '') {
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(wallet_password)).toString('base64'), wallet_password: Buffer.from(atob(wallet_password)).toString('base64'),
@ -94,7 +94,7 @@ export const getUTXOs = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Getting UTXOs..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Getting UTXOs..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/utxos'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/utxos';
if (common.isVersionCompatible(req.session.selectedNode.lnVersion, '0.14.0')) { if (common.isVersionCompatible(req.session.selectedNode.lnVersion, '0.14.0')) {
options.form = JSON.stringify({ max_confs: req.query.max_confs }); options.form = JSON.stringify({ max_confs: req.query.max_confs });
} else { } else {
@ -114,7 +114,7 @@ export const bumpFee = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/bumpfee'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/bumpfee';
options.form = {}; options.form = {};
options.form.outpoint = { options.form.outpoint = {
txid_str: txid, txid_str: txid,
@ -139,7 +139,7 @@ export const labelTransaction = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Labelling Transaction..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Labelling Transaction..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/tx/label'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/tx/label';
options.form = JSON.parse(JSON.stringify(options.form)); options.form = JSON.parse(JSON.stringify(options.form));
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form });
request.post(options).then((body) => { request.post(options).then((body) => {
@ -156,7 +156,7 @@ export const leaseUTXO = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/utxos/lease'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/utxos/lease';
options.form = {}; options.form = {};
options.form.id = txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {
@ -179,7 +179,7 @@ export const releaseUTXO = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..' });
options = common.getOptions(req); options = common.getOptions(req);
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); } if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
options.url = req.session.selectedNode.Settings.lnServerUrl + '/v2/wallet/utxos/release'; options.url = req.session.selectedNode.settings.lnServerUrl + '/v2/wallet/utxos/release';
options.form = {}; options.form = {};
options.form.id = txid; options.form.id = txid;
options.form.outpoint = { options.form.outpoint = {

@ -26,7 +26,7 @@ export class LNDWebSocketClient {
public connect = (selectedNode: SelectedNode) => { public connect = (selectedNode: SelectedNode) => {
try { try {
const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index); const clientExists = this.webSocketClients.find((wsc) => wsc.selectedNode.index === selectedNode.index);
if (!clientExists && selectedNode.Settings.lnServerUrl) { if (!clientExists && selectedNode.settings.lnServerUrl) {
const newWebSocketClient = { selectedNode: selectedNode }; const newWebSocketClient = { selectedNode: selectedNode };
this.webSocketClients.push(newWebSocketClient); this.webSocketClients.push(newWebSocketClient);
} }
@ -38,7 +38,7 @@ export class LNDWebSocketClient {
public fetchUnpaidInvoices = (selectedNode: SelectedNode) => { public fetchUnpaidInvoices = (selectedNode: SelectedNode) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Getting Unpaid Invoices..' }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Getting Unpaid Invoices..' });
const options = this.setOptionsForSelNode(selectedNode); const options = this.setOptionsForSelNode(selectedNode);
options.url = selectedNode.Settings.lnServerUrl + '/v1/invoices?pending_only=true'; options.url = selectedNode.settings.lnServerUrl + '/v1/invoices?pending_only=true';
return request(options).then((body) => { return request(options).then((body) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Unpaid Invoices Received', data: body }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Unpaid Invoices Received', data: body });
if (body.invoices && body.invoices.length > 0) { if (body.invoices && body.invoices.length > 0) {
@ -58,7 +58,7 @@ export class LNDWebSocketClient {
public subscribeToInvoice = (options: any, selectedNode: SelectedNode, rHash: string) => { public subscribeToInvoice = (options: any, selectedNode: SelectedNode, rHash: string) => {
rHash = rHash?.replace(/\+/g, '-')?.replace(/[/]/g, '_'); rHash = rHash?.replace(/\+/g, '-')?.replace(/[/]/g, '_');
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Invoice ' + rHash + ' ..' }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Invoice ' + rHash + ' ..' });
options.url = selectedNode.Settings.lnServerUrl + '/v2/invoices/subscribe/' + rHash; options.url = selectedNode.settings.lnServerUrl + '/v2/invoices/subscribe/' + rHash;
request(options).then((msg) => { request(options).then((msg) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Invoice Information Received for ' + rHash }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Invoice Information Received for ' + rHash });
if (typeof msg === 'string') { if (typeof msg === 'string') {
@ -82,7 +82,7 @@ export class LNDWebSocketClient {
public subscribeToPayment = (options: any, selectedNode: SelectedNode, paymentHash: string) => { public subscribeToPayment = (options: any, selectedNode: SelectedNode, paymentHash: string) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Payment ' + paymentHash + ' ..' }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Subscribing to Payment ' + paymentHash + ' ..' });
options.url = selectedNode.Settings.lnServerUrl + '/v2/router/track/' + paymentHash; options.url = selectedNode.settings.lnServerUrl + '/v2/router/track/' + paymentHash;
request(options).then((msg) => { request(options).then((msg) => {
this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Payment Information Received for ' + paymentHash }); this.logger.log({ selectedNode: selectedNode, level: 'INFO', fileName: 'WebSocketClient', msg: 'Payment Information Received for ' + paymentHash });
msg['type'] = 'payment'; msg['type'] = 'payment';
@ -100,7 +100,7 @@ export class LNDWebSocketClient {
public setOptionsForSelNode = (selectedNode: SelectedNode) => { public setOptionsForSelNode = (selectedNode: SelectedNode) => {
const options = { url: '', rejectUnauthorized: false, json: true, form: null }; const options = { url: '', rejectUnauthorized: false, json: true, form: null };
try { try {
options['headers'] = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(selectedNode.Authentication.macaroonPath, 'admin.macaroon')).toString('hex') }; options['headers'] = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(selectedNode.authentication.macaroonPath, 'admin.macaroon')).toString('hex') };
} catch (err) { } catch (err) {
this.logger.log({ selectedNode: selectedNode, level: 'ERROR', fileName: 'WebSocketClient', msg: 'Set Options Error', error: JSON.stringify(err) }); this.logger.log({ selectedNode: selectedNode, level: 'ERROR', fileName: 'WebSocketClient', msg: 'Set Options Error', error: JSON.stringify(err) });
} }

@ -43,9 +43,9 @@ export const removeSecureData = (config: ApplicationConfig) => {
delete config.multiPassHashed; delete config.multiPassHashed;
delete config.secret2FA; delete config.secret2FA;
config.nodes.map((node) => { config.nodes.map((node) => {
delete node.Authentication.macaroonPath; delete node.authentication.macaroonPath;
delete node.Authentication.runePath; delete node.authentication.runePath;
delete node.Authentication.lnApiPassword; delete node.authentication.lnApiPassword;
return node; return node;
}); });
return config; return config;
@ -63,14 +63,14 @@ export const addSecureData = (config: ApplicationConfig) => {
config.secret2FA = common.appConfig.secret2FA; config.secret2FA = common.appConfig.secret2FA;
} }
config.nodes.map((node, i) => { config.nodes.map((node, i) => {
if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].Authentication && common.appConfig.nodes[i].Authentication.macaroonPath) { if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].authentication && common.appConfig.nodes[i].authentication.macaroonPath) {
node.Authentication.macaroonPath = common.appConfig.nodes[i].Authentication.macaroonPath; node.authentication.macaroonPath = common.appConfig.nodes[i].authentication.macaroonPath;
} }
if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].Authentication && common.appConfig.nodes[i].Authentication.runePath) { if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].authentication && common.appConfig.nodes[i].authentication.runePath) {
node.Authentication.runePath = common.appConfig.nodes[i].Authentication.runePath; node.authentication.runePath = common.appConfig.nodes[i].authentication.runePath;
} }
if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].Authentication && common.appConfig.nodes[i].Authentication.lnApiPassword) { if (common.appConfig && common.appConfig.nodes && common.appConfig.nodes.length > i && common.appConfig.nodes[i].authentication && common.appConfig.nodes[i].authentication.lnApiPassword) {
node.Authentication.lnApiPassword = common.appConfig.nodes[i].Authentication.lnApiPassword; node.authentication.lnApiPassword = common.appConfig.nodes[i].authentication.lnApiPassword;
} }
return node; return node;
}); });
@ -92,7 +92,7 @@ export const getCurrencyRates = (req, res, next) => {
export const getFile = (req, res, next) => { export const getFile = (req, res, next) => {
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Getting File..' }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Getting File..' });
const file = req.query.path ? req.query.path : (req.session.selectedNode.Settings.channelBackupPath + sep + 'channel-' + req.query.channel?.replace(':', '-') + '.bak'); const file = req.query.path ? req.query.path : (req.session.selectedNode.settings.channelBackupPath + sep + 'channel-' + req.query.channel?.replace(':', '-') + '.bak');
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'Channel Point', data: req.query.channel }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'Channel Point', data: req.query.channel });
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'File Path', data: file }); logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'RTLConf', msg: 'File Path', data: file });
fs.readFile(file, 'utf8', (errRes, data) => { fs.readFile(file, 'utf8', (errRes, data) => {
@ -130,14 +130,14 @@ export const getApplicationSettings = (req, res, next) => {
appConfData.SSO = new SSO(); appConfData.SSO = new SSO();
appConfData.secret2FA = ''; appConfData.secret2FA = '';
appConfData.dbDirectoryPath = ''; appConfData.dbDirectoryPath = '';
appConfData.nodes[selNodeIdx].Authentication = new Authentication(); appConfData.nodes[selNodeIdx].authentication = new Authentication();
delete appConfData.nodes[selNodeIdx].Settings.bitcoindConfigPath; delete appConfData.nodes[selNodeIdx].settings.bitcoindConfigPath;
delete appConfData.nodes[selNodeIdx].Settings.lnServerUrl; delete appConfData.nodes[selNodeIdx].settings.lnServerUrl;
delete appConfData.nodes[selNodeIdx].Settings.swapServerUrl; delete appConfData.nodes[selNodeIdx].settings.swapServerUrl;
delete appConfData.nodes[selNodeIdx].Settings.boltzServerUrl; delete appConfData.nodes[selNodeIdx].settings.boltzServerUrl;
delete appConfData.nodes[selNodeIdx].Settings.enableOffers; delete appConfData.nodes[selNodeIdx].settings.enableOffers;
delete appConfData.nodes[selNodeIdx].Settings.enablePeerswap; delete appConfData.nodes[selNodeIdx].settings.enablePeerswap;
delete appConfData.nodes[selNodeIdx].Settings.channelBackupPath; delete appConfData.nodes[selNodeIdx].settings.channelBackupPath;
appConfData.nodes = [appConfData.nodes[selNodeIdx]]; appConfData.nodes = [appConfData.nodes[selNodeIdx]];
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'RTL Configuration Received', data: appConfData }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'RTL Configuration Received', data: appConfData });
@ -171,10 +171,10 @@ export const getConfig = (req, res, next) => {
let fileFormat = 'INI'; let fileFormat = 'INI';
switch (req.params.nodeType) { switch (req.params.nodeType) {
case 'ln': case 'ln':
confFile = req.session.selectedNode.Authentication.configPath; confFile = req.session.selectedNode.authentication.configPath;
break; break;
case 'bitcoind': case 'bitcoind':
confFile = req.session.selectedNode.Settings.bitcoindConfigPath; confFile = req.session.selectedNode.settings.bitcoindConfigPath;
break; break;
case 'rtl': case 'rtl':
fileFormat = 'JSON'; fileFormat = 'JSON';
@ -220,14 +220,14 @@ export const updateNodeSettings = (req, res, next) => {
const RTLConfFile = common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json'; const RTLConfFile = common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index)); const node = config.nodes.find((node) => (node.index === req.session.selectedNode.index));
if (node && node.Settings) { if (node && node.settings) {
node.Settings = req.body; node.settings = req.body;
} }
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
const selectedNode = common.findNode(req.session.selectedNode.index); const selectedNode = common.findNode(req.session.selectedNode.index);
if (selectedNode && selectedNode.Settings) { if (selectedNode && selectedNode.settings) {
selectedNode.Settings = req.body; selectedNode.settings = req.body;
common.replaceNode(req, selectedNode); common.replaceNode(req, selectedNode);
} }
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Node Settings Updated', data: maskPasswords(config) }); logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'RTLConf', msg: 'Node Settings Updated', data: maskPasswords(config) });

@ -75,8 +75,8 @@ export class SelectedNode {
public lnNode?: string, public lnNode?: string,
public lnImplementation?: string, public lnImplementation?: string,
public lnVersion?: string, public lnVersion?: string,
public Settings?: Settings, public settings?: Settings,
public Authentication?: Authentication public authentication?: Authentication
) { } ) { }
} }

@ -28,15 +28,15 @@ export class CommonService {
public setSwapServerOptions = (req) => { public setSwapServerOptions = (req) => {
const swapOptions = { const swapOptions = {
baseUrl: req.session.selectedNode.Settings.swapServerUrl, baseUrl: req.session.selectedNode.settings.swapServerUrl,
uri: '', uri: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
headers: { 'Grpc-Metadata-macaroon': '' } headers: { 'Grpc-Metadata-macaroon': '' }
}; };
if (req.session.selectedNode.Authentication.swapMacaroonPath) { if (req.session.selectedNode.authentication.swapMacaroonPath) {
try { try {
swapOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.Authentication.swapMacaroonPath, 'loop.macaroon')).toString('hex') }; swapOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.authentication.swapMacaroonPath, 'loop.macaroon')).toString('hex') };
} catch (err) { } catch (err) {
this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Loop macaroon Error', error: err }); this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Loop macaroon Error', error: err });
} }
@ -47,14 +47,14 @@ export class CommonService {
public getBoltzServerOptions = (req) => { public getBoltzServerOptions = (req) => {
const boltzOptions = { const boltzOptions = {
url: req.session.selectedNode.Settings.boltzServerUrl, url: req.session.selectedNode.settings.boltzServerUrl,
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
headers: { 'Grpc-Metadata-macaroon': '' } headers: { 'Grpc-Metadata-macaroon': '' }
}; };
if (req.session.selectedNode.Authentication.boltzMacaroonPath) { if (req.session.selectedNode.authentication.boltzMacaroonPath) {
try { try {
boltzOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.Authentication.boltzMacaroonPath, 'admin.macaroon')).toString('hex') }; boltzOptions.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.authentication.boltzMacaroonPath, 'admin.macaroon')).toString('hex') };
} catch (err) { } catch (err) {
this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Boltz macaroon Error', error: err }); this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Boltz macaroon Error', error: err });
} }
@ -64,12 +64,12 @@ export class CommonService {
}; };
public getOptions = (req) => { public getOptions = (req) => {
if (req.session.selectedNode && req.session.selectedNode.Authentication.options) { if (req.session.selectedNode && req.session.selectedNode.authentication.options) {
req.session.selectedNode.Authentication.options.method = (req.session.selectedNode.lnImplementation && req.session.selectedNode.lnImplementation.toUpperCase() === 'LND') ? 'GET' : 'POST'; req.session.selectedNode.authentication.options.method = (req.session.selectedNode.lnImplementation && req.session.selectedNode.lnImplementation.toUpperCase() === 'LND') ? 'GET' : 'POST';
delete req.session.selectedNode.Authentication.options.form; delete req.session.selectedNode.authentication.options.form;
delete req.session.selectedNode.Authentication.options.body; delete req.session.selectedNode.authentication.options.body;
req.session.selectedNode.Authentication.options.qs = {}; req.session.selectedNode.authentication.options.qs = {};
return req.session.selectedNode.Authentication.options; return req.session.selectedNode.authentication.options;
} }
return this.handleError({ statusCode: 401, message: 'Session expired after a day\'s inactivity' }, 'Session Expired', 'Session Expiry Error', this.selectedNode); return this.handleError({ statusCode: 401, message: 'Session expired after a day\'s inactivity' }, 'Session Expired', 'Session Expiry Error', this.selectedNode);
}; };
@ -78,7 +78,7 @@ export class CommonService {
if (!req.session.selectedNode) { if (!req.session.selectedNode) {
req.session.selectedNode = {}; req.session.selectedNode = {};
} }
req.session.selectedNode.Authentication.options = { req.session.selectedNode.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
@ -89,30 +89,30 @@ export class CommonService {
switch (req.session.selectedNode.lnImplementation.toUpperCase()) { switch (req.session.selectedNode.lnImplementation.toUpperCase()) {
case 'CLN': case 'CLN':
try { try {
if (!req.session.selectedNode.Authentication.runeValue) { if (!req.session.selectedNode.authentication.runeValue) {
req.session.selectedNode.Authentication.runeValue = this.getRuneValue(req.session.selectedNode.Authentication.runePath); req.session.selectedNode.authentication.runeValue = this.getRuneValue(req.session.selectedNode.authentication.runePath);
} }
req.session.selectedNode.Authentication.options.headers = { rune: req.session.selectedNode.Authentication.runeValue }; req.session.selectedNode.authentication.options.headers = { rune: req.session.selectedNode.authentication.runeValue };
} catch (err) { } catch (err) {
throw new Error(err); throw new Error(err);
} }
break; break;
case 'ECL': case 'ECL':
req.session.selectedNode.Authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + req.session.selectedNode.Authentication.lnApiPassword).toString('base64') }; req.session.selectedNode.authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + req.session.selectedNode.authentication.lnApiPassword).toString('base64') };
break; break;
default: default:
req.session.selectedNode.Authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.Authentication.macaroonPath, 'admin.macaroon')).toString('hex') }; req.session.selectedNode.authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(req.session.selectedNode.authentication.macaroonPath, 'admin.macaroon')).toString('hex') };
break; break;
} }
} }
if (req.session.selectedNode) { if (req.session.selectedNode) {
this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Updated Node Options for ' + req.session.selectedNode.lnNode, data: req.session.selectedNode.Authentication.options }); this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Updated Node Options for ' + req.session.selectedNode.lnNode, data: req.session.selectedNode.authentication.options });
} }
return { status: 200, message: 'Updated Successfully' }; return { status: 200, message: 'Updated Successfully' };
} catch (err) { } catch (err) {
req.session.selectedNode.Authentication.options = { req.session.selectedNode.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
@ -135,10 +135,10 @@ export class CommonService {
}; };
public setOptions = (req) => { public setOptions = (req) => {
if (this.nodes[0].Authentication.options && this.nodes[0].Authentication.options.headers) { return; } if (this.nodes[0].authentication.options && this.nodes[0].authentication.options.headers) { return; }
if (this.nodes && this.nodes.length > 0) { if (this.nodes && this.nodes.length > 0) {
this.nodes.forEach((node) => { this.nodes.forEach((node) => {
node.Authentication.options = { node.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
@ -149,34 +149,34 @@ export class CommonService {
switch (node.lnImplementation.toUpperCase()) { switch (node.lnImplementation.toUpperCase()) {
case 'CLN': case 'CLN':
try { try {
if (!node.Authentication.runeValue) { if (!node.authentication.runeValue) {
node.Authentication.runeValue = this.getRuneValue(node.Authentication.runePath); node.authentication.runeValue = this.getRuneValue(node.authentication.runePath);
} }
node.Authentication.options.headers = { rune: node.Authentication.runeValue }; node.authentication.options.headers = { rune: node.authentication.runeValue };
} catch (err) { } catch (err) {
throw new Error(err); throw new Error(err);
} }
break; break;
case 'ECL': case 'ECL':
node.Authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + node.Authentication.lnApiPassword).toString('base64') }; node.authentication.options.headers = { authorization: 'Basic ' + Buffer.from(':' + node.authentication.lnApiPassword).toString('base64') };
break; break;
default: default:
node.Authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(node.Authentication.macaroonPath, 'admin.macaroon')).toString('hex') }; node.authentication.options.headers = { 'Grpc-Metadata-macaroon': fs.readFileSync(join(node.authentication.macaroonPath, 'admin.macaroon')).toString('hex') };
break; break;
} }
} }
} catch (err) { } catch (err) {
this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Common Set Options Error', error: err }); this.logger.log({ selectedNode: this.selectedNode, level: 'ERROR', fileName: 'Common', msg: 'Common Set Options Error', error: err });
node.Authentication.options = { node.authentication.options = {
url: '', url: '',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
form: '' form: ''
}; };
} }
this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Set Node Options for ' + node.lnNode, data: node.Authentication.options }); this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Set Node Options for ' + node.lnNode, data: node.authentication.options });
}); });
this.updateSelectedNodeOptions(req); this.updateSelectedNodeOptions(req);
} }
@ -420,12 +420,12 @@ export class CommonService {
}; };
public getAllNodeAllChannelBackup = (node: SelectedNode) => { public getAllNodeAllChannelBackup = (node: SelectedNode) => {
const channel_backup_file = node.Settings.channelBackupPath + sep + 'channel-all.bak'; const channel_backup_file = node.settings.channelBackupPath + sep + 'channel-all.bak';
const options = { const options = {
url: node.Settings.lnServerUrl + '/v1/channels/backup', url: node.settings.lnServerUrl + '/v1/channels/backup',
rejectUnauthorized: false, rejectUnauthorized: false,
json: true, json: true,
headers: { 'Grpc-Metadata-macaroon': fs.readFileSync(node.Authentication.macaroonPath + '/admin.macaroon').toString('hex') } headers: { 'Grpc-Metadata-macaroon': fs.readFileSync(node.authentication.macaroonPath + '/admin.macaroon').toString('hex') }
}; };
this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Getting Channel Backup for Node ' + node.lnNode + '..' }); this.logger.log({ selectedNode: this.selectedNode, level: 'INFO', fileName: 'Common', msg: 'Getting Channel Backup for Node ' + node.lnNode + '..' });
request(options).then((body) => { request(options).then((body) => {
@ -486,9 +486,9 @@ export class CommonService {
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'INDEX: ' + selNode.index }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'INDEX: ' + selNode.index });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN NODE: ' + selNode.lnNode }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN NODE: ' + selNode.lnNode });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + selNode.lnImplementation }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + selNode.lnImplementation });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + selNode.Settings.fiatConversion }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + selNode.settings.fiatConversion });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + selNode.Settings.currencyUnit }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + selNode.settings.currencyUnit });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + selNode.Settings.lnServerUrl }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + selNode.settings.lnServerUrl });
this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + this.appConfig.SSO.logoutRedirectLink + '\r\n' }); this.logger.log({ selectedNode: selNode, level: 'INFO', fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + this.appConfig.SSO.logoutRedirectLink + '\r\n' });
} }
}; };

@ -67,11 +67,11 @@ export class ConfigService {
index: 1, index: 1,
lnNode: 'Node 1', lnNode: 'Node 1',
lnImplementation: 'LND', lnImplementation: 'LND',
Authentication: { authentication: {
macaroonPath: macaroonPath, macaroonPath: macaroonPath,
configPath: configPath configPath: configPath
}, },
Settings: { settings: {
userPersona: 'MERCHANT', userPersona: 'MERCHANT',
themeMode: 'DAY', themeMode: 'DAY',
themeColor: 'PURPLE', themeColor: 'PURPLE',
@ -108,10 +108,10 @@ export class ConfigService {
const RTLConfFile = this.common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json'; const RTLConfFile = this.common.appConfig.rtlConfFilePath + sep + 'RTL-Config.json';
const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); const config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.nodes.forEach((node) => { config.nodes.forEach((node) => {
if (node.Settings.hasOwnProperty('enableLogging')) { if (node.settings.hasOwnProperty('enableLogging')) {
updateLogFlag = true; updateLogFlag = true;
node.Settings.logLevel = node.Settings.enableLogging ? 'INFO' : 'ERROR'; node.settings.logLevel = node.settings.enableLogging ? 'INFO' : 'ERROR';
delete node.Settings.enableLogging; delete node.settings.enableLogging;
} }
}); });
if (updateLogFlag) { if (updateLogFlag) {
@ -146,7 +146,7 @@ export class ConfigService {
config.dbDirectoryPath = (process?.env?.DB_DIRECTORY_PATH) ? process?.env?.DB_DIRECTORY_PATH : (config.dbDirectoryPath) ? config.dbDirectoryPath : join(dirname(fileURLToPath(import.meta.url)), '..', '..'); config.dbDirectoryPath = (process?.env?.DB_DIRECTORY_PATH) ? process?.env?.DB_DIRECTORY_PATH : (config.dbDirectoryPath) ? config.dbDirectoryPath : join(dirname(fileURLToPath(import.meta.url)), '..', '..');
if (config.nodes && config.nodes.length > 0) { if (config.nodes && config.nodes.length > 0) {
config.nodes.forEach((node, idx) => { config.nodes.forEach((node, idx) => {
this.common.nodes[idx] = { Settings: {}, Authentication: {} }; this.common.nodes[idx] = { settings: {}, authentication: {} };
this.common.nodes[idx].index = node.index; this.common.nodes[idx].index = node.index;
this.common.nodes[idx].lnNode = node.lnNode; this.common.nodes[idx].lnNode = node.lnNode;
this.common.nodes[idx].lnImplementation = (process?.env?.lnImplementation) ? process?.env?.lnImplementation : node.lnImplementation ? node.lnImplementation : 'LND'; this.common.nodes[idx].lnImplementation = (process?.env?.lnImplementation) ? process?.env?.lnImplementation : node.lnImplementation ? node.lnImplementation : 'LND';
@ -154,9 +154,9 @@ export class ConfigService {
switch (this.common.nodes[idx].lnImplementation) { switch (this.common.nodes[idx].lnImplementation) {
case 'CLN': case 'CLN':
if (process?.env?.RUNE_PATH && process?.env?.RUNE_PATH.trim() !== '') { if (process?.env?.RUNE_PATH && process?.env?.RUNE_PATH.trim() !== '') {
this.common.nodes[idx].Authentication.runePath = process?.env?.RUNE_PATH; this.common.nodes[idx].authentication.runePath = process?.env?.RUNE_PATH;
} else if (node.Authentication && node.Authentication.runePath && node.Authentication.runePath.trim() !== '') { } else if (node.authentication && node.authentication.runePath && node.authentication.runePath.trim() !== '') {
this.common.nodes[idx].Authentication.runePath = node.Authentication.runePath; this.common.nodes[idx].authentication.runePath = node.authentication.runePath;
} else { } else {
this.errMsg = 'Please set rune path for node index ' + node.index + ' in RTL-Config.json!'; this.errMsg = 'Please set rune path for node index ' + node.index + ' in RTL-Config.json!';
} }
@ -164,106 +164,106 @@ export class ConfigService {
case 'ECL': case 'ECL':
if (process?.env?.LN_API_PASSWORD) { if (process?.env?.LN_API_PASSWORD) {
this.common.nodes[idx].Authentication.lnApiPassword = process?.env?.LN_API_PASSWORD; this.common.nodes[idx].authentication.lnApiPassword = process?.env?.LN_API_PASSWORD;
} else if (node.Authentication && node.Authentication.lnApiPassword) { } else if (node.authentication && node.authentication.lnApiPassword) {
this.common.nodes[idx].Authentication.lnApiPassword = node.Authentication.lnApiPassword; this.common.nodes[idx].authentication.lnApiPassword = node.authentication.lnApiPassword;
} else { } else {
this.common.nodes[idx].Authentication.lnApiPassword = ''; this.common.nodes[idx].authentication.lnApiPassword = '';
} }
break; break;
default: default:
if (process?.env?.MACAROON_PATH && process?.env?.MACAROON_PATH.trim() !== '') { if (process?.env?.MACAROON_PATH && process?.env?.MACAROON_PATH.trim() !== '') {
this.common.nodes[idx].Authentication.macaroonPath = process?.env?.MACAROON_PATH; this.common.nodes[idx].authentication.macaroonPath = process?.env?.MACAROON_PATH;
} else if (node.Authentication && node.Authentication.macaroonPath && node.Authentication.macaroonPath.trim() !== '') { } else if (node.authentication && node.authentication.macaroonPath && node.authentication.macaroonPath.trim() !== '') {
this.common.nodes[idx].Authentication.macaroonPath = node.Authentication.macaroonPath; this.common.nodes[idx].authentication.macaroonPath = node.authentication.macaroonPath;
} else { } else {
this.errMsg = 'Please set macaroon path for node index ' + node.index + ' in RTL-Config.json!'; this.errMsg = 'Please set macaroon path for node index ' + node.index + ' in RTL-Config.json!';
} }
break; break;
} }
if (process?.env?.CONFIG_PATH) { if (process?.env?.CONFIG_PATH) {
this.common.nodes[idx].Authentication.configPath = process?.env?.CONFIG_PATH; this.common.nodes[idx].authentication.configPath = process?.env?.CONFIG_PATH;
} else if (node.Authentication && node.Authentication.configPath) { } else if (node.authentication && node.authentication.configPath) {
this.common.nodes[idx].Authentication.configPath = node.Authentication.configPath; this.common.nodes[idx].authentication.configPath = node.authentication.configPath;
} else { } else {
this.common.nodes[idx].Authentication.configPath = ''; this.common.nodes[idx].authentication.configPath = '';
} }
if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].Authentication.lnApiPassword === '' && this.common.nodes[idx].Authentication.configPath !== '') { if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].authentication.lnApiPassword === '' && this.common.nodes[idx].authentication.configPath !== '') {
try { try {
const exists = fs.existsSync(this.common.nodes[idx].Authentication.configPath || ''); const exists = fs.existsSync(this.common.nodes[idx].authentication.configPath || '');
if (exists) { if (exists) {
try { try {
const configFile = fs.readFileSync((this.common.nodes[idx].Authentication.configPath || ''), 'utf-8'); const configFile = fs.readFileSync((this.common.nodes[idx].authentication.configPath || ''), 'utf-8');
const iniParsed = ini.parse(configFile); const iniParsed = ini.parse(configFile);
this.common.nodes[idx].Authentication.lnApiPassword = iniParsed['eclair.api.password'] ? iniParsed['eclair.api.password'] : parseHocon(configFile).eclair.api.password; this.common.nodes[idx].authentication.lnApiPassword = iniParsed['eclair.api.password'] ? iniParsed['eclair.api.password'] : parseHocon(configFile).eclair.api.password;
} catch (err) { } catch (err) {
this.errMsg = this.errMsg + '\nSomething went wrong while reading config file: \n' + err; this.errMsg = this.errMsg + '\nSomething went wrong while reading config file: \n' + err;
} }
} else { } else {
this.errMsg = this.errMsg + '\nInvalid config path: ' + this.common.nodes[idx].Authentication.configPath; this.errMsg = this.errMsg + '\nInvalid config path: ' + this.common.nodes[idx].authentication.configPath;
} }
} catch (err) { } catch (err) {
this.errMsg = this.errMsg + '\nUnable to read config file: \n' + err; this.errMsg = this.errMsg + '\nUnable to read config file: \n' + err;
} }
} }
if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].Authentication.lnApiPassword === '') { if (this.common.nodes[idx].lnImplementation === 'ECL' && this.common.nodes[idx].authentication.lnApiPassword === '') {
this.errMsg = this.errMsg + '\nPlease set config path Or api password for node index ' + node.index + ' in RTL-Config.json! It is mandatory for Eclair authentication!'; this.errMsg = this.errMsg + '\nPlease set config path Or api password for node index ' + node.index + ' in RTL-Config.json! It is mandatory for Eclair authentication!';
} }
if (process?.env?.LN_SERVER_URL && process?.env?.LN_SERVER_URL.trim() !== '') { if (process?.env?.LN_SERVER_URL && process?.env?.LN_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = process?.env?.LN_SERVER_URL.endsWith('/v1') ? process?.env?.LN_SERVER_URL.slice(0, -3) : process?.env?.LN_SERVER_URL; this.common.nodes[idx].settings.lnServerUrl = process?.env?.LN_SERVER_URL.endsWith('/v1') ? process?.env?.LN_SERVER_URL.slice(0, -3) : process?.env?.LN_SERVER_URL;
} else if (process?.env?.LND_SERVER_URL && process?.env?.LND_SERVER_URL.trim() !== '') { } else if (process?.env?.LND_SERVER_URL && process?.env?.LND_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = process?.env?.LND_SERVER_URL.endsWith('/v1') ? process?.env?.LND_SERVER_URL.slice(0, -3) : process?.env?.LND_SERVER_URL; this.common.nodes[idx].settings.lnServerUrl = process?.env?.LND_SERVER_URL.endsWith('/v1') ? process?.env?.LND_SERVER_URL.slice(0, -3) : process?.env?.LND_SERVER_URL;
} else if (node.Settings.lnServerUrl && node.Settings.lnServerUrl.trim() !== '') { } else if (node.settings.lnServerUrl && node.settings.lnServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = node.Settings.lnServerUrl.endsWith('/v1') ? node.Settings.lnServerUrl.slice(0, -3) : node.Settings.lnServerUrl; this.common.nodes[idx].settings.lnServerUrl = node.settings.lnServerUrl.endsWith('/v1') ? node.settings.lnServerUrl.slice(0, -3) : node.settings.lnServerUrl;
} else if (node.Settings.lndServerUrl && node.Settings.lndServerUrl.trim() !== '') { } else if (node.settings.lndServerUrl && node.settings.lndServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.lnServerUrl = node.Settings.lndServerUrl.endsWith('/v1') ? node.Settings.lndServerUrl.slice(0, -3) : node.Settings.lndServerUrl; this.common.nodes[idx].settings.lnServerUrl = node.settings.lndServerUrl.endsWith('/v1') ? node.settings.lndServerUrl.slice(0, -3) : node.settings.lndServerUrl;
} else { } else {
this.errMsg = this.errMsg + '\nPlease set LN Server URL for node index ' + node.index + ' in RTL-Config.json!'; this.errMsg = this.errMsg + '\nPlease set LN Server URL for node index ' + node.index + ' in RTL-Config.json!';
} }
this.common.nodes[idx].Settings.userPersona = node.Settings.userPersona ? node.Settings.userPersona : 'MERCHANT'; this.common.nodes[idx].settings.userPersona = node.settings.userPersona ? node.settings.userPersona : 'MERCHANT';
this.common.nodes[idx].Settings.themeMode = node.Settings.themeMode ? node.Settings.themeMode : 'DAY'; this.common.nodes[idx].settings.themeMode = node.settings.themeMode ? node.settings.themeMode : 'DAY';
this.common.nodes[idx].Settings.themeColor = node.Settings.themeColor ? node.Settings.themeColor : 'PURPLE'; this.common.nodes[idx].settings.themeColor = node.settings.themeColor ? node.settings.themeColor : 'PURPLE';
this.common.nodes[idx].Settings.unannouncedChannels = node.Settings.unannouncedChannels ? !!node.Settings.unannouncedChannels : false; this.common.nodes[idx].settings.unannouncedChannels = node.settings.unannouncedChannels ? !!node.settings.unannouncedChannels : false;
this.common.nodes[idx].Settings.logLevel = node.Settings.logLevel ? node.Settings.logLevel : 'ERROR'; this.common.nodes[idx].settings.logLevel = node.settings.logLevel ? node.settings.logLevel : 'ERROR';
this.common.nodes[idx].Settings.fiatConversion = node.Settings.fiatConversion ? !!node.Settings.fiatConversion : false; this.common.nodes[idx].settings.fiatConversion = node.settings.fiatConversion ? !!node.settings.fiatConversion : false;
if (this.common.nodes[idx].Settings.fiatConversion) { if (this.common.nodes[idx].settings.fiatConversion) {
this.common.nodes[idx].Settings.currencyUnit = node.Settings.currencyUnit ? node.Settings.currencyUnit : 'USD'; this.common.nodes[idx].settings.currencyUnit = node.settings.currencyUnit ? node.settings.currencyUnit : 'USD';
} }
if (process?.env?.SWAP_SERVER_URL && process?.env?.SWAP_SERVER_URL.trim() !== '') { if (process?.env?.SWAP_SERVER_URL && process?.env?.SWAP_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.swapServerUrl = process?.env?.SWAP_SERVER_URL.endsWith('/v1') ? process?.env?.SWAP_SERVER_URL.slice(0, -3) : process?.env?.SWAP_SERVER_URL; this.common.nodes[idx].settings.swapServerUrl = process?.env?.SWAP_SERVER_URL.endsWith('/v1') ? process?.env?.SWAP_SERVER_URL.slice(0, -3) : process?.env?.SWAP_SERVER_URL;
this.common.nodes[idx].Authentication.swapMacaroonPath = process?.env?.SWAP_MACAROON_PATH; this.common.nodes[idx].authentication.swapMacaroonPath = process?.env?.SWAP_MACAROON_PATH;
} else if (node.Settings.swapServerUrl && node.Settings.swapServerUrl.trim() !== '') { } else if (node.settings.swapServerUrl && node.settings.swapServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.swapServerUrl = node.Settings.swapServerUrl.endsWith('/v1') ? node.Settings.swapServerUrl.slice(0, -3) : node.Settings.swapServerUrl; this.common.nodes[idx].settings.swapServerUrl = node.settings.swapServerUrl.endsWith('/v1') ? node.settings.swapServerUrl.slice(0, -3) : node.settings.swapServerUrl;
this.common.nodes[idx].Authentication.swapMacaroonPath = node.Authentication.swapMacaroonPath ? node.Authentication.swapMacaroonPath : ''; this.common.nodes[idx].authentication.swapMacaroonPath = node.authentication.swapMacaroonPath ? node.authentication.swapMacaroonPath : '';
} else { } else {
this.common.nodes[idx].Settings.swapServerUrl = ''; this.common.nodes[idx].settings.swapServerUrl = '';
this.common.nodes[idx].Authentication.swapMacaroonPath = ''; this.common.nodes[idx].authentication.swapMacaroonPath = '';
} }
if (process?.env?.BOLTZ_SERVER_URL && process?.env?.BOLTZ_SERVER_URL.trim() !== '') { if (process?.env?.BOLTZ_SERVER_URL && process?.env?.BOLTZ_SERVER_URL.trim() !== '') {
this.common.nodes[idx].Settings.boltzServerUrl = process?.env?.BOLTZ_SERVER_URL.endsWith('/v1') ? process?.env?.BOLTZ_SERVER_URL.slice(0, -3) : process?.env?.BOLTZ_SERVER_URL; this.common.nodes[idx].settings.boltzServerUrl = process?.env?.BOLTZ_SERVER_URL.endsWith('/v1') ? process?.env?.BOLTZ_SERVER_URL.slice(0, -3) : process?.env?.BOLTZ_SERVER_URL;
this.common.nodes[idx].Authentication.boltzMacaroonPath = process?.env?.BOLTZ_MACAROON_PATH; this.common.nodes[idx].authentication.boltzMacaroonPath = process?.env?.BOLTZ_MACAROON_PATH;
} else if (node.Settings.boltzServerUrl && node.Settings.boltzServerUrl.trim() !== '') { } else if (node.settings.boltzServerUrl && node.settings.boltzServerUrl.trim() !== '') {
this.common.nodes[idx].Settings.boltzServerUrl = node.Settings.boltzServerUrl.endsWith('/v1') ? node.Settings.boltzServerUrl.slice(0, -3) : node.Settings.boltzServerUrl; this.common.nodes[idx].settings.boltzServerUrl = node.settings.boltzServerUrl.endsWith('/v1') ? node.settings.boltzServerUrl.slice(0, -3) : node.settings.boltzServerUrl;
this.common.nodes[idx].Authentication.boltzMacaroonPath = node.Authentication.boltzMacaroonPath ? node.Authentication.boltzMacaroonPath : ''; this.common.nodes[idx].authentication.boltzMacaroonPath = node.authentication.boltzMacaroonPath ? node.authentication.boltzMacaroonPath : '';
} else { } else {
this.common.nodes[idx].Settings.boltzServerUrl = ''; this.common.nodes[idx].settings.boltzServerUrl = '';
this.common.nodes[idx].Authentication.boltzMacaroonPath = ''; this.common.nodes[idx].authentication.boltzMacaroonPath = '';
} }
this.common.nodes[idx].Settings.enableOffers = process?.env?.ENABLE_OFFERS ? process?.env?.ENABLE_OFFERS : (node.Settings.enableOffers) ? node.Settings.enableOffers : false; this.common.nodes[idx].settings.enableOffers = process?.env?.ENABLE_OFFERS ? process?.env?.ENABLE_OFFERS : (node.settings.enableOffers) ? node.settings.enableOffers : false;
this.common.nodes[idx].Settings.enablePeerswap = process?.env?.ENABLE_PEERSWAP ? process?.env?.ENABLE_PEERSWAP : (node.Settings.enablePeerswap) ? node.Settings.enablePeerswap : false; this.common.nodes[idx].settings.enablePeerswap = process?.env?.ENABLE_PEERSWAP ? process?.env?.ENABLE_PEERSWAP : (node.settings.enablePeerswap) ? node.settings.enablePeerswap : false;
this.common.nodes[idx].Settings.bitcoindConfigPath = process?.env?.BITCOIND_CONFIG_PATH ? process?.env?.BITCOIND_CONFIG_PATH : (node.Settings.bitcoindConfigPath) ? node.Settings.bitcoindConfigPath : ''; this.common.nodes[idx].settings.bitcoindConfigPath = process?.env?.BITCOIND_CONFIG_PATH ? process?.env?.BITCOIND_CONFIG_PATH : (node.settings.bitcoindConfigPath) ? node.settings.bitcoindConfigPath : '';
this.common.nodes[idx].Settings.channelBackupPath = process?.env?.CHANNEL_BACKUP_PATH ? process?.env?.CHANNEL_BACKUP_PATH : (node.Settings.channelBackupPath) ? node.Settings.channelBackupPath : this.common.appConfig.rtlConfFilePath + sep + 'channels-backup' + sep + 'node-' + node.index; this.common.nodes[idx].settings.channelBackupPath = process?.env?.CHANNEL_BACKUP_PATH ? process?.env?.CHANNEL_BACKUP_PATH : (node.settings.channelBackupPath) ? node.settings.channelBackupPath : this.common.appConfig.rtlConfFilePath + sep + 'channels-backup' + sep + 'node-' + node.index;
try { try {
this.common.createDirectory(this.common.nodes[idx].Settings.channelBackupPath); this.common.createDirectory(this.common.nodes[idx].settings.channelBackupPath);
const exists = fs.existsSync(this.common.nodes[idx].Settings.channelBackupPath + sep + 'channel-all.bak'); const exists = fs.existsSync(this.common.nodes[idx].settings.channelBackupPath + sep + 'channel-all.bak');
if (!exists) { if (!exists) {
try { try {
if (this.common.nodes[idx].lnImplementation === 'LND') { if (this.common.nodes[idx].lnImplementation === 'LND') {
this.common.getAllNodeAllChannelBackup(this.common.nodes[idx]); this.common.getAllNodeAllChannelBackup(this.common.nodes[idx]);
} else { } else {
const createStream = fs.createWriteStream(this.common.nodes[idx].Settings.channelBackupPath + sep + 'channel-all.bak'); const createStream = fs.createWriteStream(this.common.nodes[idx].settings.channelBackupPath + sep + 'channel-all.bak');
createStream.end(); createStream.end();
} }
} catch (err) { } catch (err) {
@ -273,9 +273,9 @@ export class ConfigService {
} catch (err) { } catch (err) {
this.logger.log({ selectedNode: this.common.selectedNode, level: 'ERROR', fileName: 'Config', msg: 'Something went wrong while creating the backup directory: \n' + err }); this.logger.log({ selectedNode: this.common.selectedNode, level: 'ERROR', fileName: 'Config', msg: 'Something went wrong while creating the backup directory: \n' + err });
} }
this.common.nodes[idx].Settings.logFile = config.rtlConfFilePath + '/logs/RTL-Node-' + node.index + '.log'; this.common.nodes[idx].settings.logFile = config.rtlConfFilePath + '/logs/RTL-Node-' + node.index + '.log';
this.logger.log({ selectedNode: this.common.selectedNode, level: 'INFO', fileName: 'Config', msg: 'Node Config: ' + JSON.stringify(this.common.nodes[idx]) }); this.logger.log({ selectedNode: this.common.selectedNode, level: 'INFO', fileName: 'Config', msg: 'Node Config: ' + JSON.stringify(this.common.nodes[idx]) });
const log_file = this.common.nodes[idx].Settings.logFile; const log_file = this.common.nodes[idx].settings.logFile;
if (fs.existsSync(log_file || '')) { if (fs.existsSync(log_file || '')) {
fs.writeFile((log_file || ''), '', () => { }); fs.writeFile((log_file || ''), '', () => { });
} else { } else {
@ -332,14 +332,33 @@ export class ConfigService {
} }
}; };
private updateConfig = (confFileFullPath, config) => {
// Update Config file to change Settings to settings and Authentication to authentication
// Added in v0.15.1, remove in a year?
if (!config.nodes || config.nodes[0].settings) { return; }
config.nodes.map((node) => {
if (node.Authentication) {
node.authentication = JSON.parse(JSON.stringify(node.Authentication));
delete node.Authentication;
}
if (node.Settings) {
node.settings = JSON.parse(JSON.stringify(node.Settings));
delete node.Settings;
}
return node;
});
fs.writeFileSync(confFileFullPath, JSON.stringify(config, null, 2), 'utf-8');
};
public setServerConfiguration = () => { public setServerConfiguration = () => {
try { try {
const rtlConfFilePath = (process?.env?.RTL_CONFIG_PATH) ? process?.env?.RTL_CONFIG_PATH : join(this.directoryName, '../..'); const rtlConfFilePath = (process?.env?.RTL_CONFIG_PATH) ? process?.env?.RTL_CONFIG_PATH : join(this.directoryName, '../..');
const confFileFullPath = rtlConfFilePath + sep + 'RTL-Config.json'; const confFileFullPath = rtlConfFilePath + sep + 'RTL-Config.json';
if (!fs.existsSync(confFileFullPath)) { if (!fs.existsSync(confFileFullPath)) {
fs.writeFileSync(confFileFullPath, JSON.stringify(this.setDefaultConfig())); fs.writeFileSync(confFileFullPath, JSON.stringify(this.setDefaultConfig(), null, 2), 'utf-8');
} }
const config = JSON.parse(fs.readFileSync(confFileFullPath, 'utf-8')); const config = JSON.parse(fs.readFileSync(confFileFullPath, 'utf-8'));
this.updateConfig(confFileFullPath, config);
config.rtlConfFilePath = rtlConfFilePath; config.rtlConfFilePath = rtlConfFilePath;
this.updateLogByLevel(); this.updateLogByLevel();
this.validateNodeConfig(config); this.validateNodeConfig(config);

@ -17,16 +17,16 @@ export class LoggerService {
msgStr = msgStr + '.\r\n'; msgStr = msgStr + '.\r\n';
} }
console.error(msgStr); console.error(msgStr);
if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
break; break;
case 'WARN': case 'WARN':
msgStr = prepMsgData(msgJSON, msgStr); msgStr = prepMsgData(msgJSON, msgStr);
if (!msgJSON.selectedNode || msgJSON.selectedNode.Settings.logLevel === 'WARN' || msgJSON.selectedNode.Settings.logLevel === 'INFO' || msgJSON.selectedNode.Settings.logLevel === 'DEBUG') { if (!msgJSON.selectedNode || msgJSON.selectedNode.settings.logLevel === 'WARN' || msgJSON.selectedNode.settings.logLevel === 'INFO' || msgJSON.selectedNode.settings.logLevel === 'DEBUG') {
if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} }
break; break;
@ -34,17 +34,17 @@ export class LoggerService {
case 'INFO': case 'INFO':
if (!msgJSON.selectedNode && msgJSON.fileName === 'RTL') { if (!msgJSON.selectedNode && msgJSON.fileName === 'RTL') {
console.log(msgStr + '.\r\n'); console.log(msgStr + '.\r\n');
} else if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logLevel === 'INFO') { } else if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logLevel === 'INFO') {
msgStr = msgStr + '.\r\n'; msgStr = msgStr + '.\r\n';
console.log(msgStr); console.log(msgStr);
if (msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} else if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logLevel === 'DEBUG') { } else if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logLevel === 'DEBUG') {
msgStr = prepMsgData(msgJSON, msgStr); msgStr = prepMsgData(msgJSON, msgStr);
console.log(msgStr); console.log(msgStr);
if (msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} }
break; break;
@ -52,11 +52,11 @@ export class LoggerService {
case 'DEBUG': case 'DEBUG':
if (!msgJSON.selectedNode) { if (!msgJSON.selectedNode) {
console.log(msgStr + '.\r\n'); console.log(msgStr + '.\r\n');
} else if (msgJSON.selectedNode && msgJSON.selectedNode.Settings.logLevel === 'DEBUG') { } else if (msgJSON.selectedNode && msgJSON.selectedNode.settings.logLevel === 'DEBUG') {
msgStr = prepMsgData(msgJSON, msgStr); msgStr = prepMsgData(msgJSON, msgStr);
console.log(msgStr); console.log(msgStr);
if (msgJSON.selectedNode.Settings.logFile) { if (msgJSON.selectedNode.settings.logFile) {
fs.appendFile(msgJSON.selectedNode.Settings.logFile, msgStr, () => { }); fs.appendFile(msgJSON.selectedNode.settings.logFile, msgStr, () => { });
} }
} }
break; break;

@ -1,4 +1,4 @@
<div fxLayout="column" id="rtl-container" class="rtl-container medium" [ngClass]="[selNode.Settings.themeColor | lowercase, selNode.Settings.themeMode | lowercase]"> <div fxLayout="column" id="rtl-container" class="rtl-container medium" [ngClass]="[selNode.settings.themeColor | lowercase, selNode.settings.themeMode | lowercase]">
<mat-toolbar fxLayout="row" fxLayoutAlign="space-between center" class="bg-primary rtl-top-toolbar"> <mat-toolbar fxLayout="row" fxLayoutAlign="space-between center" class="bg-primary rtl-top-toolbar">
<div> <div>
<button *ngIf="flgLoggedIn" mat-icon-button matTooltipPosition="right" [matTooltip]="flgSideNavOpened ? 'Hide Navigation Menu' : 'Show Navigation Menu'" [matTooltipDisabled]="smallScreen" (click)="sideNavToggle()"> <button *ngIf="flgLoggedIn" mat-icon-button matTooltipPosition="right" [matTooltip]="flgSideNavOpened ? 'Hide Navigation Menu' : 'Show Navigation Menu'" [matTooltipDisabled]="smallScreen" (click)="sideNavToggle()">
@ -29,7 +29,7 @@
</div> </div>
</mat-sidenav-content> </mat-sidenav-content>
</mat-sidenav-container> </mat-sidenav-container>
<div *ngIf="!selNode.Settings.themeColor" class="rtl-spinner"> <div *ngIf="!selNode.settings.themeColor" class="rtl-spinner">
<mat-spinner color="accent" /> <mat-spinner color="accent" />
<h4>Loading RTL...</h4> <h4>Loading RTL...</h4>
</div> </div>

@ -1,4 +1,4 @@
<div *ngIf="selNode?.userPersona === userPersonaEnum.OPERATOR; else merchantDashboard"fxLayout="column"> <div *ngIf="selNode?.settings.userPersona === userPersonaEnum.OPERATOR; else merchantDashboard"fxLayout="column">
<div fxLayout="row" fxLayoutAlign="start start" class="page-title-container mb-2"> <div fxLayout="row" fxLayoutAlign="start start" class="page-title-container mb-2">
<fa-icon class="page-title-img mr-1" [icon]="apiCallStatusNodeInfo.status === apiCallStatusEnum.ERROR ? faFrown : faSmile" /> <fa-icon class="page-title-img mr-1" [icon]="apiCallStatusNodeInfo.status === apiCallStatusEnum.ERROR ? faFrown : faSmile" />
<span class="page-title">{{apiCallStatusNodeInfo.status === apiCallStatusEnum.COMPLETED ? 'Welcome ' + information.alias + '! Your node is up and running.' : apiCallStatusNodeInfo.status === apiCallStatusEnum.INITIATED ? 'Wait! Getting your node information...' : 'Error! Please check the server connection.'}}</span> <span class="page-title">{{apiCallStatusNodeInfo.status === apiCallStatusEnum.COMPLETED ? 'Welcome ' + information.alias + '! Your node is up and running.' : apiCallStatusNodeInfo.status === apiCallStatusEnum.INITIATED ? 'Wait! Getting your node information...' : 'Error! Please check the server connection.'}}</span>

@ -6,7 +6,7 @@ import { Store } from '@ngrx/store';
import { faSmile, faFrown } from '@fortawesome/free-regular-svg-icons'; import { faSmile, faFrown } from '@fortawesome/free-regular-svg-icons';
import { faAngleDoubleDown, faAngleDoubleUp, faChartPie, faBolt, faServer, faNetworkWired } from '@fortawesome/free-solid-svg-icons'; import { faAngleDoubleDown, faAngleDoubleUp, faChartPie, faBolt, faServer, faNetworkWired } from '@fortawesome/free-solid-svg-icons';
import { SelNodeChild } from '../../shared/models/RTLconfig'; import { Node } from '../../shared/models/RTLconfig';
import { UserPersonaEnum, ScreenSizeEnum, APICallStatusEnum } from '../../shared/services/consts-enums-functions'; import { UserPersonaEnum, ScreenSizeEnum, APICallStatusEnum } from '../../shared/services/consts-enums-functions';
import { ChannelsStatus, GetInfo, Fees, Channel, Balance, LocalRemoteBalance, UTXO } from '../../shared/models/clnModels'; import { ChannelsStatus, GetInfo, Fees, Channel, Balance, LocalRemoteBalance, UTXO } from '../../shared/models/clnModels';
import { ApiCallStatusPayload } from '../../shared/models/apiCallsPayload'; import { ApiCallStatusPayload } from '../../shared/models/apiCallsPayload';
@ -43,7 +43,7 @@ export class CLNHomeComponent implements OnInit, OnDestroy {
public faNetworkWired = faNetworkWired; public faNetworkWired = faNetworkWired;
public userPersonaEnum = UserPersonaEnum; public userPersonaEnum = UserPersonaEnum;
public channelBalances = { localBalance: 0, remoteBalance: 0, balancedness: 0 }; public channelBalances = { localBalance: 0, remoteBalance: 0, balancedness: 0 };
public selNode: SelNodeChild | null = {}; public selNode: Node | null;
public fees: Fees; public fees: Fees;
public information: GetInfo = {}; public information: GetInfo = {};
public totalBalance: Balance = {}; public totalBalance: Balance = {};
@ -118,7 +118,7 @@ export class CLNHomeComponent implements OnInit, OnDestroy {
ngOnInit() { ngOnInit() {
this.store.select(nodeInfoAndNodeSettingsAndAPIsStatus).pipe(takeUntil(this.unSubs[0])). this.store.select(nodeInfoAndNodeSettingsAndAPIsStatus).pipe(takeUntil(this.unSubs[0])).
subscribe((infoSettingsStatusSelector: { information: GetInfo, nodeSettings: SelNodeChild | null, fees: Fees, apisCallStatus: ApiCallStatusPayload[] }) => { subscribe((infoSettingsStatusSelector: { information: GetInfo, nodeSettings: Node | null, fees: Fees, apisCallStatus: ApiCallStatusPayload[] }) => {
this.errorMessages[0] = ''; this.errorMessages[0] = '';
this.errorMessages[3] = ''; this.errorMessages[3] = '';
this.apiCallStatusNodeInfo = infoSettingsStatusSelector.apisCallStatus[0]; this.apiCallStatusNodeInfo = infoSettingsStatusSelector.apisCallStatus[0];

@ -1,5 +1,5 @@
<div fxLayout="column" fxLayoutAlign="space-between stretch" class="mb-4"> <div fxLayout="column" fxLayoutAlign="space-between stretch" class="mb-4">
<mat-grid-list *ngIf="selNode.userPersona === userPersonaEnum.OPERATOR" cols="6" rowHeight="100px"> <mat-grid-list *ngIf="selNode.settings.userPersona === userPersonaEnum.OPERATOR" cols="6" rowHeight="100px">
<mat-grid-tile *ngFor="let card of nodeCardsOperator" class="node-grid-tile" [colspan]="card.cols" [rowspan]="card.rows"> <mat-grid-tile *ngFor="let card of nodeCardsOperator" class="node-grid-tile" [colspan]="card.cols" [rowspan]="card.rows">
<div fxLayout="column" fxLayoutAlign="stretch start" fxFlex="100" class="h-100"> <div fxLayout="column" fxLayoutAlign="stretch start" fxFlex="100" class="h-100">
<div fxLayout="row" fxLayoutAlign="start start" class="w-100"> <div fxLayout="row" fxLayoutAlign="start start" class="w-100">
@ -40,7 +40,7 @@
</div> </div>
</mat-grid-tile> </mat-grid-tile>
</mat-grid-list> </mat-grid-list>
<mat-grid-list *ngIf="selNode.userPersona === userPersonaEnum.MERCHANT" cols="6" rowHeight="100px"> <mat-grid-list *ngIf="selNode.settings.userPersona === userPersonaEnum.MERCHANT" cols="6" rowHeight="100px">
<mat-grid-tile *ngFor="let card of nodeCardsMerchant" class="node-grid-tile" [colspan]="card.cols" [rowspan]="card.rows"> <mat-grid-tile *ngFor="let card of nodeCardsMerchant" class="node-grid-tile" [colspan]="card.cols" [rowspan]="card.rows">
<div fxLayout="column" fxLayoutAlign="stretch start" fxFlex="100" class="h-100"> <div fxLayout="column" fxLayoutAlign="stretch start" fxFlex="100" class="h-100">
<div fxLayout="row" fxLayoutAlign="start start" class="w-100"> <div fxLayout="row" fxLayoutAlign="start start" class="w-100">

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save