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 }