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
+11 -1
View File
@@ -2,6 +2,7 @@
#include <dmf-engine/graph.hpp>
#include <dmf-engine/flow_manager.hpp>
#include <dmf-engine/process_manager.hpp>
#include <dmf-engine/node_control_client.hpp>
#include <spdlog/spdlog.h>
@@ -16,11 +17,19 @@ static void signal_handler(int /*signum*/) {
int main(int argc, char* argv[]) {
uint16_t port = 8080;
std::string mxl_domain = "/dev/shm/mxl";
for (int i = 1; i < argc; ++i) {
std::string arg = argv[i];
if ((arg == "--port" || arg == "-p") && i + 1 < argc) {
port = static_cast<uint16_t>(std::stoi(argv[++i]));
} else if ((arg == "--mxl-domain" || arg == "-d") && i + 1 < argc) {
mxl_domain = argv[++i];
} else if (arg == "--help" || arg == "-h") {
spdlog::info("Usage: dmf-studio-engine [options]");
spdlog::info(" --port, -p API server port (default: 8080)");
spdlog::info(" --mxl-domain, -d MXL domain path (default: /dev/shm/mxl)");
return 0;
}
}
@@ -32,8 +41,9 @@ int main(int argc, char* argv[]) {
dmf_engine::Graph graph;
dmf_engine::FlowManager flow_manager;
dmf_engine::ProcessManager process_manager;
dmf_engine::NodeControlClient control_client;
dmf_engine::ApiServer api_server(port, graph, flow_manager, process_manager);
dmf_engine::ApiServer api_server(port, graph, flow_manager, process_manager, control_client, mxl_domain);
spdlog::info("DMF Studio Engine ready");