You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
2.0 KiB
57 lines
2.0 KiB
import grpc from 'grpc'
|
|
import config from '../config'
|
|
import { getDeadline, validateHost, createSslCreds, createMacaroonCreds } from './util'
|
|
|
|
// Default is ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384
|
|
// https://github.com/grpc/grpc/blob/master/doc/environment_variables.md
|
|
//
|
|
// Current LND cipher suites here:
|
|
// https://github.com/lightningnetwork/lnd/blob/master/lnd.go#L80
|
|
//
|
|
// We order the suites by priority, based on the recommendations provided by SSL Labs here:
|
|
// https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices#23-use-secure-cipher-suites
|
|
process.env.GRPC_SSL_CIPHER_SUITES =
|
|
process.env.GRPC_SSL_CIPHER_SUITES ||
|
|
[
|
|
'ECDHE-ECDSA-AES128-GCM-SHA256',
|
|
'ECDHE-ECDSA-AES256-GCM-SHA384',
|
|
'ECDHE-ECDSA-AES128-CBC-SHA256',
|
|
'ECDHE-ECDSA-CHACHA20-POLY1305'
|
|
].join(':')
|
|
|
|
/**
|
|
* Creates an LND grpc client lightning service.
|
|
* @returns {rpc.lnrpc.Lightning}
|
|
*/
|
|
const lightning = async () => {
|
|
const lndConfig = config.lnd()
|
|
const { host, rpcProtoPath, cert, macaroon } = lndConfig
|
|
|
|
// Verify that the host is valid before creating a gRPC client that is connected to it.
|
|
return await validateHost(host).then(async () => {
|
|
// Load the gRPC proto file.
|
|
const rpc = grpc.load(rpcProtoPath)
|
|
|
|
// Create ssl and macaroon credentials to use with the gRPC client.
|
|
const [sslCreds, macaroonCreds] = await Promise.all([
|
|
createSslCreds(cert),
|
|
createMacaroonCreds(macaroon)
|
|
])
|
|
const credentials = grpc.credentials.combineChannelCredentials(sslCreds, macaroonCreds)
|
|
|
|
// Create a new gRPC client instance.
|
|
const lnd = new rpc.lnrpc.Lightning(host, credentials)
|
|
|
|
// Call the getInfo method to ensure that we can make successful calls to the gRPC interface.
|
|
return new Promise((resolve, reject) => {
|
|
lnd.getInfo({}, { deadline: getDeadline(2) }, err => {
|
|
if (err) {
|
|
return reject(err)
|
|
}
|
|
return resolve(lnd)
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
export default lightning
|
|
|