summaryrefslogtreecommitdiffstats
path: root/plugin/client.go
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2018-06-25 12:33:13 -0700
committerGitHub <noreply@github.com>2018-06-25 12:33:13 -0700
commit1e5c432e1029601a664454388ae366ef69618d62 (patch)
treecb9e8bfb66640ac3b29c934bb2c3202d25aeb368 /plugin/client.go
parentecefa6cdd1e7376046bbec82c1b47f7756fea646 (diff)
downloadchat-1e5c432e1029601a664454388ae366ef69618d62.tar.gz
chat-1e5c432e1029601a664454388ae366ef69618d62.tar.bz2
chat-1e5c432e1029601a664454388ae366ef69618d62.zip
MM-10702 Moving plugins to use hashicorp go-plugin. (#8978)
* Moving plugins to use hashicorp go-plugin. * Tweaks from feedback.
Diffstat (limited to 'plugin/client.go')
-rw-r--r--plugin/client.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/plugin/client.go b/plugin/client.go
new file mode 100644
index 000000000..3f6fbc7a6
--- /dev/null
+++ b/plugin/client.go
@@ -0,0 +1,51 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See LICENSE.txt for license information.
+
+package plugin
+
+import (
+ "github.com/hashicorp/go-plugin"
+)
+
+// Starts the serving of a Mattermost plugin over rpc or gRPC
+// Call this when your plugin is ready to start
+func ClientMain(pluginImplementation interface{}) {
+ if impl, ok := pluginImplementation.(interface {
+ SetAPI(api API)
+ SetSelfRef(ref interface{})
+ }); !ok {
+ panic("Plugin implementation given must embed plugin.MattermostPlugin")
+ } else {
+ impl.SetAPI(nil)
+ impl.SetSelfRef(pluginImplementation)
+ }
+
+ pluginMap := map[string]plugin.Plugin{
+ "hooks": &HooksPlugin{hooks: pluginImplementation},
+ }
+
+ plugin.Serve(&plugin.ServeConfig{
+ HandshakeConfig: Handshake,
+ Plugins: pluginMap,
+ })
+}
+
+type MattermostPlugin struct {
+ API API
+ selfRef interface{} // This is so we can unmarshal into our parent
+}
+
+func (p *MattermostPlugin) SetAPI(api API) {
+ p.API = api
+}
+
+func (p *MattermostPlugin) SetSelfRef(ref interface{}) {
+ p.selfRef = ref
+}
+
+func (p *MattermostPlugin) OnConfigurationChange() error {
+ if p.selfRef != nil {
+ return p.API.LoadPluginConfiguration(p.selfRef)
+ }
+ return nil
+}