Архитектура
Общ преглед на потока
По подразбиране (локален tmux + тунел):
Код
Browser (phone)
|
| HTTPS
v
Cloudflare Quick Tunnel
|
| HTTP/WS
v
Local Termbridge server
|
| PTY
v
Tmux session
Директен режим на sandbox (Daytona, без тунел):
Код
Browser (phone)
|
| HTTPS
v
Daytona preview link
|
| HTTP/WS
v
Termbridge server (sandbox)
|
| PTY
v
Tmux session (sandbox)
Когато е зададен --no-tunnel, Termbridge пропуска Cloudflare и използва предоставения от вас публичен URL.
Компоненти
Процес CLI
- Стартира сървъра HTTP, който предоставя активите на UI.
- Стартира WebSocket сървъра за входно-изходните операции на терминала.
- Създава една или повече сесии tmux (или Daytona PTY).
- Издава еднократни токени за достъп.
- Стартира и следи тунела, когато е активиран (Cloudflare към момента).
- В директен режим на sandbox стартира Termbridge вътре в sandbox и изчаква споделения URL.
Терминален бекенд
- Бекенд tmux: Използва
node-ptyза свързване към tmux и обработка на реалните натискания на клавиши и изхода. - Бекенд Daytona: Използва PTY Daytona вътре в sandbox.
- Задава
TERM=xterm-256colorиCOLORTERM=truecolorза пълна поддръжка на цветовете. - За tmux изключва лентата на състоянието tmux, за да остави UI изчистен.
Регистър на терминалите
- Следи наличните терминални сесии.
- Предоставя списък на UI и проверява избраните идентификатори на терминали.
Удостоверяване и сесия
- Еднократният токен се отпечатва като URL и се кодира в код QR.
GET /__tb/s/:tokenизползва токена и задава сесийна бисквитка.- WebSocket връзките изискват валидна сесийна бисквитка и CSRF токен.
- CSRF токенът се извлича чрез
GET /__tb/api/csrfи се предава като параметър на заявката WebSocket.
Режим на прокси
Когато се подаде --proxy <port>:
- Всички маршрути на termbridge са с префикс
/__tb/ - Заявките, които не са
/__tb/, се препращат към целевото приложение - UI показва изгледите Terminal/Preview чрез превключвателя Views
- Изгледът Preview зарежда iframe, насочен към
/ - WebSocket връзките за HMR се препращат към целевото приложение
Сигурност
- CSRF защита: WebSocket надстройките изискват CSRF токен, за да се предотврати отвличане от друг сайт.
- Ограничения на входа: тяло на HTTP от 64KB, WebSocket съобщение от 1MB, входни данни за терминала до 64KB на съобщение.
- Ограничаване на честотата: ограничения за всяко IP при използване на токени и WebSocket връзки.
Крайни точки API
Всички маршрути са с префикс /__tb/, за да се избегнат конфликти с проксираните приложения:
GET /__tb/healthz- проверка на изправносттаGET /__tb/s/:token- използване на токен → бисквитка → пренасочванеGET /__tb/api/terminals- списък на терминалитеGET /__tb/api/csrf- получаване на CSRF токен за WebSocketGET /__tb/api/config- получаване на конфигурация (proxyPort, devProxyUrl)POST /__tb/api/terminals- създаване на нова сесия tmuxGET /__tb/app/*- резервен маршрут на SPAWS /__tb/ws/terminal/:terminalId?csrf=<token>- поточно предаване на входно-изходните операции на терминала
Когато режимът на прокси е активиран:
GET /- пренасочва към проксираното приложение (или/__tb/app, ако е изключено)* /*- препраща към целевото приложение
Протокол WebSocket
Клиент -> сървър:
JSON
{ "type": "input", "data": "ls -la" }
{ "type": "resize", "cols": 120, "rows": 32 }
{ "type": "control", "key": "ctrl_c" }
Сървър -> клиент:
JSON
{ "type": "output", "data": "..." }
{ "type": "status", "state": "connected" }
Стек UI
- Vite + TanStack Router
- xterm.js + добавката Fit + рендериране чрез WebGL
- Подредба за мобилни устройства с фиксирана лента за въвеждане
- Автоматично повторно свързване с експоненциално увеличаване на интервала (до 10 опита)
- Индикатор за състоянието на връзката