This repository has been archived by the owner on Nov 20, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
plugin.go
92 lines (75 loc) · 1.95 KB
/
plugin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package plugin
import (
"github.com/iyear/go-plugin-grpc/internal/pb"
"github.com/robfig/cron/v3"
"google.golang.org/grpc"
)
type Logger struct {
plugin *Plugin
}
type HandlerFunc func(ctx Context) (interface{}, error)
type Plugin struct {
conn *grpc.ClientConn // grpc connection
clients *clients // grpc clients
name string // plugin name
token string // plugin token
opts Options // plugin Options
version string // plugin version
cron *cron.Cron // cron for heartbeat
status pb.PluginStatus // plugin status
handlers map[string]HandlerFunc // plugin handlers. no need to use sync.Map
cancel func() // context cancel func
Log *Logger
}
type clients struct {
conn pb.ConnClient
log pb.Conn_LogClient
comm pb.Conn_CommunicateClient
}
func New(name, ver, token string, opts ...Option) *Plugin {
p := Plugin{
conn: &grpc.ClientConn{},
name: name,
version: ver,
token: token,
clients: &clients{},
status: pb.PluginStatus_Disconnected,
opts: defaultOpts(),
cron: cron.New(),
handlers: make(map[string]HandlerFunc),
}
for _, opt := range opts {
opt.apply(&p.opts)
}
p.Log = &Logger{plugin: &p}
return &p
}
func (p *Plugin) Handle(funcName string, handler HandlerFunc) {
if _, ok := p.handlers[funcName]; ok {
panic("plugin: func " + funcName + " already exists")
}
p.handlers[funcName] = handler
}
func (p *Plugin) Name() string {
return p.name
}
func (p *Plugin) Version() string {
return p.version
}
func (p *Plugin) Token() string {
return p.token
}
func (p *Plugin) Status() Status {
return Status(p.status)
}
func (p *Plugin) Funcs() []string {
funcs := make([]string, 0)
for f := range p.handlers {
funcs = append(funcs, f)
}
return funcs
}
//Opts returns the options of the plugin,it's read-only
func (p *Plugin) Opts() Options {
return p.opts
}