From e1d488ab886ac19716e2b51c3ce1cebef163db8f Mon Sep 17 00:00:00 2001 From: Kayla Washburn Date: Tue, 14 Jun 2022 10:10:28 -0600 Subject: feature(web): enable deflate-raw compression format (#14863) --- ext/web/compression.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'ext/web/compression.rs') diff --git a/ext/web/compression.rs b/ext/web/compression.rs index 9f5fcb813..f3610e2ea 100644 --- a/ext/web/compression.rs +++ b/ext/web/compression.rs @@ -6,6 +6,8 @@ use deno_core::OpState; use deno_core::Resource; use deno_core::ResourceId; use deno_core::ZeroCopyBuf; +use flate2::write::DeflateDecoder; +use flate2::write::DeflateEncoder; use flate2::write::GzDecoder; use flate2::write::GzEncoder; use flate2::write::ZlibDecoder; @@ -19,10 +21,13 @@ use std::rc::Rc; #[derive(Debug)] struct CompressionResource(RefCell); +/// https://wicg.github.io/compression/#supported-formats #[derive(Debug)] enum Inner { DeflateDecoder(ZlibDecoder>), DeflateEncoder(ZlibEncoder>), + DeflateRawDecoder(DeflateDecoder>), + DeflateRawEncoder(DeflateEncoder>), GzDecoder(GzDecoder>), GzEncoder(GzEncoder>), } @@ -45,6 +50,10 @@ pub fn op_compression_new( ("deflate", false) => { Inner::DeflateEncoder(ZlibEncoder::new(w, Compression::default())) } + ("deflate-raw", true) => Inner::DeflateRawDecoder(DeflateDecoder::new(w)), + ("deflate-raw", false) => { + Inner::DeflateRawEncoder(DeflateEncoder::new(w, Compression::default())) + } ("gzip", true) => Inner::GzDecoder(GzDecoder::new(w)), ("gzip", false) => { Inner::GzEncoder(GzEncoder::new(w, Compression::default())) @@ -74,6 +83,16 @@ pub fn op_compression_write( d.flush()?; d.get_mut().drain(..) } + Inner::DeflateRawDecoder(d) => { + d.write_all(&input)?; + d.flush()?; + d.get_mut().drain(..) + } + Inner::DeflateRawEncoder(d) => { + d.write_all(&input)?; + d.flush()?; + d.get_mut().drain(..) + } Inner::GzDecoder(d) => { d.write_all(&input)?; d.flush()?; @@ -100,6 +119,8 @@ pub fn op_compression_finish( let out: Vec = match inner { Inner::DeflateDecoder(d) => d.finish()?, Inner::DeflateEncoder(d) => d.finish()?, + Inner::DeflateRawDecoder(d) => d.finish()?, + Inner::DeflateRawEncoder(d) => d.finish()?, Inner::GzDecoder(d) => d.finish()?, Inner::GzEncoder(d) => d.finish()?, }; -- cgit v1.2.3