Час добрый гуру! Есть кто тут работал над реализацией "веб" сокет сервера? Ни как не могу победить эти фреймы. Делаю всё следуя
спецификации. Но у меня всё равно возникают сложнасти. Вот к примеру
let finmes: number = (data[0] & 0x80) >>> 7 // 0 or 1 - fragment in message
let opcode: number = (data[0] & 0x0f) // 0x0 | 0x1 | 0x2 | ...
let optype: string = getOpcodeType(opcode) // frame | text | ...
let ismask: number = (data[1] & 0x80) >>> 7 // 0 or 1
let length: number = (data[1] & 0x7f)
let offset: number = 2 // info
// read 16 bit
if (length === 0x7e) {
length = getLength16(data, offset)
offset = offset + 2 // length
}
// read 32 bit
if (length === 0x7f) {
length = getLength32(data, offset)
offset = offset + 8 // length
}
let mask: Buffer = data.slice(offset, offset + 4)
offset = offset + 4 // mask
let body: Buffer = data.slice(offset)
for (let i = 0; i < body.length; i ++)
body[i] ^= mask[i & 3]
И вроде бы всё хорошо работает, но только при условии, если запрос не фрагментирован. Т.е. если прилетает 2 и более, естественно ошибка.
Смотрел как реализован socketio & websocketjs, там же в целом путаюсь на каждом шагу. Не могу понять зачем выполнять чтение циклично и неужели последующие фреймы могут прервать выполнение цикла? В общем, простите мне мою безолаберность от того и пишу тут.
Ну и ладно, проблема скорее в другом. Начал смотреть только FIN & OPCODE, в документации пишут: В случае если фреймов 2 и более то только у последнего фрейма будет FIN = 1, у первых же FIN = 0. Мне с вебморды прилетает всегда по разному, т.е. 1 - 3 могут придти с FIN = 1. А все остальные с FIN = 0. Т.е. бог с ним, с началом, как узнать где конец если последний приходит с FIN = 0? А если верить документации то должен приходить с FIN = 1. Т.е. если запрос из 5ти фрагметов, закономерно FIN должен выглядеть так: FINS = [0, 0, 0, 0, 1] - так ведь? А мне приходит по разному, может [1, 1, 1, 0, 0], может и [1, 0, 0, 1, 0] и даже так [0, 0, 0, 1, 0]. Так же, только у первого указан OPCODE, в моём случае произвольно, где то есть а где то нет.
Буду очень благодарен участникам! 4ый день бьюсь.