mirror of
https://github.com/Ride-The-Lightning/RTL
synced 2024-11-15 18:13:00 +00:00
Peerswap Listpeers, folder restructuring, test and lint fix
Peerswap Listpeers, folder restructuring, test and lint fix
This commit is contained in:
parent
4a470feae9
commit
9ce0187bee
@ -34,8 +34,9 @@
|
||||
"@angular-eslint/arrow-body-style": "off",
|
||||
"@angular-eslint/component-selector": ["error", { "prefix": "rtl", "style": "kebab-case", "type": "element" }],
|
||||
"@angular-eslint/directive-selector": ["error", { "style": "camelCase", "type": "attribute" }],
|
||||
"@typescript-eslint/type-annotation-spacing": "error",
|
||||
"@typescript-eslint/member-delimiter-style": ["error", { "multiline": { "delimiter": "semi", "requireLast": true}, "singleline": { "delimiter": "comma", "requireLast": false }}],
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
"@typescript-eslint/type-annotation-spacing": "error",
|
||||
"quotes": ["error", "single"],
|
||||
"comma-dangle": ["error", "never"],
|
||||
"comma-spacing": ["error", { "before": false, "after": true }],
|
||||
|
67
backend/controllers/cln/peers copy.js
Normal file
67
backend/controllers/cln/peers copy.js
Normal file
@ -0,0 +1,67 @@
|
||||
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 getPeers = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'List Peers..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) {
|
||||
return res.status(options.statusCode).json({ message: options.message, error: options.error });
|
||||
}
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peer/listPeers';
|
||||
request(options).then((body) => {
|
||||
body.forEach((peer) => {
|
||||
if (!peer.alias || peer.alias === '') {
|
||||
peer.alias = peer.id.substring(0, 20);
|
||||
}
|
||||
});
|
||||
const peers = (body) ? common.sortDescByStrKey(body, 'alias') : [];
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers with Alias Received', data: peers });
|
||||
res.status(200).json(peers);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peers', 'List Peers Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const postPeer = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) {
|
||||
return res.status(options.statusCode).json({ message: options.message, error: options.error });
|
||||
}
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peer/connect';
|
||||
options.body = req.body;
|
||||
request.post(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peers', msg: 'Peer Connected', data: body });
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peer/listPeers';
|
||||
request(options).then((body) => {
|
||||
let peers = (body) ? common.sortDescByStrKey(body, 'alias') : [];
|
||||
peers = common.newestOnTop(peers, 'id', req.body.id);
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peers List after Connect Received', data: peers });
|
||||
res.status(201).json(peers);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peers', 'Connect Peer Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peers', 'Connect Peer Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const deletePeer = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) {
|
||||
return res.status(options.statusCode).json({ message: options.message, error: options.error });
|
||||
}
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peer/disconnect/' + req.params.peerId + '?force=' + req.query.force;
|
||||
request.delete(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected', data: body });
|
||||
res.status(204).json({});
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peers', 'Detach Peer Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
188
backend/controllers/cln/peerswap.js
Normal file
188
backend/controllers/cln/peerswap.js
Normal file
@ -0,0 +1,188 @@
|
||||
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 reloadPolicy = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Reload Policy..' });
|
||||
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/peerswap/reloadPolicy';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Reload Policy Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Reload Policy Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const getSwap = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swap..' });
|
||||
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/peerswap/swap/' + req.params.swapId;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swap Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const listSwaps = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swaps..' });
|
||||
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/peerswap/listSwaps';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swaps Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swaps Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const listActiveSwaps = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Active Swaps..' });
|
||||
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/peerswap/listActiveSwaps';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Active Swaps Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Active Swaps Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const listSwapRequests = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swap Requests..' });
|
||||
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/peerswap/listSwapRequests';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Requests Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swap Requests Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const listSwapPeers = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swap Peers..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) {
|
||||
return res.status(options.statusCode).json({ message: options.message, error: options.error });
|
||||
}
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/listPeers';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peers Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swap Peers Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const allowSwapRequests = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Allowing/Denying Swap Requests..' });
|
||||
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/peerswap/allowSwapRequests' + req.params.isAllowed;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Request Allowed/Denied', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Allow/Deny Swap Request Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const addSwapPeer = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Adding Swap Peer..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) {
|
||||
return res.status(options.statusCode).json({ message: options.message, error: options.error });
|
||||
}
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/addPeer' + req.params.pubkey;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Added', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Add Swap Peer Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const removeSwapPeer = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Removing Swap Peer..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) {
|
||||
return res.status(options.statusCode).json({ message: options.message, error: options.error });
|
||||
}
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/removePeer' + req.params.pubkey;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Removed', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Remove Swap Peer Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const resendMessage = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Resending Message..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) {
|
||||
return res.status(options.statusCode).json({ message: options.message, error: options.error });
|
||||
}
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/resendMessage' + req.params.swapId;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Message Resent', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Resend Message Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const swapOut = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swapping Out..' });
|
||||
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/peerswap/swapOut';
|
||||
options.body = req.body;
|
||||
request.post(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peerswap', msg: 'Swapped Out', data: body });
|
||||
res.status(201).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Swap Out Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
export const swapIn = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swapping In..' });
|
||||
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/peerswap/swapIn';
|
||||
options.body = req.body;
|
||||
request.post(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peerswap', msg: 'Swapped In', data: body });
|
||||
res.status(201).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Swap In Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
@ -8,6 +8,7 @@ import invoicesCLRoutes from './invoices.js';
|
||||
import onChainCLRoutes from './onchain.js';
|
||||
import paymentsCLRoutes from './payments.js';
|
||||
import peersCLRoutes from './peers.js';
|
||||
import peerswapCLRoutes from './peerswap.js';
|
||||
import networkCLRoutes from './network.js';
|
||||
import offersCLRoutes from './offers.js';
|
||||
import utilityCLRoutes from './utility.js';
|
||||
@ -21,6 +22,7 @@ const clRoutes = [
|
||||
{ path: '/onchain', route: onChainCLRoutes },
|
||||
{ path: '/payments', route: paymentsCLRoutes },
|
||||
{ path: '/peers', route: peersCLRoutes },
|
||||
{ path: '/peerswap', route: peerswapCLRoutes },
|
||||
{ path: '/network', route: networkCLRoutes },
|
||||
{ path: '/offers', route: offersCLRoutes },
|
||||
{ path: '/utility', route: utilityCLRoutes }
|
||||
|
9
backend/routes/cln/peers copy.js
Normal file
9
backend/routes/cln/peers copy.js
Normal file
@ -0,0 +1,9 @@
|
||||
import exprs from 'express';
|
||||
const { Router } = exprs;
|
||||
import { isAuthenticated } from '../../utils/authCheck.js';
|
||||
import { getPeers, postPeer, deletePeer } from '../../controllers/cln/peers.js';
|
||||
const router = Router();
|
||||
router.get('/', isAuthenticated, getPeers);
|
||||
router.post('/', isAuthenticated, postPeer);
|
||||
router.delete('/:peerId', isAuthenticated, deletePeer);
|
||||
export default router;
|
18
backend/routes/cln/peerswap.js
Normal file
18
backend/routes/cln/peerswap.js
Normal file
@ -0,0 +1,18 @@
|
||||
import exprs from 'express';
|
||||
const { Router } = exprs;
|
||||
import { isAuthenticated } from '../../utils/authCheck.js';
|
||||
import { addSwapPeer, allowSwapRequests, getSwap, listActiveSwaps, listSwapPeers, listSwapRequests, listSwaps, reloadPolicy, removeSwapPeer, resendMessage, swapIn, swapOut } from '../../controllers/cln/peerswap.js';
|
||||
const router = Router();
|
||||
router.get('/reloadPolicy', isAuthenticated, reloadPolicy);
|
||||
router.get('/swap/:swapId', isAuthenticated, getSwap);
|
||||
router.get('/listSwaps', isAuthenticated, listSwaps);
|
||||
router.get('/listActiveSwaps', isAuthenticated, listActiveSwaps);
|
||||
router.get('/listSwapRequests', isAuthenticated, listSwapRequests);
|
||||
router.get('/listSwapPeers', isAuthenticated, listSwapPeers);
|
||||
router.get('/allowSwapRequests/:isAllowed', isAuthenticated, allowSwapRequests);
|
||||
router.get('/addPeer/:pubkey', isAuthenticated, addSwapPeer);
|
||||
router.get('/removePeer/:pubkey', isAuthenticated, removeSwapPeer);
|
||||
router.get('/resendMessage/:swapId', isAuthenticated, resendMessage);
|
||||
router.post('/swapOut', isAuthenticated, swapOut);
|
||||
router.post('/swapIn', isAuthenticated, swapIn);
|
||||
export default router;
|
1
frontend/275.517caefe8eeb635c.js
Normal file
1
frontend/275.517caefe8eeb635c.js
Normal file
File diff suppressed because one or more lines are too long
1
frontend/508.06f7dec065381b97.js
Normal file
1
frontend/508.06f7dec065381b97.js
Normal file
File diff suppressed because one or more lines are too long
1
frontend/515.cb8cf5fc374ab82d.js
Normal file
1
frontend/515.cb8cf5fc374ab82d.js
Normal file
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
@ -13,6 +13,6 @@
|
||||
<style>@font-face{font-family:Roboto;src:url(Roboto-Thin.f7a95c9c5999532c.woff2) format("woff2"),url(Roboto-Thin.c13c157cb81e8ebb.woff) format("woff");font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-ThinItalic.b0e084abf689f393.woff2) format("woff2"),url(Roboto-ThinItalic.1111028df6cea564.woff) format("woff");font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Light.0e01b6cd13b3857f.woff2) format("woff2"),url(Roboto-Light.603ca9a537b88428.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-LightItalic.232ef4b20215f720.woff2) format("woff2"),url(Roboto-LightItalic.1b5e142f787151c8.woff) format("woff");font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Regular.475ba9e4e2d63456.woff2) format("woff2"),url(Roboto-Regular.bcefbfee882bc1cb.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-RegularItalic.e3a9ebdaac06bbc4.woff2) format("woff2"),url(Roboto-RegularItalic.0668fae6af0cf8c2.woff) format("woff");font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Medium.457532032ceb0168.woff2) format("woff2"),url(Roboto-Medium.6e1ae5f0b324a0aa.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-MediumItalic.872f7060602d55d2.woff2) format("woff2"),url(Roboto-MediumItalic.e06fb533801cbb08.woff) format("woff");font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Bold.447291a88c067396.woff2) format("woff2"),url(Roboto-Bold.fc482e6133cf5e26.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BoldItalic.1b15168ef6fa4e16.woff2) format("woff2"),url(Roboto-BoldItalic.e26ba339b06f09f7.woff) format("woff");font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Black.2eaa390d458c877d.woff2) format("woff2"),url(Roboto-Black.b25f67ad8583da68.woff) format("woff");font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BlackItalic.7dc03ee444552bc5.woff2) format("woff2"),url(Roboto-BlackItalic.c8dc642467cb3099.woff) format("woff");font-weight:900;font-style:italic}html{width:100%;height:99%;line-height:1.5;overflow-x:hidden;font-family:Roboto,sans-serif!important;font-size:62.5%}body{box-sizing:border-box;height:100%;margin:0;overflow:hidden}*{margin:0;padding:0}</style><link rel="stylesheet" href="styles.43515fc39338348b.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.43515fc39338348b.css"></noscript></head>
|
||||
<body>
|
||||
<rtl-app></rtl-app>
|
||||
<script src="runtime.1ca59cd92764ed45.js" type="module"></script><script src="polyfills.eddc63f1737a019a.js" type="module"></script><script src="main.9b30da1402d5f9f2.js" type="module"></script>
|
||||
<script src="runtime.84a51fcf32f6aa74.js" type="module"></script><script src="polyfills.eddc63f1737a019a.js" type="module"></script><script src="main.08b18bef419c8b7e.js" type="module"></script>
|
||||
|
||||
</body></html>
|
1
frontend/main.08b18bef419c8b7e.js
Normal file
1
frontend/main.08b18bef419c8b7e.js
Normal file
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 +0,0 @@
|
||||
(()=>{"use strict";var e,v={},g={};function r(e){var n=g[e];if(void 0!==n)return n.exports;var t=g[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=(n,t,f,d)=>{if(!t){var a=1/0;for(i=0;i<e.length;i++){for(var[t,f,d]=e[i],c=!0,o=0;o<t.length;o++)(!1&d||a>=d)&&Object.keys(r.O).every(b=>r.O[b](t[o]))?t.splice(o--,1):(c=!1,d<a&&(a=d));if(c){e.splice(i--,1);var l=f();void 0!==l&&(n=l)}}return n}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[t,f,d]},r.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return r.d(n,{a:n}),n},r.d=(e,n)=>{for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((n,t)=>(r.f[t](e,n),n),[])),r.u=e=>e+"."+{564:"9c466ff107a4d969",636:"95c8ae357b1ed820",893:"9a615c46b89a5a79",924:"1c1eb885f1f101d2"}[e]+".js",r.miniCssF=e=>{},r.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e={},n="RTLApp:";r.l=(t,f,d,i)=>{if(e[t])e[t].push(f);else{var a,c;if(void 0!==d)for(var o=document.getElementsByTagName("script"),l=0;l<o.length;l++){var u=o[l];if(u.getAttribute("src")==t||u.getAttribute("data-webpack")==n+d){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",n+d),a.src=r.tu(t)),e[t]=[f];var s=(m,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(_=>_(b)),m)return m(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=>{"undefined"!=typeof Symbol&&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:n=>n},"undefined"!=typeof trustedTypes&&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=(f,d)=>{var i=r.o(e,f)?e[f]:void 0;if(0!==i)if(i)d.push(i[2]);else if(666!=f){var a=new Promise((u,s)=>i=e[f]=[u,s]);d.push(i[2]=a);var c=r.p+r.u(f),o=new Error;r.l(c,u=>{if(r.o(e,f)&&(0!==(i=e[f])&&(e[f]=void 0),i)){var s=u&&("load"===u.type?"missing":u.type),p=u&&u.target&&u.target.src;o.message="Loading chunk "+f+" failed.\n("+s+": "+p+")",o.name="ChunkLoadError",o.type=s,o.request=p,i[1](o)}},"chunk-"+f,f)}else e[f]=0},r.O.j=f=>0===e[f];var n=(f,d)=>{var o,l,[i,a,c]=d,u=0;if(i.some(p=>0!==e[p])){for(o in a)r.o(a,o)&&(r.m[o]=a[o]);if(c)var s=c(r)}for(f&&f(d);u<i.length;u++)r.o(e,l=i[u])&&e[l]&&e[l][0](),e[l]=0;return r.O(s)},t=self.webpackChunkRTLApp=self.webpackChunkRTLApp||[];t.forEach(n.bind(null,0)),t.push=n.bind(null,t.push.bind(t))})()})();
|
@ -1 +1 @@
|
||||
(()=>{"use strict";var e,v={},g={};function r(e){var n=g[e];if(void 0!==n)return n.exports;var t=g[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=(n,t,f,o)=>{if(!t){var a=1/0;for(i=0;i<e.length;i++){for(var[t,f,o]=e[i],c=!0,u=0;u<t.length;u++)(!1&o||a>=o)&&Object.keys(r.O).every(b=>r.O[b](t[u]))?t.splice(u--,1):(c=!1,o<a&&(a=o));if(c){e.splice(i--,1);var d=f();void 0!==d&&(n=d)}}return n}o=o||0;for(var i=e.length;i>0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[t,f,o]},r.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return r.d(n,{a:n}),n},r.d=(e,n)=>{for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((n,t)=>(r.f[t](e,n),n),[])),r.u=e=>e+"."+{564:"3d38ee9330b2ba94",636:"95c8ae357b1ed820",893:"9a615c46b89a5a79",924:"1c1eb885f1f101d2"}[e]+".js",r.miniCssF=e=>{},r.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e={},n="RTLApp:";r.l=(t,f,o,i)=>{if(e[t])e[t].push(f);else{var a,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),d=0;d<u.length;d++){var l=u[d];if(l.getAttribute("src")==t||l.getAttribute("data-webpack")==n+o){a=l;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",n+o),a.src=r.tu(t)),e[t]=[f];var s=(m,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(_=>_(b)),m)return m(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=>{"undefined"!=typeof Symbol&&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:n=>n},"undefined"!=typeof trustedTypes&&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=(f,o)=>{var i=r.o(e,f)?e[f]:void 0;if(0!==i)if(i)o.push(i[2]);else if(666!=f){var a=new Promise((l,s)=>i=e[f]=[l,s]);o.push(i[2]=a);var c=r.p+r.u(f),u=new Error;r.l(c,l=>{if(r.o(e,f)&&(0!==(i=e[f])&&(e[f]=void 0),i)){var s=l&&("load"===l.type?"missing":l.type),p=l&&l.target&&l.target.src;u.message="Loading chunk "+f+" failed.\n("+s+": "+p+")",u.name="ChunkLoadError",u.type=s,u.request=p,i[1](u)}},"chunk-"+f,f)}else e[f]=0},r.O.j=f=>0===e[f];var n=(f,o)=>{var u,d,[i,a,c]=o,l=0;if(i.some(p=>0!==e[p])){for(u in a)r.o(a,u)&&(r.m[u]=a[u]);if(c)var s=c(r)}for(f&&f(o);l<i.length;l++)r.o(e,d=i[l])&&e[d]&&e[d][0](),e[d]=0;return r.O(s)},t=self.webpackChunkRTLApp=self.webpackChunkRTLApp||[];t.forEach(n.bind(null,0)),t.push=n.bind(null,t.push.bind(t))})()})();
|
||||
(()=>{"use strict";var e,v={},g={};function r(e){var n=g[e];if(void 0!==n)return n.exports;var t=g[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=(n,t,f,o)=>{if(!t){var a=1/0;for(i=0;i<e.length;i++){for(var[t,f,o]=e[i],s=!0,d=0;d<t.length;d++)(!1&o||a>=o)&&Object.keys(r.O).every(b=>r.O[b](t[d]))?t.splice(d--,1):(s=!1,o<a&&(a=o));if(s){e.splice(i--,1);var l=f();void 0!==l&&(n=l)}}return n}o=o||0;for(var i=e.length;i>0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[t,f,o]},r.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return r.d(n,{a:n}),n},r.d=(e,n)=>{for(var t in n)r.o(n,t)&&!r.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((n,t)=>(r.f[t](e,n),n),[])),r.u=e=>e+"."+{275:"517caefe8eeb635c",508:"06f7dec065381b97",515:"cb8cf5fc374ab82d",924:"1c1eb885f1f101d2"}[e]+".js",r.miniCssF=e=>{},r.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e={},n="RTLApp:";r.l=(t,f,o,i)=>{if(e[t])e[t].push(f);else{var a,s;if(void 0!==o)for(var d=document.getElementsByTagName("script"),l=0;l<d.length;l++){var u=d[l];if(u.getAttribute("src")==t||u.getAttribute("data-webpack")==n+o){a=u;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",n+o),a.src=r.tu(t)),e[t]=[f];var c=(m,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(_=>_(b)),m)return m(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=>{"undefined"!=typeof Symbol&&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:n=>n},"undefined"!=typeof trustedTypes&&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=(f,o)=>{var i=r.o(e,f)?e[f]:void 0;if(0!==i)if(i)o.push(i[2]);else if(666!=f){var a=new Promise((u,c)=>i=e[f]=[u,c]);o.push(i[2]=a);var s=r.p+r.u(f),d=new Error;r.l(s,u=>{if(r.o(e,f)&&(0!==(i=e[f])&&(e[f]=void 0),i)){var c=u&&("load"===u.type?"missing":u.type),p=u&&u.target&&u.target.src;d.message="Loading chunk "+f+" failed.\n("+c+": "+p+")",d.name="ChunkLoadError",d.type=c,d.request=p,i[1](d)}},"chunk-"+f,f)}else e[f]=0},r.O.j=f=>0===e[f];var n=(f,o)=>{var d,l,[i,a,s]=o,u=0;if(i.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(f&&f(o);u<i.length;u++)r.o(e,l=i[u])&&e[l]&&e[l][0](),e[l]=0;return r.O(c)},t=self.webpackChunkRTLApp=self.webpackChunkRTLApp||[];t.forEach(n.bind(null,0)),t.push=n.bind(null,t.push.bind(t))})()})();
|
176
server/controllers/cln/peerswap.ts
Normal file
176
server/controllers/cln/peerswap.ts
Normal file
@ -0,0 +1,176 @@
|
||||
import request from 'request-promise';
|
||||
import { Logger, LoggerService } from '../../utils/logger.js';
|
||||
import { Common, CommonService } from '../../utils/common.js';
|
||||
let options = null;
|
||||
const logger: LoggerService = Logger;
|
||||
const common: CommonService = Common;
|
||||
|
||||
export const reloadPolicy = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Reload Policy..' });
|
||||
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/peerswap/reloadPolicy';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Reload Policy Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Reload Policy Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const getSwap = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swap..' });
|
||||
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/peerswap/swap/' + req.params.swapId;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swap Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const listSwaps = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swaps..' });
|
||||
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/peerswap/listSwaps';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swaps Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swaps Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const listActiveSwaps = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Active Swaps..' });
|
||||
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/peerswap/listActiveSwaps';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Active Swaps Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Active Swaps Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const listSwapRequests = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swap Requests..' });
|
||||
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/peerswap/listSwapRequests';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Requests Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swap Requests Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const listSwapPeers = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Getting Swap Peers..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/listPeers';
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peers Received', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Get Swap Peers Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const allowSwapRequests = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Allowing/Denying Swap Requests..' });
|
||||
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/peerswap/allowSwapRequests' + req.params.isAllowed;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Request Allowed/Denied', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Allow/Deny Swap Request Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const addSwapPeer = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Adding Swap Peer..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/addPeer' + req.params.pubkey;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Added', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Add Swap Peer Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const removeSwapPeer = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Removing Swap Peer..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/removePeer' + req.params.pubkey;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swap Peer Removed', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Remove Swap Peer Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const resendMessage = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Resending Message..' });
|
||||
options = common.getOptions(req);
|
||||
if (options.error) { return res.status(options.statusCode).json({ message: options.message, error: options.error }); }
|
||||
options.url = req.session.selectedNode.ln_server_url + '/v1/peerswap/resendMessage' + req.params.swapId;
|
||||
request(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Message Resent', data: body });
|
||||
res.status(200).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Resend Message Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const swapOut = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swapping Out..' });
|
||||
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/peerswap/swapOut';
|
||||
options.body = req.body;
|
||||
request.post(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peerswap', msg: 'Swapped Out', data: body });
|
||||
res.status(201).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Swap Out Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
||||
|
||||
export const swapIn = (req, res, next) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'INFO', fileName: 'Peerswap', msg: 'Swapping In..' });
|
||||
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/peerswap/swapIn';
|
||||
options.body = req.body;
|
||||
request.post(options).then((body) => {
|
||||
logger.log({ selectedNode: req.session.selectedNode, level: 'DEBUG', fileName: 'Peerswap', msg: 'Swapped In', data: body });
|
||||
res.status(201).json(body);
|
||||
}).catch((errRes) => {
|
||||
const err = common.handleError(errRes, 'Peerswap', 'Swap In Error', req.session.selectedNode);
|
||||
return res.status(err.statusCode).json({ message: err.message, error: err.error });
|
||||
});
|
||||
};
|
@ -8,6 +8,7 @@ import invoicesCLRoutes from './invoices.js';
|
||||
import onChainCLRoutes from './onchain.js';
|
||||
import paymentsCLRoutes from './payments.js';
|
||||
import peersCLRoutes from './peers.js';
|
||||
import peerswapCLRoutes from './peerswap.js';
|
||||
import networkCLRoutes from './network.js';
|
||||
import offersCLRoutes from './offers.js';
|
||||
import utilityCLRoutes from './utility.js';
|
||||
@ -23,6 +24,7 @@ const clRoutes = [
|
||||
{ path: '/onchain', route: onChainCLRoutes },
|
||||
{ path: '/payments', route: paymentsCLRoutes },
|
||||
{ path: '/peers', route: peersCLRoutes },
|
||||
{ path: '/peerswap', route: peerswapCLRoutes },
|
||||
{ path: '/network', route: networkCLRoutes },
|
||||
{ path: '/offers', route: offersCLRoutes },
|
||||
{ path: '/utility', route: utilityCLRoutes }
|
||||
|
21
server/routes/cln/peerswap.ts
Normal file
21
server/routes/cln/peerswap.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import exprs from 'express';
|
||||
const { Router } = exprs;
|
||||
import { isAuthenticated } from '../../utils/authCheck.js';
|
||||
import { addSwapPeer, allowSwapRequests, getSwap, listActiveSwaps, listSwapPeers, listSwapRequests, listSwaps, reloadPolicy, removeSwapPeer, resendMessage, swapIn, swapOut } from '../../controllers/cln/peerswap.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get('/reloadPolicy', isAuthenticated, reloadPolicy);
|
||||
router.get('/swap/:swapId', isAuthenticated, getSwap);
|
||||
router.get('/listSwaps', isAuthenticated, listSwaps);
|
||||
router.get('/listActiveSwaps', isAuthenticated, listActiveSwaps);
|
||||
router.get('/listSwapRequests', isAuthenticated, listSwapRequests);
|
||||
router.get('/listSwapPeers', isAuthenticated, listSwapPeers);
|
||||
router.get('/allowSwapRequests/:isAllowed', isAuthenticated, allowSwapRequests);
|
||||
router.get('/addPeer/:pubkey', isAuthenticated, addSwapPeer);
|
||||
router.get('/removePeer/:pubkey', isAuthenticated, removeSwapPeer);
|
||||
router.get('/resendMessage/:swapId', isAuthenticated, resendMessage);
|
||||
router.post('/swapOut', isAuthenticated, swapOut);
|
||||
router.post('/swapIn', isAuthenticated, swapIn);
|
||||
|
||||
export default router;
|
@ -11,21 +11,13 @@ import { NodeSettingsComponent } from './shared/components/node-config/node-sett
|
||||
import { ServicesSettingsComponent } from './shared/components/node-config/services-settings/services-settings.component';
|
||||
import { LoopServiceSettingsComponent } from './shared/components/node-config/services-settings/loop-service-settings/loop-service-settings.component';
|
||||
import { BoltzServiceSettingsComponent } from './shared/components/node-config/services-settings/boltz-service-settings/boltz-service-settings.component';
|
||||
import { LNServicesComponent } from './shared/components/ln-services/ln-services.component';
|
||||
import { LoopComponent } from './shared/components/ln-services/loop/loop.component';
|
||||
import { BoltzRootComponent } from './shared/components/ln-services/boltz/boltz-root.component';
|
||||
import { HelpComponent } from './shared/components/help/help.component';
|
||||
import { LoginComponent } from './shared/components/login/login.component';
|
||||
import { NotFoundComponent } from './shared/components/not-found/not-found.component';
|
||||
import { ErrorComponent } from './shared/components/error/error.component';
|
||||
import { AuthGuard } from './shared/services/auth.guard';
|
||||
import { ExperimentalSettingsComponent } from './shared/components/node-config/experimental-settings/experimental-settings.component';
|
||||
import { PeerswapComponent } from './shared/components/ln-services/peerswap/peerswap.component';
|
||||
import { PeerswapServiceSettingsComponent } from './shared/components/node-config/services-settings/peerswap-service-settings/peerswap-service-settings.component';
|
||||
import { SwapPeersComponent } from './shared/components/ln-services/peerswap/swap-peers/swap-peers.component';
|
||||
import { PeerswapsOutComponent } from './shared/components/ln-services/peerswap/swaps-out/swaps-out.component';
|
||||
import { PeerswapsInComponent } from './shared/components/ln-services/peerswap/swaps-in/swaps-in.component';
|
||||
import { PeerswapsCancelledComponent } from './shared/components/ln-services/peerswap/swaps-cancelled/swaps-cancelled.component';
|
||||
|
||||
export const routes: Routes = [
|
||||
{ path: '', pathMatch: 'full', redirectTo: 'login' },
|
||||
@ -56,24 +48,6 @@ export const routes: Routes = [
|
||||
{ path: 'lnconfig', component: LNPConfigComponent, canActivate: [AuthGuard] }
|
||||
]
|
||||
},
|
||||
{
|
||||
path: 'services', component: LNServicesComponent, canActivate: [AuthGuard], children: [
|
||||
{ path: '', pathMatch: 'full', redirectTo: 'loop' },
|
||||
{ path: 'loop', pathMatch: 'full', redirectTo: 'loop/loopout' },
|
||||
{ path: 'loop/:selTab', component: LoopComponent },
|
||||
{ path: 'boltz', pathMatch: 'full', redirectTo: 'boltz/swapout' },
|
||||
{ path: 'boltz/:selTab', component: BoltzRootComponent },
|
||||
{
|
||||
path: 'peerswap', component: PeerswapComponent, canActivate: [AuthGuard], children: [
|
||||
{ path: '', pathMatch: 'full', redirectTo: 'peers' },
|
||||
{ path: 'peers', component: SwapPeersComponent, canActivate: [AuthGuard] },
|
||||
{ path: 'psout', component: PeerswapsOutComponent, canActivate: [AuthGuard] },
|
||||
{ path: 'psin', component: PeerswapsInComponent, canActivate: [AuthGuard] },
|
||||
{ path: 'pscancelled', component: PeerswapsCancelledComponent, canActivate: [AuthGuard] }
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
{ path: 'help', component: HelpComponent },
|
||||
{ path: 'login', component: LoginComponent },
|
||||
{ path: 'error', component: ErrorComponent },
|
||||
|
@ -58,6 +58,12 @@ import { CLNOffersTableComponent } from './transactions/offers/offers-table/offe
|
||||
import { CLNOfferBookmarksTableComponent } from './transactions/offers/offer-bookmarks-table/offer-bookmarks-table.component';
|
||||
import { CLNLiquidityAdsListComponent } from './liquidity-ads/liquidity-ads-list/liquidity-ads-list.component';
|
||||
import { CLNOpenLiquidityChannelComponent } from './liquidity-ads/open-liquidity-channel-modal/open-liquidity-channel-modal.component';
|
||||
import { LNServicesComponent } from './ln-services/ln-services.component';
|
||||
import { PeerswapComponent } from './ln-services/peerswap/peerswap.component';
|
||||
import { SwapPeersComponent } from './ln-services/peerswap/swap-peers/swap-peers.component';
|
||||
import { PeerswapsCancelledComponent } from './ln-services/peerswap/swaps-cancelled/swaps-cancelled.component';
|
||||
import { PeerswapsInComponent } from './ln-services/peerswap/swaps-in/swaps-in.component';
|
||||
import { PeerswapsOutComponent } from './ln-services/peerswap/swaps-out/swaps-out.component';
|
||||
|
||||
import { CLNUnlockedGuard } from '../shared/services/auth.guard';
|
||||
|
||||
@ -121,7 +127,13 @@ import { CLNUnlockedGuard } from '../shared/services/auth.guard';
|
||||
CLNOffersTableComponent,
|
||||
CLNOfferBookmarksTableComponent,
|
||||
CLNLiquidityAdsListComponent,
|
||||
CLNOpenLiquidityChannelComponent
|
||||
CLNOpenLiquidityChannelComponent,
|
||||
LNServicesComponent,
|
||||
PeerswapComponent,
|
||||
SwapPeersComponent,
|
||||
PeerswapsCancelledComponent,
|
||||
PeerswapsInComponent,
|
||||
PeerswapsOutComponent
|
||||
],
|
||||
providers: [
|
||||
CLNUnlockedGuard
|
||||
|
@ -35,6 +35,12 @@ import { CLNOffersTableComponent } from './transactions/offers/offers-table/offe
|
||||
import { CLNOfferBookmarksTableComponent } from './transactions/offers/offer-bookmarks-table/offer-bookmarks-table.component';
|
||||
import { CLNLocalFailedTransactionsComponent } from './routing/local-failed-transactions/local-failed-transactions.component';
|
||||
import { CLNLiquidityAdsListComponent } from './liquidity-ads/liquidity-ads-list/liquidity-ads-list.component';
|
||||
import { LNServicesComponent } from './ln-services/ln-services.component';
|
||||
import { PeerswapComponent } from './ln-services/peerswap/peerswap.component';
|
||||
import { SwapPeersComponent } from './ln-services/peerswap/swap-peers/swap-peers.component';
|
||||
import { PeerswapsCancelledComponent } from './ln-services/peerswap/swaps-cancelled/swaps-cancelled.component';
|
||||
import { PeerswapsInComponent } from './ln-services/peerswap/swaps-in/swaps-in.component';
|
||||
import { PeerswapsOutComponent } from './ln-services/peerswap/swaps-out/swaps-out.component';
|
||||
|
||||
export const ClnRoutes: Routes = [
|
||||
{
|
||||
@ -103,6 +109,19 @@ export const ClnRoutes: Routes = [
|
||||
{ path: 'queryroutes', component: CLNQueryRoutesComponent, canActivate: [CLNUnlockedGuard] }
|
||||
]
|
||||
},
|
||||
{
|
||||
path: 'services', component: LNServicesComponent, canActivate: [CLNUnlockedGuard], children: [
|
||||
{
|
||||
path: 'peerswap', component: PeerswapComponent, canActivate: [CLNUnlockedGuard], children: [
|
||||
{ path: '', pathMatch: 'full', redirectTo: 'peers' },
|
||||
{ path: 'peers', component: SwapPeersComponent, canActivate: [CLNUnlockedGuard] },
|
||||
{ path: 'psout', component: PeerswapsOutComponent, canActivate: [CLNUnlockedGuard] },
|
||||
{ path: 'psin', component: PeerswapsInComponent, canActivate: [CLNUnlockedGuard] },
|
||||
{ path: 'pscancelled', component: PeerswapsCancelledComponent, canActivate: [CLNUnlockedGuard] }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{ path: 'rates', component: CLNNetworkInfoComponent, canActivate: [CLNUnlockedGuard] },
|
||||
{ path: '**', component: NotFoundComponent },
|
||||
{ path: 'network', redirectTo: 'rates' },
|
||||
|
@ -97,7 +97,7 @@ export class CLNLiquidityAdsListComponent implements OnInit, OnDestroy {
|
||||
return acc;
|
||||
}, a)));
|
||||
});
|
||||
this.liquidityNodesData = (<LookupNode[]>nodeListRes).filter(node => node.nodeid !== this.information.id);
|
||||
this.liquidityNodesData = (<LookupNode[]>nodeListRes).filter((node) => node.nodeid !== this.information.id);
|
||||
this.onCalculateOpeningFee();
|
||||
this.loadLiqNodesTable(this.liquidityNodesData);
|
||||
}, error: (err) => {
|
||||
@ -132,12 +132,12 @@ export class CLNLiquidityAdsListComponent implements OnInit, OnDestroy {
|
||||
this.liquidityNodes.paginator = this.paginator;
|
||||
if (this.sort) { this.sort.sort({ id: 'channelOpeningFee', start: 'asc', disableClear: true }); }
|
||||
this.liquidityNodes.filterPredicate = (node: LookupNode, fltr: string) => {
|
||||
const newNode = ((node.alias) ? node.alias.toLocaleLowerCase() : '') + (node.channelOpeningFee ? node.channelOpeningFee + ' Sats' : '')
|
||||
+ (node.option_will_fund?.lease_fee_base_msat ? (node.option_will_fund?.lease_fee_base_msat/1000) + ' Sats' : '') + (node.option_will_fund?.lease_fee_basis ? (this.decimalPipe.transform(node.option_will_fund?.lease_fee_basis/100, '1.2-2') + '%') : '')
|
||||
+ (node.option_will_fund?.channel_fee_max_base_msat ? (node.option_will_fund?.channel_fee_max_base_msat/1000) + ' Sats' : '') + (node.option_will_fund?.channel_fee_max_proportional_thousandths ? (node.option_will_fund?.channel_fee_max_proportional_thousandths*1000) + ' ppm' : '')
|
||||
+ (node.address_types ? node.address_types.reduce((acc, curr) => acc + (curr === 'tor' ? ' tor' : curr === 'ipv' ? ' clearnet' : (' ' + curr.toLowerCase())), '') : '');
|
||||
const newNode = ((node.alias) ? node.alias.toLocaleLowerCase() : '') + (node.channelOpeningFee ? node.channelOpeningFee + ' Sats' : '') +
|
||||
(node.option_will_fund?.lease_fee_base_msat ? (node.option_will_fund?.lease_fee_base_msat / 1000) + ' Sats' : '') + (node.option_will_fund?.lease_fee_basis ? (this.decimalPipe.transform(node.option_will_fund?.lease_fee_basis / 100, '1.2-2') + '%') : '') +
|
||||
(node.option_will_fund?.channel_fee_max_base_msat ? (node.option_will_fund?.channel_fee_max_base_msat / 1000) + ' Sats' : '') + (node.option_will_fund?.channel_fee_max_proportional_thousandths ? (node.option_will_fund?.channel_fee_max_proportional_thousandths * 1000) + ' ppm' : '') +
|
||||
(node.address_types ? node.address_types.reduce((acc, curr) => acc + (curr === 'tor' ? ' tor' : curr === 'ipv' ? ' clearnet' : (' ' + curr.toLowerCase())), '') : '');
|
||||
return newNode.includes(fltr);
|
||||
}
|
||||
};
|
||||
this.applyFilter();
|
||||
// this.liquidityNodes.filterPredicate = (node: LookupNode, fltr: string) => node.channelCount >= this.channelCount && node.nodeCapacity >= this.nodeCapacity;
|
||||
// this.onFilter();
|
||||
|
@ -2,11 +2,11 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
|
||||
import { RootReducer } from '../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../eclair/store/ecl.reducers';
|
||||
import { SharedModule } from '../../shared.module';
|
||||
import { RootReducer } from '../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../eclair/store/ecl.reducers';
|
||||
import { SharedModule } from '../../shared/shared.module';
|
||||
import { LNServicesComponent } from './ln-services.component';
|
||||
|
||||
describe('LNServicesComponent', () => {
|
12
src/app/cln/ln-services/ln-services.component.ts
Executable file
12
src/app/cln/ln-services/ln-services.component.ts
Executable file
@ -0,0 +1,12 @@
|
||||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-ln-services',
|
||||
templateUrl: './ln-services.component.html',
|
||||
styleUrls: ['./ln-services.component.scss']
|
||||
})
|
||||
export class LNServicesComponent {
|
||||
|
||||
constructor() {}
|
||||
|
||||
}
|
@ -2,18 +2,18 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
|
||||
import { RootReducer } from '../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../eclair/store/ecl.reducers';
|
||||
import { LoopService } from '../../../services/loop.service';
|
||||
import { RootReducer } from '../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../eclair/store/ecl.reducers';
|
||||
import { LoopService } from '../../../shared/services/loop.service';
|
||||
|
||||
import { PeerswapComponent } from './peerswap.component';
|
||||
import { SharedModule } from '../../../shared.module';
|
||||
import { mockDataService } from '../../../test-helpers/mock-services';
|
||||
import { CommonService } from '../../../services/common.service';
|
||||
import { SharedModule } from '../../../shared/shared.module';
|
||||
import { mockDataService } from '../../../shared/test-helpers/mock-services';
|
||||
import { CommonService } from '../../../shared/services/common.service';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { DataService } from '../../../services/data.service';
|
||||
import { DataService } from '../../../shared/services/data.service';
|
||||
|
||||
describe('PeerswapComponent', () => {
|
||||
let component: PeerswapComponent;
|
@ -13,7 +13,7 @@ import { faHandshake } from '@fortawesome/free-solid-svg-icons';
|
||||
export class PeerswapComponent implements OnInit, OnDestroy {
|
||||
|
||||
public faHandshake = faHandshake;
|
||||
public links = [{ link: 'peers', name: 'Peers' }, { link: 'psout', name: 'Peerswap Out' }, { link: 'psin', name: 'Peerswap In' }, { link: 'pscancelled', name: 'Cancelled Peerswaps' }];
|
||||
public links = [{ link: 'peers', name: 'Peers' }, { link: 'psout', name: 'Swap Out' }, { link: 'psin', name: 'Swap In' }, { link: 'pscancelled', name: 'Swap Cancelled' }];
|
||||
public activeTab = this.links[0];
|
||||
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
|
||||
|
86
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.html
Executable file
86
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.html
Executable file
@ -0,0 +1,86 @@
|
||||
<div fxLayout="column" fxLayoutAlign="start stretch" class="padding-gap-x">
|
||||
<div class="p-2 error-border my-2" *ngIf="errorMessage !== ''">{{errorMessage}}</div>
|
||||
<div *ngIf="errorMessage === ''" fxLayout.gt-xs="column" fxLayout="row" fxLayoutAlign="start center" fxLayoutAlign.gt-xs="start stretch" class="page-sub-title-container">
|
||||
<div fxFlex="100">
|
||||
<div fxFlex="70"></div>
|
||||
<mat-form-field fxFlex="30">
|
||||
<input matInput (keyup)="applyFilter()" [(ngModel)]="selFilter" placeholder="Filter">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="errorMessage === ''" [perfectScrollbar] fxLayout="column" fxLayoutAlign="start center" fxFlex="100" class="table-container">
|
||||
<mat-progress-bar *ngIf="apiCallStatus?.status === apiCallStatusEnum.INITIATED" mode="indeterminate"></mat-progress-bar>
|
||||
<table mat-table #table [dataSource]="swapPeers" fxFlex="100" matSort class="overflow-auto">
|
||||
<ng-container matColumnDef="short_channel_id">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header>Short Channel ID</th>
|
||||
<td mat-cell *matCellDef="let sPeer">{{sPeer?.short_channel_id}}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="alias">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header>Node Alias</th>
|
||||
<td mat-cell *matCellDef="let sPeer">{{sPeer?.alias}}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="nodeid">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header>Node ID</th>
|
||||
<td mat-cell *matCellDef="let sPeer">
|
||||
<span fxLayout="row" class="ellipsis-parent" [ngStyle]="{'max-width': (screenSize === screenSizeEnum.XS) ? '10rem' : '25rem'}">
|
||||
<span class="ellipsis-child">{{sPeer?.nodeid}}</span>
|
||||
</span>
|
||||
</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="swaps_allowed">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header>Swaps Allowed</th>
|
||||
<td mat-cell *matCellDef="let sPeer">{{sPeer?.swaps_allowed ? 'Allowed' : 'Denied'}}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="local_balance">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before">Local Balance (Sats)</th>
|
||||
<td mat-cell *matCellDef="let sPeer"><span fxLayoutAlign="end center">{{sPeer?.local_balance | number }}</span>
|
||||
</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="remote_balance">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header arrowPosition="before">Remote Balance (Sats)</th>
|
||||
<td mat-cell *matCellDef="let sPeer"><span fxLayoutAlign="end center">{{sPeer?.remote_balance | number }}</span>
|
||||
</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="actions">
|
||||
<th mat-header-cell *matHeaderCellDef class="px-3">
|
||||
<div class="bordered-box table-actions-select">
|
||||
<mat-select placeholder="Actions" tabindex="1" class="mr-0">
|
||||
<mat-select-trigger></mat-select-trigger>
|
||||
<mat-option (click)="onDownloadCSV()">Download CSV</mat-option>
|
||||
</mat-select>
|
||||
</div>
|
||||
</th>
|
||||
<td mat-cell *matCellDef="let sPeer" [ngClass]="{'px-3': screenSize !== screenSizeEnum.XS}" fxLayoutAlign="end center">
|
||||
<div class="bordered-box table-actions-select" fxLayoutAlign="center center">
|
||||
<mat-select placeholder="Actions" tabindex="2" class="mr-0">
|
||||
<mat-select-trigger></mat-select-trigger>
|
||||
<mat-option (click)="onSwapPeerClick(sPeer)">View Info</mat-option>
|
||||
<mat-option (click)="onSwapOut(sPeer)">Swap Out</mat-option>
|
||||
<mat-option (click)="onSwapIn(sPeer)">Swap In</mat-option>
|
||||
</mat-select>
|
||||
</div>
|
||||
</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="no_swap_peer">
|
||||
<td mat-footer-cell *matFooterCellDef colspan="4">
|
||||
<p
|
||||
*ngIf="(!swapPeers?.data || swapPeers?.data?.length<1) && apiCallStatus?.status === apiCallStatusEnum.COMPLETED">
|
||||
No peer available for swap.</p>
|
||||
<p
|
||||
*ngIf="(!swapPeers?.data || swapPeers?.data?.length<1) && apiCallStatus?.status === apiCallStatusEnum.INITIATED">
|
||||
Getting peers for swap...</p>
|
||||
<p
|
||||
*ngIf="(!swapPeers?.data || swapPeers?.data?.length<1) && apiCallStatus?.status === apiCallStatusEnum.ERROR">
|
||||
{{errorMessage}}</p>
|
||||
</td>
|
||||
</ng-container>
|
||||
<tr mat-footer-row *matFooterRowDef="['no_swap_peer']"
|
||||
[ngClass]="{'display-none': swapPeers?.data && swapPeers?.data?.length>0}">
|
||||
</tr>
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: flgSticky;"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
|
||||
</table>
|
||||
</div>
|
||||
<mat-paginator *ngIf="errorMessage === ''" [pageSize]="pageSize" [pageSizeOptions]="pageSizeOptions"
|
||||
[showFirstLastButtons]="screenSize === screenSizeEnum.XS ? false : true" class="mb-1"></mat-paginator>
|
||||
</div>
|
11
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.scss
Executable file
11
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.scss
Executable file
@ -0,0 +1,11 @@
|
||||
.mat-column-nodeid {
|
||||
flex: 0 0 20%;
|
||||
width: 20%;
|
||||
& .ellipsis-parent {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
.mat-column-actions {
|
||||
min-height: 4.8rem;
|
||||
}
|
60
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.spec.ts
Executable file
60
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.spec.ts
Executable file
@ -0,0 +1,60 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
import { EffectsModule } from '@ngrx/effects';
|
||||
|
||||
import { RootReducer } from '../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../eclair/store/ecl.reducers';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { mockCLEffects, mockDataService, mockLoggerService, mockECLEffects, mockLNDEffects, mockMatDialogRef, mockRTLEffects } from '../../../../shared/test-helpers/mock-services';
|
||||
import { RTLEffects } from '../../../../store/rtl.effects';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { DataService } from '../../../../shared/services/data.service';
|
||||
import { SwapPeersComponent } from './swap-peers.component';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
|
||||
describe('SwapPeersComponent', () => {
|
||||
let component: SwapPeersComponent;
|
||||
let fixture: ComponentFixture<SwapPeersComponent>;
|
||||
|
||||
beforeEach(waitForAsync(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [SwapPeersComponent],
|
||||
imports: [
|
||||
BrowserAnimationsModule,
|
||||
RouterTestingModule,
|
||||
SharedModule,
|
||||
StoreModule.forRoot({ root: RootReducer, lnd: LNDReducer, cln: CLNReducer, ecl: ECLReducer }),
|
||||
EffectsModule.forRoot([mockRTLEffects, mockLNDEffects, mockCLEffects, mockECLEffects])
|
||||
],
|
||||
providers: [
|
||||
CommonService,
|
||||
{ provide: LoggerService, useClass: mockLoggerService },
|
||||
{ provide: DataService, useClass: mockDataService },
|
||||
{ provide: MatDialogRef, useClass: mockMatDialogRef },
|
||||
{ provide: MAT_DIALOG_DATA, useValue: { sweepAll: true } },
|
||||
{ provide: RTLEffects, useClass: mockRTLEffects }
|
||||
]
|
||||
}).
|
||||
compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(SwapPeersComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
TestBed.resetTestingModule();
|
||||
});
|
||||
});
|
145
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.ts
Executable file
145
src/app/cln/ln-services/peerswap/swap-peers/swap-peers.component.ts
Executable file
@ -0,0 +1,145 @@
|
||||
import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { DatePipe } from '@angular/common';
|
||||
import { Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
import { Store } from '@ngrx/store';
|
||||
import { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';
|
||||
import { MatSort } from '@angular/material/sort';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
|
||||
import { SwapPeerChannelsFlattened } from '../../../../shared/models/clnModels';
|
||||
import { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, ScreenSizeEnum, APICallStatusEnum } from '../../../../shared/services/consts-enums-functions';
|
||||
import { ApiCallStatusPayload } from '../../../../shared/models/apiCallsPayload';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
|
||||
import { RTLState } from '../../../../store/rtl.state';
|
||||
import { openAlert } from '../../../../store/rtl.actions';
|
||||
import { fetchSwapPeers } from '../../../store/cln.actions';
|
||||
import { swapPeers } from '../../../store/cln.selector';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-peerswap-peers',
|
||||
templateUrl: './swap-peers.component.html',
|
||||
styleUrls: ['./swap-peers.component.scss'],
|
||||
providers: [
|
||||
{ provide: MatPaginatorIntl, useValue: getPaginatorLabel('Peers') }
|
||||
]
|
||||
})
|
||||
export class SwapPeersComponent implements OnInit, OnDestroy {
|
||||
|
||||
@ViewChild(MatSort, { static: false }) sort: MatSort | undefined;
|
||||
@ViewChild(MatPaginator, { static: false }) paginator: MatPaginator | undefined;
|
||||
public displayedColumns: any[] = [];
|
||||
public peersData: SwapPeerChannelsFlattened[] = [];
|
||||
public swapPeers: any;
|
||||
public flgSticky = false;
|
||||
public pageSize = PAGE_SIZE;
|
||||
public pageSizeOptions = PAGE_SIZE_OPTIONS;
|
||||
public screenSize = '';
|
||||
public screenSizeEnum = ScreenSizeEnum;
|
||||
public errorMessage = '';
|
||||
public selFilter = '';
|
||||
public apiCallStatus: ApiCallStatusPayload | null = null;
|
||||
public apiCallStatusEnum = APICallStatusEnum;
|
||||
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
|
||||
|
||||
constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<RTLState>, private datePipe: DatePipe, private router: Router) {
|
||||
this.screenSize = this.commonService.getScreenSize();
|
||||
if (this.screenSize === ScreenSizeEnum.XS) {
|
||||
this.flgSticky = false;
|
||||
this.displayedColumns = ['alias', 'short_channel_id', 'actions'];
|
||||
} else if (this.screenSize === ScreenSizeEnum.SM) {
|
||||
this.flgSticky = false;
|
||||
this.displayedColumns = ['short_channel_id', 'alias', 'swaps_allowed', 'local_balance', 'remote_balance', 'actions'];
|
||||
} else if (this.screenSize === ScreenSizeEnum.MD) {
|
||||
this.flgSticky = false;
|
||||
this.displayedColumns = ['short_channel_id', 'alias', 'swaps_allowed', 'local_balance', 'remote_balance', 'actions'];
|
||||
} else {
|
||||
this.flgSticky = true;
|
||||
this.displayedColumns = ['short_channel_id', 'alias', 'nodeid', 'swaps_allowed', 'local_balance', 'remote_balance', 'actions'];
|
||||
}
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
|
||||
this.router.onSameUrlNavigation = 'reload';
|
||||
this.store.dispatch(fetchSwapPeers());
|
||||
this.store.select(swapPeers).pipe(takeUntil(this.unSubs[0])).
|
||||
subscribe((spSeletor: { swapPeers: SwapPeerChannelsFlattened[], apiCallStatus: ApiCallStatusPayload }) => {
|
||||
this.errorMessage = '';
|
||||
this.apiCallStatus = spSeletor.apiCallStatus;
|
||||
if (this.apiCallStatus.status === APICallStatusEnum.ERROR) {
|
||||
this.errorMessage = !this.apiCallStatus.message ? '' : (typeof (this.apiCallStatus.message) === 'object') ? JSON.stringify(this.apiCallStatus.message) : this.apiCallStatus.message;
|
||||
}
|
||||
this.peersData = spSeletor.swapPeers || [];
|
||||
if (this.peersData.length > 0 && this.sort && this.paginator) {
|
||||
this.loadSwapPeersTable(this.peersData);
|
||||
}
|
||||
this.logger.info(spSeletor);
|
||||
});
|
||||
}
|
||||
|
||||
onSwapPeerClick(selSPeer: SwapPeerChannelsFlattened) {
|
||||
this.logger.warn(selSPeer);
|
||||
// nodeid, alias, swaps_allowed, supported_assets[], total_fee_paid
|
||||
// channels: {short_channel_id, local_balance, remote_balance, local_percentage, state}[]
|
||||
// sent: {total_swaps_out, total_swaps_in, total_sats_swapped_out, total_sats_swapped_in}
|
||||
// received: {total_swaps_out, total_swaps_in, total_sats_swapped_out, total_sats_swapped_in}
|
||||
this.store.dispatch(openAlert({
|
||||
payload: {
|
||||
data: {
|
||||
// invoice: reCreatedInvoice,
|
||||
// newlyAdded: false,
|
||||
// component: CLNInvoiceInformationComponent
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
onSwapOut(sPeer) {
|
||||
this.logger.warn('Swap Out');
|
||||
}
|
||||
|
||||
onSwapIn(sPeer) {
|
||||
this.logger.warn('Swap In');
|
||||
}
|
||||
|
||||
loadSwapPeersTable(swapPeers: SwapPeerChannelsFlattened[]) {
|
||||
this.swapPeers = new MatTableDataSource<SwapPeerChannelsFlattened>([...swapPeers]);
|
||||
this.swapPeers.sort = this.sort;
|
||||
this.swapPeers.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);
|
||||
this.swapPeers.filterPredicate = (sPeer: SwapPeerChannelsFlattened, fltr: string) => {
|
||||
const newSPeer =
|
||||
(sPeer.nodeid ? sPeer.nodeid : '') +
|
||||
(sPeer.alias ? sPeer.alias.toLowerCase() : '') +
|
||||
(sPeer.swaps_allowed ? 'allowed' : 'denied') +
|
||||
(sPeer.short_channel_id ? sPeer.short_channel_id : '') +
|
||||
(sPeer.local_balance ? sPeer.local_balance : '') +
|
||||
(sPeer.remote_balance ? sPeer.remote_balance : '');
|
||||
return newSPeer?.includes(fltr) || false;
|
||||
};
|
||||
this.swapPeers.paginator = this.paginator;
|
||||
this.applyFilter();
|
||||
this.logger.info(this.swapPeers);
|
||||
}
|
||||
|
||||
onDownloadCSV() {
|
||||
if (this.swapPeers && this.swapPeers.data && this.swapPeers.data.length > 0) {
|
||||
this.commonService.downloadFile(this.swapPeers.data, 'Swap Peers');
|
||||
}
|
||||
}
|
||||
|
||||
applyFilter() {
|
||||
this.swapPeers.filter = this.selFilter.trim().toLowerCase();
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.unSubs.forEach((completeSub) => {
|
||||
completeSub.next(<any>null);
|
||||
completeSub.complete();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +1,9 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { PeerswapsCancelledComponent } from './swaps-cancelled.component';
|
||||
import { mockLoggerService } from '../../../../shared/test-helpers/mock-services';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
|
||||
describe('PeerswapsCancelledComponent', () => {
|
||||
let component: PeerswapsCancelledComponent;
|
||||
@ -14,7 +16,9 @@ describe('PeerswapsCancelledComponent', () => {
|
||||
BrowserAnimationsModule,
|
||||
SharedModule
|
||||
],
|
||||
providers: []
|
||||
providers: [
|
||||
{ provide: LoggerService, useClass: mockLoggerService }
|
||||
]
|
||||
}).
|
||||
compileComponents();
|
||||
}));
|
@ -1,5 +1,6 @@
|
||||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
import { Subject } from 'rxjs';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-peerswap-cancelled',
|
||||
@ -10,9 +11,10 @@ export class PeerswapsCancelledComponent implements OnInit, OnDestroy {
|
||||
|
||||
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
|
||||
|
||||
constructor() {}
|
||||
constructor(private logger: LoggerService) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.logger.info('Peerswap Out');
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
@ -1,7 +1,9 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { PeerswapsInComponent } from './swaps-in.component';
|
||||
import { mockLoggerService } from '../../../../shared/test-helpers/mock-services';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
|
||||
describe('PeerswapsInComponent', () => {
|
||||
let component: PeerswapsInComponent;
|
||||
@ -14,7 +16,9 @@ describe('PeerswapsInComponent', () => {
|
||||
BrowserAnimationsModule,
|
||||
SharedModule
|
||||
],
|
||||
providers: []
|
||||
providers: [
|
||||
{ provide: LoggerService, useClass: mockLoggerService }
|
||||
]
|
||||
}).
|
||||
compileComponents();
|
||||
}));
|
@ -1,18 +1,20 @@
|
||||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
import { Subject } from 'rxjs';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-peer-swaps-in',
|
||||
templateUrl: './swaps-in.component.html',
|
||||
styleUrls: ['./swaps-in.component.scss'],
|
||||
styleUrls: ['./swaps-in.component.scss']
|
||||
})
|
||||
export class PeerswapsInComponent implements OnInit, OnDestroy {
|
||||
|
||||
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
|
||||
|
||||
constructor() {}
|
||||
constructor(private logger: LoggerService) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.logger.info('Peerswap Out');
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
@ -1,7 +1,9 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { PeerswapsOutComponent } from './swaps-out.component';
|
||||
import { mockLoggerService } from '../../../../shared/test-helpers/mock-services';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
|
||||
describe('PeerswapsOutComponent', () => {
|
||||
let component: PeerswapsOutComponent;
|
||||
@ -14,7 +16,9 @@ describe('PeerswapsOutComponent', () => {
|
||||
BrowserAnimationsModule,
|
||||
SharedModule
|
||||
],
|
||||
providers: []
|
||||
providers: [
|
||||
{ provide: LoggerService, useClass: mockLoggerService }
|
||||
]
|
||||
}).
|
||||
compileComponents();
|
||||
}));
|
@ -1,18 +1,20 @@
|
||||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
import { Subject } from 'rxjs';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-peer-swaps-out',
|
||||
templateUrl: './swaps-out.component.html',
|
||||
styleUrls: ['./swaps-out.component.scss'],
|
||||
styleUrls: ['./swaps-out.component.scss']
|
||||
})
|
||||
export class PeerswapsOutComponent implements OnInit, OnDestroy {
|
||||
|
||||
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
|
||||
|
||||
constructor() {}
|
||||
constructor(private logger: LoggerService) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.logger.info('Peerswap Out');
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
@ -50,7 +50,7 @@ export class CLNOnChainComponent implements OnInit, OnDestroy {
|
||||
});
|
||||
this.store.select(balance).pipe(takeUntil(this.unSubs[2])).
|
||||
subscribe((balanceSeletor: { balance: Balance, apiCallStatus: ApiCallStatusPayload }) => {
|
||||
this.balances = [{ title: 'Total Balance', dataValue: balanceSeletor.balance.totalBalance || 0 }, { title: 'Confirmed', dataValue: (balanceSeletor.balance.confBalance || 0)}, { title: 'Unconfirmed', dataValue: (balanceSeletor.balance.unconfBalance || 0) }];
|
||||
this.balances = [{ title: 'Total Balance', dataValue: balanceSeletor.balance.totalBalance || 0 }, { title: 'Confirmed', dataValue: (balanceSeletor.balance.confBalance || 0) }, { title: 'Unconfirmed', dataValue: (balanceSeletor.balance.unconfBalance || 0) }];
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,7 @@ export class CLNOpenChannelComponent implements OnInit, OnDestroy {
|
||||
this.totalBalance = 0;
|
||||
this.utxos = [];
|
||||
this.peer = null;
|
||||
this.peers = [];
|
||||
this.peers = [];
|
||||
}
|
||||
this.alertTitle = this.data.alertTitle || 'Alert';
|
||||
this.actions.pipe(
|
||||
|
@ -117,7 +117,7 @@ export class CLNFailedTransactionsComponent implements OnInit, AfterViewInit, On
|
||||
this.failedForwardingEvents.sort = this.sort;
|
||||
this.failedForwardingEvents.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);
|
||||
this.failedForwardingEvents.filterPredicate = (event: ForwardingEvent, fltr: string) => {
|
||||
const newEvent =
|
||||
const newEvent =
|
||||
(event.received_time ? this.datePipe.transform(new Date(event.received_time * 1000), 'dd/MMM/YYYY HH:mm')!.toLowerCase() : '') +
|
||||
(event.resolved_time ? this.datePipe.transform(new Date(event.resolved_time * 1000), 'dd/MMM/YYYY HH:mm')?.toLowerCase() : '') +
|
||||
(event.payment_hash ? event.payment_hash.toLowerCase() : '') +
|
||||
|
@ -145,7 +145,7 @@ export class CLNForwardingHistoryComponent implements OnInit, OnChanges, AfterVi
|
||||
return newEvent.includes(fltr);
|
||||
};
|
||||
this.forwardingHistoryEvents.paginator = this.paginator;
|
||||
this.applyFilter();
|
||||
this.applyFilter();
|
||||
this.logger.info(this.forwardingHistoryEvents);
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ import { createAction, props } from '@ngrx/store';
|
||||
import { CLNActions } from '../../shared/services/consts-enums-functions';
|
||||
import { ApiCallStatusPayload } from '../../shared/models/apiCallsPayload';
|
||||
import { SelNodeChild } from '../../shared/models/RTLconfig';
|
||||
import { GetInfo, Fees, Peer, Payment, QueryRoutes, Channel, FeeRates, Invoice, ListInvoices, OnChain, UTXO, SaveChannel, GetNewAddress, DetachPeer, UpdateChannel, CloseChannel, SendPayment, GetQueryRoutes, ChannelLookup, OfferInvoice, Offer, OfferBookmark, ListForwards, FetchListForwards, LocalFailedEvent, ForwardingEvent } from '../../shared/models/clnModels';
|
||||
import { GetInfo, Fees, Peer, Payment, QueryRoutes, Channel, FeeRates, Invoice, ListInvoices, OnChain, UTXO, SaveChannel, GetNewAddress, DetachPeer, UpdateChannel, CloseChannel, SendPayment, GetQueryRoutes, ChannelLookup, OfferInvoice, Offer, OfferBookmark, ListForwards, FetchListForwards, LocalFailedEvent, ForwardingEvent, Swap, SwapPeer, SwapRequest } from '../../shared/models/clnModels';
|
||||
|
||||
export const updateCLAPICallStatus = createAction(CLNActions.UPDATE_API_CALL_STATUS_CLN, props<{ payload: ApiCallStatusPayload }>());
|
||||
|
||||
@ -130,3 +130,15 @@ export const addUpdateOfferBookmark = createAction(CLNActions.ADD_UPDATE_OFFER_B
|
||||
export const deleteOfferBookmark = createAction(CLNActions.DELETE_OFFER_BOOKMARK_CLN, props<{ payload: { bolt12: string } }>());
|
||||
|
||||
export const removeOfferBookmark = createAction(CLNActions.REMOVE_OFFER_BOOKMARK_CLN, props<{ payload: { bolt12: string } }>());
|
||||
|
||||
export const fetchSwaps = createAction(CLNActions.FETCH_SWAPS_CLN);
|
||||
|
||||
export const setSwaps = createAction(CLNActions.SET_SWAPS_CLN, props<{ payload: Swap[] }>());
|
||||
|
||||
export const fetchSwapPeers = createAction(CLNActions.FETCH_SWAP_PEERS_CLN);
|
||||
|
||||
export const setSwapPeers = createAction(CLNActions.SET_SWAP_PEERS_CLN, props<{ payload: SwapPeer[] }>());
|
||||
|
||||
export const fetchSwapRequests = createAction(CLNActions.FETCH_SWAP_REQUESTS_CLN);
|
||||
|
||||
export const setSwapRequests = createAction(CLNActions.SET_SWAP_REQUESTS_CLN, props<{ payload: SwapRequest[] }>());
|
||||
|
@ -934,6 +934,63 @@ export class CLNEffects implements OnDestroy {
|
||||
})
|
||||
));
|
||||
|
||||
swapsFetchCL = createEffect(() => this.actions.pipe(
|
||||
ofType(CLNActions.FETCH_SWAPS_CLN),
|
||||
mergeMap((action: { type: string, payload: any }) => {
|
||||
this.store.dispatch(updateCLAPICallStatus({ payload: { action: 'FetchSwaps', status: APICallStatusEnum.INITIATED } }));
|
||||
return this.httpClient.get(this.CHILD_API_URL + environment.PEERSWAP_API + '/listSwaps').
|
||||
pipe(map((res: any) => {
|
||||
this.logger.info(res);
|
||||
this.store.dispatch(updateCLAPICallStatus({ payload: { action: 'FetchSwaps', status: APICallStatusEnum.COMPLETED } }));
|
||||
return {
|
||||
type: CLNActions.SET_SWAPS_CLN,
|
||||
payload: res || []
|
||||
};
|
||||
}), catchError((err: any) => {
|
||||
this.handleErrorWithoutAlert('FetchSwaps', UI_MESSAGES.NO_SPINNER, 'Fetching Swaps Failed.', err);
|
||||
return of({ type: RTLActions.VOID });
|
||||
}));
|
||||
})
|
||||
));
|
||||
|
||||
swapPeersFetchCL = createEffect(() => this.actions.pipe(
|
||||
ofType(CLNActions.FETCH_SWAP_PEERS_CLN),
|
||||
mergeMap((action: { type: string, payload: any }) => {
|
||||
this.store.dispatch(updateCLAPICallStatus({ payload: { action: 'FetchSwapPeers', status: APICallStatusEnum.INITIATED } }));
|
||||
return this.httpClient.get(this.CHILD_API_URL + environment.PEERSWAP_API + '/listSwapPeers').
|
||||
pipe(map((res: any) => {
|
||||
this.logger.info(res);
|
||||
this.store.dispatch(updateCLAPICallStatus({ payload: { action: 'FetchSwapPeers', status: APICallStatusEnum.COMPLETED } }));
|
||||
return {
|
||||
type: CLNActions.SET_SWAP_PEERS_CLN,
|
||||
payload: res || []
|
||||
};
|
||||
}), catchError((err: any) => {
|
||||
this.handleErrorWithoutAlert('FetchSwaps', UI_MESSAGES.NO_SPINNER, 'Fetching Swap Peers Failed.', err);
|
||||
return of({ type: RTLActions.VOID });
|
||||
}));
|
||||
})
|
||||
));
|
||||
|
||||
swapRequestsFetchCL = createEffect(() => this.actions.pipe(
|
||||
ofType(CLNActions.FETCH_SWAP_REQUESTS_CLN),
|
||||
mergeMap((action: { type: string, payload: any }) => {
|
||||
this.store.dispatch(updateCLAPICallStatus({ payload: { action: 'FetchSwapRequests', status: APICallStatusEnum.INITIATED } }));
|
||||
return this.httpClient.get(this.CHILD_API_URL + environment.PEERSWAP_API + '/listSwapRequests').
|
||||
pipe(map((res: any) => {
|
||||
this.logger.info(res);
|
||||
this.store.dispatch(updateCLAPICallStatus({ payload: { action: 'FetchSwapRequests', status: APICallStatusEnum.COMPLETED } }));
|
||||
return {
|
||||
type: CLNActions.SET_SWAP_REQUESTS_CLN,
|
||||
payload: res || []
|
||||
};
|
||||
}), catchError((err: any) => {
|
||||
this.handleErrorWithoutAlert('FetchSwaps', UI_MESSAGES.NO_SPINNER, 'Fetching Swap Requests Failed.', err);
|
||||
return of({ type: RTLActions.VOID });
|
||||
}));
|
||||
})
|
||||
));
|
||||
|
||||
initializeRemainingData(info: any, landingPage: string) {
|
||||
this.sessionService.setItem('clUnlocked', 'true');
|
||||
const node_data = {
|
||||
|
@ -4,9 +4,10 @@ import {
|
||||
addInvoice, addPeer, removeChannel, removePeer, resetCLStore, setBalance, setChannels,
|
||||
setChildNodeSettingsCL, setFeeRates, setFees, setForwardingHistory,
|
||||
setInfo, setInvoices, setLocalRemoteBalance, setOffers, addOffer, setPayments, setPeers, setUTXOs,
|
||||
updateCLAPICallStatus, updateInvoice, updateOffer, setOfferBookmarks, addUpdateOfferBookmark, removeOfferBookmark
|
||||
updateCLAPICallStatus, updateInvoice, updateOffer, setOfferBookmarks, addUpdateOfferBookmark, removeOfferBookmark,
|
||||
setSwaps, setSwapPeers, setSwapRequests
|
||||
} from './cln.actions';
|
||||
import { Channel, OfferBookmark } from '../../shared/models/clnModels';
|
||||
import { Channel, OfferBookmark, SwapPeerChannelsFlattened } from '../../shared/models/clnModels';
|
||||
import { CLNForwardingEventsStatusEnum } from '../../shared/services/consts-enums-functions';
|
||||
|
||||
export const CLNReducer = createReducer(initCLNState,
|
||||
@ -19,7 +20,7 @@ export const CLNReducer = createReducer(initCLNState,
|
||||
message: payload.message,
|
||||
URL: payload.URL,
|
||||
filePath: payload.filePath
|
||||
};
|
||||
};
|
||||
}
|
||||
return {
|
||||
...state,
|
||||
@ -216,6 +217,26 @@ export const CLNReducer = createReducer(initCLNState,
|
||||
...state,
|
||||
offersBookmarks: modifiedOfferBookmarks
|
||||
};
|
||||
}),
|
||||
on(setSwaps, (state, { payload }) => ({
|
||||
...state,
|
||||
swaps: payload
|
||||
})),
|
||||
on(setSwapRequests, (state, { payload }) => ({
|
||||
...state,
|
||||
swapRequests: payload
|
||||
})),
|
||||
on(setSwapPeers, (state, { payload }) => {
|
||||
const flattenedSwapPeers = payload.reduce((acc, swapPeer) => {
|
||||
const peerWithFlatChannels: any[] = [];
|
||||
swapPeer.alias = state.peers?.find((peer) => peer.id === swapPeer.nodeid)?.alias || swapPeer.nodeid;
|
||||
swapPeer.channels?.forEach((channel) => peerWithFlatChannels.push({ ...swapPeer, ...channel }));
|
||||
return [...acc, ...peerWithFlatChannels];
|
||||
}, <any[]>[]);
|
||||
return {
|
||||
...state,
|
||||
swapPeers: flattenedSwapPeers
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
|
@ -27,3 +27,6 @@ export const nodeInfoAndNodeSettingsAndAPIsStatus = createSelector(clnState, (st
|
||||
export const offers = createSelector(clnState, (state: CLNState) => ({ offers: state.offers, apiCallStatus: state.apisCallStatus.FetchOffers }));
|
||||
export const offerBookmarks = createSelector(clnState, (state: CLNState) => ({ offersBookmarks: state.offersBookmarks, apiCallStatus: state.apisCallStatus.FetchOfferBookmarks }));
|
||||
export const getoffer = (bolt12Str) => createSelector(clnState, (state: CLNState) => (state.offers.find((offer: Offer) => offer.bolt12 === bolt12Str)));
|
||||
export const swaps = createSelector(clnState, (state: CLNState) => ({ swaps: state.swaps, apiCallStatus: state.apisCallStatus.FetchSwaps }));
|
||||
export const swapPeers = createSelector(clnState, (state: CLNState) => ({ swapPeers: state.swapPeers, apiCallStatus: state.apisCallStatus.FetchSwapPeers }));
|
||||
export const swapRequests = createSelector(clnState, (state: CLNState) => ({ swapRequests: state.swapRequests, apiCallStatus: state.apisCallStatus.FetchSwapRequests }));
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { SelNodeChild } from '../../shared/models/RTLconfig';
|
||||
import { APICallStatusEnum, UserPersonaEnum } from '../../shared/services/consts-enums-functions';
|
||||
import { GetInfo, Fees, Balance, LocalRemoteBalance, Peer, Payment, Channel, FeeRates, ListInvoices, UTXO, Offer, OfferBookmark, ListForwards } from '../../shared/models/clnModels';
|
||||
import { GetInfo, Fees, Balance, LocalRemoteBalance, Peer, Payment, Channel, FeeRates, ListInvoices, UTXO, Offer, OfferBookmark, ListForwards, SwapPeerChannelsFlattened, SwapRequest, Swap } from '../../shared/models/clnModels';
|
||||
import { ApiCallsListCL } from '../../shared/models/apiCallsPayload';
|
||||
|
||||
export interface CLNState {
|
||||
@ -24,6 +24,9 @@ export interface CLNState {
|
||||
utxos: UTXO[];
|
||||
offers: Offer[];
|
||||
offersBookmarks: OfferBookmark[];
|
||||
swapPeers: SwapPeerChannelsFlattened[];
|
||||
swaps: Swap[];
|
||||
swapRequests: SwapRequest[];
|
||||
}
|
||||
|
||||
export const initCLNState: CLNState = {
|
||||
@ -43,7 +46,10 @@ export const initCLNState: CLNState = {
|
||||
FetchForwardingHistoryF: { status: APICallStatusEnum.UN_INITIATED },
|
||||
FetchForwardingHistoryL: { status: APICallStatusEnum.UN_INITIATED },
|
||||
FetchOffers: { status: APICallStatusEnum.UN_INITIATED },
|
||||
FetchOfferBookmarks: { status: APICallStatusEnum.UN_INITIATED }
|
||||
FetchOfferBookmarks: { status: APICallStatusEnum.UN_INITIATED },
|
||||
FetchSwaps: { status: APICallStatusEnum.UN_INITIATED },
|
||||
FetchSwapPeers: { status: APICallStatusEnum.UN_INITIATED },
|
||||
FetchSwapRequests: { status: APICallStatusEnum.UN_INITIATED }
|
||||
},
|
||||
nodeSettings: { userPersona: UserPersonaEnum.OPERATOR, selCurrencyUnit: 'USD', fiatConversion: false, channelBackupPath: '', currencyUnits: [], enableOffers: false, enablePeerswap: false },
|
||||
information: {},
|
||||
@ -63,5 +69,8 @@ export const initCLNState: CLNState = {
|
||||
invoices: { invoices: [] },
|
||||
utxos: [],
|
||||
offers: [],
|
||||
offersBookmarks: []
|
||||
offersBookmarks: [],
|
||||
swapPeers: [],
|
||||
swaps: [],
|
||||
swapRequests: []
|
||||
};
|
||||
|
@ -195,7 +195,7 @@ export class CLNLightningInvoicesTableComponent implements OnInit, AfterViewInit
|
||||
}
|
||||
|
||||
onInvoiceValueChange() {
|
||||
if (this.selNode.fiatConversion && this.invoiceValue! > 99) {
|
||||
if (this.selNode?.fiatConversion && this.invoiceValue! > 99) {
|
||||
this.invoiceValueHint = '';
|
||||
this.commonService.convertCurrency(this.invoiceValue!, CurrencyUnitEnum.SATS, CurrencyUnitEnum.OTHER, (this.selNode.currencyUnits && this.selNode.currencyUnits.length > 2 ? this.selNode.currencyUnits[2] : ''), this.selNode.fiatConversion).
|
||||
pipe(takeUntil(this.unSubs[5])).
|
||||
|
@ -106,7 +106,7 @@
|
||||
</span>
|
||||
<span *ngIf="payment.is_expanded">
|
||||
<span *ngFor="let mpp of payment?.mpps" fxLayoutAlign="start center" class="mpp-row-span">
|
||||
Part ID {{mpp.partid ? mpp.partid : 0}}
|
||||
Part ID {{mpp.id ? mpp.id : 0}}
|
||||
</span>
|
||||
</span>
|
||||
</td>
|
||||
@ -138,7 +138,7 @@
|
||||
</span>
|
||||
<div *ngIf="payment.is_expanded">
|
||||
<div *ngFor="let mpp of payment?.mpps; index as i" fxLayoutAlign="end center">
|
||||
<button mat-stroked-button class="btn-mpp-info" color="primary" type="button" tabindex="6" (click)="onPaymentClick(mpp)">View {{mpp.partid ? mpp.partid : 0}}</button>
|
||||
<button mat-stroked-button class="btn-mpp-info" color="primary" type="button" tabindex="6" (click)="onPaymentClick(mpp)">View {{mpp.id ? mpp.id : 0}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
@ -17,7 +17,7 @@ export class ECLFeeInfoComponent implements OnChanges {
|
||||
|
||||
ngOnChanges() {
|
||||
if (this.fees?.monthly_fee) {
|
||||
this.totalFees = [{ name: 'Monthly', value: this.fees.monthly_fee }, { name: 'Weekly', value: this.fees.weekly_fee || 0 }, { name: 'Daily ', value: this.fees.daily_fee || 0}];
|
||||
this.totalFees = [{ name: 'Monthly', value: this.fees.monthly_fee }, { name: 'Weekly', value: this.fees.weekly_fee || 0 }, { name: 'Daily ', value: this.fees.daily_fee || 0 }];
|
||||
const e = Math.ceil(Math.log(this.fees.monthly_fee + 1) / Math.LN10);
|
||||
const m = 10 ** (e - 1);
|
||||
this.maxFeeValue = (Math.ceil(this.fees.monthly_fee / m) * m) / 5 || 100;
|
||||
|
@ -36,7 +36,7 @@ export class ECLOpenChannelComponent implements OnInit, OnDestroy {
|
||||
public fundingAmount: number | null;
|
||||
public selectedPubkey = '';
|
||||
public isPrivate = false;
|
||||
public feeRate : number | null = null;
|
||||
public feeRate: number | null = null;
|
||||
private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];
|
||||
|
||||
constructor(public dialogRef: MatDialogRef<ECLOpenChannelComponent>, @Inject(MAT_DIALOG_DATA) public data: ECLOpenChannelAlert, private store: Store<RTLState>, private actions: Actions) { }
|
||||
@ -46,12 +46,12 @@ export class ECLOpenChannelComponent implements OnInit, OnDestroy {
|
||||
this.information = this.data.message.information;
|
||||
this.totalBalance = this.data.message.balance;
|
||||
this.peer = this.data.message.peer || null;
|
||||
this.peers = this.data.message.peers || [];
|
||||
this.peers = this.data.message.peers || [];
|
||||
} else {
|
||||
this.information = {};
|
||||
this.totalBalance = 0;
|
||||
this.peer = null;
|
||||
this.peers = [];
|
||||
this.peers = [];
|
||||
}
|
||||
this.alertTitle = this.data.alertTitle || 'Alert';
|
||||
this.actions.pipe(
|
||||
|
@ -47,7 +47,7 @@ export class ECLConnectPeerComponent implements OnInit, OnDestroy {
|
||||
if (this.data.message) {
|
||||
this.totalBalance = this.data.message.balance;
|
||||
this.peerAddress = (this.data.message.peer && this.data.message.peer.nodeId && this.data.message.peer.address) ? (this.data.message.peer.nodeId + '@' + this.data.message.peer.address) :
|
||||
(this.data.message.peer && this.data.message.peer.nodeId && !this.data.message.peer.address) ? this.data.message.peer.nodeId : '';
|
||||
(this.data.message.peer && this.data.message.peer.nodeId && !this.data.message.peer.address) ? this.data.message.peer.nodeId : '';
|
||||
} else {
|
||||
this.totalBalance = 0;
|
||||
this.peerAddress = '';
|
||||
|
@ -171,7 +171,7 @@ export const ECLReducer = createReducer(initECLState,
|
||||
updatedPayload.amountIn = Math.round((payload.amountIn || 0) / 1000);
|
||||
updatedPayload.amountOut = Math.round((payload.amountOut || 0) / 1000);
|
||||
modifiedPayments.relayed?.unshift(updatedPayload);
|
||||
const feeSats = (payload.amountIn ||0) - (payload.amountOut || 0);
|
||||
const feeSats = (payload.amountIn || 0) - (payload.amountOut || 0);
|
||||
const modifiedLightningBalance = { localBalance: (state.lightningBalance.localBalance + feeSats), remoteBalance: (state.lightningBalance.remoteBalance - feeSats) };
|
||||
const modifiedChannelStatus = state.channelsStatus;
|
||||
if (modifiedChannelStatus.active) {
|
||||
|
@ -119,7 +119,7 @@ export class ECLLightningPaymentsComponent implements OnInit, AfterViewInit, OnD
|
||||
// }
|
||||
// This.paymentJSONArr = this.paymentJSONArr.splice(2, 5);
|
||||
// FOR MPP TESTING END
|
||||
if(this.paymentJSONArr.length > 0 && this.sort && this.paginator) {
|
||||
if (this.paymentJSONArr.length > 0 && this.sort && this.paginator) {
|
||||
this.loadPaymentsTable(this.paymentJSONArr);
|
||||
}
|
||||
this.logger.info(paymentsSeletor);
|
||||
@ -127,7 +127,7 @@ export class ECLLightningPaymentsComponent implements OnInit, AfterViewInit, OnD
|
||||
}
|
||||
|
||||
ngAfterViewInit() {
|
||||
if(this.paymentJSONArr.length > 0) {
|
||||
if (this.paymentJSONArr.length > 0) {
|
||||
this.loadPaymentsTable(this.paymentJSONArr);
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ import { Store } from '@ngrx/store';
|
||||
|
||||
import { ScreenSizeEnum, LoopTypeEnum } from '../../../shared/services/consts-enums-functions';
|
||||
import { Channel } from '../../../shared/models/lndModels';
|
||||
import { LoopModalComponent } from '../../../shared/components/ln-services/loop/loop-modal/loop-modal.component';
|
||||
import { LoopModalComponent } from '../../ln-services/loop/loop-modal/loop-modal.component';
|
||||
import { LoopService } from '../../../shared/services/loop.service';
|
||||
import { CommonService } from '../../../shared/services/common.service';
|
||||
|
||||
|
@ -3,15 +3,15 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
|
||||
import { RootReducer } from '../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../eclair/store/ecl.reducers';
|
||||
import { BoltzService } from '../../../services/boltz.service';
|
||||
import { CommonService } from '../../../services/common.service';
|
||||
import { DataService } from '../../../services/data.service';
|
||||
import { mockBoltzService, mockDataService } from '../../../test-helpers/mock-services';
|
||||
import { SharedModule } from '../../../shared.module';
|
||||
import { RootReducer } from '../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../eclair/store/ecl.reducers';
|
||||
import { BoltzService } from '../../../shared/services/boltz.service';
|
||||
import { CommonService } from '../../../shared/services/common.service';
|
||||
import { DataService } from '../../../shared/services/data.service';
|
||||
import { mockBoltzService, mockDataService } from '../../../shared/test-helpers/mock-services';
|
||||
import { SharedModule } from '../../../shared/shared.module';
|
||||
|
||||
import { BoltzRootComponent } from './boltz-root.component';
|
||||
|
@ -4,13 +4,13 @@ import { Subject } from 'rxjs';
|
||||
import { takeUntil, filter } from 'rxjs/operators';
|
||||
import { Store } from '@ngrx/store';
|
||||
|
||||
import { SwapTypeEnum } from '../../../services/consts-enums-functions';
|
||||
import { SwapTypeEnum } from '../../../shared/services/consts-enums-functions';
|
||||
import { SwapModalComponent } from './swap-modal/swap-modal.component';
|
||||
import { ReverseSwap, Swap, ListSwaps } from '../../../models/boltzModels';
|
||||
import { BoltzService } from '../../../services/boltz.service';
|
||||
import { ReverseSwap, Swap, ListSwaps } from '../../../shared/models/boltzModels';
|
||||
import { BoltzService } from '../../../shared/services/boltz.service';
|
||||
|
||||
import { RTLState } from '../../../../store/rtl.state';
|
||||
import { openAlert } from '../../../../store/rtl.actions';
|
||||
import { RTLState } from '../../../store/rtl.state';
|
||||
import { openAlert } from '../../../store/rtl.actions';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-boltz-root',
|
@ -1,16 +1,16 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { RootReducer } from '../../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../../eclair/store/ecl.reducers';
|
||||
import { CommonService } from '../../../../services/common.service';
|
||||
import { DataService } from '../../../../services/data.service';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
import { RootReducer } from '../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../eclair/store/ecl.reducers';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
import { DataService } from '../../../../shared/services/data.service';
|
||||
|
||||
import { SwapInInfoGraphicsComponent } from './info-graphics.component';
|
||||
import { mockDataService } from '../../../../test-helpers/mock-services';
|
||||
import { mockDataService } from '../../../../shared/test-helpers/mock-services';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
|
||||
describe('SwapInInfoGraphicsComponent', () => {
|
@ -1,8 +1,8 @@
|
||||
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
|
||||
import { ScreenSizeEnum } from '../../../../services/consts-enums-functions';
|
||||
import { ScreenSizeEnum } from '../../../../shared/services/consts-enums-functions';
|
||||
|
||||
import { sliderAnimation } from '../../../../animation/slider-animation';
|
||||
import { CommonService } from '../../../../services/common.service';
|
||||
import { sliderAnimation } from '../../../../shared/animation/slider-animation';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-boltz-swapin-info-graphics',
|
@ -3,19 +3,19 @@ import { RouterTestingModule } from '@angular/router/testing';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
|
||||
import { RootReducer } from '../../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../../eclair/store/ecl.reducers';
|
||||
import { CommonService } from '../../../../../shared/services/common.service';
|
||||
import { LoggerService } from '../../../../../shared/services/logger.service';
|
||||
import { BoltzService } from '../../../../../shared/services/boltz.service';
|
||||
import { RootReducer } from '../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../eclair/store/ecl.reducers';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
import { BoltzService } from '../../../../shared/services/boltz.service';
|
||||
|
||||
import { SwapModalComponent } from './swap-modal.component';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { mockBoltzService, mockDataService, mockLoggerService, mockMatDialogRef } from '../../../../test-helpers/mock-services';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
import { mockBoltzService, mockDataService, mockLoggerService, mockMatDialogRef } from '../../../../shared/test-helpers/mock-services';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { DataService } from '../../../../services/data.service';
|
||||
import { DataService } from '../../../../shared/services/data.service';
|
||||
|
||||
describe('SwapModalComponent', () => {
|
||||
let component: SwapModalComponent;
|
@ -9,15 +9,15 @@ import { MatStepper } from '@angular/material/stepper';
|
||||
import { Store } from '@ngrx/store';
|
||||
import { faInfoCircle } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
import { opacityAnimation } from '../../../../animation/opacity-animation';
|
||||
import { ScreenSizeEnum, SwapTypeEnum } from '../../../../services/consts-enums-functions';
|
||||
import { ServiceInfo, CreateSwapResponse, CreateReverseSwapResponse } from '../../../../models/boltzModels';
|
||||
import { SwapAlert } from '../../../../models/alertData';
|
||||
import { BoltzService } from '../../../../services/boltz.service';
|
||||
import { LoggerService } from '../../../../services/logger.service';
|
||||
import { CommonService } from '../../../../services/common.service';
|
||||
import { opacityAnimation } from '../../../../shared/animation/opacity-animation';
|
||||
import { ScreenSizeEnum, SwapTypeEnum } from '../../../../shared/services/consts-enums-functions';
|
||||
import { ServiceInfo, CreateSwapResponse, CreateReverseSwapResponse } from '../../../../shared/models/boltzModels';
|
||||
import { SwapAlert } from '../../../../shared/models/alertData';
|
||||
import { BoltzService } from '../../../../shared/services/boltz.service';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
|
||||
import { RTLState } from '../../../../../store/rtl.state';
|
||||
import { RTLState } from '../../../../store/rtl.state';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-boltz-swap-modal',
|
@ -1,10 +1,10 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
|
||||
import { CommonService } from '../../../../../shared/services/common.service';
|
||||
import { DataService } from '../../../../services/data.service';
|
||||
import { mockDataService, mockLoggerService } from '../../../../test-helpers/mock-services';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
import { DataService } from '../../../../shared/services/data.service';
|
||||
import { mockDataService, mockLoggerService } from '../../../../shared/test-helpers/mock-services';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
|
||||
import { SwapOutInfoGraphicsComponent } from './info-graphics.component';
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
|
||||
import { ScreenSizeEnum } from '../../../../services/consts-enums-functions';
|
||||
import { ScreenSizeEnum } from '../../../../shared/services/consts-enums-functions';
|
||||
|
||||
import { sliderAnimation } from '../../../../animation/slider-animation';
|
||||
import { CommonService } from '../../../../services/common.service';
|
||||
import { sliderAnimation } from '../../../../shared/animation/slider-animation';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-boltz-swapout-info-graphics',
|
@ -1,6 +1,6 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
|
||||
import { SwapServiceInfoComponent } from './swap-service-info.component';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { SwapTypeEnum } from '../../../../services/consts-enums-functions';
|
||||
import { ServiceInfo } from '../../../../models/boltzModels';
|
||||
import { SwapTypeEnum } from '../../../../shared/services/consts-enums-functions';
|
||||
import { ServiceInfo } from '../../../../shared/models/boltzModels';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-boltz-service-info',
|
@ -1,5 +1,5 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
|
||||
import { SwapStatusComponent } from './swap-status.component';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
|
||||
import { SwapTypeEnum } from '../../../../services/consts-enums-functions';
|
||||
import { SwapTypeEnum } from '../../../../shared/services/consts-enums-functions';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-boltz-swap-status',
|
@ -1,19 +1,19 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
|
||||
import { RootReducer } from '../../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../../eclair/store/ecl.reducers';
|
||||
import { CommonService } from '../../../../../shared/services/common.service';
|
||||
import { LoggerService } from '../../../../../shared/services/logger.service';
|
||||
import { BoltzService } from '../../../../../shared/services/boltz.service';
|
||||
import { RootReducer } from '../../../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../../../eclair/store/ecl.reducers';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
import { BoltzService } from '../../../../shared/services/boltz.service';
|
||||
|
||||
import { BoltzSwapsComponent } from './swaps.component';
|
||||
import { mockBoltzService, mockDataService, mockLoggerService } from '../../../../test-helpers/mock-services';
|
||||
import { SharedModule } from '../../../../shared.module';
|
||||
import { mockBoltzService, mockDataService, mockLoggerService } from '../../../../shared/test-helpers/mock-services';
|
||||
import { SharedModule } from '../../../../shared/shared.module';
|
||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { DataService } from '../../../../services/data.service';
|
||||
import { DataService } from '../../../../shared/services/data.service';
|
||||
|
||||
describe('BoltzSwapsComponent', () => {
|
||||
let component: BoltzSwapsComponent;
|
@ -7,14 +7,14 @@ import { faHistory } from '@fortawesome/free-solid-svg-icons';
|
||||
import { MatPaginator, MatPaginatorIntl } from '@angular/material/paginator';
|
||||
import { MatSort } from '@angular/material/sort';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
import { Swap, ReverseSwap } from '../../../../models/boltzModels';
|
||||
import { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, SwapTypeEnum, SwapStateEnum } from '../../../../services/consts-enums-functions';
|
||||
import { LoggerService } from '../../../../services/logger.service';
|
||||
import { CommonService } from '../../../../services/common.service';
|
||||
import { BoltzService } from '../../../../services/boltz.service';
|
||||
import { Swap, ReverseSwap } from '../../../../shared/models/boltzModels';
|
||||
import { PAGE_SIZE, PAGE_SIZE_OPTIONS, getPaginatorLabel, AlertTypeEnum, DataTypeEnum, ScreenSizeEnum, SwapTypeEnum, SwapStateEnum } from '../../../../shared/services/consts-enums-functions';
|
||||
import { LoggerService } from '../../../../shared/services/logger.service';
|
||||
import { CommonService } from '../../../../shared/services/common.service';
|
||||
import { BoltzService } from '../../../../shared/services/boltz.service';
|
||||
|
||||
import { openAlert } from '../../../../../store/rtl.actions';
|
||||
import { RTLState } from '../../../../../store/rtl.state';
|
||||
import { openAlert } from '../../../../store/rtl.actions';
|
||||
import { RTLState } from '../../../../store/rtl.state';
|
||||
|
||||
@Component({
|
||||
selector: 'rtl-boltz-swaps',
|
1
src/app/lnd/ln-services/ln-services.component.html
Executable file
1
src/app/lnd/ln-services/ln-services.component.html
Executable file
@ -0,0 +1 @@
|
||||
<router-outlet></router-outlet>
|
41
src/app/lnd/ln-services/ln-services.component.spec.ts
Executable file
41
src/app/lnd/ln-services/ln-services.component.spec.ts
Executable file
@ -0,0 +1,41 @@
|
||||
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
import { StoreModule } from '@ngrx/store';
|
||||
|
||||
import { RootReducer } from '../../store/rtl.reducers';
|
||||
import { LNDReducer } from '../../lnd/store/lnd.reducers';
|
||||
import { CLNReducer } from '../../cln/store/cln.reducers';
|
||||
import { ECLReducer } from '../../eclair/store/ecl.reducers';
|
||||
import { SharedModule } from '../../shared/shared.module';
|
||||
import { LNServicesComponent } from './ln-services.component';
|
||||
|
||||
describe('LNServicesComponent', () => {
|
||||
let component: LNServicesComponent;
|
||||
let fixture: ComponentFixture<LNServicesComponent>;
|
||||
|
||||
beforeEach(waitForAsync(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [LNServicesComponent],
|
||||
imports: [
|
||||
SharedModule,
|
||||
RouterTestingModule,
|
||||
StoreModule.forRoot({ root: RootReducer, lnd: LNDReducer, cln: CLNReducer, ecl: ECLReducer })
|
||||
]
|
||||
}).
|
||||
compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(LNServicesComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
TestBed.resetTestingModule();
|
||||
});
|
||||
});
|
@ -5,12 +5,12 @@ import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
templateUrl: './ln-services.component.html',
|
||||
styleUrls: ['./ln-services.component.scss']
|
||||
})
|
||||
export class LNServicesComponent implements OnInit, OnDestroy {
|
||||
export class LNServicesComponent {
|
||||
|
||||
constructor() {}
|
||||
|
||||
ngOnInit() {}
|
||||
// ngOnInit() {}
|
||||
|
||||
ngOnDestroy() {}
|
||||
// ngOnDestroy() {}
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user