[NOD-323] Move rpc-client to separate package (#402)

This commit is contained in:
Svarog 2019-09-15 10:21:42 +03:00 committed by Ori Newman
parent 9647cb3e08
commit 90bda69931
3 changed files with 68 additions and 54 deletions

View File

@ -1,40 +0,0 @@
package main
import (
"fmt"
"github.com/daglabs/btcd/apiserver/config"
"github.com/daglabs/btcd/rpcclient"
"io/ioutil"
)
func connectToServer(cfg *config.Config) (*apiServerClient, error) {
var cert []byte
if !cfg.DisableTLS {
var err error
cert, err = ioutil.ReadFile(cfg.RPCCert)
if err != nil {
return nil, fmt.Errorf("Error reading certificates file: %s", err)
}
}
connCfg := &rpcclient.ConnConfig{
Host: cfg.RPCServer,
Endpoint: "ws",
User: cfg.RPCUser,
Pass: cfg.RPCPassword,
DisableTLS: cfg.DisableTLS,
}
if !cfg.DisableTLS {
connCfg.Certificates = cert
}
client, err := newAPIServerClient(connCfg)
if err != nil {
return nil, fmt.Errorf("Error connecting to address %s: %s", cfg.RPCServer, err)
}
log.Infof("Connected to server %s", cfg.RPCServer)
return client, nil
}

View File

@ -1,7 +1,11 @@
package main
package jsonrpc
import (
"errors"
"fmt"
"io/ioutil"
"github.com/daglabs/btcd/apiserver/config"
"github.com/daglabs/btcd/util/daghash"
"github.com/daglabs/btcd/rpcclient"
@ -9,12 +13,24 @@ import (
"github.com/daglabs/btcd/wire"
)
type apiServerClient struct {
// Client represents a connection to the JSON-RPC API of a full node
type Client struct {
*rpcclient.Client
onBlockAdded chan *blockAddedMsg
onChainChanged chan *chainChangedMsg
}
var client *Client
// GetClient returns an instance of the JSON-RPC client, in case we have an active connection
func GetClient() (*Client, error) {
if client == nil {
return nil, errors.New("JSON-RPC is not connected")
}
return client, nil
}
type blockAddedMsg struct {
chainHeight uint64
header *wire.BlockHeader
@ -25,8 +41,50 @@ type chainChangedMsg struct {
addedChainBlocks []*rpcclient.ChainBlock
}
func newAPIServerClient(connCfg *rpcclient.ConnConfig) (*apiServerClient, error) {
client := &apiServerClient{
// Close closes the connection to the JSON-RPC API server
func Close() {
if client == nil {
return
}
client.Disconnect()
client = nil
}
// Connect initiates a connection to the JSON-RPC API Server
func Connect(cfg *config.Config) error {
var cert []byte
if !cfg.DisableTLS {
var err error
cert, err = ioutil.ReadFile(cfg.RPCCert)
if err != nil {
return fmt.Errorf("Error reading certificates file: %s", err)
}
}
connCfg := &rpcclient.ConnConfig{
Host: cfg.RPCServer,
Endpoint: "ws",
User: cfg.RPCUser,
Pass: cfg.RPCPassword,
DisableTLS: cfg.DisableTLS,
}
if !cfg.DisableTLS {
connCfg.Certificates = cert
}
var err error
client, err = newClient(connCfg)
if err != nil {
return fmt.Errorf("Error connecting to address %s: %s", cfg.RPCServer, err)
}
return nil
}
func newClient(connCfg *rpcclient.ConnConfig) (*Client, error) {
client = &Client{
onBlockAdded: make(chan *blockAddedMsg),
onChainChanged: make(chan *chainChangedMsg),
}
@ -58,5 +116,6 @@ func newAPIServerClient(connCfg *rpcclient.ConnConfig) (*apiServerClient, error)
if err = client.NotifyChainChanges(); err != nil {
return nil, fmt.Errorf("Error while registering client %s for chain changes notifications: %s", client.Host(), err)
}
return client, nil
}

View File

@ -4,6 +4,7 @@ import (
"fmt"
"github.com/daglabs/btcd/apiserver/config"
"github.com/daglabs/btcd/apiserver/database"
"github.com/daglabs/btcd/apiserver/jsonrpc"
"github.com/daglabs/btcd/apiserver/server"
"github.com/daglabs/btcd/logger"
"github.com/daglabs/btcd/signal"
@ -32,21 +33,15 @@ func main() {
}
}()
client, err := connectToServer(cfg)
err = jsonrpc.Connect(cfg)
if err != nil {
panic(fmt.Errorf("Error connecting to servers: %s", err))
}
defer jsonrpc.Close()
shutdownServer := server.Start(cfg.HTTPListen)
defer func() {
shutdownServer()
disconnectFromNode(client)
}()
defer shutdownServer()
interrupt := signal.InterruptListener()
<-interrupt
}
func disconnectFromNode(client *apiServerClient) {
log.Infof("Disconnecting client")
client.Disconnect()
}