heroagent/pkg/processmanager/interfaces/openrpc/server.go
2025-04-23 04:18:28 +02:00

101 lines
2.6 KiB
Go

package openrpc
import (
"fmt"
"log"
"os"
"path/filepath"
"github.com/freeflowuniverse/heroagent/pkg/openrpcmanager"
"github.com/freeflowuniverse/heroagent/pkg/processmanager/interfaces"
)
// Server represents the Process Manager OpenRPC server
type Server struct {
processManager interfaces.ProcessManagerInterface
socketPath string
openRPCMgr *openrpcmanager.OpenRPCManager
unixServer *openrpcmanager.UnixServer
isRunning bool
}
// NewServer creates a new Process Manager OpenRPC server
func NewServer(processManager interfaces.ProcessManagerInterface, socketPath string) (*Server, error) {
// Ensure the directory for the socket exists
socketDir := filepath.Dir(socketPath)
if err := os.MkdirAll(socketDir, 0755); err != nil {
return nil, fmt.Errorf("failed to create socket directory: %w", err)
}
// Load the OpenRPC schema
schema, err := LoadSchema()
if err != nil {
return nil, fmt.Errorf("failed to load OpenRPC schema: %w", err)
}
// Create a new handler - no authentication now
handler := NewHandler(processManager)
// Create a new OpenRPC manager - using empty string for auth (no authentication)
openRPCMgr, err := openrpcmanager.NewOpenRPCManager(schema, handler.GetHandlers(), "")
if err != nil {
return nil, fmt.Errorf("failed to create OpenRPC manager: %w", err)
}
// Create a new Unix server
unixServer, err := openrpcmanager.NewUnixServer(openRPCMgr, socketPath)
if err != nil {
return nil, fmt.Errorf("failed to create Unix server: %w", err)
}
return &Server{
processManager: processManager,
socketPath: socketPath,
openRPCMgr: openRPCMgr,
unixServer: unixServer,
isRunning: false,
}, nil
}
// Start starts the Process Manager OpenRPC server
func (s *Server) Start() error {
if s.isRunning {
return fmt.Errorf("server is already running")
}
// Start the Unix server
if err := s.unixServer.Start(); err != nil {
return fmt.Errorf("failed to start Unix server: %w", err)
}
s.isRunning = true
log.Printf("Process Manager OpenRPC server started on socket: %s", s.socketPath)
return nil
}
// Stop stops the Process Manager OpenRPC server
func (s *Server) Stop() error {
if !s.isRunning {
return fmt.Errorf("server is not running")
}
// Stop the Unix server
if err := s.unixServer.Stop(); err != nil {
return fmt.Errorf("failed to stop Unix server: %w", err)
}
s.isRunning = false
log.Printf("Process Manager OpenRPC server stopped")
return nil
}
// IsRunning returns whether the server is running
func (s *Server) IsRunning() bool {
return s.isRunning
}
// SocketPath returns the socket path
func (s *Server) SocketPath() string {
return s.socketPath
}