Arsitektur
Alur tingkat tinggi
Default (lokal tmux + tunnel):
Kode
Browser (phone)
|
| HTTPS
v
Cloudflare Quick Tunnel
|
| HTTP/WS
v
Local Termbridge server
|
| PTY
v
Tmux session
Mode sandbox langsung (Daytona, tanpa tunnel):
Kode
Browser (phone)
|
| HTTPS
v
Daytona preview link
|
| HTTP/WS
v
Termbridge server (sandbox)
|
| PTY
v
Tmux session (sandbox)
Saat --no-tunnel diatur, Termbridge melewati Cloudflare dan menggunakan URL publik yang Anda berikan.
Komponen
Proses CLI
- Menjalankan server HTTP yang menyajikan aset UI.
- Menjalankan server WebSocket untuk I/O terminal.
- Membuat satu atau beberapa sesi tmux (atau PTY Daytona).
- Menerbitkan token penukaran sekali pakai.
- Menjalankan dan memantau tunnel jika diaktifkan (saat ini Cloudflare).
- Dalam mode sandbox langsung, meluncurkan Termbridge di dalam sandbox dan menunggu URL berbagi.
Backend terminal
- Backend tmux: Menggunakan
node-ptyuntuk terhubung ke tmux demi input tombol dan output nyata. - Backend Daytona: Menggunakan PTY Daytona di dalam sandbox.
- Mengatur
TERM=xterm-256colordanCOLORTERM=truecoloruntuk dukungan warna penuh. - Untuk tmux, menonaktifkan bilah status tmux agar UI tetap bersih.
Registri terminal
- Melacak sesi terminal yang tersedia.
- Menyediakan daftar untuk UI dan memvalidasi ID terminal yang dipilih.
Autentikasi dan sesi
- Token sekali pakai dicetak sebagai URL dan dikodekan dalam kode QR.
GET /__tb/s/:tokenmenukar token dan mengatur sesi cookie.- Koneksi WebSocket memerlukan cookie sesi yang valid dan token CSRF.
- Token CSRF diambil melalui
GET /__tb/api/csrfdan diteruskan dalam parameter kueri WebSocket.
Mode proxy
Saat --proxy <port> diberikan:
- Semua rute termbridge berada di bawah prefiks
/__tb/ - Permintaan non-
/__tb/diteruskan ke aplikasi target melalui proxy - UI menampilkan tampilan Terminal/Preview melalui pemilih Views
- Tampilan Preview memuat iframe yang mengarah ke
/ - Koneksi WebSocket untuk HMR diteruskan ke target
Keamanan
- Perlindungan CSRF: Upgrade WebSocket memerlukan token CSRF untuk mencegah pembajakan lintas situs.
- Batas input: body HTTP 64KB, pesan WebSocket 1MB, input terminal 64KB per pesan.
- Pembatasan laju: Batas per-IP pada penukaran token dan koneksi WebSocket.
Endpoint API
Semua rute berada di bawah prefiks /__tb/ untuk menghindari konflik dengan aplikasi yang diproksikan:
GET /__tb/healthz- pemeriksaan kesehatanGET /__tb/s/:token- penukaran token → cookie → pengalihanGET /__tb/api/terminals- daftar terminalGET /__tb/api/csrf- mengambil token CSRF untuk WebSocketGET /__tb/api/config- mengambil konfigurasi (proxyPort, devProxyUrl)POST /__tb/api/terminals- membuat sesi tmux baruGET /__tb/app/*- fallback SPAWS /__tb/ws/terminal/:terminalId?csrf=<token>- streaming I/O terminal
Saat mode proxy diaktifkan:
GET /- mengalihkan ke aplikasi yang diproksikan (atau/__tb/appjika dinonaktifkan)* /*- diteruskan ke aplikasi target melalui proxy
Protokol WebSocket
Klien -> server:
JSON
{ "type": "input", "data": "ls -la" }
{ "type": "resize", "cols": 120, "rows": 32 }
{ "type": "control", "key": "ctrl_c" }
Server -> klien:
JSON
{ "type": "output", "data": "..." }
{ "type": "status", "state": "connected" }
Stack UI
- Vite + TanStack Router
- xterm.js + add-on Fit + renderer WebGL
- Tata letak mobile-first dengan bilah input tetap
- Sambung ulang otomatis dengan jeda eksponensial (hingga 10 percobaan ulang)
- Indikator status koneksi