node.jsws permessagedeflate zlib解压和pako的区别?

The difference between node.js ws permessagedeflate zlib decompression and that of pako?

我有一个 node.js 接收压缩数据的 ws websocket。

文档对 inflate 机制的了解非常浅薄,但通过阅读源文件,它显然是内置的,应该根据接收到的数据类型自动激活。

但是,当附加 ws.on('message',function(data){}) 事件时 returns 一个 < Buffer >

因为我知道这些流之前已经用 Pako 膨胀,所以我尝试安装它,并且它使用以下代码确实有效:

pako.inflate(data, { to: 'string' })

据我了解,这两个模块都使用 zlib 解压缩,但 ws 模块不知何故遗漏了它。

有人能给出合理的解释或至少给出一个假设吗?

ws 支持的是一个名为 "permessage-deflate".

的特定 WebSocket 扩展

此扩展记录在 RFC 7692 中,因为它是协议的扩展,所以它是底层 WS 协议实现(服务器和客户端)需要支持的东西(涉及握手过程,其中客户端和服务器尝试确定对方是否支持它,发送方设置特定的帧标志以通知接收方该帧已压缩)。

一旦激活,它就相对透明,帧(解)压缩由协议驱动程序自动处理。

在您的情况下,听起来好像在 WebSocket 之上添加了一个明确的 compression/decompression 阶段,其中发送方显式压缩数据(而不是 WS 框架本身)并且接收方需要显式解压缩它,这基本上就是您已经发现的:接收到的消息是一个(压缩的)缓冲区,您需要明确地解压缩它。

所以并不是 ws 遗漏了任何东西,只是(解)压缩发生在原始 WS 帧之上的层中(如果 "permessage- deflate" 扩展将处于活动状态,可能导致数据被压缩和解压缩两次:一次由用户代码,一次由协议代码)。