111
All checks were successful
Build Multi-Platform Binaries / build-frontend (push) Successful in 29s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Successful in 48s
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Successful in 37s
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Successful in 59s
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Successful in 36s
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Successful in 57s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Successful in 38s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Successful in 1m6s
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Successful in 50s
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Successful in 35s
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Successful in 1m0s
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Successful in 52s

This commit is contained in:
Flik
2025-12-28 16:51:40 +08:00
parent abfc235357
commit 17f38f7ef2
11 changed files with 782 additions and 25 deletions

180
pkg/plugin/server_api.go Normal file
View File

@@ -0,0 +1,180 @@
package plugin
import (
"net"
"time"
)
// =============================================================================
// 服务端依赖接口(依赖注入)
// =============================================================================
// PortStore 端口存储接口
type PortStore interface {
Reserve(port int, owner string) error
Release(port int)
IsAvailable(port int) bool
}
// RuleStore 规则存储接口
type RuleStore interface {
GetAll(clientID string) ([]RuleConfig, error)
Create(clientID string, rule *RuleConfig) error
Update(clientID string, rule *RuleConfig) error
Delete(clientID, ruleName string) error
}
// ClientStore 客户端存储接口
type ClientStore interface {
GetAll() ([]ClientInfo, error)
IsOnline(clientID string) bool
}
// =============================================================================
// 服务端 API 实现
// =============================================================================
// ServerAPI 服务端 PluginAPI 实现
type ServerAPI struct {
*baseAPI
portStore PortStore
ruleStore RuleStore
clientStore ClientStore
serverInfo *ServerInfo
}
// ServerAPIOption 服务端 API 配置选项
type ServerAPIOption struct {
PluginName string
Config map[string]string
PortStore PortStore
RuleStore RuleStore
ClientStore ClientStore
ServerInfo *ServerInfo
}
// NewServerAPI 创建服务端 API
func NewServerAPI(opt ServerAPIOption) *ServerAPI {
return &ServerAPI{
baseAPI: newBaseAPI(opt.PluginName, opt.Config),
portStore: opt.PortStore,
ruleStore: opt.RuleStore,
clientStore: opt.ClientStore,
serverInfo: opt.ServerInfo,
}
}
// --- 网络操作 ---
// Dial 服务端不支持隧道拨号
func (s *ServerAPI) Dial(network, address string) (net.Conn, error) {
return nil, ErrNotSupported
}
// DialTimeout 服务端不支持隧道拨号
func (s *ServerAPI) DialTimeout(network, address string, timeout time.Duration) (net.Conn, error) {
return nil, ErrNotSupported
}
// Listen 在指定地址监听
func (s *ServerAPI) Listen(network, address string) (net.Listener, error) {
return net.Listen(network, address)
}
// --- 端口管理 ---
// ReservePort 预留端口
func (s *ServerAPI) ReservePort(port int) error {
if s.portStore == nil {
return ErrNotSupported
}
return s.portStore.Reserve(port, s.getPluginName())
}
// ReleasePort 释放端口
func (s *ServerAPI) ReleasePort(port int) {
if s.portStore != nil {
s.portStore.Release(port)
}
}
// IsPortAvailable 检查端口是否可用
func (s *ServerAPI) IsPortAvailable(port int) bool {
if s.portStore == nil {
return false
}
return s.portStore.IsAvailable(port)
}
// --- 规则管理 ---
// CreateRule 创建代理规则
func (s *ServerAPI) CreateRule(rule *RuleConfig) error {
if s.ruleStore == nil {
return ErrNotSupported
}
return s.ruleStore.Create(rule.ClientID, rule)
}
// DeleteRule 删除代理规则
func (s *ServerAPI) DeleteRule(clientID, ruleName string) error {
if s.ruleStore == nil {
return ErrNotSupported
}
return s.ruleStore.Delete(clientID, ruleName)
}
// GetRules 获取客户端的代理规则
func (s *ServerAPI) GetRules(clientID string) ([]RuleConfig, error) {
if s.ruleStore == nil {
return nil, ErrNotSupported
}
return s.ruleStore.GetAll(clientID)
}
// UpdateRule 更新代理规则
func (s *ServerAPI) UpdateRule(clientID string, rule *RuleConfig) error {
if s.ruleStore == nil {
return ErrNotSupported
}
return s.ruleStore.Update(clientID, rule)
}
// --- 客户端管理 ---
// GetClientID 服务端返回空
func (s *ServerAPI) GetClientID() string {
return ""
}
// GetClientList 获取所有客户端列表
func (s *ServerAPI) GetClientList() ([]ClientInfo, error) {
if s.clientStore == nil {
return nil, ErrNotSupported
}
return s.clientStore.GetAll()
}
// IsClientOnline 检查客户端是否在线
func (s *ServerAPI) IsClientOnline(clientID string) bool {
if s.clientStore == nil {
return false
}
return s.clientStore.IsOnline(clientID)
}
// --- 上下文 ---
// GetContext 获取当前上下文
func (s *ServerAPI) GetContext() *Context {
return &Context{
PluginName: s.getPluginName(),
Side: SideServer,
Config: s.getConfigMap(),
}
}
// GetServerInfo 获取服务端信息
func (s *ServerAPI) GetServerInfo() *ServerInfo {
return s.serverInfo
}