Release 0.11.0 (#713)

- Package updates
    Updated docker NodeJS from 10 to 14
    Updated Angular from 11 to 12
    Updated Material from 11 to 12
    Updated Angular cli from 11 to 12
    Updated Karma from 5 to 6
    Updated rxjs from 6 to 7
    Updated ngrx from 10 to 12
    Updated angularx-qrcode from 10 to 11
    Updated @angular/flex-layout from 11 to 12
    Updated angular-user-idle from 2.2.4 to 2.2.5
    Updated typescript from 4.0.2 to 4.2.4
    Updated zone.js from 0.10.2 to 0.11.4
    Migrated from TSLint to ESLint
    Installed save-dev crypto-browserify & stream-browserify

- Mask password with fixed length #689
- CSRF Token (#696)
- Route lock default password (#700)
- ECL Invoice amount mislabeled #694
- ECL & LND Fee report time zone offset bug fixes #692 & #693
- Loop remove max routing fee validation #690
- Child route refresh bug
- Adding Password Blacklist (#704)
- Fee rate in percentage #621 (#705)
- ECL Adding BaseFee and FeeRate on Channels
- LND Invoice and Payment pagination fix (#707)
- Keysend missing QR code bug fix
- Login page XS layout fix
- Reports tables load time improved (#709)
- Report initial table load bug fix
pull/747/head
ShahanaFarooqui 3 years ago committed by GitHub
parent e4d6256803
commit e45d6d598a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -11,7 +11,7 @@ jobs:
command: | command: |
LATEST_TAG="${CIRCLE_TAG:1}" LATEST_TAG="${CIRCLE_TAG:1}"
DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-amd64" DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-amd64"
DOCKERHUB_DOCKERFILE="Dockerfile" DOCKERHUB_DOCKERFILE="docker/Dockerfile"
sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS
sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" . sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" .
sudo docker push "$DOCKERHUB_DESTINATION" sudo docker push "$DOCKERHUB_DESTINATION"
@ -26,7 +26,7 @@ jobs:
sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset
LATEST_TAG="${CIRCLE_TAG:1}" LATEST_TAG="${CIRCLE_TAG:1}"
DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-arm32v7" DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-arm32v7"
DOCKERHUB_DOCKERFILE="Dockerfile.arm32v7" DOCKERHUB_DOCKERFILE="docker/Dockerfile.arm32v7"
sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS
sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" . sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" .
sudo docker push "$DOCKERHUB_DESTINATION" sudo docker push "$DOCKERHUB_DESTINATION"
@ -41,7 +41,7 @@ jobs:
sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset
LATEST_TAG="${CIRCLE_TAG:1}" LATEST_TAG="${CIRCLE_TAG:1}"
DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-arm64v8" DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-arm64v8"
DOCKERHUB_DOCKERFILE="Dockerfile.arm64v8" DOCKERHUB_DOCKERFILE="docker/Dockerfile.arm64v8"
sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS
sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" . sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" .
sudo docker push "$DOCKERHUB_DESTINATION" sudo docker push "$DOCKERHUB_DESTINATION"

@ -0,0 +1,50 @@
{
"root": true,
"ignorePatterns": [
"projects/**/*"
],
"overrides": [
{
"files": [
"*.ts"
],
"parserOptions": {
"project": [
"tsconfig.json",
"e2e/tsconfig.json"
],
"createDefaultProgram": true
},
"extends": [
"plugin:@angular-eslint/recommended",
"plugin:@angular-eslint/template/process-inline-templates"
],
"rules": {
"@angular-eslint/component-selector": [
"error",
{
"prefix": "rtl",
"style": "kebab-case",
"type": "element"
}
],
"@angular-eslint/directive-selector": [
"error",
{
"style": "camelCase",
"type": "attribute"
}
]
}
},
{
"files": [
"*.html"
],
"extends": [
"plugin:@angular-eslint/template/recommended"
],
"rules": {}
}
]
}

@ -1,33 +0,0 @@
FROM node:10-jessie-slim AS builder
ADD https://github.com/krallin/tini/releases/download/v0.18.0/tini-static-armel /tini
ADD https://github.com/krallin/tini/releases/download/v0.18.0/tini-static-armel.asc /tini.asc
RUN apt-get install gnupg
RUN gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
WORKDIR /RTL
COPY . /RTL
COPY package.json /RTL/package.json
COPY package-lock.json /RTL/package-lock.json
# Install dependencies
RUN npm install --only=prod
COPY . /RTL
FROM arm32v7/node:10-jessie-slim
WORKDIR /RTL
COPY --from=builder "/RTL" .
COPY --from=builder "/tini" /sbin/tini
EXPOSE 3000
ENTRYPOINT ["/sbin/tini", "-g", "--"]
CMD ["node", "rtl"]

@ -25,10 +25,8 @@
"index": "src/index.html", "index": "src/index.html",
"main": "src/main.ts", "main": "src/main.ts",
"polyfills": "src/polyfills.ts", "polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json", "tsConfig": "src/tsconfig.app.json",
"aot": true,
"allowedCommonJsDependencies": [ "allowedCommonJsDependencies": [
"hammerjs",
"sha256", "sha256",
"qrcode", "qrcode",
"otplib" "otplib"
@ -39,7 +37,13 @@
"styles": [ "styles": [
"src/app/shared/theme/styles/styles.scss" "src/app/shared/theme/styles/styles.scss"
], ],
"scripts": [] "scripts": [],
"vendorChunk": true,
"extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true,
"optimization": false,
"namedChunks": true
}, },
"configurations": { "configurations": {
"production": { "production": {
@ -59,13 +63,13 @@
"budgets": [ "budgets": [
{ {
"type": "initial", "type": "initial",
"maximumWarning": "5mb", "maximumWarning": "12mb",
"maximumError": "5mb" "maximumError": "12mb"
}, },
{ {
"type": "anyComponentStyle", "type": "anyComponentStyle",
"maximumWarning": "1mb", "maximumWarning": "5mb",
"maximumError": "5mb" "maximumError": "10mb"
} }
] ]
} }
@ -93,8 +97,8 @@
"options": { "options": {
"main": "src/test.ts", "main": "src/test.ts",
"polyfills": "src/polyfills.ts", "polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json", "tsConfig": "src/tsconfig.spec.json",
"karmaConfig": "karma.conf.js", "karmaConfig": "src/karma.conf.js",
"assets": [ "assets": [
"src/assets" "src/assets"
], ],
@ -105,15 +109,11 @@
} }
}, },
"lint": { "lint": {
"builder": "@angular-devkit/build-angular:tslint", "builder": "@angular-eslint/builder:lint",
"options": { "options": {
"tsConfig": [ "lintFilePatterns": [
"tsconfig.app.json", "src/**/*.ts",
"tsconfig.spec.json", "src/**/*.html"
"e2e/tsconfig.json"
],
"exclude": [
"**/node_modules/**"
] ]
} }
}, },
@ -132,5 +132,8 @@
} }
} }
}, },
"defaultProject": "RTLApp" "defaultProject": "RTLApp",
"cli": {
"defaultCollection": "@angular-eslint/schematics"
}
} }

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,6 +1,4 @@
<!doctype html> <!DOCTYPE html><html lang="en"><head>
<html lang="en">
<head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>RTL</title> <title>RTL</title>
<base href="/rtl/"> <base href="/rtl/">
@ -12,8 +10,9 @@
<link rel="mask-icon" href="assets/images/favicon-light/safari-pinned-tab.svg" color="#5bbad5"> <link rel="mask-icon" href="assets/images/favicon-light/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<link rel="stylesheet" href="styles.34373e0f495fd5a53b6a.css"></head> <style>@font-face{font-family:Roboto;src:url(Roboto-Thin.dbd56bd3357dc3617fe5.woff2) format("woff2"),url(Roboto-Thin.e7f7c82374bd0ebef14b.woff) format("woff");font-weight:100;font-style:normal;}@font-face{font-family:Roboto;src:url(Roboto-ThinItalic.a8cef84f735ef887abdc.woff2) format("woff2"),url(Roboto-ThinItalic.5dd9349c940073834e9a.woff) format("woff");font-weight:100;font-style:italic;}@font-face{font-family:Roboto;src:url(Roboto-Light.c27d89ac77468ae18f28.woff2) format("woff2"),url(Roboto-Light.d923dfafc0c5183b59aa.woff) format("woff");font-weight:300;font-style:normal;}@font-face{font-family:Roboto;src:url(Roboto-LightItalic.506274c7228cf81cae4d.woff2) format("woff2"),url(Roboto-LightItalic.d4b8c137518d9d92bb28.woff) format("woff");font-weight:300;font-style:italic;}@font-face{font-family:Roboto;src:url(Roboto-Regular.64cfb66c866ea50cad47.woff2) format("woff2"),url(Roboto-Regular.e02e9d6ff5547f7e9962.woff) format("woff");font-weight:400;font-style:normal;}@font-face{font-family:Roboto;src:url(Roboto-RegularItalic.4dd2af1e8df532f41db8.woff2) format("woff2"),url(Roboto-RegularItalic.5ea38fff9eebef99c5df.woff) format("woff");font-weight:400;font-style:italic;}@font-face{font-family:Roboto;src:url(Roboto-Medium.1d3bced88509b0838984.woff2) format("woff2"),url(Roboto-Medium.092c6130df8fd2199888.woff) format("woff");font-weight:500;font-style:normal;}@font-face{font-family:Roboto;src:url(Roboto-MediumItalic.d620b8f53f75966fe42e.woff2) format("woff2"),url(Roboto-MediumItalic.18ff1628c628080166c1.woff) format("woff");font-weight:500;font-style:italic;}@font-face{font-family:Roboto;src:url(Roboto-Bold.92fbd4e93cf0a5dbebaa.woff2) format("woff2"),url(Roboto-Bold.73288d91c325e82a5b92.woff) format("woff");font-weight:700;font-style:normal;}@font-face{font-family:Roboto;src:url(Roboto-BoldItalic.5f600d98a73d800ae575.woff2) format("woff2"),url(Roboto-BoldItalic.6d89acbd21d7e3fbecb2.woff) format("woff");font-weight:700;font-style:italic;}@font-face{font-family:Roboto;src:url(Roboto-Black.41ed1105a6ebb8ffe34e.woff2) format("woff2"),url(Roboto-Black.937491dfcbe64ca9a9f1.woff) format("woff");font-weight:900;font-style:normal;}@font-face{font-family:Roboto;src:url(Roboto-BlackItalic.50ca4c51ebc27e7e7d2f.woff2) format("woff2"),url(Roboto-BlackItalic.2e1ee657996854c6f427.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;margin:0;}body{height:100%;overflow:hidden;}*{margin:0;padding:0;}</style><link rel="stylesheet" href="styles.97554e699a42acff6579.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.97554e699a42acff6579.css"></noscript></head>
<body> <body>
<rtl-app></rtl-app> <rtl-app></rtl-app>
<script src="runtime.76e78b7c520ee74ce1af.js" defer></script><script src="polyfills.a290c5ced4c403cfee17.js" defer></script><script src="main.023be7f19d26fb1d812e.js" defer></script></body> <script src="runtime.28bc9723e141277838d0.js" defer></script><script src="polyfills.99f4d82f067fba7525c4.js" defer></script><script src="main.0fde3abb5a45cd8835db.js" defer></script>
</html>
</body></html>

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

