Skip to content

Releases: arthursoares/roon-api-reverse-engineering

v0.1.1 — Protocol and session reliability

Choose a tag to compare

@arthursoares arthursoares released this 01 Oct 17:11

Protocol correctness, reliable Core sessions, and a read-only play-history exporter.
Prepared and adversarially reviewed with Codex.

Added

  • Read-only JSON-lines history export with bounded paging, identity deduplication,
    newest-first ordering, explicit retrieval failures, and page/query cleanup.
    #18
  • Published release history on GitHub Pages, generated from this changelog, with
    current onboarding, contributor checks, and validation guidance.
  • Runnable SDK lint and PR validation for SDK/web tests and builds, documentation,
    and tracked, deterministic generated output.
    #21,
    #25

Fixed

  • Reject pending RPCs promptly on close or failed sends; buffer split/coalesced
    handshake records and reject premature closure. Cancel the handshake watchdog
    once established so healthy idle sessions remain open.
    #5,
    #17,
    #25
  • Use immutable full struct schemas and stable member indexes across handwritten
    and generated calls. Preserve captured Sooloos.Broker.Api.* wire names when
    newer DLL metadata uses Roon.Broker.Api.*.
    #19
  • Preserve nullable values with the correct Bool/Sooid/scalar encodings and retain
    pre-serialized nullable scalar Buffer compatibility.
    #22
  • Correct the exported legacy Arg.refList framing to match length-prefixed
    Arg.collection reference collections.
    #23
  • Follow each search callback's ordered memberships, including cached full
    entities. Decode DataList separately from Query and preserve populated objects
    across repeated PUSHSTUB frames, fixing repeated and concurrent searches.
    #24
  • Recover the web backend with fresh, coalesced clients; reject stale session IDs;
    clear disconnected UI/pending state and ignore late HTTP/search responses.
    Read profile-scoped favorite state and preserve playlist/genre search sections.
    #25
  • Align onboarding with current exports and validated environment configuration;
    keep the demo read-only and label historical mutation experiments accurately.
    #20

Compatibility

  • Arg.refList remains exported but is deprecated; its invalid wire bytes are
    intentionally corrected. Prefer explicit Arg.collection construction.
  • A typename's low-level struct declaration must remain immutable. Incompatible
    reuse and unknown/duplicate generated fields now fail explicitly.
  • SDK search keeps its existing default result families. The optional third
    argument includes playlists and genres; the web opts in.
  • The demo/history exporter accept ROON_BROKER_ID as a legacy alias for
    ROON_SERVER_BROKER_ID.

Validation and limits

  • 145 SDK tests and 25 web tests pass, along with SDK lint/build, web
    typecheck/build, deterministic generation, docs build, and hosted CI.
  • Read-only validation on Roon 2.73 build 1696 covered a 150-play export,
    repeated/concurrent and named-category search, favorite-state rendering,
    controlled test-client recovery, stale-action rejection, and a usable session
    after more than 23 seconds of idle time. One concurrent read timed out;
    bounded retries passed.
  • No live favorite/metadata, playback, volume, power mutation, or Core restart
    was used for validation. Write transitions use mocks and existing protocol
    evidence. Most generated methods remain unverified against a live Core.
  • This remains an experimental private-protocol client; broader version and
    streaming-provider compatibility is not established. The offline drift-checker
    proposal remains tracked in
    #16.

Thanks to @jnolen for the contributed close cleanup, handshake buffering,
and original history exporter in
#5,
#17, and
#18.

Full comparison

v0.1.0 — Experimental baseline

Choose a tag to compare

@arthursoares arthursoares released this 01 Oct 10:32
5a9b561

First tagged baseline of this reverse-engineering experiment, prepared with Codex at commit 5a9b561711f017aac6063a2719b9c77acf07bfb4. This release snapshots current main before the next issue-fix batch; it does not include the open PRs.

Included work:

  • TypeScript client for the internal TCP/remoting protocol, object graph, and generated API wrappers.
  • UnifiedSearch corrections: fully qualified search fields, graph-resolved profile, and fresh results (PR #3).
  • Stable album-ID favorite encoding (PR #2).
  • Length-prefixed generated collection arguments and documented evidence tiers (PR #4).
  • MIT license (PR #1).

Thanks to @jnolen for the contributed fixes and license work in PRs #1–#4.

Validation of the tagged commit: 44 SDK tests pass; SDK TypeScript build and web typecheck/build pass. Lint cannot run because the repository has no ESLint configuration. Documentation build also passes after installing the locked site dependencies. No live Core reads, playback, or mutations were performed for this release.

Known limitations remain tracked in the open issues, including struct schema reuse, generated full member names and nullable encoding, fragmented handshakes, and web recovery/favorite state. Most generated methods have not been tested against a live Core. This is an experimental baseline, not a compatibility claim for all Roon versions.