var m = '\u0000' + d + '\uffff';
var result = stream.write(m, "utf8");
Ах, это кажется не совсем правильным. Это должен быть нулевой байт, за которым следует строка в кодировке UTF-8, за которой следует байт 0xFF.
\uFFFF
не кодирует в UTF-8 байт 0xFF: вы получаете 0xC3 0xBF. Фактически, ни один символ никогда не выдаст 0xFF в кодировке UTF-8: именно поэтому он был выбран как терминатор в WebSocket.
Я не знаком с node.js, но думаю, вам нужно сказать что-то вроде:
stream.write('\u0000'+d, 'utf-8');
stream.write('\xFF', 'binary');
Или вручную кодировать UTF-8 и отправлять в двоичном виде.
Рукопожатие также сомнительно, хотя я думаю, что это простой, насколько возможно, первый набросок, который, вероятно, работает на данный момент. Вы полагаетесь на то, что первый пакет представляет собой весь заголовок рукопожатия и больше ничего, а второй - данные полезной нагрузки. Это совсем не гарантировано. Возможно, вы захотите собрать data
в буфере, пока не увидите маркер 0x0D 0x0A 0x0D 0x0A для конца заголовков, затем проверьте содержимое заголовка и, возможно, верните 101, затем продолжите данные после этого маркера.