Merge pull request #62 from shocknet/feature/lnd-sockets

LND Sockets added and refactored sockets functionality
This commit is contained in:
Daniel Lugo 2020-04-30 18:28:39 -04:00 committed by GitHub
commit 609c0f2b96
2 changed files with 62 additions and 45 deletions

View file

@ -207,17 +207,17 @@ const server = program => {
const CA = LightningServices.servicesConfig.lndCertPath const CA = LightningServices.servicesConfig.lndCertPath
const CA_KEY = CA.replace('cert', 'key') const CA_KEY = CA.replace('cert', 'key')
const createServer = async () => { const createServer = () => {
try { try {
if (LightningServices.servicesConfig.lndCertPath && program.usetls) { // if (LightningServices.servicesConfig.lndCertPath && program.usetls) {
const [key, cert] = await Promise.all([ // const [key, cert] = await Promise.all([
FS.readFile(CA_KEY), // FS.readFile(CA_KEY),
FS.readFile(CA) // FS.readFile(CA)
]) // ])
const httpsServer = Https.createServer({ key, cert }, app) // const httpsServer = Https.createServer({ key, cert }, app)
return httpsServer // return httpsServer
} // }
const httpServer = Http.Server(app) const httpServer = Http.Server(app)
return httpServer return httpServer
@ -236,7 +236,7 @@ const server = program => {
const io = require('socket.io')(serverInstance) const io = require('socket.io')(serverInstance)
const Sockets = require('./sockets')(io, lnd) const Sockets = require('./sockets')(io)
require('./routes')(app, defaults, Sockets, { require('./routes')(app, defaults, Sockets, {
serverHost: module.serverHost, serverHost: module.serverHost,

View file

@ -1,45 +1,59 @@
// app/sockets.js // app/sockets.js
const logger = require("winston"); const logger = require("winston");
const LightningServices = require("../utils/lightningServices");
module.exports = ( module.exports = (
/** @type {import('socket.io').Server} */ /** @type {import('socket.io').Server} */
io, io
lnd,
) => { ) => {
const Mediator = require("../services/gunDB/Mediator/index.js"); const Mediator = require("../services/gunDB/Mediator/index.js");
const EventEmitter = require("events");
const onNewInvoice = socket => {
class MySocketsEvents extends EventEmitter {} const { lightning } = LightningServices.services;
logger.warn("Subscribing to invoices socket...")
const mySocketsEvents = new MySocketsEvents(); const stream = lightning.subscribeInvoices({});
stream.on("data", data => {
// register the lnd invoices listener logger.info("[SOCKET] New invoice data:", data);
const registerLndInvoiceListener = socket => { socket.emit("invoice:new", data)
socket._invoiceListener = { })
dataReceived(data) { stream.on("end", () => {
socket.emit("invoice", data); logger.info("New invoice stream ended, starting a new one...")
onNewInvoice(socket);
})
stream.on("error", err => {
logger.error("New invoice stream error:", err);
})
stream.on("status", status => {
logger.error("New invoice stream status:", status);
if (status.code === 14) {
onNewInvoice(socket);
} }
}; })
lnd.registerInvoiceListener(socket._invoiceListener); }
};
// unregister the lnd invoices listener
const unregisterLndInvoiceListener = socket => {
lnd.unregisterInvoiceListener(socket._invoiceListener);
};
// register the socket listeners
const registerSocketListeners = socket => {
registerLndInvoiceListener(socket);
};
// unregister the socket listeners
const unregisterSocketListeners = socket => {
unregisterLndInvoiceListener(socket);
};
const onNewTransaction = socket => {
const { lightning } = LightningServices.services;
const stream = lightning.subscribeTransactions({});
logger.warn("Subscribing to transactions socket...")
stream.on("data", data => {
logger.info("[SOCKET] New transaction data:", data);
socket.emit("transaction:new", data)
})
stream.on("end", () => {
logger.info("New invoice stream ended, starting a new one...")
onNewTransaction(socket);
})
stream.on("error", err => {
logger.error("New invoice stream error:", err);
})
stream.on("status", status => {
logger.error("New invoice stream status:", status);
if (status.code === 14) {
onNewTransaction(socket);
}
})
}
io.on("connection", socket => { io.on("connection", socket => {
logger.info(`io.onconnection`) logger.info(`io.onconnection`)
@ -50,6 +64,7 @@ module.exports = (
logger.info("New socket client connected (id=" + socket.id + ")."); logger.info("New socket client connected (id=" + socket.id + ").");
const isOneTimeUseSocket = !!socket.handshake.query.IS_GUN_AUTH const isOneTimeUseSocket = !!socket.handshake.query.IS_GUN_AUTH
const isLNDSocket = !!socket.handshake.query.IS_LND_SOCKET
if (isOneTimeUseSocket) { if (isOneTimeUseSocket) {
logger.info('New socket is one time use') logger.info('New socket is one time use')
@ -78,15 +93,17 @@ module.exports = (
// this is where we create the websocket connection // this is where we create the websocket connection
// with the GunDB service. // with the GunDB service.
Mediator.createMediator(socket); Mediator.createMediator(socket);
registerSocketListeners(socket); if (isLNDSocket) {
onNewInvoice(socket);
onNewTransaction(socket);
}
/** listening if client has disconnected */ /** listening if client has disconnected */
socket.on("disconnect", () => { socket.on("disconnect", () => {
unregisterSocketListeners(socket);
logger.info("client disconnected (id=" + socket.id + ")."); logger.info("client disconnected (id=" + socket.id + ").");
}); });
} }
}) })
return mySocketsEvents; return io;
}; };