pub struct NixHTTPPathInfoService<BS, DS> {
base_url: Url,
http_client: ClientWithMiddleware,
blob_service: BS,
directory_service: DS,
public_keys: Option<Vec<VerifyingKey>>,
}
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 Tvix 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§
§base_url: Url
§http_client: ClientWithMiddleware
§blob_service: BS
§directory_service: DS
§public_keys: Option<Vec<VerifyingKey>>
An optional list of [narinfo::PubKey]. If set, the .narinfo files received need to have correct signature by at least one of these.
Implementations§
source§impl<BS, DS> NixHTTPPathInfoService<BS, DS>
impl<BS, DS> NixHTTPPathInfoService<BS, DS>
pub fn new(base_url: Url, blob_service: BS, directory_service: DS) -> Self
sourcepub fn set_public_keys(&mut self, public_keys: Vec<VerifyingKey>)
pub fn set_public_keys(&mut self, public_keys: Vec<VerifyingKey>)
Configures Self to validate NARInfo fingerprints with the public keys passed.
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 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> !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> FutureExt for T
impl<T> FutureExt for T
source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
source§impl<T> FutureExt for T
impl<T> FutureExt for T
source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
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 moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request