123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package core
- import (
- "context"
- "ehang.io/nps/bridge"
- "net"
- )
- // Plugin interface, all plugins must implement those functions.
- type Plugin interface {
- GetConfigName() *NpsConfigs
- InitConfig(globalConfig, clientConfig, pluginConfig map[string]string, pgCnf []*Config)
- GetStage() []Stage
- Start(ctx context.Context) (context.Context, error)
- Run(ctx context.Context) (context.Context, error)
- End(ctx context.Context) (context.Context, error)
- }
- type NpsPlugin struct {
- Version string
- Configs map[string]string
- }
- func (npsPlugin *NpsPlugin) GetConfigName() *NpsConfigs {
- return nil
- }
- func (npsPlugin *NpsPlugin) InitConfig(globalConfig, clientConfig, pluginConfig map[string]string, pgCnf []*Config) {
- npsPlugin.Configs = make(map[string]string)
- for _, cfg := range pgCnf {
- switch cfg.ConfigLevel {
- case CONFIG_LEVEL_PLUGIN:
- npsPlugin.Configs[cfg.ConfigName] = pluginConfig[cfg.ConfigName]
- case CONFIG_LEVEL_CLIENT:
- npsPlugin.Configs[cfg.ConfigName] = clientConfig[cfg.ConfigName]
- case CONFIG_LEVEL_GLOBAL:
- npsPlugin.Configs[cfg.ConfigName] = globalConfig[cfg.ConfigName]
- }
- }
- return
- }
- // describe the stage of the plugin
- func (npsPlugin *NpsPlugin) GetStage() []Stage {
- return []Stage{STAGE_RUN}
- }
- func (npsPlugin *NpsPlugin) Start(ctx context.Context) (context.Context, error) {
- return ctx, nil
- }
- func (npsPlugin *NpsPlugin) Run(ctx context.Context) (context.Context, error) {
- return ctx, nil
- }
- func (npsPlugin *NpsPlugin) End(ctx context.Context) (context.Context, error) {
- return ctx, nil
- }
- func (npsPlugin *NpsPlugin) GetClientConn(ctx context.Context) net.Conn {
- return ctx.Value(CLIENT_CONNECTION).(net.Conn)
- }
- func (npsPlugin *NpsPlugin) SetClientConn(ctx context.Context, conn net.Conn) context.Context {
- return context.WithValue(ctx, CLIENT_CONNECTION, conn)
- }
- func (npsPlugin *NpsPlugin) GetBridge(ctx context.Context) *bridge.Bridge {
- return ctx.Value(BRIDGE).(*bridge.Bridge)
- }
- func (npsPlugin *NpsPlugin) GetClientId(ctx context.Context) int {
- return ctx.Value(CLIENT_ID).(int)
- }
- type Plugins struct {
- StartPgs []Plugin
- RunPgs []Plugin
- EndPgs []Plugin
- AllPgs []Plugin
- }
- func NewPlugins() *Plugins {
- p := &Plugins{}
- p.StartPgs = make([]Plugin, 0)
- p.RunPgs = make([]Plugin, 0)
- p.EndPgs = make([]Plugin, 0)
- p.AllPgs = make([]Plugin, 0)
- return p
- }
- func (pl *Plugins) Add(plugins ...Plugin) {
- for _, plugin := range plugins {
- for _, v := range plugin.GetStage() {
- pl.AllPgs = append(pl.RunPgs, plugin)
- switch v {
- case STAGE_RUN:
- pl.RunPgs = append(pl.RunPgs, plugin)
- case STAGE_END:
- pl.EndPgs = append(pl.EndPgs, plugin)
- case STAGE_START:
- pl.StartPgs = append(pl.StartPgs, plugin)
- }
- }
- }
- }
- func RunPlugin(ctx context.Context, pgs []Plugin, stage Stage) (context.Context, error) {
- var err error
- for _, pg := range pgs {
- switch stage {
- case STAGE_RUN:
- ctx, err = pg.Run(ctx)
- case STAGE_START:
- ctx, err = pg.Start(ctx)
- case STAGE_END:
- ctx, err = pg.End(ctx)
- }
- if err != nil {
- return ctx, err
- }
- }
- return ctx, nil
- }
|