// Package shared contains shared data between the host and plugins. package shared import ( "golang.org/x/net/context" "google.golang.org/grpc" "github.com/hashicorp/go-plugin" "github.com/hashicorp/go-plugin/examples/bidirectional/proto" ) // Handshake is a common handshake that is shared by plugin and host. var Handshake = plugin.HandshakeConfig{ ProtocolVersion: 1, MagicCookieKey: "BASIC_PLUGIN", MagicCookieValue: "hello", } // PluginMap is the map of plugins we can dispense. var PluginMap = map[string]plugin.Plugin{ "counter": &CounterPlugin{}, } type AddHelper interface { Sum(int64, int64) (int64, error) } // KV is the interface that we're exposing as a plugin. type Counter interface { Put(key string, value int64, a AddHelper) error Get(key string) (int64, error) } // This is the implementation of plugin.Plugin so we can serve/consume this. // We also implement GRPCPlugin so that this plugin can be served over // gRPC. type CounterPlugin struct { plugin.NetRPCUnsupportedPlugin // Concrete implementation, written in Go. This is only used for plugins // that are written in Go. Impl Counter } func (p *CounterPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error { proto.RegisterCounterServer(s, &GRPCServer{ Impl: p.Impl, broker: broker, }) return nil } func (p *CounterPlugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) { return &GRPCClient{ client: proto.NewCounterClient(c), broker: broker, }, nil } var _ plugin.GRPCPlugin = &CounterPlugin{}