summaryrefslogtreecommitdiff
path: root/ext/web
diff options
context:
space:
mode:
Diffstat (limited to 'ext/web')
-rw-r--r--ext/web/14_compression.js10
-rw-r--r--ext/web/compression.rs26
2 files changed, 26 insertions, 10 deletions
diff --git a/ext/web/14_compression.js b/ext/web/14_compression.js
index 1ec9e5462..0d3a8ebd0 100644
--- a/ext/web/14_compression.js
+++ b/ext/web/14_compression.js
@@ -50,9 +50,12 @@ class CompressionStream {
maybeEnqueue(controller, output);
},
flush(controller) {
- const output = op_compression_finish(rid);
+ const output = op_compression_finish(rid, true);
maybeEnqueue(controller, output);
},
+ cancel: (_reason) => {
+ op_compression_finish(rid, false);
+ },
});
this[webidl.brand] = webidl.brand;
@@ -109,9 +112,12 @@ class DecompressionStream {
maybeEnqueue(controller, output);
},
flush(controller) {
- const output = op_compression_finish(rid);
+ const output = op_compression_finish(rid, true);
maybeEnqueue(controller, output);
},
+ cancel: (_reason) => {
+ op_compression_finish(rid, false);
+ },
});
this[webidl.brand] = webidl.brand;
diff --git a/ext/web/compression.rs b/ext/web/compression.rs
index 0829af8e5..4f4d90cbf 100644
--- a/ext/web/compression.rs
+++ b/ext/web/compression.rs
@@ -116,25 +116,35 @@ pub fn op_compression_write(
pub fn op_compression_finish(
state: &mut OpState,
#[smi] rid: ResourceId,
+ report_errors: bool,
) -> Result<ToJsBuffer, AnyError> {
let resource = state.resource_table.take::<CompressionResource>(rid)?;
let resource = Rc::try_unwrap(resource).unwrap();
let inner = resource.0.into_inner();
- let out: Vec<u8> = match inner {
+ let out = match inner {
Inner::DeflateDecoder(d) => {
- d.finish().map_err(|e| type_error(e.to_string()))?
+ d.finish().map_err(|e| type_error(e.to_string()))
}
Inner::DeflateEncoder(d) => {
- d.finish().map_err(|e| type_error(e.to_string()))?
+ d.finish().map_err(|e| type_error(e.to_string()))
}
Inner::DeflateRawDecoder(d) => {
- d.finish().map_err(|e| type_error(e.to_string()))?
+ d.finish().map_err(|e| type_error(e.to_string()))
}
Inner::DeflateRawEncoder(d) => {
- d.finish().map_err(|e| type_error(e.to_string()))?
+ d.finish().map_err(|e| type_error(e.to_string()))
}
- Inner::GzDecoder(d) => d.finish().map_err(|e| type_error(e.to_string()))?,
- Inner::GzEncoder(d) => d.finish().map_err(|e| type_error(e.to_string()))?,
+ Inner::GzDecoder(d) => d.finish().map_err(|e| type_error(e.to_string())),
+ Inner::GzEncoder(d) => d.finish().map_err(|e| type_error(e.to_string())),
};
- Ok(out.into())
+ match out {
+ Err(err) => {
+ if report_errors {
+ Err(err)
+ } else {
+ Ok(Vec::with_capacity(0).into())
+ }
+ }
+ Ok(out) => Ok(out.into()),
+ }
}