diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/web/14_compression.js | 1 | ||||
-rw-r--r-- | ext/web/compression.rs | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/ext/web/14_compression.js b/ext/web/14_compression.js index beff7a059..a96a7ce43 100644 --- a/ext/web/14_compression.js +++ b/ext/web/14_compression.js @@ -16,6 +16,7 @@ "CompressionFormat", [ "deflate", + "deflate-raw", "gzip", ], ); 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<Inner>); +/// https://wicg.github.io/compression/#supported-formats #[derive(Debug)] enum Inner { DeflateDecoder(ZlibDecoder<Vec<u8>>), DeflateEncoder(ZlibEncoder<Vec<u8>>), + DeflateRawDecoder(DeflateDecoder<Vec<u8>>), + DeflateRawEncoder(DeflateEncoder<Vec<u8>>), GzDecoder(GzDecoder<Vec<u8>>), GzEncoder(GzEncoder<Vec<u8>>), } @@ -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<u8> = 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()?, }; |