feat: add node HTTP control, engine-to-node communication, connect-input/output API

- Node control server now accepts HTTP POST /cmd for command dispatch
  (in addition to existing WebSocket control)
- Added NodeControlClient: engine sends commands to nodes via HTTP POST
- New REST endpoints:
  POST /api/graph/nodes/:id/connect-input  - connect node input to MXL flow
  POST /api/graph/nodes/:id/connect-output - create new MXL flow + connect output
  POST /api/graph/nodes/:id/disconnect-port - remove reader/writer
  POST /api/graph/nodes/:id/command - send raw command to node
- Flow IDs now use proper UUID v4 format (MXL requires standard UUIDs)
- Flow definitions use NMOS format (urn:x-nmos:format:video)
- Engine passes --mxl-domain to node processes
- User-provided node IDs (via 'id' field in POST body)
- End-to-end verified: testsrc → passthrough → new MXL output flow
This commit is contained in:
Johanness
2026-05-26 21:33:17 +03:00
parent 1d6f93679f
commit 5b2d420e71
8 changed files with 474 additions and 92 deletions
@@ -14,7 +14,7 @@ using RequestHandler = std::function<std::string(const std::string& method, cons
class ApiServer {
public:
ApiServer(uint16_t port, Graph& graph, class FlowManager& flow_manager, class ProcessManager& process_manager);
ApiServer(uint16_t port, Graph& graph, class FlowManager& flow_manager, class ProcessManager& process_manager, class NodeControlClient& control_client, const std::string& mxl_domain = "/dev/shm/mxl");
~ApiServer();
ApiServer(const ApiServer&) = delete;
@@ -0,0 +1,21 @@
#pragma once
#include <string>
#include <unordered_map>
#include <cstdint>
namespace dmf_engine {
class NodeControlClient {
public:
bool send_command(uint16_t port, const std::string& json_cmd);
void register_node(const std::string& node_id, uint16_t port);
void unregister_node(const std::string& node_id);
uint16_t get_port(const std::string& node_id) const;
private:
std::unordered_map<std::string, uint16_t> node_ports_;
};
} // namespace dmf_engine