internal/grpc/backchannel/registry.go (34 lines of code) (raw):
package backchannel
import (
"fmt"
"sync"
"google.golang.org/grpc"
)
// ID is a monotonically increasing number that uniquely identifies a peer connection.
type ID uint64
// Registry is a thread safe registry for backchannels. It enables accessing the backchannels via a
// unique ID.
type Registry struct {
m sync.RWMutex
currentID ID
backchannels map[ID]*grpc.ClientConn
}
// NewRegistry returns a new Registry.
func NewRegistry() *Registry { return &Registry{backchannels: map[ID]*grpc.ClientConn{}} }
// Backchannel returns a backchannel for the ID. Returns an error if no backchannel is registered
// for the ID.
func (r *Registry) Backchannel(id ID) (*grpc.ClientConn, error) {
r.m.RLock()
defer r.m.RUnlock()
backchannel, ok := r.backchannels[id]
if !ok {
return nil, fmt.Errorf("no backchannel for peer %d", id)
}
return backchannel, nil
}
// RegisterBackchannel registers a new backchannel and returns its unique ID.
func (r *Registry) RegisterBackchannel(conn *grpc.ClientConn) ID {
r.m.Lock()
defer r.m.Unlock()
r.currentID++
r.backchannels[r.currentID] = conn
return r.currentID
}
// RemoveBackchannel removes a backchannel from the registry.
func (r *Registry) RemoveBackchannel(id ID) {
r.m.Lock()
defer r.m.Unlock()
delete(r.backchannels, id)
}