diff --git a/src/services/lnd/index.ts b/src/services/lnd/index.ts index 8e259b4a..51c610b7 100644 --- a/src/services/lnd/index.ts +++ b/src/services/lnd/index.ts @@ -5,36 +5,69 @@ import fs from 'fs' import { LightningClient } from '../../../proto/lnd/rpc.client' import { InvoicesClient } from '../../../proto/lnd/invoices.client' import { RouterClient } from '../../../proto/lnd/router.client' -import * as Types from '../../../proto/autogenerated/ts/types' -import { GetInfoRequest, GetInfoResponse } from '../../../proto/lnd/rpc' -const lndAddr = process.env.LND_ADDRESS; -const lndCertPath = process.env.LND_CERT_PATH; -const lndMacaroonPath = process.env.LND_MACAROON_PATH; -if (!lndAddr || !lndCertPath || !lndMacaroonPath) { - throw new Error(`Something missing from ADDR/TLS/MACAROON`); -} -const lndCert = fs.readFileSync(lndCertPath); -const macaroon = fs.readFileSync(lndMacaroonPath).toString('hex'); -const sslCreds = credentials.createSsl(lndCert); -const macaroonCreds = credentials.createFromMetadataGenerator( - function (args: any, callback: any) { - let metadata = new Metadata(); - metadata.add('macaroon', macaroon); - callback(null, metadata); - }, -); -const creds = credentials.combineChannelCredentials( - sslCreds, - macaroonCreds, -); -const transport = new GrpcTransport({ host: lndAddr, channelCredentials: creds }) -const lightning = new LightningClient(transport) -const invoices = new InvoicesClient(transport) -const router = new RouterClient(transport) +import { GetInfoResponse } from '../../../proto/lnd/rpc' const DefaultMetadata = (deadline = 10 * 1000) => ({ deadline: Date.now() + deadline }) +export default class { + lightning: LightningClient + invoices: InvoicesClient + router: RouterClient + constructor() { + const lndAddr = process.env.LND_ADDRESS; + const lndCertPath = process.env.LND_CERT_PATH; + const lndMacaroonPath = process.env.LND_MACAROON_PATH; + if (!lndAddr || !lndCertPath || !lndMacaroonPath) { + throw new Error(`Something missing from ADDR/TLS/MACAROON`); + } + const lndCert = fs.readFileSync(lndCertPath); + const macaroon = fs.readFileSync(lndMacaroonPath).toString('hex'); + const sslCreds = credentials.createSsl(lndCert); + const macaroonCreds = credentials.createFromMetadataGenerator( + function (args: any, callback: any) { + let metadata = new Metadata(); + metadata.add('macaroon', macaroon); + callback(null, metadata); + }, + ); + const creds = credentials.combineChannelCredentials( + sslCreds, + macaroonCreds, + ); + const transport = new GrpcTransport({ host: lndAddr, channelCredentials: creds }) + this.lightning = new LightningClient(transport) + this.invoices = new InvoicesClient(transport) + this.router = new RouterClient(transport) + } + async GetInfo(): Promise { + const res = await this.lightning.getInfo({}, DefaultMetadata()) + return res.response + } + async OpenChannel(destination: string, closeAddress: string, fundingAmount: number, pushSats) { + const stream = this.lightning.openChannel({ + nodePubkey: Buffer.from(destination, 'hex'), + closeAddress: closeAddress, + localFundingAmount: fundingAmount, + pushSats: pushSats, + sa: satPerByte + }) -export default { - getInfo: async (): Promise => (await lightning.getInfo({}, DefaultMetadata())).response + return new Promise(res => { + stream.on('data', response => { + if (response) { + res(true) + } + }) + stream.on('error', err => { + if (err) { + console.error("err") + console.error(err) + this.statusAll(true) + // move to next client after the refresh + .then(() => this.nextPreferredClient()) + res(false) + } + }) + }) + } } diff --git a/src/services/main/index.ts b/src/services/main/index.ts index edec917e..44b777d6 100644 --- a/src/services/main/index.ts +++ b/src/services/main/index.ts @@ -1,12 +1,25 @@ +import Storage from '../storage' import * as Types from '../../../proto/autogenerated/ts/types' -import lnd from '../lnd' -const methods: Types.ServerMethods = { - EncryptionExchange: async (ctx: Types.EncryptionExchange_Context, req: Types.EncryptionExchangeRequest): Promise => { }, - Health: async (ctx: Types.Health_Context): Promise => { }, - LndGetInfo: async (ctx: Types.LndGetInfo_Context): Promise => { - const info = await lnd.getInfo() - return { alias: info.alias } +import LND from '../lnd' +export default class { + storage: Storage + lnd: LND + constructor(storageHandler: Storage, lndHandler: LND) { + this.storage = storageHandler + this.lnd = lndHandler + } + async AddUser(req: Types.AddUserRequest): Promise { + const newUser = await this.storage.AddUser(req.name, req.callback_url, req.secret) + return { + user_id: newUser.user_id, + auth_token: "TMP" + } + } + async OpenChannel(req: Types.OpenChannelRequest): Promise { } -} -export default methods \ No newline at end of file + async PayInvoice(rootToken: string, invoice: string): Promise { return "" } + async GenerateInvoice(rootToken: string, amountSats: number): Promise { return "" } + async GenerateAddress(rootToken: string): Promise { return "" } + // payment received sub +} \ No newline at end of file