Skip to main content

blitz_net/
scoped_provider.rs

1use 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
9/// Native binding for one document or trusted browser context. Request fields
10/// cannot replace this principal. Clones share typed scope and provider Arcs.
11pub 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}