Enhanced error handling (#753)

pull/754/head
ShahanaFarooqui 3 years ago committed by GitHub
parent 7e1b9114eb
commit de1fb87672
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,39 +1,188 @@
{
"root": true,
"ignorePatterns": [
"projects/**/*"
"projects/**/*",
"rtl.js",
"/routes/**/*.js",
"/controllers/**/*.js",
"/src/prebuild.js"
],
"overrides": [
{
"files": [
"*.ts"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": [
"tsconfig.json"
],
"ecmaVersion": 2020,
"sourceType": "module",
"project": "./tsconfig.json",
"createDefaultProgram": true
},
"plugins": ["deprecation"],
"extends": [
"plugin:@angular-eslint/all",
"plugin:@angular-eslint/recommended",
"plugin:@angular-eslint/recommended--extra",
"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"
}
]
"deprecation/deprecation": "error",
"@angular-eslint/use-injectable-provided-in": "off",
"@angular-eslint/prefer-on-push-component-change-detection": "off",
"@angular-eslint/use-component-view-encapsulation": "off",
"@angular-eslint/sort-ngmodule-metadata-arrays": "off",
"@angular-eslint/arrow-body-style": "off",
"@angular-eslint/component-selector": ["error", { "prefix": "rtl", "style": "kebab-case", "type": "element" }],
"@angular-eslint/directive-selector": ["error", { "style": "camelCase", "type": "attribute" }],
"@typescript-eslint/type-annotation-spacing": "error",
"@typescript-eslint/member-delimiter-style": ["error", { "multiline": { "delimiter": "semi", "requireLast": true}, "singleline": { "delimiter": "comma", "requireLast": false }}],
"quotes": ["error", "single"],
"comma-dangle": ["error", "never"],
"comma-spacing": ["error", { "before": false, "after": true }],
"computed-property-spacing": ["error", "never", { "enforceForClassMembers": true }],
"array-bracket-spacing": ["error", "never", { "objectsInArrays": false }],
"space-in-parens": ["error", "never"],
"eol-last": ["error", "always"],
"array-bracket-newline": ["error", "consistent"],
"curly": "error",
"no-unused-expressions": "error",
"strict": "error",
"max-len": ["error", { "code": 430 }],
"new-parens": "error",
"no-multiple-empty-lines": "error",
"no-trailing-spaces": "error",
"quote-props": ["error", "as-needed"],
"space-before-function-paren": ["error", { "anonymous": "never", "asyncArrow": "always", "named": "never" }],
"semi": ["error", "always"],
"dot-location": "error",
"no-await-in-loop": "error",
"no-console": "error",
"no-loss-of-precision": "error",
"no-promise-executor-return": "error",
"no-template-curly-in-string": "error",
"no-unreachable-loop": "error",
"no-unsafe-optional-chaining": "error",
"no-useless-backreference": "error",
"require-atomic-updates": "error",
"array-callback-return": "error",
"block-scoped-var": "error",
"default-case": "error",
"default-case-last": "error",
"eqeqeq": "error",
"grouped-accessor-pairs": "error",
"guard-for-in": "error",
"no-alert": "error",
"no-caller": "error",
"no-constructor-return": "error",
"no-div-regex": "error",
"no-eq-null": "error",
"no-eval": "error",
"no-extend-native": "error",
"no-extra-bind": "error",
"no-extra-label": "error",
"no-floating-decimal": "error",
"no-implicit-globals": "error",
"no-implied-eval": "error",
"no-iterator": "error",
"no-labels": "error",
"no-lone-blocks": "error",
"no-loop-func": "error",
"no-multi-str": "error",
"no-new": "error",
"no-new-func": "error",
"no-multi-spaces": "error",
"no-new-wrappers": "error",
"no-nonoctal-decimal-escape": "error",
"no-octal-escape": "error",
"no-proto": "error",
"no-restricted-properties": "error",
"no-return-assign": "error",
"no-return-await": "error",
"no-script-url": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-throw-literal": "error",
"no-unmodified-loop-condition": "error",
"no-unused-labels": "error",
"no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-return": "error",
"no-void": "error",
"no-warning-comments": "error",
"prefer-named-capture-group": "error",
"prefer-promise-reject-errors": "error",
"prefer-regex-literals": "error",
"vars-on-top": "error",
"wrap-iife": "error",
"yoda": "error",
"no-label-var": "error",
"no-restricted-globals": "error",
"no-undef-init": "error",
"no-undefined": "error",
"block-spacing": "error",
"brace-style": "error",
"capitalized-comments": "error",
"comma-style": "error",
"func-call-spacing": "error",
"func-name-matching": "error",
"func-names": "error",
"id-match": "error",
"implicit-arrow-linebreak": "error",
"indent": ["error", 2, { "SwitchCase": 1, "MemberExpression": 1 }],
"keyword-spacing": ["error", { "before": true, "after": true, "overrides": { "this": { "before": false }}}],
"lines-around-comment": "error",
"max-depth": "error",
"max-nested-callbacks": "error",
"max-statements-per-line": "error",
"no-array-constructor": "error",
"no-bitwise": "error",
"no-continue": "error",
"no-mixed-operators": "error",
"no-multi-assign": "error",
"no-new-object": "error",
"no-restricted-syntax": "error",
"no-tabs": "error",
"no-unneeded-ternary": "error",
"no-whitespace-before-property": "error",
"nonblock-statement-body-position": "error",
"object-curly-newline": "error",
"object-curly-spacing": ["error", "always"],
"one-var-declaration-per-line": "error",
"operator-linebreak": ["error", "after"],
"padded-blocks": ["error", { "classes": "always", "blocks": "never", "switches": "never" }],
"padding-line-between-statements": "error",
"prefer-exponentiation-operator": "error",
"semi-spacing": "error",
"semi-style": "error",
"space-before-blocks": "error",
"space-infix-ops": "error",
"space-unary-ops": "error",
"spaced-comment": "error",
"switch-colon-spacing": "error",
"template-tag-spacing": "error",
"unicode-bom": "error",
"wrap-regex": "error",
"arrow-body-style": "error",
"arrow-parens": "error",
"arrow-spacing": "error",
"generator-star-spacing": "error",
"no-confusing-arrow": "error",
"no-duplicate-imports": "error",
"no-restricted-exports": "error",
"no-restricted-imports": "error",
"no-useless-computed-key": "error",
"no-useless-rename": "error",
"no-var": "error",
"prefer-arrow-callback": "error",
"prefer-const": "error",
"prefer-numeric-literals": "error",
"prefer-rest-params": "error",
"prefer-spread": "error",
"rest-spread-spacing": "error",
"symbol-description": "error",
"template-curly-spacing": "error",
"yield-star-spacing": "error"
}
},
{
@ -41,9 +190,21 @@
"*.html"
],
"extends": [
"plugin:@angular-eslint/template/all",
"plugin:@angular-eslint/template/recommended"
],
"rules": {}
"rules": {
"@angular-eslint/template/accessibility-elements-content": "off",
"@angular-eslint/template/click-events-have-key-events": "off",
"@angular-eslint/template/conditional-complexity": "off",
"@angular-eslint/template/cyclomatic-complexity": "off",
"@angular-eslint/template/i18n": "off",
"@angular-eslint/template/no-autofocus": "off",
"@angular-eslint/template/no-call-expression": "off",
"@angular-eslint/template/no-positive-tabindex": "off",
"@angular-eslint/template/use-track-by-function": "off"
}
}
]
}
// https://eslint.org/docs/rules/

@ -0,0 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"env": {
"NODE_ENV": "development"
},
"program": "${workspaceFolder}\\rtl.js"
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -2,17 +2,17 @@
<meta charset="utf-8">
<title>RTL</title>
<base href="/rtl/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="apple-touch-icon" sizes="180x180" href="assets/images/favicon-light/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/images/favicon-light/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/images/favicon-light/favicon-16x16.png">
<link rel="manifest" href="assets/images/favicon-light/site.webmanifest">
<link rel="mask-icon" href="assets/images/favicon-light/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<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.83be63e86b93a0a59299.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.83be63e86b93a0a59299.css"></noscript></head>
<meta i18n-content="" name="viewport" content="width=device-width, initial-scale=1">
<link i18n-sizes="" i18n-rel="" rel="apple-touch-icon" sizes="180x180" href="assets/images/favicon-light/apple-touch-icon.png">
<link i18n-sizes="" i18n-rel="" rel="icon" type="image/png" sizes="32x32" href="assets/images/favicon-light/favicon-32x32.png">
<link i18n-sizes="" i18n-rel="" rel="icon" type="image/png" sizes="16x16" href="assets/images/favicon-light/favicon-16x16.png">
<link i18n-rel="" rel="manifest" href="assets/images/favicon-light/site.webmanifest">
<link i18n-rel="" rel="mask-icon" href="assets/images/favicon-light/safari-pinned-tab.svg" color="#5bbad5">
<meta i18n-content="" name="msapplication-TileColor" content="#da532c">
<meta i18n-content="" name="theme-color" content="#ffffff">
<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.fdaad89ea21d77692f5a.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.fdaad89ea21d77692f5a.css"></noscript></head>
<body>
<rtl-app></rtl-app>
<script src="runtime.515ae0e5db4385847ae9.js" defer></script><script src="polyfills.b74d595cc9766a139c5a.js" defer></script><script src="main.ee077938ff4ca83988c5.js" defer></script>
<script src="runtime.9890bb0a887730f309c9.js" defer></script><script src="polyfills.a979cbbe16939013cdcf.js" defer></script><script src="main.1dbe7764ee40053c3579.js" defer></script>
</body></html>

File diff suppressed because one or more lines are too long

