heroagent/pkg/heroscript/handlerfactory/herohandler/hero_handler.go
2025-04-23 04:18:28 +02:00

95 lines
2.6 KiB
Go

package herohandler
import (
"fmt"
"log"
"github.com/freeflowuniverse/heroagent/pkg/heroscript/handlerfactory/core"
// "github.com/freeflowuniverse/heroagent/pkg/handlerfactory/heroscript/handlerfactory/fakehandler"
"github.com/freeflowuniverse/heroagent/pkg/heroscript/handlerfactory/processmanagerhandler"
)
// HeroHandler is the main handler factory that manages all registered handlers
type HeroHandler struct {
factory *core.HandlerFactory
telnetServer *core.TelnetServer
}
var (
// DefaultInstance is the default HeroHandler instance
DefaultInstance *HeroHandler
)
// init initializes the default HeroHandler instance
func Init() error {
factory := core.NewHandlerFactory()
DefaultInstance = &HeroHandler{
factory: factory,
telnetServer: core.NewTelnetServer(factory),
}
log.Println("HeroHandler initialized")
// Register the process manager handler
handler := processmanagerhandler.NewProcessManagerHandler()
if handler == nil {
log.Fatalf("Failed to create process manager handler")
}
if err := DefaultInstance.factory.RegisterHandler(handler); err != nil {
log.Fatalf("Failed to register process manager handler: %v", err)
}
return nil
}
func StartTelnet() error {
if err := DefaultInstance.StartTelnet("/tmp/hero.sock", "localhost:8023"); err != nil {
log.Fatalf("Failed to start telnet server: %v", err)
}
return nil
}
// StartTelnet starts the telnet server on both Unix socket and TCP port
func (h *HeroHandler) StartTelnet(socketPath string, tcpAddress string, secrets ...string) error {
// Create a new telnet server with the factory and secrets
h.telnetServer = core.NewTelnetServer(h.factory, secrets...)
// Start Unix socket server
if socketPath != "" {
if err := h.telnetServer.Start(socketPath); err != nil {
return fmt.Errorf("failed to start Unix socket telnet server: %v", err)
}
log.Printf("Telnet server started on Unix socket: %s", socketPath)
}
// Start TCP server
if tcpAddress != "" {
if err := h.telnetServer.StartTCP(tcpAddress); err != nil {
return fmt.Errorf("failed to start TCP telnet server: %v", err)
}
log.Printf("Telnet server started on TCP address: %s", tcpAddress)
}
return nil
}
// StopTelnet stops the telnet server
func (h *HeroHandler) StopTelnet() error {
if h.telnetServer == nil {
return nil
}
return h.telnetServer.Stop()
}
// EnableSignalHandling sets up signal handling for graceful shutdown of the telnet server
func (h *HeroHandler) EnableSignalHandling(onShutdown func()) {
if h.telnetServer == nil {
return
}
h.telnetServer.EnableSignalHandling(onShutdown)
}