github.com/MetalBlockchain/metalgo@v1.11.9/api/keystore/gkeystore/keystore_server.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package gkeystore
     5  
     6  import (
     7  	"context"
     8  
     9  	"github.com/MetalBlockchain/metalgo/api/keystore"
    10  	"github.com/MetalBlockchain/metalgo/database"
    11  	"github.com/MetalBlockchain/metalgo/database/rpcdb"
    12  	"github.com/MetalBlockchain/metalgo/vms/rpcchainvm/grpcutils"
    13  
    14  	keystorepb "github.com/MetalBlockchain/metalgo/proto/pb/keystore"
    15  	rpcdbpb "github.com/MetalBlockchain/metalgo/proto/pb/rpcdb"
    16  )
    17  
    18  var _ keystorepb.KeystoreServer = (*Server)(nil)
    19  
    20  // Server is a snow.Keystore that is managed over RPC.
    21  type Server struct {
    22  	keystorepb.UnsafeKeystoreServer
    23  	ks keystore.BlockchainKeystore
    24  }
    25  
    26  // NewServer returns a keystore connected to a remote keystore
    27  func NewServer(ks keystore.BlockchainKeystore) *Server {
    28  	return &Server{
    29  		ks: ks,
    30  	}
    31  }
    32  
    33  func (s *Server) GetDatabase(
    34  	_ context.Context,
    35  	req *keystorepb.GetDatabaseRequest,
    36  ) (*keystorepb.GetDatabaseResponse, error) {
    37  	db, err := s.ks.GetRawDatabase(req.Username, req.Password)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	closer := dbCloser{Database: db}
    43  
    44  	serverListener, err := grpcutils.NewListener()
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  
    49  	server := grpcutils.NewServer()
    50  	closer.closer.Add(server)
    51  	rpcdbpb.RegisterDatabaseServer(server, rpcdb.NewServer(&closer))
    52  
    53  	// start the db server
    54  	go grpcutils.Serve(serverListener, server)
    55  
    56  	return &keystorepb.GetDatabaseResponse{ServerAddr: serverListener.Addr().String()}, nil
    57  }
    58  
    59  type dbCloser struct {
    60  	database.Database
    61  	closer grpcutils.ServerCloser
    62  }
    63  
    64  func (db *dbCloser) Close() error {
    65  	err := db.Database.Close()
    66  	db.closer.Stop()
    67  	return err
    68  }