lighting-app/backend/app.js

128 lines
3.2 KiB
JavaScript

const express = require('express');
const app = express();
const port = 3001;
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const fs = require('fs');
const path = require('path');
// const { Buffer } = 'buffer';
//// gRPC INITIALIZATION
// Due to updated ECDSA generated tls.cert we need to let gprc know that
// we need to use that cipher suite otherwise there will be a handhsake
// error when we communicate with the lnd rpc server.
process.env.GRPC_SSL_CIPHER_SUITES = 'HIGH+ECDSA';
// We need to give the proto loader some extra options, otherwise the code won't
// fully work with lnd.
const loaderOptions = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
const packageDefinition = protoLoader.loadSync(
'./proto/lighting.proto',
loaderOptions
);
// Load lnd macaroon
let m = fs.readFileSync(
'C:\\Users\\tserg\\.polar\\networks\\1\\volumes\\lnd\\bob\\data\\chain\\bitcoin\\regtest\\admin.macaroon'
);
let macaroon = m.toString('hex');
// Build meta data credentials
let metadata = new grpc.Metadata();
metadata.add('macaroon', macaroon);
let macaroonCreds = grpc.credentials.createFromMetadataGenerator(
(_args, callback) => {
callback(null, metadata);
}
);
// Combine credentials
let lndCert = fs.readFileSync(
'C:\\Users\\tserg\\.polar\\networks\\1\\volumes\\lnd\\bob\\tls.cert'
);
let sslCreds = grpc.credentials.createSsl(lndCert);
let credentials = grpc.credentials.combineChannelCredentials(
sslCreds,
macaroonCreds
);
// Create client
let lnrpcDescriptor = grpc.loadPackageDefinition(packageDefinition);
let lnrpc = lnrpcDescriptor.lnrpc;
let client = new lnrpc.Lightning('127.0.0.1:10002', credentials);
//// ROUTES
app.get('/', (req, res) => {
res.send('Kachow!');
});
app.get('/getinfo', function (req, res) {
client.getInfo({}, function (err, response) {
if (err) {
console.log('Error: ' + err);
}
res.json(response);
});
});
app.get('/generate-invoice/:source/:price', function (req, res) {
let request = {
value: req.params['price'],
memo: req.params['source'],
};
client.addInvoice(request, function (err, response) {
res.json(response);
});
});
app.get('/check-invoice/:payment_hash', function (req, res) {
let request = {
r_hash_str: req.params['payment_hash'],
};
client.lookupInvoice(request, function (err, response) {
if (err) {
console.log('Error: ' + err);
}
res.json(response);
});
});
app.get('/file/:source', function (req, res, next) {
console.log('/file/:source');
var options = {
dotfiles: 'deny',
headers: {
'x-timestamp': Date.now(),
'x-sent': true,
},
};
var fileName = path.join(path.join(__dirname, 'static'));
res.download(
path.join(__dirname, 'static', req.params['source']),
req.params['source'],
options,
function (err) {
if (err) {
next(err);
} else {
console.log('Sent:', fileName);
}
}
);
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});