All checks were successful
Build Multi-Platform Binaries / build (push) Successful in 11m9s
71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
package plugin
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"sync"
|
|
|
|
"github.com/gotunnel/pkg/plugin"
|
|
"github.com/gotunnel/pkg/plugin/builtin"
|
|
"github.com/gotunnel/pkg/plugin/wasm"
|
|
)
|
|
|
|
// Manager 客户端 plugin 管理器
|
|
type Manager struct {
|
|
registry *plugin.Registry
|
|
cache *Cache
|
|
runtime *wasm.Runtime
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// NewManager 创建客户端 plugin 管理器
|
|
func NewManager(cacheDir string) (*Manager, error) {
|
|
ctx := context.Background()
|
|
|
|
cache, err := NewCache(cacheDir)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
runtime, err := wasm.NewRuntime(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
registry := plugin.NewRegistry()
|
|
|
|
m := &Manager{
|
|
registry: registry,
|
|
cache: cache,
|
|
runtime: runtime,
|
|
}
|
|
|
|
// 注册内置 plugins
|
|
if err := m.registerBuiltins(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return m, nil
|
|
}
|
|
|
|
// registerBuiltins 注册内置 plugins
|
|
// 注意: tcp, udp, http, https 是内置类型,直接在 tunnel 中处理
|
|
func (m *Manager) registerBuiltins() error {
|
|
// 注册 SOCKS5 plugin
|
|
if err := m.registry.RegisterBuiltin(builtin.NewSOCKS5Plugin()); err != nil {
|
|
return err
|
|
}
|
|
log.Println("[Plugin] Builtin plugins registered: socks5")
|
|
return nil
|
|
}
|
|
|
|
// GetHandler 返回指定代理类型的 handler
|
|
func (m *Manager) GetHandler(proxyType string) (plugin.ProxyHandler, error) {
|
|
return m.registry.Get(proxyType)
|
|
}
|
|
|
|
// Close 关闭管理器
|
|
func (m *Manager) Close(ctx context.Context) error {
|
|
return m.runtime.Close(ctx)
|
|
}
|