Server lifecycle: - Introduce service.Service to manage HTTP + gRPC startup/shutdown - Fix gRPC mutex deadlock in StartServer when port is occupied - Add GracefulStop with 5s timeout before forced Stop in grpc.go - Pre-check HTTP and gRPC port availability in cmd/start.go - Print gRPC server address in startup access-points block gRPC client refactor: - Move token manager and client from tai/grpc/ to grpc/client/ - Add backward-compatible aliases in tai/yao.go and tai/token.go - Update cmd/run.go to import grpc/client directly (no tai dependency) Sandbox v2 docker migration: - Delete sandbox/v2/docker/ (moved to tai repo) - Update sandbox/docker/build.sh hint to point to tai repo - Clean up .gitignore entries for removed docker directory - Temporarily disable SandboxV2Test and BenchmarkSandboxV2 in CI (docker images need rebuild after tai repo migration) Tai integration: - Add direct-mode registration API handlers in tai/api/ - Add heartbeat handler and token management wrappers - Update tai/registry and tai/tunnel for latest protocol - Replace yao-grpc references with tai call in docs Made-with: Cursor
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/fatih/color"
|
|
"github.com/yaoapp/gou/application"
|
|
"github.com/yaoapp/yao/config"
|
|
"github.com/yaoapp/yao/engine"
|
|
"github.com/yaoapp/yao/openapi"
|
|
)
|
|
|
|
// Watch the application code change for hot update
|
|
func watch(svc *Service, interrupt chan uint8) error {
|
|
|
|
if application.App == nil {
|
|
return fmt.Errorf("Application is not initialized")
|
|
}
|
|
|
|
return application.App.Watch(func(event, name string) {
|
|
if strings.Contains(event, "CHMOD") {
|
|
return
|
|
}
|
|
|
|
err := engine.Reload(config.Conf, engine.LoadOption{Action: "watch"})
|
|
if err != nil {
|
|
fmt.Println(color.RedString("[Watch] Reload: %s", err.Error()))
|
|
return
|
|
}
|
|
fmt.Println(color.GreenString("[Watch] Reload Completed"))
|
|
|
|
if strings.HasPrefix(name, "/models") {
|
|
fmt.Println(color.GreenString("[Watch] Model: %s changed (Please run yao migrate manually)", name))
|
|
}
|
|
|
|
if strings.HasPrefix(name, "/apis") {
|
|
if openapi.Server != nil {
|
|
err = ReloadAPIs()
|
|
if err != nil {
|
|
fmt.Println(color.RedString("[Watch] Reload APIs: %s", err.Error()))
|
|
return
|
|
}
|
|
fmt.Println(color.GreenString("[Watch] APIs Reloaded"))
|
|
} else {
|
|
err = Restart(svc, config.Conf)
|
|
if err != nil {
|
|
fmt.Println(color.RedString("[Watch] Restart: %s", err.Error()))
|
|
return
|
|
}
|
|
fmt.Println(color.GreenString("[Watch] Restart Completed"))
|
|
}
|
|
}
|
|
|
|
}, interrupt)
|
|
}
|