diff --git a/apiserver/connect.go b/apiserver/connect.go deleted file mode 100644 index dad6791e4..000000000 --- a/apiserver/connect.go +++ /dev/null @@ -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 -} diff --git a/apiserver/client.go b/apiserver/jsonrpc/client.go similarity index 54% rename from apiserver/client.go rename to apiserver/jsonrpc/client.go index 70af223d6..90cfc6c3c 100644 --- a/apiserver/client.go +++ b/apiserver/jsonrpc/client.go @@ -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 } diff --git a/apiserver/main.go b/apiserver/main.go index d91ba02c1..f02dd109d 100644 --- a/apiserver/main.go +++ b/apiserver/main.go @@ -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() -}