@ -1 +1 @@
(()=>{"use strict";var e,r,t,o={},a={};function n(e){var r=a[e];if(void 0!==r)return r.exports;var t=a[e]={id:e,loaded:!1,exports:{}};return o[e].call(t.exports,t,t.exports,n),t.loaded=!0,t.exports}n.m=o,e=[],n.O=(r,t,o,a)=>{if(!t){var l=1/0;for(s=0;s<e.length;s++){for(var[t,o,a]=e[s],d=!0,i=0;i<t.length;i++)(!1&a||l>=a)&&Object.keys(n.O).every(e=>n.O[e](t[i]))?t.splice(i--,1):(d=!1,a<l&&(l=a));d&&(e.splice(s--,1),r=o())}return r}a=a||0;for(var s=e.length;s>0&&e[s-1][2]>a;s--)e[s]=e[s-1];e[s]=[t,o,a]},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:"49acba864dead79d3813",646:"3fbe4d79910390a14cf6",891:"3def5a306a73761cdf3e",958:"39b052c196c8c4de3969"}[e]+".js",n.miniCssF=e=>"styles.83be63e86b93a0a59299.css",n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="rtl:",n.l=(e,o,a,l)=>{if(r[e])r[e].push(o);else{var d,i;if(void 0!==a)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+a){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+a),d.src=e),r[e]=[o];var f=(t,o)=>{d.onerror=d.onload=null,clearTimeout(p);var a=r[e];if(delete r[e],d.parentNode&&d.parentNode.removeChild(d),a&&a.forEach(e=>e(o)),t)return t(o)},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 o=n.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else if(666!=r){var a=new Promise((t,a)=>o=e[r]=[t,a]);t.push(o[2]=a);var l=n.p+n.u(r),d=new Error;n.l(l,t=>{if(n.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var a=t&&("load"===t.type?"missing":t.type),l=t&&t.target&&t.target.src;d.message="Loading chunk "+r+" failed.\n("+a+": "+l+")",d.name="ChunkLoadError",d.type=a,d.request=l,o[1](d)}},"chunk-"+r,r)}else e[r]=0},n.O.j=r=>0===e[r];var r=(r,t)=>{var o,a,[l,d,i]=t,s=0;for(o in d)n.o(d,o)&&(n.m[o]=d[o]);if(i)var u=i(n);for(r&&r(t);s<l.length;s++)n.o(e,a=l[s])&&e[a]&&e[a][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))})()})();
(()=>{"use strict";var e,r,t,o={},a={};function n(e){var r=a[e];if(void 0!==r)return r.exports;var t=a[e]={id:e,loaded:!1,exports:{}};return o[e].call(t.exports,t,t.exports,n),t.loaded=!0,t.exports}n.m=o,e=[],n.O=(r,t,o,a)=>{if(!t){var l=1/0;for(s=0;s<e.length;s++){for(var[t,o,a]=e[s],d=!0,i=0;i<t.length;i++)(!1&a||l>=a)&&Object.keys(n.O).every(e=>n.O[e](t[i]))?t.splice(i--,1):(d=!1,a<l&&(l=a));d&&(e.splice(s--,1),r=o())}return r}a=a||0;for(var s=e.length;s>0&&e[s-1][2]>a;s--)e[s]=e[s-1];e[s]=[t,o,a]},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:"eb10545682b7d553463a",646:"04e55a7f093b0837f9ef",891:"e474f3a61b94897642e8",958:"a55d8156c48e68ddc825"}[e]+".js",n.miniCssF=e=>"styles.fdaad89ea21d77692f5a.css",n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="rtl:",n.l=(e,o,a,l)=>{if(r[e])r[e].push(o);else{var d,i;if(void 0!==a)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+a){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+a),d.src=e),r[e]=[o];var f=(t,o)=>{d.onerror=d.onload=null,clearTimeout(p);var a=r[e];if(delete r[e],d.parentNode&&d.parentNode.removeChild(d),a&&a.forEach(e=>e(o)),t)return t(o)},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 o=n.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else if(666!=r){var a=new Promise((t,a)=>o=e[r]=[t,a]);t.push(o[2]=a);var l=n.p+n.u(r),d=new Error;n.l(l,t=>{if(n.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var a=t&&("load"===t.type?"missing":t.type),l=t&&t.target&&t.target.src;d.message="Loading chunk "+r+" failed.\n("+a+": "+l+")",d.name="ChunkLoadError",d.type=a,d.request=l,o[1](d)}},"chunk-"+r,r)}else e[r]=0},n.O.j=r=>0===e[r];var r=(r,t)=>{var o,a,[l,d,i]=t,s=0;for(o in d)n.o(d,o)&&(n.m[o]=d[o]);if(i)var u=i(n);for(r&&r(t);s<l.length;s++)n.o(e,a=l[s])&&e[a]&&e[a][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))})()})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -9,30 +9,14 @@ exports.getBalance = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/getBalance';
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Balance', msg: 'Balance Received', data: body});
if(!body.totalBalance) {
body.totalBalance = 0;
}
if(!body.confBalance) {
body.confBalance = 0;
}
if(!body.unconfBalance) {
body.unconfBalance = 0;
}
if (!body.totalBalance) { body.totalBalance = 0; }
if (!body.confBalance) { body.confBalance = 0; }
if (!body.unconfBalance) { body.unconfBalance = 0; }
logger.log({level: 'INFO', fileName: 'Balance', msg: 'Balance Received'});
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Balance', msg: 'Balance Fetch Error', error: err});
return res.status(500).json({
message: "Fetching balance failed!",
error: err.error
});
const err = common.handleError(errRes, 'Balance', 'Get Balance Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -20,18 +20,8 @@ exports.listChannels = (req, res, next) => {
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'List Channels Error', error: err});
return res.status(500).json({
message: 'Fetching List Channels Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'List Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -43,30 +33,12 @@ exports.openChannel = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Options', data: options.body});
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open Channel Error', error: body.error});
res.status(500).json({
message: 'Open Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Opened'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Opened'});
res.status(201).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open Channel Error', error: err});
return res.status(500).json({
message: 'Open Channel Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Open Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -78,30 +50,12 @@ exports.setChannelFee = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.body});
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: body.error});
res.status(500).json({
message: 'Update Channel Policy Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Fee Set'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Fee Set'});
res.status(201).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: err});
return res.status(500).json({
message: 'Update Channel Policy Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Update Channel Policy Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -114,30 +68,12 @@ exports.closeChannel = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel', data: options.url});
request.delete(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Close Channel Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: body.error});
res.status(500).json({
message: 'Close Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Closed'});
res.status(204).json(body);
}
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Closed'});
res.status(204).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: err});
return res.status(500).json({
message: 'Close Channel Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Close Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -147,28 +83,14 @@ exports.getLocalRemoteBalance = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/channel/localremotebal';
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Local Remote Balance', data: body});
if(!body.localBalance) {
body.localBalance = 0;
}
if(!body.remoteBalance) {
body.remoteBalance = 0;
}
if (!body.localBalance) { body.localBalance = 0; }
if (!body.remoteBalance) { body.remoteBalance = 0; }
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Local & Remote Balances Received'});
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Local Remote Balance Error', error: err});
return res.status(500).json({
message: 'Fetching Local Remote Balance Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Local Remote Balance Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -178,33 +100,13 @@ exports.listForwards = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/channel/listForwards/';
request.get(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Forwarding History Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Forwarding History Error', error: body.error});
res.status(500).json({
message: "Forwarding History Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
if (body && body.length > 0) {
body = common.sortDescByKey(body, 'received_time');
}
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 });
}
if (body && body.length > 0) { body = common.sortDescByKey(body, 'received_time'); }
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 });
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Forwarding History Error', error: err});
return res.status(500).json({
message: "Forwarding History Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Forwarding History Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -9,32 +9,12 @@ exports.getFees = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/getFees';
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Fee Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Fee Error', error: body.error});
res.status(500).json({
message: "Fetching fee failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
if(!body.feeCollected) {
body.feeCollected = 0;
}
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Fees Received'});
res.status(200).json(body);
}
if (!body.feeCollected) { body.feeCollected = 0; }
logger.log({level: 'INFO', fileName: 'Fees', msg: 'Fees Received'});
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Fees Error', error: err});
return res.status(500).json({
message: "Fetching fee failed!",
error: err.error
});
const err = common.handleError(errRes, 'Fees', 'Get Fees Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -11,22 +11,18 @@ exports.getInfo = (req, res, next) => {
logger.log({level: 'DEBUG', fileName:'GetInfo', msg: 'Selected Node', data: common.selectedNode.ln_node});
logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Calling Info from C-Lightning server url', data: options.url});
if (!options.headers || !options.headers.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({
message: "Fetching Info Failed!",
error: "Bad Macaroon"
});
const errMsg = 'C-Lightning get info failed due to bad or missing macaroon!';
const err = common.handleError({ statusCode: 502, message: 'Bad Macaroon', error: errMsg }, 'GetInfo', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Node Information', data: 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.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: body.error});
res.status(500).json({
message: "Fetching Info failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
if (!body || search_idx > -1 || body.error) {
if (body && !body.error) { body.error = 'Error From Server!'; }
const err = common.handleError(body, 'GetInfo', 'Get Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
body.lnImplementation = 'C-Lightning';
let chainObj = { chain: '', network: '' };
@ -55,18 +51,8 @@ exports.getInfo = (req, res, next) => {
}
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: err});
return res.status(500).json({
message: "Fetching Info failed!",
error: err.error
});
const err = common.handleError(errRes, 'GetInfo', 'Get Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};

@ -10,29 +10,12 @@ exports.deleteExpiredInvoice = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/invoice/delExpiredInvoice' + queryStr;
request.delete(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices Deleted', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Invoice Delete Error', error: body.error});
res.status(500).json({
message: "Deleting Invoice Failed!",
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'});
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Invoice Delete Error', error: err});
return res.status(500).json({
message: "Deleting Invoice Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Invoice', 'Delete Invoice Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -43,34 +26,16 @@ exports.listInvoices = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/invoice/listInvoices' + labelQuery;
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoice Error', error: body.error});
res.status(500).json({
message: "Fetching Invoice Info failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
if ( body.invoices && body.invoices.length > 0) {
body.invoices = common.sortDescByKey(body.invoices, 'expires_at');
}
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);
if ( body.invoices && body.invoices.length > 0) {
body.invoices = common.sortDescByKey(body.invoices, 'expires_at');
}
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);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoice Error', error: err});
return res.status(500).json({
message: "Fetching Invoice Info failed!",
error: err.error
});
const err = common.handleError(errRes, 'Invoice', 'List Invoices Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -81,29 +46,11 @@ exports.addInvoice = (req, res, next) => {
options.body = req.body;
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Add Invoice Responce', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: body.error});
res.status(500).json({
message: "Add Invoice Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Invoice Created'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Invoice Created'});
res.status(201).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: err});
return res.status(500).json({
message: "Add Invoice Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Invoice', 'Add Invoice Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -10,30 +10,12 @@ exports.signMessage = (req, res, next) => {
options.form = { message: req.body.message };
request.post(options, (error, response, body) => {
logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Signed', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Message Sign Error', error: body.error});
res.status(500).json({
message: "Sign message failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Signed'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Signed'});
res.status(201).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Sign Message Error', error: err});
return res.status(500).json({
message: 'Sign Message Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Message', 'Sign Message Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -43,29 +25,11 @@ exports.verifyMessage = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/utility/checkMessage/' + req.body.message + '/' + req.body.signature;
request.get(options, (error, response, body) => {
logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Verified', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Verify Message Error', error: body.error});
res.status(500).json({
message: "Verify message failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Verified'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Verified'});
res.status(201).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Message Verification Error', error: err});
return res.status(500).json({
message: 'Verify Message Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Message', 'Verify Message Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -9,29 +9,12 @@ exports.getRoute = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/network/getRoute/' + req.params.destPubkey + '/' + req.params.amount;
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Network', msg: 'Query Routes Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Network', msg: 'Query Routes Error', error: body.error});
res.status(500).json({
message: "Fetching Query Routes Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
}
logger.log({level: 'INFO', fileName: 'Network', msg: 'Network Routes Received'});
res.status(200).json({routes: body});
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Network', msg: 'Query Routes Error', error: err});
return res.status(500).json({
message: "Fetching Query Routes Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Network', 'Query Routes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -45,18 +28,8 @@ exports.listNode = (req, res, next) => {
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Network', msg: 'Node Lookup Error', error: err});
return res.status(500).json({
message: "Node Lookup Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Network', 'Node Lookup Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -70,18 +43,8 @@ exports.listChannel = (req, res, next) => {
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Network', msg: 'Channel Lookup Error', error: err});
return res.status(500).json({
message: "Channel Lookup Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Network', 'Channel Lookup Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -94,17 +57,7 @@ exports.feeRates = (req, res, next) => {
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Network', msg: 'Fee Rates Error', error: err});
return res.status(500).json({
message: "Fee Rates Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Network', 'Fee Rates Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -12,18 +12,8 @@ exports.getNewAddress = (req, res, next) => {
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain New Address Error', error: err});
return res.status(500).json({
message: "Fetching new address failed!",
error: err.error
});
const err = common.handleError(errRes, 'OnChain', 'New Address Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -35,30 +25,12 @@ exports.onChainWithdraw = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Options', data: options.body});
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'OnChain', msg: 'OnChain Withdraw Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain Withdraw Error', error: body.error});
res.status(500).json({
message: 'OnChain Withdraw Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Withdraw Finished'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'OnChain', msg: 'Withdraw Finished'});
res.status(201).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain Withdraw Error', error: err});
return res.status(500).json({
message: 'OnChain Withdraw Failed!',
error: err
});
const err = common.handleError(errRes, 'OnChain', 'Withdraw Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -71,17 +43,7 @@ exports.getUTXOs = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'OnChain', msg: 'List Funds Received', data: body});
res.status(200).json(body);
}).catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'OnChain', msg: 'OnChain List Funds Error', error: err});
return res.status(500).json({
message: "Fetching list funds failed!",
error: err.error
});
const err = common.handleError(errRes, 'OnChain', 'List Funds Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -6,7 +6,7 @@ var options = {};
function paymentReducer(accumulator, currentPayment) {
let currPayHash = currentPayment.payment_hash;
if (!currentPayment.partid) { currentPayment.partid = 0; }
if(!accumulator[currPayHash]) {
if (!accumulator[currPayHash]) {
accumulator[currPayHash] = [currentPayment];
} else {
accumulator[currPayHash].push(currentPayment);
@ -51,33 +51,15 @@ exports.listPayments = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/pay/listPayments';
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body.payments});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: body.error});
res.status(500).json({
message: "Payments List Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
if ( body && body.payments && body.payments.length > 0) {
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));
if ( body && body.payments && body.payments.length > 0) {
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));
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payments List Error', error: err});
return res.status(500).json({
message: "Payments List Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Payments', 'List Payments Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -87,30 +69,12 @@ exports.decodePayment = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/pay/decodePay/' + req.params.invoice;
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment Decode Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: body.error});
res.status(500).json({
message: "Payment Request Decode Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded'});
res.status(200).json(body);
}
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Decoded'});
res.status(200).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Payment Decode Error', error: err});
return res.status(500).json({
message: "Payment Request Decode Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Payments', 'Decode Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -126,29 +90,11 @@ exports.postPayment = (req, res, next) => {
options.body = req.body;
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Send Payment Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payment Error', error: body.error});
res.status(500).json({
message: "Send Payment Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Sent'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payment Sent'});
res.status(201).json(body);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'Send Payments Error', error: err});
return res.status(500).json({
message: "Send Payment Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Payments', 'Send Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -15,18 +15,8 @@ exports.getPeers = (req, res, next) => {
res.status(200).json(peers);
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Peers List Error', error: err});
return res.status(500).json({
message: "Peers Fetch Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Peers', 'List Peers Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -36,37 +26,19 @@ exports.postPeer = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/peer/connect';
options.body = req.body;
request.post(options, (error, response, body) => {
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Connect Peer Error', error: body && body.error ? body.error : body ? body : ''});
res.status(500).json({
message: "Adding peer failed!",
error: (!body) ? 'Error From Server!' : body.error ? body.error : 'Error From Server!'
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added', data: body});
options.url = common.getSelLNServerUrl() + '/v1/peer/listPeers';
request(options).then(function (body) {
let peers = ( body) ? common.sortDescByStrKey(body, 'alias') : [];
peers = common.newestOnTop(peers, 'id', req.body.id);
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Newest On Top', data: peers});
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added Successfully'});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Connected'});
res.status(201).json(peers);
}).catch(errRes => {
const err = common.handleError(errRes, 'Peers', 'Connect Peer Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added', data: body});
options.url = common.getSelLNServerUrl() + '/v1/peer/listPeers';
request(options).then(function (body) {
let peers = ( body) ? common.sortDescByStrKey(body, 'alias') : [];
peers = common.newestOnTop(peers, 'id', req.body.id);
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Newest On Top', data: peers});
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added Successfully'});
logger.log({level: 'INFO', fileName: 'Peers', msg: 'Peer Connected'});
res.status(201).json(peers);
}).catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Connect Peer Error', error: err});
return res.status(500).json({
message: "Peer Add Failed!",
error: err.error
});
});
}
});
};
@ -76,30 +48,12 @@ exports.deletePeer = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/peer/disconnect/' + req.params.peerId + '?force=' + req.query.force;
request.delete(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Detach Peer Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Detach Peer Error', error: body.error});
res.status(500).json({
message: "Detach peer failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
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({});
}
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({});
})
.catch(errRes => {
let err = JSON.parse(JSON.stringify(errRes));
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Detach Peer Error', error: err});
return res.status(500).json({
message: "Detach Peer Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Peers', 'Detach Peer Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -95,7 +95,7 @@ exports.getChannels = (req, res, next) => {
} else {
request.post(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'All Channels', data: body});
if(body && body.length) {
if (body && body.length) {
return simplifyAllChannels(body).then(function(simplifiedChannels) {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Simplified Channels with Alias', data: simplifiedChannels});
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channels List Received'});
@ -107,18 +107,8 @@ exports.getChannels = (req, res, next) => {
}
})
.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: 'Channels', msg: 'Get Channels Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: 'Fetching Channels Failed!',
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Channels', 'List Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};
@ -134,18 +124,8 @@ exports.getChannelStats = (req, res, next) => {
res.status(201).json(body);
})
.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: 'ChannelStats', msg: 'Get Channel Stats Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Channel Stats Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Channels', 'Get Channel Stats Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -157,30 +137,12 @@ exports.openChannel = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Params', data: options.form});
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Open Channel Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open Channel Error', error: body.error});
res.status(500).json({
message: 'Open Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Opened'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Opened'});
res.status(201).json(body);
})
.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: 'Channels', msg: 'Open Channel Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Open Channel Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Channels', 'Open Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -196,18 +158,8 @@ exports.updateChannelRelayFee = (req, res, next) => {
res.status(201).json(body);
})
.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: 'Channels', msg: 'Update Relay Fee Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Update Relay Fee Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Channels', 'Update Relay Fee Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -228,18 +180,8 @@ exports.closeChannel = (req, res, next) => {
res.status(204).json(body);
})
.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: 'Channels', msg: 'Close Channel Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Close Channel Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Channels', 'Close Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}

@ -81,18 +81,8 @@ exports.getFees = (req, res, next) => {
res.status(200).json(arrangeFees(body, Math.round((new Date().getTime()))));
})
.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: 'Fees', msg: 'Get Fees Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Fees failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Fees', 'Get Fees Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};
@ -111,18 +101,8 @@ exports.getPayments = (req, res, next) => {
res.status(200).json(arrangePayments(body));
})
.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: 'Fees', msg: 'Get Payments Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Payments failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Fees', 'Get Payments Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};

@ -18,33 +18,19 @@ exports.getInfo = (req, res, next) => {
});
} else {
if (!options.headers || !options.headers.authorization) {
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({
message: "Fetching Info Failed!",
error: "Missing Or Wrong Password"
});
const errMsg = 'Eclair Get info failed due to missing or wrong password!';
const err = common.handleError({ statusCode: 502, message: 'Missing or Wrong Password', error: errMsg }, 'GetInfo', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Get Info Response', data: body});
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
body.lnImplementation = 'Eclair';
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'Eclair Node Information Received'});
res.status(200).json(body);
})
.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: 'GetInfo', msg: 'Get Info Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching Info failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'GetInfo', 'Get Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
}

@ -65,18 +65,8 @@ exports.listInvoices = (req, res, next) => {
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"
});
const err = common.handleError(errRes, 'Invoices', 'List Invoices Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
logger.log({level: 'INFO', fileName: 'Invoices', msg: 'Empty List Invoice Received'});
@ -84,18 +74,8 @@ exports.listInvoices = (req, res, next) => {
}
})
.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"
});
const err = common.handleError(errRes, 'Invoices', 'List Invoices Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};
@ -112,17 +92,7 @@ exports.createInvoice = (req, res, next) => {
res.status(201).json(body);
})
.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: 'Create Invoice Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Create Invoice Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Invoices', 'Create Invoice Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -14,17 +14,7 @@ exports.getNodes = (req, res, next) => {
res.status(200).json(body);
})
.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: 'Network', msg: 'Node Lookup Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: 'Node Lookup Failed!',
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Network', 'Node Lookup Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -4,12 +4,8 @@ var logger = require('../shared/logger');
var options = {};
arrangeBalances = (body) => {
if(!body.confirmed) {
body.confirmed = 0;
}
if(!body.unconfirmed) {
body.unconfirmed = 0;
}
if (!body.confirmed) { body.confirmed = 0; }
if (!body.unconfirmed) { body.unconfirmed = 0; }
body.total = +body.confirmed + +body.unconfirmed;
body.btc_total = +body.btc_confirmed + +body.btc_unconfirmed;
return body;
@ -26,18 +22,8 @@ exports.getNewAddress = (req, res, next) => {
res.status(200).json(body);
})
.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: 'Onchain', msg: 'Get New Address Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Getting New Address failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'OnChain', 'Get New Address Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -55,18 +41,8 @@ exports.getBalance = (req, res, next) => {
res.status(200).json(arrangeBalances(body));
})
.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: 'Onchain', msg: 'Fetch Balance Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Fetching balance failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'OnChain', 'Get Balance Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};
@ -89,18 +65,8 @@ exports.getTransactions = (req, res, next) => {
res.status(200).json(body);
})
.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: 'Onchain', msg: 'Get Transactions Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Getting transactions failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'OnChain', 'Get Transactions Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -120,17 +86,7 @@ exports.sendFunds = (req, res, next) => {
res.status(201).json(body);
})
.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: 'Onchain', msg: 'Send Funds Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Send funds failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'OnChain', 'Send Funds Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -26,18 +26,8 @@ exports.decodePayment = (req, res, next) => {
res.status(200).json(body);
})
.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: 'Payments', msg: 'Payment Decode Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Payment Decode Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Payments', 'Decode Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -53,18 +43,8 @@ exports.postPayment = (req, res, next) => {
res.status(201).json(body);
})
.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: 'Payments', msg: 'Send Payment Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Send Payment Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Payments', 'Send Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -97,18 +77,8 @@ exports.queryPaymentRoute = (req, res, next) => {
}
})
.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: 'Payments', msg: 'Query Payment Route Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Query Payment Route Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Payments', 'Query Route Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -124,18 +94,8 @@ exports.getSentPaymentsInformation = (req, res, next) => {
res.status(200).json(values);
})
.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: 'Payments', msg: 'Payment Sent Information Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Payment Sent Information Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Payments', 'Sent Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Empty Sent Payment Information Received'});

@ -45,18 +45,8 @@ exports.getPeers = (req, res, next) => {
}
})
.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: 'Peers', msg: 'Get Peers Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: 'Fetching Peers Failed!',
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Peers', 'List Peers Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};
@ -72,16 +62,12 @@ exports.connectPeer = (req, res, next) => {
}
request.post(options, (error, response, body) => {
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Add Peer Response', data: body});
if (body === 'already connected') {
return res.status(500).json({
message: "Connect Peer Failed!",
error: "Already connected"
});
if (typeof body === 'string' && body.includes('already connected')) {
const err = common.handleError({ statusCode: 500, message: 'Connect Peer Error', error: body }, 'Peers', body);
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else if (typeof body === 'string' && body.includes('connection failed')) {
return res.status(500).json({
message: "Connect Peer Failed!",
error: body.charAt(0).toUpperCase() + body.slice(1)
});
const err = common.handleError({ statusCode: 500, message: 'Connect Peer Error', error: body }, 'Peers', body);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = common.getSelLNServerUrl() + '/peers';
options.form = {};
@ -108,32 +94,12 @@ exports.connectPeer = (req, res, next) => {
res.status(201).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: 'Peers', msg: 'Connect Peer Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Connect Peer Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Peers', 'Connect Peer Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}).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: 'Peers', msg: 'Connect Peer Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Connect Peer Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Peers', 'Connect Peer Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -153,17 +119,7 @@ exports.deletePeer = (req, res, next) => {
res.status(204).json(body);
})
.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: 'Peers', msg: 'Disconnect Peer Error', error: err});
return res.status(err.statusCode ? err.statusCode : 500).json({
message: "Disconnect Peer Failed!",
error: err.error && err.error.error ? err.error.error : err.error ? err.error : "Unknown Server Error"
});
const err = common.handleError(errRes, 'Peers', 'Disconnect Peer Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -25,17 +25,7 @@ exports.getBalance = (req, res, next) => {
}
})
.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: 'Balance', msg: 'Fetch Balance Error', error: err});
return res.status(500).json({
message: "Fetching balance failed!",
error: err.error
});
const err = common.handleError(errRes, 'Balance', 'Get Balance Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -27,7 +27,7 @@ exports.getAllChannels = (req, res, next) => {
let total = 0;
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'All Channels Received', data: body});
if(body.channels) {
if (body.channels) {
return Promise.all(
body.channels.map(channel => {
local = (channel.local_balance) ? +channel.local_balance : 0;
@ -44,18 +44,8 @@ exports.getAllChannels = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Channels', msg: 'Get All Channel Alias Error', error: err});
res.status(500).json({
message: 'Fetching Channels Alias Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Get All Channel Aliases Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
body.channels = [];
@ -64,18 +54,8 @@ exports.getAllChannels = (req, res, next) => {
}
})
.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: 'Channels', msg: 'Get All Channels Error', error: err});
return res.status(500).json({
message: 'Fetching All Channels Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'List Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -89,16 +69,16 @@ exports.getPendingChannels = (req, res, next) => {
body.total_limbo_balance = 0;
}
const promises = [];
if(body.pending_open_channels && body.pending_open_channels.length > 0) {
if (body.pending_open_channels && body.pending_open_channels.length > 0) {
body.pending_open_channels.map(channel => { return promises.push(getAliasForChannel(channel.channel))});
}
if(body.pending_closing_channels && body.pending_closing_channels.length > 0) {
if (body.pending_closing_channels && body.pending_closing_channels.length > 0) {
body.pending_closing_channels.map(channel => { return promises.push(getAliasForChannel(channel.channel))});
}
if(body.pending_force_closing_channels && body.pending_force_closing_channels.length > 0) {
if (body.pending_force_closing_channels && body.pending_force_closing_channels.length > 0) {
body.pending_force_closing_channels.map(channel => { return promises.push(getAliasForChannel(channel.channel))});
}
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))});
}
return Promise.all(promises).then(function(values) {
@ -107,33 +87,13 @@ exports.getPendingChannels = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Channels', msg: 'Get Pending Channel Alias Error', error: err});
res.status(500).json({
message: 'Fetching Pending Channels Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Get Pending Channel Aliases Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
})
.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: 'Channels', msg: 'Get Pending Channel Error', error: err});
return res.status(500).json({
message: 'Fetching Pending Channels Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'List Pending Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -157,18 +117,8 @@ exports.getClosedChannels = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Channels', msg: 'Get All Channel Alias Error', error: err});
res.status(500).json({
message: 'Fetching Channels Alias Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Get Closed Channel Aliases Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
body.channels = [];
@ -176,18 +126,8 @@ exports.getClosedChannels = (req, res, next) => {
}
})
.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: 'Channels', msg: 'Get Closed Channel Error', error: err});
return res.status(500).json({
message: 'Fetching Closed Channels Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'List Closed Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -209,30 +149,12 @@ exports.postChannel = (req, res, next) => {
options.form = JSON.stringify(options.form);
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Channel Open Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Open New Channel Error', error: body.error});
res.status(500).json({
message: 'Open Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channels Opened'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channels Opened'});
res.status(201).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.log({level: 'ERROR', fileName: 'Channels', msg: 'Open New Channel Error', error: err});
return res.status(500).json({
message: 'Open Channel Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Open Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -241,7 +163,7 @@ exports.postTransactions = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/channels/transactions';
options.form = { payment_request: req.body.paymentReq };
if(req.body.paymentAmount) {
if (req.body.paymentAmount) {
options.form.amt = req.body.paymentAmount;
}
if (req.body.feeLimit) { options.form.fee_limit = req.body.feeLimit; }
@ -252,36 +174,17 @@ exports.postTransactions = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Options', data: options.form});
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Send Payment Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Send Payment Error', error: body.error});
res.status(500).json({
message: 'Send Payment Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else if (body.payment_error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Send Payment Error: ' + JSON.stringify(body.payment_error)});
res.status(500).json({
message: 'Send Payment Failed!',
error: (!body) ? 'Error From Server!' : body.payment_error
});
if (body.payment_error) {
const err = common.handleError(bosy.payment_error, 'Channels', 'Send Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Payment Sent'});
res.status(201).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.log({level: 'ERROR', fileName: 'Channels', msg: 'Send Payment Error', error: err});
return res.status(500).json({
message: 'Send Payment Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Send Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -291,35 +194,17 @@ exports.closeChannel = (req, res, next) => {
options = common.getOptions();
let channelpoint = req.params.channelPoint.replace(':', '/');
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.sat_per_byte) { options.url = options.url + '&sat_per_byte=' + req.query.sat_per_byte; }
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; }
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Closing Channel Options URL', data: options.url});
request.delete(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Close Channel Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Close Channel Error', error: body.error});
res.status(500).json({
message: 'Close Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Closed'});
res.status(204).json({message: 'Channel Closed!'});
}
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Closed'});
res.status(204).json({message: 'Channel Closed!'});
})
.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: 'Channels', msg: 'Close Channel Error', error: err});
return res.status(500).json({
message: 'Close Channel Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Close Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -327,7 +212,7 @@ exports.postChanPolicy = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Updating Channel Policy..'});
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/chanpolicy';
if(req.body.chanPoint === 'all') {
if (req.body.chanPoint === 'all') {
options.form = JSON.stringify({
global: true,
base_fee_msat: req.body.baseFeeMsat,
@ -348,29 +233,11 @@ exports.postChanPolicy = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy Options', data: options.form});
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Channels', msg: 'Update Channel Policy', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: body.error});
res.status(500).json({
message: 'Update Channel Failed!',
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Policy Updated'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Channels', msg: 'Channel Policy Updated'});
res.status(201).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.log({level: 'ERROR', fileName: 'Channels', msg: 'Update Channel Policy Error', error: err});
return res.status(500).json({
message: 'Update Channel Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Channels', 'Update Channel Policy Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -9,8 +9,10 @@ function getFilesList(callback) {
let all_restore_exists = false;
let response = {all_restore_exists: false, files: []};
fs.readdir(common.selectedNode.channel_backup_path + common.path_separator + 'restore', function (err, files) {
if (err && err.code !== 'ENOENT' && err.errno !== -4058) { response = { message: 'Channels Restore List Failed!', error: err } }
if( files && files.length > 0) {
if (err && err.code !== 'ENOENT' && err.errno !== -4058) {
response = { message: 'Channels Restore List Failed!', error: err, statusCode: 500 };
}
if (files && files.length > 0) {
files.forEach(file => {
if (!file.includes('.restored')) {
if (file.toLowerCase() === 'channel-all.bak' || file.toLowerCase() === 'backup-channel-all.bak') {
@ -49,15 +51,8 @@ exports.getBackup = (req, res, next) => {
createStream.end();
}
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: 'ChannelsBackup', msg: 'Channels Backup Error', error: err});
return res.status(500).json({ message: 'Channels Backup Failed!', error: err });
const err = common.handleError(errRes, 'ChannelsBackup', 'Backup Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
}
}
@ -65,15 +60,8 @@ exports.getBackup = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'ChannelsBackup', msg: 'Channel Backup', data: body});
fs.writeFile(channel_backup_file, JSON.stringify(body), function(errRes) {
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.log({level: 'ERROR', fileName: 'ChannelsBackup', msg: 'Channels Backup Error', error: err});
return res.status(500).json({ message: 'Channels Backup Failed!', error: err.error });
const err = common.handleError(errRes, 'ChannelsBackup', 'Backup Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Channel Backup Finished'});
res.status(200).json({ message: message });
@ -81,18 +69,8 @@ exports.getBackup = (req, res, next) => {
});
})
.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: 'ChannelsBackup', msg: 'Channel Backup Error', error: err});
return res.status(500).json({
message: 'Channels Backup Failed!',
error: err.error
});
const err = common.handleError(errRes, 'ChannelsBackup', 'Backup Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -114,13 +92,15 @@ exports.postBackupVerify = (req, res, next) => {
delete verify_backup.single_chan_backups;
options.form = JSON.stringify(verify_backup);
} 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!' });
const errMsg = 'Channel backup to verify does not Exist.';
const err = common.handleError({ statusCode: 404, message: 'Verify Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
} else {
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!' });
const errMsg = 'Channel backup to verify does not Exist.';
const err = common.handleError({ statusCode: 404, message: 'Verify Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
} else {
message = 'Channel Verify Successful.';
@ -131,8 +111,9 @@ exports.postBackupVerify = (req, res, next) => {
options.form = JSON.stringify({ single_chan_backups: { chan_backups: [JSON.parse(verify_backup)] } });
} else {
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!' });
const errMsg = 'Channel backup to verify does not Exist.';
const err = common.handleError({ statusCode: 404, message: 'Verify Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
}
if (verify_backup !== '') {
@ -142,18 +123,8 @@ exports.postBackupVerify = (req, res, next) => {
res.status(201).json({ message: message });
})
.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: 'ChannelBackup', msg: 'Channel Backup Verify Error', error: err});
return res.status(404).json({
message: 'Channel backup to Verify failed!',
error: err.error
});
const err = common.handleError(errRes, 'ChannelsBackup', 'Verify Channels Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};
@ -176,8 +147,9 @@ exports.postRestore = (req, res, next) => {
restore_backup = JSON.parse(restore_backup);
options.form = JSON.stringify({multi_chan_backup: restore_backup.multi_chan_backup.multi_chan_backup});
} 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!' });
const errMsg = 'Channel backup to restore does not Exist.';
const err = common.handleError({ statusCode: 404, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
} else if (downloaded_exists) {
restore_backup = fs.readFileSync(channel_restore_file + 'backup-channel-all.bak', 'utf-8');
@ -185,13 +157,15 @@ exports.postRestore = (req, res, next) => {
restore_backup = JSON.parse(restore_backup);
options.form = JSON.stringify({multi_chan_backup: restore_backup.multi_chan_backup.multi_chan_backup});
} 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!' });
const errMsg = 'Channel backup to restore does not Exist.';
const err = common.handleError({ statusCode: 404, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
} else {
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!' });
const errMsg = 'Channel backup to restore does not Exist.';
const err = common.handleError({ statusCode: 404, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
} else {
message = 'Channel Restore Successful.';
@ -202,18 +176,21 @@ exports.postRestore = (req, res, next) => {
options.form = JSON.stringify({ chan_backups: { chan_backups: [JSON.parse(restore_backup)] } });
} else {
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!' });
const errMsg = 'Channel backup to restore does not Exist.';
const err = common.handleError({ statusCode: 404, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
}
if (restore_backup !== '') {
request.post(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'ChannelBackup', msg: 'Channel Backup Restore', data: body});
if(req.params.channelPoint === 'ALL') { channel_restore_file = channel_restore_file + 'channel-all.bak'; }
fs.rename(channel_restore_file, channel_restore_file + '.restored', () => {
getFilesList(getFilesListRes => {
if (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 });
const errMsg = getFilesListRes.error;
const err = common.handleError({ statusCode: 500, message: 'Restore Channel Error', error: errMsg }, 'ChannelBackup', errMsg);
return res.status(err.statusCode).json({message: err.error, list: getFilesListRes});
} else {
logger.log({level: 'INFO', fileName: 'ChannelBackup', msg: 'Channel Restored'});
return res.status(201).json({ message: message, list: getFilesListRes });
@ -222,18 +199,8 @@ exports.postRestore = (req, res, next) => {
});
})
.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: 'ChannelBackup', msg: 'Channel Restore Error', error: err});
return res.status(404).json({
message: 'Channel restore failed!',
error: err.error.error
});
const err = common.handleError(errRes, 'ChannelsBackup', 'Restore Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};
@ -241,7 +208,7 @@ exports.postRestore = (req, res, next) => {
exports.getRestoreList = (req, res, next) => {
getFilesList(getFilesListRes => {
if (getFilesListRes.error) {
return res.status(500).json(getFilesListRes);
return res.status(getFilesListRes.statusCode).json(getFilesListRes);
} else {
return res.status(200).json(getFilesListRes);
}

@ -10,54 +10,36 @@ exports.getFees = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/fees';
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Fee Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Fees', msg: 'Get Fee Error', error: body.error});
res.status(500).json({
message: "Fetching fee failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
let today = new Date(Date.now());
let start_date = new Date(today.getFullYear(), today.getMonth(), 1, 0, 0, 0);
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 day_start_time = current_time - 86400;
return swtch.getAllForwardingEvents(month_start_time, current_time, 0, (history) => {
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Forwarding History Received', data: history});
daily_sum = history.forwarding_events.reduce((acc, curr) => (curr.timestamp >= day_start_time) ? [(acc[0] + 1), (acc[1] + +curr.fee_msat)] : acc, [0, 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]);
monthly_sum = history.forwarding_events.reduce((acc, curr) => [(acc[0] + 1), (acc[1] + +curr.fee_msat)], [0, 0]);
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Daily Sum (Transactions, Fee)', data: daily_sum});
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.forwarding_events_history = history;
if (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);
})
}
let today = new Date(Date.now());
let start_date = new Date(today.getFullYear(), today.getMonth(), 1, 0, 0, 0);
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 day_start_time = current_time - 86400;
return swtch.getAllForwardingEvents(month_start_time, current_time, 0, (history) => {
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Forwarding History Received', data: history});
daily_sum = history.forwarding_events.reduce((acc, curr) => (curr.timestamp >= day_start_time) ? [(acc[0] + 1), (acc[1] + +curr.fee_msat)] : acc, [0, 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]);
monthly_sum = history.forwarding_events.reduce((acc, curr) => [(acc[0] + 1), (acc[1] + +curr.fee_msat)], [0, 0]);
logger.log({level: 'DEBUG', fileName: 'Fees', msg: 'Daily Sum (Transactions, Fee)', data: daily_sum});
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.forwarding_events_history = history;
if (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);
})
})
.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: 'Fees', msg: 'Fetch Forwarding Events Error', error: err});
return res.status(500).json({
message: "Fetching fee failed!",
error: err.error
});
const err = common.handleError(errRes, 'Fees', 'Get Forwarding Events Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -12,41 +12,27 @@ exports.getInfo = (req, res, next) => {
logger.log({level: 'DEBUG', fileName:'GetInfo', msg: 'Selected Node', data: common.selectedNode.ln_node});
logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Calling Info from LND server url', data: options.url});
if (!options.headers || !options.headers['Grpc-Metadata-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({
message: "Fetching Info Failed!",
error: "Bad Macaroon"
});
const errMsg = 'LND Get info failed due to bad or missing macaroon!';
const err = common.handleError({ statusCode: 502, message: 'Bad or Missing Macaroon', error: errMsg }, 'GetInfo', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
common.nodes.map(node => { if (node.lnImplementation === 'LND') { connect.getAllNodeAllChannelBackup(node); }});
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'GetInfo', msg: 'Node Information', data: 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.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: body.error});
res.status(500).json({
message: "Fetching Info Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
if (!body || search_idx > -1 || body.error) {
if (body && !body.error) { body.error = 'Error From Server!'; }
const err = common.handleError(body, 'GetInfo', 'Get Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
logger.log({level: 'INFO', fileName: 'GetInfo', msg: 'LND Node Information Received'});
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.log({level: 'ERROR', fileName: 'GetInfo', msg: 'Get Info Error', error: err});
return res.status(500).json({
message: "Fetching Info Failed!",
error: err.error
});
const err = common.handleError(errRes, 'GetInfo', 'Get Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
};

@ -17,33 +17,13 @@ exports.getDescribeGraph = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph';
request.get(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Describe Graph Received', data: body_str});
if(!body || search_idx > -1 || body.error) {
logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Describe Graph Error', error: body.error});
res.status(500).json({
message: "Fetching Describe Graph Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Network Graph Received'});
res.status(200).json(body);
}
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Describe Graph Received', data: body});
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Network Graph Received'});
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.log({level: 'ERROR', fileName: 'Graph', msg: 'Describe Graph Error', error: err});
return res.status(500).json({
message: "Fetching Describe Graph Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Graph', 'Describe Graph Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -52,34 +32,13 @@ exports.getGraphInfo = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/graph/info';
request.get(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Network Info Received', data: body_str});
if(!body || search_idx > -1 || body.error) {
logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Network Info Error', error: body.error});
res.status(500).json({
message: "Fetching network Info failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
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);
}
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Network Information After Rounding and Conversion', data: body});
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Information Received'});
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.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Network Info Error', error: err});
return res.status(500).json({
message: "Fetching network Info failed!",
error: err.error
});
const err = common.handleError(errRes, 'Graph', 'Graph Information Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -89,29 +48,12 @@ exports.getGraphNode = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/graph/node/' + req.params.pubKey;
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Node Info Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Node Info Error', error: body.error});
res.status(500).json({
message: "Fetching node Info failed!",
error: (!body) ? 'Error From Server!' : body.error
});
}
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Node Information Received'});
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.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Node Info Error', error: err});
return res.status(500).json({
message: "Fetching node Info failed!",
error: err.error
});
const err = common.handleError(errRes, 'Graph', 'Get Node Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -121,50 +63,26 @@ exports.getGraphEdge = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Edge Info Error', error: body.error});
res.status(500).json({
message: "Fetching Edge Info Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
}
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Edge Information Received'});
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.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Edge Info Error', error: err});
return res.status(500).json({
message: "Fetching Edge Info Failed!",
error: err.error
});
});
const err = common.handleError(errRes, 'Graph', 'Get Edge Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.getQueryRoutes = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Getting Graph Routes..'});
options = common.getOptions();
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;
}
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Query Routes URL', data: options.url});
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Query Routes Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Query Routes Error', error: body.error});
res.status(500).json({
message: "Fetching Query Routes Failed!",
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) {
return Promise.all(body.routes[0].hops.map(hop => getAliasFromPubkey(hop.pub_key)))
.then(function(values) {
body.routes[0].hops.map((hop, i) => {
@ -177,18 +95,8 @@ exports.getQueryRoutes = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Query Routes Error', error: err});
return res.status(500).json({
message: "Fetching Query Routes Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Graph', 'Get Query Routes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
logger.log({level: 'INFO', fileName: 'Graph', msg: 'Graph Routes Received'});
@ -196,18 +104,8 @@ exports.getQueryRoutes = (req, res, next) => {
}
})
.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: 'Graph', msg: 'Fetch Query Routes Error', error: err});
return res.status(500).json({
message: "Fetching Query Routes Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Graph', 'Get Query Routes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -217,21 +115,14 @@ exports.getRemoteFeePolicy = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/graph/edge/' + req.params.chanid;
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Graph', msg: 'Edge Info Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Graph', msg: 'Fetch Edge Info Error', error: body.error});
res.status(500).json({
message: "Fetching Edge Info Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
}
remoteNodeFee = {};
if(body.node1_pub === req.params.localPubkey){
if (body.node1_pub === req.params.localPubkey){
remoteNodeFee = {
time_lock_delta: body.node2_policy.time_lock_delta,
fee_base_msat: body.node2_policy.fee_base_msat,
fee_rate_milli_msat: body.node2_policy.fee_rate_milli_msat
};
} else if(body.node2_pub === req.params.localPubkey) {
} else if (body.node2_pub === req.params.localPubkey) {
remoteNodeFee = {
time_lock_delta: body.node1_policy.time_lock_delta,
fee_base_msat: body.node1_policy.fee_base_msat,
@ -242,18 +133,8 @@ exports.getRemoteFeePolicy = (req, res, next) => {
res.status(200).json(remoteNodeFee);
})
.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: 'Graph', msg: 'Fetch Edge Info Error', error: err});
return res.status(500).json({
message: "Fetching Edge Info Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Graph', 'Remote Fee Policy Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -267,18 +148,8 @@ exports.getAliasesForPubkeys = (req, res, next) => {
res.status(200).json(values);
})
.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: 'Graph', msg: 'Get Aliases for Pubkeys Error', error: err});
return res.status(500).json({
message: "Getting Aliases for Pubkeys Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Graph', 'Get Aliases for Pubkeys Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
res.status(200).json([]);

@ -9,29 +9,12 @@ exports.getInvoice = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/invoice/' + req.params.rHashStr;
request(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoice Info Received', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Invoice Info Error', error: body.error});
res.status(500).json({
message: "Fetching Invoice Info Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
}
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Invoice Information Received'});
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.log({level: 'ERROR', fileName: 'Invoice', msg: 'Fetch Invoice Info Error', error: err});
return res.status(500).json({
message: "Fetching Invoice Info Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Invoices', 'Get Invoice Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -41,42 +24,22 @@ exports.listInvoices = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/invoices?num_max_invoices=' + req.query.num_max_invoices + '&index_offset=' + req.query.index_offset +
'&reversed=' + req.query.reversed;
request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body_str});
if(!body || search_idx > -1 || body.error) {
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'List Invoices Error', error: body.error});
res.status(500).json({
message: "Fetching Invoice Info failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Invoices List Received', data: body});
if (body.invoices && body.invoices.length > 0) {
body.invoices.forEach(invoice => {
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.description_hash = invoice.description_hash ? Buffer.from(invoice.description_hash, 'base64').toString('hex') : null;
});
} else {
if (body.invoices && body.invoices.length > 0) {
body.invoices.forEach(invoice => {
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.description_hash = invoice.description_hash ? Buffer.from(invoice.description_hash, 'base64').toString('hex') : null;
});
body.invoices = common.sortDescByKey(body.invoices, 'creation_date');
}
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);
body.invoices = common.sortDescByKey(body.invoices, 'creation_date');
}
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);
})
.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: 'Invoice', msg: 'List Invoice Error', error: err});
return res.status(500).json({
message: "Fetching Invoices failed!",
error: err.error
});
const err = common.handleError(errRes, 'Invoices', 'List Invoices Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -97,29 +60,11 @@ exports.addInvoice = (req, res, next) => {
options.form = JSON.stringify(options.form);
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Invoice', msg: 'Add Invoice Responce', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: body.error});
res.status(500).json({
message: "Add Invoice Failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Invoice Added'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Invoice', msg: 'Invoice Added'});
res.status(201).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.log({level: 'ERROR', fileName: 'Invoice', msg: 'Add Invoice Error', error: err});
return res.status(500).json({
message: "Add Invoice Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Invoices', 'Add Invoice Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -12,30 +12,12 @@ exports.signMessage = (req, res, next) => {
});
request.post(options, (error, response, body) => {
logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Signed', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Sign Message Error', error: body.error});
res.status(500).json({
message: "Sign message failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Signed'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Signed'});
res.status(201).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.log({level: 'ERROR', fileName: 'Messages', msg: 'Sign Message Error', error: err});
return res.status(500).json({
message: 'Sign Message Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Messages', 'Sign Message Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -49,29 +31,11 @@ exports.verifyMessage = (req, res, next) => {
});
request.post(options, (error, response, body) => {
logger.log({level: 'DEBUG', fileName: 'Messages', msg: 'Message Verified', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Messages', msg: 'Verify Message Error', error: body.error});
res.status(500).json({
message: "Verify message failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Verified'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Message', msg: 'Message Verified'});
res.status(201).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.log({level: 'ERROR', fileName: 'Messages', msg: 'Message Verification Error', error: err});
return res.status(500).json({
message: 'Verify Message Failed!',
error: err.error
});
const err = common.handleError(errRes, 'Messages', 'Verify Message Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -8,32 +8,12 @@ exports.getNewAddress = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/newaddress?type=' + req.query.type;
request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.log({level: 'DEBUG', fileName: 'NewAddress', msg: 'New Address Received', data: body_str});
if(!body || search_idx > -1 || body.error) {
logger.log({level: 'ERROR', fileName: 'NewAddress', msg: 'New Address Error', error: body.error});
res.status(500).json({
message: "Fetching new address failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'NewAddress', msg: 'New Address Received'});
res.status(200).json(body);
}
logger.log({level: 'DEBUG', fileName: 'NewAddress', msg: 'New Address Received', data: body});
logger.log({level: 'INFO', fileName: 'NewAddress', msg: 'New Address Received'});
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.log({level: 'ERROR', fileName: 'NewAddress', msg: 'New Address Error', error: err});
return res.status(500).json({
message: "Fetching new address failed!",
error: err.error
});
const err = common.handleError(errRes, 'NewAddress', 'New Address Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -17,33 +17,13 @@ exports.decodePayment = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/payreq/' + req.params.payRequest;
request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.log({level: 'DEBUG', fileName: 'PayReq', msg: 'Payment Decode Received', data: body_str});
if(!body || search_idx > -1 || body.error) {
logger.log({level: 'ERROR', fileName: 'PayReq', msg: 'Payment Decode Error 1', error: body.error});
res.status(500).json({
message: "Payment Request Decode Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Payment Decoded'});
res.status(200).json(body);
}
logger.log({level: 'DEBUG', fileName: 'PayReq', msg: 'Payment Decode Received', data: body});
logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Payment Decoded'});
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.log({level: 'ERROR', fileName: 'PayReq', msg: 'Payment Decode Error 2', error: err.error});
return res.status(500).json({
message: "Payment Request Decode Failed!",
error: err.error
});
const err = common.handleError(errRes, 'PayRequest', 'Decode Payment Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -59,18 +39,8 @@ exports.decodePayments = (req, res, next) => {
res.status(200).json(values);
})
.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: 'PayReq', msg: 'Decode Payments Error', error: err});
return res.status(500).json({
message: "Decode Payments Failed!",
error: err.error
});
const err = common.handleError(errRes, 'PayRequest', 'Decode Payments Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
} else {
logger.log({level: 'INFO', fileName: 'PayRequest', msg: 'Empty Payment List Decoded'});

@ -8,37 +8,17 @@ exports.getPayments = (req, res, next) => {
options = common.getOptions();
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) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body_str});
if(!body || search_idx > -1 || body.error) {
logger.log({level: 'ERROR', fileName: 'Payments', msg: 'List Payments Error', error: body.error});
res.status(500).json({
message: "Payments List Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
if (body.payments && body.payments.length > 0) {
body.payments = common.sortDescByKey(body.payments, 'creation_date');
}
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payments After Sort', data: body});
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payments List Received'});
res.status(200).json(body);
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payment List Received', data: body});
if (body.payments && body.payments.length > 0) {
body.payments = common.sortDescByKey(body.payments, 'creation_date');
}
logger.log({level: 'DEBUG', fileName: 'Payments', msg: 'Payments After Sort', data: body});
logger.log({level: 'INFO', fileName: 'Payments', msg: 'Payments List Received'});
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.log({level: 'ERROR', fileName: 'Payments', msg: 'List Payments Error', error: err});
return res.status(500).json({
message: "Payments List Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Payments', 'List Payments Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -54,17 +34,7 @@ exports.getAllLightningTransactions = (req, res, next) => {
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
});
const err = common.handleError(errRes, 'Payments', 'All Lightning Transactions Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -33,18 +33,8 @@ exports.getPeers = (req, res, next) => {
res.status(200).json(body.peers);
})
}).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: 'Peers', msg: 'List Peers Error', error: err});
return res.status(500).json({
message: "Peers List Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Peers', 'List Peers Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -53,48 +43,30 @@ exports.postPeer = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/peers';
options.form = JSON.stringify({
addr: { host: req.body.host, pubkey: req.body.pubkey },
// addr: { host: req.body.host, pubkey: req.body.pubkey },
perm: req.body.perm
});
request.post(options, (error, response, body) => {
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer Added', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Add Peer Error', error: body.error});
res.status(500).json({
message: "Adding peer failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
options.url = common.getSelLNServerUrl() + '/v1/peers';
request(options).then(function (body) {
let peers = (!body.peers) ? [] : body.peers;
return Promise.all(peers.map(peer => getAliasForPeers(peer))).then(function(values) {
if (body.peers) {
body.peers = common.sortDescByStrKey(body.peers, 'alias');
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Alias', data: body});
body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey);
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Newest On Top', data: body});
}
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);
})
.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: 'Peer', msg: 'Add Peer Error', error: err});
return res.status(500).json({
message: "Peer Add Failed!",
error: err.error
});
});
options.url = common.getSelLNServerUrl() + '/v1/peers';
request(options).then(function (body) {
let peers = (!body.peers) ? [] : body.peers;
return Promise.all(peers.map(peer => getAliasForPeers(peer))).then(function(values) {
if (body.peers) {
body.peers = common.sortDescByStrKey(body.peers, 'alias');
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Alias', data: body});
body.peers = common.newestOnTop(body.peers, 'pub_key', req.body.pubkey);
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Peer with Newest On Top', data: body});
}
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);
})
}
.catch(errRes => {
const err = common.handleError(errRes, 'Peers', 'Connect Peer Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
})
});
};
@ -104,30 +76,12 @@ exports.deletePeer = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/peers/' + req.params.peerPubKey;
request.delete(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Peers', msg: 'Detach Peer Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Peers', msg: 'Detach Peer Error', error: body.error});
res.status(500).json({
message: "Detach peer failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
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({});
}
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({});
})
.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: 'Peers', msg: 'Detach Peer Error', error: err});
return res.status(500).json({
message: "Detach Peer Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Peers', 'Disconnect Peer Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -9,7 +9,7 @@ var responseData = { forwarding_events: [], last_offset_index: 0 };
exports.forwardingHistory = (req, res, next) => {
return this.getAllForwardingEvents(req.body.start_time, req.body.end_time, 0, (eventsResponse) => {
if (eventsResponse.error) {
res.status(500).json(eventsResponse);
res.status(error.statusCode).json(eventsResponse);
} else {
res.status(201).json(eventsResponse);
}
@ -45,17 +45,7 @@ exports.getAllForwardingEvents = (start, end, offset, callback) => {
}
})
.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: 'Switch', msg: 'Get All Forwarding Events Error', error: err});
return callback({
message: "Forwarding Events Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Switch', 'Get All Forwarding Events Error');
return callback({message: err.message, error: err.error, statusCode: err.statusCode});
});
}

@ -8,36 +8,16 @@ exports.getTransactions = (req, res, next) => {
options = common.getOptions();
options.url = common.getSelLNServerUrl() + '/v1/transactions';
request(options).then((body) => {
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
logger.log({level: 'DEBUG', fileName: 'Transactions', msg: 'Transaction Received', data: body_str});
if (!body || search_idx > -1 || body.error) {
logger.log({level: 'ERROR', fileName: 'Transactions', msg: 'List Transactions Error', error: body.error});
res.status(500).json({
message: "Fetching Transactions Failed!",
error: (!body || search_idx > -1) ? 'Error From Server!' : body.error
});
} else {
if (body.transactions && body.transactions.length > 0) {
body.transactions = common.sortDescByKey(body.transactions, 'time_stamp');
}
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Transactions Received'});
res.status(200).json(body.transactions);
logger.log({level: 'DEBUG', fileName: 'Transactions', msg: 'Transaction Received', data: body});
if (body.transactions && body.transactions.length > 0) {
body.transactions = common.sortDescByKey(body.transactions, 'time_stamp');
}
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Transactions Received'});
res.status(200).json(body.transactions);
})
.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: 'Transactions', msg: 'List Transactions Error', error: err});
return res.status(500).json({
message: "Fetching Transactions Failed!",
error: err.error
});
const err = common.handleError(errRes, 'Transactions', 'List Transactions Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
@ -57,29 +37,11 @@ exports.postTransactions = (req, res, next) => {
options.form = JSON.stringify(options.form);
request.post(options).then((body) => {
logger.log({level: 'DEBUG', fileName: 'Transactions', msg: 'Transaction Post Response', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Transactions', msg: 'Post Transaction Error', error: body.error});
res.status(500).json({
message: "Transactions post failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Transaction Sent'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Transactions', msg: 'Transaction Sent'});
res.status(201).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.log({level: 'ERROR', fileName: 'Transactions', msg: 'Transaction Post Error', error: err});
return res.status(500).json({
message: "Transactions post failed!",
error: err.error
});
const err = common.handleError(errRes, 'Transactions', 'Send Transaction Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -13,30 +13,12 @@ exports.genSeed = (req, res, next) => {
options.url = common.getSelLNServerUrl() + '/v1/genseed';
}
request(options).then((body) => {
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Gen Seed Error', error: body.error});
res.status(500).json({
message: "Genseed failed!",
error: (!body) ? 'Error From Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Seed Generated'});
res.status(200).json(body);
}
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Seed Generated'});
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.log({level: 'ERROR', fileName: 'Wallet', msg: 'Gen Seed Error', error: err});
return res.status(500).json({
message: "Genseed failed!",
error: err.error
});
const err = common.handleError(errRes, 'Wallet', 'Gen Seed Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -71,27 +53,21 @@ exports.operateWallet = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Wallet', msg: 'Wallet Response', data: body});
const body_str = (!body) ? '' : JSON.stringify(body);
const search_idx = (!body) ? -1 : body_str.search('Not Found');
if(!body) {
logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Wallet Error', error: {error: (error ? error : err_message)}});
res.status(500).json({
message: err_message,
error: (error) ? error : err_message
});
} else if(search_idx > -1) {
logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Wallet Error', error: {error: err_message}});
res.status(500).json({
message: err_message,
error: err_message
});
} else if(body.error) {
if((body.code === 1 && body.error === 'context canceled') || (body.code === 14 && body.error === 'transport is closing')) {
if (!body) {
const errMsg = error ? error : err_message;
const err = common.handleError({ statusCode: 500, message: 'Wallet Error', error: errMsg }, 'Wallet', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
} else if (search_idx > -1) {
const errMsg = err_message;
const err = common.handleError({ statusCode: 500, message: 'Wallet Error', error: errMsg }, 'Wallet', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
} else if (body.error) {
if ((body.code === 1 && body.error === 'context canceled') || (body.code === 14 && body.error === 'transport is closing')) {
res.status(201).json('Successful');
} else {
logger.log({level: 'ERROR', fileName: 'Wallet', msg: 'Wallet Error', error: body.error});
res.status(500).json({
message: err_message,
error: body.error
});
const errMsg = (body.error && typeof body.error === 'object') ? JSON.stringify(body.error) : (body.error && typeof body.error === 'string') ? body.error : err_message;
const err = common.handleError({ statusCode: 500, message: 'Wallet Error', error: errMsg }, 'Wallet', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
} else {
logger.log({level: 'INFO', fileName: 'Wallet', msg: 'Wallet Unlocked/Initialized'});
@ -99,21 +75,11 @@ exports.operateWallet = (req, res, next) => {
}
})
.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: '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');
} else {
res.status(500).json({
message: err_message,
error: err.error.message ? err.error.message : err.message ? err.message : err_message
});
const err = common.handleError(errRes, 'Wallet', err_message);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
});
};
@ -133,18 +99,8 @@ exports.getUTXOs = (req, res, next) => {
res.status(200).json(body.utxos ? body.utxos : []);
})
.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: 'Wallet', msg: 'UTXOs Error', error: err});
return res.status(500).json({
message: "UTXO list failed!",
error: err.error
});
const err = common.handleError(errRes, 'Wallet', 'List UTXOs Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -169,18 +125,8 @@ exports.bumpFee = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Wallet', msg: 'Bump Fee Error', error: err});
return res.status(500).json({
message: "Bump fee failed!",
error: err.error
});
const err = common.handleError(errRes, 'Wallet', 'Bump Fee Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -200,18 +146,8 @@ exports.labelTransaction = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Wallet', msg: 'Label Transaction Error', error: err});
return res.status(500).json({
message: "Transaction label failed!",
error: err.error
});
const err = common.handleError(errRes, 'Wallet', 'Label Transaction Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -233,18 +169,8 @@ exports.leaseUTXO = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Wallet', msg: 'Lease UTXO Error', error: err});
return res.status(500).json({
message: "Lease UTXO failed!",
error: err.error
});
const err = common.handleError(errRes, 'Wallet', 'Lease UTXO Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}
@ -265,17 +191,7 @@ exports.releaseUTXO = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Wallet', msg: 'Release UTXO Error', error: err});
return res.status(500).json({
message: "Release UTXO failed!",
error: err.error
});
const err = common.handleError(errRes, 'Wallet', 'Release UTXO Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
}

@ -16,21 +16,58 @@ exports.updateSelectedNode = (req, res, next) => {
res.status(200).json({status: 'Selected Node Updated To: ' + JSON.stringify(responseVal) + '!'});
};
exports.getRTLConfigInitial = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Getting Initial RTL Configuration..'});
var confFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
fs.readFile(confFile, 'utf8', function(errRes, data) {
if (errRes) {
if (errRes.code === 'ENOENT') {
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: [] });
} else {
const errMsg = 'Get Node Config Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
} else {
const nodeConfData = JSON.parse(data);
const sso = { rtlSSO: common.rtl_sso, logoutRedirectLink: common.logout_redirect_link };
const enable2FA = !common.rtl_secret2fa ? false : true;
var nodesArr = [];
if (common.nodes && common.nodes.length > 0) {
common.nodes.forEach((node, i) => {
const settings = {};
settings.userPersona = node.user_persona ? node.user_persona : 'MERCHANT';
settings.themeMode = (node.theme_mode) ? node.theme_mode : 'DAY';
settings.themeColor = (node.theme_color) ? node.theme_color : 'PURPLE';
settings.fiatConversion = (node.fiat_conversion) ? !!node.fiat_conversion : false;
settings.currencyUnit = node.currency_unit;
nodesArr.push({
index: node.index,
lnNode: node.ln_node,
lnImplementation: node.ln_implementation,
settings: settings,
authentication: {}})
});
}
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Initial RTL Configuration Received'});
res.status(200).json({ defaultNodeIndex: nodeConfData.defaultNodeIndex, selectedNodeIndex: common.selectedNode.index, sso: sso, enable2FA: enable2FA, nodes: nodesArr });
}
});
};
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';
logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'Getting Node Config'});
fs.readFile(confFile, 'utf8', function(err, data) {
if (err) {
if (err.code === 'ENOENT') {
fs.readFile(confFile, 'utf8', function(errRes, data) {
if (errRes) {
if (errRes.code === 'ENOENT') {
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: [] });
} else {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Getting Node Config Failed!', error: err});
res.status(500).json({
message: "Reading Node Config Failed!",
error: err
});
const errMsg = 'Get Node Config Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
} else {
const nodeConfData = JSON.parse(data);
@ -74,12 +111,12 @@ exports.updateUISettings = (req, res, next) => {
var RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.nodes.find(node => {
if(node.index == common.selectedNode.index) {
if (node.index == common.selectedNode.index) {
node.Settings.userPersona = req.body.updatedSettings.userPersona;
node.Settings.themeMode = req.body.updatedSettings.themeMode;
node.Settings.themeColor = req.body.updatedSettings.themeColor;
node.Settings.fiatConversion = req.body.updatedSettings.fiatConversion;
if(req.body.updatedSettings.fiatConversion) {
if (req.body.updatedSettings.fiatConversion) {
node.Settings.currencyUnit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD';
} else {
delete node.Settings.currencyUnit;
@ -89,7 +126,7 @@ exports.updateUISettings = (req, res, next) => {
selectedNode.theme_mode = req.body.updatedSettings.themeMode;
selectedNode.theme_color = req.body.updatedSettings.themeColor;
selectedNode.fiat_conversion = req.body.updatedSettings.fiatConversion;
if(req.body.updatedSettings.fiatConversion) {
if (req.body.updatedSettings.fiatConversion) {
selectedNode.currency_unit = req.body.updatedSettings.currencyUnit ? req.body.updatedSettings.currencyUnit : 'USD';
} else {
delete selectedNode.currency_unit;
@ -103,12 +140,10 @@ exports.updateUISettings = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'UI Settings Updated'});
res.status(201).json({message: 'Node Settings Updated Successfully'});
}
catch (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating Node Settings Failed!', error: {error: 'Updating node settings failed.'}});
res.status(500).json({
message: "Updating Node Settings Failed!",
error: 'Updating Node Settings Failed!'
});
catch (errRes) {
const errMsg = 'Update Node Settings Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
};
@ -125,12 +160,10 @@ exports.update2FASettings = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: '2FA Updated'});
res.status(201).json({message: message});
}
catch (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating 2FA Settings Failed!', error: {error: 'Updating 2FA settings failed.'}});
res.status(500).json({
message: "Updating 2FA Settings Failed!",
error: 'Updating 2FA Settings Failed!'
});
catch (errRes) {
const errMsg = 'Update 2FA Settings Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
};
@ -145,12 +178,10 @@ exports.updateDefaultNode = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Default Node Updated'});
res.status(201).json({message: 'Default Node Updated Successfully'});
}
catch (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating Default Node Failed!', error: {error: 'Updating dafault node failed.'}});
res.status(500).json({
message: "Updating Default Node Failed!",
error: 'Updating Default Node Failed!'
});
catch (errRes) {
const errMsg = 'Update Default Node Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
};
@ -174,13 +205,11 @@ exports.getConfig = (req, res, next) => {
break;
}
logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: '[Node Type, File Path]', data: [req.params.nodeType, confFile]});
fs.readFile(confFile, 'utf8', function(err, data) {
if (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Reading Conf Failed!', error: err});
res.status(500).json({
message: "Reading Config File Failed!",
error: err
});
fs.readFile(confFile, 'utf8', function(errRes, data) {
if (errRes) {
const errMsg = 'Reading Config Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
} else {
let jsonConfig = {};
if (fileFormat === 'JSON') {
@ -205,16 +234,12 @@ 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');
logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: '[Channel Point, File Path]', data: [req.query.channel, file]});
fs.readFile(file, 'utf8', function(err, data) {
if (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Reading File Failed!', error: err});
if (err.code && err.code === 'ENOENT') {
err.code = 'Backup File Not Found!';
}
res.status(500).json({
message: "Reading File Failed!",
error: err
});
fs.readFile(file, 'utf8', function(errRes, data) {
if (errRes) {
if (errRes.code && errRes.code === 'ENOENT') { errRes.code = 'File Not Found!'; }
const errMsg = 'Reading File Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
} else {
logger.log({level: 'DEBUG', fileName: 'RTLConf', msg: 'File Data', data: data});
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'File Data Received'});
@ -227,22 +252,13 @@ exports.getCurrencyRates = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Getting Currency Rates..'});
options.url = 'https://blockchain.info/ticker';
request(options).then((body) => {
if(!body || body.error) {
res.status(500).json({
message: "Fetching Rates Failed!",
error: (!body) ? 'Error From External Server!' : body.error
});
} else {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Currency Rates Received'});
res.status(200).json(JSON.parse(body));
}
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Currency Rates Received'});
res.status(200).json(JSON.parse(body));
})
.catch(function (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Fetching Rates Failed!', error: err});
return res.status(500).json({
message: "Fetching Rates Failed!",
error: err.error
});
.catch(errRes => {
const errMsg = 'Get Rates Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
});
};
@ -258,12 +274,10 @@ exports.updateSSO = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'SSO Setting Updated'});
res.status(201).json({message: 'SSO Updated Successfully'});
}
catch (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating SSO Failed!', error: {error: 'Updating SSO failed.'}});
res.status(500).json({
message: "Updating SSO Failed!",
error: 'Updating SSO Failed!'
});
catch (errRes) {
const errMsg = 'Update SSO Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
};
@ -273,7 +287,7 @@ exports.updateServiceSettings = (req, res, next) => {
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
const selectedNode = common.findNode(common.selectedNode.index);
config.nodes.find(node => {
if(node.index == common.selectedNode.index) {
if (node.index == common.selectedNode.index) {
switch (req.body.service) {
case 'LOOP':
if (req.body.settings.enable) {
@ -315,12 +329,10 @@ exports.updateServiceSettings = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'RTLConf', msg: 'Service Settings Updated'});
res.status(201).json({message: 'Service Settings Updated Successfully'});
}
catch (err) {
logger.log({level: 'ERROR', fileName: 'RTLConf', msg: 'Updating Service Settings Failed!', error: {error: 'Updating service settings failed.'}});
res.status(500).json({
message: "Updating Service Settings Failed!",
error: 'Updating Service Settings Failed!'
});
catch (errRes) {
const errMsg = 'Update Service Settings Error';
const err = common.handleError({ statusCode: 500, message: errMsg, error: errRes }, 'RTLConf', errMsg);
return res.status(err.statusCode).json({message: err.error, error: err.error});
}
};

@ -25,11 +25,11 @@ getFailedInfo = (reqIP, currentTime) => {
return failed;
}
handleError = (failed, currentTime, errMsg) => {
handleMultipleFailedAttemptsError = (failed, currentTime, errMsg) => {
if (failed.count >= ALLOWED_LOGIN_ATTEMPTS && (currentTime <= (failed.lastTried + LOCKING_PERIOD))) {
return {
message: "Multiple Failed Login Attempts!",
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) + "!"
error: "Application locked for " + (LOCKING_PERIOD/ONE_MINUTE) + " minutes due to multiple failed attempts!\nTry again after " + common.convertTimestampToTime((failed.lastTried + LOCKING_PERIOD)/1000) + "!"
};
} else {
return {
@ -48,8 +48,8 @@ exports.verifyToken = (twoFAToken) => {
exports.authenticateUser = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'Authenticating User..'});
if(+common.rtl_sso) {
if(req.body.authenticateWith === 'JWT' && jwt.verify(req.body.authenticationValue, common.secret_key)) {
if (+common.rtl_sso) {
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 });
} 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'))) {
@ -58,11 +58,9 @@ exports.authenticateUser = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'User Authenticated.'});
res.status(200).json({ token: token });
} else {
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({
message: "SSO Authentication Failed!",
error: "SSO failed. Access key too short or does not match."
});
const errMsg = 'SSO Authentication Failed! Access key too short or does not match.';
const err = common.handleError({ statusCode: 406, message: 'SSO Authentication Error', error: errMsg }, 'Authenticate', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
} else {
const currentTime = new Date().getTime();
@ -75,7 +73,7 @@ exports.authenticateUser = (req, res, next) => {
logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'Invalid Token! Failed IP ' + reqIP, error: {error: 'Invalid token.'}});
failed.count = failed.count + 1;
failed.lastTried = currentTime;
return res.status(401).json(handleError(failed, currentTime, 'Invalid 2FA Token!'));
return res.status(401).json(handleMultipleFailedAttemptsError(failed, currentTime, 'Invalid 2FA Token!'));
}
}
delete failedLoginAttempts[reqIP];
@ -86,19 +84,17 @@ exports.authenticateUser = (req, res, next) => {
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.lastTried = common.rtl_pass !== password ? currentTime : failed.lastTried;
return res.status(401).json(handleError(failed, currentTime, 'Invalid Password!'));
return res.status(401).json(handleMultipleFailedAttemptsError(failed, currentTime, 'Invalid Password!'));
}
}
};
exports.resetPassword = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'Resetting Password..'});
if(+common.rtl_sso) {
logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'Password Reset Failed!', error: {error: 'Password reset failed.'}});
res.status(401).json({
message: "Password Reset Failed!",
error: "Password cannot be reset for SSO authentication!"
});
if (+common.rtl_sso) {
const errMsg = 'Password cannot be reset for SSO authentication';
const err = common.handleError({ statusCode: 401, message: 'Password Reset Error', error: errMsg }, 'Authenticate', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
} else {
const currPassword = req.body.currPassword;
if (common.rtl_pass === currPassword) {
@ -107,11 +103,9 @@ exports.resetPassword = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Authenticate', msg: 'Password Reset Successful'});
res.status(200).json({ token: token });
} else {
logger.log({level: 'ERROR', fileName: 'Authenticate', msg: 'Password Reset Failed!', error: {error: 'Password reset failed.'}});
res.status(401).json({
message: "Password Reset Failed!",
error: "Old password is not correct!"
});
const errMsg = 'Incorrect Old Password';
const err = common.handleError({ statusCode: 401, message: 'Password Reset Error', error: errMsg }, 'Authenticate', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
}
};

@ -6,7 +6,11 @@ var options = {};
exports.getInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting Boltz Information..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Get Info Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/info';
request(options).then(function (body) {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Information Received'});
@ -14,25 +18,19 @@ exports.getInfo = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz Get Info Error', error: err});
return res.status(500).json({
message: "Boltz Get Info Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'Get Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.getServiceInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting Service Information..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Get Service Information Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/serviceinfo';
request(options).then(function (body) {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Service Information Received'});
@ -40,25 +38,19 @@ exports.getServiceInfo = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz Get Service Info Error', error: err});
return res.status(500).json({
message: "Boltz Get Service Info Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'Get Service Information Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.listSwaps = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting List Swaps..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'List Swaps Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/listswaps';
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Boltz List Swaps Info', data: body});
@ -68,25 +60,19 @@ exports.listSwaps = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz List Swaps Error', error: err});
return res.status(500).json({
message: "Boltz List Swaps Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'List Swaps Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.getSwapInfo = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Getting Swap..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Get Swap Information Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/swap/' + req.params.swapId;
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Boltz Swap Info', data: body});
@ -94,162 +80,96 @@ exports.getSwapInfo = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Boltz', msg: 'Boltz Swap Info Error', error: err});
return res.status(500).json({
message: "Boltz Swap Info Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'Swap Info Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.createSwap = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Creating Swap..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Create Swap Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/createswap';
options.body = { amount: req.body.amount };
if (req.body.address !== '') { options.body.address = req.body.address; }
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Body', data: options.body});
request.post(options).then(createSwapRes => {
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Swap Response', data: createSwapRes});
if(!createSwapRes || createSwapRes.error) {
logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Swap Error', error: createSwapRes.error});
res.status(500).json({
message: 'Create Swap Failed!',
error: (!createSwapRes) ? 'Error From Server!' : createSwapRes.error.message
});
} else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Swap Created'});
res.status(201).json(createSwapRes);
}
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Swap Created'});
res.status(201).json(createSwapRes);
})
.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: 'Boltz', msg: 'Create Swap Error', error: err});
return res.status(500).json({
message: "Create Swap Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'Create Swap Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.createReverseSwap = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Creating Reverse Swap..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Create Reverse Swap Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/createreverseswap';
options.body = { amount: req.body.amount };
if (req.body.address !== '') { options.body.address = req.body.address; }
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Body', data: options.body});
request.post(options).then(createReverseSwapRes => {
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Reverse Swap Response', data: createReverseSwapRes});
if(!createReverseSwapRes || createReverseSwapRes.error) {
logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Reverse Swap Error', error: createReverseSwapRes.error});
res.status(500).json({
message: 'Create Reverse Swap Failed!',
error: (!createReverseSwapRes) ? 'Error From Server!' : createReverseSwapRes.error.message
});
} else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Reverse Swap Created'});
res.status(201).json(createReverseSwapRes);
}
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Reverse Swap Created'});
res.status(201).json(createReverseSwapRes);
})
.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: 'Boltz', msg: 'Create Reverse Swap Error', error: err});
return res.status(500).json({
message: "Create Reverse Swap Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'Create Reverse Swap Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.createChannel = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Creating Boltz Channel..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Create Channel Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/createchannel';
options.body = { amount: req.body.amount };
if (req.body.address !== '') { options.body.address = req.body.address; }
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Body', data: options.body});
request.post(options).then(createChannelRes => {
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Create Channel Response', data: createChannelRes});
if(!createChannelRes || createChannelRes.error) {
logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Create Channel Error', error: createChannelRes.error});
res.status(500).json({
message: 'Create Channel Failed!',
error: (!createChannelRes) ? 'Error From Server!' : createChannelRes.error.message
});
} else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Channel Created'});
res.status(201).json(createChannelRes);
}
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Channel Created'});
res.status(201).json(createChannelRes);
})
.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: 'Boltz', msg: 'Create Channel Error', error: err});
return res.status(500).json({
message: "Create Channel Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'Create Channel Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.deposit = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Deposit Start..'});
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 === '') {
const errMsg = 'Boltz Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Deposit Error', error: errMsg }, 'Boltz', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/deposit';
request.post(options).then(depositRes => {
logger.log({level: 'DEBUG', fileName: 'Boltz', msg: 'Deposit Response', data: depositRes});
if(!depositRes || depositRes.error) {
logger.log({level: 'ERROR', fileName: 'Boltz', msg: 'Deposit Error', error: depositRes.error});
res.status(500).json({
message: 'Deposit Failed!',
error: (!depositRes) ? 'Error From Server!' : depositRes.error.message
});
} else {
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Deposit Finished'});
res.status(201).json(depositRes);
}
logger.log({level: 'INFO', fileName: 'Boltz', msg: 'Boltz Deposit Finished'});
res.status(201).json(depositRes);
})
.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: 'Boltz', msg: 'Deposit Error', error: err});
return res.status(500).json({
message: "Deposit Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Boltz', 'Deposit Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

@ -6,29 +6,17 @@ exports.log = (msgJSON, selNode = common.selectedNode) => {
switch (msgJSON.level) {
case 'ERROR':
if (selNode) {
msgStr = msgStr + '. ' + (typeof msgJSON.error === 'object' ? JSON.stringify(msgJSON.error) : (typeof msgJSON.error === 'string') ? msgJSON.error : '');
msgStr = msgStr + ': ' + (typeof msgJSON.error === 'object' ? JSON.stringify(msgJSON.error) : (typeof msgJSON.error === 'string') ? msgJSON.error : '');
console.error(msgStr);
fs.appendFile(selNode.log_file, msgStr, function (err) {
if (err) {
return ({ error: 'Updating Log Failed!' });
} else {
return ({ message: 'Log Updated Successfully' });
}
});
fs.appendFile(selNode.log_file, msgStr, () => {});
}
break;
case 'WARN':
if (selNode && (selNode.log_level == "INFO" || selNode.log_level == "WARN" || selNode.log_level == "DEBUG")) {
msgStr = msgStr + '. ' + (typeof msgJSON.data === 'object' ? JSON.stringify(msgJSON.data) : (typeof msgJSON.data === 'string') ? msgJSON.data : '');
msgStr = msgStr + ': ' + (typeof msgJSON.data === 'object' ? JSON.stringify(msgJSON.data) : (typeof msgJSON.data === 'string') ? msgJSON.data : '');
console.warn(msgStr)
fs.appendFile(selNode.log_file, msgStr, function (err) {
if (err) {
return ({ error: 'Updating Log Failed!' });
} else {
return ({ message: 'Log Updated Successfully' });
}
});
fs.appendFile(selNode.log_file, msgStr, () => {});
}
break;
@ -36,13 +24,7 @@ exports.log = (msgJSON, selNode = common.selectedNode) => {
if (selNode && (selNode.log_level == "INFO" || selNode.log_level == "DEBUG")) {
msgStr = msgStr + '. ' + (typeof msgJSON.data === 'object' ? JSON.stringify(msgJSON.data) : (typeof msgJSON.data === 'string') ? msgJSON.data : '');
console.log(msgStr);
fs.appendFile(selNode.log_file, msgStr, function (err) {
if (err) {
return ({ error: 'Updating Log Failed!' });
} else {
return ({ message: 'Log Updated Successfully' });
}
});
fs.appendFile(selNode.log_file, msgStr, () => {});
}
break;
@ -54,15 +36,11 @@ exports.log = (msgJSON, selNode = common.selectedNode) => {
}, msgStr + ': [');
msgStr = msgStr.slice(0, -2) + ']';
} else {
msgStr = msgStr + '. ' + (typeof msgJSON.data === 'object' ? JSON.stringify(msgJSON.data) : typeof msgJSON.data == 'string' ? msgJSON.data : '');
}
fs.appendFile(selNode.log_file, msgStr, function (err) {
if (err) {
return ({ error: 'Updating Log Failed!' });
} else {
return ({ message: 'Log Updated Successfully' });
if (msgJSON.data && msgJSON.data !== '') {
msgStr = msgStr + ': ' + (typeof msgJSON.data === 'object' ? JSON.stringify(msgJSON.data) : typeof msgJSON.data == 'string' ? msgJSON.data : '');
}
});
}
fs.appendFile(selNode.log_file, msgStr, () => {});
}
break;

@ -6,7 +6,11 @@ var options = {};
exports.loopOut = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Looping Out..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop Out Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/out';
options.body = {
amt: req.body.amount,
@ -24,37 +28,23 @@ exports.loopOut = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Body', data: options.body});
request.post(options).then(loopOutRes => {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out', data: loopOutRes});
if(!loopOutRes || loopOutRes.error) {
logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Error', error: loopOutRes.error});
res.status(500).json({
message: 'Loop Out Failed!',
error: (!loopOutRes) ? 'Error From Server!' : loopOutRes.error.message
});
} else {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop Out Finished'});
res.status(201).json(loopOutRes);
}
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop Out Finished'});
res.status(201).json(loopOutRes);
})
.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: 'Loop', msg: 'Loop Out Error', error: err});
return res.status(500).json({
message: "Loop Out Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop Out Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.loopOutTerms = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop Out Terms..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop Out Terms Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/out/terms';
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Terms', data: body});
@ -62,25 +52,19 @@ exports.loopOutTerms = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop Out Terms Error', error: err});
return res.status(500).json({
message: "Loop Out Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop Out Terms Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.loopOutQuote = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop Out Quotes..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop Out Quotes Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
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.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Quote URL', data: options.url});
request(options).then(function (quoteRes) {
@ -91,25 +75,19 @@ exports.loopOutQuote = (req, res, next) => {
res.status(200).json(quoteRes);
})
.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: 'Loop', msg: 'Loop Out Quote Error', error: err});
return res.status(500).json({
message: "Loop Out Quote Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop Out Quotes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.loopOutTermsAndQuotes = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop Out Terms & Quotes..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop Out Terms & Quotes Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/out/terms';
request(options).then(function(terms) {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Out Terms', data: terms});
@ -129,40 +107,24 @@ exports.loopOutTermsAndQuotes = (req, res, next) => {
res.status(200).json(values);
})
.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: 'Loop', msg: 'Loop Out Quotes Error', error: err});
return res.status(500).json({
message: "Loop Out Quotes Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop Out Terms & Quotes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
})
.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: 'Loop', msg: 'Loop Out Terms Error', error: err});
return res.status(500).json({
message: "Loop Out Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop Out Terms & Quotes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.loopIn = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Looping In..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop In Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/in';
options.body = {
amt: req.body.amount,
@ -173,37 +135,23 @@ exports.loopIn = (req, res, next) => {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Body', data: options.body});
request.post(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In', data: body});
if(!body || body.error) {
logger.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Error', error: body.error});
res.status(500).json({
message: 'Loop In Failed!',
error: (body.error && body.error.message) ? body.error.message : 'Error From Server!'
});
} else {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop In Finished'});
res.status(201).json(body);
}
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Loop In Finished'});
res.status(201).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.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Error', error: err});
return res.status(500).json({
message: "Loop In Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop In Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.loopInTerms = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop In Terms..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop In Terms Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/in/terms';
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Terms', data: body});
@ -211,25 +159,19 @@ exports.loopInTerms = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Terms Error', error: err});
return res.status(500).json({
message: "Loop In Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop In Terms Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.loopInQuote = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop In Quotes..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop In Quotes Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
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.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Quote Options', data: options.url});
request(options).then(function (body) {
@ -240,25 +182,19 @@ exports.loopInQuote = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Loop', msg: 'Loop In Quote Error', error: err});
return res.status(500).json({
message: "Loop In Quote Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop In Quote Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.loopInTermsAndQuotes = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Loop In Terms & Quotes..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Loop In Terms & Quotes Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/in/terms';
request(options).then(function(terms) {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop In Terms', data: terms});
@ -278,40 +214,24 @@ exports.loopInTermsAndQuotes = (req, res, next) => {
res.status(200).json(values);
})
.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: 'Loop', msg: 'Loop In Quotes Error', error: err});
return res.status(500).json({
message: "Loop In Quotes Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop In Terms & Quotes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
})
.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: 'Loop', msg: 'Loop In Terms Error', error: err});
return res.status(500).json({
message: "Loop In Terms Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Loop In Terms & Quotes Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.swaps = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting List Swaps..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'List Swaps Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/swaps';
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Swaps', data: body});
@ -323,25 +243,19 @@ exports.swaps = (req, res, next) => {
res.status(200).json(body.swaps);
})
.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: 'Loop', msg: 'List Swaps Error', error: err});
return res.status(500).json({
message: "Loop Swaps Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'List Swaps Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};
exports.swap = (req, res, next) => {
logger.log({level: 'INFO', fileName: 'Loop', msg: 'Getting Swap Information..'});
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 === '') {
const errMsg = 'Loop Server URL is missing in the configuration.';
const err = common.handleError({ statusCode: 500, message: 'Get Swap Error', error: errMsg }, 'Loop', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
options.url = options.url + '/v1/loop/swap/' + req.params.id;
request(options).then(function (body) {
logger.log({level: 'DEBUG', fileName: 'Loop', msg: 'Loop Swap', data: body});
@ -349,17 +263,7 @@ exports.swap = (req, res, next) => {
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.log({level: 'ERROR', fileName: 'Loop', msg: 'Swap Info Error', error: err});
return res.status(500).json({
message: "Loop Swap Failed!",
error: (err.error && err.error.error) ? err.error.error : (err.error) ? err.error : err
});
const err = common.handleError(errRes, 'Loop', 'Get Swap Error');
return res.status(err.statusCode).json({message: err.message, error: err.error});
});
};

187
package-lock.json generated

@ -1657,9 +1657,9 @@
"dev": true
},
"@eslint/eslintrc": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz",
"integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==",
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
"integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@ -1674,9 +1674,9 @@
},
"dependencies": {
"globals": {
"version": "13.9.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
"integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz",
"integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@ -1733,6 +1733,23 @@
"@fortawesome/fontawesome-common-types": "^0.2.35"
}
},
"@humanwhocodes/config-array": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
"integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
"dev": true,
"requires": {
"@humanwhocodes/object-schema": "^1.2.0",
"debug": "^4.1.1",
"minimatch": "^3.0.4"
}
},
"@humanwhocodes/object-schema": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
"integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
"dev": true
},
"@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
@ -2374,9 +2391,9 @@
"dev": true
},
"acorn-jsx": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true
},
"adjust-sourcemap-loader": {
@ -4450,15 +4467,15 @@
}
},
"css-select": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz",
"integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==",
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
"integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
"dev": true,
"requires": {
"boolbase": "^1.0.0",
"css-what": "^4.0.0",
"domhandler": "^4.0.0",
"domutils": "^2.4.3",
"css-what": "^5.0.0",
"domhandler": "^4.2.0",
"domutils": "^2.6.0",
"nth-check": "^2.0.0"
}
},
@ -4473,9 +4490,9 @@
}
},
"css-what": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz",
"integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz",
"integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==",
"dev": true
},
"cssdb": {
@ -5344,13 +5361,14 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint": {
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz",
"integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==",
"version": "7.32.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
"integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
"@eslint/eslintrc": "^0.4.2",
"@eslint/eslintrc": "^0.4.3",
"@humanwhocodes/config-array": "^0.5.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
@ -5409,9 +5427,9 @@
}
},
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@ -5451,9 +5469,9 @@
"dev": true
},
"globals": {
"version": "13.9.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
"integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz",
"integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@ -5518,6 +5536,75 @@
}
}
},
"eslint-plugin-deprecation": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.2.1.tgz",
"integrity": "sha512-8KFAWPO3AvF0szxIh1ivRtHotd1fzxVOuNR3NI8dfCsQKgcxu9fAgEY+eTKvCRLAwwI8kaDDfImMt+498+EgRw==",
"dev": true,
"requires": {
"@typescript-eslint/experimental-utils": "^2.19.2 || ^3.0.0",
"tslib": "^1.10.0",
"tsutils": "^3.0.0"
},
"dependencies": {
"@typescript-eslint/experimental-utils": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz",
"integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.3",
"@typescript-eslint/types": "3.10.1",
"@typescript-eslint/typescript-estree": "3.10.1",
"eslint-scope": "^5.0.0",
"eslint-utils": "^2.0.0"
}
},
"@typescript-eslint/types": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz",
"integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz",
"integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==",
"dev": true,
"requires": {
"@typescript-eslint/types": "3.10.1",
"@typescript-eslint/visitor-keys": "3.10.1",
"debug": "^4.1.1",
"glob": "^7.1.6",
"is-glob": "^4.0.1",
"lodash": "^4.17.15",
"semver": "^7.3.2",
"tsutils": "^3.17.1"
}
},
"@typescript-eslint/visitor-keys": {
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz",
"integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
},
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
}
}
},
"eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@ -6027,9 +6114,9 @@
}
},
"flatted": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
"integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
"dev": true
},
"flatten": {
@ -7637,9 +7724,9 @@
}
},
"jszip": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz",
"integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==",
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
"integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
"dev": true,
"requires": {
"lie": "~3.3.0",
@ -13066,15 +13153,15 @@
}
},
"svgo": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz",
"integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz",
"integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==",
"dev": true,
"requires": {
"@trysound/sax": "0.1.1",
"chalk": "^4.1.0",
"commander": "^7.1.0",
"css-select": "^3.1.2",
"css-select": "^4.1.3",
"css-tree": "^1.1.2",
"csso": "^4.2.0",
"stable": "^0.1.8"
@ -13090,9 +13177,9 @@
}
},
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@ -13152,9 +13239,9 @@
},
"dependencies": {
"ajv": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz",
"integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==",
"version": "8.6.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
"integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@ -13178,9 +13265,9 @@
"dev": true
},
"tar": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
"integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
"version": "6.1.8",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.8.tgz",
"integrity": "sha512-sb9b0cp855NbkMJcskdSYA7b11Q8JsX4qe4pyUAfHp+Y6jBjJeek2ZVlwEfWayshEIwlIzXx0Fain3QG9JPm2A==",
"dev": true,
"requires": {
"chownr": "^2.0.0",
@ -13765,9 +13852,9 @@
}
},
"url-parse": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
"integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz",
"integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==",
"dev": true,
"requires": {
"querystringify": "^2.1.1",

@ -69,7 +69,8 @@
"@typescript-eslint/parser": "4.23.0",
"crypto-browserify": "^3.12.0",
"dotenv": "^8.2.0",
"eslint": "^7.26.0",
"eslint": "^7.32.0",
"eslint-plugin-deprecation": "^1.2.1",
"jasmine-core": "~3.6.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "~6.3.2",

@ -209,6 +209,57 @@ common.newestOnTop = (array, key, value) => {
return array;
}
common.handleError = (errRes, fileName, errMsg) => {
let err = JSON.parse(JSON.stringify(errRes));
switch (common.selectedNode.ln_implementation) {
case 'LND':
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'];
}
break;
case 'CLT':
if (err.options && err.options.headers && err.options.headers.macaroon) {
delete err.options.headers.macaroon;
}
if (err.response && err.response.request && err.response.request.headers && err.response.request.headers.macaroon) {
delete err.response.request.headers.macaroon;
}
break;
case 'ECL':
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;
}
break;
default:
if (err.options && err.options.headers) { delete err.options.headers; }
break;
}
const msgStr = '\r\n[' + new Date().toISOString() + '] ERROR: ' + fileName + ' => ' + errMsg + ': ' + (typeof err === 'object' ? JSON.stringify(err) : (typeof err === 'string') ? err : 'Unknown Error');
console.error(msgStr);
if (common.selectedNode) { fs.appendFile(common.selectedNode.log_file, msgStr, () => {}) }
const newErrorObj = {
statusCode: err.statusCode ? err.statusCode : err.status ? err.status : (err.error && err.error.code && err.error.code === 'ECONNREFUSED') ? 503 : 500,
message: err.message ? err.message : errMsg,
error: (
(err.error && err.error.error && err.error.error.error && typeof err.error.error.error === 'string') ? err.error.error.error :
(err.error && err.error.error && typeof err.error.error === 'string') ? err.error.error :
(err.error && typeof err.error === 'string') ? err.error :
(err.error && typeof err.error === 'object') ? JSON.stringify(err.error) :
(typeof err === 'string') ? err : 'Unknown Error'
)
};
return newErrorObj;
}
common.getRequestIP = (req) => {
return (typeof req.headers['x-forwarded-for'] === 'string' && req.headers['x-forwarded-for'].split(',').shift())
|| req.ip

@ -105,13 +105,13 @@ connect.updateLogByLevel = () => {
RTLConfFile = common.rtl_conf_file_path + common.path_separator + 'RTL-Config.json';
var config = JSON.parse(fs.readFileSync(RTLConfFile, 'utf-8'));
config.nodes.forEach((node) => {
if(node.Settings.hasOwnProperty('enableLogging')) {
if (node.Settings.hasOwnProperty('enableLogging')) {
updateLogFlag = true;
node.Settings.logLevel = node.Settings.enableLogging? 'INFO' : 'ERROR';
delete node.Settings.enableLogging;
}
})
if(updateLogFlag) {
if (updateLogFlag) {
fs.writeFileSync(RTLConfFile, JSON.stringify(config, null, 2), 'utf-8');
}
} catch (err) {
@ -119,7 +119,6 @@ connect.updateLogByLevel = () => {
}
}
connect.validateNodeConfig = (config) => {
if ((process.env.RTL_SSO == 0) || (typeof process.env.RTL_SSO === 'undefined' && +config.SSO.rtlSSO === 0)) {
if (config.multiPassHashed !== '' && config.multiPassHashed) {
@ -244,25 +243,23 @@ connect.validateNodeConfig = (config) => {
} catch (err) {
console.error('Something went wrong while creating the backup directory: \n' + err);
}
common.nodes[idx].log_file = common.rtl_conf_file_path + '/logs/RTL-Node-' + node.index + '.log';
const log_file = common.nodes[idx].log_file;
if (fs.existsSync(log_file)) {
fs.writeFile(log_file, '', () => { });
} else {
try {
var dirname = path.dirname(log_file);
connect.createDirectory(dirname);
var createStream = fs.createWriteStream(log_file);
createStream.end();
}
catch (err) {
console.error('Something went wrong while creating log file ' + log_file + ': \n' + err);
}
common.nodes[idx].log_file = common.rtl_conf_file_path + '/logs/RTL-Node-' + node.index + '.log';
const log_file = common.nodes[idx].log_file;
if (fs.existsSync(log_file)) {
fs.writeFile(log_file, '', () => { });
} else {
try {
var dirname = path.dirname(log_file);
connect.createDirectory(dirname);
var createStream = fs.createWriteStream(log_file);
createStream.end();
}
catch (err) {
console.error('Something went wrong while creating log file ' + log_file + ': \n' + err);
}
}
});
}
connect.setSSOParams(config);
if (errMsg && errMsg.trim() !== '') { throw new Error(errMsg); }
}
@ -353,20 +350,18 @@ connect.refreshCookie = (cookieFile) => {
}
connect.logEnvVariables = () => {
if (common.nodes && common.nodes.length > 0) {
common.nodes.forEach((node, idx) => {
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'PORT: ' + common.port, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'HOST: ' + common.host, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'DEFAULT NODE INDEX: ' + common.selectedNode.index });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'SSO: ' + common.rtl_sso, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + common.logout_redirect_link + '\r\n', node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'INDEX: ' + node.index, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN NODE: ' + node.ln_node, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + node.ln_implementation, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + node.fiat_conversion, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + node.currency_unit, node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + node.ln_server_url, node });
});
if (common.selectedNode && common.selectedNode.index) {
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'PORT: ' + common.port});
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'HOST: ' + common.host });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'SSO: ' + common.rtl_sso });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'DEFAULT NODE INDEX: ' + common.selectedNode.index });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'INDEX: ' + common.selectedNode.index });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN NODE: ' + common.selectedNode.ln_node });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN IMPLEMENTATION: ' + common.selectedNode.ln_implementation });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'FIAT CONVERSION: ' + common.selectedNode.fiat_conversion });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'CURRENCY UNIT: ' + common.selectedNode.currency_unit });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LN SERVER URL: ' + common.selectedNode.ln_server_url });
logger.log({ level: 'DEBUG', fileName: 'Config Setup Variable', msg: 'LOGOUT REDIRECT LINK: ' + common.logout_redirect_link + '\r\n' });
}
}
@ -576,7 +571,6 @@ connect.setServerConfiguration = () => {
connect.upgradeConfig(confFileFullPath);
}
var config = JSON.parse(fs.readFileSync(confFileFullPath, 'utf-8'));
connect.updateLogByLevel();
connect.validateNodeConfig(config);
connect.setSelectedNode(config);

@ -3,7 +3,8 @@ const express = require("express");
const router = express.Router();
const authCheck = require("./authCheck");
router.get("/rtlconf", RTLConfController.getRTLConfig);
router.get("/rtlconfinit", RTLConfController.getRTLConfigInitial);
router.get("/rtlconf", authCheck, RTLConfController.getRTLConfig);
router.post("/", authCheck, RTLConfController.updateUISettings);
router.post("/update2FA", authCheck, RTLConfController.update2FASettings);
router.get("/config/:nodeType", authCheck, RTLConfController.getConfig);

@ -7,9 +7,8 @@ module.exports = (req, res, next) => {
jwt.verify(token, common.secret_key);
next();
} catch (error) {
res.status(401).json({
message: "Authentication Failed!",
error: "Authentication Failed! Please Login First!"
});
const errMsg = 'Authentication Failed! Please Login First!';
const err = common.handleError({ statusCode: 401, message: 'Authentication Error', error: errMsg }, 'AuthCheck', errMsg);
return res.status(err.statusCode).json({message: err.message, error: err.error});
}
};

@ -26,6 +26,7 @@ import * as fromRTLReducer from './store/rtl.reducers';
animations: [routeAnimation]
})
export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
@ViewChild('sideNavigation', { static: false }) sideNavigation: any;
@ViewChild('sideNavContent', { static: false }) sideNavContent: any;
public selNode: ConfigSettingsNode;
@ -42,90 +43,99 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
public flgLoggedIn = false;
unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];
constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<fromRTLReducer.RTLState>, private actions: Actions,
private userIdle: UserIdleService, private router: Router, private sessionService: SessionService, private breakpointObserver: BreakpointObserver, private renderer: Renderer2) {}
constructor(
private logger: LoggerService, private commonService: CommonService, private store: Store<fromRTLReducer.RTLState>, private actions: Actions,
private userIdle: UserIdleService, private router: Router, private sessionService: SessionService, private breakpointObserver: BreakpointObserver, private renderer: Renderer2
) { }
ngOnInit() {
this.router.events.subscribe((evt) => {
if (!(evt instanceof NavigationEnd)) { return; }
document.getElementsByTagName('mat-sidenav-content')[0].scrollTo(0, 0);
});
this.breakpointObserver.observe([Breakpoints.XSmall, Breakpoints.TabletPortrait, Breakpoints.Small, Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])
.pipe(takeUntil(this.unSubs[0]))
.subscribe((matches) => {
if(matches.breakpoints[Breakpoints.XSmall]) {
this.commonService.setScreenSize(ScreenSizeEnum.XS);
this.smallScreen = true;
} else if(matches.breakpoints[Breakpoints.TabletPortrait]) {
this.commonService.setScreenSize(ScreenSizeEnum.SM);
this.smallScreen = true;
} else if(matches.breakpoints[Breakpoints.Small] || matches.breakpoints[Breakpoints.Medium]) {
this.commonService.setScreenSize(ScreenSizeEnum.MD);
this.smallScreen = false;
} else if(matches.breakpoints[Breakpoints.Large]) {
this.commonService.setScreenSize(ScreenSizeEnum.LG);
this.smallScreen = false;
} else {
this.commonService.setScreenSize(ScreenSizeEnum.XL);
this.smallScreen = false;
if (!(evt instanceof NavigationEnd)) {
return;
}
document.getElementsByTagName('mat-sidenav-content')[0].scrollTo(0, 0);
});
this.breakpointObserver.observe([Breakpoints.XSmall, Breakpoints.TabletPortrait, Breakpoints.Small, Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge]).
pipe(takeUntil(this.unSubs[0])).
subscribe((matches) => {
if (matches.breakpoints[Breakpoints.XSmall]) {
this.commonService.setScreenSize(ScreenSizeEnum.XS);
this.smallScreen = true;
} else if (matches.breakpoints[Breakpoints.TabletPortrait]) {
this.commonService.setScreenSize(ScreenSizeEnum.SM);
this.smallScreen = true;
} else if (matches.breakpoints[Breakpoints.Small] || matches.breakpoints[Breakpoints.Medium]) {
this.commonService.setScreenSize(ScreenSizeEnum.MD);
this.smallScreen = false;
} else if (matches.breakpoints[Breakpoints.Large]) {
this.commonService.setScreenSize(ScreenSizeEnum.LG);
this.smallScreen = false;
} else {
this.commonService.setScreenSize(ScreenSizeEnum.XL);
this.smallScreen = false;
}
});
this.store.dispatch(new RTLActions.FetchRTLConfig());
this.accessKey = this.readAccessKey();
this.store.select('root')
.pipe(takeUntil(this.unSubs[1]))
.subscribe(rtlStore => {
this.selNode = rtlStore.selNode;
this.settings = this.selNode.settings;
this.appConfig = rtlStore.appConfig;
this.information = rtlStore.nodeData;
this.flgLoading[0] = ( this.information.identity_pubkey) ? false : true;
this.logger.info(this.settings);
if (!this.sessionService.getItem('token')) {
this.flgLoggedIn = false;
this.flgLoading[0] = false;
} else {
this.flgLoggedIn = true;
this.userIdle.startWatching();
}
});
this.store.select('root').
pipe(takeUntil(this.unSubs[1])).
subscribe((rtlStore) => {
this.selNode = rtlStore.selNode;
this.settings = this.selNode.settings;
this.appConfig = rtlStore.appConfig;
this.information = rtlStore.nodeData;
this.flgLoading[0] = !(this.information.identity_pubkey);
this.logger.info(this.settings);
if (!this.sessionService.getItem('token')) {
this.flgLoggedIn = false;
this.flgLoading[0] = false;
} else {
this.flgLoggedIn = true;
this.userIdle.startWatching();
}
});
if (this.sessionService.getItem('defaultPassword') === 'true') {
this.flgSideNavOpened = false;
}
this.actions.pipe(takeUntil(this.unSubs[2]),
filter((action) => action.type === RTLActions.SET_RTL_CONFIG || action.type === RTLActions.LOGOUT))
.subscribe((action: (RTLActions.SetRTLConfig | RTLActions.Logout)) => {
if (action.type === RTLActions.SET_RTL_CONFIG) {
if (!this.sessionService.getItem('token')) {
if (+action.payload.sso.rtlSSO) {
if(!this.accessKey || this.accessKey.trim().length < 32) {
this.router.navigate(['./error'], { state: {errorCode: '406', errorMessage: 'Access key too short. It should be at least 32 characters long.'} });
}
this.actions.pipe(
takeUntil(this.unSubs[2]),
filter((action) => action.type === RTLActions.SET_RTL_CONFIG || action.type === RTLActions.LOGOUT)).
subscribe((action: (RTLActions.SetRTLConfig | RTLActions.Logout)) => {
if (action.type === RTLActions.SET_RTL_CONFIG) {
if (!this.sessionService.getItem('token')) {
if (+action.payload.sso.rtlSSO) {
if (!this.accessKey || this.accessKey.trim().length < 32) {
this.router.navigate(['./error'], { state: { errorCode: '406', errorMessage: 'Access key too short. It should be at least 32 characters long.' } });
} else {
this.store.dispatch(new RTLActions.Login({ password: sha256(this.accessKey), defaultPassword: false }));
}
} else {
this.store.dispatch(new RTLActions.Login({password: sha256(this.accessKey), defaultPassword: false}));
this.router.navigate(['./login']);
}
} else {
this.router.navigate(['./login']);
}
}
}
if (action.type === RTLActions.LOGOUT) {
this.flgLoggedIn = false;
this.userIdle.stopWatching();
this.userIdle.stopTimer();
}
if (action.type === RTLActions.LOGOUT) {
this.flgLoggedIn = false;
this.userIdle.stopWatching();
this.userIdle.stopTimer();
}
});
this.userIdle.onTimerStart().pipe(takeUntil(this.unSubs[3])).subscribe((count) => {
this.logger.info('Counting Down: ' + (11 - count));
});
this.userIdle.onTimerStart().pipe(takeUntil(this.unSubs[3])).subscribe(count => {this.logger.info('Counting Down: ' + (11 - count))});
this.userIdle.onTimeout().pipe(takeUntil(this.unSubs[4])).subscribe(() => {
this.logger.info('Time Out!');
if (this.sessionService.getItem('token')) {
this.flgLoggedIn = false;
this.logger.warn('Time limit exceeded for session inactivity.');
this.store.dispatch(new RTLActions.CloseAllDialogs());
this.store.dispatch(new RTLActions.OpenAlert({ data: {
type: AlertTypeEnum.WARNING,
alertTitle: 'Logging out',
titleMessage: 'Time limit exceeded for session inactivity.'
}}));
this.store.dispatch(new RTLActions.OpenAlert({
data: {
type: AlertTypeEnum.WARNING,
alertTitle: 'Logging out',
titleMessage: 'Time limit exceeded for session inactivity.'
}
}));
this.store.dispatch(new RTLActions.Logout());
}
});
@ -146,7 +156,7 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
} else {
setTimeout(() => {
if (this.flgLoggedIn) {
this.renderer.setStyle(this.sideNavContent.elementRef.nativeElement, 'marginLeft', '22rem'); //$regular-sidenav-width
this.renderer.setStyle(this.sideNavContent.elementRef.nativeElement, 'marginLeft', '22rem'); // $regular-sidenav-width
}
this.commonService.setContainerSize(this.sideNavContent.elementRef.nativeElement.clientWidth, this.sideNavContent.elementRef.nativeElement.clientHeight);
}, 100);
@ -166,14 +176,17 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
copiedText(payload: string) {
this.flgCopied = true;
setTimeout(() => {this.flgCopied = false; }, 5000);
setTimeout(() => {
this.flgCopied = false;
}, 5000);
this.logger.info('Copied Text: ' + payload);
}
ngOnDestroy() {
this.unSubs.forEach(unsub => {
this.unSubs.forEach((unsub) => {
unsub.next();
unsub.complete();
});
}
}

@ -35,7 +35,7 @@ import { LayoutModule } from '@angular/cdk/layout';
routing,
LayoutModule,
HammerModule,
UserIdleModule.forRoot({idle: 3590, timeout: 10, ping: 12000}), // One hour
UserIdleModule.forRoot({ idle: 3590, timeout: 10, ping: 12000 }), // One hour
StoreModule.forRoot(RTLReducer, {
runtimeChecks: {
strictStateImmutability: false,

@ -22,37 +22,37 @@ import { AuthGuard } from './shared/services/auth.guard';
export const routes: Routes = [
{ path: '', pathMatch: 'full', redirectTo: 'login' },
{ path: 'lnd', loadChildren: () => import('./lnd/lnd.module').then(childModule => childModule.LNDModule), canActivate: [AuthGuard] },
{ path: 'cl', loadChildren: () => import('./clightning/cl.module').then(childModule => childModule.CLModule), canActivate: [AuthGuard] },
{ path: 'ecl', loadChildren: () => import('./eclair/ecl.module').then(childModule => childModule.ECLModule), canActivate: [AuthGuard] },
{ path: 'lnd', loadChildren: () => import('./lnd/lnd.module').then((childModule) => childModule.LNDModule), canActivate: [AuthGuard] },
{ path: 'cl', loadChildren: () => import('./clightning/cl.module').then((childModule) => childModule.CLModule), canActivate: [AuthGuard] },
{ path: 'ecl', loadChildren: () => import('./eclair/ecl.module').then((childModule) => childModule.ECLModule), canActivate: [AuthGuard] },
{ path: 'settings', component: SettingsComponent, canActivate: [AuthGuard], children: [
{ path: '', pathMatch: 'full', redirectTo: 'app' },
{ path: 'app', component: AppSettingsComponent, canActivate: [AuthGuard] },
{ path: 'auth', component: AuthSettingsComponent, canActivate: [AuthGuard] },
{ path: 'bconfig', component: BitcoinConfigComponent, canActivate: [AuthGuard] }
]},
] },
{ path: 'config', component: NodeConfigComponent, canActivate: [AuthGuard], children: [
{ path: '', pathMatch: 'full', redirectTo: 'node' },
{ path: 'node', component: NodeSettingsComponent, canActivate: [AuthGuard] },
{ path: 'services', component: ServicesSettingsComponent, canActivate: [AuthGuard], children: [
{ path: '', pathMatch: 'full', redirectTo: 'loop' },
{ path: 'loop', component: LoopServiceSettingsComponent, canActivate: [AuthGuard] },
{ path: 'boltz', component: BoltzServiceSettingsComponent, canActivate: [AuthGuard] },
]},
{ path: 'boltz', component: BoltzServiceSettingsComponent, canActivate: [AuthGuard] }
] },
{ path: 'lnconfig', component: LNPConfigComponent, canActivate: [AuthGuard] }
]},
] },
{ path: 'services', component: ServicesComponent, canActivate: [AuthGuard], children: [
{ path: '', pathMatch: 'full', redirectTo: 'loop' },
{ path: 'loop', pathMatch: 'full', redirectTo: 'loop/loopout' },
{ path: 'loop/:selTab', component: LoopComponent },
{ path: 'boltz', pathMatch: 'full', redirectTo: 'boltz/swapout' },
{ path: 'boltz/:selTab', component: BoltzRootComponent },
]},
{ path: 'boltz/:selTab', component: BoltzRootComponent }
] },
{ path: 'help', component: HelpComponent },
{ path: 'login', component: LoginComponent },
{ path: 'error', component: ErrorComponent },
{ path: '**', component: NotFoundComponent }
{ path: '**', component: NotFoundComponent }
];
// export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(routes, { enableTracing: true });
// Export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(routes, { enableTracing: true });
export const routing: ModuleWithProviders<RouterModule> = RouterModule.forRoot(routes);

@ -9,6 +9,7 @@ import { routeAnimation } from '../shared/animation/route-animation';
animations: [routeAnimation]
})
export class CLRootComponent {
loading = false;
constructor(private router: Router) {
@ -28,6 +29,7 @@ export class CLRootComponent {
break;
}
}
});
});
}
}

@ -37,8 +37,8 @@ export const ClRoutes: Routes = [
{ path: 'onchain', component: CLOnChainComponent, canActivate: [CLUnlockedGuard], children: [
{ path: '', pathMatch: 'full', redirectTo: 'receive/utxos' },
{ path: 'receive/:selTab', component: CLOnChainReceiveComponent, canActivate: [CLUnlockedGuard] },
{ path: 'send/:selTab', component: CLOnChainSendComponent, data : {sweepAll : false}, canActivate: [CLUnlockedGuard] },
{ path: 'sweep/:selTab', component: CLOnChainSendComponent, data : {sweepAll : true}, canActivate: [CLUnlockedGuard] }
{ path: 'send/:selTab', component: CLOnChainSendComponent, data: { sweepAll: false }, canActivate: [CLUnlockedGuard] },
{ path: 'sweep/:selTab', component: CLOnChainSendComponent, data: { sweepAll: true }, canActivate: [CLUnlockedGuard] }
] },
{ path: 'connections', component: CLConnectionsComponent, canActivate: [CLUnlockedGuard], children: [
{ path: '', pathMatch: 'full', redirectTo: 'channels' },
@ -47,7 +47,7 @@ export const ClRoutes: Routes = [
{ path: 'open', component: CLChannelOpenTableComponent, canActivate: [CLUnlockedGuard] },
{ path: 'pending', component: CLChannelPendingTableComponent, canActivate: [CLUnlockedGuard] }
] },
{ path: 'peers', component: CLPeersComponent, data : {sweepAll : false}, canActivate: [CLUnlockedGuard] }
{ path: 'peers', component: CLPeersComponent, data: { sweepAll: false }, canActivate: [CLUnlockedGuard] }
] },
{ path: 'transactions', component: CLTransactionsComponent, canActivate: [CLUnlockedGuard], children: [
{ path: '', pathMatch: 'full', redirectTo: 'payments' },
@ -76,8 +76,7 @@ export const ClRoutes: Routes = [
{ path: 'network', redirectTo: 'rates' },
{ path: 'wallet', redirectTo: 'home' },
{ path: 'backup', redirectTo: 'home' }
]
}
] }
];
export const CLRouting: ModuleWithProviders<RouterModule> = RouterModule.forChild(ClRoutes);

@ -9,10 +9,10 @@ describe('CLBalancesInfoComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLBalancesInfoComponent ],
imports: [ SharedModule ]
})
.compileComponents();
declarations: [CLBalancesInfoComponent],
imports: [SharedModule]
}).
compileComponents();
}));
beforeEach(() => {
@ -28,5 +28,4 @@ describe('CLBalancesInfoComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -6,6 +6,7 @@ import { Component, Input } from '@angular/core';
styleUrls: ['./balances-info.component.scss']
})
export class CLBalancesInfoComponent {
@Input() balances = { onchain: 0, lightning: 0, total: 0 };
@Input() errorMessage: string;

@ -10,10 +10,10 @@ describe('CLChannelCapacityInfoComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLChannelCapacityInfoComponent ],
imports: [ SharedModule, RouterTestingModule ]
})
.compileComponents();
declarations: [CLChannelCapacityInfoComponent],
imports: [SharedModule, RouterTestingModule]
}).
compileComponents();
}));
beforeEach(() => {
@ -29,5 +29,4 @@ describe('CLChannelCapacityInfoComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -10,11 +10,12 @@ import { Channel } from '../../../shared/models/clModels';
styleUrls: ['./channel-capacity-info.component.scss']
})
export class CLChannelCapacityInfoComponent {
public faBalanceScale = faBalanceScale;
public faDumbbell = faDumbbell;
@Input() channelBalances: {localBalance: number, remoteBalance: number, balancedness: number};
@Input() allChannels: Channel[];
@Input() sortBy: string = 'Balance Score';
@Input() sortBy = 'Balance Score';
@Input() errorMessage: string;
constructor(private router: Router) {}

@ -9,19 +9,19 @@ import { CLChannelLiquidityInfoComponent } from './channel-liquidity-info.compon
import { DataService } from '../../../shared/services/data.service';
describe('CLChannelLiquidityInfoComponent', () => {
let component: CLChannelLiquidityInfoComponent;
let component: CLChannelLiquidityInfoComponent;
let fixture: ComponentFixture<CLChannelLiquidityInfoComponent>;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLChannelLiquidityInfoComponent ],
imports: [ SharedModule, RouterTestingModule ],
providers: [
declarations: [CLChannelLiquidityInfoComponent],
imports: [SharedModule, RouterTestingModule],
providers: [
CommonService,
{ provide: DataService, useClass: mockDataService }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -33,5 +33,4 @@ describe('CLChannelLiquidityInfoComponent', () => {
it('should create', () => {
expect(component).toBeTruthy();
});
});

@ -11,6 +11,7 @@ import { CommonService } from '../../../shared/services/common.service';
styleUrls: ['./channel-liquidity-info.component.scss']
})
export class CLChannelLiquidityInfoComponent implements OnInit {
@Input() direction: string;
@Input() totalLiquidity: number;
@Input() allChannels: Channel[];

@ -9,10 +9,10 @@ describe('CLChannelStatusInfoComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLChannelStatusInfoComponent ],
imports: [ SharedModule ]
})
.compileComponents();
declarations: [CLChannelStatusInfoComponent],
imports: [SharedModule]
}).
compileComponents();
}));
beforeEach(() => {
@ -28,5 +28,4 @@ describe('CLChannelStatusInfoComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -7,6 +7,7 @@ import { ChannelsStatus } from '../../../shared/models/clModels';
styleUrls: ['./channel-status-info.component.scss']
})
export class CLChannelStatusInfoComponent {
@Input() channelsStatus: ChannelsStatus = {};
@Input() errorMessage: string;

@ -9,10 +9,10 @@ describe('CLFeeInfoComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLFeeInfoComponent ],
imports: [ SharedModule ]
})
.compileComponents();
declarations: [CLFeeInfoComponent],
imports: [SharedModule]
}).
compileComponents();
}));
beforeEach(() => {
@ -28,5 +28,4 @@ describe('CLFeeInfoComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -7,8 +7,9 @@ import { Fees } from '../../../shared/models/clModels';
styleUrls: ['./fee-info.component.scss']
})
export class CLFeeInfoComponent {
@Input() fees: Fees;
@Input() errorMessage: string;
totalFees = [{'name': 'Total', 'value': 0}];
totalFees = [{ name: 'Total', value: 0 }];
}

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

@ -1,5 +1,5 @@
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from "@angular/router/testing";
import { RouterTestingModule } from '@angular/router/testing';
import { StoreModule } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
@ -23,8 +23,8 @@ describe('CLHomeComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLHomeComponent, CLNodeInfoComponent, CLBalancesInfoComponent, CLChannelCapacityInfoComponent, CLChannelStatusInfoComponent, CLFeeInfoComponent ],
imports: [
declarations: [CLHomeComponent, CLNodeInfoComponent, CLBalancesInfoComponent, CLChannelCapacityInfoComponent, CLChannelStatusInfoComponent, CLFeeInfoComponent],
imports: [
SharedModule,
RouterTestingModule,
StoreModule.forRoot(RTLReducer, {
@ -40,8 +40,8 @@ describe('CLHomeComponent', () => {
{ provide: LoggerService, useClass: mockLoggerService },
{ provide: DataService, useClass: mockDataService }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -57,5 +57,4 @@ describe('CLHomeComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -23,6 +23,7 @@ import * as fromRTLReducer from '../../store/rtl.reducers';
styleUrls: ['./home.component.scss']
})
export class CLHomeComponent implements OnInit, OnDestroy {
public faSmile = faSmile;
public faFrown = faFrown;
public faAngleDoubleDown = faAngleDoubleDown;
@ -30,10 +31,10 @@ export class CLHomeComponent implements OnInit, OnDestroy {
public faChartPie = faChartPie;
public faBolt = faBolt;
public faServer = faServer;
public faNetworkWired = faNetworkWired;
public faNetworkWired = faNetworkWired;
public flgChildInfoUpdated = false;
public userPersonaEnum = UserPersonaEnum;
public channelBalances = {localBalance: 0, remoteBalance: 0, balancedness: 0};
public channelBalances = { localBalance: 0, remoteBalance: 0, balancedness: 0 };
public selNode: SelNodeChild = {};
public fees: Fees;
public information: GetInfo = {};
@ -54,12 +55,12 @@ export class CLHomeComponent implements OnInit, OnDestroy {
public sortField = 'Balance Score';
public errorMessages = ['', '', '', '', '', ''];
public apisCallStatus: ApiCallsListCL = null;
public apiCallStatusEnum = APICallStatusEnum;
public apiCallStatusEnum = APICallStatusEnum;
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject()];
constructor(private logger: LoggerService, private store: Store<fromRTLReducer.RTLState>, private actions: Actions, private commonService: CommonService, private router: Router) {
this.screenSize = this.commonService.getScreenSize();
if(this.screenSize === ScreenSizeEnum.XS) {
if (this.screenSize === ScreenSizeEnum.XS) {
this.operatorCards = [
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 10, rows: 1 },
{ id: 'balance', goTo: 'On-Chain', link: '/cl/onchain', icon: this.faChartPie, title: 'Balances', cols: 10, rows: 1 },
@ -73,7 +74,7 @@ export class CLHomeComponent implements OnInit, OnDestroy {
{ id: 'inboundLiq', goTo: 'Channels', link: '/cl/connections', icon: this.faAngleDoubleDown, title: 'In-Bound Liquidity', cols: 6, rows: 8 },
{ id: 'outboundLiq', goTo: 'Channels', link: '/cl/connections', icon: this.faAngleDoubleUp, title: 'Out-Bound Liquidity', cols: 6, rows: 8 }
];
} else if(this.screenSize === ScreenSizeEnum.SM || this.screenSize === ScreenSizeEnum.MD) {
} else if (this.screenSize === ScreenSizeEnum.SM || this.screenSize === ScreenSizeEnum.MD) {
this.operatorCards = [
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 5, rows: 1 },
{ id: 'balance', goTo: 'On-Chain', link: '/cl/onchain', icon: this.faChartPie, title: 'Balances', cols: 5, rows: 1 },
@ -107,79 +108,80 @@ export class CLHomeComponent implements OnInit, OnDestroy {
}
ngOnInit() {
this.store.select('cl')
.pipe(takeUntil(this.unSubs[1]))
.subscribe((rtlStore) => {
this.errorMessages = ['', '', '', '', '', ''];
this.apisCallStatus = rtlStore.apisCallStatus;
if (rtlStore.apisCallStatus.FetchInfo.status === APICallStatusEnum.ERROR) {
this.errorMessages[0] = (typeof(this.apisCallStatus.FetchInfo.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchInfo.message) : this.apisCallStatus.FetchInfo.message;
}
if (rtlStore.apisCallStatus.FetchFees.status === APICallStatusEnum.ERROR) {
this.errorMessages[1] = (typeof(this.apisCallStatus.FetchFees.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFees.message) : this.apisCallStatus.FetchFees.message;
}
if (rtlStore.apisCallStatus.FetchBalance.status === APICallStatusEnum.ERROR) {
this.errorMessages[2] = (typeof(this.apisCallStatus.FetchBalance.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchBalance.message) : this.apisCallStatus.FetchBalance.message;
}
if (rtlStore.apisCallStatus.FetchLocalRemoteBalance.status === APICallStatusEnum.ERROR) {
this.errorMessages[3] = (typeof(this.apisCallStatus.FetchLocalRemoteBalance.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchLocalRemoteBalance.message) : this.apisCallStatus.FetchLocalRemoteBalance.message;
}
if (rtlStore.apisCallStatus.FetchChannels.status === APICallStatusEnum.ERROR) {
this.errorMessages[4] = (typeof(this.apisCallStatus.FetchChannels.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchChannels.message) : this.apisCallStatus.FetchChannels.message;
}
if (rtlStore.apisCallStatus.GetForwardingHistory.status === APICallStatusEnum.ERROR) {
this.errorMessages[5] = (typeof(this.apisCallStatus.GetForwardingHistory.message) === 'object') ? JSON.stringify(this.apisCallStatus.GetForwardingHistory.message) : this.apisCallStatus.GetForwardingHistory.message;
}
this.selNode = rtlStore.nodeSettings;
this.information = rtlStore.information;
this.fees = rtlStore.fees;
this.totalBalance = rtlStore.balance;
this.balances.onchain = rtlStore.balance.totalBalance;
this.balances.lightning = rtlStore.localRemoteBalance.localBalance;
this.balances.total = this.balances.lightning + this.balances.onchain;
this.balances = Object.assign({}, this.balances);
let local = (rtlStore.localRemoteBalance.localBalance) ? +rtlStore.localRemoteBalance.localBalance : 0;
let remote = (rtlStore.localRemoteBalance.remoteBalance) ? +rtlStore.localRemoteBalance.remoteBalance : 0;
let total = local + remote;
this.channelBalances = { localBalance: local, remoteBalance: remote, balancedness: +(1 - Math.abs((local-remote)/total)).toFixed(3) };
this.channelsStatus = {
active: { channels: rtlStore.information.num_active_channels, capacity: rtlStore.localRemoteBalance.localBalance },
pending: { channels: rtlStore.information.num_pending_channels, capacity: rtlStore.localRemoteBalance.pendingBalance | 0 },
inactive: { channels: rtlStore.information.num_inactive_channels, capacity: rtlStore.localRemoteBalance.inactiveBalance | 0 }
};
this.totalInboundLiquidity = 0;
this.totalOutboundLiquidity = 0;
this.allChannels = rtlStore.allChannels.filter(channel => channel.state === 'CHANNELD_NORMAL' && channel.connected);
this.allChannelsCapacity = this.allChannels.length > 0 ? JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels, 'balancedness'))) : [];
this.allInboundChannels = this.allChannels.length > 0 ? JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels.filter(channel => channel.msatoshi_to_them > 0), 'msatoshi_to_them'))) : [];
this.allOutboundChannels = this.allChannels.length > 0 ? JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels.filter(channel => channel.msatoshi_to_us > 0), 'msatoshi_to_us'))) : [];
this.allChannels.forEach(channel => {
this.totalInboundLiquidity = this.totalInboundLiquidity + Math.ceil(channel.msatoshi_to_them/1000);
this.totalOutboundLiquidity = this.totalOutboundLiquidity + Math.floor(channel.msatoshi_to_us/1000);
});
this.store.select('cl').
pipe(takeUntil(this.unSubs[1])).
subscribe((rtlStore) => {
this.errorMessages = ['', '', '', '', '', ''];
this.apisCallStatus = rtlStore.apisCallStatus;
if (rtlStore.apisCallStatus.FetchInfo.status === APICallStatusEnum.ERROR) {
this.errorMessages[0] = (typeof (this.apisCallStatus.FetchInfo.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchInfo.message) : this.apisCallStatus.FetchInfo.message;
}
if (rtlStore.apisCallStatus.FetchFees.status === APICallStatusEnum.ERROR) {
this.errorMessages[1] = (typeof (this.apisCallStatus.FetchFees.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFees.message) : this.apisCallStatus.FetchFees.message;
}
if (rtlStore.apisCallStatus.FetchBalance.status === APICallStatusEnum.ERROR) {
this.errorMessages[2] = (typeof (this.apisCallStatus.FetchBalance.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchBalance.message) : this.apisCallStatus.FetchBalance.message;
}
if (rtlStore.apisCallStatus.FetchLocalRemoteBalance.status === APICallStatusEnum.ERROR) {
this.errorMessages[3] = (typeof (this.apisCallStatus.FetchLocalRemoteBalance.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchLocalRemoteBalance.message) : this.apisCallStatus.FetchLocalRemoteBalance.message;
}
if (rtlStore.apisCallStatus.FetchChannels.status === APICallStatusEnum.ERROR) {
this.errorMessages[4] = (typeof (this.apisCallStatus.FetchChannels.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchChannels.message) : this.apisCallStatus.FetchChannels.message;
}
if (rtlStore.apisCallStatus.GetForwardingHistory.status === APICallStatusEnum.ERROR) {
this.errorMessages[5] = (typeof (this.apisCallStatus.GetForwardingHistory.message) === 'object') ? JSON.stringify(this.apisCallStatus.GetForwardingHistory.message) : this.apisCallStatus.GetForwardingHistory.message;
}
if (this.balances.lightning >= 0 && this.balances.onchain >= 0 && this.fees.feeCollected >= 0) {
this.flgChildInfoUpdated = true;
} else {
this.flgChildInfoUpdated = false;
}
this.logger.info(rtlStore);
});
this.actions.pipe(takeUntil(this.unSubs[2]),
filter((action) => action.type === CLActions.FETCH_FEES_CL || action.type === CLActions.SET_FEES_CL))
.subscribe(action => {
if(action.type === CLActions.FETCH_FEES_CL) {
this.flgChildInfoUpdated = false;
}
if(action.type === CLActions.SET_FEES_CL) {
this.flgChildInfoUpdated = true;
}
});
this.selNode = rtlStore.nodeSettings;
this.information = rtlStore.information;
this.fees = rtlStore.fees;
this.totalBalance = rtlStore.balance;
this.balances.onchain = rtlStore.balance.totalBalance;
this.balances.lightning = rtlStore.localRemoteBalance.localBalance;
this.balances.total = this.balances.lightning + this.balances.onchain;
this.balances = Object.assign({}, this.balances);
const local = (rtlStore.localRemoteBalance.localBalance) ? +rtlStore.localRemoteBalance.localBalance : 0;
const remote = (rtlStore.localRemoteBalance.remoteBalance) ? +rtlStore.localRemoteBalance.remoteBalance : 0;
const total = local + remote;
this.channelBalances = { localBalance: local, remoteBalance: remote, balancedness: +(1 - Math.abs((local - remote) / total)).toFixed(3) };
this.channelsStatus = {
active: { channels: rtlStore.information.num_active_channels, capacity: rtlStore.localRemoteBalance.localBalance },
pending: { channels: rtlStore.information.num_pending_channels, capacity: rtlStore.localRemoteBalance.pendingBalance || 0 },
inactive: { channels: rtlStore.information.num_inactive_channels, capacity: rtlStore.localRemoteBalance.inactiveBalance || 0 }
};
this.totalInboundLiquidity = 0;
this.totalOutboundLiquidity = 0;
this.allChannels = rtlStore.allChannels.filter((channel) => channel.state === 'CHANNELD_NORMAL' && channel.connected);
this.allChannelsCapacity = this.allChannels.length > 0 ? JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels, 'balancedness'))) : [];
this.allInboundChannels = this.allChannels.length > 0 ? JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels.filter((channel) => channel.msatoshi_to_them > 0), 'msatoshi_to_them'))) : [];
this.allOutboundChannels = this.allChannels.length > 0 ? JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels.filter((channel) => channel.msatoshi_to_us > 0), 'msatoshi_to_us'))) : [];
this.allChannels.forEach((channel) => {
this.totalInboundLiquidity = this.totalInboundLiquidity + Math.ceil(channel.msatoshi_to_them / 1000);
this.totalOutboundLiquidity = this.totalOutboundLiquidity + Math.floor(channel.msatoshi_to_us / 1000);
});
if (this.balances.lightning >= 0 && this.balances.onchain >= 0 && this.fees.feeCollected >= 0) {
this.flgChildInfoUpdated = true;
} else {
this.flgChildInfoUpdated = false;
}
this.logger.info(rtlStore);
});
this.actions.pipe(
takeUntil(this.unSubs[2]),
filter((action) => action.type === CLActions.FETCH_FEES_CL || action.type === CLActions.SET_FEES_CL)).
subscribe((action) => {
if (action.type === CLActions.FETCH_FEES_CL) {
this.flgChildInfoUpdated = false;
}
if (action.type === CLActions.SET_FEES_CL) {
this.flgChildInfoUpdated = true;
}
});
}
onNavigateTo(link: string) {
@ -188,20 +190,20 @@ export class CLHomeComponent implements OnInit, OnDestroy {
onsortChannelsBy() {
if (this.sortField === 'Balance Score') {
this.sortField = 'Capacity';
this.allChannelsCapacity = this.allChannels.sort(function (a, b) {
this.sortField = 'Capacity';
this.allChannelsCapacity = this.allChannels.sort((a, b) => {
const x = +a.msatoshi_to_us + +a.msatoshi_to_them;
const y = +b.msatoshi_to_them + +b.msatoshi_to_them;
return ((x > y) ? -1 : ((x < y) ? 1 : 0));
});
} else {
this.sortField = 'Balance Score';
this.sortField = 'Balance Score';
this.allChannelsCapacity = this.allChannels.length > 0 ? JSON.parse(JSON.stringify(this.commonService.sortDescByKey(this.allChannels, 'balancedness'))) : [];
}
}
ngOnDestroy() {
this.unSubs.forEach(completeSub => {
this.unSubs.forEach((completeSub) => {
completeSub.next(null);
completeSub.complete();
});

@ -2,10 +2,11 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
import { SharedModule } from '../../../shared/shared.module';
import { CommonService } from '../../../shared/services/common.service';
import { DataService } from '../../../shared/services/data.service';
import { LoggerService } from '../../../shared/services/logger.service';
import { mockDataService, mockLoggerService } from '../../../shared/test-helpers/mock-services';
import { CLNodeInfoComponent } from './node-info.component';
import { DataService } from '../../../shared/services/data.service';
describe('CLNodeInfoComponent', () => {
let component: CLNodeInfoComponent;
@ -14,19 +15,20 @@ describe('CLNodeInfoComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLNodeInfoComponent ],
imports: [ SharedModule ],
providers: [
declarations: [CLNodeInfoComponent],
imports: [SharedModule],
providers: [
CommonService,
{ provide: LoggerService, useClass: mockLoggerService },
{ provide: DataService, useClass: mockDataService }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CLNodeInfoComponent);
commonService = TestBed.inject(CommonService);
commonService = TestBed.inject(CommonService);
component = fixture.componentInstance;
fixture.detectChanges();
});
@ -38,5 +40,4 @@ describe('CLNodeInfoComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -8,6 +8,7 @@ import { CommonService } from '../../../shared/services/common.service';
styleUrls: ['./node-info.component.scss']
})
export class CLNodeInfoComponent implements OnChanges {
@Input() information: GetInfo;
@Input() showColorFieldSeparately: boolean;
public chains: Array<string> = [''];
@ -15,9 +16,9 @@ export class CLNodeInfoComponent implements OnChanges {
constructor(private commonService: CommonService) { }
ngOnChanges() {
if(this.information && this.information.chains && this.information.chains.length > 0) {
if (this.information && this.information.chains && this.information.chains.length > 0) {
this.chains = [''];
this.information.chains.forEach(chain => {
this.information.chains.forEach((chain) => {
this.chains.push(this.commonService.titleCase(chain.chain) + ' ' + this.commonService.titleCase(chain.network));
});
}

@ -11,7 +11,7 @@ describe('CLChannelLookupComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLChannelLookupComponent ],
declarations: [CLChannelLookupComponent],
imports: [
SharedModule,
StoreModule.forRoot(RTLReducer, {
@ -19,10 +19,10 @@ describe('CLChannelLookupComponent', () => {
strictStateImmutability: false,
strictActionImmutability: false
}
}),
})
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -38,5 +38,4 @@ describe('CLChannelLookupComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -12,6 +12,7 @@ import * as fromRTLReducer from '../../../store/rtl.reducers';
styleUrls: ['./channel-lookup.component.scss']
})
export class CLChannelLookupComponent implements OnInit {
@Input() lookupResult: ChannelEdge[] = [];
public node1_match = false;
public node2_match = false;
@ -20,16 +21,16 @@ export class CLChannelLookupComponent implements OnInit {
constructor(private store: Store<fromRTLReducer.RTLState>) { }
ngOnInit() {
this.store.select('cl')
.pipe(takeUntil(this.unSubs[0]))
.subscribe((rtlStore) => {
if (this.lookupResult.length > 0 && this.lookupResult[0].source === rtlStore.information.id) {
this.node1_match = true;
}
if (this.lookupResult.length > 1 && this.lookupResult[1].source === rtlStore.information.id) {
this.node2_match = true;
}
});
this.store.select('cl').
pipe(takeUntil(this.unSubs[0])).
subscribe((rtlStore) => {
if (this.lookupResult.length > 0 && this.lookupResult[0].source === rtlStore.information.id) {
this.node1_match = true;
}
if (this.lookupResult.length > 1 && this.lookupResult[1].source === rtlStore.information.id) {
this.node2_match = true;
}
});
}
}

@ -19,7 +19,7 @@ describe('CLLookupsComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLLookupsComponent, CLNodeLookupComponent, CLChannelLookupComponent ],
declarations: [CLLookupsComponent, CLNodeLookupComponent, CLChannelLookupComponent],
imports: [
BrowserAnimationsModule,
SharedModule,
@ -36,8 +36,8 @@ describe('CLLookupsComponent', () => {
{ provide: LoggerService, useClass: mockLoggerService },
{ provide: DataService, useClass: mockDataService }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -53,5 +53,4 @@ describe('CLLookupsComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -18,17 +18,18 @@ import * as fromRTLReducer from '../../store/rtl.reducers';
styleUrls: ['./lookups.component.scss']
})
export class CLLookupsComponent implements OnInit, OnDestroy {
@ViewChild('form', { static: true }) form: any;
public lookupKey = '';
public nodeLookupValue = {nodeid: ''};
public nodeLookupValue = { nodeid: '' };
public channelLookupValue = [];
public flgSetLookupValue = false;
public temp: any;
public messageObj = [];
public selectedFieldId = 0;
public lookupFields = [
{ id: 0, name: 'Node', placeholder: 'Pubkey'},
{ id: 1, name: 'Channel', placeholder: 'Short Channel ID'}
{ id: 0, name: 'Node', placeholder: 'Pubkey' },
{ id: 1, name: 'Channel', placeholder: 'Short Channel ID' }
];
public flgLoading: Array<Boolean | 'error'> = [true];
public faSearch = faSearch;
@ -41,44 +42,46 @@ export class CLLookupsComponent implements OnInit, OnDestroy {
}
ngOnInit() {
this.actions
.pipe(
takeUntil(this.unSubs[0]),
filter((action) => (action.type === CLActions.SET_LOOKUP_CL || action.type === CLActions.UPDATE_API_CALL_STATUS_CL))
).subscribe((resLookup: CLActions.SetLookup | CLActions.UpdateAPICallStatus) => {
if(resLookup.type === CLActions.SET_LOOKUP_CL) {
this.flgLoading[0] = true;
switch (this.selectedFieldId) {
case 0:
this.nodeLookupValue = resLookup.payload[0] ? JSON.parse(JSON.stringify(resLookup.payload[0])) : {nodeid: ''};
break;
case 1:
this.channelLookupValue = resLookup.payload ? JSON.parse(JSON.stringify(resLookup.payload)) : [];
break;
default:
break;
this.actions.
pipe(
takeUntil(this.unSubs[0]),
filter((action) => (action.type === CLActions.SET_LOOKUP_CL || action.type === CLActions.UPDATE_API_CALL_STATUS_CL))
).subscribe((resLookup: CLActions.SetLookup | CLActions.UpdateAPICallStatus) => {
if (resLookup.type === CLActions.SET_LOOKUP_CL) {
this.flgLoading[0] = true;
switch (this.selectedFieldId) {
case 0:
this.nodeLookupValue = resLookup.payload[0] ? JSON.parse(JSON.stringify(resLookup.payload[0])) : { nodeid: '' };
break;
case 1:
this.channelLookupValue = resLookup.payload ? JSON.parse(JSON.stringify(resLookup.payload)) : [];
break;
default:
break;
}
this.flgSetLookupValue = true;
this.logger.info(this.nodeLookupValue);
this.logger.info(this.channelLookupValue);
}
this.flgSetLookupValue = true;
this.logger.info(this.nodeLookupValue);
this.logger.info(this.channelLookupValue);
}
if (resLookup.type === CLActions.UPDATE_API_CALL_STATUS_CL && resLookup.payload.status === APICallStatusEnum.ERROR && resLookup.payload.action === 'Lookup') {
this.flgLoading[0] = 'error';
}
});
if (resLookup.type === CLActions.UPDATE_API_CALL_STATUS_CL && resLookup.payload.status === APICallStatusEnum.ERROR && resLookup.payload.action === 'Lookup') {
this.flgLoading[0] = 'error';
}
});
}
onLookup():boolean|void {
if(!this.lookupKey) { return true; }
onLookup(): boolean|void {
if (!this.lookupKey) {
return true;
}
this.flgSetLookupValue = false;
this.nodeLookupValue = {nodeid: ''};
this.nodeLookupValue = { nodeid: '' };
this.channelLookupValue = [];
switch (this.selectedFieldId) {
case 0:
this.store.dispatch(new CLActions.PeerLookup(this.lookupKey.trim()));
break;
case 1:
this.store.dispatch(new CLActions.ChannelLookup({uiMessage: UI_MESSAGES.SEARCHING_CHANNEL, shortChannelID: this.lookupKey.trim(), showError: false}));
this.store.dispatch(new CLActions.ChannelLookup({ uiMessage: UI_MESSAGES.SEARCHING_CHANNEL, shortChannelID: this.lookupKey.trim(), showError: false }));
break;
default:
break;
@ -93,19 +96,19 @@ export class CLLookupsComponent implements OnInit, OnDestroy {
resetData() {
this.flgSetLookupValue = false;
this.selectedFieldId = 0;
this.nodeLookupValue = {nodeid: ''};
this.nodeLookupValue = { nodeid: '' };
this.channelLookupValue = [];
this.form.resetForm();
}
clearLookupValue() {
this.nodeLookupValue = {nodeid: ''};
this.nodeLookupValue = { nodeid: '' };
this.channelLookupValue = [];
this.flgSetLookupValue = false;
}
ngOnDestroy() {
this.unSubs.forEach(completeSub => {
this.unSubs.forEach((completeSub) => {
completeSub.next(null);
completeSub.complete();
});

@ -10,11 +10,11 @@ describe('CLNodeLookupComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLNodeLookupComponent ],
imports: [ SharedModule ],
providers: [ LoggerService ]
})
.compileComponents();
declarations: [CLNodeLookupComponent],
imports: [SharedModule],
providers: [LoggerService]
}).
compileComponents();
}));
beforeEach(() => {
@ -30,5 +30,4 @@ describe('CLNodeLookupComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -12,6 +12,7 @@ import { LoggerService } from '../../../shared/services/logger.service';
styleUrls: ['./node-lookup.component.scss']
})
export class CLNodeLookupComponent implements OnInit {
@ViewChild(MatSort, { static: false }) sort: MatSort|undefined;
@Input() lookupResult: LookupNode;
public addresses: any;
@ -23,12 +24,12 @@ export class CLNodeLookupComponent implements OnInit {
this.addresses = this.lookupResult && this.lookupResult.addresses ? new MatTableDataSource<any>([...this.lookupResult.addresses]) : new MatTableDataSource([]);
this.addresses.data = this.lookupResult && this.lookupResult.addresses ? this.lookupResult.addresses : [];
this.addresses.sort = this.sort;
this.addresses.sortingDataAccessor = (data: any, sortHeaderId: string) => (data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null;
this.addresses.sortingDataAccessor = (data: any, sortHeaderId: string) => ((data[sortHeaderId] && isNaN(data[sortHeaderId])) ? data[sortHeaderId].toLocaleLowerCase() : data[sortHeaderId] ? +data[sortHeaderId] : null);
}
onCopyNodeURI(payload: string) {
this.snackBar.open('Node URI copied.');
this.logger.info('Copied Text: ' + payload);
this.logger.info('Copied Text: ' + payload);
}
}

@ -8,9 +8,9 @@ describe('CLFeeRatesComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLFeeRatesComponent ]
})
.compileComponents();
declarations: [CLFeeRatesComponent]
}).
compileComponents();
}));
beforeEach(() => {
@ -26,5 +26,4 @@ describe('CLFeeRatesComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -8,6 +8,7 @@ import { FeeRates, FeeRatePerObj, feeRateStyle } from '../../../shared/models/cl
styleUrls: ['./fee-rates.component.scss']
})
export class CLFeeRatesComponent implements AfterContentChecked {
@Input() feeRateStyle: string;
@Input() feeRates: FeeRates;
@Input() errorMessage: string;

@ -28,8 +28,8 @@
<rtl-cl-node-info fxFlex="100" *ngSwitchCase="'node'" [information]="information" [showColorFieldSeparately]="false"></rtl-cl-node-info>
<rtl-cl-channel-status-info fxFlex="100" *ngSwitchCase="'status'" [channelsStatus]="channelsStatus" [errorMessage]="errorMessages[0] + ' ' + errorMessages[2]"></rtl-cl-channel-status-info>
<rtl-cl-fee-info fxFlex="100" *ngSwitchCase="'fee'" [fees]="fees" [errorMessage]="errorMessages[1] + ' ' + errorMessages[3] + ' ' + errorMessages[4]"></rtl-cl-fee-info>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKB'" [flgLoading]="apisCallStatus?.FetchFeeRatesperkb.status === apiCallStatusEnum.INITIATED" [feeRates]="feeRatesPerKB" [feeRateStyle]="'KB'" class="h-100" [errorMessage]="errorMessages[5]"></rtl-cl-fee-rates>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKW'" [flgLoading]="apisCallStatus?.FetchFeeRatesperkw.status === apiCallStatusEnum.INITIATED" [feeRates]="feeRatesPerKW" [feeRateStyle]="'KW'" class="h-100" [errorMessage]="errorMessages[6]"></rtl-cl-fee-rates>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKB'" [feeRates]="feeRatesPerKB" [feeRateStyle]="'KB'" class="h-100" [errorMessage]="errorMessages[5]"></rtl-cl-fee-rates>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKW'" [feeRates]="feeRatesPerKW" [feeRateStyle]="'KW'" class="h-100" [errorMessage]="errorMessages[6]"></rtl-cl-fee-rates>
</div>
</mat-card-content>
</mat-card>
@ -66,8 +66,8 @@
<rtl-cl-node-info fxFlex="100" *ngSwitchCase="'node'" [information]="information" [showColorFieldSeparately]="false"></rtl-cl-node-info>
<rtl-cl-channel-status-info fxFlex="100" *ngSwitchCase="'status'" [channelsStatus]="channelsStatus" [errorMessage]="errorMessages[0] + ' ' + errorMessages[2]"></rtl-cl-channel-status-info>
<rtl-cl-fee-info fxFlex="100" *ngSwitchCase="'fee'" [fees]="fees" [errorMessage]="errorMessages[1] + ' ' + errorMessages[3] + ' ' + errorMessages[4]"></rtl-cl-fee-info>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKB'" [flgLoading]="apisCallStatus?.FetchFeeRatesperkb.status === apiCallStatusEnum.INITIATED" [feeRates]="feeRatesPerKB" [feeRateStyle]="'KB'" class="h-100" [errorMessage]="errorMessages[5]"></rtl-cl-fee-rates>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKW'" [flgLoading]="apisCallStatus?.FetchFeeRatesperkw.status === apiCallStatusEnum.INITIATED" [feeRates]="feeRatesPerKW" [feeRateStyle]="'KW'" class="h-100" [errorMessage]="errorMessages[5]"></rtl-cl-fee-rates>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKB'" [feeRates]="feeRatesPerKB" [feeRateStyle]="'KB'" class="h-100" [errorMessage]="errorMessages[5]"></rtl-cl-fee-rates>
<rtl-cl-fee-rates *ngSwitchCase="'feeRatesKW'" [feeRates]="feeRatesPerKW" [feeRateStyle]="'KW'" class="h-100" [errorMessage]="errorMessages[5]"></rtl-cl-fee-rates>
</div>
</mat-card-content>
</mat-card>

@ -16,7 +16,7 @@ describe('CLNetworkInfoComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLNetworkInfoComponent, CLFeeRatesComponent ],
declarations: [CLNetworkInfoComponent, CLFeeRatesComponent],
imports: [
SharedModule,
StoreModule.forRoot(RTLReducer, {
@ -24,15 +24,15 @@ describe('CLNetworkInfoComponent', () => {
strictStateImmutability: false,
strictActionImmutability: false
}
}),
})
],
providers: [
CommonService,
{ provide: LoggerService, useClass: mockLoggerService },
{ provide: DataService, useClass: mockDataService }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -48,5 +48,4 @@ describe('CLNetworkInfoComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -19,9 +19,10 @@ import * as fromRTLReducer from '../../store/rtl.reducers';
styleUrls: ['./network-info.component.scss']
})
export class CLNetworkInfoComponent implements OnInit, OnDestroy {
public faBolt = faBolt;
public faServer = faServer;
public faNetworkWired = faNetworkWired;
public faNetworkWired = faNetworkWired;
public selNode: SelNodeChild = {};
public information: GetInfo = {};
public fees: Fees;
@ -35,12 +36,12 @@ export class CLNetworkInfoComponent implements OnInit, OnDestroy {
public userPersonaEnum = UserPersonaEnum;
public errorMessages = ['', '', '', '', '', '', ''];
public apisCallStatus: ApiCallsListCL = null;
public apiCallStatusEnum = APICallStatusEnum;
public apiCallStatusEnum = APICallStatusEnum;
private unSubs: Array<Subject<void>> = [new Subject()];
constructor(private logger: LoggerService, private commonService: CommonService, private store: Store<fromRTLReducer.RTLState>) {
this.screenSize = this.commonService.getScreenSize();
if(this.screenSize === ScreenSizeEnum.XS) {
if (this.screenSize === ScreenSizeEnum.XS) {
this.nodeCardsMerchant = [
{ id: 'node', icon: this.faServer, title: 'Node Information', cols: 6, rows: 3 },
{ id: 'status', icon: this.faNetworkWired, title: 'Channels', cols: 6, rows: 3 },
@ -68,59 +69,60 @@ export class CLNetworkInfoComponent implements OnInit, OnDestroy {
}
ngOnInit() {
this.store.select('cl')
.pipe(takeUntil(this.unSubs[0]))
.subscribe((rtlStore) => {
this.errorMessages = ['', '', '', '', '', '', ''];
this.apisCallStatus = rtlStore.apisCallStatus;
if (rtlStore.apisCallStatus.FetchInfo.status === APICallStatusEnum.ERROR) {
this.errorMessages[0] = (typeof(this.apisCallStatus.FetchInfo.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchInfo.message) : this.apisCallStatus.FetchInfo.message;
}
if (rtlStore.apisCallStatus.FetchFees.status === APICallStatusEnum.ERROR) {
this.errorMessages[1] = (typeof(this.apisCallStatus.FetchFees.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFees.message) : this.apisCallStatus.FetchFees.message;
}
if (rtlStore.apisCallStatus.FetchLocalRemoteBalance.status === APICallStatusEnum.ERROR) {
this.errorMessages[2] = (typeof(this.apisCallStatus.FetchLocalRemoteBalance.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchLocalRemoteBalance.message) : this.apisCallStatus.FetchLocalRemoteBalance.message;
}
if (rtlStore.apisCallStatus.FetchChannels.status === APICallStatusEnum.ERROR) {
this.errorMessages[3] = (typeof(this.apisCallStatus.FetchChannels.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchChannels.message) : this.apisCallStatus.FetchChannels.message;
}
if (rtlStore.apisCallStatus.GetForwardingHistory.status === APICallStatusEnum.ERROR) {
this.errorMessages[4] = (typeof(this.apisCallStatus.GetForwardingHistory.message) === 'object') ? JSON.stringify(this.apisCallStatus.GetForwardingHistory.message) : this.apisCallStatus.GetForwardingHistory.message;
}
if (rtlStore.apisCallStatus.FetchFeeRatesperkb.status === APICallStatusEnum.ERROR) {
this.errorMessages[5] = (typeof(this.apisCallStatus.FetchFeeRatesperkb.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFeeRatesperkb.message) : this.apisCallStatus.FetchFeeRatesperkb.message;
}
if (rtlStore.apisCallStatus.FetchFeeRatesperkw.status === APICallStatusEnum.ERROR) {
this.errorMessages[6] = (typeof(this.apisCallStatus.FetchFeeRatesperkw.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFeeRatesperkw.message) : this.apisCallStatus.FetchFeeRatesperkw.message;
}
this.store.select('cl').
pipe(takeUntil(this.unSubs[0])).
subscribe((rtlStore) => {
this.errorMessages = ['', '', '', '', '', '', ''];
this.apisCallStatus = rtlStore.apisCallStatus;
if (rtlStore.apisCallStatus.FetchInfo.status === APICallStatusEnum.ERROR) {
this.errorMessages[0] = (typeof (this.apisCallStatus.FetchInfo.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchInfo.message) : this.apisCallStatus.FetchInfo.message;
}
if (rtlStore.apisCallStatus.FetchFees.status === APICallStatusEnum.ERROR) {
this.errorMessages[1] = (typeof (this.apisCallStatus.FetchFees.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFees.message) : this.apisCallStatus.FetchFees.message;
}
if (rtlStore.apisCallStatus.FetchLocalRemoteBalance.status === APICallStatusEnum.ERROR) {
this.errorMessages[2] = (typeof (this.apisCallStatus.FetchLocalRemoteBalance.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchLocalRemoteBalance.message) : this.apisCallStatus.FetchLocalRemoteBalance.message;
}
if (rtlStore.apisCallStatus.FetchChannels.status === APICallStatusEnum.ERROR) {
this.errorMessages[3] = (typeof (this.apisCallStatus.FetchChannels.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchChannels.message) : this.apisCallStatus.FetchChannels.message;
}
if (rtlStore.apisCallStatus.GetForwardingHistory.status === APICallStatusEnum.ERROR) {
this.errorMessages[4] = (typeof (this.apisCallStatus.GetForwardingHistory.message) === 'object') ? JSON.stringify(this.apisCallStatus.GetForwardingHistory.message) : this.apisCallStatus.GetForwardingHistory.message;
}
if (rtlStore.apisCallStatus.FetchFeeRatesperkb.status === APICallStatusEnum.ERROR) {
this.errorMessages[5] = (typeof (this.apisCallStatus.FetchFeeRatesperkb.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFeeRatesperkb.message) : this.apisCallStatus.FetchFeeRatesperkb.message;
}
if (rtlStore.apisCallStatus.FetchFeeRatesperkw.status === APICallStatusEnum.ERROR) {
this.errorMessages[6] = (typeof (this.apisCallStatus.FetchFeeRatesperkw.message) === 'object') ? JSON.stringify(this.apisCallStatus.FetchFeeRatesperkw.message) : this.apisCallStatus.FetchFeeRatesperkw.message;
}
this.selNode = rtlStore.nodeSettings;
this.information = rtlStore.information;
this.fees = rtlStore.fees;
this.fees.totalTxCount = 0;
this.selNode = rtlStore.nodeSettings;
this.information = rtlStore.information;
this.fees = rtlStore.fees;
this.fees.totalTxCount = 0;
if (rtlStore.forwardingHistory && rtlStore.forwardingHistory.forwarding_events && rtlStore.forwardingHistory.forwarding_events.length) {
this.fees.totalTxCount = rtlStore.forwardingHistory.forwarding_events.filter(event => event.status === 'settled').length
}
if (rtlStore.forwardingHistory && rtlStore.forwardingHistory.forwarding_events && rtlStore.forwardingHistory.forwarding_events.length) {
this.fees.totalTxCount = rtlStore.forwardingHistory.forwarding_events.filter((event) => event.status === 'settled').length;
}
this.channelsStatus = {
active: { channels: rtlStore.information.num_active_channels, capacity: 0 },
inactive: { channels: rtlStore.information.num_inactive_channels, capacity: 0 },
pending: { channels: rtlStore.information.num_pending_channels, capacity: 0 }
};
this.channelsStatus = {
active: { channels: rtlStore.information.num_active_channels, capacity: 0 },
inactive: { channels: rtlStore.information.num_inactive_channels, capacity: 0 },
pending: { channels: rtlStore.information.num_pending_channels, capacity: 0 }
};
this.feeRatesPerKB = rtlStore.feeRatesPerKB;
this.feeRatesPerKW = rtlStore.feeRatesPerKW;
this.feeRatesPerKB = rtlStore.feeRatesPerKB;
this.feeRatesPerKW = rtlStore.feeRatesPerKW;
this.logger.info(rtlStore);
});
this.logger.info(rtlStore);
});
}
ngOnDestroy() {
this.unSubs.forEach(completeSub => {
this.unSubs.forEach((completeSub) => {
completeSub.next(null);
completeSub.complete();
});
}
}

@ -15,7 +15,7 @@ describe('CLOnChainReceiveComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLOnChainReceiveComponent ],
declarations: [CLOnChainReceiveComponent],
imports: [
BrowserAnimationsModule,
SharedModule,
@ -30,8 +30,8 @@ describe('CLOnChainReceiveComponent', () => {
providers: [
{ provide: CLEffects, useClass: mockCLEffects }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -47,5 +47,4 @@ describe('CLOnChainReceiveComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -16,6 +16,7 @@ import * as fromRTLReducer from '../../../store/rtl.reducers';
styleUrls: ['./on-chain-receive.component.scss']
})
export class CLOnChainReceiveComponent {
public addressTypes = ADDRESS_TYPES;
public selectedAddressType = ADDRESS_TYPES[0];
public newAddress = '';
@ -24,19 +25,19 @@ export class CLOnChainReceiveComponent {
onGenerateAddress() {
this.store.dispatch(new CLActions.GetNewAddress(this.selectedAddressType));
this.clEffects.setNewAddressCL
.pipe(take(1))
.subscribe(newAddress => {
this.newAddress = newAddress;
this.store.dispatch(new RTLActions.OpenAlert({
width: '58%',
data: {
address: this.newAddress,
addressType: this.selectedAddressType.addressTp,
component: OnChainGeneratedAddressComponent
}
}));
});
this.clEffects.setNewAddressCL.
pipe(take(1)).
subscribe((newAddress) => {
this.newAddress = newAddress;
this.store.dispatch(new RTLActions.OpenAlert({
width: '58%',
data: {
address: this.newAddress,
addressType: this.selectedAddressType.addressTp,
component: OnChainGeneratedAddressComponent
}
}));
});
}
}

@ -20,8 +20,8 @@ describe('CLOnChainSendModalComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLOnChainSendModalComponent ],
imports: [
declarations: [CLOnChainSendModalComponent],
imports: [
BrowserAnimationsModule,
SharedModule,
StoreModule.forRoot(RTLReducer, {
@ -32,7 +32,7 @@ describe('CLOnChainSendModalComponent', () => {
}),
EffectsModule.forRoot([mockRTLEffects, mockLNDEffects, mockCLEffects, mockECLEffects])
],
providers: [
providers: [
CommonService,
{ provide: LoggerService, useClass: mockLoggerService },
{ provide: DataService, useClass: mockDataService },
@ -40,8 +40,8 @@ describe('CLOnChainSendModalComponent', () => {
{ provide: MAT_DIALOG_DATA, useValue: { sweepAll: true } },
{ provide: RTLEffects, useClass: mockRTLEffects }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -57,5 +57,4 @@ describe('CLOnChainSendModalComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -7,14 +7,13 @@ import { Store } from '@ngrx/store';
import { Actions } from '@ngrx/effects';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatVerticalStepper } from '@angular/material/stepper';
import { MatStepper } from '@angular/material/stepper';
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
import { SelNodeChild, GetInfoRoot } from '../../../shared/models/RTLconfig';
import { SelNodeChild, GetInfoRoot, RTLConfiguration } from '../../../shared/models/RTLconfig';
import { CLOnChainSendFunds } from '../../../shared/models/alertData';
import { GetInfo, Balance, OnChain, UTXO } from '../../../shared/models/clModels';
import { CURRENCY_UNITS, CurrencyUnitEnum, CURRENCY_UNIT_FORMATS, ADDRESS_TYPES, FEE_RATE_TYPES, APICallStatusEnum } from '../../../shared/services/consts-enums-functions';
import { RTLConfiguration } from '../../../shared/models/RTLconfig';
import { CommonService } from '../../../shared/services/common.service';
import { LoggerService } from '../../../shared/services/logger.service';
@ -31,9 +30,10 @@ import * as sha256 from 'sha256';
styleUrls: ['./on-chain-send-modal.component.scss']
})
export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
@ViewChild('form', { static: true }) form: any;
@ViewChild('formSweepAll', { static: false }) formSweepAll: any;
@ViewChild('stepper', { static: false }) stepper: MatVerticalStepper;
@ViewChild('form', { static: true }) form: any;
@ViewChild('formSweepAll', { static: false }) formSweepAll: any;
@ViewChild('stepper', { static: false }) stepper: MatStepper;
public faExclamationTriangle = faExclamationTriangle;
public sweepAll = false;
public selNode: SelNodeChild = {};
@ -67,11 +67,11 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
public confirmFormLabel = 'Confirm sweep';
public amountError = 'Amount is Required.';
passwordFormGroup: FormGroup;
sendFundFormGroup: FormGroup;
confirmFormGroup: FormGroup;
sendFundFormGroup: FormGroup;
confirmFormGroup: FormGroup;
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject(), new Subject(), new Subject()];
constructor(public dialogRef: MatDialogRef<CLOnChainSendModalComponent>, @Inject(MAT_DIALOG_DATA) public data: CLOnChainSendFunds, private logger: LoggerService, private store: Store<fromRTLReducer.RTLState>, private commonService: CommonService, private decimalPipe: DecimalPipe, private actions: Actions, private formBuilder: FormBuilder, private rtlEffects: RTLEffects, private snackBar: MatSnackBar) {}
constructor(public dialogRef: MatDialogRef<CLOnChainSendModalComponent>, @Inject(MAT_DIALOG_DATA) public data: CLOnChainSendFunds, private logger: LoggerService, private store: Store<fromRTLReducer.RTLState>, private commonService: CommonService, private decimalPipe: DecimalPipe, private actions: Actions, private formBuilder: FormBuilder, private rtlEffects: RTLEffects, private snackBar: MatSnackBar) { }
ngOnInit() {
this.sweepAll = this.data.sweepAll;
@ -83,10 +83,10 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
transactionAddress: ['', Validators.required],
transactionFeeRate: [null],
flgMinConf: [false],
transactionBlocks: [{value: null, disabled: true}]
transactionBlocks: [{ value: null, disabled: true }]
});
this.confirmFormGroup = this.formBuilder.group({});
this.sendFundFormGroup.controls.flgMinConf.valueChanges.pipe(takeUntil(this.unSubs[4])).subscribe(flg => {
this.confirmFormGroup = this.formBuilder.group({});
this.sendFundFormGroup.controls.flgMinConf.valueChanges.pipe(takeUntil(this.unSubs[4])).subscribe((flg) => {
if (flg) {
this.sendFundFormGroup.controls.transactionBlocks.enable();
this.sendFundFormGroup.controls.transactionBlocks.setValidators([Validators.required]);
@ -102,63 +102,65 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
this.sendFundFormGroup.controls.transactionFeeRate.setValue(null);
}
});
combineLatest(
this.store.select('root'),
this.store.select('cl'))
.pipe(takeUntil(this.unSubs[0]))
.subscribe(([rootStore, rtlStore]) => {
this.fiatConversion = rootStore.selNode.settings.fiatConversion;
this.amountUnits = rootStore.selNode.settings.currencyUnits;
this.appConfig = rootStore.appConfig;
this.nodeData = rootStore.nodeData;
this.information = rtlStore.information;
this.isCompatibleVersion =
this.commonService.isVersionCompatible(this.information.version, '0.9.0')
&& this.commonService.isVersionCompatible(this.information.api_version, '0.4.0');
this.utxos = this.commonService.sortAscByKey(rtlStore.utxos.filter(utxo => utxo.status === 'confirmed'), 'value');
this.logger.info(rootStore);
this.logger.info(rtlStore);
});
this.actions.pipe(takeUntil(this.unSubs[1]),
filter(action => action.type === CLActions.UPDATE_API_CALL_STATUS_CL || action.type === CLActions.SET_CHANNEL_TRANSACTION_RES_CL))
.subscribe((action: CLActions.UpdateAPICallStatus | CLActions.SetChannelTransactionRes) => {
if (action.type === CLActions.SET_CHANNEL_TRANSACTION_RES_CL) {
this.store.dispatch(new RTLActions.OpenSnackBar('Fund Sent Successfully!'));
this.dialogRef.close();
}
if (action.type === CLActions.UPDATE_API_CALL_STATUS_CL && action.payload.status === APICallStatusEnum.ERROR && action.payload.action === 'SetChannelTransaction') {
this.sendFundError = action.payload.message;
}
});
combineLatest([this.store.select('root'), this.store.select('cl')]).
pipe(takeUntil(this.unSubs[0])).
subscribe(([rootStore, rtlStore]) => {
this.fiatConversion = rootStore.selNode.settings.fiatConversion;
this.amountUnits = rootStore.selNode.settings.currencyUnits;
this.appConfig = rootStore.appConfig;
this.nodeData = rootStore.nodeData;
this.information = rtlStore.information;
this.isCompatibleVersion =
this.commonService.isVersionCompatible(this.information.version, '0.9.0') &&
this.commonService.isVersionCompatible(this.information.api_version, '0.4.0');
this.utxos = this.commonService.sortAscByKey(rtlStore.utxos.filter((utxo) => utxo.status === 'confirmed'), 'value');
this.logger.info(rootStore);
this.logger.info(rtlStore);
});
this.actions.pipe(
takeUntil(this.unSubs[1]),
filter((action) => action.type === CLActions.UPDATE_API_CALL_STATUS_CL || action.type === CLActions.SET_CHANNEL_TRANSACTION_RES_CL)).
subscribe((action: CLActions.UpdateAPICallStatus | CLActions.SetChannelTransactionRes) => {
if (action.type === CLActions.SET_CHANNEL_TRANSACTION_RES_CL) {
this.store.dispatch(new RTLActions.OpenSnackBar('Fund Sent Successfully!'));
this.dialogRef.close();
}
if (action.type === CLActions.UPDATE_API_CALL_STATUS_CL && action.payload.status === APICallStatusEnum.ERROR && action.payload.action === 'SetChannelTransaction') {
this.sendFundError = action.payload.message;
}
});
}
onAuthenticate():boolean|void {
if (!this.passwordFormGroup.controls.password.value) { return true; }
onAuthenticate(): boolean | void {
if (!this.passwordFormGroup.controls.password.value) {
return true;
}
this.flgValidated = false;
this.store.dispatch(new RTLActions.IsAuthorized(sha256(this.passwordFormGroup.controls.password.value)));
this.rtlEffects.isAuthorizedRes
.pipe(take(1))
.subscribe(authRes => {
if (authRes !== 'ERROR') {
this.passwordFormGroup.controls.hiddenPassword.setValue(this.passwordFormGroup.controls.password.value);
this.stepper.next();
} else {
this.dialogRef.close();
this.snackBar.open('Unauthorized User. Logging out from RTL.');
}
});
this.rtlEffects.isAuthorizedRes.
pipe(take(1)).
subscribe((authRes) => {
if (authRes !== 'ERROR') {
this.passwordFormGroup.controls.hiddenPassword.setValue(this.passwordFormGroup.controls.password.value);
this.stepper.next();
} else {
this.dialogRef.close();
this.snackBar.open('Unauthorized User. Logging out from RTL.');
}
});
}
onSendFunds():boolean|void {
if(this.invalidValues) { return true; }
onSendFunds(): boolean | void {
if (this.invalidValues) {
return true;
}
this.sendFundError = '';
if (this.flgUseAllBalance) {
this.transaction.satoshis = 'all';
}
if (this.selUTXOs.length && this.selUTXOs.length > 0) {
this.transaction.utxos = [];
this.selUTXOs.forEach(utxo => this.transaction.utxos.push(utxo.txid + ':' + utxo.output));
this.selUTXOs.forEach((utxo) => this.transaction.utxos.push(utxo.txid + ':' + utxo.output));
}
if (this.sweepAll) {
this.transaction.satoshis = 'all';
@ -177,18 +179,20 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
delete this.transaction.utxos;
this.store.dispatch(new CLActions.SetChannelTransaction(this.transaction));
} else {
if(this.transaction.satoshis && this.transaction.satoshis !== 'all' && this.selAmountUnit !== CurrencyUnitEnum.SATS) {
this.commonService.convertCurrency(+this.transaction.satoshis, this.selAmountUnit === this.amountUnits[2] ? CurrencyUnitEnum.OTHER : this.selAmountUnit, CurrencyUnitEnum.SATS, this.amountUnits[2], this.fiatConversion)
.pipe(takeUntil(this.unSubs[2]))
.subscribe(data => {
this.transaction.satoshis = data[CurrencyUnitEnum.SATS];
this.selAmountUnit = CurrencyUnitEnum.SATS;
this.store.dispatch(new CLActions.SetChannelTransaction(this.transaction));
}, err => {
this.transaction.satoshis = null;
this.selAmountUnit = CurrencyUnitEnum.SATS;
this.amountError = 'Conversion Error: ' + (err.error && err.error.error && err.error.error.error ? err.error.error.error : err.error && err.error.error ? err.error.error : err.error ? err.error : 'Currency Conversion Error');
});
if (this.transaction.satoshis && this.transaction.satoshis !== 'all' && this.selAmountUnit !== CurrencyUnitEnum.SATS) {
this.commonService.convertCurrency(+this.transaction.satoshis, this.selAmountUnit === this.amountUnits[2] ? CurrencyUnitEnum.OTHER : this.selAmountUnit, CurrencyUnitEnum.SATS, this.amountUnits[2], this.fiatConversion).
pipe(takeUntil(this.unSubs[2])).
subscribe({
next: (data) => {
this.transaction.satoshis = data[CurrencyUnitEnum.SATS];
this.selAmountUnit = CurrencyUnitEnum.SATS;
this.store.dispatch(new CLActions.SetChannelTransaction(this.transaction));
}, error: (err) => {
this.transaction.satoshis = null;
this.selAmountUnit = CurrencyUnitEnum.SATS;
this.amountError = 'Conversion Error: ' + err;
}
});
} else {
this.store.dispatch(new CLActions.SetChannelTransaction(this.transaction));
}
@ -199,14 +203,14 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
if (this.sweepAll) {
return (!this.sendFundFormGroup.controls.transactionAddress.value || this.sendFundFormGroup.controls.transactionAddress.value === '') || (this.sendFundFormGroup.controls.flgMinConf.value && (!this.sendFundFormGroup.controls.transactionBlocks.value || this.sendFundFormGroup.controls.transactionBlocks.value <= 0));
} else {
return (!this.transaction.address || this.transaction.address === '')
|| ((!this.transaction.satoshis || +this.transaction.satoshis <= 0))
|| (this.flgMinConf && (!this.transaction.minconf || this.transaction.minconf <= 0));
return (!this.transaction.address || this.transaction.address === '') ||
((!this.transaction.satoshis || +this.transaction.satoshis <= 0)) ||
(this.flgMinConf && (!this.transaction.minconf || this.transaction.minconf <= 0));
}
}
resetData() {
this.sendFundError = '';
this.sendFundError = '';
this.transaction = {};
this.flgMinConf = false;
this.totalSelectedUTXOAmount = null;
@ -220,36 +224,43 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
switch (event.selectedIndex) {
case 0:
this.passwordFormLabel = 'Authenticate with your RTL password';
this.sendFundFormLabel = 'Sweep funds'
this.sendFundFormLabel = 'Sweep funds';
break;
case 1:
this.passwordFormLabel = 'User authenticated successfully';
this.sendFundFormLabel = 'Sweep funds'
this.sendFundFormLabel = 'Sweep funds';
break;
case 2:
this.passwordFormLabel = 'User authenticated successfully';
this.sendFundFormLabel = 'Sweep funds | Address: ' + this.sendFundFormGroup.controls.transactionAddress.value + (this.sendFundFormGroup.controls.flgMinConf.value ? (' | Min Confirmation Blocks: ' + this.sendFundFormGroup.controls.transactionBlocks.value) : (this.sendFundFormGroup.controls.transactionFeeRate.value ? (' | Fee Rate: ' + this.feeRateTypes.find(frType => frType.feeRateId === this.sendFundFormGroup.controls.transactionFeeRate.value).feeRateType) : ''));
this.sendFundFormLabel = 'Sweep funds | Address: ' + this.sendFundFormGroup.controls.transactionAddress.value +
(this.sendFundFormGroup.controls.flgMinConf.value ? (' | Min Confirmation Blocks: ' + this.sendFundFormGroup.controls.transactionBlocks.value) : (this.sendFundFormGroup.controls.transactionFeeRate.value ? (' | Fee Rate: ' +
this.feeRateTypes.find((frType) => frType.feeRateId === this.sendFundFormGroup.controls.transactionFeeRate.value).feeRateType) : ''));
break;
default:
this.passwordFormLabel = 'Authenticate with your RTL password';
this.sendFundFormLabel = 'Sweep funds'
this.sendFundFormLabel = 'Sweep funds';
break;
}
if (event.selectedIndex < event.previouslySelectedIndex) {
if (event.selectedIndex === 0) {
this.passwordFormGroup.controls.hiddenPassword.setValue('');
}
}
}
}
onUTXOSelectionChange(event: any) {
let utxoNew = {value: 0};
const utxoNew = { value: 0 };
if (this.selUTXOs.length && this.selUTXOs.length > 0) {
this.totalSelectedUTXOAmount = this.selUTXOs.reduce((a, b) => {utxoNew.value = a.value + b.value; return utxoNew;}).value;
if (this.flgUseAllBalance) { this.onUTXOAllBalanceChange(); }
this.totalSelectedUTXOAmount = this.selUTXOs.reduce((a, b) => {
utxoNew.value = a.value + b.value;
return utxoNew;
}).value;
if (this.flgUseAllBalance) {
this.onUTXOAllBalanceChange();
}
} else {
this.totalSelectedUTXOAmount = null;
this.transaction.satoshis = null;
@ -267,23 +278,25 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
}
onAmountUnitChange(event: any) {
let self = this;
let prevSelectedUnit = (this.selAmountUnit === this.amountUnits[2]) ? CurrencyUnitEnum.OTHER : this.selAmountUnit;
const self = this;
const prevSelectedUnit = (this.selAmountUnit === this.amountUnits[2]) ? CurrencyUnitEnum.OTHER : this.selAmountUnit;
let currSelectedUnit = event.value === this.amountUnits[2] ? CurrencyUnitEnum.OTHER : event.value;
if(this.transaction.satoshis && this.selAmountUnit !== event.value) {
this.commonService.convertCurrency(+this.transaction.satoshis, prevSelectedUnit, currSelectedUnit, this.amountUnits[2], this.fiatConversion)
.pipe(takeUntil(this.unSubs[3]))
.subscribe(data => {
this.selAmountUnit = event.value;
self.transaction.satoshis = self.decimalPipe.transform(data[currSelectedUnit], self.currencyUnitFormats[currSelectedUnit]).replace(/,/g, '');
}, err => {
self.transaction.satoshis = null;
this.amountError = 'Conversion Error: ' + (err.error && err.error.error && err.error.error.error ? err.error.error.error : err.error && err.error.error ? err.error.error : err.error ? err.error : 'Currency Conversion Error');
this.selAmountUnit = prevSelectedUnit;
currSelectedUnit = prevSelectedUnit;
});
if (this.transaction.satoshis && this.selAmountUnit !== event.value) {
this.commonService.convertCurrency(+this.transaction.satoshis, prevSelectedUnit, currSelectedUnit, this.amountUnits[2], this.fiatConversion).
pipe(takeUntil(this.unSubs[3])).
subscribe({
next: (data) => {
this.selAmountUnit = event.value;
self.transaction.satoshis = self.decimalPipe.transform(data[currSelectedUnit], self.currencyUnitFormats[currSelectedUnit]).replace(/,/g, '');
}, error: (err) => {
self.transaction.satoshis = null;
this.amountError = 'Conversion Error: ' + err;
this.selAmountUnit = prevSelectedUnit;
currSelectedUnit = prevSelectedUnit;
}
});
}
}
}
onAdvancedPanelToggle(isClosed: boolean) {
if (isClosed) {
@ -294,7 +307,7 @@ export class CLOnChainSendModalComponent implements OnInit, OnDestroy {
}
ngOnDestroy() {
this.unSubs.forEach(completeSub => {
this.unSubs.forEach((completeSub) => {
completeSub.next(null);
completeSub.complete();
});

@ -12,8 +12,8 @@ describe('CLOnChainSendComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLOnChainSendComponent ],
imports: [
declarations: [CLOnChainSendComponent],
imports: [
SharedModule,
RouterTestingModule,
StoreModule.forRoot(RTLReducer, {
@ -21,10 +21,10 @@ describe('CLOnChainSendComponent', () => {
strictStateImmutability: false,
strictActionImmutability: false
}
}),
]
})
.compileComponents();
})
]
}).
compileComponents();
}));
beforeEach(() => {
@ -40,5 +40,4 @@ describe('CLOnChainSendComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -15,24 +15,27 @@ import * as fromRTLReducer from '../../../store/rtl.reducers';
styleUrls: ['./on-chain-send.component.scss']
})
export class CLOnChainSendComponent implements OnInit, OnDestroy {
public sweepAll = false;
private unSubs: Array<Subject<void>> = [new Subject(), new Subject()];
constructor(private store: Store<fromRTLReducer.RTLState>, private activatedRoute: ActivatedRoute) {}
ngOnInit() {
this.activatedRoute.data.pipe(takeUntil(this.unSubs[0])).subscribe(routeData => this.sweepAll = routeData.sweepAll);
this.activatedRoute.data.pipe(takeUntil(this.unSubs[0])).subscribe((routeData) => {
this.sweepAll = routeData.sweepAll;
});
}
openSendFundsModal() {
this.store.dispatch(new RTLActions.OpenAlert({ data: {
this.store.dispatch(new RTLActions.OpenAlert({ data: {
sweepAll: this.sweepAll,
component: CLOnChainSendModalComponent
}}));
} }));
}
ngOnDestroy() {
this.unSubs.forEach(completeSub => {
this.unSubs.forEach((completeSub) => {
completeSub.next(null);
completeSub.complete();
});

@ -1,5 +1,5 @@
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from "@angular/router/testing";
import { RouterTestingModule } from '@angular/router/testing';
import { StoreModule } from '@ngrx/store';
import { SharedModule } from '../../shared/shared.module';
@ -21,8 +21,8 @@ describe('CLOnChainComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLOnChainComponent, CurrencyUnitConverterComponent, CLUTXOTablesComponent, CLOnChainUtxosComponent, CLOnChainSendComponent, CLOnChainReceiveComponent ],
imports: [
declarations: [CLOnChainComponent, CurrencyUnitConverterComponent, CLUTXOTablesComponent, CLOnChainUtxosComponent, CLOnChainSendComponent, CLOnChainReceiveComponent],
imports: [
BrowserAnimationsModule,
SharedModule,
RouterTestingModule,
@ -37,8 +37,8 @@ describe('CLOnChainComponent', () => {
CommonService,
{ provide: DataService, useClass: mockDataService }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -54,5 +54,4 @@ describe('CLOnChainComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

@ -16,50 +16,51 @@ import * as fromRTLReducer from '../../store/rtl.reducers';
styleUrls: ['./on-chain.component.scss']
})
export class CLOnChainComponent implements OnInit, OnDestroy {
public selNode: SelNodeChild = {};
public faExchangeAlt = faExchangeAlt;
public faChartPie = faChartPie;
public balances = [{title: 'Total Balance', dataValue: 0}, {title: 'Confirmed', dataValue: 0}, {title: 'Unconfirmed', dataValue: 0}];
public links = [{link: 'receive', name: 'Receive'}, {link: 'send', name: 'Send'}, {link: 'sweep', name: 'Sweep All'}];
public balances = [{ title: 'Total Balance', dataValue: 0 }, { title: 'Confirmed', dataValue: 0 }, { title: 'Unconfirmed', dataValue: 0 }];
public links = [{ link: 'receive', name: 'Receive' }, { link: 'send', name: 'Send' }, { link: 'sweep', name: 'Sweep All' }];
public activeLink = this.links[0].link;
public tables = [{id: 0, name: 'utxos'}, {id: 1, name: 'dustUtxos'}];
public tables = [{ id: 0, name: 'utxos' }, { id: 1, name: 'dustUtxos' }];
public selectedTable = this.tables[0];
private unSubs: Array<Subject<void>> = [new Subject(), new Subject(), new Subject(), new Subject()];
constructor(private store: Store<fromRTLReducer.RTLState>, private router: Router, private activatedRoute: ActivatedRoute) {}
ngOnInit() {
let linkFound = this.links.find(link => this.router.url.includes(link.link));
const linkFound = this.links.find((link) => this.router.url.includes(link.link));
this.activeLink = linkFound ? linkFound.link : this.links[0].link;
this.selectedTable = this.tables.find(table => table.name === this.router.url.substring(this.router.url.lastIndexOf('/') + 1));
this.router.events.pipe(takeUntil(this.unSubs[0]), filter(e => e instanceof ResolveEnd))
.subscribe((value: ResolveEnd) => {
let linkFound = this.links.find(link => value.urlAfterRedirects.includes(link.link));
this.activeLink = linkFound ? linkFound.link : this.links[0].link;
this.selectedTable = this.tables.find(table => table.name === value.urlAfterRedirects.substring(value.urlAfterRedirects.lastIndexOf('/') + 1));
});
this.store.select('cl')
.pipe(takeUntil(this.unSubs[1]))
.subscribe((rtlStore) => {
this.selNode = rtlStore.nodeSettings;
this.balances = [{title: 'Total Balance', dataValue: rtlStore.balance.totalBalance || 0}, {title: 'Confirmed', dataValue: rtlStore.balance.confBalance}, {title: 'Unconfirmed', dataValue: rtlStore.balance.unconfBalance}];
});
this.selectedTable = this.tables.find((table) => table.name === this.router.url.substring(this.router.url.lastIndexOf('/') + 1));
this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).
subscribe((value: ResolveEnd) => {
const linkFound = this.links.find((link) => value.urlAfterRedirects.includes(link.link));
this.activeLink = linkFound ? linkFound.link : this.links[0].link;
this.selectedTable = this.tables.find((table) => table.name === value.urlAfterRedirects.substring(value.urlAfterRedirects.lastIndexOf('/') + 1));
});
this.store.select('cl').
pipe(takeUntil(this.unSubs[1])).
subscribe((rtlStore) => {
this.selNode = rtlStore.nodeSettings;
this.balances = [{ title: 'Total Balance', dataValue: rtlStore.balance.totalBalance || 0 }, { title: 'Confirmed', dataValue: rtlStore.balance.confBalance }, { title: 'Unconfirmed', dataValue: rtlStore.balance.unconfBalance }];
});
}
openSendFundsModal(sweepAll: boolean) {
this.store.dispatch(new RTLActions.OpenAlert({ data: {
this.store.dispatch(new RTLActions.OpenAlert({ data: {
sweepAll: sweepAll,
component: CLOnChainSendModalComponent
}}));
} }));
}
onSelectedTableIndexChanged(event: number) {
this.selectedTable = this.tables.find(table => table.id === event);
this.router.navigate(['./', this.activeLink, this.selectedTable.name], {relativeTo: this.activatedRoute});
this.selectedTable = this.tables.find((table) => table.id === event);
this.router.navigate(['./', this.activeLink, this.selectedTable.name], { relativeTo: this.activatedRoute });
}
ngOnDestroy() {
this.unSubs.forEach(completeSub => {
this.unSubs.forEach((completeSub) => {
completeSub.next(null);
completeSub.complete();
});

@ -17,7 +17,7 @@ describe('CLUTXOTablesComponent', () => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ CLUTXOTablesComponent, CLOnChainUtxosComponent ],
declarations: [CLUTXOTablesComponent, CLOnChainUtxosComponent],
imports: [
BrowserAnimationsModule,
SharedModule,
@ -28,13 +28,13 @@ describe('CLUTXOTablesComponent', () => {
}
})
],
providers: [
providers: [
CommonService,
{ provide: LoggerService, useClass: mockLoggerService },
{ provide: DataService, useClass: mockDataService }
]
})
.compileComponents();
}).
compileComponents();
}));
beforeEach(() => {
@ -50,5 +50,4 @@ describe('CLUTXOTablesComponent', () => {
afterEach(() => {
TestBed.resetTestingModule();
});
});

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

Loading…
Cancel
Save