Разница между node.js и permessagedeflate декомпрессией zlib и пако?
У меня есть node.js ws websocket, который получает сжатые данные.
Документы очень мелкие о механизме надувания, но при чтении через исходные файлы он явно встроен и должен активироваться автоматически в зависимости от типа полученных данных.
Однако при прикреплении ws.on('message',function(data){})
событие возвращает < Buffer >
Так как я знал, что эти потоки были ранее раздуты с помощью Pako, я попытался установить его, и он фактически работал с использованием следующего кода:
pako.inflate(data, { to: 'string' })
Из того, что я понимаю, оба модуля используют распаковку zlib, но модуль ws почему-то пропускает это.
Может ли кто-нибудь дать разумное объяснение или хотя бы гипотезу почему?
1 ответ
Какие ws
Поддерживается конкретное расширение WebSocket, называемое "permessage-deflate".
Это расширение задокументировано в RFC 7692, и поскольку оно является расширением протокола, это то, что должна поддерживать базовая реализация протокола WS (сервер и клиент) (существует процедура рукопожатия, при которой клиент и сервер пытаются определить, является ли другая сторона поддерживает это, и отправитель устанавливает определенный флаг кадра, чтобы уведомить получателя о том, что кадр был сжат).
После активации он становится относительно прозрачным, а сжатие кадра (де) обрабатывается драйвером протокола.
В вашем случае это звучит так, как будто в WebSocket добавлен явный этап сжатия / декомпрессии, когда отправитель явно сжимает данные (не сам кадр WS), а получатель должен явно распаковать их, что, по сути, уже есть выяснил: полученное сообщение является (сжатым) буфером, и вам необходимо явно распаковать его.
Так что это не так ws
ничего не пропустил, просто (de) сжатие происходит в слое над необработанными кадрами WS (что, если расширение "permessage-deflate" будет активным, может привести к сжатию и распаковке данных дважды: один раз по коду пользователя, один раз по коду протокола).