# RustDesk web client Browser-based RustDesk client embedded in `rustdesk-server`. Surfaced from the admin dashboard as a "Connect" button on the Devices page. ## Architecture (one-liner) Plain TypeScript SPA → talks WebSocket directly to `hbbs:21118` (rendezvous) and `hbbr:21119` (relay) → `protobufjs` for wire format → `libsodium-wrappers` for crypto → WebCodecs for video/audio decode → `` for display. No frameworks. ~1 MB minified. ## Building ```sh ./build.sh # bundles to dist/bundle.{js,css} git add dist/ ``` `dist/` is committed so `cargo build -p hbbs` doesn't need Node. Anyone touching code under `src/` should re-run `./build.sh` and commit the new `dist/` files in the same commit. ## Regenerating proto bindings Rare — only when `libs/hbb_common` bumps and proto fields change: ```sh npm run protogen ./build.sh git add src/proto/generated.* dist/ ``` ## Layout ``` src/ main.ts boot: read #custom-config, init transport crypto.ts libsodium wrapper proto/ generated protobufjs static modules (committed) transport/ rendezvous WS, relay WS, secure handshake state machine decode/ video (WebCodecs VideoDecoder), audio (AudioDecoder) input/ mouse/keyboard capture → protobuf MouseEvent/KeyEvent ui/ canvas + toolbar + style.css audit.ts POST /api/audit/conn with admin cookie dist/ bundle.js + .css committed esbuild output ``` ## Wire-protocol references - `/Users/sn0/Desktop/rustdesk-server/libs/hbb_common/protos/{rendezvous,message}.proto` - `/Users/sn0/Desktop/rustdesk/src/client.rs` — desktop-client connect/secure/login state machine - `/Users/sn0/Desktop/rustdesk-server/libs/hbb_common/src/tcp.rs:296-344` — secretbox nonce derivation (8-byte LE counter, separate per direction)