Architektūra
Bendra veikimo eiga
Numatytasis režimas (vietinis tmux + tunelis):
Kodas
Browser (phone)
|
| HTTPS
v
Cloudflare Quick Tunnel
|
| HTTP/WS
v
Local Termbridge server
|
| PTY
v
Tmux session
Tiesioginis smėliadėžės režimas (Daytona, be tunelio):
Kodas
Browser (phone)
|
| HTTPS
v
Daytona preview link
|
| HTTP/WS
v
Termbridge server (sandbox)
|
| PTY
v
Tmux session (sandbox)
Nustačius --no-tunnel, Termbridge praleidžia Cloudflare ir naudoja jūsų pateiktą viešą URL.
Komponentai
CLI procesas
- Paleidžia HTTP serverį, teikiantį UI išteklius.
- Paleidžia WebSocket serverį terminalo įvesties ir išvesties srautams.
- Sukuria vieną ar kelias tmux sesijas (arba Daytona PTY).
- Išduoda vienkartinius išpirkimo žetonus.
- Paleidžia ir stebi tunelį, jei jis įjungtas (šiuo metu Cloudflare).
- Tiesioginiu smėliadėžės režimu paleidžia Termbridge smėliadėžėje ir laukia bendrinimo URL.
Terminalo posistemė
- tmux posistemė: naudoja
node-pty, kad prisijungtų prie tmux ir perduotų tikrus klavišų paspaudimus bei išvestį. - Daytona posistemė: naudoja Daytona PTY smėliadėžėje.
- Nustato
TERM=xterm-256colorirCOLORTERM=truecolor, kad būtų palaikomos visos spalvos. - Naudojant tmux, išjungia būsenos juostą tmux, kad UI liktų tvarkingas.
Terminalų registras
- Stebi pasiekiamas terminalo sesijas.
- Pateikia sąrašą UI ir patikrina pasirinktų terminalų ID.
Autentifikavimas ir sesija
- Vienkartinis žetonas išvedamas kaip URL ir užkoduojamas QR kode.
GET /__tb/s/:tokenišperka žetoną ir nustato slapuko sesiją.- WebSocket ryšiams būtinas galiojantis sesijos slapukas ir CSRF žetonas.
- CSRF žetonas gaunamas per
GET /__tb/api/csrfir perduodamas WebSocket užklausos parametru.
Tarpinio serverio režimas
Kai perduodamas --proxy <port>:
- Visi termbridge maršrutai pateikiami po
/__tb/prefiksu - Užklausos, kurios nėra
/__tb/, persiunčiamos tikslinei programai - UI peržiūrų parinkiklyje pateikia Terminalo ir Peržiūros rodinius
- Peržiūros rodinyje įkeliamas iframe, nukreipiantis į
/ - HMR WebSocket ryšiai persiunčiami tikslinei programai
Sauga
- CSRF apsauga: WebSocket ryšio atnaujinimui būtinas CSRF žetonas, apsaugantis nuo užgrobimo iš kitos svetainės.
- Įvesties apribojimai: 64KB HTTP turinio, 1MB WebSocket pranešimas, 64KB terminalo įvestis vienam pranešimui.
- Užklausų dažnio ribojimas: apribojimai pagal IP taikomi žetonų išpirkimui ir WebSocket ryšiams.
API galiniai taškai
Visi maršrutai pateikiami po prefiksu /__tb/, kad nekiltų konfliktų su persiunčiamomis programomis:
GET /__tb/healthz– būsenos patikraGET /__tb/s/:token– žetono išpirkimas → slapukas → peradresavimasGET /__tb/api/terminals– terminalų sąrašo gavimasGET /__tb/api/csrf– CSRF žetono gavimas WebSocket ryšiuiGET /__tb/api/config– konfigūracijos gavimas (proxyPort, devProxyUrl)POST /__tb/api/terminals– naujos tmux sesijos kūrimasGET /__tb/app/*– SPA atsarginis maršrutasWS /__tb/ws/terminal/:terminalId?csrf=<token>– terminalo įvesties ir išvesties srautas
Įjungus tarpinio serverio režimą:
GET /– peradresuoja į persiunčiamą programą (arba į/__tb/app, jei išjungta)* /*– persiunčiama tikslinei programai
WebSocket protokolas
Klientas -> serveris:
JSON
{ "type": "input", "data": "ls -la" }
{ "type": "resize", "cols": 120, "rows": 32 }
{ "type": "control", "key": "ctrl_c" }
Serveris -> klientas:
JSON
{ "type": "output", "data": "..." }
{ "type": "status", "state": "connected" }
UI stekas
- Vite + TanStack Router
- xterm.js + Fit priedas + WebGL vaizduoklis
- Pirmiausia mobiliesiems pritaikytas išdėstymas su fiksuota įvesties juosta
- Automatinis pakartotinis prisijungimas su eksponentiniu laukimo laiku (iki 10 bandymų)
- Ryšio būsenos indikatorius