Brotli 解压缩网络流(在 Cloudflare Workers 中)

问题描述 投票:0回答:1

我有一堆数据作为文件存储在 Cloudflare 的 R2 上。我很早就注意到这些数据文件的存储桶大小接近太字节,因此应用了 brotli 压缩,将大小降至约 500mb。

我现在正尝试通过工作人员公开数据(以应用过滤器),但遇到了障碍。 Cloudflare 公开了具有 DecompressionStream 的 WebStreams,它可以解压缩 gzip,但不能解压缩 brotli。

我确实将流转换为 gzip ...

let stm = resp.body
  .pipeThrough(new DecompressionStream("gzip"))
  .pipeThrough(ApplyFilter(sDate, eDate))
  .pipeThrough(new CompressionStream("gzip"))
;

Gzip 提供的压缩级别远不及我习惯的 Brotli。

261M   1158172.data    (100%)
2.8M   1158172.data.gz (  1%)
 78K   1158172.data.br (  0.03%)

那么,

  1. 有针对网络流产品的 brotli 解压缩吗?
    • 我一直依赖浏览器来处理这个问题
  2. 有什么方法可以欺骗我的 Worker 或 R2 自动解压吗?
    • 所有浏览器都支持。我可以以某种方式加入其中吗?
  3. 我应该将整个事情传递给浏览器来完成工作吗?
    • 我希望避免这种情况,因为我希望服务器控制数据暴露
  4. 还有什么我没想到的吗?

更新

我忘了提及曾尝试转换为节点流并使用节点的

zlib.createBrotliDecompress
。不幸的是,Cloudflare 在工作人员中不支持

zlib
cloudflare-workers http-compression
1个回答
0
投票

有针对网络流产品的 brotli 解压缩吗?

(de)CompressionStream 标准中不支持 Brotli,但您可以使用 WebAssembly 来实现。

有什么方法可以欺骗我的 Worker 或 R2 自动解压吗?

如果客户端的

Uncaught Error: No such module "node:zlib".

 标头未表明支持响应的 
Accept-Encoding
 标头中显示的内容,
Cloudflare 将自行处理即时解压缩。

只需按原样返回压缩文件,并带有适当的

Content-Encoding
标头。

Content-Encoding
export default {
  async fetch(req, env, ctx) {
    const obj = await env.R2.get('result.br');

    return new Response(obj.body, {
      headers: {
        'Content-Encoding': 'br'
      },
      encodeBody: 'manual'
    });
  },
};
© www.soinside.com 2019 - 2024. All rights reserved.