INTEGRITY Dokumentace

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:

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:

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): void

Parametry:

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(): void

Vlastnosti

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í

  1. Klient otevře WebSocket na váš koncový bod Worker. Nastavte binaryType na arraybuffer.
  2. 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ž ready zprávy.
  3. Server odešle ready stavová zpráva: terminál nyní přijímá vstup.
  4. 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).
  5. 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;
}