-
Notifications
You must be signed in to change notification settings - Fork 0
/
hub.go
59 lines (49 loc) · 1.89 KB
/
hub.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
package hub
import (
"github.com/0xObjc/clash/config" // 配置文件处理
"github.com/0xObjc/clash/hub/executor" // 执行器,用于启动代理
"github.com/0xObjc/clash/hub/route" // 路由处理
)
// Option 定义了函数类型,用于修改配置对象
type Option func(*config.Config)
// WithExternalUI 创建Option,设置外部UI的路径
func WithExternalUI(externalUI string) Option {
return func(cfg *config.Config) {
cfg.General.ExternalUI = externalUI // 设置配置中的外部UI路径
}
}
// WithExternalController 创建Option,设置外部控制器的地址
func WithExternalController(externalController string) Option {
return func(cfg *config.Config) {
cfg.General.ExternalController = externalController // 设置配置中的外部控制器地址
}
}
// WithSecret 创建Option,设置RESTful API的安全密钥
func WithSecret(secret string) Option {
return func(cfg *config.Config) {
cfg.General.Secret = secret // 设置配置中的安全密钥
}
}
// Parse 函数是启动Clash时首先调用的函数,用于解析配置并启动相关服务
func Parse(options ...Option) error {
// 使用executor.Parse()函数解析配置文件,获取配置对象
cfg, err := executor.Parse()
if err != nil {
return err // 如果解析失败,返回错误
}
// 遍历所有的启动选项,应用它们到配置对象中
for _, option := range options {
option(cfg)
}
// 如果配置中设置了外部UI路径,则设置路由的UI路径
if cfg.General.ExternalUI != "" {
route.SetUIPath(cfg.General.ExternalUI)
}
// 如果配置中设置了外部控制器地址,则启动路由服务
if cfg.General.ExternalController != "" {
go route.Start(cfg.General.ExternalController, cfg.General.Secret) // 使用Go协程启动路由服务
}
// 应用配置到执行器,启动代理服务
executor.ApplyConfig(cfg, true)
return nil // 返回nil表示成功
}