Какие типы binaryType существуют в WebSocket и зачем они нужны?
Что проверяют
Понимаете ли вы, что binaryType влияет только на приём, и умеете ли разбирать бинарный протокол в браузере. Следом обычно просят показать, как прочитать заголовок сообщения, и спрашивают, что приходит в event.data для текстового кадра.
Как отвечать
У свойства WebSocket.binaryType два значения:
"blob": значение по умолчанию. Бинарное сообщение приходит какBlob, прочитать его можно только асинхронно:await event.data.arrayBuffer()илиevent.data.text(). Удобно, если данные нужно просто сохранить, показать черезURL.createObjectURLили передать дальше без разбора;"arraybuffer": сообщение приходит какArrayBuffer, байты доступны сразу и синхронно черезDataViewилиUint8Array. Это выбор для своего бинарного протокола, Protobuf, MessagePack, аудиочанков.
Важные детали поведения:
- текстовый кадр всегда приходит строкой,
binaryTypeна него не влияет, поэтому в обработчике нужна проверкаtypeof event.data === "string"; - на отправку свойство не влияет:
send()принимает строку,Blob,ArrayBufferи типизированный массив при любом значении; - менять
binaryTypeможно в любой момент, новое значение действует на следующие сообщения.
const ws = new WebSocket(url);
ws.binaryType = "arraybuffer";
ws.onmessage = (e) => {
if (typeof e.data === "string") return handleText(e.data);
const view = new DataView(e.data);
const type = view.getUint8(0);
};Где спотыкаются
Говорят, что binaryType задаёт формат отправки. Он описывает только то, в каком виде браузер отдаёт полученные бинарные данные.
Оставляют "blob" и читают данные через await внутри onmessage. Пока идёт чтение, следующий текстовый кадр обработается раньше, и порядок сообщений в логике приложения ломается.
Путают браузер с Node.js. В библиотеке ws набор значений другой, по умолчанию там "nodebuffer", и код, перенесённый с сервера, в браузере ведёт себя иначе.