Files
chanora/poc/tsclientlib-connect-spike/README.md
T
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

58 lines
2.1 KiB
Markdown

# 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`](../../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.
```bash
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`.