summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/web/14_compression.js1
-rw-r--r--ext/web/compression.rs21
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()?,
};