[#69] Add close for nns.Dial
/ DCO (pull_request) Successful in 47s Details
/ Lint (pull_request) Successful in 1m37s Details
/ Tests (1.19) (pull_request) Successful in 5m57s Details
/ Tests (1.20) (pull_request) Successful in 6m37s Details

Signed-off-by: Marina Biryukova <m.biryukova@yadro.com>
pull/134/head
Marina Biryukova 2023-07-28 18:35:35 +03:00
parent ecb1fef78c
commit 0886d80083
1 changed files with 23 additions and 16 deletions

View File

@ -19,12 +19,25 @@ import (
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
)
// multiSchemeClient unites invoker.RPCInvoke and common interface of
// rpcclient.Client and rpcclient.WSClient.
type multiSchemeClient interface {
invoker.RPCInvoke
// Init turns client to "ready-to-work" state.
Init() error
// Close closes connections.
Close()
// GetContractStateByID returns state of the NNS contract on 1 input.
GetContractStateByID(int32) (*state.Contract, error)
}
// NNS looks up FrostFS names using Neo Name Service.
//
// Instances are created with a variable declaration. Before work, the connection
// to the NNS server MUST be established using Dial method.
type NNS struct {
nnsContract util.Uint160
client multiSchemeClient
invoker interface {
Call(contract util.Uint160, operation string, params ...any) (*result.Invoke, error)
@ -37,47 +50,41 @@ type NNS struct {
// If URL address scheme is 'ws' or 'wss', then WebSocket protocol is used,
// otherwise HTTP.
func (n *NNS) Dial(address string) error {
// multiSchemeClient unites invoker.RPCInvoke and common interface of
// rpcclient.Client and rpcclient.WSClient. Interface is anonymous
// according to assumption that common interface of these client types
// is not required by design and may diverge with changes.
var multiSchemeClient interface {
invoker.RPCInvoke
// Init turns client to "ready-to-work" state.
Init() error
// GetContractStateByID returns state of the NNS contract on 1 input.
GetContractStateByID(int32) (*state.Contract, error)
}
var err error
uri, err := url.Parse(address)
if err == nil && (uri.Scheme == "ws" || uri.Scheme == "wss") {
multiSchemeClient, err = rpcclient.NewWS(context.Background(), address, rpcclient.WSOptions{})
n.client, err = rpcclient.NewWS(context.Background(), address, rpcclient.WSOptions{})
if err != nil {
return fmt.Errorf("create Neo WebSocket client: %w", err)
}
} else {
multiSchemeClient, err = rpcclient.New(context.Background(), address, rpcclient.Options{})
n.client, err = rpcclient.New(context.Background(), address, rpcclient.Options{})
if err != nil {
return fmt.Errorf("create Neo HTTP client: %w", err)
}
}
if err = multiSchemeClient.Init(); err != nil {
if err = n.client.Init(); err != nil {
return fmt.Errorf("initialize Neo client: %w", err)
}
nnsContract, err := multiSchemeClient.GetContractStateByID(1)
nnsContract, err := n.client.GetContractStateByID(1)
if err != nil {
return fmt.Errorf("get NNS contract state: %w", err)
}
n.invoker = invoker.New(multiSchemeClient, nil)
n.invoker = invoker.New(n.client, nil)
n.nnsContract = nnsContract.Hash
return nil
}
// Close closes connections of multiSchemeClient.
func (n *NNS) Close() {
n.client.Close()
}
// ResolveContainerDomain looks up for NNS TXT records for the given container domain
// by calling `resolve` method of NNS contract. Returns the first record which represents
// valid container ID in a string format. Otherwise, returns an error.