create client in interceptor startup

This commit is contained in:
Jesse de Wit
2022-11-21 14:23:33 +01:00
parent c57795643b
commit 68d7741d3a
4 changed files with 58 additions and 27 deletions

View File

@@ -7,6 +7,7 @@ import (
"io"
"log"
"os"
"sync"
"time"
sphinx "github.com/lightningnetwork/lightning-onion"
@@ -18,17 +19,19 @@ import (
type ClnHtlcInterceptor struct {
client *ClnClient
plugin *glightning.Plugin
initWg sync.WaitGroup
}
func NewClnHtlcInterceptor(client *ClnClient) *ClnHtlcInterceptor {
return &ClnHtlcInterceptor{
client: client,
}
func NewClnHtlcInterceptor() *ClnHtlcInterceptor {
i := &ClnHtlcInterceptor{}
i.initWg.Add(1)
return i
}
func (i *ClnHtlcInterceptor) Start() error {
//c-lightning plugin initiate
plugin := glightning.NewPlugin(onInit)
plugin := glightning.NewPlugin(i.onInit)
i.plugin = plugin
plugin.RegisterHooks(&glightning.Hooks{
HtlcAccepted: i.OnHtlcAccepted,
@@ -52,8 +55,25 @@ func (i *ClnHtlcInterceptor) Stop() error {
return nil
}
func onInit(plugin *glightning.Plugin, options map[string]glightning.Option, config *glightning.Config) {
func (i *ClnHtlcInterceptor) WaitStarted() LightningClient {
i.initWg.Wait()
return i.client
}
func (i *ClnHtlcInterceptor) onInit(plugin *glightning.Plugin, options map[string]glightning.Option, config *glightning.Config) {
log.Printf("successfully init'd! %v\n", config.RpcFile)
//lightning server
clientcln := glightning.NewLightning()
clientcln.SetTimeout(60)
clientcln.StartUp(config.RpcFile, config.LightningDir)
i.client = &ClnClient{
client: clientcln,
}
log.Printf("successfull clientcln.StartUp")
i.initWg.Done()
}
func (i *ClnHtlcInterceptor) OnHtlcAccepted(event *glightning.HtlcAcceptedEvent) (*glightning.HtlcAcceptedResponse, error) {
@@ -143,7 +163,8 @@ func (i *ClnHtlcInterceptor) resumeOrCancel(event *glightning.HtlcAcceptedEvent,
func encodePayloadWithNextHop(payloadHex string, channelId uint64) (string, error) {
payload, err := hex.DecodeString(payloadHex)
if err != nil {
log.Fatalf("failed to decode types %v", err)
log.Printf("failed to decode types. error: %v", err)
return "", err
}
bufReader := bytes.NewBuffer(payload)
var b [8]byte

View File

@@ -3,4 +3,5 @@ package main
type HtlcInterceptor interface {
Start() error
Stop() error
WaitStarted() LightningClient
}

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"log"
"os"
"sync"
"time"
"github.com/lightningnetwork/lnd/lnrpc"
@@ -17,17 +18,23 @@ import (
type LndHtlcInterceptor struct {
client *LndClient
stopRequested bool
initWg sync.WaitGroup
}
func NewLndHtlcInterceptor(client *LndClient) *LndHtlcInterceptor {
return &LndHtlcInterceptor{
client: client,
func NewLndHtlcInterceptor() *LndHtlcInterceptor {
i := &LndHtlcInterceptor{
client: NewLndClient(),
}
i.initWg.Add(1)
return i
}
func (i *LndHtlcInterceptor) Start() error {
go forwardingHistorySynchronize(i.client)
go channelsSynchronize(i.client)
i.initWg.Done()
return i.intercept()
}
@@ -36,6 +43,11 @@ func (i *LndHtlcInterceptor) Stop() error {
return nil
}
func (i *LndHtlcInterceptor) WaitStarted() LightningClient {
i.initWg.Wait()
return i.client
}
func (i *LndHtlcInterceptor) intercept() error {
for {
if i.stopRequested {

31
main.go
View File

@@ -37,30 +37,15 @@ func main() {
var interceptor HtlcInterceptor
if runCln {
c := NewClnClient("lightningrpc", ".")
client = c
interceptor = NewClnHtlcInterceptor(c)
interceptor = NewClnHtlcInterceptor()
}
if runLnd {
c := NewLndClient()
client = c
interceptor = NewLndHtlcInterceptor(c)
interceptor = NewLndHtlcInterceptor()
}
s := NewGrpcServer()
info, err := client.GetInfo()
if err != nil {
log.Fatalf("client.GetInfo() error: %v", err)
}
if nodeName == "" {
nodeName = info.Alias
}
if nodePubkey == "" {
nodePubkey = info.Pubkey
}
var wg sync.WaitGroup
wg.Add(2)
@@ -75,6 +60,18 @@ func main() {
wg.Done()
}()
client = interceptor.WaitStarted()
info, err := client.GetInfo()
if err != nil {
log.Fatalf("client.GetInfo() error: %v", err)
}
if nodeName == "" {
nodeName = info.Alias
}
if nodePubkey == "" {
nodePubkey = info.Pubkey
}
go func() {
err := s.Start()
if err == nil {