Files
GoTunnel/pkg/plugin/registry.go
Flik 4623a7f031
All checks were successful
Build Multi-Platform Binaries / build (push) Successful in 11m9s
add plugins
2025-12-26 11:24:23 +08:00

94 lines
1.8 KiB
Go

package plugin
import (
"context"
"fmt"
"sync"
)
// Registry 管理可用的 plugins
type Registry struct {
builtin map[string]ProxyHandler // 内置 Go 实现
mu sync.RWMutex
}
// NewRegistry 创建 plugin 注册表
func NewRegistry() *Registry {
return &Registry{
builtin: make(map[string]ProxyHandler),
}
}
// RegisterBuiltin 注册内置 plugin
func (r *Registry) RegisterBuiltin(handler ProxyHandler) error {
r.mu.Lock()
defer r.mu.Unlock()
meta := handler.Metadata()
if meta.Name == "" {
return fmt.Errorf("plugin name cannot be empty")
}
if _, exists := r.builtin[meta.Name]; exists {
return fmt.Errorf("plugin %s already registered", meta.Name)
}
r.builtin[meta.Name] = handler
return nil
}
// Get 返回指定代理类型的 handler
func (r *Registry) Get(proxyType string) (ProxyHandler, error) {
r.mu.RLock()
defer r.mu.RUnlock()
// 先查找内置 plugin
if handler, ok := r.builtin[proxyType]; ok {
return handler, nil
}
return nil, fmt.Errorf("plugin %s not found", proxyType)
}
// List 返回所有可用的 plugins
func (r *Registry) List() []PluginInfo {
r.mu.RLock()
defer r.mu.RUnlock()
var plugins []PluginInfo
// 内置 plugins
for _, handler := range r.builtin {
plugins = append(plugins, PluginInfo{
Metadata: handler.Metadata(),
Loaded: true,
})
}
return plugins
}
// Has 检查 plugin 是否存在
func (r *Registry) Has(name string) bool {
r.mu.RLock()
defer r.mu.RUnlock()
_, ok := r.builtin[name]
return ok
}
// Close 关闭所有 plugins
func (r *Registry) Close(ctx context.Context) error {
r.mu.Lock()
defer r.mu.Unlock()
var lastErr error
for name, handler := range r.builtin {
if err := handler.Close(); err != nil {
lastErr = fmt.Errorf("failed to close plugin %s: %w", name, err)
}
}
return lastErr
}