Files
Prism/internal/core/mihomo.go
T
renjue 59d1087cc9
CI / test (push) Failing after 1m46s
CI / docker (push) Has been skipped
feat: Prism HTTP/SOCKS5 代理网关及管理台
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 15:08:50 +08:00

75 lines
1.3 KiB
Go

package core
import (
"fmt"
"sync"
"github.com/metacubex/mihomo/hub"
"github.com/metacubex/mihomo/hub/executor"
)
type Engine struct {
mu sync.Mutex
apiAddr string
secret string
lastGood []byte
running bool
}
func NewEngine() *Engine {
return &Engine{}
}
func (e *Engine) Configure(apiAddr, secret string) {
e.mu.Lock()
defer e.mu.Unlock()
e.apiAddr = apiAddr
e.secret = secret
}
func (e *Engine) Reload(yaml []byte) error {
e.mu.Lock()
defer e.mu.Unlock()
if _, err := executor.ParseWithBytes(yaml); err != nil {
return fmt.Errorf("config validation failed: %w", err)
}
opts := []hub.Option{
hub.WithExternalController(e.apiAddr),
}
if e.secret != "" {
opts = append(opts, hub.WithSecret(e.secret))
}
if err := hub.Parse(yaml, opts...); err != nil {
return fmt.Errorf("mihomo reload failed: %w", err)
}
e.lastGood = append([]byte(nil), yaml...)
e.running = true
return nil
}
func (e *Engine) Shutdown() {
e.mu.Lock()
defer e.mu.Unlock()
executor.Shutdown()
e.running = false
}
func (e *Engine) LastGoodConfig() []byte {
e.mu.Lock()
defer e.mu.Unlock()
if e.lastGood == nil {
return nil
}
return append([]byte(nil), e.lastGood...)
}
func (e *Engine) Running() bool {
e.mu.Lock()
defer e.mu.Unlock()
return e.running
}