INTEGRITY Dokumentace

WebSockets

Kontext

WebSockets vám umožňují komunikovat v reálném čase s vašimi serverless funkcemi Cloudflare Workers. Kompletní příklad najdete v Použití WebSockets API.

Konstruktor

// { 0: <WebSocket>, 1: <WebSocket> }
let websocketPair = new WebSocketPair();

WebSocketPair vrácený tímto konstruktorem je Object se dvěma WebSockety na klíčích 0 a 1.

Tyto WebSockets se běžně označují jako client a server. Následující příklad kombinuje Object.values a ES6 destrukturalizaci k získání WebSocketů jako client a server:

let [client, server] = Object.values(new WebSocketPair());

Metody

accept

Parametry

addEventListener

Parametry

zavřít

Parametry

odeslat

Parametry


Vlastnosti

readyState

binaryType


Události

Typy

Zpráva


Chování při zavření

S web_socket_auto_reply_to_close příznak kompatibility (ve výchozím nastavení povolen u dat kompatibility od 2026-04-07), běhové prostředí Workers automaticky odešle odpovídající rámec Close, jakmile od protistrany obdrží rámec Close. Toto readyState přechází do CLOSED před close se spustí událost. To odpovídá Specifikace WebSocket a standardní chování prohlížeče.

Pokud přesto zavoláte close() uvnitř close obslužné rutině události se volání tiše ignoruje. Stávající kód, který ručně odpovídá na rámce Close, bude fungovat i nadále beze změn.

server.addEventListener("close", (event) => {
  // readyState is already CLOSED — no need to call server.close().
  console.log(server.readyState); // WebSocket.CLOSED
  console.log(event.code);        // 1000
  console.log(event.wasClean);    // true
});

Polootevřený režim pro proxy

Automatické chování při uzavírání může narušit proxování WebSocket, kdy Worker stojí mezi klientem a backendem a potřebuje nezávisle koordinovat uzavření na obou stranách. Aby to bylo možné, předejte { allowHalfOpen: true } na accept():

server.accept({ allowHalfOpen: true });

server.addEventListener("close", (event) => {
  // readyState is still CLOSING here, giving you time
  // to coordinate the close on the other side.
  console.log(server.readyState); // WebSocket.CLOSING

  // Manually close when ready.
  server.close(event.code, "done");
});

Předchozí chování

U dat kompatibility před 2026-04-07 (nebo s web_socket_manual_reply_to_close příznak), přijetí rámce Close ponechá WebSocket ve CLOSING stavu a váš kód musí zavolat close() pro dokončení handshaku. Pokud tak neučiníte, může dojít k 1006 chyby neobvyklého ukončení spojení (abnormal closure) na straně klienta.


Binární zprávy

Rámce WebSocket nesou buď textový, nebo binární obsah a volbu mezi nimi provádí odesílatel v okamžiku odeslání rámce. Textové rámce se vždy doručují do message událost jako řetězce JavaScriptu. Binární rámce se doručují buď jako Blob nebo jako ArrayBuffer, v závislosti na binaryType.

S websocket_standard_binary_type příznak kompatibility (ve výchozím nastavení povolen u dat kompatibility od 2026-03-17), binaryType má výchozí hodnotu "blob" a binární rámce jsou doručovány jako Blob objekty. To odpovídá Specifikace WebSocket a standardní chování prohlížeče. Bez tohoto příznaku binaryType má výchozí hodnotu "arraybuffer" a binární rámce jsou doručovány jako ArrayBuffer, což odpovídá dosavadnímu chování runtime.

binaryType vlastnost samotná je k dispozici vždy. Chcete-li se vrátit k ArrayBuffer doručování pro jediný WebSocket přiřaďte binaryType před voláním accept():

const resp = await fetch("https://example.com", {
  headers: { Upgrade: "websocket" },
});
const ws = resp.webSocket;

// Opt back into ArrayBuffer delivery for this WebSocket.
ws.binaryType = "arraybuffer";
ws.accept();

ws.addEventListener("message", (event) => {
  if (typeof event.data === "string") {
    // Text frame.
  } else {
    // event.data is an ArrayBuffer because we set binaryType above.
  }
});

Čtení binárních payloadů

Příchozí binární rámec je zcela bufferován před message se spustí událost, bez ohledu na binaryType. Volba mezi Blob a ArrayBuffer nemění, kdy nebo zda je snímek přijat, pouze způsob, jakým přistupujete k jeho bajtům:

Podle nového výchozího chování musí být obslužná rutina binárních zpráv async abyste mohli přečíst payload. Pokud chcete zachovat stávající synchronní handler, nastavte binaryType na "arraybuffer" na WebSocketu.

Kdy se hodnota uplatní

Podle Specifikace WebSocket, binaryType je proměnlivé: hodnota se zjišťuje ve chvíli, kdy je každý binární rámec odeslán do message událost, takže přiřazení nové hodnoty ovlivní jen následující zprávy. Pokud chcete, aby se každá binární zpráva na WebSocketu doručovala jako stejný typ, přiřaďte binaryType před voláním accept(). Tím je zaručeno, že nastavení je platné dříve, než runtime začne doručovat příchozí rámce.

Opt-out pro celý Worker

Pokud ještě nejste připraveni k migraci a chcete ponechat ArrayBuffer jako výchozí hodnotu pro každý WebSocket ve vašem Workeru přidejte no_websocket_standard_binary_type příznak do svého Konfigurační soubor Wrangler. Jednotlivé WebSockety mohou výchozí hodnotu přepsat přiřazením binaryType.