@ -0,0 +1 @@
(()=>{"use strict";var e,r,t,a={},o={};function n(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={id:e,loaded:!1,exports:{}};return a[e].call(t.exports,t,t.exports,n),t.loaded=!0,t.exports}n.m=a,e=[],n.O=(r,t,a,o)=>{if(!t){var l=1/0;for(s=0;s<e.length;s++){for(var[t,a,o]=e[s],d=!0,i=0;i<t.length;i++)(!1&o||l>=o)&&Object.keys(n.O).every(e=>n.O[e](t[i]))?t.splice(i--,1):(d=!1,o<l&&(l=o));d&&(e.splice(s--,1),r=a())}return r}o=o||0;for(var s=e.length;s>0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[t,a,o]},n.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return n.d(r,{a:r}),r},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>e+"."+{432:"635dd65c825f8e4ca25b",646:"4d1e1dc02d21b483a9c9",891:"65e70a7da1bfef9d82e4",958:"9a3ae49eb9fc6ea729f7"}[e]+".js",n.miniCssF=e=>"styles.97554e699a42acff6579.css",n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="rtl:",n.l=(e,a,o,l)=>{if(r[e])r[e].push(a);else{var d,i;if(void 0!==o)for(var s=document.getElementsByTagName("script"),u=0;u<s.length;u++){var c=s[u];if(c.getAttribute("src")==e||c.getAttribute("data-webpack")==t+o){d=c;break}}d||(i=!0,(d=document.createElement("script")).charset="utf-8",d.timeout=120,n.nc&&d.setAttribute("nonce",n.nc),d.setAttribute("data-webpack",t+o),d.src=e),r[e]=[a];var f=(t,a)=>{d.onerror=d.onload=null,clearTimeout(p);var o=r[e];if(delete r[e],d.parentNode&&d.parentNode.removeChild(d),o&&o.forEach(e=>e(a)),t)return t(a)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=f.bind(null,d.onerror),d.onload=f.bind(null,d.onload),i&&document.head.appendChild(d)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),n.p="",(()=>{var e={666:0};n.f.j=(r,t)=>{var a=n.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else if(666!=r){var o=new Promise((t,o)=>a=e[r]=[t,o]);t.push(a[2]=o);var l=n.p+n.u(r),d=new Error;n.l(l,t=>{if(n.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var o=t&&("load"===t.type?"missing":t.type),l=t&&t.target&&t.target.src;d.message="Loading chunk "+r+" failed.\n("+o+": "+l+")",d.name="ChunkLoadError",d.type=o,d.request=l,a[1](d)}},"chunk-"+r,r)}else e[r]=0},n.O.j=r=>0===e[r];var r=(r,t)=>{var a,o,[l,d,i]=t,s=0;for(a in d)n.o(d,a)&&(n.m[a]=d[a]);if(i)var u=i(n);for(r&&r(t);s<l.length;s++)n.o(e,o=l[s])&&e[o]&&e[o][0](),e[l[s]]=0;return n.O(u)},t=self.webpackChunkrtl=self.webpackChunkrtl||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})();

@ -1 +0,0 @@
!function(e){function r(r){for(var n,a,i=r[0],c=r[1],l=r[2],p=0,s=[];p<i.length;p++)a=i[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++)0!==o[t[i]]&&(n=!1);n&&(u.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={0:0},u=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise(function(r,n){t=o[e]=[r,n]});r.push(t[2]=n);var u,i=document.createElement("script");i.charset="utf-8",i.timeout=120,a.nc&&i.setAttribute("nonce",a.nc),i.src=function(e){return a.p+""+({}[e]||e)+"."+{1:"237c2154eb3e4109a251",5:"25446aaee9f74a416633",6:"eee0e0f329ec52d3bce7",7:"e4068d65b9329bce7749"}[e]+".js"}(e);var c=new Error;u=function(r){i.onerror=i.onload=null,clearTimeout(l);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",c.name="ChunkLoadError",c.type=n,c.request=u,t[1](c)}o[e]=void 0}};var l=setTimeout(function(){u({type:"timeout",target:i})},12e4);i.onerror=i.onload=u,document.head.appendChild(i)}return Promise.all(r)},a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,(function(r){return e[r]}).bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="",a.oe=function(e){throw console.error(e),e};var i=window.webpackJsonp=window.webpackJsonp||[],c=i.push.bind(i);i.push=r,i=i.slice();for(var l=0;l<i.length;l++)r(i[l]);var f=c;t()}([]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,13 +1,14 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getBalance = (req, res, next) => { exports.getBalance = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Balance', msg: 'Getting Balance..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/getBalance'; options.url = common.getSelLNServerUrl() + '/v1/getBalance';
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Balance', msg: 'Balance Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Balance', msg: 'Balance Received', data: body});
if(!body.totalBalance) { if(!body.totalBalance) {
body.totalBalance = 0; body.totalBalance = 0;
body.btc_totalBalance = 0; body.btc_totalBalance = 0;
@ -26,6 +27,7 @@ exports.getBalance = (req, res, next) => {
} else { } else {
body.btc_unconfBalance = common.convertToBTC(body.unconfBalance); body.btc_unconfBalance = common.convertToBTC(body.unconfBalance);
} }
logger.log({level: 'INFO', fileName: 'Balance', msg: 'Balance Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -36,7 +38,7 @@ exports.getBalance = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Balance', lineNum: 38, msg: 'Balance Fetch Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Balance', msg: 'Balance Fetch Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching balance failed!", message: "Fetching balance failed!",
error: err.error error: err.error

@ -1,20 +1,22 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.listChannels = (req, res, next) => { exports.listChannels = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Getting Channels..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channel/listChannels'; options.url = common.getSelLNServerUrl() + '/v1/channel/listChannels';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Channels', msg: 'List Channels: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'List Channels', data: body});
body.map(channel => { body.map(channel => {
if (!channel.alias || channel.alias === '') { channel.alias = channel.id.substring(0, 20); } if (!channel.alias || channel.alias === '') { channel.alias = channel.id.substring(0, 20); }
local = (channel.msatoshi_to_us) ? channel.msatoshi_to_us : 0; local = (channel.msatoshi_to_us) ? channel.msatoshi_to_us : 0;
remote = (channel.msatoshi_to_them) ? channel.msatoshi_to_them : 0; remote = (channel.msatoshi_to_them) ? channel.msatoshi_to_them : 0;
total = channel.msatoshi_total ? channel.msatoshi_total : 0; total = channel.msatoshi_total ? channel.msatoshi_total : 0;
channel.balancedness = (total == 0) ? 1 : (1 - Math.abs((local-remote)/total)).toFixed(3); channel.balancedness = (total == 0) ? 1 : (1 - Math.abs((local-remote)/total)).toFixed(3);
}) })
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channels Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -25,7 +27,7 @@ exports.listChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Channels', lineNum: 26, msg: 'List Channels: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'List Channels Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Fetching List Channels Failed!', message: 'Fetching List Channels Failed!',
error: err.error error: err.error
@ -34,19 +36,21 @@ exports.listChannels = (req, res, next) => {
} }
exports.openChannel = (req, res, next) => { exports.openChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channel/openChannel'; options.url = common.getSelLNServerUrl() + '/v1/channel/openChannel';
options.body = req.body; options.body = req.body;
logger.info({fileName: 'Channels', msg: 'Open Channel Options: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Open Channel Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 42, msg: 'Open Channel Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open Channel Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Open Channel Failed!', message: 'Open Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Opened'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -58,7 +62,7 @@ exports.openChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Channels', lineNum: 58, msg: 'Open Channel Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open Channel Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Open Channel Failed!', message: 'Open Channel Failed!',
error: err.error error: err.error
@ -67,19 +71,21 @@ exports.openChannel = (req, res, next) => {
} }
exports.setChannelFee = (req, res, next) => { exports.setChannelFee = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Setting Channel Fee..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channel/setChannelFee'; options.url = common.getSelLNServerUrl() + '/v1/channel/setChannelFee';
options.body = req.body; options.body = req.body;
logger.info({fileName: 'Channels', msg: 'Update Channel Policy Options: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Update Channel Policy: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 74, msg: 'Update Channel Policy Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Update Channel Policy Failed!', message: 'Update Channel Policy Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Fee Set'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -91,7 +97,7 @@ exports.setChannelFee = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Channels', lineNum: 90, msg: 'Update Channel Policy: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Update Channel Policy Failed!', message: 'Update Channel Policy Failed!',
error: err.error error: err.error
@ -100,20 +106,22 @@ exports.setChannelFee = (req, res, next) => {
} }
exports.closeChannel = (req, res, next) => { exports.closeChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Closing Channel..'});
req.setTimeout(60000 * 10); // timeout 10 mins req.setTimeout(60000 * 10); // timeout 10 mins
options = common.getOptions(); options = common.getOptions();
const unilateralTimeoutQuery = req.query.force ? '?unilateralTimeout=1' : ''; const unilateralTimeoutQuery = req.query.force ? '?unilateralTimeout=1' : '';
options.url = common.getSelLNServerUrl() + '/v1/channel/closeChannel/' + req.params.channelId + unilateralTimeoutQuery; options.url = common.getSelLNServerUrl() + '/v1/channel/closeChannel/' + req.params.channelId + unilateralTimeoutQuery;
logger.info({fileName: 'Channels', msg: 'Closing Channel: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url});
request.delete(options).then((body) => { request.delete(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Close Channel Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Close Channel Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 106, msg: 'Close Channel Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Close Channel Failed!', message: 'Close Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Closed'});
res.status(204).json(body); res.status(204).json(body);
} }
}) })
@ -125,7 +133,7 @@ exports.closeChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Channels', lineNum: 122, msg: 'Close Channel Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Close Channel Failed!', message: 'Close Channel Failed!',
error: err.error error: err.error
@ -134,10 +142,11 @@ exports.closeChannel = (req, res, next) => {
} }
exports.getLocalRemoteBalance = (req, res, next) => { exports.getLocalRemoteBalance = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Getting Local & Remote Balances..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channel/localremotebal'; options.url = common.getSelLNServerUrl() + '/v1/channel/localremotebal';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Channels', msg: 'Local Remote Balance: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Local Remote Balance', data: body});
if(!body.localBalance) { if(!body.localBalance) {
body.localBalance = 0; body.localBalance = 0;
body.btc_localBalance = 0; body.btc_localBalance = 0;
@ -150,6 +159,7 @@ exports.getLocalRemoteBalance = (req, res, next) => {
} else { } else {
body.btc_remoteBalance = common.convertToBTC(body.remoteBalance); body.btc_remoteBalance = common.convertToBTC(body.remoteBalance);
} }
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Local & Remote Balances Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -160,7 +170,7 @@ exports.getLocalRemoteBalance = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Channels', lineNum: 156, msg: 'Local Remote Balance Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Local Remote Balance Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Fetching Local Remote Balance Failed!', message: 'Fetching Local Remote Balance Failed!',
error: err.error error: err.error
@ -169,25 +179,23 @@ exports.getLocalRemoteBalance = (req, res, next) => {
}; };
exports.listForwards = (req, res, next) => { exports.listForwards = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Getting Channel List Forwards..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channel/listForwards/'; options.url = common.getSelLNServerUrl() + '/v1/channel/listForwards/';
request.get(options).then((body) => { request.get(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Forwarding History Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 170, msg: 'Forwarding History Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Forwarding History Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Forwarding History Failed!", message: "Forwarding History Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
if (body && body.length > 0) { if (body && body.length > 0) {
body.forEach(event => {
event.received_time_str = (!event.received_time) ? '' : common.convertTimestampToDate(event.received_time);
event.resolved_time_str = (!event.resolved_time) ? '' : common.convertTimestampToDate(event.resolved_time);
});
body = common.sortDescByKey(body, 'received_time'); body = common.sortDescByKey(body, 'received_time');
} }
logger.info({fileName: 'Channels', msg: 'Forwarding History Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Received', data: body});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel List Forwards Received'});
res.status(200).json({ last_offset_index: 0, forwarding_events: body }); res.status(200).json({ last_offset_index: 0, forwarding_events: body });
} }
}) })
@ -199,7 +207,7 @@ exports.listForwards = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Channels', lineNum: 194, msg: 'Forwarding History Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Forwarding History Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Forwarding History Failed!", message: "Forwarding History Failed!",
error: err.error error: err.error

@ -1,15 +1,16 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getFees = (req, res, next) => { exports.getFees = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/getFees'; options.url = common.getSelLNServerUrl() + '/v1/getFees';
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Fees', msg: 'Fee Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Fee Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Fees', lineNum: 12, msg: 'Get Fee Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Fee Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching fee failed!", message: "Fetching fee failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
@ -21,6 +22,7 @@ exports.getFees = (req, res, next) => {
} else { } else {
body.btc_feeCollected = common.convertToBTC(body.feeCollected); body.btc_feeCollected = common.convertToBTC(body.feeCollected);
} }
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Fees Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -32,7 +34,7 @@ exports.getFees = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Fees', lineNum: 34, msg: 'Get Fees Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Fees Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching fee failed!", message: "Fetching fee failed!",
error: err.error error: err.error

@ -1,27 +1,28 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getInfo = (req, res, next) => { exports.getInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'Getting CLightning Node Information..'});
common.setOptions(); common.setOptions();
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/getinfo'; options.url = common.getSelLNServerUrl() + '/v1/getinfo';
logger.info({fileName:'GetInfo', msg: 'Selected Node: ' + JSON.stringify(common.selectedNode.ln_node)}); logger.log({level: 'DEBUG', fileName:'GetInfo', msg: 'Selected Node', data: common.selectedNode.ln_node});
logger.info({fileName: 'GetInfo', msg: 'Calling Info from C-Lightning server url: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Calling Info from C-Lightning server url', data: options.url});
if (!options.headers || !options.headers.macaroon) { if (!options.headers || !options.headers.macaroon) {
logger.error({fileName: 'GetInfo', lineNum: 13, msg: 'C-Lightning Get info failed due to bad or missing macaroon!'}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'C-Lightning Get info failed due to bad or missing macaroon!', error: {error: 'Bad macaroon.'}});
res.status(502).json({ res.status(502).json({
message: "Fetching Info Failed!", message: "Fetching Info Failed!",
error: "Bad Macaroon" error: "Bad Macaroon"
}); });
} else { } else {
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'GetInfo', msg: JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Node Information', data: body});
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'GetInfo', lineNum: 24, msg: 'Get Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Info failed!", message: "Fetching Info failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
@ -51,6 +52,7 @@ exports.getInfo = (req, res, next) => {
body.uris.push(body.id + '@' + addr.address + ':' + addr.port); body.uris.push(body.id + '@' + addr.address + ':' + addr.port);
}); });
} }
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'CLightning Node Information Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -62,7 +64,7 @@ exports.getInfo = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'GetInfo', lineNum: 57, msg: 'Get Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Info failed!", message: "Fetching Info failed!",
error: err.error error: err.error

@ -1,21 +1,23 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.deleteExpiredInvoice = (req, res, next) => { exports.deleteExpiredInvoice = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Deleting Expired Invoices..'});
options = common.getOptions(); options = common.getOptions();
const queryStr = req.query.maxExpiry ? '?maxexpiry=' + req.query.maxExpiry : ''; const queryStr = req.query.maxExpiry ? '?maxexpiry=' + req.query.maxExpiry : '';
options.url = common.getSelLNServerUrl() + '/v1/invoice/delExpiredInvoice' + queryStr; options.url = common.getSelLNServerUrl() + '/v1/invoice/delExpiredInvoice' + queryStr;
request.delete(options).then((body) => { request.delete(options).then((body) => {
logger.info({fileName: 'Invoice', msg: 'Invoices Deleted: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices Deleted', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Invoice', lineNum: 13, msg: 'Invoice Delete Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Invoice Delete Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Deleting Invoice Failed!", message: "Deleting Invoice Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} }
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Expired Invoices Deleted'});
res.status(204).json({status: 'Invoice Deleted Successfully'}); res.status(204).json({status: 'Invoice Deleted Successfully'});
}) })
.catch(errRes => { .catch(errRes => {
@ -26,7 +28,7 @@ exports.deleteExpiredInvoice = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Invoice', lineNum: 28, msg: 'Invoice Delete Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Invoice Delete Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Deleting Invoice Failed!", message: "Deleting Invoice Failed!",
error: err.error error: err.error
@ -35,26 +37,24 @@ exports.deleteExpiredInvoice = (req, res, next) => {
}; };
exports.listInvoices = (req, res, next) => { exports.listInvoices = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Getting Invoices..'});
options = common.getOptions(); options = common.getOptions();
const labelQuery = req.query.label ? '?label=' + req.query.label : ''; const labelQuery = req.query.label ? '?label=' + req.query.label : '';
options.url = common.getSelLNServerUrl() + '/v1/invoice/listInvoices' + labelQuery; options.url = common.getSelLNServerUrl() + '/v1/invoice/listInvoices' + labelQuery;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Invoice', msg: 'Invoices List Received: ' + body}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Invoice', lineNum: 43, msg: 'List Invoice Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoice Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Invoice Info failed!", message: "Fetching Invoice Info failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
if ( body.invoices && body.invoices.length > 0) { if ( body.invoices && body.invoices.length > 0) {
body.invoices.forEach(invoice => {
invoice.paid_at_str = (!invoice.paid_at) ? '' : common.convertTimestampToDate(invoice.paid_at);
invoice.expires_at_str = (!invoice.expires_at) ? '' : common.convertTimestampToDate(invoice.expires_at);
});
body.invoices = common.sortDescByKey(body.invoices, 'expires_at'); body.invoices = common.sortDescByKey(body.invoices, 'expires_at');
} }
logger.info({fileName: 'Invoice', msg: 'Invoices List Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body});
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Invoices Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -66,7 +66,7 @@ exports.listInvoices = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Invoice', lineNum: 67, msg: 'List Invoice Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoice Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Invoice Info failed!", message: "Fetching Invoice Info failed!",
error: err.error error: err.error
@ -75,18 +75,20 @@ exports.listInvoices = (req, res, next) => {
}; };
exports.addInvoice = (req, res, next) => { exports.addInvoice = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/invoice/genInvoice'; options.url = common.getSelLNServerUrl() + '/v1/invoice/genInvoice';
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Invoice', msg: 'Add Invoice Responce: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Add Invoice Responce', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Invoice', lineNum: 82, msg: 'Add Invoice Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Add Invoice Failed!", message: "Add Invoice Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Invoice Created'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -98,7 +100,7 @@ exports.addInvoice = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Invoice', lineNum: 98, msg: 'Add Invoice Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Add Invoice Failed!", message: "Add Invoice Failed!",
error: err.error error: err.error

@ -1,21 +1,23 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.signMessage = (req, res, next) => { exports.signMessage = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Signing Message..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/utility/signMessage'; options.url = common.getSelLNServerUrl() + '/v1/utility/signMessage';
options.form = { message: req.body.message }; options.form = { message: req.body.message };
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.info({fileName: 'Messages', msg: 'Message Signed: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Signed', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Messages', lineNum: 13, msg: 'Message Sign Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Message Sign Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Sign message failed!", message: "Sign message failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Signed'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -27,7 +29,7 @@ exports.signMessage = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Messages', lineNum: 29, msg: 'Sign Message Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Sign Message Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Sign Message Failed!', message: 'Sign Message Failed!',
error: err.error error: err.error
@ -36,17 +38,19 @@ exports.signMessage = (req, res, next) => {
}; };
exports.verifyMessage = (req, res, next) => { exports.verifyMessage = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Verifying Message..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/utility/checkMessage/' + req.body.message + '/' + req.body.signature; options.url = common.getSelLNServerUrl() + '/v1/utility/checkMessage/' + req.body.message + '/' + req.body.signature;
request.get(options, (error, response, body) => { request.get(options, (error, response, body) => {
logger.info({fileName: 'Messages', msg: 'Message Verified: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Verified', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Messages', lineNum: 43, msg: 'Verify Message Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Verify Message Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Verify message failed!", message: "Verify message failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Verified'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -58,7 +62,7 @@ exports.verifyMessage = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Messages', lineNum: 59, msg: 'Message Verification Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Message Verification Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Verify Message Failed!', message: 'Verify Message Failed!',
error: err.error error: err.error

@ -1,20 +1,22 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getRoute = (req, res, next) => { exports.getRoute = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Network', msg: 'Getting Network Routes..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/network/getRoute/' + req.params.destPubkey + '/' + req.params.amount; options.url = common.getSelLNServerUrl() + '/v1/network/getRoute/' + req.params.destPubkey + '/' + req.params.amount;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Network', msg: 'Query Routes Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Network', msg: 'Query Routes Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Network', lineNum: 12, msg: 'Query Routes Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Network', msg: 'Query Routes Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Query Routes Failed!", message: "Fetching Query Routes Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} }
logger.log({level: 'INFO', fileName: 'Network', msg: 'Network Routes Received'});
res.status(200).json({routes: body}); res.status(200).json({routes: body});
}) })
.catch(errRes => { .catch(errRes => {
@ -25,7 +27,7 @@ exports.getRoute = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Network', lineNum: 27, msg: 'Query Routes Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Network', msg: 'Query Routes Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Query Routes Failed!", message: "Fetching Query Routes Failed!",
error: err.error error: err.error
@ -34,13 +36,12 @@ exports.getRoute = (req, res, next) => {
}; };
exports.listNode = (req, res, next) => { exports.listNode = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Network', msg: 'Node Lookup..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/network/listNode/' + req.params.id; options.url = common.getSelLNServerUrl() + '/v1/network/listNode/' + req.params.id;
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Network', msg: 'Node Lookup: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Network', msg: 'Node Lookup', data: body});
body.forEach(node => { logger.log({level: 'INFO', fileName: 'Network', msg: 'Node Lookup Finished'});
node.last_timestamp_str = (node.last_timestamp) ? common.convertTimestampToDate(node.last_timestamp) : '';
});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -51,7 +52,7 @@ exports.listNode = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Network', lineNum: 52, msg: 'Node Lookup Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Network', msg: 'Node Lookup Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Node Lookup Failed!", message: "Node Lookup Failed!",
error: err.error error: err.error
@ -60,12 +61,12 @@ exports.listNode = (req, res, next) => {
}; };
exports.listChannel = (req, res, next) => { exports.listChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Network', msg: 'Channel Lookup..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/network/listChannel/' + req.params.channelShortId; options.url = common.getSelLNServerUrl() + '/v1/network/listChannel/' + req.params.channelShortId;
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Network', msg: 'Channel Lookup: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Network', msg: 'Channel Lookup', data: body});
body[0].last_update_str = (body.length > 0 && body[0].last_update) ? common.convertTimestampToDate(body[0].last_update) : ''; logger.log({level: 'INFO', fileName: 'Network', msg: 'Channel Lookup Finished'});
body[1].last_update_str = (body.length > 1 && body[1].last_update) ? common.convertTimestampToDate(body[1].last_update) : '';
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -76,7 +77,7 @@ exports.listChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Network', lineNum: 76, msg: 'Channel Lookup Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Network', msg: 'Channel Lookup Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Channel Lookup Failed!", message: "Channel Lookup Failed!",
error: err.error error: err.error
@ -85,9 +86,11 @@ exports.listChannel = (req, res, next) => {
}; };
exports.feeRates = (req, res, next) => { exports.feeRates = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Network', msg: 'Getting Network Fee Rates..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/network/feeRates/' + req.params.feeRateStyle; options.url = common.getSelLNServerUrl() + '/v1/network/feeRates/' + req.params.feeRateStyle;
request(options).then(function (body) { request(options).then(function (body) {
logger.log({level: 'INFO', fileName: 'Network', msg: 'Network Fee Rates Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -98,7 +101,7 @@ exports.feeRates = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Network', lineNum: 97, msg: 'Fee Rates Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Network', msg: 'Fee Rates Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fee Rates Failed!", message: "Fee Rates Failed!",
error: err.error error: err.error

@ -1,12 +1,14 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getNewAddress = (req, res, next) => { exports.getNewAddress = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Generating New Address..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/newaddr?addrType=' + req.query.type; options.url = common.getSelLNServerUrl() + '/v1/newaddr?addrType=' + req.query.type;
request(options).then((body) => { request(options).then((body) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -17,7 +19,7 @@ exports.getNewAddress = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'OnChain', lineNum: 19, msg: 'OnChain New Address Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain New Address Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching new address failed!", message: "Fetching new address failed!",
error: err.error error: err.error
@ -26,19 +28,21 @@ exports.getNewAddress = (req, res, next) => {
}; };
exports.onChainWithdraw = (req, res, next) => { exports.onChainWithdraw = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Withdrawing from On Chain..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/withdraw'; options.url = common.getSelLNServerUrl() + '/v1/withdraw';
options.body = req.body; options.body = req.body;
logger.info({fileName: 'OnChain', msg: 'OnChain Withdraw Options: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'OnChain', msg: 'OnChain Withdraw Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'OnChain', lineNum: 35, msg: 'OnChain Withdraw Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain Withdraw Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'OnChain Withdraw Failed!', message: 'OnChain Withdraw Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Withdraw Finished'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -50,7 +54,7 @@ exports.onChainWithdraw = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'OnChain', lineNum: 51, msg: 'OnChain Withdraw Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain Withdraw Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'OnChain Withdraw Failed!', message: 'OnChain Withdraw Failed!',
error: err error: err
@ -59,10 +63,12 @@ exports.onChainWithdraw = (req, res, next) => {
} }
exports.getUTXOs = (req, res, next) => { exports.getUTXOs = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'List Funds..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/listFunds'; options.url = common.getSelLNServerUrl() + '/v1/listFunds';
request(options).then((body) => { request(options).then((body) => {
if (body.outputs) { body.outputs = common.sortDescByStrKey(body.outputs, 'status'); } if (body.outputs) { body.outputs = common.sortDescByStrKey(body.outputs, 'status'); }
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'List Funds Received'});
res.status(200).json(body); res.status(200).json(body);
}).catch(errRes => { }).catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes)); let err = JSON.parse(JSON.stringify(errRes));
@ -72,7 +78,7 @@ exports.getUTXOs = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'OnChain', lineNum: 19, msg: 'OnChain List Funds Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain List Funds Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching list funds failed!", message: "Fetching list funds failed!",
error: err.error error: err.error

@ -1,5 +1,5 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
@ -39,30 +39,29 @@ function groupBy(payments) {
let paySummary = curr.reduce(summaryReducer, {msatoshi: 0, msatoshi_sent: 0, status: (curr[0] && curr[0].status) ? curr[0].status : 'failed'}); let paySummary = curr.reduce(summaryReducer, {msatoshi: 0, msatoshi_sent: 0, status: (curr[0] && curr[0].status) ? curr[0].status : 'failed'});
temp = {is_group: true, is_expanded: false, total_parts: (curr.length ? curr.length : 0), status: paySummary.status, payment_hash: curr[0].payment_hash, temp = {is_group: true, is_expanded: false, total_parts: (curr.length ? curr.length : 0), status: paySummary.status, payment_hash: curr[0].payment_hash,
destination: curr[0].destination, msatoshi: paySummary.msatoshi, msatoshi_sent: paySummary.msatoshi_sent, created_at: curr[0].created_at, destination: curr[0].destination, msatoshi: paySummary.msatoshi, msatoshi_sent: paySummary.msatoshi_sent, created_at: curr[0].created_at,
created_at_str: curr[0].created_at_str, mpps: curr}; mpps: curr};
} }
return acc.concat(temp); return acc.concat(temp);
}, []); }, []);
} }
exports.listPayments = (req, res, next) => { exports.listPayments = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'List Payments..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/pay/listPayments'; options.url = common.getSelLNServerUrl() + '/v1/pay/listPayments';
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Payments', msg: 'Payment List Received: ' + JSON.stringify(body.payments)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Payments', lineNum: 12, msg: 'Payments List Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Payments List Failed!", message: "Payments List Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
if ( body && body.payments && body.payments.length > 0) { if ( body && body.payments && body.payments.length > 0) {
body.payments.forEach(payment => {
payment.created_at_str = (!payment.created_at) ? '' : common.convertTimestampToDate(payment.created_at);
});
body.payments = common.sortDescByKey(body.payments, 'created_at'); body.payments = common.sortDescByKey(body.payments, 'created_at');
} }
logger.log({level: 'INFO', fileName: 'Payments', msg: 'List Payments Received'});
res.status(200).json(groupBy(body.payments)); res.status(200).json(groupBy(body.payments));
} }
}) })
@ -74,7 +73,7 @@ exports.listPayments = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Payments', lineNum: 34, msg: 'Payments List Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Payments List Failed!", message: "Payments List Failed!",
error: err.error error: err.error
@ -83,19 +82,19 @@ exports.listPayments = (req, res, next) => {
}; };
exports.decodePayment = (req, res, next) => { exports.decodePayment = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/pay/decodePay/' + req.params.invoice; options.url = common.getSelLNServerUrl() + '/v1/pay/decodePay/' + req.params.invoice;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Payments', msg: 'Payment Decode Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Payments', lineNum: 48, msg: 'Payment Decode Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Payment Request Decode Failed!", message: "Payment Request Decode Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
}); });
} else { } else {
body.created_at_str = (!body.created_at) ? '' : common.convertTimestampToDate(body.created_at); logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded'});
body.expire_at_str = (!body.created_at || !body.expiry) ? '' : common.convertTimestampToDate(body.created_at + body.expiry);
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -107,7 +106,7 @@ exports.decodePayment = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Payments', lineNum: 66, msg: 'Payment Decode Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Payment Request Decode Failed!", message: "Payment Request Decode Failed!",
error: err.error error: err.error
@ -118,20 +117,23 @@ exports.decodePayment = (req, res, next) => {
exports.postPayment = (req, res, next) => { exports.postPayment = (req, res, next) => {
options = common.getOptions(); options = common.getOptions();
if (req.params.type === 'keysend') { if (req.params.type === 'keysend') {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Keysend Payment..'});
options.url = common.getSelLNServerUrl() + '/v1/pay/keysend'; options.url = common.getSelLNServerUrl() + '/v1/pay/keysend';
} else { } else {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Send Payment..'});
options.url = common.getSelLNServerUrl() + '/v1/pay'; options.url = common.getSelLNServerUrl() + '/v1/pay';
} }
options.body = req.body; options.body = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Payments', msg: 'Send Payment Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Payments', lineNum: 81, msg: 'Send Payment Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payment Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Send Payment Failed!", message: "Send Payment Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Sent'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -143,7 +145,7 @@ exports.postPayment = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Payments', lineNum: 97, msg: 'Send Payments Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payments Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Send Payment Failed!", message: "Send Payment Failed!",
error: err.error error: err.error

@ -1,15 +1,17 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getPeers = (req, res, next) => { exports.getPeers = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'List Peers..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/peer/listPeers'; options.url = common.getSelLNServerUrl() + '/v1/peer/listPeers';
request(options).then(function (body) { request(options).then(function (body) {
body.forEach(peer => { if (!peer.alias || peer.alias === '') { peer.alias = peer.id.substring(0, 20);}}); body.forEach(peer => { if (!peer.alias || peer.alias === '') { peer.alias = peer.id.substring(0, 20);}});
let peers = (body) ? common.sortDescByStrKey(body, 'alias') : []; let peers = (body) ? common.sortDescByStrKey(body, 'alias') : [];
logger.info({fileName: 'Peers', msg: 'Peers with Alias: ' + JSON.stringify(peers)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peers with Alias', data: peers});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peers Received'});
res.status(200).json(peers); res.status(200).json(peers);
}) })
.catch(errRes => { .catch(errRes => {
@ -20,7 +22,7 @@ exports.getPeers = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Peers', lineNum: 21, msg: 'Peers List Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Peers List Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Peers Fetch Failed!", message: "Peers Fetch Failed!",
error: err.error error: err.error
@ -29,24 +31,26 @@ exports.getPeers = (req, res, next) => {
}; };
exports.postPeer = (req, res, next) => { exports.postPeer = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/peer/connect'; options.url = common.getSelLNServerUrl() + '/v1/peer/connect';
options.body = req.body; options.body = req.body;
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Peers', lineNum: 35, msg: 'Connect Peer Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Connect Peer Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Adding peer failed!", message: "Adding peer failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.info({fileName: 'Peers', msg: 'Peer Added: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added', data: body});
options.url = common.getSelLNServerUrl() + '/v1/peer/listPeers'; options.url = common.getSelLNServerUrl() + '/v1/peer/listPeers';
request(options).then(function (body) { request(options).then(function (body) {
let peers = ( body) ? common.sortDescByStrKey(body, 'alias') : []; let peers = ( body) ? common.sortDescByStrKey(body, 'alias') : [];
peers = common.newestOnTop(peers, 'id', req.body.id); peers = common.newestOnTop(peers, 'id', req.body.id);
logger.info({fileName: 'Peers', msg: 'Peer with Newest On Top: ' + JSON.stringify(peers)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Newest On Top', data: peers});
logger.info({fileName: 'Peers', msg: 'Peer Added Successfully'}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added Successfully'});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Connected'});
res.status(201).json(peers); res.status(201).json(peers);
}).catch(errRes => { }).catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes)); let err = JSON.parse(JSON.stringify(errRes));
@ -56,7 +60,7 @@ exports.postPeer = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Peers', lineNum: 56, msg: 'Connect Peer Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Connect Peer Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Peer Add Failed!", message: "Peer Add Failed!",
error: err.error error: err.error
@ -67,18 +71,20 @@ exports.postPeer = (req, res, next) => {
}; };
exports.deletePeer = (req, res, next) => { exports.deletePeer = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/peer/disconnect/' + req.params.peerId + '?force=' + req.query.force; options.url = common.getSelLNServerUrl() + '/v1/peer/disconnect/' + req.params.peerId + '?force=' + req.query.force;
request.delete(options).then((body) => { request.delete(options).then((body) => {
logger.info({fileName: 'Peers', msg: 'Detach Peer Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Detach Peer Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Peers', lineNum: 72, msg: 'Detach Peer Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Detach Peer Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Detach peer failed!", message: "Detach peer failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.info({fileName: 'Peers', msg: 'Peer Detached: ' + req.params.peerId}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Detached', data: req.params.peerId});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected'});
res.status(204).json({}); res.status(204).json({});
} }
}) })
@ -90,7 +96,7 @@ exports.deletePeer = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon; delete err.response.request.headers.macaroon;
} }
logger.error({fileName: 'Peers', lineNum: 89, msg: 'Detach Peer Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Detach Peer Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Detach Peer Failed!", message: "Detach Peer Failed!",
error: err.error error: err.error

@ -1,5 +1,5 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
@ -35,10 +35,10 @@ arrangeChannels = (simplifiedChannels) => {
}); });
lightningBalances = { localBalance: totalLocalBalance, remoteBalance: totalRemoteBalance }; lightningBalances = { localBalance: totalLocalBalance, remoteBalance: totalRemoteBalance };
activeChannels = common.sortDescByKey(activeChannels, 'balancedness'); activeChannels = common.sortDescByKey(activeChannels, 'balancedness');
logger.info({fileName: 'Channels', msg: 'Lightning Balances: ' + JSON.stringify(lightningBalances)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Lightning Balances', data: lightningBalances});
logger.info({fileName: 'Channels', msg: 'Active Channels: ' + JSON.stringify(activeChannels)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Active Channels', data: activeChannels});
logger.info({fileName: 'Channels', msg: 'Pending Channels: ' + JSON.stringify(pendingChannels)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Pending Channels', data: pendingChannels});
logger.info({fileName: 'Channels', msg: 'Inactive Channels: ' + JSON.stringify(inactiveChannels)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Inactive Channels', data: inactiveChannels});
return ({activeChannels: activeChannels, pendingChannels: pendingChannels, inactiveChannels: inactiveChannels, lightningBalances: lightningBalances, channelStatus: channelStatus}); return ({activeChannels: activeChannels, pendingChannels: pendingChannels, inactiveChannels: inactiveChannels, lightningBalances: lightningBalances, channelStatus: channelStatus});
}; };
@ -58,49 +58,51 @@ simplifyAllChannels = (channels) => {
isFunder: channel.data && channel.data.commitments && channel.data.commitments.localParams && channel.data.commitments.localParams.isFunder ? channel.data.commitments.localParams.isFunder : false, isFunder: channel.data && channel.data.commitments && channel.data.commitments.localParams && channel.data.commitments.localParams.isFunder ? channel.data.commitments.localParams.isFunder : false,
buried: channel.data && channel.data.buried ? channel.data.buried : false, buried: channel.data && channel.data.buried ? channel.data.buried : false,
feeBaseMsat: channel.data && channel.data.channelUpdate && channel.data.channelUpdate.feeBaseMsat ? channel.data.channelUpdate.feeBaseMsat : 0, feeBaseMsat: channel.data && channel.data.channelUpdate && channel.data.channelUpdate.feeBaseMsat ? channel.data.channelUpdate.feeBaseMsat : 0,
feeRatePerKw: (channel.data.commitments.localCommit.spec.feeratePerKw) ? channel.data.commitments.localCommit.spec.feeratePerKw : 0,
feeProportionalMillionths: channel.data && channel.data.channelUpdate && channel.data.channelUpdate.feeProportionalMillionths ? channel.data.channelUpdate.feeProportionalMillionths : 0, feeProportionalMillionths: channel.data && channel.data.channelUpdate && channel.data.channelUpdate.feeProportionalMillionths ? channel.data.channelUpdate.feeProportionalMillionths : 0,
alias: '' alias: ''
}); });
}); });
channelNodeIds = channelNodeIds.substring(1); channelNodeIds = channelNodeIds.substring(1);
return new Promise(function(resolve, reject) { options.url = common.getSelLNServerUrl() + '/nodes';
options.url = common.getSelLNServerUrl() + '/nodes'; options.form = { nodeIds: channelNodeIds };
options.form = { nodeIds: channelNodeIds }; logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Node Ids to find alias', data: channelNodeIds});
logger.info({fileName: 'Channels', msg: 'Node Ids to find alias: ' + channelNodeIds}); return request.post(options).then(function(nodes) {
request.post(options).then(function(nodes) { logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Filtered Nodes', data: nodes});
logger.info({fileName: 'Channels', msg: 'Filtered Nodes: ' + JSON.stringify(nodes)}); let foundPeer = {};
let foundPeer = {}; simplifiedChannels.map(channel => {
simplifiedChannels.map(channel => { foundPeer = nodes.find(channelWithAlias => channel.nodeId === channelWithAlias.nodeId);
foundPeer = nodes.find(channelWithAlias => channel.nodeId === channelWithAlias.nodeId); channel.alias = foundPeer ? foundPeer.alias : channel.nodeId.substring(0, 20);
channel.alias = foundPeer ? foundPeer.alias : channel.nodeId.substring(0, 20); });
}); return simplifiedChannels;
resolve(simplifiedChannels); }).catch(err => {
}).catch(err => { return simplifiedChannels;
resolve(simplifiedChannels);
});
}); });
}; };
exports.getChannels = (req, res, next) => { exports.getChannels = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'List Channels..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/channels'; options.url = common.getSelLNServerUrl() + '/channels';
options.form = {}; options.form = {};
if (req.query && req.query.nodeId) { if (req.query && req.query.nodeId) {
options.form = req.query; options.form = req.query;
logger.info({fileName: 'Channels', msg: 'Channels Node Id: ' + JSON.stringify(options.form)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Channels Node Id', data: options.form});
} }
logger.info({fileName: 'Channels', msg: 'Options: ' + JSON.stringify(options)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Options', data: options});
if (common.read_dummy_data) { if (common.read_dummy_data) {
common.getDummyData('Channels').then(function(data) { res.status(200).json(arrangeChannels(data)); }); common.getDummyData('Channels').then(function(data) { res.status(200).json(arrangeChannels(data)); });
} else { } else {
request.post(options).then(function (body) { request.post(options).then(function (body) {
logger.info({fileName: 'Channels', msg: 'All Channels: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'All Channels', data: body});
if(body && body.length) { if(body && body.length) {
simplifyAllChannels(body).then(function(simplifiedChannels) { return simplifyAllChannels(body).then(function(simplifiedChannels) {
logger.info({fileName: 'Channels', msg: 'Simplified Channels with Alias: ' + JSON.stringify(simplifiedChannels)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Simplified Channels with Alias', data: simplifiedChannels});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channels List Received'});
res.status(200).json(arrangeChannels(simplifiedChannels)); res.status(200).json(arrangeChannels(simplifiedChannels));
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Empty Channels List Received'});
res.status(200).json({activeChannels: [], pendingChannels: [], inactiveChannels: [], lightningBalances: { localBalance: 0, remoteBalance: 0 }, channelStatus: {active: { channels: 0, capacity: 0 }, inactive: { channels: 0, capacity: 0 }, pending: { channels: 0, capacity: 0 }}}); res.status(200).json({activeChannels: [], pendingChannels: [], inactiveChannels: [], lightningBalances: { localBalance: 0, remoteBalance: 0 }, channelStatus: {active: { channels: 0, capacity: 0 }, inactive: { channels: 0, capacity: 0 }, pending: { channels: 0, capacity: 0 }}});
} }
}) })
@ -112,7 +114,7 @@ exports.getChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Channels', lineNum: 35, msg: 'Get Channels Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Get Channels Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: 'Fetching Channels Failed!', message: 'Fetching Channels Failed!',
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -122,11 +124,13 @@ exports.getChannels = (req, res, next) => {
}; };
exports.getChannelStats = (req, res, next) => { exports.getChannelStats = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Getting Channel States..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/channelstats'; options.url = common.getSelLNServerUrl() + '/channelstats';
options.form = {}; options.form = {};
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'ChannelStats', msg: 'Channel Stats Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Channel Stats Response', data: body});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel States Received'});
res.status(201).json(body); res.status(201).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -137,7 +141,7 @@ exports.getChannelStats = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'ChannelStats', lineNum: 54, msg: 'Get Channel Stats Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'ChannelStats', msg: 'Get Channel Stats Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Channel Stats Failed!", message: "Channel Stats Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -146,19 +150,21 @@ exports.getChannelStats = (req, res, next) => {
} }
exports.openChannel = (req, res, next) => { exports.openChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/open'; options.url = common.getSelLNServerUrl() + '/open';
options.form = req.body; options.form = req.body;
logger.info({fileName: 'Channels', msg: 'Open Channel Params: ' + JSON.stringify(options.form)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Params', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Open Channel Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 140, msg: 'Open Channel Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open Channel Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Open Channel Failed!', message: 'Open Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Opened'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -170,7 +176,7 @@ exports.openChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Channels', lineNum: 58, msg: 'Open Channel Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open Channel Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Open Channel Failed!", message: "Open Channel Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -179,12 +185,14 @@ exports.openChannel = (req, res, next) => {
} }
exports.updateChannelRelayFee = (req, res, next) => { exports.updateChannelRelayFee = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Relay Fee..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/updaterelayfee'; options.url = common.getSelLNServerUrl() + '/updaterelayfee';
options.form = req.query; options.form = req.query;
logger.info({fileName: 'Channels', msg: 'Update Relay Fee Params: ' + JSON.stringify(options.form)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Relay Fee Params', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Update Relay Fee Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Relay Fee Response', data: body});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Relay Fee Updated'});
res.status(201).json(body); res.status(201).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -195,7 +203,7 @@ exports.updateChannelRelayFee = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Channels', lineNum: 186, msg: 'Update Relay Fee Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Relay Fee Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Update Relay Fee Failed!", message: "Update Relay Fee Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -206,15 +214,17 @@ exports.updateChannelRelayFee = (req, res, next) => {
exports.closeChannel = (req, res, next) => { exports.closeChannel = (req, res, next) => {
options = common.getOptions(); options = common.getOptions();
if (req.query.force !== 'true') { if (req.query.force !== 'true') {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Closing Channel..'});
options.url = common.getSelLNServerUrl() + '/close'; options.url = common.getSelLNServerUrl() + '/close';
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Force Closing Channel..'});
options.url = common.getSelLNServerUrl() + '/forceclose'; options.url = common.getSelLNServerUrl() + '/forceclose';
} }
options.form = { channelId: req.query.channelId }; options.form = { channelId: req.query.channelId };
logger.info({fileName: 'Channels', msg: 'Close Channel URL: ' + JSON.stringify(options.url)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: '[Close URL, Close Params]', data: [options.url, options.form]});
logger.info({fileName: 'Channels', msg: 'Close Channel Params: ' + JSON.stringify(options.form)});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Close Channel Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Close Channel Response', data: body});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Closed'});
res.status(204).json(body); res.status(204).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -225,7 +235,7 @@ exports.closeChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Channels', lineNum: 217, msg: 'Close Channel Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Close Channel Failed!", message: "Close Channel Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"

@ -1,16 +1,14 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
arrangeFees = (body, current_time) => { arrangeFees = (body, current_time) => {
let fees = { daily_fee: 0, daily_txs: 0, weekly_fee: 0, weekly_txs: 0, monthly_fee: 0, monthly_txs: 0 }; let fees = { daily_fee: 0, daily_txs: 0, weekly_fee: 0, weekly_txs: 0, monthly_fee: 0, monthly_txs: 0 };
let month_start_time = current_time - 2629743000;
let week_start_time = current_time - 604800000; let week_start_time = current_time - 604800000;
let day_start_time = current_time - 86400000; let day_start_time = current_time - 86400000;
let fee = 0; let fee = 0;
body.relayed.forEach(relayedEle => { body.relayed.forEach(relayedEle => {
logger.info({fileName: 'Fees', msg: 'Fee Relayed Transaction: ' + JSON.stringify(relayedEle)});
fee = Math.round((relayedEle.amountIn - relayedEle.amountOut)/1000); fee = Math.round((relayedEle.amountIn - relayedEle.amountOut)/1000);
if (relayedEle.timestamp >= day_start_time) { if (relayedEle.timestamp >= day_start_time) {
fees.daily_fee = fees.daily_fee + fee; fees.daily_fee = fees.daily_fee + fee;
@ -20,12 +18,10 @@ arrangeFees = (body, current_time) => {
fees.weekly_fee = fees.weekly_fee + fee; fees.weekly_fee = fees.weekly_fee + fee;
fees.weekly_txs = fees.weekly_txs + 1; fees.weekly_txs = fees.weekly_txs + 1;
} }
if (relayedEle.timestamp >= month_start_time) { fees.monthly_fee = fees.monthly_fee + fee;
fees.monthly_fee = fees.monthly_fee + fee; fees.monthly_txs = fees.monthly_txs + 1;
fees.monthly_txs = fees.monthly_txs + 1;
}
}); });
logger.info({fileName: 'Fees', msg: JSON.stringify(fees)}); logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Arranged Fee', data: fees});
return fees; return fees;
}; };
@ -39,10 +35,8 @@ arrangePayments = (body) => {
if (sentEle.recipientAmount) { sentEle.recipientAmount = Math.round(sentEle.recipientAmount/1000); } if (sentEle.recipientAmount) { sentEle.recipientAmount = Math.round(sentEle.recipientAmount/1000); }
if (sentEle.parts && sentEle.parts.length > 0) { if (sentEle.parts && sentEle.parts.length > 0) {
sentEle.firstPartTimestamp = sentEle.parts[0].timestamp; sentEle.firstPartTimestamp = sentEle.parts[0].timestamp;
sentEle.firstPartTimestampStr = (!sentEle.firstPartTimestamp) ? '' : common.convertTimestampToDate(Math.round(sentEle.firstPartTimestamp / 1000));
} }
sentEle.parts.forEach(part => { sentEle.parts.forEach(part => {
part.timestampStr = (!part.timestamp) ? '' : common.convertTimestampToDate(Math.round(part.timestamp / 1000));
if (part.amount) { part.amount = Math.round(part.amount/1000); } if (part.amount) { part.amount = Math.round(part.amount/1000); }
if (part.feesPaid) { part.feesPaid = Math.round(part.feesPaid/1000); } if (part.feesPaid) { part.feesPaid = Math.round(part.feesPaid/1000); }
}); });
@ -50,41 +44,40 @@ arrangePayments = (body) => {
payments.received.forEach(receivedEle => { payments.received.forEach(receivedEle => {
if (receivedEle.parts && receivedEle.parts.length > 0) { if (receivedEle.parts && receivedEle.parts.length > 0) {
receivedEle.firstPartTimestamp = receivedEle.parts[0].timestamp; receivedEle.firstPartTimestamp = receivedEle.parts[0].timestamp;
receivedEle.firstPartTimestampStr = (!receivedEle.firstPartTimestamp) ? '' : common.convertTimestampToDate(Math.round(receivedEle.firstPartTimestamp / 1000));
} }
receivedEle.parts.forEach(part => { receivedEle.parts.forEach(part => {
part.timestampStr = (!part.timestamp) ? '' : common.convertTimestampToDate(Math.round(part.timestamp / 1000));
if (part.amount) { part.amount = Math.round(part.amount/1000); } if (part.amount) { part.amount = Math.round(part.amount/1000); }
}); });
}); });
payments.relayed.forEach(relayedEle => { payments.relayed.forEach(relayedEle => {
logger.info({fileName: 'Fees', msg: 'Payment Relayed Transaction: ' + JSON.stringify(relayedEle)});
relayedEle.timestampStr = (!relayedEle.timestamp) ? '' : common.convertTimestampToDate(Math.round(relayedEle.timestamp / 1000));
if (relayedEle.amountIn) { relayedEle.amountIn = Math.round(relayedEle.amountIn/1000); } if (relayedEle.amountIn) { relayedEle.amountIn = Math.round(relayedEle.amountIn/1000); }
if (relayedEle.amountOut) { relayedEle.amountOut = Math.round(relayedEle.amountOut/1000); } if (relayedEle.amountOut) { relayedEle.amountOut = Math.round(relayedEle.amountOut/1000); }
}); });
payments.sent = common.sortDescByKey(payments.sent, 'firstPartTimestamp'); payments.sent = common.sortDescByKey(payments.sent, 'firstPartTimestamp');
payments.received = common.sortDescByKey(payments.received, 'firstPartTimestamp'); payments.received = common.sortDescByKey(payments.received, 'firstPartTimestamp');
payments.relayed = common.sortDescByKey(payments.relayed, 'timestamp'); payments.relayed = common.sortDescByKey(payments.relayed, 'timestamp');
logger.info({fileName: 'Fees', msg: JSON.stringify(payments)}); logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Arranged Payments', data: payments});
return payments; return payments;
}; };
exports.getFees = (req, res, next) => { exports.getFees = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/audit'; options.url = common.getSelLNServerUrl() + '/audit';
let today = new Date(Date.now()); let today = new Date(Date.now());
let tillToday = Math.floor(today / 1000); let tillToday = (Math.round(today.getTime()/1000)).toString();
let fromLastMonth = Math.round((new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime()) / 1000); let fromLastMonth = (Math.round(new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime()/1000)).toString();
options.form = { options.form = {
from: fromLastMonth, from: fromLastMonth,
to: tillToday to: tillToday
}; };
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Fee Audit Options', data: options.form});
if (common.read_dummy_data) { if (common.read_dummy_data) {
common.getDummyData('Fees').then(function(data) { res.status(200).json(arrangeFees(data, 1609796725000)); }); common.getDummyData('Fees').then(function(data) { res.status(200).json(arrangeFees(data, Math.round((new Date().getTime())))); });
} else { } else {
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Fees', msg: 'Fee Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Fee Response', data: body});
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Fee Received'});
res.status(200).json(arrangeFees(body, Math.round((new Date().getTime())))); res.status(200).json(arrangeFees(body, Math.round((new Date().getTime()))));
}) })
.catch(errRes => { .catch(errRes => {
@ -95,7 +88,7 @@ exports.getFees = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Fees', lineNum: 51, msg: 'Get Fees Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Fees Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Fees failed!", message: "Fetching Fees failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -105,6 +98,7 @@ exports.getFees = (req, res, next) => {
}; };
exports.getPayments = (req, res, next) => { exports.getPayments = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Getting Payments..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/audit'; options.url = common.getSelLNServerUrl() + '/audit';
options.form = null; options.form = null;
@ -112,7 +106,8 @@ exports.getPayments = (req, res, next) => {
common.getDummyData('Payments').then(function(data) { res.status(200).json(arrangePayments(data)); }); common.getDummyData('Payments').then(function(data) { res.status(200).json(arrangePayments(data)); });
} else { } else {
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Fees', msg: 'Payments Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Payments Response', data: body});
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Payments Received'});
res.status(200).json(arrangePayments(body)); res.status(200).json(arrangePayments(body));
}) })
.catch(errRes => { .catch(errRes => {
@ -123,7 +118,7 @@ exports.getPayments = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Fees', lineNum: 113, msg: 'Get Payments Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Payments Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Payments failed!", message: "Fetching Payments failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"

@ -1,15 +1,16 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getInfo = (req, res, next) => { exports.getInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'Getting Eclair Node Information..'});
common.setOptions(); common.setOptions();
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/getinfo'; options.url = common.getSelLNServerUrl() + '/getinfo';
options.form = {}; options.form = {};
logger.info({fileName:'GetInfo', msg: 'Selected Node: ' + JSON.stringify(common.selectedNode.ln_node)}); logger.log({level: 'DEBUG', fileName:'GetInfo', msg: 'Selected Node', data: common.selectedNode.ln_node});
logger.info({fileName: 'GetInfo', msg: 'Calling Info from Eclair server url: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Calling Info from Eclair server url', data: options.url});
if (common.read_dummy_data) { if (common.read_dummy_data) {
common.getDummyData('GetInfo').then(function(data) { common.getDummyData('GetInfo').then(function(data) {
data.currency_unit = 'BTC'; data.currency_unit = 'BTC';
@ -19,19 +20,20 @@ exports.getInfo = (req, res, next) => {
}); });
} else { } else {
if (!options.headers || !options.headers.authorization) { if (!options.headers || !options.headers.authorization) {
logger.error({fileName: 'GetInfo', lineNum: 13, msg: 'Eclair Get info failed due to missing or wrong password!'}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Eclair Get info failed due to missing or wrong password!', error: {error: 'Missing or wrong password.'}});
res.status(502).json({ res.status(502).json({
message: "Fetching Info Failed!", message: "Fetching Info Failed!",
error: "Missing Or Wrong Password" error: "Missing Or Wrong Password"
}); });
} else { } else {
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'GetInfo', msg: 'Get Info Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Get Info Response', data: body});
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
body.currency_unit = 'BTC'; body.currency_unit = 'BTC';
body.smaller_currency_unit = 'Sats'; body.smaller_currency_unit = 'Sats';
body.lnImplementation = 'Eclair'; body.lnImplementation = 'Eclair';
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'Eclair Node Information Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -42,7 +44,7 @@ exports.getInfo = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'GetInfo', lineNum: 57, msg: 'Get Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Info failed!", message: "Fetching Info failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"

@ -1,42 +1,37 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
var pendingInvoices = []; var pendingInvoices = [];
getReceivedPaymentInfo = (invoice) => { getReceivedPaymentInfo = (invoice) => {
logger.info({fileName: 'Invoice', msg: 'Invoice Received: ' + JSON.stringify(invoice)});
let idx = -1; let idx = -1;
return new Promise(function(resolve, reject) { invoice.expiresAt = (!invoice.expiry) ? null : (+invoice.timestamp + +invoice.expiry);
invoice.timestampStr = (!invoice.timestamp) ? '' : common.convertTimestampToDate(invoice.timestamp); if (invoice.amount) { invoice.amount = Math.round(invoice.amount/1000); }
invoice.expiresAt = (!invoice.expiry) ? null : (+invoice.timestamp + +invoice.expiry); idx = pendingInvoices.findIndex(pendingInvoice => invoice.serialized === pendingInvoice.serialized);
invoice.expiresAtStr = (!invoice.expiresAt) ? '' : common.convertTimestampToDate(invoice.expiresAt); if (idx < 0) {
if (invoice.amount) { invoice.amount = Math.round(invoice.amount/1000); } options.url = common.getSelLNServerUrl() + '/getreceivedinfo';
idx = pendingInvoices.findIndex(pendingInvoice => invoice.serialized === pendingInvoice.serialized); options.form = { paymentHash: invoice.paymentHash };
if (idx < 0) { return request(options).then(response => {
options.url = common.getSelLNServerUrl() + '/getreceivedinfo'; invoice.status = response.status.type;
options.form = { paymentHash: invoice.paymentHash }; if (response.status && response.status.type === 'received') {
request(options).then(response => { invoice.amountSettled = response.status.amount ? Math.round(response.status.amount/1000) : 0;
invoice.status = response.status.type; invoice.receivedAt = response.status.receivedAt ? Math.round(response.status.receivedAt / 1000) : 0;
if (response.status && response.status.type === 'received') { }
invoice.amountSettled = response.status.amount ? Math.round(response.status.amount/1000) : 0; return invoice;
invoice.receivedAt = response.status.receivedAt ? Math.round(response.status.receivedAt / 1000) : 0; }).catch(err => {
invoice.receivedAtStr = response.status.receivedAt ? common.convertTimestampToDate(invoice.receivedAt) : ''; invoice.status = 'unknown';
} return invoice;
resolve(invoice); });
}).catch(err => { } else {
invoice.status = 'unknown'; pendingInvoices.splice(idx, 1);
resolve(invoice); invoice.status = 'unpaid';
}); return invoice;
} else { }
pendingInvoices.splice(idx, 1);
invoice.status = 'unpaid';
resolve(invoice);
}
});
} }
exports.listInvoices = (req, res, next) => { exports.listInvoices = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Getting List Invoices..'});
options = common.getOptions(); options = common.getOptions();
options.form = {}; options.form = {};
options1 = JSON.parse(JSON.stringify(options)); options1 = JSON.parse(JSON.stringify(options));
@ -45,59 +40,75 @@ exports.listInvoices = (req, res, next) => {
options2 = JSON.parse(JSON.stringify(options)); options2 = JSON.parse(JSON.stringify(options));
options2.url = common.getSelLNServerUrl() + '/listpendinginvoices'; options2.url = common.getSelLNServerUrl() + '/listpendinginvoices';
options2.form = {}; options2.form = {};
Promise.all([request(options1), request(options2)]) if (common.read_dummy_data) {
.then(body => { common.getDummyData('Invoices').then(function(body) {
logger.info({fileName: 'Invoice', msg: 'Invoices List Received: ' + JSON.stringify(body)}); let invoices = (!body[0] || body[0].length <= 0) ? [] : body[0];
let invoices = (!body[0] || body[0].length <= 0) ? [] : body[0]; pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1];
pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1]; return Promise.all(invoices.map(invoice => getReceivedPaymentInfo(invoice)))
if (invoices && invoices.length > 0) {
Promise.all(invoices.map(invoice => getReceivedPaymentInfo(invoice)))
.then(values => { .then(values => {
body = common.sortDescByKey(invoices, 'expiresAt'); body = common.sortDescByKey(invoices, 'expiresAt');
logger.info({fileName: 'Invoice', msg: 'Final Invoices List: ' + JSON.stringify(invoices)});
res.status(200).json(invoices); res.status(200).json(invoices);
}) });
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.authorization) {
delete err.options.headers.authorization;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization;
}
logger.error({fileName: 'Invoice', lineNum: 66, msg: 'List Invoices Error: ' + JSON.stringify(err)});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Invoices failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
});
} else {
res.status(200).json([]);
}
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.authorization) {
delete err.options.headers.authorization;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization;
}
logger.error({fileName: 'Invoice', lineNum: 84, msg: 'List Invoices Error: ' + JSON.stringify(err)});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Invoices failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
}); });
}); } else {
return Promise.all([request(options1), request(options2)])
.then(body => {
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body});
let invoices = (!body[0] || body[0].length <= 0) ? [] : body[0];
pendingInvoices = (!body[1] || body[1].length <= 0) ? [] : body[1];
if (invoices && invoices.length > 0) {
return Promise.all(invoices.map(invoice => getReceivedPaymentInfo(invoice)))
.then(values => {
body = common.sortDescByKey(invoices, 'expiresAt');
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Final Invoices List', data: invoices});
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'List Invoices Received'});
res.status(200).json(invoices);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.authorization) {
delete err.options.headers.authorization;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization;
}
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoices Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Invoices failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
});
} else {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Empty List Invoice Received'});
res.status(200).json([]);
}
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.authorization) {
delete err.options.headers.authorization;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization;
}
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoices Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Invoices failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
});
}
}; };
exports.createInvoice = (req, res, next) => { exports.createInvoice = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Creating Invoice..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/createinvoice'; options.url = common.getSelLNServerUrl() + '/createinvoice';
options.form = req.body; options.form = req.body;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Invoice', msg: 'Create Invoice Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Create Invoice Response', data: body});
if (body.amount) { body.amount = Math.round(body.amount/1000); } if (body.amount) { body.amount = Math.round(body.amount/1000); }
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Invoice Created'});
res.status(201).json(body); res.status(201).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -108,7 +119,7 @@ exports.createInvoice = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Invoice', lineNum: 108, msg: 'Create Invoice Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Create Invoice Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Create Invoice Failed!", message: "Create Invoice Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"

@ -1,17 +1,16 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getNodes = (req, res, next) => { exports.getNodes = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Network', msg: 'Node Lookup..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/nodes'; options.url = common.getSelLNServerUrl() + '/nodes';
options.form = { nodeIds: req.params.id }; options.form = { nodeIds: req.params.id };
request.post(options).then(function (body) { request.post(options).then(function (body) {
logger.info({fileName: 'Network', msg: 'Node Lookup: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Network', msg: 'Node Lookup', data: body});
body.forEach(node => { logger.log({level: 'INFO', fileName: 'Network', msg: 'Node Lookup Finished'});
node.timestampStr = (node.timestamp) ? common.convertTimestampToDate(node.timestamp) : '';
});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -22,7 +21,7 @@ exports.getNodes = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Network', lineNum: 49, msg: 'Node Lookup Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Network', msg: 'Node Lookup Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: 'Node Lookup Failed!', message: 'Node Lookup Failed!',
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"

@ -1,5 +1,5 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
@ -22,11 +22,13 @@ arrangeBalances = (body) => {
}; };
exports.getNewAddress = (req, res, next) => { exports.getNewAddress = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Generating New Address..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/getnewaddress'; options.url = common.getSelLNServerUrl() + '/getnewaddress';
options.form = {}; options.form = {};
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Onchain', msg: JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Onchain', msg: 'New Address Generated', data: body});
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'New Address Generated'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -37,7 +39,7 @@ exports.getNewAddress = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Onchain', lineNum: 21, msg: 'Get New Address Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Onchain', msg: 'Get New Address Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Getting New Address failed!", message: "Getting New Address failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -46,6 +48,7 @@ exports.getNewAddress = (req, res, next) => {
}; };
exports.getBalance = (req, res, next) => { exports.getBalance = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Getting On Chain Balance..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/onchainbalance'; options.url = common.getSelLNServerUrl() + '/onchainbalance';
options.form = {}; options.form = {};
@ -53,7 +56,8 @@ exports.getBalance = (req, res, next) => {
common.getDummyData('OnChainBalance').then(function(data) { res.status(200).json(arrangeBalances(data)); }); common.getDummyData('OnChainBalance').then(function(data) { res.status(200).json(arrangeBalances(data)); });
} else { } else {
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Onchain', msg: 'Balance Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Onchain', msg: 'Balance Received', data: body});
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'On Chain Balance Received'});
res.status(200).json(arrangeBalances(body)); res.status(200).json(arrangeBalances(body));
}) })
.catch(errRes => { .catch(errRes => {
@ -64,7 +68,7 @@ exports.getBalance = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Onchain', lineNum: 58, msg: 'Fetch Balance Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Onchain', msg: 'Fetch Balance Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching balance failed!", message: "Fetching balance failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -74,20 +78,20 @@ exports.getBalance = (req, res, next) => {
}; };
exports.getTransactions = (req, res, next) => { exports.getTransactions = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Getting On Chain Transactions..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/onchaintransactions'; options.url = common.getSelLNServerUrl() + '/onchaintransactions';
options.form = { options.form = {
count: req.query.count, count: req.query.count,
skip: req.query.skip skip: req.query.skip
}; };
logger.log({level: 'DEBUG', fileName: 'OnChain', msg: 'Getting On Chain Transactions Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Transactions', msg: 'Transaction Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'OnChain', msg: 'Transaction Received', data: body});
if (body && body.length > 0) { if (body && body.length > 0) {
body.forEach(transaction => {
transaction.timestampStr = (!transaction.timestamp) ? '' : common.convertTimestampToDate(transaction.timestamp);
});
body = common.sortDescByKey(body, 'timestamp'); body = common.sortDescByKey(body, 'timestamp');
} }
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'On Chain Transaction Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -98,7 +102,7 @@ exports.getTransactions = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Onchain', lineNum: 101, msg: 'Get Transactions Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Onchain', msg: 'Get Transactions Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Getting transactions failed!", message: "Getting transactions failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -107,6 +111,7 @@ exports.getTransactions = (req, res, next) => {
}; };
exports.sendFunds = (req, res, next) => { exports.sendFunds = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Sending On Chain Funds..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/sendonchain'; options.url = common.getSelLNServerUrl() + '/sendonchain';
options.form = { options.form = {
@ -114,8 +119,10 @@ exports.sendFunds = (req, res, next) => {
amountSatoshis: req.body.amount, amountSatoshis: req.body.amount,
confirmationTarget: req.body.blocks confirmationTarget: req.body.blocks
}; };
logger.log({level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Onchain', msg: 'Send Funds Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Onchain', msg: 'Send Funds Response', data: body});
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'On Chain Fund Sent'});
res.status(201).json(body); res.status(201).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -126,7 +133,7 @@ exports.sendFunds = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Onchain', lineNum: 129, msg: 'Send Funds Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Onchain', msg: 'Send Funds Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Send funds failed!", message: "Send funds failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"

@ -1,29 +1,28 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
getQueryNodes = (nodeIds) => { getQueryNodes = (nodeIds) => {
return new Promise(function(resolve, reject) { options.url = common.getSelLNServerUrl() + '/nodes';
options.url = common.getSelLNServerUrl() + '/nodes'; options.form = { nodeIds: nodeIds };
options.form = { nodeIds: nodeIds }; return request.post(options).then(function(nodes) {
request.post(options).then(function(nodes) { logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Query Nodes', data: nodes});
logger.info({fileName: 'Payments', msg: 'Query Nodes: ' + JSON.stringify(nodes)}); return nodes;
resolve(nodes); }).catch(err => {
}).catch(err => { return [];
resolve([]);
});
}); });
} }
exports.decodePayment = (req, res, next) => { exports.decodePayment = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Decoding Payment..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/parseinvoice'; options.url = common.getSelLNServerUrl() + '/parseinvoice';
options.form = { invoice: req.params.invoice }; options.form = { invoice: req.params.invoice };
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Payments', msg: 'Payment Decode Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: body});
body.timestampStr = (!body.timestamp) ? '' : common.convertTimestampToDate(body.timestamp);
if (body.amount) { body.amount = Math.round(body.amount/1000); } if (body.amount) { body.amount = Math.round(body.amount/1000); }
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -34,7 +33,7 @@ exports.decodePayment = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Payments', lineNum: 22, msg: 'Payment Decode Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Payment Decode Failed!", message: "Payment Decode Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -43,11 +42,14 @@ exports.decodePayment = (req, res, next) => {
}; };
exports.postPayment = (req, res, next) => { exports.postPayment = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Paying Invoice..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/payinvoice'; options.url = common.getSelLNServerUrl() + '/payinvoice';
options.form = req.body; options.form = req.body;
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Payments', msg: 'Send Payment Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Response', data: body});
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Invoice Paid'});
res.status(201).json(body); res.status(201).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -58,7 +60,7 @@ exports.postPayment = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Payments', lineNum: 46, msg: 'Send Payment Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payment Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Send Payment Failed!", message: "Send Payment Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -67,26 +69,30 @@ exports.postPayment = (req, res, next) => {
}; };
exports.queryPaymentRoute = (req, res, next) => { exports.queryPaymentRoute = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Querying Payment Route..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/findroutetonode'; options.url = common.getSelLNServerUrl() + '/findroutetonode';
options.form = { options.form = {
nodeId: req.query.nodeId, nodeId: req.query.nodeId,
amountMsat: req.query.amountMsat amountMsat: req.query.amountMsat
}; };
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Query Payment Route Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Payments', msg: 'Query Payment Route Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Query Payment Route Received', data: body});
if (body && body.length) { if (body && body.length) {
let queryRoutes = []; let queryRoutes = [];
getQueryNodes(body).then(function(hopsWithAlias) { return getQueryNodes(body).then(function(hopsWithAlias) {
let foundPeer = {}; let foundPeer = {};
body.map(hop => { body.map(hop => {
foundPeer = hopsWithAlias.find(hopWithAlias => hop === hopWithAlias.nodeId); foundPeer = hopsWithAlias.find(hopWithAlias => hop === hopWithAlias.nodeId);
queryRoutes.push({nodeId: hop, alias: foundPeer ? foundPeer.alias : ''}); queryRoutes.push({nodeId: hop, alias: foundPeer ? foundPeer.alias : ''});
}); });
logger.info({fileName: 'Payments', msg: 'Query Routes with Alias: ' + JSON.stringify(queryRoutes)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Query Routes with Alias', data: queryRoutes});
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Route Information Received'});
res.status(200).json(queryRoutes); res.status(200).json(queryRoutes);
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Empty Payment Route Information Received'});
res.status(200).json([]); res.status(200).json([]);
} }
}) })
@ -98,7 +104,7 @@ exports.queryPaymentRoute = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Payments', lineNum: 109, msg: 'Query Payment Route Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Query Payment Route Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Query Payment Route Failed!", message: "Query Payment Route Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -107,12 +113,15 @@ exports.queryPaymentRoute = (req, res, next) => {
}; };
exports.getSentPaymentsInformation = (req, res, next) => { exports.getSentPaymentsInformation = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Getting Sent Payment Information..'});
options = common.getOptions(); options = common.getOptions();
if (req.body.payments) { if (req.body.payments) {
let paymentsArr = req.body.payments.split(','); let paymentsArr = req.body.payments.split(',');
Promise.all(paymentsArr.map(payment => {return getSentInfoFromPaymentRequest(payment)})) return Promise.all(paymentsArr.map(payment => {return getSentInfoFromPaymentRequest(payment)}))
.then(function(values) { .then(function(values) {
logger.info({fileName: 'Payments', msg: 'Payment Sent Informations: ' + JSON.stringify(values)}); console.warn(values);
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment Sent Informations', data: values});
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Sent Payment Information Received'});
res.status(200).json(values); res.status(200).json(values);
}) })
.catch(errRes => { .catch(errRes => {
@ -123,13 +132,14 @@ exports.getSentPaymentsInformation = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Payments', lineNum: 126, msg: 'Payment Sent Information Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Sent Information Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Payment Sent Information Failed!", message: "Payment Sent Information Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
}); });
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Empty Sent Payment Information Received'});
res.status(200).json([]); res.status(200).json([]);
} }
}; };
@ -137,16 +147,13 @@ exports.getSentPaymentsInformation = (req, res, next) => {
getSentInfoFromPaymentRequest = (payment) => { getSentInfoFromPaymentRequest = (payment) => {
options.url = common.getSelLNServerUrl() + '/getsentinfo'; options.url = common.getSelLNServerUrl() + '/getsentinfo';
options.form = { paymentHash: payment }; options.form = { paymentHash: payment };
return new Promise(function(resolve, reject) { return request.post(options).then((body) => {
request.post(options).then((body) => { logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment Sent Information Received', data: body});
logger.info({fileName: 'Payments', msg: 'Payment Sent Information Received: ' + JSON.stringify(body)}); body.forEach(sentPayment => {
body.forEach(sentPayment => { if (sentPayment.amount) { sentPayment.amount = Math.round(sentPayment.amount/1000); }
sentPayment.createdAtStr = (!sentPayment.createdAt) ? '' : common.convertTimestampToDate(sentPayment.createdAt); if (sentPayment.recipientAmount) { sentPayment.recipientAmount = Math.round(sentPayment.recipientAmount/1000); }
if (sentPayment.amount) { sentPayment.amount = Math.round(sentPayment.amount/1000); } });
if (sentPayment.recipientAmount) { sentPayment.recipientAmount = Math.round(sentPayment.recipientAmount/1000); } return body;
}); })
resolve(body); .catch(err => err);
})
.catch(err => resolve(err));
});
} }

@ -1,22 +1,21 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
getFilteredNodes = (peersNodeIds) => { getFilteredNodes = (peersNodeIds) => {
return new Promise(function(resolve, reject) { options.url = common.getSelLNServerUrl() + '/nodes';
options.url = common.getSelLNServerUrl() + '/nodes'; options.form = { nodeIds: peersNodeIds };
options.form = { nodeIds: peersNodeIds }; return request.post(options).then(function(nodes) {
request.post(options).then(function(nodes) { logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Filtered Nodes', data: nodes});
logger.info({fileName: 'Peers', msg: 'Filtered Nodes: ' + JSON.stringify(nodes)}); return nodes;
resolve(nodes); }).catch(err => {
}).catch(err => { return [];
resolve([]);
});
}); });
} }
exports.getPeers = (req, res, next) => { exports.getPeers = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Getting Peers..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/peers'; options.url = common.getSelLNServerUrl() + '/peers';
options.form = {}; options.form = {};
@ -24,22 +23,24 @@ exports.getPeers = (req, res, next) => {
common.getDummyData('Peers').then(function(data) { res.status(200).json(data); }); common.getDummyData('Peers').then(function(data) { res.status(200).json(data); });
} else { } else {
request.post(options).then(function (body) { request.post(options).then(function (body) {
logger.info({fileName: 'Peers', msg: 'Peers Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peers Received', data: body});
if (body && body.length) { if (body && body.length) {
let peersNodeIds = ''; let peersNodeIds = '';
body.forEach(peer => { peersNodeIds = peersNodeIds + ',' + peer.nodeId; }); body.forEach(peer => { peersNodeIds = peersNodeIds + ',' + peer.nodeId; });
peersNodeIds = peersNodeIds.substring(1); peersNodeIds = peersNodeIds.substring(1);
getFilteredNodes(peersNodeIds).then(function(peersWithAlias) { return getFilteredNodes(peersNodeIds).then(function(peersWithAlias) {
let foundPeer = {}; let foundPeer = {};
body.map(peer => { body.map(peer => {
foundPeer = peersWithAlias.find(peerWithAlias => peer.nodeId === peerWithAlias.nodeId); foundPeer = peersWithAlias.find(peerWithAlias => peer.nodeId === peerWithAlias.nodeId);
peer.alias = foundPeer ? foundPeer.alias : peer.nodeId.substring(0, 20); peer.alias = foundPeer ? foundPeer.alias : peer.nodeId.substring(0, 20);
}); });
body = common.sortDescByStrKey(body, 'alias'); body = common.sortDescByStrKey(body, 'alias');
logger.info({fileName: 'Peers', msg: 'Peers with Alias: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peers with Alias', data: body});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peers Received'});
res.status(200).json(body); res.status(200).json(body);
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Empty Peers Received'});
res.status(200).json([]); res.status(200).json([]);
} }
}) })
@ -51,7 +52,7 @@ exports.getPeers = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Peers', lineNum: 49, msg: 'Get Peers Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Get Peers Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: 'Fetching Peers Failed!', message: 'Fetching Peers Failed!',
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -61,15 +62,16 @@ exports.getPeers = (req, res, next) => {
}; };
exports.connectPeer = (req, res, next) => { exports.connectPeer = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Conneting Peer..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/connect'; options.url = common.getSelLNServerUrl() + '/connect';
options.form = {}; options.form = {};
if (req.query) { if (req.query) {
options.form = req.query; options.form = req.query;
logger.info({fileName: 'Peers', msg: 'Connect Peer Params: ' + JSON.stringify(options.form)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Connect Peer Params', data: options.form});
} }
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.info({fileName: 'Peers', msg: 'Add Peer Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Add Peer Response', data: body});
if (body === 'already connected') { if (body === 'already connected') {
return res.status(500).json({ return res.status(500).json({
message: "Connect Peer Failed!", message: "Connect Peer Failed!",
@ -84,12 +86,12 @@ exports.connectPeer = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/peers'; options.url = common.getSelLNServerUrl() + '/peers';
options.form = {}; options.form = {};
request.post(options).then(function (body) { request.post(options).then(function (body) {
logger.info({fileName: 'Peers', msg: 'Peers Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peers Received', data: body});
if (body && body.length) { if (body && body.length) {
let peersNodeIds = ''; let peersNodeIds = '';
body.forEach(peer => { peersNodeIds = peersNodeIds + ',' + peer.nodeId; }); body.forEach(peer => { peersNodeIds = peersNodeIds + ',' + peer.nodeId; });
peersNodeIds = peersNodeIds.substring(1); peersNodeIds = peersNodeIds.substring(1);
getFilteredNodes(peersNodeIds).then(function(peersWithAlias) { return getFilteredNodes(peersNodeIds).then(function(peersWithAlias) {
let foundPeer = {}; let foundPeer = {};
body.map(peer => { body.map(peer => {
foundPeer = peersWithAlias.find(peerWithAlias => peer.nodeId === peerWithAlias.nodeId); foundPeer = peersWithAlias.find(peerWithAlias => peer.nodeId === peerWithAlias.nodeId);
@ -97,8 +99,9 @@ exports.connectPeer = (req, res, next) => {
}); });
let peers = (body) ? common.sortDescByStrKey(body, 'alias') : []; let peers = (body) ? common.sortDescByStrKey(body, 'alias') : [];
peers = common.newestOnTop(peers, 'nodeId', req.query.nodeId ? req.query.nodeId : req.query.uri ? req.query.uri.substring(0, req.query.uri.indexOf('@')) : ''); peers = common.newestOnTop(peers, 'nodeId', req.query.nodeId ? req.query.nodeId : req.query.uri ? req.query.uri.substring(0, req.query.uri.indexOf('@')) : '');
logger.info({fileName: 'Peers', msg: 'Peer with Newest On Top: ' + JSON.stringify(peers)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Newest On Top', data: peers});
logger.info({fileName: 'Peers', msg: 'Peer Added Successfully'}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added Successfully'});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Connected'});
res.status(201).json(peers); res.status(201).json(peers);
}); });
} else { } else {
@ -112,7 +115,7 @@ exports.connectPeer = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Peers', lineNum: 89, msg: 'Connect Peer Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Connect Peer Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Connect Peer Failed!", message: "Connect Peer Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -126,7 +129,7 @@ exports.connectPeer = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Peers', lineNum: 103, msg: 'Connect Peer Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Connect Peer Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Connect Peer Failed!", message: "Connect Peer Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
@ -135,16 +138,18 @@ exports.connectPeer = (req, res, next) => {
}; };
exports.deletePeer = (req, res, next) => { exports.deletePeer = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Disconneting Peer..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/disconnect'; options.url = common.getSelLNServerUrl() + '/disconnect';
options.form = {}; options.form = {};
if (req.params.nodeId) { if (req.params.nodeId) {
options.form = { nodeId: req.params.nodeId }; options.form = { nodeId: req.params.nodeId };
logger.info({fileName: 'Peers', msg: 'Disconnect Peer Params: ' + JSON.stringify(options.form)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Disconnect Peer Params', data: options.form});
} }
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.info({fileName: 'Peers', msg: 'Disconnect Peer Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Disconnect Peer Response', data: body});
logger.info({fileName: 'Peers', msg: 'Peer Disconnected: ' + req.params.nodeId}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Disconnected: ' + req.params.nodeId});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected'});
res.status(204).json(body); res.status(204).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -155,7 +160,7 @@ exports.deletePeer = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.authorization) {
delete err.response.request.headers.authorization; delete err.response.request.headers.authorization;
} }
logger.error({fileName: 'Peers', lineNum: 132, msg: 'Disconnect Peer Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Disconnect Peer Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({ return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Disconnect Peer Failed!", message: "Disconnect Peer Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error" error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"

@ -1,14 +1,15 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getBalance = (req, res, next) => { exports.getBalance = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Balance', msg: 'Getting Balance..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/balance/' + req.params.source; options.url = common.getSelLNServerUrl() + '/v1/balance/' + req.params.source;
options.qs = req.query; options.qs = req.query;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Balance', msg: 'Request params: ' + JSON.stringify(req.params) + 'Request Query: ' + JSON.stringify(req.query) + ' Balance Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Balance', msg: '[Request params, Request Query, Balance Received]', data: [req.params, req.query, body]});
if (body) { if (body) {
if (req.params.source === 'blockchain') { if (req.params.source === 'blockchain') {
if (!body.total_balance) { body.total_balance = 0; } if (!body.total_balance) { body.total_balance = 0; }
@ -24,6 +25,7 @@ exports.getBalance = (req, res, next) => {
body.btc_balance = common.convertToBTC(body.balance); body.btc_balance = common.convertToBTC(body.balance);
body.btc_pending_open_balance = common.convertToBTC(body.pending_open_balance); body.btc_pending_open_balance = common.convertToBTC(body.pending_open_balance);
} }
logger.log({level: 'INFO', fileName: 'Balance', msg: 'Balance Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -35,7 +37,7 @@ exports.getBalance = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Balance', lineNum: 38, msg: 'Fetch Balance Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Balance', msg: 'Fetch Balance Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching balance failed!", message: "Fetching balance failed!",
error: err.error error: err.error

@ -1,25 +1,24 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
getAliasForChannel = (channel) => { getAliasForChannel = (channel) => {
return new Promise(function(resolve, reject) { let pubkey = (channel.remote_pubkey) ? channel.remote_pubkey : (channel.remote_node_pub) ? channel.remote_node_pub : '';
let pubkey = (channel.remote_pubkey) ? channel.remote_pubkey : (channel.remote_node_pub) ? channel.remote_node_pub : ''; options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + pubkey;
options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + pubkey; return request(options).then(function(aliasBody) {
request(options).then(function(aliasBody) { logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Alias', data: aliasBody.node.alias});
logger.info({fileName: 'Channels', msg: 'Alias: ' + JSON.stringify(aliasBody.node.alias)}); channel.remote_alias = aliasBody.node.alias;
channel.remote_alias = aliasBody.node.alias; return aliasBody.node.alias;
resolve(aliasBody.node.alias); })
}) .catch(err => {
.catch(err => { channel.remote_alias = pubkey.slice(0, 10) + '...' + pubkey.slice(-10);
channel.remote_alias = pubkey.slice(0, 10) + '...' + pubkey.slice(-10); return pubkey;
resolve(pubkey);
});
}); });
} }
exports.getAllChannels = (req, res, next) => { exports.getAllChannels = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Getting Channels..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels'; options.url = common.getSelLNServerUrl() + '/v1/channels';
options.qs = req.query; options.qs = req.query;
@ -27,9 +26,9 @@ exports.getAllChannels = (req, res, next) => {
let remote = 0; let remote = 0;
let total = 0; let total = 0;
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Channels', msg: 'All Channels Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'All Channels Received', data: body});
if(body.channels) { if(body.channels) {
Promise.all( return Promise.all(
body.channels.map(channel => { body.channels.map(channel => {
local = (channel.local_balance) ? +channel.local_balance : 0; local = (channel.local_balance) ? +channel.local_balance : 0;
remote = (channel.remote_balance) ? +channel.remote_balance : 0; remote = (channel.remote_balance) ? +channel.remote_balance : 0;
@ -40,7 +39,8 @@ exports.getAllChannels = (req, res, next) => {
) )
.then(function(values) { .then(function(values) {
body.channels = common.sortDescByKey(body.channels, 'balancedness'); body.channels = common.sortDescByKey(body.channels, 'balancedness');
logger.info({fileName: 'Channels', msg: 'All Channels with Alias: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'All Channels with Alias', data: body});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channels Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -51,7 +51,7 @@ exports.getAllChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 48, msg: 'Get All Channel Alias Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Get All Channel Alias Error', error: err});
res.status(500).json({ res.status(500).json({
message: 'Fetching Channels Alias Failed!', message: 'Fetching Channels Alias Failed!',
error: err.error error: err.error
@ -59,6 +59,7 @@ exports.getAllChannels = (req, res, next) => {
}); });
} else { } else {
body.channels = []; body.channels = [];
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Empty Channels Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -70,7 +71,7 @@ exports.getAllChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 66, msg: 'Get All Channels Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Get All Channels Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Fetching All Channels Failed!', message: 'Fetching All Channels Failed!',
error: err.error error: err.error
@ -79,6 +80,7 @@ exports.getAllChannels = (req, res, next) => {
}; };
exports.getPendingChannels = (req, res, next) => { exports.getPendingChannels = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Getting Pending Channels..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels/pending'; options.url = common.getSelLNServerUrl() + '/v1/channels/pending';
options.qs = req.query; options.qs = req.query;
@ -102,8 +104,9 @@ exports.getPendingChannels = (req, res, next) => {
if(body.waiting_close_channels && body.waiting_close_channels.length > 0) { if(body.waiting_close_channels && body.waiting_close_channels.length > 0) {
body.waiting_close_channels.map(channel => { return promises.push(getAliasForChannel(channel.channel))}); body.waiting_close_channels.map(channel => { return promises.push(getAliasForChannel(channel.channel))});
} }
Promise.all(promises).then(function(values) { return Promise.all(promises).then(function(values) {
logger.info({fileName: 'Channels', msg: 'Pending Channels: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Pending Channels', data: body});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Pending Channels Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -114,7 +117,7 @@ exports.getPendingChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 106, msg: 'Get Pending Channel Alias Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Get Pending Channel Alias Error', error: err});
res.status(500).json({ res.status(500).json({
message: 'Fetching Pending Channels Failed!', message: 'Fetching Pending Channels Failed!',
error: err.error error: err.error
@ -129,7 +132,7 @@ exports.getPendingChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 97, msg: 'Get Pending Channel Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Get Pending Channel Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Fetching Pending Channels Failed!', message: 'Fetching Pending Channels Failed!',
error: err.error error: err.error
@ -138,12 +141,13 @@ exports.getPendingChannels = (req, res, next) => {
}; };
exports.getClosedChannels = (req, res, next) => { exports.getClosedChannels = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Getting Closed Channels..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels/closed'; options.url = common.getSelLNServerUrl() + '/v1/channels/closed';
options.qs = req.query; options.qs = req.query;
request(options).then(function (body) { request(options).then(function (body) {
if (body.channels && body.channels.length > 0) { if (body.channels && body.channels.length > 0) {
Promise.all( return Promise.all(
body.channels.map(channel => { body.channels.map(channel => {
channel.close_type = (!channel.close_type) ? 'COOPERATIVE_CLOSE' : channel.close_type; channel.close_type = (!channel.close_type) ? 'COOPERATIVE_CLOSE' : channel.close_type;
return getAliasForChannel(channel); return getAliasForChannel(channel);
@ -151,7 +155,8 @@ exports.getClosedChannels = (req, res, next) => {
) )
.then(function(values) { .then(function(values) {
body.channels = common.sortDescByKey(body.channels, 'close_height'); body.channels = common.sortDescByKey(body.channels, 'close_height');
logger.info({fileName: 'Channels', msg: 'Closed Channels: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Closed Channels', data: body});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Closed Channels Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -162,7 +167,7 @@ exports.getClosedChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 48, msg: 'Get All Channel Alias Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Get All Channel Alias Error', error: err});
res.status(500).json({ res.status(500).json({
message: 'Fetching Channels Alias Failed!', message: 'Fetching Channels Alias Failed!',
error: err.error error: err.error
@ -181,7 +186,7 @@ exports.getClosedChannels = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 126, msg: 'Get Closed Channel Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Get Closed Channel Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Fetching Closed Channels Failed!', message: 'Fetching Closed Channels Failed!',
error: err.error error: err.error
@ -190,6 +195,7 @@ exports.getClosedChannels = (req, res, next) => {
}; };
exports.postChannel = (req, res, next) => { exports.postChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Opening Channel..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels'; options.url = common.getSelLNServerUrl() + '/v1/channels';
options.form = { options.form = {
@ -205,14 +211,15 @@ exports.postChannel = (req, res, next) => {
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Channel Open Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 152, msg: 'Open New Channel Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open New Channel Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Open Channel Failed!', message: 'Open Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channels Opened'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -224,7 +231,7 @@ exports.postChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 168, msg: 'Open New Channel Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open New Channel Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Open Channel Failed!', message: 'Open Channel Failed!',
error: err.error error: err.error
@ -233,6 +240,7 @@ exports.postChannel = (req, res, next) => {
}; };
exports.postTransactions = (req, res, next) => { exports.postTransactions = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Sending Payment..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels/transactions'; options.url = common.getSelLNServerUrl() + '/v1/channels/transactions';
options.form = { payment_request: req.body.paymentReq }; options.form = { payment_request: req.body.paymentReq };
@ -244,22 +252,23 @@ exports.postTransactions = (req, res, next) => {
if (req.body.allowSelfPayment) { options.form.allow_self_payment = req.body.allowSelfPayment; } if (req.body.allowSelfPayment) { options.form.allow_self_payment = req.body.allowSelfPayment; }
if (req.body.lastHopPubkey) { options.form.last_hop_pubkey = Buffer.from(req.body.lastHopPubkey, 'hex').toString('base64'); } if (req.body.lastHopPubkey) { options.form.last_hop_pubkey = Buffer.from(req.body.lastHopPubkey, 'hex').toString('base64'); }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.info({fileName: 'Channels', msg: 'Send Payment Options: ' + options.form}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Send Payment Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 200, msg: 'Send Payment Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Send Payment Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Send Payment Failed!', message: 'Send Payment Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else if (body.payment_error) { } else if (body.payment_error) {
logger.error({fileName: 'Channels', lineNum: 206, msg: 'Send Payment Error: ' + JSON.stringify(body.payment_error)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Send Payment Error: ' + JSON.stringify(body.payment_error)});
res.status(500).json({ res.status(500).json({
message: 'Send Payment Failed!', message: 'Send Payment Failed!',
error: (!body) ? 'Error From Server!' : body.payment_error error: (!body) ? 'Error From Server!' : body.payment_error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Payment Sent'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -271,7 +280,7 @@ exports.postTransactions = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 222, msg: 'Send Payment Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Send Payment Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Send Payment Failed!', message: 'Send Payment Failed!',
error: err.error error: err.error
@ -280,22 +289,24 @@ exports.postTransactions = (req, res, next) => {
}; };
exports.closeChannel = (req, res, next) => { exports.closeChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Closing Channel..'});
req.setTimeout(60000 * 10); // timeout 10 mins req.setTimeout(60000 * 10); // timeout 10 mins
options = common.getOptions(); options = common.getOptions();
let channelpoint = req.params.channelPoint.replace(':', '/'); let channelpoint = req.params.channelPoint.replace(':', '/');
options.url = common.getSelLNServerUrl() + '/v1/channels/' + channelpoint + '?force=' + req.query.force; options.url = common.getSelLNServerUrl() + '/v1/channels/' + channelpoint + '?force=' + req.query.force;
if(req.query.target_conf) { options.url = options.url + '&target_conf=' + req.query.target_conf; } if(req.query.target_conf) { options.url = options.url + '&target_conf=' + req.query.target_conf; }
if(req.query.sat_per_byte) { options.url = options.url + '&sat_per_byte=' + req.query.sat_per_byte; } if(req.query.sat_per_byte) { options.url = options.url + '&sat_per_byte=' + req.query.sat_per_byte; }
logger.info({fileName: 'Channels', msg: 'Closing Channel: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel Options URL', data: options.url});
request.delete(options).then((body) => { request.delete(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Close Channel Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Close Channel Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 241, msg: 'Close Channel Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Close Channel Failed!', message: 'Close Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Closed'});
res.status(204).json({message: 'Channel Closed!'}); res.status(204).json({message: 'Channel Closed!'});
} }
}) })
@ -307,7 +318,7 @@ exports.closeChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 257, msg: 'Close Channel Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Close Channel Failed!', message: 'Close Channel Failed!',
error: err.error error: err.error
@ -316,6 +327,7 @@ exports.closeChannel = (req, res, next) => {
} }
exports.postChanPolicy = (req, res, next) => { exports.postChanPolicy = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/chanpolicy'; options.url = common.getSelLNServerUrl() + '/v1/chanpolicy';
if(req.body.chanPoint === 'all') { if(req.body.chanPoint === 'all') {
@ -336,16 +348,17 @@ exports.postChanPolicy = (req, res, next) => {
chan_point: {funding_txid_str: txid_str, output_index: parseInt(output_idx)} chan_point: {funding_txid_str: txid_str, output_index: parseInt(output_idx)}
}); });
} }
logger.info({fileName: 'Channels', msg: 'Update Channel Policy Options: ' + JSON.stringify(options.form)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Channels', msg: 'Update Channel Policy: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Channels', lineNum: 290, msg: 'Update Channel Policy Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Update Channel Failed!', message: 'Update Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Policy Updated'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -357,7 +370,7 @@ exports.postChanPolicy = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Channels', lineNum: 306, msg: 'Update Channel Policy Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Update Channel Failed!', message: 'Update Channel Failed!',
error: err.error error: err.error

@ -1,6 +1,6 @@
var request = require('request-promise'); var request = require('request-promise');
var fs = require('fs'); var fs = require('fs');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
@ -27,6 +27,7 @@ function getFilesList(callback) {
} }
exports.getBackup = (req, res, next) => { exports.getBackup = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Getting Channel Backup..'});
options = common.getOptions(); options = common.getOptions();
let channel_backup_file = ''; let channel_backup_file = '';
let message = ''; let message = '';
@ -55,13 +56,13 @@ exports.getBackup = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'ChannelsBackup', lineNum: 57, msg: 'Channels Backup Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'ChannelsBackup', msg: 'Channels Backup Error', error: err});
return res.status(500).json({ message: 'Channels Backup Failed!', error: err }); return res.status(500).json({ message: 'Channels Backup Failed!', error: err });
} }
} }
} }
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'ChannelsBackup', msg: 'Channel Backup: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'ChannelsBackup', msg: 'Channel Backup', data: body});
fs.writeFile(channel_backup_file, JSON.stringify(body), function(errRes) { fs.writeFile(channel_backup_file, JSON.stringify(body), function(errRes) {
if (errRes) { if (errRes) {
let err = JSON.parse(JSON.stringify(errRes)); let err = JSON.parse(JSON.stringify(errRes));
@ -71,9 +72,10 @@ exports.getBackup = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'ChannelsBackup', lineNum: 72, msg: 'Channels Backup Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'ChannelsBackup', msg: 'Channels Backup Error', error: err});
return res.status(500).json({ message: 'Channels Backup Failed!', error: err.error }); return res.status(500).json({ message: 'Channels Backup Failed!', error: err.error });
} else { } else {
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Channel Backup Finished'});
res.status(200).json({ message: message }); res.status(200).json({ message: message });
} }
}); });
@ -86,7 +88,7 @@ exports.getBackup = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'ChannelsBackup', lineNum: 86, msg: 'Channel Backup Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'ChannelsBackup', msg: 'Channel Backup Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Channels Backup Failed!', message: 'Channels Backup Failed!',
error: err.error error: err.error
@ -95,6 +97,7 @@ exports.getBackup = (req, res, next) => {
}; };
exports.postBackupVerify = (req, res, next) => { exports.postBackupVerify = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Verifying Channel Backup..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels/backup/verify'; options.url = common.getSelLNServerUrl() + '/v1/channels/backup/verify';
let channel_verify_file = ''; let channel_verify_file = '';
@ -111,10 +114,12 @@ exports.postBackupVerify = (req, res, next) => {
delete verify_backup.single_chan_backups; delete verify_backup.single_chan_backups;
options.form = JSON.stringify(verify_backup); options.form = JSON.stringify(verify_backup);
} else { } else {
logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Backup Verify Error. Channel backup to verify does not Exist!', error: {error: 'Channel backup to verify does not Exist.'}});
res.status(404).json({ message: 'Channels backup to verify does not Exist!' }); res.status(404).json({ message: 'Channels backup to verify does not Exist!' });
} }
} else { } else {
verify_backup = ''; verify_backup = '';
logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Backup Verify Error. Channel backup to verify does not Exist!', error: {error: 'Channel backup to verify does not Exist.'}});
res.status(404).json({ message: 'Channels backup to verify does not Exist!' }); res.status(404).json({ message: 'Channels backup to verify does not Exist!' });
} }
} else { } else {
@ -126,12 +131,14 @@ exports.postBackupVerify = (req, res, next) => {
options.form = JSON.stringify({ single_chan_backups: { chan_backups: [JSON.parse(verify_backup)] } }); options.form = JSON.stringify({ single_chan_backups: { chan_backups: [JSON.parse(verify_backup)] } });
} else { } else {
verify_backup = ''; verify_backup = '';
logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Backup Verify Error. Channel backup to verify does not Exist!', error: {error: 'Channel backup to verify does not Exist.'}});
res.status(404).json({ message: 'Channel backup to verify does not Exist!' }); res.status(404).json({ message: 'Channel backup to verify does not Exist!' });
} }
} }
if (verify_backup !== '') { if (verify_backup !== '') {
request.post(options).then(function (body) { request.post(options).then(function (body) {
logger.info({fileName: 'BackupVerify', msg: 'Channel Backup Verify: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'ChannelBackup', msg: 'Channel Backup Verify', data: body});
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Channel Backup Verified'});
res.status(201).json({ message: message }); res.status(201).json({ message: message });
}) })
.catch(errRes => { .catch(errRes => {
@ -142,7 +149,7 @@ exports.postBackupVerify = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'BackupVerify', lineNum: 141, msg: 'Channel Backup Verify Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Backup Verify Error', error: err});
return res.status(404).json({ return res.status(404).json({
message: 'Channel backup to Verify failed!', message: 'Channel backup to Verify failed!',
error: err.error error: err.error
@ -152,6 +159,7 @@ exports.postBackupVerify = (req, res, next) => {
}; };
exports.postRestore = (req, res, next) => { exports.postRestore = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Restoring Channel Backup..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels/backup/restore'; options.url = common.getSelLNServerUrl() + '/v1/channels/backup/restore';
let channel_restore_file = ''; let channel_restore_file = '';
@ -168,6 +176,7 @@ exports.postRestore = (req, res, next) => {
restore_backup = JSON.parse(restore_backup); restore_backup = JSON.parse(restore_backup);
options.form = JSON.stringify({multi_chan_backup: restore_backup.multi_chan_backup.multi_chan_backup}); options.form = JSON.stringify({multi_chan_backup: restore_backup.multi_chan_backup.multi_chan_backup});
} else { } else {
logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Restore Error.Channels backup to restore does not Exist!', error: {error: 'Channel backup to restore does not Exist.'}});
res.status(404).json({ message: 'Channels backup to restore does not Exist!' }); res.status(404).json({ message: 'Channels backup to restore does not Exist!' });
} }
} else if (downloaded_exists) { } else if (downloaded_exists) {
@ -176,10 +185,12 @@ exports.postRestore = (req, res, next) => {
restore_backup = JSON.parse(restore_backup); restore_backup = JSON.parse(restore_backup);
options.form = JSON.stringify({multi_chan_backup: restore_backup.multi_chan_backup.multi_chan_backup}); options.form = JSON.stringify({multi_chan_backup: restore_backup.multi_chan_backup.multi_chan_backup});
} else { } else {
logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Restore Error. Channels backup to restore does not Exist!', error: {error: 'Channel backup to restore does not Exist.'}});
res.status(404).json({ message: 'Channels backup to restore does not Exist!' }); res.status(404).json({ message: 'Channels backup to restore does not Exist!' });
} }
} else { } else {
restore_backup = ''; restore_backup = '';
logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Restore Error. Channels backup to restore does not Exist!', error: {error: 'Channel backup to restore does not Exist.'}});
res.status(404).json({ message: 'Channels backup to restore does not Exist!' }); res.status(404).json({ message: 'Channels backup to restore does not Exist!' });
} }
} else { } else {
@ -191,18 +202,20 @@ exports.postRestore = (req, res, next) => {
options.form = JSON.stringify({ chan_backups: { chan_backups: [JSON.parse(restore_backup)] } }); options.form = JSON.stringify({ chan_backups: { chan_backups: [JSON.parse(restore_backup)] } });
} else { } else {
restore_backup = ''; restore_backup = '';
logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Restore Error. Channels backup to restore does not Exist!', error: {error: 'Channel backup to restore does not Exist.'}});
res.status(404).json({ message: 'Channel backup to restore does not Exist!' }); res.status(404).json({ message: 'Channel backup to restore does not Exist!' });
} }
} }
if (restore_backup !== '') { if (restore_backup !== '') {
request.post(options).then(function (body) { request.post(options).then(function (body) {
logger.info({fileName: 'ChannelRestore', msg: 'Channel Backup Restore: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'ChannelBackup', msg: 'Channel Backup Restore', data: body});
fs.rename(channel_restore_file, channel_restore_file + '.restored', () => { fs.rename(channel_restore_file, channel_restore_file + '.restored', () => {
getFilesList(getFilesListRes => { getFilesList(getFilesListRes => {
if (getFilesListRes.error) { if (getFilesListRes.error) {
logger.error({fileName: 'ChannelRestore', lineNum: 190, msg: 'Channel Restore Error: ' + JSON.stringify(getFilesListRes.error)}); logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Restore Error', error: getFilesListRes.error});
return res.status(500).json({ message: 'Channel restore failed!', list: getFilesListRes }); return res.status(500).json({ message: 'Channel restore failed!', list: getFilesListRes });
} else { } else {
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Channel Restored'});
return res.status(201).json({ message: message, list: getFilesListRes }); return res.status(201).json({ message: message, list: getFilesListRes });
} }
}); });
@ -216,7 +229,7 @@ exports.postRestore = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'ChannelRestore', lineNum: 205, msg: 'Channel Restore Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'ChannelBackup', msg: 'Channel Restore Error', error: err});
return res.status(404).json({ return res.status(404).json({
message: 'Channel restore failed!', message: 'Channel restore failed!',
error: err.error.error error: err.error.error

@ -1,55 +1,50 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var swtch = require('./switch'); var swtch = require('./switch');
var options = {}; var options = {};
exports.getFees = (req, res, next) => { exports.getFees = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Getting Fees..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/fees'; options.url = common.getSelLNServerUrl() + '/v1/fees';
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Fees', msg: 'Fee Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Fee Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Fees', lineNum: 13, msg: 'Get Fee Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Fee Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching fee failed!", message: "Fetching fee failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
if (!body.day_fee_sum) {
body.day_fee_sum = 0;
body.btc_day_fee_sum = 0;
} else {
body.btc_day_fee_sum = common.convertToBTC(body.day_fee_sum);
}
if (!body.week_fee_sum) {
body.week_fee_sum = 0;
body.btc_week_fee_sum = 0;
} else {
body.btc_week_fee_sum = common.convertToBTC(body.week_fee_sum);
}
if (!body.month_fee_sum) {
body.month_fee_sum = 0;
body.btc_month_fee_sum = 0;
} else {
body.btc_month_fee_sum = common.convertToBTC(body.month_fee_sum);
}
let today = new Date(Date.now()); let today = new Date(Date.now());
let current_time = Math.round((today.getTime()) / 1000); let start_date = new Date(today.getFullYear(), today.getMonth(), 1, 0, 0, 0);
let month_start_time = Math.round((new Date(today.getFullYear(), today.getMonth() - 1, today.getDate() + 1, 0, 0, 0).getTime()) / 1000); let current_time = (Math.round(today.getTime()/1000)).toString();
let month_start_time = (Math.round(start_date.getTime()/1000)).toString();
let week_start_time = current_time - 604800; let week_start_time = current_time - 604800;
let day_start_time = current_time - 86400; let day_start_time = current_time - 86400;
swtch.getAllForwardingEvents(month_start_time, current_time, 0, (history) => { return swtch.getAllForwardingEvents(month_start_time, current_time, 0, (history) => {
logger.info({fileName: 'Fees', msg: 'Forwarding History Received: ' + JSON.stringify(history)}); logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Forwarding History Received', data: history});
let daily_tx_count = history.forwarding_events.filter(event => event.timestamp >= day_start_time); daily_sum = history.forwarding_events.reduce((acc, curr) => (curr.timestamp >= day_start_time) ? [(acc[0] + 1), (acc[1] + +curr.fee_msat)] : acc, [0, 0]);
body.daily_tx_count = daily_tx_count && daily_tx_count.length ? daily_tx_count.length : 0; weekly_sum = history.forwarding_events.reduce((acc, curr) => (curr.timestamp >= week_start_time) ? [(acc[0] + 1), (acc[1] + +curr.fee_msat)] : acc, [0, 0]);
let weekly_tx_count = history.forwarding_events.filter(event => event.timestamp >= week_start_time); monthly_sum = history.forwarding_events.reduce((acc, curr) => [(acc[0] + 1), (acc[1] + +curr.fee_msat)], [0, 0]);
body.weekly_tx_count = weekly_tx_count && weekly_tx_count.length ? weekly_tx_count.length : 0; logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Daily Sum (Transactions, Fee)', data: daily_sum});
body.monthly_tx_count = history.forwarding_events && history.forwarding_events.length ? history.forwarding_events.length : 0; logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Weekly Sum (Transactions, Fee)', data: weekly_sum});
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Monthly Sum (Transactions, Fee)', data: monthly_sum});
body.daily_tx_count = daily_sum[0];
body.weekly_tx_count = weekly_sum[0];
body.monthly_tx_count = monthly_sum[0];
body.day_fee_sum = (daily_sum[1] / 1000).toFixed(2);
body.week_fee_sum = (weekly_sum[1] / 1000).toFixed(2);
body.month_fee_sum = (monthly_sum[1] / 1000).toFixed(2);
body.btc_day_fee_sum = common.convertToBTC(body.day_fee_sum);
body.btc_week_fee_sum = common.convertToBTC(body.week_fee_sum);
body.btc_month_fee_sum = common.convertToBTC(body.month_fee_sum);
body.forwarding_events_history = history; body.forwarding_events_history = history;
if (history.error) { if (history.error) {
logger.error({fileName: 'Fees', lineNum: 50, msg: 'Fetch Forwarding Events Error: ' + JSON.stringify(history.error)}); logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Fetch Forwarding Events Error', error: history.error});
} }
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Fees Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
} }
@ -62,7 +57,7 @@ exports.getFees = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Fees', lineNum: 63, msg: 'Fetch Forwarding Events Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Fetch Forwarding Events Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching fee failed!", message: "Fetching fee failed!",
error: err.error error: err.error

@ -1,17 +1,18 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var connect = require('../../connect'); var connect = require('../../routes/connect');
var options = {}; var options = {};
exports.getInfo = (req, res, next) => { exports.getInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'Getting LND Node Information..'});
common.setOptions(); common.setOptions();
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/getinfo'; options.url = common.getSelLNServerUrl() + '/v1/getinfo';
logger.info({fileName:'GetInfo', msg: 'Selected Node: ' + JSON.stringify(common.selectedNode.ln_node)}); logger.log({level: 'DEBUG', fileName:'GetInfo', msg: 'Selected Node', data: common.selectedNode.ln_node});
logger.info({fileName: 'GetInfo', msg: 'Calling Info from LND server url: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Calling Info from LND server url', data: options.url});
if (!options.headers || !options.headers['Grpc-Metadata-macaroon']) { if (!options.headers || !options.headers['Grpc-Metadata-macaroon']) {
logger.error({fileName: 'GetInfo', lineNum: 17, msg: 'LND Get info failed due to bad or missing macaroon!'}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'LND Get info failed due to bad or missing macaroon!', error: {error: 'Bad or missing macaroon.'}});
res.status(502).json({ res.status(502).json({
message: "Fetching Info Failed!", message: "Fetching Info Failed!",
error: "Bad Macaroon" error: "Bad Macaroon"
@ -19,16 +20,17 @@ exports.getInfo = (req, res, next) => {
} else { } else {
common.nodes.map(node => { if (node.lnImplementation === 'LND') { connect.getAllNodeAllChannelBackup(node); }}); common.nodes.map(node => { if (node.lnImplementation === 'LND') { connect.getAllNodeAllChannelBackup(node); }});
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'GetInfo', msg: JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Node Information', data: body});
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'GetInfo', lineNum: 26, msg: 'Get Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Info Failed!", message: "Fetching Info Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'LND Node Information Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -40,7 +42,7 @@ exports.getInfo = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'GetInfo', lineNum: 42, msg: 'Get Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Info Failed!", message: "Fetching Info Failed!",
error: err.error error: err.error

@ -1,34 +1,33 @@
var request = require("request-promise"); var request = require("request-promise");
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
getAliasFromPubkey = (pubkey) => { getAliasFromPubkey = (pubkey) => {
return new Promise(function(resolve, reject) { options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + pubkey;
options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + pubkey; return request(options).then(function(res) {
request(options) logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Alias', data: res.node.alias});
.then(function(res) { return res.node.alias;
logger.info({fileName: 'Graph', msg: 'Alias: ' + JSON.stringify(res.node.alias)}); })
resolve(res.node.alias); .catch(err => pubkey.substring(0, 17) + '...');
})
.catch(err => resolve(pubkey.substring(0, 17) + '...'));
});
} }
exports.getDescribeGraph = (req, res, next) => { exports.getDescribeGraph = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Getting Network Graph..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph'; options.url = common.getSelLNServerUrl() + '/v1/graph';
request.get(options).then((body) => { request.get(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.info({fileName: 'Graph', msg: 'Describe Graph Received: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Describe Graph Received', data: body_str});
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'Graph', lineNum: 27, msg: 'Describe Graph Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Describe Graph Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Describe Graph Failed!", message: "Fetching Describe Graph Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Network Graph Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -40,7 +39,7 @@ exports.getDescribeGraph = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 43, msg: 'Describe Graph Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Describe Graph Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Describe Graph Failed!", message: "Fetching Describe Graph Failed!",
error: err.error error: err.error
@ -49,14 +48,15 @@ exports.getDescribeGraph = (req, res, next) => {
}; };
exports.getGraphInfo = (req, res, next) => { exports.getGraphInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Information..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph/info'; options.url = common.getSelLNServerUrl() + '/v1/graph/info';
request.get(options).then((body) => { request.get(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.info({fileName: 'Graph', msg: 'Network Info Received: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Network Info Received', data: body_str});
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'Graph', lineNum: 59, msg: 'Network Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Network Info Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching network Info failed!", message: "Fetching network Info failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
@ -66,7 +66,8 @@ exports.getGraphInfo = (req, res, next) => {
body.btc_avg_channel_size = (!body.avg_channel_size) ? 0 : common.convertToBTC(body.avg_channel_size); body.btc_avg_channel_size = (!body.avg_channel_size) ? 0 : common.convertToBTC(body.avg_channel_size);
body.btc_min_channel_size = (!body.min_channel_size) ? 0 : common.convertToBTC(body.min_channel_size); body.btc_min_channel_size = (!body.min_channel_size) ? 0 : common.convertToBTC(body.min_channel_size);
body.btc_max_channel_size = (!body.max_channel_size) ? 0 : common.convertToBTC(body.max_channel_size); body.btc_max_channel_size = (!body.max_channel_size) ? 0 : common.convertToBTC(body.max_channel_size);
logger.info({fileName: 'Graph', msg: 'Network Information After Rounding and Conversion: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Network Information After Rounding and Conversion', data: body_str});
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Information Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -78,7 +79,7 @@ exports.getGraphInfo = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 80, msg: 'Fetch Network Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Network Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching network Info failed!", message: "Fetching network Info failed!",
error: err.error error: err.error
@ -87,20 +88,19 @@ exports.getGraphInfo = (req, res, next) => {
}; };
exports.getGraphNode = (req, res, next) => { exports.getGraphNode = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Node Information..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + req.params.pubKey; options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + req.params.pubKey;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Graph', msg: 'Node Info Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Node Info Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Graph', lineNum: 94, msg: 'Fetch Node Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Node Info Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching node Info failed!", message: "Fetching node Info failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} }
if (body) { logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Node Information Received'});
body.node.last_update_str = (!body.node.last_update) ? '' : common.convertTimestampToDate(body.node.last_update);
}
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -111,7 +111,7 @@ exports.getGraphNode = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 112, msg: 'Fetch Node Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Node Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching node Info failed!", message: "Fetching node Info failed!",
error: err.error error: err.error
@ -120,20 +120,19 @@ exports.getGraphNode = (req, res, next) => {
}; };
exports.getGraphEdge = (req, res, next) => { exports.getGraphEdge = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Edge Information..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph/edge/' + req.params.chanid; options.url = common.getSelLNServerUrl() + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Graph', msg: 'Edge Info Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Graph', lineNum: 126, msg: 'Fetch Edge Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Edge Info Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Edge Info Failed!", message: "Fetching Edge Info Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} }
if (body) { logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Edge Information Received'});
body.last_update_str = (!body.last_update) ? '' : common.convertTimestampToDate(body.last_update);
}
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -144,7 +143,7 @@ exports.getGraphEdge = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 144, msg: 'Fetch Edge Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Edge Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Edge Info Failed!", message: "Fetching Edge Info Failed!",
error: err.error error: err.error
@ -153,30 +152,32 @@ exports.getGraphEdge = (req, res, next) => {
}; };
exports.getQueryRoutes = (req, res, next) => { exports.getQueryRoutes = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Routes..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph/routes/' + req.params.destPubkey + '/' + req.params.amount; options.url = common.getSelLNServerUrl() + '/v1/graph/routes/' + req.params.destPubkey + '/' + req.params.amount;
if(req.query.outgoing_chan_id) { if(req.query.outgoing_chan_id) {
options.url = options.url + '?outgoing_chan_id=' + req.query.outgoing_chan_id; options.url = options.url + '?outgoing_chan_id=' + req.query.outgoing_chan_id;
} }
logger.info({fileName: 'Graph', msg: 'Query Routes URL: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Query Routes URL', data: options.url});
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Graph', msg: 'Query Routes Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Query Routes Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Graph', lineNum: 162, msg: 'Fetch Query Routes Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Query Routes Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Query Routes Failed!", message: "Fetching Query Routes Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} }
if(body.routes && body.routes.length && body.routes.length > 0 && body.routes[0].hops && body.routes[0].hops.length && body.routes[0].hops.length > 0) { if(body.routes && body.routes.length && body.routes.length > 0 && body.routes[0].hops && body.routes[0].hops.length && body.routes[0].hops.length > 0) {
Promise.all(body.routes[0].hops.map(hop => {return getAliasFromPubkey(hop.pub_key)})) return Promise.all(body.routes[0].hops.map(hop => getAliasFromPubkey(hop.pub_key)))
.then(function(values) { .then(function(values) {
body.routes[0].hops.map((hop, i) => { body.routes[0].hops.map((hop, i) => {
hop.hop_sequence = i + 1; hop.hop_sequence = i + 1;
hop.pubkey_alias = values[i]; hop.pubkey_alias = values[i];
return hop; return hop;
}); });
logger.info({fileName: 'Graph', msg: 'Hops with Alias: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Hops with Alias', data: body});
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Routes Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -187,13 +188,14 @@ exports.getQueryRoutes = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 196, msg: 'Fetch Query Routes Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Query Routes Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Query Routes Failed!", message: "Fetching Query Routes Failed!",
error: err.error error: err.error
}); });
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Routes Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -205,7 +207,7 @@ exports.getQueryRoutes = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 214, msg: 'Fetch Query Routes Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Query Routes Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Query Routes Failed!", message: "Fetching Query Routes Failed!",
error: err.error error: err.error
@ -214,20 +216,18 @@ exports.getQueryRoutes = (req, res, next) => {
}; };
exports.getRemoteFeePolicy = (req, res, next) => { exports.getRemoteFeePolicy = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Getting Remote Fee Policy..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph/edge/' + req.params.chanid; options.url = common.getSelLNServerUrl() + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Graph', msg: 'Edge Info Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Graph', lineNum: 218, msg: 'Fetch Edge Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Edge Info Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Edge Info Failed!", message: "Fetching Edge Info Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} }
if (body) {
body.last_update_str = (!body.last_update) ? '' : common.convertTimestampToDate(body.last_update);
}
remoteNodeFee = {}; remoteNodeFee = {};
if(body.node1_pub === req.params.localPubkey){ if(body.node1_pub === req.params.localPubkey){
remoteNodeFee = { remoteNodeFee = {
@ -242,6 +242,7 @@ exports.getRemoteFeePolicy = (req, res, next) => {
fee_rate_milli_msat: body.node1_policy.fee_rate_milli_msat fee_rate_milli_msat: body.node1_policy.fee_rate_milli_msat
}; };
} }
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Remote Fee Policy Received'});
res.status(200).json(remoteNodeFee); res.status(200).json(remoteNodeFee);
}) })
.catch(errRes => { .catch(errRes => {
@ -252,7 +253,7 @@ exports.getRemoteFeePolicy = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 250, msg: 'Fetch Edge Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Edge Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Edge Info Failed!", message: "Fetching Edge Info Failed!",
error: err.error error: err.error
@ -264,9 +265,9 @@ exports.getAliasesForPubkeys = (req, res, next) => {
options = common.getOptions(); options = common.getOptions();
if (req.query.pubkeys) { if (req.query.pubkeys) {
let pubkeyArr = req.query.pubkeys.split(','); let pubkeyArr = req.query.pubkeys.split(',');
Promise.all(pubkeyArr.map(pubkey => {return getAliasFromPubkey(pubkey)})) return Promise.all(pubkeyArr.map(pubkey => getAliasFromPubkey(pubkey)))
.then(function(values) { .then(function(values) {
logger.info({fileName: 'Graph', msg: 'Node Alias: ' + JSON.stringify(values)}); logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Node Alias', data: values});
res.status(200).json(values); res.status(200).json(values);
}) })
.catch(errRes => { .catch(errRes => {
@ -277,7 +278,7 @@ exports.getAliasesForPubkeys = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Graph', lineNum: 279, msg: 'Get Aliases for Pubkeys Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Get Aliases for Pubkeys Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Getting Aliases for Pubkeys Failed!", message: "Getting Aliases for Pubkeys Failed!",
error: err.error error: err.error

@ -1,39 +0,0 @@
var request = require('request-promise');
var common = require('../../common');
var options = {};
exports.getGraphInfo = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph/info';
request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'GraphInfo', lineNum: 12, msg: 'Fetch Network Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))});
res.status(500).json({
message: "Fetching network Info failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
body.btc_total_network_capacity = (!body.total_network_capacity) ? 0 : common.convertToBTC(body.total_network_capacity);
body.btc_avg_channel_size = (!body.avg_channel_size) ? 0 : common.convertToBTC(body.avg_channel_size);
body.btc_min_channel_size = (!body.min_channel_size) ? 0 : common.convertToBTC(body.min_channel_size);
body.btc_max_channel_size = (!body.max_channel_size) ? 0 : common.convertToBTC(body.max_channel_size);
res.status(200).json(body);
}
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers['Grpc-Metadata-macaroon']) {
delete err.options.headers['Grpc-Metadata-macaroon'];
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon'];
}
logger.error({fileName: 'GraphInfo', lineNum: 32, msg: 'Fetch Network Info Error: ' + JSON.stringify(err)});
return res.status(500).json({
message: "Fetching Network Info Failed!",
error: err.error
});
});
};

@ -1,20 +1,22 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getInvoice = (req, res, next) => { exports.getInvoice = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Getting Invoice Information..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/invoice/' + req.params.rHashStr; options.url = common.getSelLNServerUrl() + '/v1/invoice/' + req.params.rHashStr;
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Invoice', msg: 'Invoice Info Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoice Info Received', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Invoice', lineNum: 12, msg: 'Invoice Info Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Invoice Info Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Invoice Info Failed!", message: "Fetching Invoice Info Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} }
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Invoice Information Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -25,7 +27,7 @@ exports.getInvoice = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Invoice', lineNum: 27, msg: 'Fetch Invoice Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Fetch Invoice Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Invoice Info Failed!", message: "Fetching Invoice Info Failed!",
error: err.error error: err.error
@ -34,15 +36,16 @@ exports.getInvoice = (req, res, next) => {
}; };
exports.listInvoices = (req, res, next) => { exports.listInvoices = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Getting List Invoices..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/invoices?num_max_invoices=' + req.query.num_max_invoices + '&index_offset=' + req.query.index_offset + options.url = common.getSelLNServerUrl() + '/v1/invoices?num_max_invoices=' + req.query.num_max_invoices + '&index_offset=' + req.query.index_offset +
'&reversed=' + req.query.reversed; '&reversed=' + req.query.reversed;
request(options).then((body) => { request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.info({fileName: 'Invoice', msg: 'Invoices List Received: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body_str});
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'Invoice', lineNum: 44, msg: 'List Invoices Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoices Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Invoice Info failed!", message: "Fetching Invoice Info failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
@ -53,18 +56,13 @@ exports.listInvoices = (req, res, next) => {
invoice.r_preimage = invoice.r_preimage ? Buffer.from(invoice.r_preimage, 'base64').toString('hex') : ''; invoice.r_preimage = invoice.r_preimage ? Buffer.from(invoice.r_preimage, 'base64').toString('hex') : '';
invoice.r_hash = invoice.r_hash ? Buffer.from(invoice.r_hash, 'base64').toString('hex') : ''; invoice.r_hash = invoice.r_hash ? Buffer.from(invoice.r_hash, 'base64').toString('hex') : '';
invoice.description_hash = invoice.description_hash ? Buffer.from(invoice.description_hash, 'base64').toString('hex') : null; invoice.description_hash = invoice.description_hash ? Buffer.from(invoice.description_hash, 'base64').toString('hex') : null;
invoice.creation_date_str = (!invoice.creation_date) ? '' : common.convertTimestampToDate(invoice.creation_date);
invoice.settle_date_str = (!invoice.settle_date || invoice.settle_date === '0') ? '' : common.convertTimestampToDate(invoice.settle_date);
invoice.btc_value = (!invoice.value) ? 0 : common.convertToBTC(invoice.value); invoice.btc_value = (!invoice.value) ? 0 : common.convertToBTC(invoice.value);
invoice.btc_amt_paid_sat = (!invoice.amt_paid_sat) ? 0 : common.convertToBTC(invoice.amt_paid_sat); invoice.btc_amt_paid_sat = (!invoice.amt_paid_sat) ? 0 : common.convertToBTC(invoice.amt_paid_sat);
invoice.htlcs.forEach(htlc => {
htlc.accept_time_str = (!htlc.accept_time) ? '' : common.convertTimestampToDate(htlc.accept_time);
htlc.resolve_time_str = (!htlc.resolve_time) ? '' : common.convertTimestampToDate(htlc.resolve_time);
});
}); });
body.invoices = common.sortDescByKey(body.invoices, 'creation_date'); body.invoices = common.sortDescByKey(body.invoices, 'creation_date');
} }
logger.info({fileName: 'Invoice', msg: 'Invoices List Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body});
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Invoices List Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -76,7 +74,7 @@ exports.listInvoices = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Invoice', lineNum: 70, msg: 'List Invoice Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoice Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Invoices failed!", message: "Fetching Invoices failed!",
error: err.error error: err.error
@ -85,6 +83,7 @@ exports.listInvoices = (req, res, next) => {
}; };
exports.addInvoice = (req, res, next) => { exports.addInvoice = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Adding Invoice..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/invoices'; options.url = common.getSelLNServerUrl() + '/v1/invoices';
options.form = { options.form = {
@ -99,14 +98,15 @@ exports.addInvoice = (req, res, next) => {
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Invoice', msg: 'Add Invoice Responce: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Add Invoice Responce', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Invoice', lineNum: 95, msg: 'Add Invoice Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Add Invoice Failed!", message: "Add Invoice Failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Invoice Added'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -118,7 +118,7 @@ exports.addInvoice = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Invoice', lineNum: 111, msg: 'Add Invoice Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Add Invoice Failed!", message: "Add Invoice Failed!",
error: err.error error: err.error

@ -1,22 +0,0 @@
var fs = require('fs');
exports.getLNDSettings = (req, res, next) => {
fs.readFile(req.headers.filepath, function(errRes, data) {
if (errRes) {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers['Grpc-Metadata-macaroon']) {
delete err.options.headers['Grpc-Metadata-macaroon'];
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon'];
}
logger.error({fileName: 'LNDConfSetting', lineNum: 12, msg: 'Reading Config File Error: ' + JSON.stringify(err)});
res.status(500).json({
message: "Reading Config File Failed!",
error: err
});
} else {
res.status(200).json(data.toString('utf8'));
}
});
};

@ -1,23 +1,25 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.signMessage = (req, res, next) => { exports.signMessage = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Signing Message..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/signmessage'; options.url = common.getSelLNServerUrl() + '/v1/signmessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
msg: Buffer.from(req.body.message).toString('base64') msg: Buffer.from(req.body.message).toString('base64')
}); });
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.info({fileName: 'Messages', msg: 'Message Signed: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Signed', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Messages', lineNum: 15, msg: 'Sign Message Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Sign Message Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Sign message failed!", message: "Sign message failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Signed'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -29,7 +31,7 @@ exports.signMessage = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Messages', lineNum: 31, msg: 'Sign Message Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Sign Message Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Sign Message Failed!', message: 'Sign Message Failed!',
error: err.error error: err.error
@ -38,6 +40,7 @@ exports.signMessage = (req, res, next) => {
}; };
exports.verifyMessage = (req, res, next) => { exports.verifyMessage = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Verifying Message..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/verifymessage'; options.url = common.getSelLNServerUrl() + '/v1/verifymessage';
options.form = JSON.stringify({ options.form = JSON.stringify({
@ -45,14 +48,15 @@ exports.verifyMessage = (req, res, next) => {
signature: req.body.signature signature: req.body.signature
}); });
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.info({fileName: 'Messages', msg: 'Message Verified: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Verified', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Messages', lineNum: 49, msg: 'Verify Message Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Verify Message Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Verify message failed!", message: "Verify message failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Verified'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -64,7 +68,7 @@ exports.verifyMessage = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Messages', lineNum: 65, msg: 'Message Verification Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Message Verification Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: 'Verify Message Failed!', message: 'Verify Message Failed!',
error: err.error error: err.error

@ -1,22 +1,24 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getNewAddress = (req, res, next) => { exports.getNewAddress = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'NewAddress', msg: 'Getting New Address..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/newaddress?type=' + req.query.type; options.url = common.getSelLNServerUrl() + '/v1/newaddress?type=' + req.query.type;
request(options).then((body) => { request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.info({fileName: 'NewAddress', msg: 'New Address Received: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'NewAddress', msg: 'New Address Received', data: body_str});
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'NewAddress', lineNum: 14, msg: 'New Address Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'NewAddress', msg: 'New Address Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching new address failed!", message: "Fetching new address failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'NewAddress', msg: 'New Address Received'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -28,7 +30,7 @@ exports.getNewAddress = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'NewAddress', lineNum: 30, msg: 'New Address Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'NewAddress', msg: 'New Address Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching new address failed!", message: "Fetching new address failed!",
error: err.error error: err.error

@ -1,24 +1,34 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
decodePaymentFromPaymentRequest = (payment) => {
options.url = common.getSelLNServerUrl() + '/v1/payreq/' + payment;
return request(options).then(function(res) {
logger.log({level: 'DEBUG', fileName: 'PayReq', msg: 'Description', data: res.description});
return res;
})
.catch(err => {});
}
exports.decodePayment = (req, res, next) => { exports.decodePayment = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payment..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/payreq/' + req.params.payRequest; options.url = common.getSelLNServerUrl() + '/v1/payreq/' + req.params.payRequest;
request(options).then((body) => { request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.info({fileName: 'PayReq', msg: 'Payment Decode Received: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'PayReq', msg: 'Payment Decode Received', data: body_str});
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'PayReq', lineNum: 14, msg: 'Payment Decode Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'PayReq', msg: 'Payment Decode Error 1', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Payment Request Decode Failed!", message: "Payment Request Decode Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
}); });
} else { } else {
body.btc_num_satoshis = (!body.num_satoshis) ? 0 : common.convertToBTC(body.num_satoshis); body.btc_num_satoshis = (!body.num_satoshis) ? 0 : common.convertToBTC(body.num_satoshis);
body.timestamp_str = (!body.timestamp) ? '' : common.convertTimestampToDate(body.timestamp); logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Payment Decoded'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -30,7 +40,7 @@ exports.decodePayment = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'PayReq', lineNum: 32, msg: 'Payment Decode Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'PayReq', msg: 'Payment Decode Error 2', error: err.error});
return res.status(500).json({ return res.status(500).json({
message: "Payment Request Decode Failed!", message: "Payment Request Decode Failed!",
error: err.error error: err.error
@ -39,12 +49,14 @@ exports.decodePayment = (req, res, next) => {
}; };
exports.decodePayments = (req, res, next) => { exports.decodePayments = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Decoding Payments List..'});
options = common.getOptions(); options = common.getOptions();
if (req.body.payments) { if (req.body.payments) {
let paymentsArr = req.body.payments.split(','); let paymentsArr = req.body.payments.split(',');
Promise.all(paymentsArr.map(payment => {return decodePaymentFromPaymentRequest(payment)})) return Promise.all(paymentsArr.map(payment => decodePaymentFromPaymentRequest(payment)))
.then(function(values) { .then(function(values) {
logger.info({fileName: 'PayReq', msg: 'Decoded Payments: ' + JSON.stringify(values)}); logger.log({level: 'DEBUG', fileName: 'PayReq', msg: 'Decoded Payments', data: values});
logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Payment List Decoded'});
res.status(200).json(values); res.status(200).json(values);
}) })
.catch(errRes => { .catch(errRes => {
@ -55,25 +67,14 @@ exports.decodePayments = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'PayReq', lineNum: 58, msg: 'Decode Payments Failed: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'PayReq', msg: 'Decode Payments Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Decode Payments Failed!", message: "Decode Payments Failed!",
error: err.error error: err.error
}); });
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Empty Payment List Decoded'});
res.status(200).json([]); res.status(200).json([]);
} }
}; };
decodePaymentFromPaymentRequest = (payment) => {
return new Promise(function(resolve, reject) {
options.url = common.getSelLNServerUrl() + '/v1/payreq/' + payment;
request(options)
.then(function(res) {
logger.info({fileName: 'PayReq', msg: 'Description: ' + JSON.stringify(res.description)});
resolve(res);
})
.catch(err => resolve({}));
});
}

@ -1,34 +1,29 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getPayments = (req, res, next) => { exports.getPayments = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Getting Payments List..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/payments'; options.url = common.getSelLNServerUrl() + '/v1/payments?max_payments=' + req.query.max_payments + '&index_offset=' + req.query.index_offset + '&reversed=' + req.query.reversed;
request(options).then((body) => { request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.info({fileName: 'Payments', msg: 'Payment List Received: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body_str});
if(!body || search_idx > -1 || body.error) { if(!body || search_idx > -1 || body.error) {
logger.error({fileName: 'Payments', lineNum: 14, msg: 'List Payments Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'List Payments Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Payments List Failed!", message: "Payments List Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
}); });
} else { } else {
if ( body.payments && body.payments.length > 0) { if (body.payments && body.payments.length > 0) {
body.payments.forEach(payment => {
payment.creation_date_str = (!payment.creation_date) ? '' : common.convertTimestampToDate(payment.creation_date);
payment.htlcs.forEach(htlc => {
htlc.attempt_time_str = (!htlc.attempt_time_ns) ? '' : common.convertTimestampToDate(Math.round(htlc.attempt_time_ns/1000000000));
htlc.resolve_time_str = (!htlc.resolve_time_ns) ? '' : common.convertTimestampToDate(Math.round(htlc.resolve_time_ns/1000000000));
});
});
body.payments = common.sortDescByKey(body.payments, 'creation_date'); body.payments = common.sortDescByKey(body.payments, 'creation_date');
} }
logger.info({fileName: 'Payments', msg: 'Payment List After Dates: ' + JSON.stringify(body.payments)}); logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payments After Sort', data: body});
res.status(200).json(body.payments); logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payments List Received'});
res.status(200).json(body);
} }
}) })
.catch(errRes => { .catch(errRes => {
@ -39,10 +34,37 @@ exports.getPayments = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Payments', lineNum: 36, msg: 'List Payments Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Payments', msg: 'List Payments Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Payments List Failed!", message: "Payments List Failed!",
error: err.error error: err.error
}); });
}); });
}; };
exports.getAllLightningTransactions = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Getting All Lightning Transactions..'});
const options1 = JSON.parse(JSON.stringify(common.getOptions()))
const options2 = JSON.parse(JSON.stringify(common.getOptions()))
options1.url = common.getSelLNServerUrl() + '/v1/payments?max_payments=1000000&index_offset=0&reversed=true';
options2.url = common.getSelLNServerUrl() + '/v1/invoices?num_max_invoices=1000000&index_offset=0&reversed=true';
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'All Payments Options', data: options1});
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'All Invoices Options', data: options2});
return Promise.all([request(options1), request(options2)]).then(function(values) {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payments & Invoices Received'});
res.status(200).json({paymentsAll: values[0], invoicesAll: values[1]});
}).catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers['Grpc-Metadata-macaroon']) {
delete err.options.headers['Grpc-Metadata-macaroon'];
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon'];
}
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'All Lightning Transactions Error', error: err});
return res.status(500).json({
message: "All Lightning Transactions Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
});
};

@ -1,43 +1,38 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
getAliasForPeers = (peer) => { getAliasForPeers = (peer) => {
return new Promise(function(resolve, reject) { options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + peer.pub_key;
options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + peer.pub_key; return request(options).then(function(aliasBody) {
request(options).then(function(aliasBody) { logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Alias', data: aliasBody.node.alias});
logger.info({fileName: 'Peers', msg: 'Alias: ' + JSON.stringify(aliasBody.node.alias)}); peer.alias = aliasBody.node.alias;
peer.alias = aliasBody.node.alias; return aliasBody.node.alias;
resolve(aliasBody.node.alias); })
}) .catch(err => {
.catch(err => { peer.alias = peer.pub_key.slice(0, 10) + '...' + peer.pub_key.slice(-10);
peer.alias = peer.pub_key.slice(0, 10) + '...' + peer.pub_key.slice(-10); return peer.pub_key;
resolve(peer.pub_key);
});
}); });
} }
exports.getPeers = (req, res, next) => { exports.getPeers = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Getting Peers..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/peers'; options.url = common.getSelLNServerUrl() + '/v1/peers';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Peers', msg: 'Peers Received: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peers Received', data: body});
let peers = !body.peers ? [] : body.peers; let peers = !body.peers ? [] : body.peers;
Promise.all( return Promise.all(peers.map(peer => getAliasForPeers(peer))).then(function(values) {
peers.map(peer => { logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peers with Alias before Sort', data: body});
return getAliasForPeers(peer);
}))
.then(function(values) {
logger.info({fileName: 'Peers', msg: 'Peers with Alias before Sort: ' + JSON.stringify(body)});
if (body.peers) { if (body.peers) {
body.peers = common.sortDescByStrKey(body.peers, 'alias'); body.peers = common.sortDescByStrKey(body.peers, 'alias');
} }
logger.info({fileName: 'Peers', msg: 'Peers with Alias after Sort: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peers with Alias after Sort', data: body});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peers Received'});
res.status(200).json(body.peers); res.status(200).json(body.peers);
}); })
}) }).catch(errRes => {
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes)); let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers['Grpc-Metadata-macaroon']) { if (err.options && err.options.headers && err.options.headers['Grpc-Metadata-macaroon']) {
delete err.options.headers['Grpc-Metadata-macaroon']; delete err.options.headers['Grpc-Metadata-macaroon'];
@ -45,7 +40,7 @@ exports.getPeers = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Peers', lineNum: 39, msg: 'List Peers Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'List Peers Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Peers List Failed!", message: "Peers List Failed!",
error: err.error error: err.error
@ -54,6 +49,7 @@ exports.getPeers = (req, res, next) => {
}; };
exports.postPeer = (req, res, next) => { exports.postPeer = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Connecting Peer..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/peers'; options.url = common.getSelLNServerUrl() + '/v1/peers';
options.form = JSON.stringify({ options.form = JSON.stringify({
@ -61,9 +57,9 @@ exports.postPeer = (req, res, next) => {
perm: req.body.perm perm: req.body.perm
}); });
request.post(options, (error, response, body) => { request.post(options, (error, response, body) => {
logger.info({fileName: 'Peers', msg: 'Peer Added: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Peers', lineNum: 63, msg: 'Add Peer Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Add Peer Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Adding peer failed!", message: "Adding peer failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
@ -72,18 +68,15 @@ exports.postPeer = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/peers'; options.url = common.getSelLNServerUrl() + '/v1/peers';
request(options).then(function (body) { request(options).then(function (body) {
let peers = (!body.peers) ? [] : body.peers; let peers = (!body.peers) ? [] : body.peers;
Promise.all( return Promise.all(peers.map(peer => getAliasForPeers(peer))).then(function(values) {
peers.map(peer => {
return getAliasForPeers(peer);
}))
.then(function(values) {
if (body.peers) { if (body.peers) {
body.peers = common.sortDescByStrKey(body.peers, 'alias'); body.peers = common.sortDescByStrKey(body.peers, 'alias');
logger.info({fileName: 'Peers', msg: 'Peer with Alias: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Alias', data: body});
body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey); body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey);
logger.info({fileName: 'Peers', msg: 'Peer with Newest On Top: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Newest On Top', data: body});
} }
logger.info({fileName: 'Peers', msg: 'Peer Added Successfully'}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added Successfully'});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Connected'});
res.status(201).json(body.peers); res.status(201).json(body.peers);
}) })
.catch(errRes => { .catch(errRes => {
@ -94,7 +87,7 @@ exports.postPeer = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Peer', lineNum: 93, msg: 'Add Peer Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peer', msg: 'Add Peer Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Peer Add Failed!", message: "Peer Add Failed!",
error: err.error error: err.error
@ -106,18 +99,20 @@ exports.postPeer = (req, res, next) => {
}; };
exports.deletePeer = (req, res, next) => { exports.deletePeer = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Disconnecting Peer..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/peers/' + req.params.peerPubKey; options.url = common.getSelLNServerUrl() + '/v1/peers/' + req.params.peerPubKey;
request.delete(options).then((body) => { request.delete(options).then((body) => {
logger.info({fileName: 'Peers', msg: 'Detach Peer Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Detach Peer Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Peers', lineNum: 110, msg: 'Detach Peer Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Detach Peer Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Detach peer failed!", message: "Detach peer failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.info({fileName: 'Peers', msg: 'Peer Detached: ' + req.params.peerPubKey}); logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Detached', data: req.params.peerPubKey});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Disconnected'});
res.status(204).json({}); res.status(204).json({});
} }
}) })
@ -129,7 +124,7 @@ exports.deletePeer = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Peers', lineNum: 127, msg: 'Detach Peer Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Detach Peer Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Detach Peer Failed!", message: "Detach Peer Failed!",
error: err.error error: err.error

@ -1,13 +1,13 @@
var request = require('request-promise'); var request = require('request-promise');
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
var num_max_events = 100; var num_max_events = 100;
var responseData = { forwarding_events: [], last_offset_index: 0 }; var responseData = { forwarding_events: [], last_offset_index: 0 };
exports.forwardingHistory = (req, res, next) => { exports.forwardingHistory = (req, res, next) => {
this.getAllForwardingEvents(req.body.start_time, req.body.end_time, 0, (eventsResponse) => { return this.getAllForwardingEvents(req.body.start_time, req.body.end_time, 0, (eventsResponse) => {
if (eventsResponse.error) { if (eventsResponse.error) {
res.status(500).json(eventsResponse); res.status(500).json(eventsResponse);
} else { } else {
@ -17,6 +17,7 @@ exports.forwardingHistory = (req, res, next) => {
}; };
exports.getAllForwardingEvents = (start, end, offset, callback) => { exports.getAllForwardingEvents = (start, end, offset, callback) => {
logger.log({level: 'INFO', fileName: 'Switch', msg: 'Getting Forwarding Events..'});
if (offset === 0) { responseData = { forwarding_events: [], last_offset_index: 0 }; } if (offset === 0) { responseData = { forwarding_events: [], last_offset_index: 0 }; }
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/switch'; options.url = common.getSelLNServerUrl() + '/v1/switch';
@ -26,23 +27,21 @@ exports.getAllForwardingEvents = (start, end, offset, callback) => {
options.form.num_max_events = num_max_events; options.form.num_max_events = num_max_events;
options.form.index_offset = offset; options.form.index_offset = offset;
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.info({fileName: 'Switch', msg: 'Forwarding History Params: ' + options.form}); logger.log({level: 'DEBUG', fileName: 'Switch', msg: 'Forwarding History Params', data: options.form});
request.post(options).then((body) => { return request.post(options).then((body) => {
logger.info({fileName: 'Switch', msg: 'Forwarding History: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Switch', msg: 'Forwarding History', data: body});
logger.log({level: 'INFO', fileName: 'Switch', msg: 'Forwarding Events Received'});
if (body.forwarding_events) { if (body.forwarding_events) {
responseData.forwarding_events.push(...body.forwarding_events); responseData.forwarding_events.push(...body.forwarding_events);
} }
if (!body.last_offset_index || body.last_offset_index < offset + num_max_events) { if (!body.last_offset_index || body.last_offset_index < offset + num_max_events) {
responseData.last_offset_index = body.last_offset_index ? body.last_offset_index : 0 responseData.last_offset_index = body.last_offset_index ? body.last_offset_index : 0
if (responseData.forwarding_events) { if (responseData.forwarding_events) {
responseData.forwarding_events.forEach(event => {
event.timestamp_str = !event.timestamp ? '' : common.convertTimestampToDate(event.timestamp);
});
responseData.forwarding_events = common.sortDescByKey(responseData.forwarding_events, 'timestamp'); responseData.forwarding_events = common.sortDescByKey(responseData.forwarding_events, 'timestamp');
} }
callback(responseData); return callback(responseData);
} else { } else {
this.getAllForwardingEvents(start, end, offset + num_max_events, callback); return this.getAllForwardingEvents(start, end, offset + num_max_events, callback);
} }
}) })
.catch(errRes => { .catch(errRes => {
@ -53,8 +52,8 @@ exports.getAllForwardingEvents = (start, end, offset, callback) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Switch', lineNum: 54, msg: 'Get All Forwarding Events Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Switch', msg: 'Get All Forwarding Events Error', error: err});
callback({ return callback({
message: "Forwarding Events Failed!", message: "Forwarding Events Failed!",
error: err.error error: err.error
}); });

@ -1,28 +1,27 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getTransactions = (req, res, next) => { exports.getTransactions = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Getting Transactions..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/transactions'; options.url = common.getSelLNServerUrl() + '/v1/transactions';
request(options).then((body) => { request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.info({fileName: 'Transactions', msg: 'Transaction Received: ' + body_str}); logger.log({level: 'DEBUG', fileName: 'Transactions', msg: 'Transaction Received', data: body_str});
if (!body || search_idx > -1 || body.error) { if (!body || search_idx > -1 || body.error) {
logger.error({fileName: 'Transactions', lineNum: 14, msg: 'List Transactions Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Transactions', msg: 'List Transactions Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Fetching Transactions Failed!", message: "Fetching Transactions Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
}); });
} else { } else {
if (body.transactions && body.transactions.length > 0) { if (body.transactions && body.transactions.length > 0) {
body.transactions.forEach(transaction => {
transaction.time_stamp_str = (!transaction.time_stamp) ? '' : common.convertTimestampToDate(transaction.time_stamp);
});
body.transactions = common.sortDescByKey(body.transactions, 'time_stamp'); body.transactions = common.sortDescByKey(body.transactions, 'time_stamp');
} }
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Transactions Received'});
res.status(200).json(body.transactions); res.status(200).json(body.transactions);
} }
}) })
@ -34,7 +33,7 @@ exports.getTransactions = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Transactions', lineNum: 36, msg: 'List Transactions Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Transactions', msg: 'List Transactions Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Transactions Failed!", message: "Fetching Transactions Failed!",
error: err.error error: err.error
@ -43,6 +42,7 @@ exports.getTransactions = (req, res, next) => {
}; };
exports.postTransactions = (req, res, next) => { exports.postTransactions = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Sending Transaction..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/transactions'; options.url = common.getSelLNServerUrl() + '/v1/transactions';
options.form = { options.form = {
@ -56,14 +56,15 @@ exports.postTransactions = (req, res, next) => {
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Transactions', msg: 'Transaction Post Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Transactions', msg: 'Transaction Post Response', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Transactions', lineNum: 60, msg: 'Post Transaction Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Transactions', msg: 'Post Transaction Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Transactions post failed!", message: "Transactions post failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Transaction Sent'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -75,7 +76,7 @@ exports.postTransactions = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Transactions', lineNum: 76, msg: 'Transaction Post Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Transactions', msg: 'Transaction Post Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Transactions post failed!", message: "Transactions post failed!",
error: err.error error: err.error

@ -1,10 +1,11 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var atob = require('atob'); var atob = require('atob');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.genSeed = (req, res, next) => { exports.genSeed = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Generating Seed..'});
options = common.getOptions(); options = common.getOptions();
if ( req.params.passphrase) { if ( req.params.passphrase) {
options.url = common.getSelLNServerUrl() + '/v1/genseed?aezeed_passphrase=' + Buffer.from(atob(req.params.passphrase)).toString('base64'); options.url = common.getSelLNServerUrl() + '/v1/genseed?aezeed_passphrase=' + Buffer.from(atob(req.params.passphrase)).toString('base64');
@ -13,12 +14,13 @@ exports.genSeed = (req, res, next) => {
} }
request(options).then((body) => { request(options).then((body) => {
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Wallet', lineNum: 16, msg: 'Gen Seed Error: ' + ((!body || !body.error) ? 'Error From Server!' : JSON.stringify(body.error))}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Gen Seed Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: "Genseed failed!", message: "Genseed failed!",
error: (!body) ? 'Error From Server!' : body.error error: (!body) ? 'Error From Server!' : body.error
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Seed Generated'});
res.status(200).json(body); res.status(200).json(body);
} }
}) })
@ -30,7 +32,7 @@ exports.genSeed = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Wallet', lineNum: 32, msg: 'Gen Seed Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Gen Seed Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Genseed failed!", message: "Genseed failed!",
error: err.error error: err.error
@ -42,12 +44,14 @@ exports.operateWallet = (req, res, next) => {
options = common.getOptions(); options = common.getOptions();
options.method = 'POST'; options.method = 'POST';
if (!req.params.operation || req.params.operation === 'unlockwallet') { if (!req.params.operation || req.params.operation === 'unlockwallet') {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Unlocking Wallet..'});
options.url = common.getSelLNServerUrl() + '/v1/unlockwallet'; options.url = common.getSelLNServerUrl() + '/v1/unlockwallet';
options.form = JSON.stringify({ options.form = JSON.stringify({
wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64') wallet_password: Buffer.from(atob(req.body.wallet_password)).toString('base64')
}); });
err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!'; err_message = 'Unlocking wallet failed! Verify that lnd is running and the wallet is locked!';
} else { } else {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Initializing Wallet..'});
options.url = common.getSelLNServerUrl() + '/v1/initwallet'; options.url = common.getSelLNServerUrl() + '/v1/initwallet';
if ( req.body.aezeed_passphrase && req.body.aezeed_passphrase !== '') { if ( req.body.aezeed_passphrase && req.body.aezeed_passphrase !== '') {
options.form = JSON.stringify({ options.form = JSON.stringify({
@ -64,17 +68,17 @@ exports.operateWallet = (req, res, next) => {
err_message = 'Initializing wallet failed!'; err_message = 'Initializing wallet failed!';
} }
request(options).then((body) => { request(options).then((body) => {
logger.info({fileName: 'Wallet', msg: 'Wallet Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'Wallet Response', data: body});
const body_str = (!body) ? '' : JSON.stringify(body); const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found'); const search_idx = (!body) ? -1 : body_str.search('Not Found');
if(!body) { if(!body) {
logger.error({fileName: 'Wallet', lineNum: 70, msg: 'Wallet Error: ' + ((error) ? JSON.stringify(error) : err_message)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Wallet Error', error: {error: (error ? error : err_message)}});
res.status(500).json({ res.status(500).json({
message: err_message, message: err_message,
error: (error) ? error : err_message error: (error) ? error : err_message
}); });
} else if(search_idx > -1) { } else if(search_idx > -1) {
logger.error({fileName: 'Wallet', lineNum: 76, msg: 'Wallet Error: ' + err_message}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Wallet Error', error: {error: err_message}});
res.status(500).json({ res.status(500).json({
message: err_message, message: err_message,
error: err_message error: err_message
@ -83,13 +87,14 @@ exports.operateWallet = (req, res, next) => {
if((body.code === 1 && body.error === 'context canceled') || (body.code === 14 && body.error === 'transport is closing')) { if((body.code === 1 && body.error === 'context canceled') || (body.code === 14 && body.error === 'transport is closing')) {
res.status(201).json('Successful'); res.status(201).json('Successful');
} else { } else {
logger.error({fileName: 'Wallet', lineNum: 85, msg: 'Wallet Error: ' + JSON.stringify(body.error)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Wallet Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: err_message, message: err_message,
error: body.error error: body.error
}); });
} }
} else { } else {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Wallet Unlocked/Initialized'});
res.status(201).json('Successful'); res.status(201).json('Successful');
} }
}) })
@ -101,7 +106,7 @@ exports.operateWallet = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Wallet', lineNum: 101, msg: 'Wallet Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Wallet Error', error: err});
if((err.error.code === 1 && err.error.error === 'context canceled') || (err.error.code === 14 && err.error.error === 'transport is closing')) { if((err.error.code === 1 && err.error.error === 'context canceled') || (err.error.code === 14 && err.error.error === 'transport is closing')) {
res.status(201).json('Successful'); res.status(201).json('Successful');
} else { } else {
@ -119,10 +124,12 @@ exports.updateSelNodeOptions = (req, res, next) => {
} }
exports.getUTXOs = (req, res, next) => { exports.getUTXOs = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Getting UTXOs..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v2/wallet/utxos?max_confs=' + req.query.max_confs; options.url = common.getSelLNServerUrl() + '/v2/wallet/utxos?max_confs=' + req.query.max_confs;
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Wallet', msg: 'UTXO List Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO List Response', data: body});
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'UTXOs Received'});
res.status(200).json(body.utxos ? body.utxos : []); res.status(200).json(body.utxos ? body.utxos : []);
}) })
.catch(errRes => { .catch(errRes => {
@ -133,7 +140,7 @@ exports.getUTXOs = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Wallet', lineNum: 143, msg: 'UTXOs Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'UTXOs Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "UTXO list failed!", message: "UTXO list failed!",
error: err.error error: err.error
@ -142,6 +149,7 @@ exports.getUTXOs = (req, res, next) => {
} }
exports.bumpFee = (req, res, next) => { exports.bumpFee = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Bumping Fee..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v2/wallet/bumpfee'; options.url = common.getSelLNServerUrl() + '/v2/wallet/bumpfee';
options.form = {}; options.form = {};
@ -156,7 +164,8 @@ exports.bumpFee = (req, res, next) => {
} }
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Wallet', msg: 'Bump Fee Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'Bump Fee Response', data: body});
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Fee Bumped'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -167,7 +176,7 @@ exports.bumpFee = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Wallet', lineNum: 170, msg: 'Bump Fee Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Bump Fee Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Bump fee failed!", message: "Bump fee failed!",
error: err.error error: err.error
@ -176,6 +185,7 @@ exports.bumpFee = (req, res, next) => {
} }
exports.labelTransaction = (req, res, next) => { exports.labelTransaction = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Labelling Transaction..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v2/wallet/tx/label'; options.url = common.getSelLNServerUrl() + '/v2/wallet/tx/label';
options.form = {}; options.form = {};
@ -183,9 +193,10 @@ exports.labelTransaction = (req, res, next) => {
options.form.label = req.body.label; options.form.label = req.body.label;
options.form.overwrite = req.body.overwrite; options.form.overwrite = req.body.overwrite;
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.info({fileName: 'Wallet', msg: 'Label Transaction Options: ' + JSON.stringify(options.form)}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Wallet', msg: 'Label Transaction Post Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'Label Transaction Post Response', data: body});
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Transaction Labelled'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -196,7 +207,7 @@ exports.labelTransaction = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Wallet', lineNum: 253, msg: 'Label Transaction Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Label Transaction Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Transaction label failed!", message: "Transaction label failed!",
error: err.error error: err.error
@ -205,6 +216,7 @@ exports.labelTransaction = (req, res, next) => {
} }
exports.leaseUTXO = (req, res, next) => { exports.leaseUTXO = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Leasing UTXO..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v2/wallet/utxos/lease'; options.url = common.getSelLNServerUrl() + '/v2/wallet/utxos/lease';
options.form = {}; options.form = {};
@ -214,9 +226,10 @@ exports.leaseUTXO = (req, res, next) => {
output_index: req.body.outputIndex output_index: req.body.outputIndex
}; };
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
logger.info({fileName: 'Wallet', msg: 'UTXO Lease Options: ' + options.form}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Options', data: options.form});
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Wallet', msg: 'UTXO Lease Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Lease Response', data: body});
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'UTXO Leased'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -227,7 +240,7 @@ exports.leaseUTXO = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Wallet', lineNum: 197, msg: 'Lease UTXO Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Lease UTXO Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Lease UTXO failed!", message: "Lease UTXO failed!",
error: err.error error: err.error
@ -236,6 +249,7 @@ exports.leaseUTXO = (req, res, next) => {
} }
exports.releaseUTXO = (req, res, next) => { exports.releaseUTXO = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Releasing UTXO..'});
options = common.getOptions(); options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v2/wallet/utxos/release'; options.url = common.getSelLNServerUrl() + '/v2/wallet/utxos/release';
options.form = {}; options.form = {};
@ -246,7 +260,8 @@ exports.releaseUTXO = (req, res, next) => {
}; };
options.form = JSON.stringify(options.form); options.form = JSON.stringify(options.form);
request.post(options).then((body) => { request.post(options).then((body) => {
logger.info({fileName: 'Wallet', msg: 'UTXO Release Response: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'UTXO Release Response', data: body});
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'UTXO Released'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -257,7 +272,7 @@ exports.releaseUTXO = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Wallet', lineNum: 226, msg: 'Release UTXO Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Release UTXO Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Release UTXO failed!", message: "Release UTXO failed!",
error: err.error error: err.error

@ -2,28 +2,31 @@ var ini = require('ini');
var parseHocon = require('hocon-parser'); var parseHocon = require('hocon-parser');
var fs = require('fs'); var fs = require('fs');
var logger = require('./logger'); var logger = require('./logger');
var common = require('../../common'); var common = require('../../routes/common');
var request = require('request-promise'); var request = require('request-promise');
var options = {}; var options = {};
exports.updateSelectedNode = (req, res, next) => { exports.updateSelectedNode = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Updating Selected Node..'});
const selNodeIndex = req.body.selNodeIndex; const selNodeIndex = req.body.selNodeIndex;
common.selectedNode = common.findNode(selNodeIndex); common.selectedNode = common.findNode(selNodeIndex);
const responseVal = common.selectedNode && common.selectedNode.ln_node ? common.selectedNode.ln_node : ''; const responseVal = common.selectedNode && common.selectedNode.ln_node ? common.selectedNode.ln_node : '';
logger.info({fileName: 'RTLConf', msg: 'Selected Node Updated To: ' + JSON.stringify(responseVal)}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'Selected Node Updated To', data: responseVal});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Selected Node Updated'});
res.status(200).json({status: 'Selected Node Updated To: ' + JSON.stringify(responseVal) + '!'}); res.status(200).json({status: 'Selected Node Updated To: ' + JSON.stringify(responseVal) + '!'});
}; };
exports.getRTLConfig = (req, res, next) => { exports.getRTLConfig = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Getting RTL Configuration..'});
var confFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; var confFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
logger.info({fileName: 'RTLConf', msg: 'Getting Node Config'}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'Getting Node Config'});
fs.readFile(confFile, 'utf8', function(err, data) { fs.readFile(confFile, 'utf8', function(err, data) {
if (err) { if (err) {
if (err.code === 'ENOENT') { if (err.code === 'ENOENT') {
logger.error({fileName: 'RTLConf', lineNum: 22, msg: 'Node config does not exist!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Node config does not exist!', error: {error: 'Node config does not exist.'}});
res.status(200).json({ defaultNodeIndex: 0, selectedNodeIndex: 0, sso: {}, nodes: [] }); res.status(200).json({ defaultNodeIndex: 0, selectedNodeIndex: 0, sso: {}, nodes: [] });
} else { } else {
logger.error({fileName: 'RTLConf', lineNum: 25, msg: 'Getting Node Config Failed!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Getting Node Config Failed!', error: err});
res.status(500).json({ res.status(500).json({
message: "Reading Node Config Failed!", message: "Reading Node Config Failed!",
error: err error: err
@ -60,12 +63,14 @@ exports.getRTLConfig = (req, res, next) => {
authentication: authentication}) authentication: authentication})
}); });
} }
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'RTL Configuration Received'});
res.status(200).json({ defaultNodeIndex: nodeConfData.defaultNodeIndex, selectedNodeIndex: common.selectedNode.index, sso: sso, enable2FA: enable2FA, nodes: nodesArr }); res.status(200).json({ defaultNodeIndex: nodeConfData.defaultNodeIndex, selectedNodeIndex: common.selectedNode.index, sso: sso, enable2FA: enable2FA, nodes: nodesArr });
} }
}); });
}; };
exports.updateUISettings = (req, res, next) => { exports.updateUISettings = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Updating UI Settings..'});
var RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; var RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.nodes.find(node => { config.nodes.find(node => {
@ -94,11 +99,12 @@ exports.updateUISettings = (req, res, next) => {
}); });
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.info({fileName: 'RTLConf', msg: 'Updating Node Settings Succesful!'}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'Updating Node Settings Succesful!'});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'UI Settings Updated'});
res.status(201).json({message: 'Node Settings Updated Successfully'}); res.status(201).json({message: 'Node Settings Updated Successfully'});
} }
catch (err) { catch (err) {
logger.error({fileName: 'Conf', lineNum: 101, msg: 'Updating Node Settings Failed!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating Node Settings Failed!', error: {error: 'Updating node settings failed.'}});
res.status(500).json({ res.status(500).json({
message: "Updating Node Settings Failed!", message: "Updating Node Settings Failed!",
error: 'Updating Node Settings Failed!' error: 'Updating Node Settings Failed!'
@ -107,6 +113,7 @@ exports.updateUISettings = (req, res, next) => {
}; };
exports.update2FASettings = (req, res, next) => { exports.update2FASettings = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Updating 2FA Settings..'});
var RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; var RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.secret2fa = req.body.secret2fa; config.secret2fa = req.body.secret2fa;
@ -114,11 +121,12 @@ exports.update2FASettings = (req, res, next) => {
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
common.rtl_secret2fa = config.secret2fa; common.rtl_secret2fa = config.secret2fa;
logger.info({fileName: 'RTLConf', msg: message}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: message});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: '2FA Updated'});
res.status(201).json({message: message}); res.status(201).json({message: message});
} }
catch (err) { catch (err) {
logger.error({fileName: 'Conf', lineNum: 121, msg: 'Updating 2FA Settings Failed!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating 2FA Settings Failed!', error: {error: 'Updating 2FA settings failed.'}});
res.status(500).json({ res.status(500).json({
message: "Updating 2FA Settings Failed!", message: "Updating 2FA Settings Failed!",
error: 'Updating 2FA Settings Failed!' error: 'Updating 2FA Settings Failed!'
@ -127,16 +135,18 @@ exports.update2FASettings = (req, res, next) => {
}; };
exports.updateDefaultNode = (req, res, next) => { exports.updateDefaultNode = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Updating Default Node..'});
RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.defaultNodeIndex = req.body.defaultNodeIndex; config.defaultNodeIndex = req.body.defaultNodeIndex;
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.info({fileName: 'RTLConf', msg: 'Updating Default Node Succesful!'}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'Updating Default Node Succesful!'});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated'});
res.status(201).json({message: 'Default Node Updated Successfully'}); res.status(201).json({message: 'Default Node Updated Successfully'});
} }
catch (err) { catch (err) {
logger.error({fileName: 'Conf', lineNum: 139, msg: 'Updating Default Node Failed!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating Default Node Failed!', error: {error: 'Updating dafault node failed.'}});
res.status(500).json({ res.status(500).json({
message: "Updating Default Node Failed!", message: "Updating Default Node Failed!",
error: 'Updating Default Node Failed!' error: 'Updating Default Node Failed!'
@ -145,6 +155,7 @@ exports.updateDefaultNode = (req, res, next) => {
}; };
exports.getConfig = (req, res, next) => { exports.getConfig = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Reading Configuration File..'});
let confFile = ''; let confFile = '';
let fileFormat = 'INI'; let fileFormat = 'INI';
switch (req.params.nodeType) { switch (req.params.nodeType) {
@ -162,10 +173,10 @@ exports.getConfig = (req, res, next) => {
confFile = ''; confFile = '';
break; break;
} }
logger.info({fileName: 'RTLConf', msg: 'Node Type: ' + req.params.nodeType + ', File Path: ' + confFile}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: '[Node Type, File Path]', data: [req.params.nodeType, confFile]});
fs.readFile(confFile, 'utf8', function(err, data) { fs.readFile(confFile, 'utf8', function(err, data) {
if (err) { if (err) {
logger.error({fileName: 'Conf', lineNum: 168, msg: 'Reading Conf Failed!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Reading Conf Failed!', error: err});
res.status(500).json({ res.status(500).json({
message: "Reading Config File Failed!", message: "Reading Config File Failed!",
error: err error: err
@ -184,17 +195,19 @@ exports.getConfig = (req, res, next) => {
} }
jsonConfig = maskPasswords(jsonConfig); jsonConfig = maskPasswords(jsonConfig);
const responseJSON = (fileFormat === 'JSON') ? jsonConfig : ini.stringify(jsonConfig); const responseJSON = (fileFormat === 'JSON') ? jsonConfig : ini.stringify(jsonConfig);
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Configuration Data Received'});
res.status(200).json({format: fileFormat, data: responseJSON}); res.status(200).json({format: fileFormat, data: responseJSON});
} }
}); });
}; };
exports.getFile = (req, res, next) => { exports.getFile = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Getting File..'});
let file = req.query.path ? req.query.path : (common.selectedNode.channel_backup_path + common.path_separator + 'channel-' + req.query.channel.replace(':', '-') + '.bak'); let file = req.query.path ? req.query.path : (common.selectedNode.channel_backup_path + common.path_separator + 'channel-' + req.query.channel.replace(':', '-') + '.bak');
logger.info({fileName: 'Conf', msg: 'Channel Point: ' + req.query.channel + ', File Path: ' + file}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: '[Channel Point, File Path]', data: [req.query.channel, file]});
fs.readFile(file, 'utf8', function(err, data) { fs.readFile(file, 'utf8', function(err, data) {
if (err) { if (err) {
logger.error({fileName: 'Conf', lineNum: 207, msg: 'Reading File Failed!' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Reading File Failed!', error: err});
if (err.code && err.code === 'ENOENT') { if (err.code && err.code === 'ENOENT') {
err.code = 'Backup File Not Found!'; err.code = 'Backup File Not Found!';
} }
@ -203,13 +216,15 @@ exports.getFile = (req, res, next) => {
error: err error: err
}); });
} else { } else {
logger.info({fileName: 'Conf', msg: 'File Data: ' + data}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'File Data', data: data});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'File Data Received'});
res.status(200).json(data); res.status(200).json(data);
} }
}); });
}; };
exports.getCurrencyRates = (req, res, next) => { exports.getCurrencyRates = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Getting Currency Rates..'});
options.url = 'https://blockchain.info/ticker'; options.url = 'https://blockchain.info/ticker';
request(options).then((body) => { request(options).then((body) => {
if(!body || body.error) { if(!body || body.error) {
@ -218,12 +233,12 @@ exports.getCurrencyRates = (req, res, next) => {
error: (!body) ? 'Error From External Server!' : body.error error: (!body) ? 'Error From External Server!' : body.error
}); });
} else { } else {
res.status(200).json(body); logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Currency Rates Received'});
body = JSON.parse(body); res.status(200).json(JSON.parse(body));
} }
}) })
.catch(function (err) { .catch(function (err) {
logger.error({fileName: 'Conf', lineNum: 210, msg: 'Fetching Rates Failed! ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Fetching Rates Failed!', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Fetching Rates Failed!", message: "Fetching Rates Failed!",
error: err.error error: err.error
@ -232,17 +247,19 @@ exports.getCurrencyRates = (req, res, next) => {
}; };
exports.updateSSO = (req, res, next) => { exports.updateSSO = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Updating SSO Settings..'});
RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
delete config.SSO; delete config.SSO;
config.SSO = req.body.SSO; config.SSO = req.body.SSO;
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.info({fileName: 'RTLConf', msg: 'Updating SSO Succesful!'}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'Updating SSO Succesful!'});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated'});
res.status(201).json({message: 'SSO Updated Successfully'}); res.status(201).json({message: 'SSO Updated Successfully'});
} }
catch (err) { catch (err) {
logger.error({fileName: 'RTLConf', lineNum: 279, msg: 'Updating SSO Failed!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating SSO Failed!', error: {error: 'Updating SSO failed.'}});
res.status(500).json({ res.status(500).json({
message: "Updating SSO Failed!", message: "Updating SSO Failed!",
error: 'Updating SSO Failed!' error: 'Updating SSO Failed!'
@ -251,6 +268,7 @@ exports.updateSSO = (req, res, next) => {
}; };
exports.updateServiceSettings = (req, res, next) => { exports.updateServiceSettings = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Updating Service Settings..'});
var RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; var RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const selectedNode = common.findNode(common.selectedNode.index); const selectedNode = common.findNode(common.selectedNode.index);
@ -293,11 +311,12 @@ exports.updateServiceSettings = (req, res, next) => {
}); });
try { try {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8'); fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
logger.info({fileName: 'RTLConf', msg: 'Updating Service Settings Succesful!'}); logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'Updating Service Settings Succesful!'});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Service Settings Updated'});
res.status(201).json({message: 'Service Settings Updated Successfully'}); res.status(201).json({message: 'Service Settings Updated Successfully'});
} }
catch (err) { catch (err) {
logger.error({fileName: 'RTLConf', lineNum: 333, msg: 'Updating Service Settings Failed!'}); logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating Service Settings Failed!', error: {error: 'Updating service settings failed.'}});
res.status(500).json({ res.status(500).json({
message: "Updating Service Settings Failed!", message: "Updating Service Settings Failed!",
error: 'Updating Service Settings Failed!' error: 'Updating Service Settings Failed!'
@ -317,7 +336,7 @@ var maskPasswords = function(obj) {
&& (keys[i].toLowerCase().includes('password') || keys[i].toLowerCase().includes('multipass') && (keys[i].toLowerCase().includes('password') || keys[i].toLowerCase().includes('multipass')
|| keys[i].toLowerCase().includes('rpcpass') || keys[i].toLowerCase().includes('rpcpassword')) || keys[i].toLowerCase().includes('rpcpass') || keys[i].toLowerCase().includes('rpcpassword'))
) { ) {
obj[keys[i]] = obj[keys[i]].replace(/./g, '*'); obj[keys[i]] = '********************';
} }
} }
} }

@ -1,5 +1,5 @@
var common = require('../../common'); var common = require('../../routes/common');
var connect = require('../../connect'); var connect = require('../../routes/connect');
var logger = require('./logger'); var logger = require('./logger');
const jwt = require("jsonwebtoken"); const jwt = require("jsonwebtoken");
const otplib = require("otplib"); const otplib = require("otplib");
@ -29,7 +29,7 @@ handleError = (failed, currentTime, errMsg) => {
if (failed.count >= ALLOWED_LOGIN_ATTEMPTS && (currentTime <= (failed.lastTried + LOCKING_PERIOD))) { if (failed.count >= ALLOWED_LOGIN_ATTEMPTS && (currentTime <= (failed.lastTried + LOCKING_PERIOD))) {
return { return {
message: "Multiple Failed Login Attempts!", message: "Multiple Failed Login Attempts!",
error: "Application locked for " + (LOCKING_PERIOD/ONE_MINUTE) + " minutes due to multiple failed login attempts! Try again after " + common.convertTimestampToLocalDate((failed.lastTried + LOCKING_PERIOD)/1000) + "!" error: "Application locked for " + (LOCKING_PERIOD/ONE_MINUTE) + " minutes due to multiple failed login attempts! Try again after " + common.convertTimestampToTime((failed.lastTried + LOCKING_PERIOD)/1000) + "!"
}; };
} else { } else {
return { return {
@ -47,8 +47,10 @@ exports.verifyToken = (twoFAToken) => {
}; };
exports.authenticateUser = (req, res, next) => { exports.authenticateUser = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..'});
if(+common.rtl_sso) { if(+common.rtl_sso) {
if(req.body.authenticateWith === 'JWT' && jwt.verify(req.body.authenticationValue, common.secret_key)) { if(req.body.authenticateWith === 'JWT' && jwt.verify(req.body.authenticationValue, common.secret_key)) {
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated'});
res.status(200).json({ token: token }); res.status(200).json({ token: token });
} else if (req.body.authenticateWith === 'PASSWORD' && common.cookie.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie).digest('hex'), 'utf-8'), Buffer.from(req.body.authenticationValue, 'utf-8'))) { } else if (req.body.authenticateWith === 'PASSWORD' && common.cookie.trim().length >= 32 && crypto.timingSafeEqual(Buffer.from(crypto.createHash('sha256').update(common.cookie).digest('hex'), 'utf-8'), Buffer.from(req.body.authenticationValue, 'utf-8'))) {
connect.refreshCookie(common.rtl_cookie_path); connect.refreshCookie(common.rtl_cookie_path);
@ -56,9 +58,10 @@ exports.authenticateUser = (req, res, next) => {
{ user: 'SSO_USER', configPath: common.nodes[0].config_path, macaroonPath: common.nodes[0].macaroon_path }, { user: 'SSO_USER', configPath: common.nodes[0].config_path, macaroonPath: common.nodes[0].macaroon_path },
common.secret_key common.secret_key
); );
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated.'});
res.status(200).json({ token: token }); res.status(200).json({ token: token });
} else { } else {
logger.error({fileName: 'Authenticate', lineNum: 61, msg: 'SSO Authentication Failed! Access key too short or does not match.'}); logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'SSO Authentication Failed! Access key too short or does not match.', error: {error: 'Access key too short or does not match.'}});
res.status(406).json({ res.status(406).json({
message: "SSO Authentication Failed!", message: "SSO Authentication Failed!",
error: "SSO failed. Access key too short or does not match." error: "SSO failed. Access key too short or does not match."
@ -72,7 +75,7 @@ exports.authenticateUser = (req, res, next) => {
if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) { if (common.rtl_pass === password && failed.count < ALLOWED_LOGIN_ATTEMPTS) {
if (req.body.twoFAToken && req.body.twoFAToken !== '') { if (req.body.twoFAToken && req.body.twoFAToken !== '') {
if (!this.verifyToken(req.body.twoFAToken)) { if (!this.verifyToken(req.body.twoFAToken)) {
logger.error({fileName: 'Authenticate', lineNum: 75, msg: 'Invalid Token! Failed IP ' + reqIP}); logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: {error: 'Invalid token.'}});
failed.count = failed.count + 1; failed.count = failed.count + 1;
failed.lastTried = currentTime; failed.lastTried = currentTime;
return res.status(401).json(handleError(failed, currentTime, 'Invalid 2FA Token!')); return res.status(401).json(handleError(failed, currentTime, 'Invalid 2FA Token!'));
@ -84,9 +87,10 @@ exports.authenticateUser = (req, res, next) => {
{ user: rpcUser, configPath: common.nodes[0].config_path, macaroonPath: common.nodes[0].macaroon_path }, { user: rpcUser, configPath: common.nodes[0].config_path, macaroonPath: common.nodes[0].macaroon_path },
common.secret_key common.secret_key
); );
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated'});
res.status(200).json({ token: token }); res.status(200).json({ token: token });
} else { } else {
logger.error({fileName: 'Authenticate', lineNum: 89, msg: 'Invalid Password! Failed IP ' + reqIP}); logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Password! Failed IP ' + reqIP, error: {error: 'Invalid password.'}});
failed.count = common.rtl_pass !== password ? (failed.count + 1) : failed.count; failed.count = common.rtl_pass !== password ? (failed.count + 1) : failed.count;
failed.lastTried = common.rtl_pass !== password ? currentTime : failed.lastTried; failed.lastTried = common.rtl_pass !== password ? currentTime : failed.lastTried;
return res.status(401).json(handleError(failed, currentTime, 'Invalid Password!')); return res.status(401).json(handleError(failed, currentTime, 'Invalid Password!'));
@ -95,8 +99,9 @@ exports.authenticateUser = (req, res, next) => {
}; };
exports.resetPassword = (req, res, next) => { exports.resetPassword = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..'});
if(+common.rtl_sso) { if(+common.rtl_sso) {
logger.error({fileName: 'Authenticate', lineNum: 99, msg: 'Password Reset Failed!'}); logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'Password Reset Failed!', error: {error: 'Password reset failed.'}});
res.status(401).json({ res.status(401).json({
message: "Password Reset Failed!", message: "Password Reset Failed!",
error: "Password cannot be reset for SSO authentication!" error: "Password cannot be reset for SSO authentication!"
@ -110,9 +115,10 @@ exports.resetPassword = (req, res, next) => {
{ user: rpcUser, configPath: common.nodes[0].config_path, macaroonPath: common.nodes[0].macaroon_path }, { user: rpcUser, configPath: common.nodes[0].config_path, macaroonPath: common.nodes[0].macaroon_path },
common.secret_key common.secret_key
); );
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful'});
res.status(200).json({ token: token }); res.status(200).json({ token: token });
} else { } else {
logger.error({fileName: 'Authenticate', lineNum: 115, msg: 'Password Reset Failed!'}); logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'Password Reset Failed!', error: {error: 'Password reset failed.'}});
res.status(401).json({ res.status(401).json({
message: "Password Reset Failed!", message: "Password Reset Failed!",
error: "Old password is not correct!" error: "Old password is not correct!"

@ -1,14 +1,16 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('../shared/logger'); var logger = require('../shared/logger');
var options = {}; var options = {};
exports.getInfo = (req, res, next) => { exports.getInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting Boltz Information..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Boltz Get Info Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Boltz Get Info Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/info'; options.url = options.url + '/v1/info';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Boltz', msg: 'Boltz Get Info: ' + JSON.stringify(body)}); logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Information Received'});
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Boltz Get Info', data: body});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -19,7 +21,7 @@ exports.getInfo = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 22, msg: 'Boltz Get Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz Get Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Boltz Get Info Failed!", message: "Boltz Get Info Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -28,11 +30,13 @@ exports.getInfo = (req, res, next) => {
}; };
exports.getServiceInfo = (req, res, next) => { exports.getServiceInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting Service Information..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Boltz Get Service Info Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Boltz Get Service Info Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/serviceinfo'; options.url = options.url + '/v1/serviceinfo';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Boltz', msg: 'Boltz Get Service Info: ' + JSON.stringify(body)}); logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Service Information Received'});
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Boltz Get Service Info', data: body});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -43,7 +47,7 @@ exports.getServiceInfo = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 46, msg: 'Boltz Get Service Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz Get Service Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Boltz Get Service Info Failed!", message: "Boltz Get Service Info Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -52,13 +56,15 @@ exports.getServiceInfo = (req, res, next) => {
}; };
exports.listSwaps = (req, res, next) => { exports.listSwaps = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting List Swaps..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Boltz List Swaps Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Boltz List Swaps Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/listswaps'; options.url = options.url + '/v1/listswaps';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Boltz', msg: 'Boltz List Swaps Info: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Boltz List Swaps Info', data: body});
if (body && body.swaps && body.swaps.length && body.swaps.length > 0) { body.swaps = body.swaps.reverse(); } if (body && body.swaps && body.swaps.length && body.swaps.length > 0) { body.swaps = body.swaps.reverse(); }
if (body && body.reverseSwaps && body.reverseSwaps.length && body.reverseSwaps.length > 0) { body.reverseSwaps = body.reverseSwaps.reverse(); } if (body && body.reverseSwaps && body.reverseSwaps.length && body.reverseSwaps.length > 0) { body.reverseSwaps = body.reverseSwaps.reverse(); }
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'List Swaps Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -69,7 +75,7 @@ exports.listSwaps = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 70, msg: 'Boltz List Swaps Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz List Swaps Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Boltz List Swaps Failed!", message: "Boltz List Swaps Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -78,11 +84,13 @@ exports.listSwaps = (req, res, next) => {
}; };
exports.getSwapInfo = (req, res, next) => { exports.getSwapInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting Swap..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Boltz Swap Info Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Boltz Swap Info Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/swap/' + req.params.swapId; options.url = options.url + '/v1/swap/' + req.params.swapId;
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Boltz', msg: 'Boltz Swap Info: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Boltz Swap Info', data: body});
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Swap Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -93,7 +101,7 @@ exports.getSwapInfo = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 94, msg: 'Boltz Swap Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz Swap Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Boltz Swap Info Failed!", message: "Boltz Swap Info Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -102,21 +110,23 @@ exports.getSwapInfo = (req, res, next) => {
}; };
exports.createSwap = (req, res, next) => { exports.createSwap = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Create Swap Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Create Swap Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/createswap'; options.url = options.url + '/v1/createswap';
options.body = { amount: req.body.amount }; options.body = { amount: req.body.amount };
if (req.body.address !== '') { options.body.address = req.body.address; } if (req.body.address !== '') { options.body.address = req.body.address; }
logger.info({fileName: 'Boltz', msg: 'Create Swap Body: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Body', data: options.body});
request.post(options).then(createSwapRes => { request.post(options).then(createSwapRes => {
logger.info({fileName: 'Boltz', msg: 'Create Swap Response: ' + JSON.stringify(createSwapRes)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Response', data: createSwapRes});
if(!createSwapRes || createSwapRes.error) { if(!createSwapRes || createSwapRes.error) {
logger.error({fileName: 'Boltz', lineNum: 112, msg: 'Create Swap Error: ' + JSON.stringify(createSwapRes.error)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Swap Error', error: createSwapRes.error});
res.status(500).json({ res.status(500).json({
message: 'Create Swap Failed!', message: 'Create Swap Failed!',
error: (!createSwapRes) ? 'Error From Server!' : createSwapRes.error.message error: (!createSwapRes) ? 'Error From Server!' : createSwapRes.error.message
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Swap Created'});
res.status(201).json(createSwapRes); res.status(201).json(createSwapRes);
} }
}) })
@ -128,7 +138,7 @@ exports.createSwap = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 129, msg: 'Create Swap Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Swap Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Create Swap Failed!", message: "Create Swap Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -137,21 +147,23 @@ exports.createSwap = (req, res, next) => {
}; };
exports.createReverseSwap = (req, res, next) => { exports.createReverseSwap = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Create Reverse Swap Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Create Reverse Swap Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/createreverseswap'; options.url = options.url + '/v1/createreverseswap';
options.body = { amount: req.body.amount }; options.body = { amount: req.body.amount };
if (req.body.address !== '') { options.body.address = req.body.address; } if (req.body.address !== '') { options.body.address = req.body.address; }
logger.info({fileName: 'Boltz', msg: 'Create Reverse Swap Body: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body});
request.post(options).then(createReverseSwapRes => { request.post(options).then(createReverseSwapRes => {
logger.info({fileName: 'Boltz', msg: 'Create Reverse Swap Response: ' + JSON.stringify(createReverseSwapRes)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Response', data: createReverseSwapRes});
if(!createReverseSwapRes || createReverseSwapRes.error) { if(!createReverseSwapRes || createReverseSwapRes.error) {
logger.error({fileName: 'Boltz', lineNum: 147, msg: 'Create Reverse Swap Error: ' + JSON.stringify(createReverseSwapRes.error)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Reverse Swap Error', error: createReverseSwapRes.error});
res.status(500).json({ res.status(500).json({
message: 'Create Reverse Swap Failed!', message: 'Create Reverse Swap Failed!',
error: (!createReverseSwapRes) ? 'Error From Server!' : createReverseSwapRes.error.message error: (!createReverseSwapRes) ? 'Error From Server!' : createReverseSwapRes.error.message
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Reverse Swap Created'});
res.status(201).json(createReverseSwapRes); res.status(201).json(createReverseSwapRes);
} }
}) })
@ -163,7 +175,7 @@ exports.createReverseSwap = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 164, msg: 'Create Reverse Swap Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Reverse Swap Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Create Reverse Swap Failed!", message: "Create Reverse Swap Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -172,21 +184,23 @@ exports.createReverseSwap = (req, res, next) => {
}; };
exports.createChannel = (req, res, next) => { exports.createChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Create Channel Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Create Channel Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/createchannel'; options.url = options.url + '/v1/createchannel';
options.body = { amount: req.body.amount }; options.body = { amount: req.body.amount };
if (req.body.address !== '') { options.body.address = req.body.address; } if (req.body.address !== '') { options.body.address = req.body.address; }
logger.info({fileName: 'Boltz', msg: 'Create Channel Body: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Body', data: options.body});
request.post(options).then(createChannelRes => { request.post(options).then(createChannelRes => {
logger.info({fileName: 'Boltz', msg: 'Create Channel Response: ' + JSON.stringify(createChannelRes)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Response', data: createChannelRes});
if(!createChannelRes || createChannelRes.error) { if(!createChannelRes || createChannelRes.error) {
logger.error({fileName: 'Boltz', lineNum: 182, msg: 'Create Channel Error: ' + JSON.stringify(createChannelRes.error)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Channel Error', error: createChannelRes.error});
res.status(500).json({ res.status(500).json({
message: 'Create Channel Failed!', message: 'Create Channel Failed!',
error: (!createChannelRes) ? 'Error From Server!' : createChannelRes.error.message error: (!createChannelRes) ? 'Error From Server!' : createChannelRes.error.message
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Channel Created'});
res.status(201).json(createChannelRes); res.status(201).json(createChannelRes);
} }
}) })
@ -198,7 +212,7 @@ exports.createChannel = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 199, msg: 'Create Channel Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Channel Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Create Channel Failed!", message: "Create Channel Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -207,18 +221,20 @@ exports.createChannel = (req, res, next) => {
}; };
exports.deposit = (req, res, next) => { exports.deposit = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Deposit Start..'});
options = common.getBoltzServerOptions(); options = common.getBoltzServerOptions();
if(options.url === '') { return res.status(500).json({message: "Deposit Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Deposit Failed!",error: { message: 'Boltz Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/deposit'; options.url = options.url + '/v1/deposit';
request.post(options).then(depositRes => { request.post(options).then(depositRes => {
logger.info({fileName: 'Boltz', msg: 'Deposit Response: ' + JSON.stringify(depositRes)}); logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Deposit Response', data: depositRes});
if(!depositRes || depositRes.error) { if(!depositRes || depositRes.error) {
logger.error({fileName: 'Boltz', lineNum: 214, msg: 'Deposit Error: ' + JSON.stringify(depositRes.error)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Deposit Error', error: depositRes.error});
res.status(500).json({ res.status(500).json({
message: 'Deposit Failed!', message: 'Deposit Failed!',
error: (!depositRes) ? 'Error From Server!' : depositRes.error.message error: (!depositRes) ? 'Error From Server!' : depositRes.error.message
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Deposit Finished'});
res.status(201).json(depositRes); res.status(201).json(depositRes);
} }
}) })
@ -230,7 +246,7 @@ exports.deposit = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Boltz', lineNum: 231, msg: 'Deposit Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Deposit Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Deposit Failed!", message: "Deposit Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err

@ -1,32 +1,62 @@
var fs = require('fs'); var fs = require('fs');
var common = require('../../common'); var common = require('../../routes/common');
exports.info = (msgJSON, selNode = common.selectedNode) => { exports.log = (msgJSON, selNode = common.selectedNode) => {
const msgStr = '\r\nINFO: ' + msgJSON.fileName + ' => ' + msgJSON.msg; let msgStr = '\r\n[' + new Date().toISOString() + '] ' + msgJSON.level + ': ' + msgJSON.fileName + ' => ' + msgJSON.msg;
if (msgJSON.fileName !== 'Config Setup Variable') { switch (msgJSON.level) {
console.log(msgStr); case 'ERROR':
} msgStr = msgStr + ': ' + (msgJSON.error && typeof msgJSON.error === 'object' ? JSON.stringify(msgJSON.error) : (msgJSON.error && typeof msgJSON.error === 'string') ? msgJSON.error : '');
if(selNode && selNode.enable_logging) { console.error(msgStr);
fs.appendFile(selNode.log_file, msgStr, function(err) { if(selNode && selNode.enable_logging) {
if (err) { fs.appendFile(selNode.log_file, msgStr, function(err) {
return ({ error: 'Updating Log Failed!' }); if (err) {
} else { return ({ error: 'Updating Log Failed!' });
return ({ message: 'Log Updated Successfully' }); } else {
return ({ message: 'Log Updated Successfully' });
}
});
} }
}); break;
}
}
exports.error = (msgJSON, selNode = common.selectedNode) => { case 'INFO':
const msgStr = '\r\nERROR: ' + msgJSON.fileName + '(' + msgJSON.lineNum + ') => ' + msgJSON.msg; if(selNode && selNode.enable_logging && msgJSON.data) {
console.error(msgStr); msgStr = msgStr + ': ' + (msgJSON.data && typeof msgJSON.data === 'object' ? JSON.stringify(msgJSON.data) : (msgJSON.data && typeof msgJSON.data === 'string') ? msgJSON.data : '');
if(selNode && selNode.enable_logging) { if (msgJSON.fileName !== 'Config Setup Variable') { console.log(msgStr); }
fs.appendFile(selNode.log_file, msgStr, function(err) { fs.appendFile(selNode.log_file, msgStr, function(err) {
if (err) { if (err) {
return ({ error: 'Updating Log Failed!' }); return ({ error: 'Updating Log Failed!' });
} else {
return ({ message: 'Log Updated Successfully' });
}
});
} else { } else {
return ({ message: 'Log Updated Successfully' }); console.log(msgStr + '.');
} }
}); break;
case 'DEBUG':
if(selNode && selNode.enable_logging) {
if (msgJSON.data && typeof msgJSON.data !== 'string' && msgJSON.data.length && msgJSON.data.length > 0) {
msgStr = msgJSON.data.reduce((accumulator, dataEle) => {
return accumulator + (typeof dataEle === 'object' ? JSON.stringify(dataEle) : (typeof dataEle === 'string') ? dataEle : '') + ', ';
}, msgStr + ': [');
msgStr = msgStr.slice(0, -2) + ']';
} else {
msgStr = msgStr + ': ' + (msgJSON.data && typeof msgJSON.data === 'object' ? JSON.stringify(msgJSON.data) : (msgJSON.data && typeof msgJSON.data === 'string') ? msgJSON.data : '');
}
if (msgJSON.fileName !== 'Config Setup Variable') { console.log(msgStr); }
fs.appendFile(selNode.log_file, msgStr, function(err) {
if (err) {
return ({ error: 'Updating Log Failed!' });
} else {
return ({ message: 'Log Updated Successfully' });
}
});
}
break;
default:
console.log(msgStr, selNode);
break
} }
} }

@ -1,9 +1,10 @@
var request = require('request-promise'); var request = require('request-promise');
var common = require('../../common'); var common = require('../../routes/common');
var logger = require('./logger'); var logger = require('./logger');
var options = {}; var options = {};
exports.loopOut = (req, res, next) => { exports.loopOut = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Looping Out..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop Out Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop Out Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/out'; options.url = options.url + '/v1/loop/out';
@ -20,16 +21,17 @@ exports.loopOut = (req, res, next) => {
}; };
if (req.body.chanId !== '') { options.body['loop_out_channel'] = req.body.chanId; } if (req.body.chanId !== '') { options.body['loop_out_channel'] = req.body.chanId; }
if (req.body.destAddress !== '') { options.body['dest'] = req.body.destAddress; } if (req.body.destAddress !== '') { options.body['dest'] = req.body.destAddress; }
logger.info({fileName: 'Loop', msg: 'Loop Out Body: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body});
request.post(options).then(loopOutRes => { request.post(options).then(loopOutRes => {
logger.info({fileName: 'Loop', msg: 'Loop Out: ' + JSON.stringify(loopOutRes)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out', data: loopOutRes});
if(!loopOutRes || loopOutRes.error) { if(!loopOutRes || loopOutRes.error) {
logger.error({fileName: 'Loop', lineNum: 28, msg: 'Loop Out Error: ' + JSON.stringify(loopOutRes.error)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Error', error: loopOutRes.error});
res.status(500).json({ res.status(500).json({
message: 'Loop Out Failed!', message: 'Loop Out Failed!',
error: (!loopOutRes) ? 'Error From Server!' : loopOutRes.error.message error: (!loopOutRes) ? 'Error From Server!' : loopOutRes.error.message
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop Out Finished'});
res.status(201).json(loopOutRes); res.status(201).json(loopOutRes);
} }
}) })
@ -41,7 +43,7 @@ exports.loopOut = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 44, msg: 'Loop Out Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop Out Failed!", message: "Loop Out Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -50,11 +52,13 @@ exports.loopOut = (req, res, next) => {
}; };
exports.loopOutTerms = (req, res, next) => { exports.loopOutTerms = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop Out Terms..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop Out Terms Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop Out Terms Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/out/terms'; options.url = options.url + '/v1/loop/out/terms';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Loop', msg: 'Loop Out Terms: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Terms', data: body});
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop Out Terms Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -65,7 +69,7 @@ exports.loopOutTerms = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 67, msg: 'Loop Out Terms Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Terms Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop Out Terms Failed!", message: "Loop Out Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -74,14 +78,16 @@ exports.loopOutTerms = (req, res, next) => {
}; };
exports.loopOutQuote = (req, res, next) => { exports.loopOutQuote = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop Out Quotes..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop Out Quote Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop Out Quote Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/out/quote/' + req.params.amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline; options.url = options.url + '/v1/loop/out/quote/' + req.params.amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline;
logger.info({fileName: 'Loop', msg: 'Loop Out Quote URL: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Quote URL', data: options.url});
request(options).then(function (quoteRes) { request(options).then(function (quoteRes) {
logger.info({fileName: 'Loop', msg: 'Loop Out Quote: ' + JSON.stringify(quoteRes)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Quote', data: quoteRes});
quoteRes.amount = +req.params.amount; quoteRes.amount = +req.params.amount;
quoteRes.swap_payment_dest = quoteRes.swap_payment_dest ? Buffer.from(quoteRes.swap_payment_dest, 'base64').toString('hex') : ''; quoteRes.swap_payment_dest = quoteRes.swap_payment_dest ? Buffer.from(quoteRes.swap_payment_dest, 'base64').toString('hex') : '';
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop Out Quotes Received'});
res.status(200).json(quoteRes); res.status(200).json(quoteRes);
}) })
.catch(errRes => { .catch(errRes => {
@ -92,7 +98,7 @@ exports.loopOutQuote = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 94, msg: 'Loop Out Quote Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Quote Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop Out Quote Failed!", message: "Loop Out Quote Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -101,23 +107,25 @@ exports.loopOutQuote = (req, res, next) => {
}; };
exports.loopOutTermsAndQuotes = (req, res, next) => { exports.loopOutTermsAndQuotes = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop Out Terms & Quotes..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop Out Terms And Quotes Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop Out Terms And Quotes Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/out/terms'; options.url = options.url + '/v1/loop/out/terms';
request(options).then(function(terms) { request(options).then(function(terms) {
logger.info({fileName: 'Loop', msg: 'Loop Out Terms: ' + JSON.stringify(terms)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Terms', data: terms});
const options1 = common.getSwapServerOptions(); const options2 = common.getSwapServerOptions(); const options1 = common.getSwapServerOptions(); const options2 = common.getSwapServerOptions();
options1.url = options1.url + '/v1/loop/out/quote/' + terms.min_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline; options1.url = options1.url + '/v1/loop/out/quote/' + terms.min_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline;
options2.url = options2.url + '/v1/loop/out/quote/' + terms.max_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline; options2.url = options2.url + '/v1/loop/out/quote/' + terms.max_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline;
logger.info({fileName: 'Loop', msg: 'Loop Out Min Quote Options: ' + JSON.stringify(options1)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Min Quote Options', data: options1});
logger.info({fileName: 'Loop', msg: 'Loop Out Max Quote Options: ' + JSON.stringify(options2)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Max Quote Options', data: options2});
Promise.all([request(options1), request(options2)]).then(function(values) { return Promise.all([request(options1), request(options2)]).then(function(values) {
values[0].amount = +terms.min_swap_amount; values[0].amount = +terms.min_swap_amount;
values[1].amount = +terms.max_swap_amount; values[1].amount = +terms.max_swap_amount;
values[0].swap_payment_dest = values[0].swap_payment_dest ? Buffer.from(values[0].swap_payment_dest, 'base64').toString('hex') : ''; values[0].swap_payment_dest = values[0].swap_payment_dest ? Buffer.from(values[0].swap_payment_dest, 'base64').toString('hex') : '';
values[1].swap_payment_dest = values[1].swap_payment_dest ? Buffer.from(values[1].swap_payment_dest, 'base64').toString('hex') : ''; values[1].swap_payment_dest = values[1].swap_payment_dest ? Buffer.from(values[1].swap_payment_dest, 'base64').toString('hex') : '';
logger.info({fileName: 'Loop', msg: 'Loop Out Quotes 1: ' + JSON.stringify(values[0])}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Quotes 1', data: values[0]});
logger.info({fileName: 'Loop', msg: 'Loop Out Quotes 2: ' + JSON.stringify(values[1])}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Quotes 2', data: values[1]});
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop Out Terms & Quotes Received'});
res.status(200).json(values); res.status(200).json(values);
}) })
.catch(errRes => { .catch(errRes => {
@ -128,7 +136,7 @@ exports.loopOutTermsAndQuotes = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 132, msg: 'Loop Out Quotes Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Quotes Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop Out Quotes Failed!", message: "Loop Out Quotes Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -143,7 +151,7 @@ exports.loopOutTermsAndQuotes = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 146, msg: 'Loop Out Terms Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Terms Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop Out Terms Failed!", message: "Loop Out Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -152,6 +160,7 @@ exports.loopOutTermsAndQuotes = (req, res, next) => {
}; };
exports.loopIn = (req, res, next) => { exports.loopIn = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Looping In..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop In Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop In Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/in'; options.url = options.url + '/v1/loop/in';
@ -161,16 +170,17 @@ exports.loopIn = (req, res, next) => {
max_miner_fee: req.body.minerFee, max_miner_fee: req.body.minerFee,
initiator: 'RTL' initiator: 'RTL'
}; };
logger.info({fileName: 'Loop', msg: 'Loop In Body: ' + JSON.stringify(options.body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Body', data: options.body});
request.post(options).then(function (body) { request.post(options).then(function (body) {
logger.info({fileName: 'Loop', msg: 'Loop In: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In', data: body});
if(!body || body.error) { if(!body || body.error) {
logger.error({fileName: 'Loop', lineNum: 166, msg: 'Loop In Error: ' + JSON.stringify(body.error)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Error', error: body.error});
res.status(500).json({ res.status(500).json({
message: 'Loop In Failed!', message: 'Loop In Failed!',
error: (body.error && body.error.message) ? body.error.message : 'Error From Server!' error: (body.error && body.error.message) ? body.error.message : 'Error From Server!'
}); });
} else { } else {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop In Finished'});
res.status(201).json(body); res.status(201).json(body);
} }
}) })
@ -182,7 +192,7 @@ exports.loopIn = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 182, msg: 'Loop In Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop In Failed!", message: "Loop In Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -191,11 +201,13 @@ exports.loopIn = (req, res, next) => {
}; };
exports.loopInTerms = (req, res, next) => { exports.loopInTerms = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop In Terms..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop In Terms Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop In Terms Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/in/terms'; options.url = options.url + '/v1/loop/in/terms';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Loop', msg: 'Loop In Terms: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Terms', data: body});
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop In Terms Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -206,7 +218,7 @@ exports.loopInTerms = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 205, msg: 'Loop In Terms Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Terms Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop In Terms Failed!", message: "Loop In Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -215,14 +227,16 @@ exports.loopInTerms = (req, res, next) => {
}; };
exports.loopInQuote = (req, res, next) => { exports.loopInQuote = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop In Quotes..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop In Quote Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop In Quote Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/in/quote/' + req.params.amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline; options.url = options.url + '/v1/loop/in/quote/' + req.params.amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline;
logger.info({fileName: 'Loop', msg: 'Loop In Quote Options: ' + options.url}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Quote Options', data: options.url});
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Loop', msg: 'Loop In Quote: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Quote', data: body});
body.amount = +req.params.amount; body.amount = +req.params.amount;
body.swap_payment_dest = body.swap_payment_dest ? Buffer.from(body.swap_payment_dest, 'base64').toString('hex') : ''; body.swap_payment_dest = body.swap_payment_dest ? Buffer.from(body.swap_payment_dest, 'base64').toString('hex') : '';
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop In Qoutes Received'});
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -233,7 +247,7 @@ exports.loopInQuote = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 232, msg: 'Loop In Quote Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Quote Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop In Quote Failed!", message: "Loop In Quote Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -242,23 +256,25 @@ exports.loopInQuote = (req, res, next) => {
}; };
exports.loopInTermsAndQuotes = (req, res, next) => { exports.loopInTermsAndQuotes = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop In Terms & Quotes..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop In Terms And Quotes Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop In Terms And Quotes Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/in/terms'; options.url = options.url + '/v1/loop/in/terms';
request(options).then(function(terms) { request(options).then(function(terms) {
logger.info({fileName: 'Loop', msg: 'Loop In Terms: ' + JSON.stringify(terms)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Terms', data: terms});
const options1 = common.getSwapServerOptions(); const options2 = common.getSwapServerOptions(); const options1 = common.getSwapServerOptions(); const options2 = common.getSwapServerOptions();
options1.url = options1.url + '/v1/loop/in/quote/' + terms.min_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline; options1.url = options1.url + '/v1/loop/in/quote/' + terms.min_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline;
options2.url = options2.url + '/v1/loop/in/quote/' + terms.max_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline; options2.url = options2.url + '/v1/loop/in/quote/' + terms.max_swap_amount + '?conf_target=' + (req.query.targetConf ? req.query.targetConf : '2') + '&swap_publication_deadline=' + req.query.swapPublicationDeadline;
logger.info({fileName: 'Loop', msg: 'Loop In Min Quote Options: ' + JSON.stringify(options1)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Min Quote Options', data: options1});
logger.info({fileName: 'Loop', msg: 'Loop In Max Quote Options: ' + JSON.stringify(options2)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Max Quote Options', data: options2});
Promise.all([request(options1), request(options2)]).then(function(values) { return Promise.all([request(options1), request(options2)]).then(function(values) {
values[0].amount = +terms.min_swap_amount; values[0].amount = +terms.min_swap_amount;
values[1].amount = +terms.max_swap_amount; values[1].amount = +terms.max_swap_amount;
values[0].swap_payment_dest = values[0].swap_payment_dest ? Buffer.from(values[0].swap_payment_dest, 'base64').toString('hex') : ''; values[0].swap_payment_dest = values[0].swap_payment_dest ? Buffer.from(values[0].swap_payment_dest, 'base64').toString('hex') : '';
values[1].swap_payment_dest = values[1].swap_payment_dest ? Buffer.from(values[1].swap_payment_dest, 'base64').toString('hex') : ''; values[1].swap_payment_dest = values[1].swap_payment_dest ? Buffer.from(values[1].swap_payment_dest, 'base64').toString('hex') : '';
logger.info({fileName: 'Loop', msg: 'Loop In Quotes 1: ' + JSON.stringify(values[0])}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Quotes 1', data: values[0]});
logger.info({fileName: 'Loop', msg: 'Loop In Quotes 2: ' + JSON.stringify(values[1])}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Quotes 2', data: values[1]});
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop In Terms & Qoutes Received'});
res.status(200).json(values); res.status(200).json(values);
}) })
.catch(errRes => { .catch(errRes => {
@ -269,7 +285,7 @@ exports.loopInTermsAndQuotes = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 270, msg: 'Loop In Quotes Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Quotes Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop In Quotes Failed!", message: "Loop In Quotes Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -284,7 +300,7 @@ exports.loopInTermsAndQuotes = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 284, msg: 'Loop In Terms Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Terms Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop In Terms Failed!", message: "Loop In Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -293,19 +309,17 @@ exports.loopInTermsAndQuotes = (req, res, next) => {
}; };
exports.swaps = (req, res, next) => { exports.swaps = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting List Swaps..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop Out Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop Out Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/swaps'; options.url = options.url + '/v1/loop/swaps';
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Loop', msg: 'Loop Swaps: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Swaps', data: body});
if (body.swaps && body.swaps.length > 0) { if (body.swaps && body.swaps.length > 0) {
body.swaps.forEach(swap => {
swap.initiation_time_str = (!swap.initiation_time) ? '' : common.convertTimestampToDate(Math.round(swap.initiation_time/1000000000));
swap.last_update_time_str = (!swap.last_update_time) ? '' : common.convertTimestampToDate(Math.round(swap.last_update_time/1000000000));
});
body.swaps = common.sortDescByKey(body.swaps, 'initiation_time'); body.swaps = common.sortDescByKey(body.swaps, 'initiation_time');
logger.info({fileName: 'Loop', msg: 'Loop Swaps after Sort: ' + JSON.stringify(body)}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Swaps after Sort', data: body});
} }
logger.log({level: 'INFO', fileName: 'Loop', msg: 'List Swaps Received'});
res.status(200).json(body.swaps); res.status(200).json(body.swaps);
}) })
.catch(errRes => { .catch(errRes => {
@ -316,7 +330,7 @@ exports.swaps = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 327, msg: 'List Swaps Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'List Swaps Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop Swaps Failed!", message: "Loop Swaps Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
@ -325,13 +339,13 @@ exports.swaps = (req, res, next) => {
}; };
exports.swap = (req, res, next) => { exports.swap = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Swap Information..'});
options = common.getSwapServerOptions(); options = common.getSwapServerOptions();
if(options.url === '') { return res.status(500).json({message: "Loop Out Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); } if(options.url === '') { return res.status(500).json({message: "Loop Out Failed!",error: { message: 'Loop Server URL is missing in the configuration.'}}); }
options.url = options.url + '/v1/loop/swap/' + req.params.id; options.url = options.url + '/v1/loop/swap/' + req.params.id;
request(options).then(function (body) { request(options).then(function (body) {
logger.info({fileName: 'Loop', msg: 'Loop Swap: ' + body}); logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Swap', data: body});
body.initiation_time_str = (!body.initiation_time) ? '' : common.convertTimestampToDate(Math.round(body.initiation_time/1000000000)); logger.log({level: 'INFO', fileName: 'Loop', msg: 'Swap Information Received'});
body.last_update_time_str = (!body.last_update_time) ? '' : common.convertTimestampToDate(Math.round(body.last_update_time/1000000000));
res.status(200).json(body); res.status(200).json(body);
}) })
.catch(errRes => { .catch(errRes => {
@ -342,7 +356,7 @@ exports.swap = (req, res, next) => {
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) { if (err.response && err.response.request && err.response.request.headers && err.response.request.headers['Grpc-Metadata-macaroon']) {
delete err.response.request.headers['Grpc-Metadata-macaroon']; delete err.response.request.headers['Grpc-Metadata-macaroon'];
} }
logger.error({fileName: 'Loop', lineNum: 342, msg: 'Swap Info Error: ' + JSON.stringify(err)}); logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Swap Info Error', error: err});
return res.status(500).json({ return res.status(500).json({
message: "Loop Swap Failed!", message: "Loop Swap Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err

@ -1,4 +1,4 @@
FROM node:10-alpine FROM node:14-alpine
RUN apk add --no-cache tini RUN apk add --no-cache tini
@ -8,7 +8,7 @@ COPY package.json /RTL/package.json
COPY package-lock.json /RTL/package-lock.json COPY package-lock.json /RTL/package-lock.json
# Install dependencies # Install dependencies
RUN npm install --only=prod RUN npm install --production
COPY . /RTL COPY . /RTL

@ -0,0 +1,33 @@
FROM node:14-stretch-slim AS builder
ADD https://github.com/krallin/tini/releases/download/v0.19.0/tini-static-armel /tini
ADD https://github.com/krallin/tini/releases/download/v0.19.0/tini-static-armel.asc /tini.asc
# RUN apt-get install gnupg
# RUN gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \
# && gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
WORKDIR /RTL
COPY . /RTL
COPY package.json /RTL/package.json
COPY package-lock.json /RTL/package-lock.json
# Install dependencies
RUN npm install --production
COPY . /RTL
FROM arm32v7/node:14-stretch-slim
WORKDIR /RTL
COPY --from=builder "/RTL" .
COPY --from=builder "/tini" /sbin/tini
EXPOSE 3000
ENTRYPOINT ["/sbin/tini", "-g", "--"]
CMD ["node", "rtl"]

@ -1,6 +1,6 @@
FROM node:10-stretch-slim AS builder FROM node:14-stretch-slim AS builder
ADD https://github.com/krallin/tini/releases/download/v0.18.0/tini-static-arm64 /tini ADD https://github.com/krallin/tini/releases/download/v0.19.0/tini-static-arm64 /tini
RUN chmod +x /tini RUN chmod +x /tini
WORKDIR /RTL WORKDIR /RTL
@ -11,11 +11,11 @@ COPY package.json /RTL/package.json
COPY package-lock.json /RTL/package-lock.json COPY package-lock.json /RTL/package-lock.json
# Install dependencies # Install dependencies
RUN npm install --only=prod RUN npm install --production
COPY . /RTL COPY . /RTL
FROM arm64v8/node:10-stretch-slim FROM arm64v8/node:14-stretch-slim
WORKDIR /RTL WORKDIR /RTL

@ -8,7 +8,7 @@ volumes:
services: services:
bitcoind: bitcoind:
container_name: ${COMPOSE_PROJECT_NAME}_bitcoind container_name: ${COMPOSE_PROJECT_NAME}_bitcoind
image: bitcoind:0.17.1 image: bitcoind:0.19.0
build: ./bitcoind build: ./bitcoind
command: [ command: [
"bitcoind", "bitcoind",
@ -37,7 +37,7 @@ services:
lnd: lnd:
container_name: ${COMPOSE_PROJECT_NAME}_lnd container_name: ${COMPOSE_PROJECT_NAME}_lnd
image: lnd:0.5.2-beta image: lnd:0.12.0-beta
build: ./lnd build: ./lnd
restart: unless-stopped restart: unless-stopped
command: [ command: [
@ -101,7 +101,7 @@ services:
rtl: rtl:
container_name: ${COMPOSE_PROJECT_NAME}_rtl container_name: ${COMPOSE_PROJECT_NAME}_rtl
image: shahanafarooqui/rtl:0.6.4 image: shahanafarooqui/rtl:0.10.2
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- lnd - lnd

@ -45,7 +45,7 @@ $ npm install --only=prod
``` ```
### <a name="prep"></a>Prep for Execution ### <a name="prep"></a>Prep for Execution
RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app. RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app.
* Rename `sample-RTL-Config.json` file to `RTL-Config.json`. * Copy the file `Sample-RTL-Config.json` from `./RTL/docs` to `./RTL` and rename it to `RTL-Config.json`.
* Locate the complete path of the readable `access.macaroon` from `cl-rest` on your node. * Locate the complete path of the readable `access.macaroon` from `cl-rest` on your node.
* Modify the RTL conf file per the example file below * Modify the RTL conf file per the example file below

@ -40,7 +40,7 @@ $ npm install --only=prod
``` ```
### <a name="prep"></a>Prep for Execution ### <a name="prep"></a>Prep for Execution
RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app. RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app.
* Rename `sample-RTL-Config.json` file to `RTL-Config.json`. * Copy the file `Sample-RTL-Config.json` from `./RTL/docs` to `./RTL` and rename it to `RTL-Config.json`.
* Locate the complete path of the readable `eclair.conf` for your node. * Locate the complete path of the readable `eclair.conf` for your node.
* Modify the RTL conf file per the example file below * Modify the RTL conf file per the example file below

@ -16,7 +16,7 @@ This step is only required to configure the nodes, which will be remotely connec
4. Restart LND 4. Restart LND
#### 2. Configure 'RTL-Config.json' #### 2. Configure 'RTL-Config.json'
1. Rename the `sample-RTL-Config.json` on the root RTL location to `RTL-Config.json` 1. Copy the file `Sample-RTL-Config.json` from `./RTL/docs` to `./RTL` and rename it to `RTL-Config.json`
2. Set `multiPass` to the preferred password. This password will be used to authenticate the user for RTL. Once authenticated, the user will be able to access all the nodes configured in the json file 2. Set `multiPass` to the preferred password. This password will be used to authenticate the user for RTL. Once authenticated, the user will be able to access all the nodes configured in the json file
3. Set the `port` to the preferred port number over which to run RTL 3. Set the `port` to the preferred port number over which to run RTL
4. Set the `defaultNodeIndex` to configure the default start up node at server restart 4. Set the `defaultNodeIndex` to configure the default start up node at server restart

@ -1,10 +1,10 @@
## Ride The Lightning (RTL) ## Ride The Lightning (RTL)
![](screenshots/RTL-LND-Dashboard.png) ![](../screenshots/RTL-LND-Dashboard.png)
<a href="https://snyk.io/test/github/Ride-The-Lightning/RTL"><img src="https://snyk.io/test/github/Ride-The-Lightning/RTL/badge.svg" alt="Known Vulnerabilities" data-canonical-src="https://snyk.io/test/github/Ride-The-Lightning/RTL" style="max-width:100%;"></a> <a href="https://snyk.io/test/github/Ride-The-Lightning/RTL"><img src="https://snyk.io/test/github/Ride-The-Lightning/RTL/badge.svg" alt="Known Vulnerabilities" data-canonical-src="https://snyk.io/test/github/Ride-The-Lightning/RTL" style="max-width:100%;"></a>
[![license](https://img.shields.io/github/license/DAVFoundation/captain-n3m0.svg?style=flat-square)](https://github.com/DAVFoundation/captain-n3m0/blob/master/LICENSE) [![license](https://img.shields.io/github/license/DAVFoundation/captain-n3m0.svg?style=flat-square)](https://github.com/DAVFoundation/captain-n3m0/blob/master/LICENSE)
**Intro** -- [Application Features](docs/Application_features.md) -- [Road Map](docs/Roadmap.md) -- [Application Configurations](docs/Application_configurations) -- [C-Lightning](docs/C-Lightning-setup.md) -- [Eclair](docs/Eclair-setup.md) -- [Contribution](docs/Contributing.md) **Intro** -- [Application Features](Application_features.md) -- [Road Map](Roadmap.md) -- [Application Configurations](Application_configurations) -- [C-Lightning](C-Lightning-setup.md) -- [Eclair](Eclair-setup.md) -- [Contribution](Contributing.md)
* [Introduction](#intro) * [Introduction](#intro)
* [Architecture](#arch) * [Architecture](#arch)
@ -19,8 +19,8 @@
RTL is a full function, device agnostic, web user interface to help manage lightning node operations. RTL is a full function, device agnostic, web user interface to help manage lightning node operations.
RTL is available on [LND](https://github.com/lightningnetwork/lnd), [C-Lightning](https://github.com/ElementsProject/lightning) and [Eclair](https://github.com/ACINQ/eclair) implementations. RTL is available on [LND](https://github.com/lightningnetwork/lnd), [C-Lightning](https://github.com/ElementsProject/lightning) and [Eclair](https://github.com/ACINQ/eclair) implementations.
* C-Lightning users, refer to [this](docs/C-Lightning-setup.md) page for install instructions. * C-Lightning users, refer to [this](C-Lightning-setup.md) page for install instructions.
* Eclair users, refer to [this](docs/Eclair-setup.md) page for install instructions. * Eclair users, refer to [this](Eclair-setup.md) page for install instructions.
* LND users, follow the instructions below * LND users, follow the instructions below
Lightning Network Daemon(LND) is an implementation of Lightning Network BOLT protocol by [Lightning Labs](https://lightning.engineering/). Lightning Network Daemon(LND) is an implementation of Lightning Network BOLT protocol by [Lightning Labs](https://lightning.engineering/).
@ -41,7 +41,7 @@ RTL is available on the below platforms/services:
Docker Image: https://hub.docker.com/r/shahanafarooqui/rtl Docker Image: https://hub.docker.com/r/shahanafarooqui/rtl
### <a name="arch"></a>Architecture ### <a name="arch"></a>Architecture
![](screenshots/RTL-LND-Arch-2.png) ![](../screenshots/RTL-LND-Arch-2.png)
### <a name="prereq"></a>Prerequisites ### <a name="prereq"></a>Prerequisites
* Functioning and synced LND lightning node. * Functioning and synced LND lightning node.
@ -69,9 +69,9 @@ $ npm install --only=prod
### <a name="prep"></a>Prep for Execution ### <a name="prep"></a>Prep for Execution
RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app. RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app.
*Advanced users can refer to [this page](docs/Multi-Node-setup.md), for config settings required to manage multiple nodes* *Advanced users can refer to [this page](Multi-Node-setup.md), for config settings required to manage multiple nodes*
* Rename `sample-RTL-Config.json` file to `RTL-Config.json`. * Copy the file `Sample-RTL-Config.json` from `./RTL/docs` to `./RTL` and rename it to `RTL-Config.json`.
* Locate the complete path of the readable macroon file (admin.macroon) on your node and the lnd.conf file. * Locate the complete path of the readable macroon file (admin.macroon) on your node and the lnd.conf file.
* Modify the `RTL-Config.json` file per the example file below * Modify the `RTL-Config.json` file per the example file below
@ -114,7 +114,7 @@ Example RTL-Config.json:
] ]
} }
``` ```
For details on all the configuration options refer to [this page](./docs/Application_configurations). For details on all the configuration options refer to [this page](./Application_configurations).
#### User Authentication on RTL #### User Authentication on RTL
RTL requires the user to be authenticated by the application first, before allowing access to LND functions. RTL requires the user to be authenticated by the application first, before allowing access to LND functions.
@ -172,11 +172,11 @@ Open your browser at the following address: http://localhost:3000 to access the
* Determine the IP address of your node to access the application. * Determine the IP address of your node to access the application.
E.g. if the IP address of your node is 192.168.0.15 then open your browser at the following address: http://192.168.0.15:3000 to access RTL. E.g. if the IP address of your node is 192.168.0.15 then open your browser at the following address: http://192.168.0.15:3000 to access RTL.
3. Config tweaks for running RTL server and LND on separate devices on the same network can be found [here](docs/RTL_setups.md). 3. Config tweaks for running RTL server and LND on separate devices on the same network can be found [here](RTL_setups.md).
4. Any Other setup: **Please be advised, if you are accessing your node remotely via RTL, its critical to encrypt the communication via use of https. You can use solutions like nginx and letsencrypt or TOR to setup secure access for RTL.** 4. Any Other setup: **Please be advised, if you are accessing your node remotely via RTL, its critical to encrypt the communication via use of https. You can use solutions like nginx and letsencrypt or TOR to setup secure access for RTL.**
- Sample SSL setup guide can be found [here](docs/RTL_SSL_setup.md) - Sample SSL setup guide can be found [here](RTL_SSL_setup.md)
- (For advanced users) A sample SSL guide to serve remote access over an encrypted Tor connection can be found [here](docs/RTL_TOR_setup.md) - (For advanced users) A sample SSL guide to serve remote access over an encrypted Tor connection can be found [here](RTL_TOR_setup.md)
### <a name="trouble"></a>Troubleshooting ### <a name="trouble"></a>Troubleshooting
In case you are running into issues with the application or if you have feedback, feel free to open issues on our github repo. In case you are running into issues with the application or if you have feedback, feel free to open issues on our github repo.

12002
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,14 +1,15 @@
{ {
"name": "rtl", "name": "rtl",
"version": "0.10.2-beta", "version": "0.11.0-beta",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve --open", "start": "ng serve --open",
"prebuild": "node ./prebuild", "prebuild": "node ./src/prebuild",
"build": "ng analytics off && ng build --prod", "build": "ng analytics off && ng lint && ng build --configuration production",
"devbuild": "ng build --configuration production",
"serve": "ng serve", "serve": "ng serve",
"server": "nodemon ./rtl.js", "server": "set NODE_ENV=development&&nodemon ./rtl.js",
"test": "ng test", "test": "ng test",
"lint": "ng lint", "lint": "ng lint",
"e2e": "ng e2e", "e2e": "ng e2e",
@ -16,31 +17,31 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "~11.0.4", "@angular/animations": "~12.0.1",
"@angular/cdk": "^11.0.3", "@angular/cdk": "^12.0.1",
"@angular/common": "~11.0.4", "@angular/common": "~12.0.1",
"@angular/compiler": "~11.0.4", "@angular/compiler": "~12.0.1",
"@angular/compiler-cli": "~11.0.4", "@angular/compiler-cli": "~12.0.1",
"@angular/core": "~11.0.4", "@angular/core": "~12.0.1",
"@angular/flex-layout": "^11.0.0-beta.33", "@angular/flex-layout": "^12.0.0-beta.34",
"@angular/forms": "~11.0.4", "@angular/forms": "~12.0.1",
"@angular/material": "^11.0.3", "@angular/material": "^12.0.1",
"@angular/platform-browser": "~11.0.4", "@angular/platform-browser": "~12.0.1",
"@angular/platform-browser-dynamic": "~11.0.4", "@angular/platform-browser-dynamic": "~12.0.1",
"@angular/router": "~11.0.4", "@angular/router": "~12.0.1",
"@fortawesome/angular-fontawesome": "^0.8.1", "@fortawesome/angular-fontawesome": "^0.8.1",
"@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/fontawesome-svg-core": "^1.2.32",
"@fortawesome/free-regular-svg-icons": "^5.15.1", "@fortawesome/free-regular-svg-icons": "^5.15.1",
"@fortawesome/free-solid-svg-icons": "^5.15.1", "@fortawesome/free-solid-svg-icons": "^5.15.1",
"@ngrx/effects": "^10.1.0", "@ngrx/effects": "^12.0.0",
"@ngrx/store": "^10.1.0", "@ngrx/store": "^12.0.0",
"@swimlane/ngx-charts": "^16.0.0", "@swimlane/ngx-charts": "^16.0.0",
"angular-user-idle": "^2.2.4", "angular-user-idle": "^2.2.5",
"angularx-qrcode": "^10.0.11", "angularx-qrcode": "^11.0.0",
"atob": "^2.1.2", "atob": "^2.1.2",
"cookie-parser": "^1.4.5", "cookie-parser": "^1.4.5",
"csurf": "^1.11.0",
"express": "^4.17.1", "express": "^4.17.1",
"hammerjs": "^2.0.8",
"hocon-parser": "^1.0.1", "hocon-parser": "^1.0.1",
"ini": "^2.0.0", "ini": "^2.0.0",
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",
@ -50,30 +51,38 @@
"request": "^2.88.2", "request": "^2.88.2",
"request-promise": "^4.2.6", "request-promise": "^4.2.6",
"roboto-fontface": "^0.10.0", "roboto-fontface": "^0.10.0",
"rxjs": "~6.6.0", "rxjs": "^7.1.0",
"sha256": "^0.2.0", "sha256": "^0.2.0",
"tslib": "^2.0.0", "tslib": "^2.0.0",
"typescript": "~4.0.2", "typescript": "~4.2.4",
"zone.js": "~0.10.2" "zone.js": "~0.11.4"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "~0.1100.4", "@angular-devkit/build-angular": "~12.0.1",
"@angular/cli": "^11.2.9", "@angular-eslint/builder": "12.0.0",
"@ngrx/store-devtools": "^10.1.0", "@angular-eslint/eslint-plugin": "12.0.0",
"@angular-eslint/eslint-plugin-template": "12.0.0",
"@angular-eslint/schematics": "12.0.0",
"@angular-eslint/template-parser": "12.0.0",
"@angular/cli": "^12.0.1",
"@ngrx/store-devtools": "^12.0.0",
"@types/jasmine": "~3.6.0", "@types/jasmine": "~3.6.0",
"@types/node": "^12.19.9", "@types/node": "^12.19.9",
"codelyzer": "^6.0.0", "@typescript-eslint/eslint-plugin": "4.23.0",
"@typescript-eslint/parser": "4.23.0",
"crypto-browserify": "^3.12.0",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"eslint": "^7.26.0",
"jasmine-core": "~3.6.0", "jasmine-core": "~3.6.0",
"jasmine-spec-reporter": "~5.0.0", "jasmine-spec-reporter": "~5.0.0",
"karma": "~5.1.0", "karma": "~6.3.2",
"karma-chrome-launcher": "~3.1.0", "karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.0.3", "karma-coverage": "~2.0.3",
"karma-jasmine": "~4.0.0", "karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0", "karma-jasmine-html-reporter": "^1.5.0",
"nodemon": "^2.0.6", "nodemon": "^2.0.6",
"protractor": "~7.0.0", "protractor": "~7.0.0",
"ts-node": "~8.3.0", "stream-browserify": "^3.0.0",
"tslint": "~6.1.0" "ts-node": "~8.3.0"
} }
} }

@ -1,28 +0,0 @@
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
onPrepare() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
};

@ -2,8 +2,8 @@ const path = require("path");
const express = require("express"); const express = require("express");
const bodyParser = require("body-parser"); const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser"); const cookieParser = require("cookie-parser");
const csurf = require("csurf");
const common = require("./common"); const common = require("./common");
const app = express();
const baseHref = "/rtl/"; const baseHref = "/rtl/";
const apiRoot = baseHref + "api/"; const apiRoot = baseHref + "api/";
@ -11,56 +11,57 @@ const apiLNDRoot = baseHref + "api/lnd/";
const apiCLRoot = baseHref + "api/cl/"; const apiCLRoot = baseHref + "api/cl/";
const apiECLRoot = baseHref + "api/ecl/"; const apiECLRoot = baseHref + "api/ecl/";
const authenticateRoutes = require("./routes/shared/authenticate"); const authenticateRoutes = require("./shared/authenticate");
const RTLConfRoutes = require("./routes/shared/RTLConf"); const RTLConfRoutes = require("./shared/RTLConf");
const loopRoutes = require('./routes/shared/loop'); const loopRoutes = require('./shared/loop');
const boltzRoutes = require('./routes/shared/boltz'); const boltzRoutes = require('./shared/boltz');
const infoRoutes = require("./lnd/getInfo");
const channelsRoutes = require("./lnd/channels");
const channelsBackupRoutes = require("./lnd/channelsBackup");
const peersRoutes = require("./lnd/peers");
const feesRoutes = require("./lnd/fees");
const balanceRoutes = require("./lnd/balance");
const walletRoutes = require("./lnd/wallet");
const graphRoutes = require("./lnd/graph");
const newAddressRoutes = require("./lnd/newAddress");
const transactionsRoutes = require("./lnd/transactions");
const payReqRoutes = require("./lnd/payReq");
const paymentsRoutes = require("./lnd/payments");
const invoiceRoutes = require("./lnd/invoices");
const switchRoutes = require("./lnd/switch");
const messageRoutes = require("./lnd/message");
const infoRoutes = require("./routes/lnd/getInfo"); const infoCLRoutes = require("./c-lightning/getInfo");
const channelsRoutes = require("./routes/lnd/channels"); const feesCLRoutes = require("./c-lightning/fees");
const channelsBackupRoutes = require("./routes/lnd/channelsBackup"); const balanceCLRoutes = require("./c-lightning/balance");
const peersRoutes = require("./routes/lnd/peers"); const channelsCLRoutes = require("./c-lightning/channels");
const feesRoutes = require("./routes/lnd/fees"); const invoicesCLRoutes = require("./c-lightning/invoices");
const balanceRoutes = require("./routes/lnd/balance"); const onChainCLRoutes = require("./c-lightning/onchain");
const walletRoutes = require("./routes/lnd/wallet"); const paymentsCLRoutes = require("./c-lightning/payments");
const graphRoutes = require("./routes/lnd/graph"); const peersCLRoutes = require("./c-lightning/peers");
const newAddressRoutes = require("./routes/lnd/newAddress"); const networkCLRoutes = require("./c-lightning/network");
const transactionsRoutes = require("./routes/lnd/transactions"); const messageCLRoutes = require("./c-lightning/message");
const payReqRoutes = require("./routes/lnd/payReq");
const paymentsRoutes = require("./routes/lnd/payments");
const invoiceRoutes = require("./routes/lnd/invoices");
const switchRoutes = require("./routes/lnd/switch");
const messageRoutes = require("./routes/lnd/message");
const infoCLRoutes = require("./routes/c-lightning/getInfo"); const infoECLRoutes = require("./eclair/getInfo");
const feesCLRoutes = require("./routes/c-lightning/fees"); const feesECLRoutes = require("./eclair/fees");
const balanceCLRoutes = require("./routes/c-lightning/balance"); const channelsECLRoutes = require("./eclair/channels");
const channelsCLRoutes = require("./routes/c-lightning/channels"); const onChainECLRoutes = require("./eclair/onchain");
const invoicesCLRoutes = require("./routes/c-lightning/invoices"); const peersECLRoutes = require("./eclair/peers");
const onChainCLRoutes = require("./routes/c-lightning/onchain"); const invoicesECLRoutes = require("./eclair/invoices");
const paymentsCLRoutes = require("./routes/c-lightning/payments"); const paymentsECLRoutes = require("./eclair/payments");
const peersCLRoutes = require("./routes/c-lightning/peers"); const networkECLRoutes = require("./eclair/network");
const networkCLRoutes = require("./routes/c-lightning/network");
const messageCLRoutes = require("./routes/c-lightning/message");
const infoECLRoutes = require("./routes/eclair/getInfo"); const app = express();
const feesECLRoutes = require("./routes/eclair/fees"); const csrfProtection = csurf({cookie: true});
const channelsECLRoutes = require("./routes/eclair/channels");
const onChainECLRoutes = require("./routes/eclair/onchain");
const peersECLRoutes = require("./routes/eclair/peers");
const invoicesECLRoutes = require("./routes/eclair/invoices");
const paymentsECLRoutes = require("./routes/eclair/payments");
const networkECLRoutes = require("./routes/eclair/network");
app.set('trust proxy', true); app.set('trust proxy', true);
app.use(cookieParser(common.secret_key)); app.use(cookieParser(common.secret_key));
app.use(bodyParser.json({limit: '25mb'})); app.use(bodyParser.json({limit: '25mb'}));
app.use(bodyParser.urlencoded({extended: false, limit: '25mb'})); app.use(bodyParser.urlencoded({extended: false, limit: '25mb'}));
app.use(baseHref, express.static(path.join(__dirname, "angular"))); app.use(baseHref, express.static(path.join(__dirname, "..", "angular")));
// CORS fix, Only required for developement due to separate backend and frontend servers
app.use((req, res, next) => { app.use((req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader( res.setHeader(
"Access-Control-Allow-Headers", "Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization, filePath" "Origin, X-Requested-With, Content-Type, Accept, Authorization, filePath"
@ -69,9 +70,12 @@ app.use((req, res, next) => {
"Access-Control-Allow-Methods", "Access-Control-Allow-Methods",
"GET, POST, PATCH, PUT, DELETE, OPTIONS" "GET, POST, PATCH, PUT, DELETE, OPTIONS"
); );
next(); if (process.env.NODE_ENV == 'development') {
res.setHeader("Access-Control-Allow-Origin", req.headers.origin ? req.headers.origin : '');
return next();
}
csrfProtection(req, res, next);
}); });
// CORS fix, Only required for developement due to separate backend and frontend servers
app.use(apiRoot + "authenticate", authenticateRoutes); app.use(apiRoot + "authenticate", authenticateRoutes);
app.use(apiRoot + "conf", RTLConfRoutes); app.use(apiRoot + "conf", RTLConfRoutes);
@ -115,7 +119,8 @@ app.use(apiECLRoot + "payments", paymentsECLRoutes);
app.use(apiECLRoot + "network", networkECLRoutes); app.use(apiECLRoot + "network", networkECLRoutes);
app.use((req, res, next) => { app.use((req, res, next) => {
res.sendFile(path.join(__dirname, "angular", "index.html")); res.cookie('XSRF-TOKEN', req.csrfToken ? req.csrfToken() : '');
res.sendFile(path.join(__dirname, "..", "angular", "index.html"));
}); });
module.exports = app; module.exports = app;

@ -2,7 +2,7 @@ var fs = require('fs');
var crypto = require('crypto'); var crypto = require('crypto');
var path = require('path'); var path = require('path');
var common = {}; var common = {};
const MONTH_NAMES = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']; const MONTHS = [{name: 'JAN', days: 31}, {name: 'FEB', days: 28}, {name: 'MAR', days: 31}, {name: 'APR', days: 30}, {name: 'MAY', days: 31}, {name: 'JUN', days: 30}, {name: 'JUL', days: 31}, {name: 'AUG', days: 31}, {name: 'SEP', days: 30}, {name: 'OCT', days: 31}, {name: 'NOV', days: 30}, {name: 'DEC', days: 31}];
var dummy_data_array_from_file = []; var dummy_data_array_from_file = [];
common.rtl_conf_file_path = ''; common.rtl_conf_file_path = '';
@ -161,18 +161,7 @@ common.convertToBTC = (num) => {
return (num / 100000000).toFixed(6); return (num / 100000000).toFixed(6);
}; };
common.convertTimestampToDate = (num) => { common.convertTimestampToTime = (num) => {
let myDate = new Date(+num * 1000);
let days = myDate.getDate().toString();
days = +days < 10 ? '0' + days : days;
let hours = myDate.getHours().toString();
hours = +hours < 10 ? '0' + hours : hours;
let minutes = myDate.getMinutes().toString();
minutes = +minutes < 10 ? '0' + minutes : minutes;
return days + "/" + MONTH_NAMES[myDate.getMonth()] + "/" + myDate.getFullYear() + " " + hours + ":" + minutes;
};
common.convertTimestampToLocalDate = (num) => {
let myDate = new Date(+num * 1000); let myDate = new Date(+num * 1000);
let days = myDate.getDate().toString(); let days = myDate.getDate().toString();
days = +days < 10 ? '0' + days : days; days = +days < 10 ? '0' + days : days;
@ -182,7 +171,7 @@ common.convertTimestampToLocalDate = (num) => {
minutes = +minutes < 10 ? '0' + minutes : minutes; minutes = +minutes < 10 ? '0' + minutes : minutes;
let seconds = myDate.getSeconds().toString(); let seconds = myDate.getSeconds().toString();
seconds = +seconds < 10 ? '0' + seconds : seconds; seconds = +seconds < 10 ? '0' + seconds : seconds;
return days + "/" + (MONTH_NAMES[myDate.getMonth()]) + "/" + myDate.getFullYear() + " " + hours + ":" + minutes + ":" + seconds; return days + "/" + MONTHS[myDate.getMonth()].name + "/" + myDate.getFullYear() + " " + hours + ":" + minutes + ":" + seconds;
}; };
common.sortAscByKey = (array, key) => { common.sortAscByKey = (array, key) => {
@ -254,6 +243,10 @@ common.getDummyData = (data_key) => {
}); });
} }
common.getMonthDays = (selMonth, selYear) => {
return (selMonth === 1 && selYear%4 === 0) ? (MONTHS[selMonth].days+1) : MONTHS[selMonth].days;
}
filterData = (data_key) => { filterData = (data_key) => {
let search_string = ''; let search_string = '';
switch (data_key) { switch (data_key) {
@ -268,6 +261,10 @@ filterData = (data_key) => {
case 'Payments': case 'Payments':
search_string = 'INFO: Fees => Payments Response: '; search_string = 'INFO: Fees => Payments Response: ';
break; break;
case 'Invoices':
search_string = 'INFO: Invoice => Invoices List Received: ';
break;
case 'OnChainBalance': case 'OnChainBalance':
search_string = 'INFO: Onchain => Balance Received: '; search_string = 'INFO: Onchain => Balance Received: ';

@ -5,10 +5,10 @@ var crypto = require('crypto');
var hash = crypto.createHash('sha256'); var hash = crypto.createHash('sha256');
var common = require('./common'); var common = require('./common');
var path = require('path'); var path = require('path');
var logger = require('./controllers/shared/logger'); var logger = require('../controllers/shared/logger');
var connect = {}; var connect = {};
var errMsg = ''; var errMsg = '';
var request = require('request'); var request = require('request-promise');
var ini = require('ini'); var ini = require('ini');
var parseHocon = require('hocon-parser'); var parseHocon = require('hocon-parser');
common.path_separator = (platform === 'win32') ? '\\' : '/'; common.path_separator = (platform === 'win32') ? '\\' : '/';
@ -84,7 +84,7 @@ connect.normalizePort = val => {
}; };
connect.replacePasswordWithHash = (multiPassHashed) => { connect.replacePasswordWithHash = (multiPassHashed) => {
common.rtl_conf_file_path = process.env.RTL_CONFIG_PATH ? process.env.RTL_CONFIG_PATH : path.normalize(__dirname); common.rtl_conf_file_path = process.env.RTL_CONFIG_PATH ? process.env.RTL_CONFIG_PATH : path.join(__dirname, '..');
try { try {
RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8')); var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
@ -336,17 +336,17 @@ connect.logEnvVariables = () => {
if (common.nodes && common.nodes.length > 0) { if (common.nodes && common.nodes.length > 0) {
common.nodes.forEach((node, idx) => { common.nodes.forEach((node, idx) => {
if (!node.enable_logging) { return; } if (!node.enable_logging) { return; }
logger.info({fileName: 'Config Setup Variable', msg: 'PORT: ' + common.port, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'PORT: ' + common.port, node});
logger.info({fileName: 'Config Setup Variable', msg: 'HOST: ' + common.host, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'HOST: ' + common.host, node});
logger.info({fileName: 'Config Setup Variable', msg: 'DEFAULT NODE INDEX: ' + common.selectedNode.index}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'DEFAULT NODE INDEX: ' + common.selectedNode.index});
logger.info({fileName: 'Config Setup Variable', msg: 'SSO: ' + common.rtl_sso, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'SSO: ' + common.rtl_sso, node});
logger.info({fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + common.logout_redirect_link + '\r\n', node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + common.logout_redirect_link + '\r\n', node});
logger.info({fileName: 'Config Setup Variable', msg: 'INDEX: ' + node.index, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'INDEX: ' + node.index, node});
logger.info({fileName: 'Config Setup Variable', msg: 'LN NODE: ' + node.ln_node, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN NODE: ' + node.ln_node, node});
logger.info({fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + node.ln_implementation, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + node.ln_implementation, node});
logger.info({fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + node.fiat_conversion, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + node.fiat_conversion, node});
logger.info({fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + node.currency_unit, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + node.currency_unit, node});
logger.info({fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + node.ln_server_url, node}); logger.log({level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + node.ln_server_url, node});
}); });
} }
} }
@ -359,26 +359,24 @@ connect.getAllNodeAllChannelBackup = (node) => {
json: true, json: true,
headers: {'Grpc-Metadata-macaroon': fs.readFileSync(node.macaroon_path + '/admin.macaroon').toString('hex')} headers: {'Grpc-Metadata-macaroon': fs.readFileSync(node.macaroon_path + '/admin.macaroon').toString('hex')}
}; };
request(options, function (err, res, body) { request(options).then(function(body) {
if (err) { fs.writeFile(channel_backup_file, JSON.stringify(body), function(err) {
logger.error({fileName: 'Connect', lineNum: 443, msg: 'Channel Backup Response Failed: ' + JSON.stringify(err)}); if (err) {
} else { if (node.ln_node) {
fs.writeFile(channel_backup_file, JSON.stringify(body), function(err) { logger.log({level: 'ERROR', fileName: 'Connect', msg: 'Channel Backup Failed for Node ' + node.ln_node, error: err});
if (err) {
if (node.ln_node) {
logger.error({fileName: 'Connect', lineNum: 448, msg: 'Channel Backup Failed for Node ' + node.ln_node + ' with error response: ' + JSON.stringify(err)});
} else {
logger.error({fileName: 'Connect', lineNum: 450, msg: 'Channel Backup Failed: ' + JSON.stringify(err)});
}
} else { } else {
if (node.ln_node) { logger.log({level: 'ERROR', fileName: 'Connect', msg: 'Channel Backup Error', error: err});
logger.info({fileName: 'Connect', msg: 'Channel Backup Successful for Node: ' + node.ln_node});
} else {
logger.info({fileName: 'Connect', msg: 'Channel Backup Successful'});
}
} }
}); } else {
} if (node.ln_node) {
logger.log({level: 'DEBUG', fileName: 'Connect', msg: 'Channel Backup Successful for Node', data: node.ln_node});
} else {
logger.log({level: 'DEBUG', fileName: 'Connect', msg: 'Channel Backup Successful'});
}
}
});
}, (err) => {
logger.log({level: 'ERROR', fileName: 'Connect', msg: 'Channel Backup Response Error', error: err});
}) })
}; };
@ -553,7 +551,7 @@ connect.upgradeConfig = (confFileFullPath) => {
connect.setServerConfiguration = () => { connect.setServerConfiguration = () => {
try { try {
common.rtl_conf_file_path = (process.env.RTL_CONFIG_PATH) ? process.env.RTL_CONFIG_PATH : path.normalize(__dirname); common.rtl_conf_file_path = (process.env.RTL_CONFIG_PATH) ? process.env.RTL_CONFIG_PATH : path.join(__dirname, '/..');
confFileFullPath = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json'; confFileFullPath = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
if(!fs.existsSync(confFileFullPath)) { if(!fs.existsSync(confFileFullPath)) {
connect.upgradeConfig(confFileFullPath); connect.upgradeConfig(confFileFullPath);

@ -1,7 +0,0 @@
const graphInfoController = require("../../controllers/graphInfo");
const express = require("express");
const router = express.Router();
router.get("/", graphInfoController.getGraphInfo);
module.exports = router;

@ -1,7 +0,0 @@
const LNDSettingsController = require("../../controllers/lndConfSettings");
const express = require("express");
const router = express.Router();
router.get("/", LNDSettingsController.getLNDSettings);
module.exports = router;

@ -4,5 +4,6 @@ const router = express.Router();
const authCheck = require("../shared/authCheck"); const authCheck = require("../shared/authCheck");
router.get("/", authCheck, PaymentsController.getPayments); router.get("/", authCheck, PaymentsController.getPayments);
router.get("/alltransactions", authCheck, PaymentsController.getAllLightningTransactions);
module.exports = router; module.exports = router;

@ -1,5 +1,5 @@
const jwt = require("jsonwebtoken"); const jwt = require("jsonwebtoken");
var common = require('../../common'); var common = require('../../routes/common');
module.exports = (req, res, next) => { module.exports = (req, res, next) => {
try { try {

@ -1,9 +1,9 @@
#!/usr/bin/env node #!/usr/bin/env node
const app = require("./app"); const app = require("./routes/app");
const common = require("./common"); const common = require("./routes/common");
const http = require("http"); const http = require("http");
var connect = require('./connect').setServerConfiguration(); //Do NOT Remove var connect = require("./routes/connect").setServerConfiguration(); //Do NOT Remove
const onError = error => { const onError = error => {
if (error.syscall !== "listen") { if (error.syscall !== "listen") {
@ -13,13 +13,15 @@ const onError = error => {
case "EACCES": case "EACCES":
console.error("http://" + (common.host ? common.host : 'localhost') + ":" + common.port + " requires elevated privileges"); console.error("http://" + (common.host ? common.host : 'localhost') + ":" + common.port + " requires elevated privileges");
process.exit(1); process.exit(1);
break;
case "EADDRINUSE": case "EADDRINUSE":
console.error("http://" + (common.host ? common.host : 'localhost') + ":" + common.port + " is already in use"); console.error("http://" + (common.host ? common.host : 'localhost') + ":" + common.port + " is already in use");
process.exit(1); process.exit(1);
break;
case "ECONNREFUSED": case "ECONNREFUSED":
console.error("Server is down/locked"); console.error("Server is down/locked");
process.exit(1);
case "EBADCSRFTOKEN":
console.error("Form tempered");
process.exit(1);
default: default:
console.error("DEFUALT ERROR"); console.error("DEFUALT ERROR");
console.error(error.code); console.error(error.code);

@ -89,6 +89,9 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
this.userIdle.startWatching(); this.userIdle.startWatching();
} }
}); });
if (this.sessionService.getItem('defaultPassword') === 'true') {
this.flgSideNavOpened = false;
}
this.actions$.pipe(takeUntil(this.unSubs[2]), this.actions$.pipe(takeUntil(this.unSubs[2]),
filter((action) => action.type === RTLActions.SET_RTL_CONFIG || action.type === RTLActions.LOGOUT)) filter((action) => action.type === RTLActions.SET_RTL_CONFIG || action.type === RTLActions.LOGOUT))
.subscribe((action: (RTLActions.SetRTLConfig | RTLActions.Logout)) => { .subscribe((action: (RTLActions.SetRTLConfig | RTLActions.Logout)) => {
@ -126,6 +129,9 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
this.store.dispatch(new RTLActions.Logout()); this.store.dispatch(new RTLActions.Logout());
} }
}); });
if (this.sessionService.getItem('defaultPassword') === 'true') {
this.flgSideNavOpened = false;
}
} }
private readAccessKey() { private readAccessKey() {

@ -54,4 +54,5 @@ export const routes: Routes = [
{ path: '**', component: NotFoundComponent } { path: '**', component: NotFoundComponent }
]; ];
// export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(routes, { enableTracing: true });
export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(routes); export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(routes);

@ -1,4 +1,4 @@
import { Component, OnChanges, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { ChannelsStatus } from '../../../shared/models/clModels'; import { ChannelsStatus } from '../../../shared/models/clModels';
@Component({ @Component({
@ -6,11 +6,9 @@ import { ChannelsStatus } from '../../../shared/models/clModels';
templateUrl: './channel-status-info.component.html', templateUrl: './channel-status-info.component.html',
styleUrls: ['./channel-status-info.component.scss'] styleUrls: ['./channel-status-info.component.scss']
}) })
export class CLChannelStatusInfoComponent implements OnChanges { export class CLChannelStatusInfoComponent {
@Input() channelsStatus: ChannelsStatus = {}; @Input() channelsStatus: ChannelsStatus = {};
constructor() {} constructor() {}
ngOnChanges() {}
} }

@ -220,7 +220,7 @@ export class CLHomeComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -19,7 +19,7 @@
<mat-divider [inset]="true"></mat-divider> <mat-divider [inset]="true"></mat-divider>
<div fxLayout="column" fxFlex="10" class="my-1"> <div fxLayout="column" fxFlex="10" class="my-1">
<h4 class="font-bold-500">Last Update</h4> <h4 class="font-bold-500">Last Update</h4>
<span class="foreground-secondary-text">{{lookupResult[0].last_update_str}}</span> <span class="foreground-secondary-text">{{lookupResult[0].last_update }}</span>
</div> </div>
<mat-divider [inset]="true"></mat-divider> <mat-divider [inset]="true"></mat-divider>
<div fxLayout="column" fxFlex="10" class="my-1"> <div fxLayout="column" fxFlex="10" class="my-1">
@ -100,7 +100,7 @@
<mat-divider [inset]="true"></mat-divider> <mat-divider [inset]="true"></mat-divider>
<div fxLayout="column" fxFlex="10" class="my-1"> <div fxLayout="column" fxFlex="10" class="my-1">
<h4 class="font-bold-500">Last Update</h4> <h4 class="font-bold-500">Last Update</h4>
<span class="foreground-secondary-text">{{lookupResult[1].last_update_str}}</span> <span class="foreground-secondary-text">{{(lookupResult[1].last_update * 1000) | date:'dd/MMM/YYYY HH:mm'}}</span>
</div> </div>
<mat-divider [inset]="true"></mat-divider> <mat-divider [inset]="true"></mat-divider>
<div fxLayout="column" fxFlex="10" class="my-1"> <div fxLayout="column" fxFlex="10" class="my-1">

@ -108,7 +108,7 @@ export class CLLookupsComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -15,7 +15,7 @@
<div fxLayout="row"> <div fxLayout="row">
<div fxLayout="column" fxFlex="50" fxLayoutAlign="end start" class="my-1"> <div fxLayout="column" fxFlex="50" fxLayoutAlign="end start" class="my-1">
<h4 fxLayoutAlign="start" class="font-bold-500">Last Update</h4> <h4 fxLayoutAlign="start" class="font-bold-500">Last Update</h4>
<span class="foreground-secondary-text">{{lookupResult.last_timestamp_str}}</span> <span class="foreground-secondary-text">{{(lookupResult.last_timestamp * 1000) | date:'dd/MMM/YYYY HH:mm'}}</span>
</div> </div>
<div fxLayout="column" fxFlex="50" fxLayoutAlign="end start" class="my-1"> <div fxLayout="column" fxFlex="50" fxLayoutAlign="end start" class="my-1">
<h4 fxLayoutAlign="start" class="font-bold-500">Features</h4> <h4 fxLayoutAlign="start" class="font-bold-500">Features</h4>

@ -15,8 +15,6 @@ export class CLFeeRatesComponent implements AfterContentChecked {
constructor() { } constructor() { }
ngOnInit() {}
ngAfterContentChecked() { ngAfterContentChecked() {
if (this.feeRateStyle === feeRateStyle.KB) { if (this.feeRateStyle === feeRateStyle.KB) {
this.perkbw = this.feeRates.perkb; this.perkbw = this.feeRates.perkb;

@ -112,7 +112,7 @@ export class CLNetworkInfoComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -1,4 +1,4 @@
import { Component, OnInit } from '@angular/core'; import { Component } from '@angular/core';
import { take } from 'rxjs/operators'; import { take } from 'rxjs/operators';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
@ -15,15 +15,13 @@ import * as fromRTLReducer from '../../../store/rtl.reducers';
templateUrl: './on-chain-receive.component.html', templateUrl: './on-chain-receive.component.html',
styleUrls: ['./on-chain-receive.component.scss'] styleUrls: ['./on-chain-receive.component.scss']
}) })
export class CLOnChainReceiveComponent implements OnInit { export class CLOnChainReceiveComponent {
public addressTypes = ADDRESS_TYPES; public addressTypes = ADDRESS_TYPES;
public selectedAddressType = ADDRESS_TYPES[0]; public selectedAddressType = ADDRESS_TYPES[0];
public newAddress = ''; public newAddress = '';
constructor(private store: Store<fromRTLReducer.RTLState>, private clEffects: CLEffects) {} constructor(private store: Store<fromRTLReducer.RTLState>, private clEffects: CLEffects) {}
ngOnInit() {}
onGenerateAddress() { onGenerateAddress() {
this.store.dispatch(new RTLActions.OpenSpinner('Getting New Address...')); this.store.dispatch(new RTLActions.OpenSpinner('Getting New Address...'));
this.store.dispatch(new CLActions.GetNewAddress(this.selectedAddressType)); this.store.dispatch(new CLActions.GetNewAddress(this.selectedAddressType));

@ -287,7 +287,7 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -33,7 +33,7 @@ export class CLOnChainSendComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -60,7 +60,7 @@ export class CLOnChainComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -60,7 +60,7 @@ export class CLUTXOTablesComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -137,7 +137,7 @@ export class CLChannelOpenTableComponent implements OnInit, AfterViewInit, OnDes
flgShowInput: true, flgShowInput: true,
getInputs: [ getInputs: [
{placeholder: 'Base Fee (mSats)', inputType: 'number', inputValue: 1000, width: 48}, {placeholder: 'Base Fee (mSats)', inputType: 'number', inputValue: 1000, width: 48},
{placeholder: 'Fee Rate (mili mSats)', inputType: 'number', inputValue: 1, min: 1, width: 48} {placeholder: 'Fee Rate (mili mSats)', inputType: 'number', inputValue: 1, min: 1, width: 48, hintFunction: this.percentHintFunction}
] ]
}})); }}));
this.rtlEffects.closeConfirm this.rtlEffects.closeConfirm
@ -178,7 +178,7 @@ export class CLChannelOpenTableComponent implements OnInit, AfterViewInit, OnDes
flgShowInput: true, flgShowInput: true,
getInputs: [ getInputs: [
{placeholder: 'Base Fee (mSats)', inputType: 'number', inputValue: (this.myChanPolicy.fee_base_msat === '') ? 0 : this.myChanPolicy.fee_base_msat, width: 48}, {placeholder: 'Base Fee (mSats)', inputType: 'number', inputValue: (this.myChanPolicy.fee_base_msat === '') ? 0 : this.myChanPolicy.fee_base_msat, width: 48},
{placeholder: 'Fee Rate (mili mSats)', inputType: 'number', inputValue: this.myChanPolicy.fee_rate_milli_msat, min: 1, width: 48} {placeholder: 'Fee Rate (mili mSats)', inputType: 'number', inputValue: this.myChanPolicy.fee_rate_milli_msat, min: 1, width: 48, hintFunction: this.percentHintFunction}
] ]
}})); }}));
}); });
@ -196,6 +196,10 @@ export class CLChannelOpenTableComponent implements OnInit, AfterViewInit, OnDes
this.applyFilter(); this.applyFilter();
} }
percentHintFunction(fee_rate_milli_msat) {
return (fee_rate_milli_msat / 10000).toString() + '%';
}
onChannelClose(channelToClose: Channel) { onChannelClose(channelToClose: Channel) {
this.store.dispatch(new RTLActions.OpenConfirmation({ data: { this.store.dispatch(new RTLActions.OpenConfirmation({ data: {
type: AlertTypeEnum.CONFIRM, type: AlertTypeEnum.CONFIRM,
@ -254,7 +258,7 @@ export class CLChannelOpenTableComponent implements OnInit, AfterViewInit, OnDes
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -154,7 +154,7 @@ export class CLChannelPendingTableComponent implements OnInit, AfterViewInit, On
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -86,7 +86,7 @@ export class CLChannelsTablesComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

@ -172,7 +172,7 @@ export class CLOpenChannelComponent implements OnInit, OnDestroy {
ngOnDestroy() { ngOnDestroy() {
this.unSubs.forEach(completeSub => { this.unSubs.forEach(completeSub => {
completeSub.next(); completeSub.next(null);
completeSub.complete(); completeSub.complete();
}); });
} }

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

Loading…
Cancel
Save