← Sandbox SDK / sandbox / api
Terminál
Připojte terminálová UI v prohlížeči k shellům sandboxu přes WebSocket. Serverová část terminal() metoda předává WebSocket připojení kontejneru a klientská SandboxAddon se integruje s xterm.js pro vykreslování terminálu.
Metody na straně serveru
terminal()
Proxujte požadavek na WebSocket upgrade, čímž vytvoříte terminálové spojení.
const response = await sandbox.terminal(request: Request, options?: PtyOptions): Promise<Response>Parametry:
request- Požadavek na upgrade WebSocket z prohlížeče (musí obsahovatUpgrade: websockethlavička)options(volitelné):cols- Šířka terminálu ve sloupcích (výchozí:80)rows- Výška terminálu v řádcích (výchozí:24)
Vrací: Promise<Response> : Odpověď na upgrade WebSocket
// In your Worker's fetch handler
return await sandbox.terminal(request, { cols: 120, rows: 30 });// In your Worker's fetch handler
return await sandbox.terminal(request, { cols: 120, rows: 30 });Funguje s oběma výchozí a explicitně vytvořené relace:
// Default session
return await sandbox.terminal(request);
// Specific session
const session = await sandbox.getSession("dev");
return await session.terminal(request);// Default session
return await sandbox.terminal(request);
// Specific session
const session = await sandbox.getSession('dev');
return await session.terminal(request);Doplněk na straně klienta
@cloudflare/sandbox/xterm modul poskytuje SandboxAddon pro xterm.js, který se stará o WebSocket připojení, opětovné připojení a předávání změny velikosti terminálu.
SandboxAddon
import { SandboxAddon } from '@cloudflare/sandbox/xterm';
const addon = new SandboxAddon(options: SandboxAddonOptions);Možnosti:
getWebSocketUrl(params)- Sestavte WebSocket URL pro každý pokus o připojení. Přijímá:sandboxId- ID cílového sandboxusessionId(volitelné) - ID cílové relaceorigin- Původ WebSocket odvozený zwindow.location(napříkladwss://example.com)
reconnect- Povolte automatické opětovné připojení s exponenciálním backoffem (výchozí:true)onStateChange(state, error?)- Callback pro změny stavu připojení
import { Terminal } from "@xterm/xterm";
import { SandboxAddon } from "@cloudflare/sandbox/xterm";
const terminal = new Terminal({ cursorBlink: true });
terminal.open(document.getElementById("terminal"));
const addon = new SandboxAddon({
getWebSocketUrl: ({ sandboxId, sessionId, origin }) => {
const params = new URLSearchParams({ id: sandboxId });
if (sessionId) params.set("session", sessionId);
return `${origin}/ws/terminal?${params}`;
},
onStateChange: (state, error) => {
console.log(`Terminal ${state}`, error);
},
});
terminal.loadAddon(addon);
addon.connect({ sandboxId: "my-sandbox" });import { Terminal } from '@xterm/xterm';
import { SandboxAddon } from '@cloudflare/sandbox/xterm';
const terminal = new Terminal({ cursorBlink: true });
terminal.open(document.getElementById('terminal'));
const addon = new SandboxAddon({
getWebSocketUrl: ({ sandboxId, sessionId, origin }) => {
const params = new URLSearchParams({ id: sandboxId });
if (sessionId) params.set('session', sessionId);
return `${origin}/ws/terminal?${params}`;
},
onStateChange: (state, error) => {
console.log(`Terminal ${state}`, error);
}
});
terminal.loadAddon(addon);
addon.connect({ sandboxId: 'my-sandbox' });connect()
Naváže spojení s terminálem sandboxu.
addon.connect(target: ConnectionTarget): voidParametry:
target:sandboxId- Sandbox, ke kterému se má připojitsessionId(volitelné) - Relace uvnitř sandboxu
Volání connect() s novým cílem se odpojí od aktuálního cíle a připojí se k novému. Zavolání se stejným cílem, pokud je spojení již navázáno, nemá žádný účinek.
disconnect()
Zavřete spojení a zastavte všechny pokusy o opětovné připojení.
addon.disconnect(): voidVlastnosti
| Vlastnost | Typ | Popis |
|---|---|---|
state |
'disconnected' | 'connecting' | 'connected' |
Aktuální stav připojení |
sandboxId |
string | undefined |
Aktuální ID sandboxu |
sessionId |
string | undefined |
Aktuální ID relace |
Protokol WebSocket
SandboxAddon obsluhuje protokol WebSocket automaticky. Tyto podrobnosti jsou určeny pro tvorbu vlastních terminálových klientů bez tohoto doplňku. Úplný příklad najdete v Připojte se bez xterm.js.
Životní cyklus připojení
- Klient otevře WebSocket na váš koncový bod Worker. Nastavte
binaryTypenaarraybuffer. - Server přehraje veškerý bufferovaný výstup z předchozího připojení jako binární rámce. To může dorazit dříve než
readyzprávy. - Server odešle
readystavová zpráva: terminál nyní přijímá vstup. - Binární rámce proudí oběma směry: od klienta přicházejí stisky kláves zakódované v UTF-8, od serveru výstup terminálu (včetně escape sekvencí ANSI).
- Pokud se klient odpojí, PTY zůstává aktivní. Při opětovném připojení ke stejné relaci se přehraje zaznamenaný výstup, takže terminál vypadá nezměněně.
Řídicí zprávy (klient na server)
Terminál ovládejte odesíláním textových rámců JSON.
Změna velikosti : aktualizace rozměrů terminálu (obojí cols a rows musí být kladné):
{ "type": "resize", "cols": 120, "rows": 30 }Stavové zprávy (server klientovi)
Server odesílá textové rámce JSON pro události životního cyklu.
Připraveno : PTY je inicializován. Bufferovaný výstup (pokud existuje) už byl odeslán:
{ "type": "ready" }Ukončit : proces shellu byl ukončen:
{ "type": "exit", "code": 0, "signal": "SIGTERM" }Chyba : došlo k chybě (například neplatná řídicí zpráva nebo nenalezená relace):
{ "type": "error", "message": "Session not found" }Typy
interface PtyOptions {
cols?: number;
rows?: number;
}
type ConnectionState = "disconnected" | "connecting" | "connected";
interface ConnectionTarget {
sandboxId: string;
sessionId?: string;
}
interface SandboxAddonOptions {
getWebSocketUrl: (params: {
sandboxId: string;
sessionId?: string;
origin: string;
}) => string;
reconnect?: boolean;
onStateChange?: (state: ConnectionState, error?: Error) => void;
}Související zdroje
- Terminálová připojení : Jak fungují terminálová připojení
- Terminály v prohlížeči : Návod k nastavení krok za krokem
- Sessions API : Správa relací
- Commands API : Neinteraktivní spouštění příkazů