summaryrefslogtreecommitdiffstats
path: root/plugin/rpcplugin/hooks.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/rpcplugin/hooks.go')
-rw-r--r--plugin/rpcplugin/hooks.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/plugin/rpcplugin/hooks.go b/plugin/rpcplugin/hooks.go
new file mode 100644
index 000000000..008730402
--- /dev/null
+++ b/plugin/rpcplugin/hooks.go
@@ -0,0 +1,77 @@
+package rpcplugin
+
+import (
+ "io"
+ "net/rpc"
+
+ "github.com/mattermost/platform/plugin"
+)
+
+type LocalHooks struct {
+ hooks plugin.Hooks
+ muxer *Muxer
+ remoteAPI *RemoteAPI
+}
+
+func (h *LocalHooks) OnActivate(args int64, reply *struct{}) error {
+ stream := h.muxer.Connect(args)
+ if h.remoteAPI != nil {
+ h.remoteAPI.Close()
+ }
+ h.remoteAPI = ConnectAPI(stream, h.muxer)
+ return h.hooks.OnActivate(h.remoteAPI)
+}
+
+func (h *LocalHooks) OnDeactivate(args, reply *struct{}) error {
+ err := h.hooks.OnDeactivate()
+ if h.remoteAPI != nil {
+ h.remoteAPI.Close()
+ h.remoteAPI = nil
+ }
+ return err
+}
+
+type RemoteHooks struct {
+ client *rpc.Client
+ muxer *Muxer
+ apiCloser io.Closer
+}
+
+func ServeHooks(hooks plugin.Hooks, conn io.ReadWriteCloser, muxer *Muxer) {
+ server := rpc.NewServer()
+ server.Register(&LocalHooks{
+ hooks: hooks,
+ muxer: muxer,
+ })
+ server.ServeConn(conn)
+}
+
+var _ plugin.Hooks = (*RemoteHooks)(nil)
+
+func (h *RemoteHooks) OnActivate(api plugin.API) error {
+ id, stream := h.muxer.Serve()
+ if h.apiCloser != nil {
+ h.apiCloser.Close()
+ }
+ h.apiCloser = stream
+ go ServeAPI(api, stream, h.muxer)
+ return h.client.Call("LocalHooks.OnActivate", id, nil)
+}
+
+func (h *RemoteHooks) OnDeactivate() error {
+ return h.client.Call("LocalHooks.OnDeactivate", struct{}{}, nil)
+}
+
+func (h *RemoteHooks) Close() error {
+ if h.apiCloser != nil {
+ h.apiCloser.Close()
+ }
+ return h.client.Close()
+}
+
+func ConnectHooks(conn io.ReadWriteCloser, muxer *Muxer) *RemoteHooks {
+ return &RemoteHooks{
+ client: rpc.NewClient(conn),
+ muxer: muxer,
+ }
+}