rpcserver: implement SubscribeChannels RPC call.
This commit is contained in:
parent
8b388b1301
commit
ff0339a186
83
rpcserver.go
83
rpcserver.go
@ -30,6 +30,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/autopilot"
|
"github.com/lightningnetwork/lnd/autopilot"
|
||||||
"github.com/lightningnetwork/lnd/build"
|
"github.com/lightningnetwork/lnd/build"
|
||||||
"github.com/lightningnetwork/lnd/channeldb"
|
"github.com/lightningnetwork/lnd/channeldb"
|
||||||
|
"github.com/lightningnetwork/lnd/channelnotifier"
|
||||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
"github.com/lightningnetwork/lnd/input"
|
||||||
"github.com/lightningnetwork/lnd/invoices"
|
"github.com/lightningnetwork/lnd/invoices"
|
||||||
@ -245,6 +246,10 @@ var (
|
|||||||
Entity: "offchain",
|
Entity: "offchain",
|
||||||
Action: "read",
|
Action: "read",
|
||||||
}},
|
}},
|
||||||
|
"/lnrpc.Lightning/SubscribeChannelEvents": {{
|
||||||
|
Entity: "offchain",
|
||||||
|
Action: "read",
|
||||||
|
}},
|
||||||
"/lnrpc.Lightning/ClosedChannels": {{
|
"/lnrpc.Lightning/ClosedChannels": {{
|
||||||
Entity: "offchain",
|
Entity: "offchain",
|
||||||
Action: "read",
|
Action: "read",
|
||||||
@ -2474,6 +2479,84 @@ func createRPCClosedChannel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SubscribeChannelEvents returns a uni-directional stream (server -> client)
|
||||||
|
// for notifying the client of newly active, inactive or closed channels.
|
||||||
|
func (r *rpcServer) SubscribeChannelEvents(req *lnrpc.ChannelEventSubscription,
|
||||||
|
updateStream lnrpc.Lightning_SubscribeChannelEventsServer) error {
|
||||||
|
|
||||||
|
channelEventSub, err := r.server.channelNotifier.SubscribeChannelEvents()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that the resources for the client is cleaned up once either
|
||||||
|
// the server, or client exits.
|
||||||
|
defer channelEventSub.Cancel()
|
||||||
|
|
||||||
|
graph := r.server.chanDB.ChannelGraph()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
// A new update has been sent by the channel router, we'll
|
||||||
|
// marshal it into the form expected by the gRPC client, then
|
||||||
|
// send it off to the client(s).
|
||||||
|
case e := <-channelEventSub.Updates():
|
||||||
|
var update *lnrpc.ChannelEventUpdate
|
||||||
|
switch event := e.(type) {
|
||||||
|
case channelnotifier.OpenChannelEvent:
|
||||||
|
channel := createRPCOpenChannel(r, graph,
|
||||||
|
event.Channel, true)
|
||||||
|
update = &lnrpc.ChannelEventUpdate{
|
||||||
|
Type: lnrpc.ChannelEventUpdate_OPEN_CHANNEL,
|
||||||
|
Channel: &lnrpc.ChannelEventUpdate_OpenChannel{
|
||||||
|
OpenChannel: channel,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case channelnotifier.ClosedChannelEvent:
|
||||||
|
closedChannel := createRPCClosedChannel(event.CloseSummary)
|
||||||
|
update = &lnrpc.ChannelEventUpdate{
|
||||||
|
Type: lnrpc.ChannelEventUpdate_CLOSED_CHANNEL,
|
||||||
|
Channel: &lnrpc.ChannelEventUpdate_ClosedChannel{
|
||||||
|
ClosedChannel: closedChannel,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case channelnotifier.ActiveChannelEvent:
|
||||||
|
update = &lnrpc.ChannelEventUpdate{
|
||||||
|
Type: lnrpc.ChannelEventUpdate_ACTIVE_CHANNEL,
|
||||||
|
Channel: &lnrpc.ChannelEventUpdate_ActiveChannel{
|
||||||
|
ActiveChannel: &lnrpc.ChannelPoint{
|
||||||
|
FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
|
||||||
|
FundingTxidBytes: event.ChannelPoint.Hash[:],
|
||||||
|
},
|
||||||
|
OutputIndex: event.ChannelPoint.Index,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case channelnotifier.InactiveChannelEvent:
|
||||||
|
update = &lnrpc.ChannelEventUpdate{
|
||||||
|
Type: lnrpc.ChannelEventUpdate_INACTIVE_CHANNEL,
|
||||||
|
Channel: &lnrpc.ChannelEventUpdate_InactiveChannel{
|
||||||
|
InactiveChannel: &lnrpc.ChannelPoint{
|
||||||
|
FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
|
||||||
|
FundingTxidBytes: event.ChannelPoint.Hash[:],
|
||||||
|
},
|
||||||
|
OutputIndex: event.ChannelPoint.Index,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unexpected channel event update: %v", event)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := updateStream.Send(update); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case <-r.quit:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// savePayment saves a successfully completed payment to the database for
|
// savePayment saves a successfully completed payment to the database for
|
||||||
// historical record keeping.
|
// historical record keeping.
|
||||||
func (r *rpcServer) savePayment(route *routing.Route,
|
func (r *rpcServer) savePayment(route *routing.Route,
|
||||||
|
Loading…
Reference in New Issue
Block a user