← Cloudflare Workers / workers / runtime-apis
WebSockets
Контекст
WebSockets позволяют обмениваться данными в режиме реального времени с бессерверными функциями Cloudflare Workers. Полный пример см. в Использование WebSockets API.
Конструктор
// { 0: <WebSocket>, 1: <WebSocket> }
let websocketPair = new WebSocketPair();WebSocketPair, возвращаемый этим конструктором, представляет собой Object с двумя WebSocket по ключам 0 и 1.
Такие WebSocket обычно называют client и server. Пример ниже объединяет Object.values и деструктуризацию ES6, чтобы получить WebSocket как client и server:
let [client, server] = Object.values(new WebSocketPair());Методы
принять
-
accept(options?)- Принимает WebSocket-соединение и начинает обрабатывать запросы для этого WebSocket в глобальной сети Cloudflare. Это позволяет Workers runtime начать отвечать на WebSocket-запросы и обрабатывать их.
Параметры
-
optionsобъект, необязательный-
Необязательный объект конфигурации со следующими свойствами:
allowHalfOpenboolean, необязательно: еслиtrue, среда выполнения не будет автоматически отправлять ответный кадр Close при получении кадра Close от другой стороны. Вместо этогоreadyStateостаётсяCLOSINGпока вы явно не вызоветеclose(). Это полезно для Проксирование WebSocket когда нужно согласовать закрытие с обеих сторон прокси. По умолчанию используетсяfalse.
-
addEventListener
-
addEventListener(eventWebSocketEvent, callbackFunctionFunction)- Добавьте функции обратного вызова, которые будут выполняться при возникновении события в WebSocket.
Параметры
-
eventWebSocketEvent- Событие WebSocket (см. События) для прослушивания.
-
callbackFunction(messageMessage)Function- Функция, которая будет вызвана, когда WebSocket реагирует на определенное событие.
закрыть
-
close(codenumber, reasonstring)- Закройте WebSocket-соединение.
Параметры
-
codeintegerнеобязательный- Целое число, обозначающее код закрытия, отправленный сервером. Оно должно соответствовать одному из вариантов из список кодов состояния ↗ предусмотренные спецификацией WebSocket.
-
reasonstringнеобязательный- Понятная человеку строка, указывающая причину закрытия соединения WebSocket.
отправить
-
send(messagestring | ArrayBuffer | ArrayBufferView)- Отправьте сообщение другому WebSocket в этой паре WebSocket.
Параметры
-
messagestring- Сообщение, отправляемое через WebSocket-соединение соответствующему клиенту. Это должна быть строка или значение, приводимое к строке: например, строки и числа просто приводятся к строковому типу, а объекты и массивы следует преобразовывать в JSON-строки с помощью
JSON.stringify, и разбирается на стороне клиента.
- Сообщение, отправляемое через WebSocket-соединение соответствующему клиенту. Это должна быть строка или значение, приводимое к строке: например, строки и числа просто приводятся к строковому типу, а объекты и массивы следует преобразовывать в JSON-строки с помощью
Свойства
readyState
-
readyStateчисло-
Возвращает текущее состояние соединения WebSocket. Возможные значения:
Константа Значение Описание WebSocket.CONNECTING0Соединение ещё не открыто. WebSocket.OPEN1Соединение открыто и готово к обмену данными. WebSocket.CLOSING2Соединение находится в процессе закрытия. WebSocket.CLOSED3Соединение закрыто.
-
binaryType
-
binaryTypeстрока- Управляет тем, как двоичные кадры, полученные через этот WebSocket, передаются в
messageсобытие. Допустимые значения:"blob"и"arraybuffer". Это значение проверяется при обработке каждого входящего бинарного фрейма, поэтому присвоение нового значения влияет только на последующие сообщения. Значение по умолчанию задаётсяwebsocket_standard_binary_typeфлаг совместимости. См. Двоичные сообщения для получения подробностей.
- Управляет тем, как двоичные кадры, полученные через этот WebSocket, передаются в
События
-
close- Событие, сообщающее о закрытии WebSocket. Также доступны свойства
CloseEventвключаетcode(число),reason(строка), иwasClean(логического типа) свойства.
- Событие, сообщающее о закрытии WebSocket. Также доступны свойства
-
error- Событие, сообщающее об ошибке WebSocket.
-
message- Событие, сообщающее о получении нового сообщения от клиента, включая данные, переданные клиентом.
Типы
Сообщение
dataany - данные, переданные обратно от второго WebSocket в вашей паре.typeстрока. По умолчанию:message.
Поведение при закрытии
С web_socket_auto_reply_to_close флаг совместимости (включён по умолчанию при дате совместимости от 2026-04-07), среда выполнения Workers автоматически отправляет ответный кадр Close при получении кадра Close от другой стороны. После этого readyState переходит в CLOSED перед close событие срабатывает. Это соответствует Спецификация WebSocket ↗ и стандартным поведением браузера.
Если вы всё же вызываете close() внутри close обработчик события, вызов молча игнорируется. Существующий код, который вручную отвечает на фреймы Close, продолжит работать без изменений.
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
});Режим half-open для проксирования
Автоматическое закрытие соединения может мешать проксированию WebSocket, когда Worker находится между клиентом и бэкендом и должен независимо координировать закрытие с обеих сторон. Чтобы поддержать этот сценарий, передайте { allowHalfOpen: true } к 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");
});Предыдущее поведение
При датах совместимости до 2026-04-07 (или с web_socket_manual_reply_to_close флаг), получение фрейма Close оставляет WebSocket в CLOSING состояние, и ваш код должен вызвать close() чтобы завершить handshake. Если этого не сделать, это может привести к 1006 ошибки аномального закрытия соединения на стороне клиента.
Двоичные сообщения
Фреймы WebSocket содержат либо текстовые, либо двоичные данные, и выбор между ними делает отправитель в момент отправки фрейма. Текстовые фреймы всегда доставляются в message событие в виде строк JavaScript. Бинарные фреймы доставляются либо как Blob ↗ или как ArrayBuffer ↗, в зависимости от WebSocket binaryType.
С websocket_standard_binary_type флаг совместимости (включён по умолчанию при дате совместимости от 2026-03-17), binaryType по умолчанию равно "blob" и бинарные фреймы передаются в виде Blob объекты. Это соответствует Спецификация WebSocket ↗ и стандартным поведением браузера. Без этого флага binaryType по умолчанию равно "arraybuffer" и бинарные фреймы передаются в виде ArrayBuffer, соответствуя историческому поведению runtime.
binaryType свойство само по себе доступно всегда. Чтобы вернуться к ArrayBuffer доставку для одного WebSocket, назначьте binaryType перед вызовом 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.
}
});Чтение двоичных данных
Входящий двоичный кадр полностью буферизуется перед тем, как message событие срабатывает, независимо от binaryType. Выбор между Blob и ArrayBuffer не влияет на то, когда и будет ли получен фрейм: она влияет только на то, как вы получаете доступ к его байтам:
- С
"arraybuffer",event.dataэтоArrayBuffer↗. Вы можете проверить его размер и синхронно прочитать байты (например,new Uint8Array(event.data)). - С
"blob",event.dataэтоBlob↗. Чтение байтов выполняется асинхронно, напримерawait event.data.arrayBuffer()илиawait event.data.bytes().
Согласно новому поведению по умолчанию обработчик бинарных сообщений должен быть async чтобы прочитать полезную нагрузку. Если хотите сохранить существующий синхронный обработчик, задайте binaryType к "arraybuffer" для WebSocket.
Когда значение вступает в силу
Согласно Спецификация WebSocket ↗, binaryType является изменяемым: значение считывается в момент отправки каждого бинарного фрейма в message событие, поэтому присвоение нового значения влияет только на последующие сообщения. Если вы хотите, чтобы все двоичные сообщения WebSocket доставлялись в одном и том же типе, присвойте binaryType перед вызовом accept(). Это гарантирует, что настройка вступит в силу до того, как среда выполнения начнёт обрабатывать входящие фреймы.
Отказ на уровне всего Worker
Если вы ещё не готовы к переходу и хотите оставить ArrayBuffer по умолчанию для каждого WebSocket в вашем Worker, добавьте no_websocket_standard_binary_type флаг в ваш конфигурационный файл Wrangler. Отдельные WebSocket-соединения всё же могут переопределить значение по умолчанию, присвоив binaryType.