mirror of https://github.com/zkat/cacache-rs.git
fix: don't block executor with integrity checking
This commit is contained in:
parent
66eae4b78f
commit
82e29a541c
|
|
@ -118,15 +118,23 @@ pub fn read(cache: &Path, sri: &Integrity) -> Result<Vec<u8>> {
|
|||
}
|
||||
|
||||
#[cfg(any(feature = "async-std", feature = "tokio"))]
|
||||
pub async fn read_async<'a>(cache: &'a Path, sri: &'a Integrity) -> Result<Vec<u8>> {
|
||||
let cpath = path::content_path(cache, sri);
|
||||
pub async fn read_async<'c, 's>(cache: &'c Path, sri: Integrity) -> Result<Vec<u8>> {
|
||||
// let cache = cache.to_path_buf();
|
||||
let cpath = path::content_path(&cache, &sri);
|
||||
let ret = crate::async_lib::read(&cpath).await.with_context(|| {
|
||||
format!(
|
||||
"Failed to read contents for file at {}",
|
||||
path::content_path(cache, sri).display()
|
||||
path::content_path(&cache, &sri).display()
|
||||
)
|
||||
})?;
|
||||
sri.check(&ret)?;
|
||||
let integrity_check = move || {
|
||||
sri.check(&ret)?;
|
||||
Ok::<_, ssri::Error>(ret)
|
||||
};
|
||||
#[cfg(feature = "tokio")]
|
||||
let ret = tokio::task::spawn_blocking(integrity_check).await??;
|
||||
#[cfg(feature = "async-std")]
|
||||
let ret = async_std::task::spawn_blocking(integrity_check).await?;
|
||||
Ok(ret)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,12 @@ pub enum Error {
|
|||
#[error(transparent)]
|
||||
#[diagnostic(code(cacache::integrity_error), url(docsrs))]
|
||||
IntegrityError(#[from] ssri::Error),
|
||||
|
||||
/// Returned when a Tokio join error occured.
|
||||
#[cfg(feature="tokio")]
|
||||
#[error(transparent)]
|
||||
#[diagnostic(code(cacache::tokio_joinerror), url(docsrs))]
|
||||
TokioJoinError(#[from] tokio::task::JoinError)
|
||||
}
|
||||
|
||||
/// The result type returned by calls to this library
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ where
|
|||
{
|
||||
async fn inner(cache: &Path, key: &str) -> Result<Vec<u8>> {
|
||||
if let Some(entry) = index::find_async(cache, key).await? {
|
||||
read_hash(cache, &entry.integrity).await
|
||||
read_hash(cache, entry.integrity).await
|
||||
} else {
|
||||
Err(Error::EntryNotFound(cache.to_path_buf(), key.into()))
|
||||
}
|
||||
|
|
@ -183,7 +183,7 @@ where
|
|||
/// }
|
||||
/// ```
|
||||
#[cfg(any(feature = "async-std", feature = "tokio"))]
|
||||
pub async fn read_hash<P>(cache: P, sri: &Integrity) -> Result<Vec<u8>>
|
||||
pub async fn read_hash<P>(cache: P, sri: Integrity) -> Result<Vec<u8>>
|
||||
where
|
||||
P: AsRef<Path>,
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue