Files
chanora/poc/tsclientlib-connect-spike
EdisonJwa 02c11ead7e feat(poc/protocol): add tsclientlib connect spike
Proof-of-concept proving the protocol-feasibility exit criterion from
docs/architecture/proof-of-concept-plan.md §2:
  "Rust can connect to a compatible server/test double."

The spike opens a tsclientlib connection, waits for the BookEvents
state snapshot, subscribes to the server channel tree, prints
server metadata and the channel tree with client names, and
disconnects cleanly. Audio feature is disabled because audio is
covered by a separate PoC.

Verified on 2026-05-13 against cn.teamspeak.app (TeamSpeak 3 server
3.13.7); 36 channels and 5 online clients retrieved with full
UTF-8 (CJK) preservation. See
poc/tsclientlib-connect-spike/VERIFICATION.md for the captured run.

Authority: PoC plan §2, SysRS-005, SysDes-011, SysDes-029.
Not product code; not promoted into chanora_protocol.
2026-05-14 12:25:48 +08:00
..

tsclientlib Connect Spike

Chanora proof-of-concept. Not product code.

Field Value
PoC name tsclientlib-connect-spike
PoC plan docs/architecture/proof-of-concept-plan.md §2
Purpose Prove protocol feasibility via tsclientlib
Exit criterion "Rust can connect to a compatible server/test double"

What it does

  1. Generates an ephemeral identity (or accepts one via --identity).
  2. Connects to a TeamSpeak-3-compatible server.
  3. Waits for the initial state snapshot (StreamItem::BookEvents).
  4. Subscribes to the server's channel tree.
  5. Prints server metadata + the channel tree with client names.
  6. Disconnects cleanly.

Run

Requires Rust stable (developed against 1.95). Network access required so that cargo can fetch tsclientlib from GitHub on first build.

cargo run --release -- --address cn.teamspeak.app

Useful flags:

Flag Meaning
-a, --address <host[:port]> Server (default cn.teamspeak.app)
-n, --nickname <name> Nickname (default ChanoraPoC)
--password <pw> Server password if required
--identity <base64> Reuse an existing identity instead of generating one
--hold-secs <n> Seconds to hold the connection before disconnect (default 3)
-v / -vv / -vvv Increase tsclientlib log verbosity

Scope boundaries

This spike is intentionally narrow:

  • No audio capture or playback (covered by audio-capture-playback-spike).
  • No FFI surface (covered by flutter-rust-bridge-hello).
  • No persistent identity (covered by secure-storage-spike).
  • No diagnostic redaction policy (covered by diagnostics-redaction-spike).
  • No Chanora architecture layering — does not live inside chanora_protocol and does not expose typed DTOs. The intent of the spike is to validate the upstream tsclientlib API surface before the product crate is written, per the PoC plan.

Verification log

See VERIFICATION.md in this directory for the most recent run captured against cn.teamspeak.app.