Skip to content

v1.6.0 — real RetroArch (NCI)

Latest

Choose a tag to compare

@BlizzHacker BlizzHacker released this 15 Oct 05:28
· 10 commits to main since this release

ROMarr v1.6.0 — real RetroArch, over the interface RetroArch actually has.

RetroArch Network Control Interface (#65). The "headless RetroArch stream server" ROMarr used to talk to answered GET /api/play/route — an HTTP endpoint no release of RetroArch has ever had. Real RetroArch exposes the Network Control Interface: UDP, port 55355, plain-text commands (network_cmd_enable = "true" in retroarch.cfg). ROMarr now speaks it.

  • RetroArchNCI duck-types the existing stream-server slot and rides StreamSources between the HTTP server and Moonlight in confidence order — the old StreamServer still works for whoever's custom streamer answers it; nothing was deleted.
  • Read-only, enforced at the wire: the single send path allowlists VERSION, GET_STATUS, GET_CONFIG_PARAM and raises on anything else — LOAD_CORE can never leave this class, and a test scans every datagram a full probe sends to prove it.
  • Honest about what NCI cannot say. It has no installed-core list (upstream's LIST_CORES is post-1.19.1 and deliberately unused), so: a loaded game's system_id proves that platform streams; everything else answers unknown, never "no" — with operator-readable wording, including the UDP ambiguity (silent host = down, firewalled, or NCI off; ICMP refusal gets its own sentence naming the fix). GET_STATUS parsing verified against RetroArch v1.19.1's command.c and master's crc32-less shape, including commas inside basenames.
  • Config: RETROARCH_NCI_HOST / RETROARCH_NCI_PORT (default 55355), a General-page status row, docs in README/INSTALL/docker-compose. The breaker + TTL discipline carries over: only successes are cached, an optional feature never hangs a page.

63 new tests on an injected fake UDP transport (no sockets). Full suite: 2345 passed, 3 skipped.