Arhitectură
Fluxul general
Implicit (local tmux + tunel):
Cod
Browser (phone)
|
| HTTPS
v
Cloudflare Quick Tunnel
|
| HTTP/WS
v
Local Termbridge server
|
| PTY
v
Tmux session
Mod sandbox direct (Daytona, fără tunel):
Cod
Browser (phone)
|
| HTTPS
v
Daytona preview link
|
| HTTP/WS
v
Termbridge server (sandbox)
|
| PTY
v
Tmux session (sandbox)
Când este setat --no-tunnel, Termbridge omite Cloudflare și folosește URL public furnizat de dumneavoastră.
Componente
Procesul CLI
- Pornește serverul HTTP care servește resursele UI.
- Pornește serverul WebSocket pentru I/O-ul terminalului.
- Creează una sau mai multe sesiuni tmux (sau PTY-uri Daytona).
- Emite tokenuri de revendicare cu o singură utilizare.
- Pornește și monitorizează tunelul când este activat (Cloudflare în prezent).
- În modul sandbox direct, lansează Termbridge în sandbox și așteaptă linkul de partajare URL.
Backendul terminalului
- Backend tmux: Folosește
node-ptypentru a se conecta la tmux și a transmite apăsările de taste și ieșirea în timp real. - Backend Daytona: Folosește PTY-uri Daytona în interiorul unui sandbox.
- Setează
TERM=xterm-256colorșiCOLORTERM=truecolorpentru suport complet al culorilor. - Pentru tmux, dezactivează bara de stare tmux pentru a păstra curat UI.
Registrul terminalelor
- Urmărește sesiunile de terminal disponibile.
- Oferă o listă pentru UI și validează ID-urile terminalelor selectate.
Autentificare și sesiune
- Tokenul cu o singură utilizare este afișat ca URL și codificat într-un cod QR.
GET /__tb/s/:tokenrevendică tokenul și setează o sesiune prin cookie.- Conexiunile WebSocket necesită un cookie de sesiune valid și un token CSRF.
- Tokenul CSRF este preluat prin
GET /__tb/api/csrfși transmis ca parametru în interogarea WebSocket.
Modul proxy
Când se transmite --proxy <port>:
- Toate rutele termbridge se află sub prefixul
/__tb/ - Cererile care nu sunt
/__tb/sunt direcționate prin proxy către aplicația țintă - UI afișează vizualizările Terminal/Preview prin comutatorul Views
- Vizualizarea Preview încarcă un iframe care indică spre
/ - Conexiunile WebSocket pentru HMR sunt redirecționate către țintă
Securitate
- Protecție CSRF: upgrade-urile WebSocket necesită un token CSRF pentru a preveni deturnarea între site-uri.
- Limite de intrare: corp HTTP de 64KB, mesaj WebSocket de 1MB, intrare în terminal de 64KB per mesaj.
- Limitarea ratei: limite per IP pentru revendicarea tokenurilor și conexiunile WebSocket.
Endpointuri API
Toate rutele se află sub prefixul /__tb/ pentru a evita conflictele cu aplicațiile direcționate prin proxy:
GET /__tb/healthz- verificare a stăriiGET /__tb/s/:token- revendicare token → cookie → redirecționareGET /__tb/api/terminals- listare terminaleGET /__tb/api/csrf- obținere token CSRF pentru WebSocketGET /__tb/api/config- obținere configurație (proxyPort, devProxyUrl)POST /__tb/api/terminals- creare sesiune nouă tmuxGET /__tb/app/*- fallback SPAWS /__tb/ws/terminal/:terminalId?csrf=<token>- transmitere I/O terminal
Când modul proxy este activat:
GET /- redirecționează către aplicația prin proxy (sau/__tb/appdacă este dezactivat)* /*- direcționat prin proxy către aplicația țintă
Protocol WebSocket
Client -> server:
JSON
{ "type": "input", "data": "ls -la" }
{ "type": "resize", "cols": 120, "rows": 32 }
{ "type": "control", "key": "ctrl_c" }
Server -> client:
JSON
{ "type": "output", "data": "..." }
{ "type": "status", "state": "connected" }
Stiva UI
- Vite + TanStack Router
- xterm.js + extensia Fit + randare WebGL
- Interfață concepută pentru mobil, cu bară de introducere fixă
- Reconectare automată cu pauze exponențiale (până la 10 încercări)
- Indicator al stării conexiunii