pub struct NixHTTPPathInfoService<BS: Clone, DS> {
instance_name: String,
base_url: Url,
http_client: ClientWithMiddleware,
blob_service: BS,
directory_service: DS,
layered_blob_service: Cache<BS, GRPCBlobService<Channel>>,
layered_directory_service: Cache<DS, GRPCDirectoryService<Channel>>,
trusted_public_keys: Vec<VerifyingKey>,
force_download_nar: bool,
}Expand description
NixHTTPPathInfoService acts as a bridge in between the Nix HTTP Binary cache protocol provided by Nix binary caches such as cache.nixos.org, and the Snix Store Model. It implements the PathInfoService trait in an interesting way: Every PathInfoService::get fetches the .narinfo and referred NAR file, inserting components into a BlobService and DirectoryService, then returning a PathInfo struct with the root.
Due to this being quite a costly operation, clients are expected to layer this service with store composition, so they’re only ingested once.
The client is expected to be (indirectly) using the same BlobService and DirectoryService, so able to fetch referred Directories and Blobs. PathInfoService::put is not implemented and returns an error if called. TODO: what about reading from nix-cache-info?
Fields§
§instance_name: String§base_url: Url§http_client: ClientWithMiddleware§blob_service: BS§directory_service: DS§layered_blob_service: Cache<BS, GRPCBlobService<Channel>>A BlobService Cache with ‘far’ talking to the configured endpoint over gRPC. This is used when validating castore-infused NAR URLs in NARInfos. We rely on Cache to insert into ‘near’.
layered_directory_service: Cache<DS, GRPCDirectoryService<Channel>>A DirectoryService Cache with ‘far’ talking to the configured endpoint over gRPC. This is used when validating castore-infused NAR URLs in NARInfos. We rely on Cache to insert into ‘near’.
trusted_public_keys: Vec<VerifyingKey>An optional list of narinfo::VerifyingKey. If the list is not empty, the .narinfo files received need to have correct signature by at least one of these.
force_download_nar: boolForce the download of NAR files, even if there’s castore-infused NAR URLs.
Implementations§
Source§impl<BS, DS> NixHTTPPathInfoService<BS, DS>
impl<BS, DS> NixHTTPPathInfoService<BS, DS>
Trait Implementations§
Source§impl<BS, DS> PathInfoService for NixHTTPPathInfoService<BS, DS>where
BS: BlobService + Send + Sync + Clone + 'static,
DS: DirectoryService + Send + Sync + Clone + 'static,
impl<BS, DS> PathInfoService for NixHTTPPathInfoService<BS, DS>where
BS: BlobService + Send + Sync + Clone + 'static,
DS: DirectoryService + Send + Sync + Clone + 'static,
Source§fn get<'life0, 'async_trait>(
&'life0 self,
digest: [u8; 20],
) -> Pin<Box<dyn Future<Output = Result<Option<PathInfo>, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get<'life0, 'async_trait>(
&'life0 self,
digest: [u8; 20],
) -> Pin<Box<dyn Future<Output = Result<Option<PathInfo>, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn has<'life0, 'async_trait>(
&'life0 self,
digest: [u8; 20],
) -> Pin<Box<dyn Future<Output = Result<bool, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn has<'life0, 'async_trait>(
&'life0 self,
digest: [u8; 20],
) -> Pin<Box<dyn Future<Output = Result<bool, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn put<'life0, 'async_trait>(
&'life0 self,
_path_info: PathInfo,
) -> Pin<Box<dyn Future<Output = Result<PathInfo, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn put<'life0, 'async_trait>(
&'life0 self,
_path_info: PathInfo,
) -> Pin<Box<dyn Future<Output = Result<PathInfo, Error>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn list(&self) -> BoxStream<'static, Result<PathInfo, Error>>
fn list(&self) -> BoxStream<'static, Result<PathInfo, Error>>
Source§fn nar_calculation_service(&self) -> Option<Box<dyn NarCalculationService>>
fn nar_calculation_service(&self) -> Option<Box<dyn NarCalculationService>>
Auto Trait Implementations§
impl<BS, DS> !Freeze for NixHTTPPathInfoService<BS, DS>
impl<BS, DS> !RefUnwindSafe for NixHTTPPathInfoService<BS, DS>
impl<BS, DS> Send for NixHTTPPathInfoService<BS, DS>
impl<BS, DS> Sync for NixHTTPPathInfoService<BS, DS>
impl<BS, DS> Unpin for NixHTTPPathInfoService<BS, DS>
impl<BS, DS> UnsafeUnpin for NixHTTPPathInfoService<BS, DS>where
BS: UnsafeUnpin,
DS: UnsafeUnpin,
impl<BS, DS> !UnwindSafe for NixHTTPPathInfoService<BS, DS>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].