blitz_net/
scoped_provider.rs1use blitz_traits::net::{Bytes, Initiator, NetHandler, NetProvider, Request, Url};
2use blitz_traits::platform::{
3 FetchError, FetchHandler, FetchProvider, FetchRequest, FetchResponse,
4};
5use std::sync::Arc;
6
7use crate::{Provider, ProviderError};
8
9pub struct ScopedProvider {
12 provider: Arc<Provider>,
13 initiator: Initiator,
14}
15
16impl ScopedProvider {
17 pub(crate) fn new(provider: Arc<Provider>, initiator: Initiator) -> Self {
18 Self {
19 provider,
20 initiator,
21 }
22 }
23
24 pub fn initiator(&self) -> Initiator {
25 self.initiator.clone()
26 }
27
28 pub async fn fetch_async(
29 &self,
30 mut request: Request,
31 ) -> Result<(String, Bytes), ProviderError> {
32 request.initiator = self.initiator.clone();
33 self.provider.fetch_async(request).await
34 }
35
36 pub async fn fetch_response_async(
37 &self,
38 mut request: Request,
39 ) -> Result<FetchResponse, ProviderError> {
40 request.initiator = self.initiator.clone();
41 self.provider.fetch_response_async(request).await
42 }
43
44 pub async fn fetch_platform_async(
45 &self,
46 mut request: FetchRequest,
47 ) -> Result<FetchResponse, FetchError> {
48 request.initiator = self.initiator.clone();
49 self.provider.fetch_platform_async(request).await
50 }
51}
52
53impl NetProvider for ScopedProvider {
54 fn fetch(&self, doc_id: usize, mut request: Request, handler: Box<dyn NetHandler>) {
55 request.initiator = self.initiator.clone();
56 NetProvider::fetch(self.provider.as_ref(), doc_id, request, handler);
57 }
58
59 fn resource_initiator(&self) -> Initiator {
60 self.initiator()
61 }
62
63 fn for_child_document(&self, url: Url) -> Option<Arc<dyn NetProvider>> {
64 Some(Arc::new(Self::new(
65 Arc::clone(&self.provider),
66 self.initiator.child(url),
67 )))
68 }
69}
70
71impl FetchProvider for ScopedProvider {
72 fn fetch(&self, mut request: FetchRequest, handler: Box<dyn FetchHandler>) {
73 request.initiator = self.initiator.clone();
74 FetchProvider::fetch(self.provider.as_ref(), request, handler);
75 }
76}