lnd: add aux data parser
This commit adds an optional data parser that can inspect and in-place format custom data of certain RPC messages. We don't add an implementation of the interface itself, as that will be provided by external components when packaging up lnd as a bundle with other software.
This commit is contained in:
4 files changed
+143
-5
No files matched your search
+60
-2
@@ -87,6 +87,7 @@ import (
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"gopkg.in/macaroon-bakery.v2/bakery"
|
||||
)
|
||||
|
||||
@@ -579,6 +580,17 @@ func MainRPCServerPermissions() map[string][]bakery.Op {
|
||||
}
|
||||
}
|
||||
|
||||
// AuxDataParser is an interface that is used to parse auxiliary custom data
|
||||
// within RPC messages. This is used to transform binary blobs to human-readable
|
||||
// JSON representations.
|
||||
type AuxDataParser interface {
|
||||
// InlineParseCustomData replaces any custom data binary blob in the
|
||||
// given RPC message with its corresponding JSON formatted data. This
|
||||
// transforms the binary (likely TLV encoded) data to a human-readable
|
||||
// JSON representation (still as byte slice).
|
||||
InlineParseCustomData(msg proto.Message) error
|
||||
}
|
||||
|
||||
// rpcServer is a gRPC, RPC front end to the lnd daemon.
|
||||
// TODO(roasbeef): pagination support for the list-style calls
|
||||
type rpcServer struct {
|
||||
@@ -731,6 +743,20 @@ func (r *rpcServer) addDeps(s *server, macService *macaroons.Service,
|
||||
},
|
||||
SetChannelAuto: s.chanStatusMgr.RequestAuto,
|
||||
UseStatusInitiated: subServerCgs.RouterRPC.UseStatusInitiated,
|
||||
ParseCustomChannelData: func(msg proto.Message) error {
|
||||
err = fn.MapOptionZ(
|
||||
r.server.implCfg.AuxDataParser,
|
||||
func(parser AuxDataParser) error {
|
||||
return parser.InlineParseCustomData(msg)
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing custom data: "+
|
||||
"%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
genInvoiceFeatures := func() *lnwire.FeatureVector {
|
||||
@@ -3596,7 +3622,7 @@ func (r *rpcServer) ChannelBalance(ctx context.Context,
|
||||
unsettledRemoteBalance, pendingOpenLocalBalance,
|
||||
pendingOpenRemoteBalance)
|
||||
|
||||
return &lnrpc.ChannelBalanceResponse{
|
||||
resp := &lnrpc.ChannelBalanceResponse{
|
||||
LocalBalance: &lnrpc.Amount{
|
||||
Sat: uint64(localBalance.ToSatoshis()),
|
||||
Msat: uint64(localBalance),
|
||||
@@ -3626,7 +3652,19 @@ func (r *rpcServer) ChannelBalance(ctx context.Context,
|
||||
// Deprecated fields.
|
||||
Balance: int64(localBalance.ToSatoshis()),
|
||||
PendingOpenBalance: int64(pendingOpenLocalBalance.ToSatoshis()),
|
||||
}, nil
|
||||
}
|
||||
|
||||
err = fn.MapOptionZ(
|
||||
r.server.implCfg.AuxDataParser,
|
||||
func(parser AuxDataParser) error {
|
||||
return parser.InlineParseCustomData(resp)
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error parsing custom data: %w", err)
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type (
|
||||
@@ -4068,6 +4106,16 @@ func (r *rpcServer) PendingChannels(ctx context.Context,
|
||||
resp.WaitingCloseChannels = waitingCloseChannels
|
||||
resp.TotalLimboBalance += limbo
|
||||
|
||||
err = fn.MapOptionZ(
|
||||
r.server.implCfg.AuxDataParser,
|
||||
func(parser AuxDataParser) error {
|
||||
return parser.InlineParseCustomData(resp)
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error parsing custom data: %w", err)
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
@@ -4382,6 +4430,16 @@ func (r *rpcServer) ListChannels(ctx context.Context,
|
||||
resp.Channels = append(resp.Channels, channel)
|
||||
}
|
||||
|
||||
err = fn.MapOptionZ(
|
||||
r.server.implCfg.AuxDataParser,
|
||||
func(parser AuxDataParser) error {
|
||||
return parser.InlineParseCustomData(resp)
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error parsing custom data: %w", err)
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user