074b2374b8
This commit contains the entire btcrpcclient repository along with several changes needed to move all of the files into the rpcclient directory in order to prepare it for merging. This does NOT update btcd or any of the other packages to use the new location as that will be done separately. - All import paths in the old btcrpcclient files have been changed to the new location - All references to btcrpcclient as the package name have been changed to rpcclient
285 lines
9.3 KiB
Go
285 lines
9.3 KiB
Go
// Copyright (c) 2014-2017 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package rpcclient
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/btcsuite/btcd/btcjson"
|
|
)
|
|
|
|
// AddNodeCommand enumerates the available commands that the AddNode function
|
|
// accepts.
|
|
type AddNodeCommand string
|
|
|
|
// Constants used to indicate the command for the AddNode function.
|
|
const (
|
|
// ANAdd indicates the specified host should be added as a persistent
|
|
// peer.
|
|
ANAdd AddNodeCommand = "add"
|
|
|
|
// ANRemove indicates the specified peer should be removed.
|
|
ANRemove AddNodeCommand = "remove"
|
|
|
|
// ANOneTry indicates the specified host should try to connect once,
|
|
// but it should not be made persistent.
|
|
ANOneTry AddNodeCommand = "onetry"
|
|
)
|
|
|
|
// String returns the AddNodeCommand in human-readable form.
|
|
func (cmd AddNodeCommand) String() string {
|
|
return string(cmd)
|
|
}
|
|
|
|
// FutureAddNodeResult is a future promise to deliver the result of an
|
|
// AddNodeAsync RPC invocation (or an applicable error).
|
|
type FutureAddNodeResult chan *response
|
|
|
|
// Receive waits for the response promised by the future and returns an error if
|
|
// any occurred when performing the specified command.
|
|
func (r FutureAddNodeResult) Receive() error {
|
|
_, err := receiveFuture(r)
|
|
return err
|
|
}
|
|
|
|
// AddNodeAsync returns an instance of a type that can be used to get the result
|
|
// of the RPC at some future time by invoking the Receive function on the
|
|
// returned instance.
|
|
//
|
|
// See AddNode for the blocking version and more details.
|
|
func (c *Client) AddNodeAsync(host string, command AddNodeCommand) FutureAddNodeResult {
|
|
cmd := btcjson.NewAddNodeCmd(host, btcjson.AddNodeSubCmd(command))
|
|
return c.sendCmd(cmd)
|
|
}
|
|
|
|
// AddNode attempts to perform the passed command on the passed persistent peer.
|
|
// For example, it can be used to add or a remove a persistent peer, or to do
|
|
// a one time connection to a peer.
|
|
//
|
|
// It may not be used to remove non-persistent peers.
|
|
func (c *Client) AddNode(host string, command AddNodeCommand) error {
|
|
return c.AddNodeAsync(host, command).Receive()
|
|
}
|
|
|
|
// FutureGetAddedNodeInfoResult is a future promise to deliver the result of a
|
|
// GetAddedNodeInfoAsync RPC invocation (or an applicable error).
|
|
type FutureGetAddedNodeInfoResult chan *response
|
|
|
|
// Receive waits for the response promised by the future and returns information
|
|
// about manually added (persistent) peers.
|
|
func (r FutureGetAddedNodeInfoResult) Receive() ([]btcjson.GetAddedNodeInfoResult, error) {
|
|
res, err := receiveFuture(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Unmarshal as an array of getaddednodeinfo result objects.
|
|
var nodeInfo []btcjson.GetAddedNodeInfoResult
|
|
err = json.Unmarshal(res, &nodeInfo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return nodeInfo, nil
|
|
}
|
|
|
|
// GetAddedNodeInfoAsync returns an instance of a type that can be used to get
|
|
// the result of the RPC at some future time by invoking the Receive function on
|
|
// the returned instance.
|
|
//
|
|
// See GetAddedNodeInfo for the blocking version and more details.
|
|
func (c *Client) GetAddedNodeInfoAsync(peer string) FutureGetAddedNodeInfoResult {
|
|
cmd := btcjson.NewGetAddedNodeInfoCmd(true, &peer)
|
|
return c.sendCmd(cmd)
|
|
}
|
|
|
|
// GetAddedNodeInfo returns information about manually added (persistent) peers.
|
|
//
|
|
// See GetAddedNodeInfoNoDNS to retrieve only a list of the added (persistent)
|
|
// peers.
|
|
func (c *Client) GetAddedNodeInfo(peer string) ([]btcjson.GetAddedNodeInfoResult, error) {
|
|
return c.GetAddedNodeInfoAsync(peer).Receive()
|
|
}
|
|
|
|
// FutureGetAddedNodeInfoNoDNSResult is a future promise to deliver the result
|
|
// of a GetAddedNodeInfoNoDNSAsync RPC invocation (or an applicable error).
|
|
type FutureGetAddedNodeInfoNoDNSResult chan *response
|
|
|
|
// Receive waits for the response promised by the future and returns a list of
|
|
// manually added (persistent) peers.
|
|
func (r FutureGetAddedNodeInfoNoDNSResult) Receive() ([]string, error) {
|
|
res, err := receiveFuture(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Unmarshal result as an array of strings.
|
|
var nodes []string
|
|
err = json.Unmarshal(res, &nodes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return nodes, nil
|
|
}
|
|
|
|
// GetAddedNodeInfoNoDNSAsync returns an instance of a type that can be used to
|
|
// get the result of the RPC at some future time by invoking the Receive
|
|
// function on the returned instance.
|
|
//
|
|
// See GetAddedNodeInfoNoDNS for the blocking version and more details.
|
|
func (c *Client) GetAddedNodeInfoNoDNSAsync(peer string) FutureGetAddedNodeInfoNoDNSResult {
|
|
cmd := btcjson.NewGetAddedNodeInfoCmd(false, &peer)
|
|
return c.sendCmd(cmd)
|
|
}
|
|
|
|
// GetAddedNodeInfoNoDNS returns a list of manually added (persistent) peers.
|
|
// This works by setting the dns flag to false in the underlying RPC.
|
|
//
|
|
// See GetAddedNodeInfo to obtain more information about each added (persistent)
|
|
// peer.
|
|
func (c *Client) GetAddedNodeInfoNoDNS(peer string) ([]string, error) {
|
|
return c.GetAddedNodeInfoNoDNSAsync(peer).Receive()
|
|
}
|
|
|
|
// FutureGetConnectionCountResult is a future promise to deliver the result
|
|
// of a GetConnectionCountAsync RPC invocation (or an applicable error).
|
|
type FutureGetConnectionCountResult chan *response
|
|
|
|
// Receive waits for the response promised by the future and returns the number
|
|
// of active connections to other peers.
|
|
func (r FutureGetConnectionCountResult) Receive() (int64, error) {
|
|
res, err := receiveFuture(r)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
// Unmarshal result as an int64.
|
|
var count int64
|
|
err = json.Unmarshal(res, &count)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return count, nil
|
|
}
|
|
|
|
// GetConnectionCountAsync returns an instance of a type that can be used to get
|
|
// the result of the RPC at some future time by invoking the Receive function on
|
|
// the returned instance.
|
|
//
|
|
// See GetConnectionCount for the blocking version and more details.
|
|
func (c *Client) GetConnectionCountAsync() FutureGetConnectionCountResult {
|
|
cmd := btcjson.NewGetConnectionCountCmd()
|
|
return c.sendCmd(cmd)
|
|
}
|
|
|
|
// GetConnectionCount returns the number of active connections to other peers.
|
|
func (c *Client) GetConnectionCount() (int64, error) {
|
|
return c.GetConnectionCountAsync().Receive()
|
|
}
|
|
|
|
// FuturePingResult is a future promise to deliver the result of a PingAsync RPC
|
|
// invocation (or an applicable error).
|
|
type FuturePingResult chan *response
|
|
|
|
// Receive waits for the response promised by the future and returns the result
|
|
// of queueing a ping to be sent to each connected peer.
|
|
func (r FuturePingResult) Receive() error {
|
|
_, err := receiveFuture(r)
|
|
return err
|
|
}
|
|
|
|
// PingAsync returns an instance of a type that can be used to get the result of
|
|
// the RPC at some future time by invoking the Receive function on the returned
|
|
// instance.
|
|
//
|
|
// See Ping for the blocking version and more details.
|
|
func (c *Client) PingAsync() FuturePingResult {
|
|
cmd := btcjson.NewPingCmd()
|
|
return c.sendCmd(cmd)
|
|
}
|
|
|
|
// Ping queues a ping to be sent to each connected peer.
|
|
//
|
|
// Use the GetPeerInfo function and examine the PingTime and PingWait fields to
|
|
// access the ping times.
|
|
func (c *Client) Ping() error {
|
|
return c.PingAsync().Receive()
|
|
}
|
|
|
|
// FutureGetPeerInfoResult is a future promise to deliver the result of a
|
|
// GetPeerInfoAsync RPC invocation (or an applicable error).
|
|
type FutureGetPeerInfoResult chan *response
|
|
|
|
// Receive waits for the response promised by the future and returns data about
|
|
// each connected network peer.
|
|
func (r FutureGetPeerInfoResult) Receive() ([]btcjson.GetPeerInfoResult, error) {
|
|
res, err := receiveFuture(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Unmarshal result as an array of getpeerinfo result objects.
|
|
var peerInfo []btcjson.GetPeerInfoResult
|
|
err = json.Unmarshal(res, &peerInfo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return peerInfo, nil
|
|
}
|
|
|
|
// GetPeerInfoAsync returns an instance of a type that can be used to get the
|
|
// result of the RPC at some future time by invoking the Receive function on the
|
|
// returned instance.
|
|
//
|
|
// See GetPeerInfo for the blocking version and more details.
|
|
func (c *Client) GetPeerInfoAsync() FutureGetPeerInfoResult {
|
|
cmd := btcjson.NewGetPeerInfoCmd()
|
|
return c.sendCmd(cmd)
|
|
}
|
|
|
|
// GetPeerInfo returns data about each connected network peer.
|
|
func (c *Client) GetPeerInfo() ([]btcjson.GetPeerInfoResult, error) {
|
|
return c.GetPeerInfoAsync().Receive()
|
|
}
|
|
|
|
// FutureGetNetTotalsResult is a future promise to deliver the result of a
|
|
// GetNetTotalsAsync RPC invocation (or an applicable error).
|
|
type FutureGetNetTotalsResult chan *response
|
|
|
|
// Receive waits for the response promised by the future and returns network
|
|
// traffic statistics.
|
|
func (r FutureGetNetTotalsResult) Receive() (*btcjson.GetNetTotalsResult, error) {
|
|
res, err := receiveFuture(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Unmarshal result as a getnettotals result object.
|
|
var totals btcjson.GetNetTotalsResult
|
|
err = json.Unmarshal(res, &totals)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &totals, nil
|
|
}
|
|
|
|
// GetNetTotalsAsync returns an instance of a type that can be used to get the
|
|
// result of the RPC at some future time by invoking the Receive function on the
|
|
// returned instance.
|
|
//
|
|
// See GetNetTotals for the blocking version and more details.
|
|
func (c *Client) GetNetTotalsAsync() FutureGetNetTotalsResult {
|
|
cmd := btcjson.NewGetNetTotalsCmd()
|
|
return c.sendCmd(cmd)
|
|
}
|
|
|
|
// GetNetTotals returns network traffic statistics.
|
|
func (c *Client) GetNetTotals() (*btcjson.GetNetTotalsResult, error) {
|
|
return c.GetNetTotalsAsync().Receive()
|
|
}
|