EasyVQD/pkg/pluginheart/plugin.go
2026-01-15 19:32:33 +08:00

96 lines
1.9 KiB
Go

package pluginheart
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log/slog"
"net/http"
"os"
"strings"
"time"
)
type Engine struct {
api string
cli *http.Client
name string
}
func NewEngine(name, api string) *Engine {
e := Engine{
api: api,
name: name,
cli: &http.Client{
Timeout: 5 * time.Second,
},
}
return &e
}
func (e *Engine) AutoHeart(in HeartInput, isService bool) {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
maxFaildCount := 3
if isService {
maxFaildCount = 17280
}
var faildCount int
for {
if faildCount > maxFaildCount {
fmt.Println("heart failed")
os.Exit(0)
}
resp, err := e.Heart(in)
<-ticker.C
if err != nil {
slog.Error("heart failed", "error", err)
e.api = strings.ReplaceAll(e.api, "127.0.0.1", "localhost")
faildCount++
continue
}
body, _ := io.ReadAll(resp.Body)
resp.Body.Close()
if resp.StatusCode != 200 {
slog.Error("heart failed", "error", resp.StatusCode, "body", string(body))
faildCount++
continue
}
faildCount = 0
}
}
func (e *Engine) Heart(in HeartInput) (*http.Response, error) {
in.PID = os.Getpid()
b, _ := json.Marshal(in)
const path = `/extensions/heartbeat`
req, _ := http.NewRequest(http.MethodPost, e.api+path, bytes.NewReader(b))
SetExtensionName(req, e.name)
return e.cli.Do(req)
}
func (e *Engine) Console(in ConsoleInput) (*http.Response, error) {
b, _ := json.Marshal(in)
const path = `/extensions/console`
req, _ := http.NewRequest(http.MethodPost, e.api+path, bytes.NewReader(b))
SetExtensionName(req, e.name)
return e.cli.Do(req)
}
// GetExtensionName 获取扩展名称
func GetExtensionName(req *http.Request) string {
return req.Header.Get("X-Extension-Name")
}
func SetExtensionName(req *http.Request, name string) {
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Extension-Name", name)
}