101 lines
2.6 KiB
Go
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
|
|
}
|