Skip to content

Commit 4e244e8

Browse files
committed
added multi client support for overlay
1 parent a7084a6 commit 4e244e8

5 files changed

Lines changed: 36 additions & 94 deletions

File tree

crates/wasm-pkg-client/src/lib.rs

Lines changed: 7 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use tokio::io::AsyncSeekExt;
4646
use tokio::sync::RwLock;
4747
use tokio_util::io::SyncIoBridge;
4848
use wasm_pkg_common::config::RegistryConfig;
49+
use wasm_pkg_common::metadata::{LOCAL_PROTOCOL, OCI_PROTOCOL, WARG_PROTOCOL};
4950
pub use wasm_pkg_common::{
5051
config::{Config, CustomConfig, RegistryMapping},
5152
digest::ContentDigest,
@@ -219,76 +220,6 @@ impl Client {
219220
.ok_or_else(|| Error::NoRegistryForNamespace(package.namespace().clone()))
220221
}
221222

222-
fn resolve_backend(
223-
&self,
224-
registry: &Registry,
225-
registry_meta: RegistryMetadata,
226-
) -> Result<InnerClient, Error> {
227-
let registry_config = self
228-
.config
229-
.registry_config(&registry)
230-
.cloned()
231-
.unwrap_or_default();
232-
233-
let backend_type = match registry_config.default_backend() {
234-
// If the local config specifies a backend type, use it
235-
Some(backend_type) => Some(backend_type),
236-
None => {
237-
// If the registry metadata indicates a preferred protocol, use it
238-
let preferred_protocol = registry_meta.preferred_protocol();
239-
// ...except registry metadata cannot force a local backend
240-
if preferred_protocol == Some("local") {
241-
return Err(Error::InvalidRegistryMetadata(anyhow!(
242-
"registry metadata with 'local' protocol not allowed"
243-
)));
244-
}
245-
preferred_protocol
246-
}
247-
}
248-
// Otherwise use the default backend
249-
.unwrap_or("oci");
250-
251-
todo!();
252-
}
253-
254-
fn resolve_metadata(
255-
&self,
256-
package: &PackageRef,
257-
registry_config: &RegistryConfig,
258-
registry_override: bool,
259-
registry: &Registry,
260-
) -> &RegistryMetadata {
261-
if let Some(metadata) = self
262-
.config
263-
.package_registry_override(package)
264-
.and_then(|mapping| mapping.metadata())
265-
{
266-
return metadata;
267-
}
268-
269-
let _ = self
270-
.config
271-
.namespace_registry(package.namespace())
272-
.and_then(|mapping| {
273-
// If the overridden registry matches the registry we are trying to resolve, we
274-
// should use the metadata, otherwise we'll need to fetch the metadata from the
275-
// registry
276-
match (mapping, registry_override) {
277-
(RegistryMapping::Custom(custom), true) if custom.registry == *registry => {
278-
Some(custom.metadata.clone())
279-
}
280-
(RegistryMapping::Custom(custom), false) => Some(custom.metadata.clone()),
281-
_ => None,
282-
}
283-
});
284-
todo!();
285-
}
286-
287-
async fn has_registry(&self, registry: &Registry) -> bool {
288-
let sources = self.sources.read().await;
289-
sources.contains_key(registry)
290-
}
291-
292223
async fn resolve_source(
293224
&self,
294225
package: &PackageRef,
@@ -308,7 +239,7 @@ impl Client {
308239
.unwrap_or_default();
309240

310241
// Skip fetching metadata for "local" source
311-
let should_fetch_meta = registry_config.default_backend() != Some("local");
242+
let should_fetch_meta = registry_config.default_backend() != LOCAL_PROTOCOL.into();
312243
let maybe_metadata = self
313244
.config
314245
.package_registry_override(package)
@@ -353,7 +284,7 @@ impl Client {
353284
// If the registry metadata indicates a preferred protocol, use it
354285
let preferred_protocol = registry_meta.preferred_protocol();
355286
// ...except registry metadata cannot force a local backend
356-
if preferred_protocol == Some("local") {
287+
if preferred_protocol == Some(LOCAL_PROTOCOL) {
357288
return Err(Error::InvalidRegistryMetadata(anyhow!(
358289
"registry metadata with 'local' protocol not allowed"
359290
)));
@@ -362,17 +293,17 @@ impl Client {
362293
}
363294
}
364295
// Otherwise use the default backend
365-
.unwrap_or("oci");
296+
.unwrap_or(OCI_PROTOCOL);
366297
tracing::debug!(?backend_type, "Resolved backend type");
367298

368299
let source: InnerClient = match backend_type {
369-
"local" => Box::new(LocalBackend::new(registry_config)?),
370-
"oci" => Box::new(OciBackend::new(
300+
LOCAL_PROTOCOL => Box::new(LocalBackend::new(registry_config)?),
301+
OCI_PROTOCOL => Box::new(OciBackend::new(
371302
&registry,
372303
&registry_config,
373304
&registry_meta,
374305
)?),
375-
"warg" => {
306+
WARG_PROTOCOL => {
376307
Box::new(WargBackend::new(&registry, &registry_config, &registry_meta).await?)
377308
}
378309
other => {

crates/wasm-pkg-client/src/overlay/mod.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::io::Cursor;
1+
use std::{collections::HashMap, io::Cursor};
22

33
use async_trait::async_trait;
44
use tempfile::TempDir;
@@ -14,28 +14,34 @@ use crate::{
1414

1515
pub(crate) struct OverlayBackend {
1616
local: LocalBackend,
17-
remote: InnerClient,
17+
remotes: HashMap<PackageRef, InnerClient>,
1818
_handle: TempDir,
1919
}
2020

2121
impl OverlayBackend {
22-
fn new(remote: InnerClient) -> Result<Self, Error> {
22+
fn new(remotes: HashMap<PackageRef, InnerClient>) -> Result<Self, Error> {
2323
let handle = TempDir::new()?;
2424
let root = handle.path().to_owned();
2525
let local = LocalBackend { root };
2626
Ok(Self {
2727
local,
28-
remote,
28+
remotes,
2929
_handle: handle,
3030
})
3131
}
32+
33+
fn remote(&self, package: &PackageRef) -> Result<&InnerClient, Error> {
34+
self.remotes
35+
.get(package)
36+
.ok_or_else(|| Error::InvalidPackageRef(package.to_string()))
37+
}
3238
}
3339

3440
#[async_trait]
3541
impl PackageLoader for OverlayBackend {
3642
async fn list_all_versions(&self, package: &PackageRef) -> Result<Vec<VersionInfo>, Error> {
3743
let mut versions = self.local.list_all_versions(package).await?;
38-
let mut remote_versions = self.remote.list_all_versions(package).await?;
44+
let mut remote_versions = self.remote(package)?.list_all_versions(package).await?;
3945
versions.append(&mut remote_versions);
4046
versions.sort();
4147
versions.dedup();
@@ -47,7 +53,7 @@ impl PackageLoader for OverlayBackend {
4753
return Ok(release);
4854
}
4955
tracing::debug!(%package, %version, method = "get_release", "OverlayBackend falling back to remote");
50-
self.remote.get_release(package, version).await
56+
self.remote(package)?.get_release(package, version).await
5157
}
5258

5359
async fn stream_content_unvalidated(
@@ -82,13 +88,14 @@ impl PackagePublisher for OverlayBackend {
8288
let mut local_data = Box::pin(Cursor::new(Vec::new()));
8389
tokio::io::copy(&mut data, &mut local_data).await?;
8490

85-
self.local
86-
.publish(&package, &version, local_data.clone(), dry_run)
87-
.await?;
8891
if dry_run {
92+
self.local
93+
.publish(&package, &version, local_data.clone(), dry_run)
94+
.await?;
8995
return Ok(());
9096
}
91-
self.remote
97+
98+
self.remote(package)?
9299
.publish(&package, &version, local_data, dry_run)
93100
.await?;
94101

crates/wasm-pkg-common/src/config.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,7 @@ impl Config {
204204
let namespace = package.namespace();
205205
// look in `self.package_registry_overrides `
206206
// then in `self.namespace_registries`
207-
if let Some(reg) = self
208-
.package_registry_overrides
209-
.get(package)
210-
.or_else(|| self.namespace_registries.get(namespace))
211-
.map(|pkg| pkg.registry())
212-
{
207+
if let Some(reg) = self.resolve_mapping(package).map(|ns| ns.registry()) {
213208
return Some(reg);
214209
} else if let Some(reg) = self.default_registry.as_ref() {
215210
return Some(reg);
@@ -218,6 +213,15 @@ impl Config {
218213
self.fallback_namespace_registries.get(namespace)
219214
}
220215

216+
pub fn resolve_mapping(&self, package: &PackageRef) -> Option<&RegistryMapping> {
217+
let namespace = package.namespace();
218+
// look in `self.package_registry_overrides `
219+
// then in `self.namespace_registries`
220+
self.package_registry_overrides
221+
.get(package)
222+
.or_else(|| self.namespace_registries.get(namespace))
223+
}
224+
221225
/// Returns the default registry.
222226
pub fn default_registry(&self) -> Option<&Registry> {
223227
self.default_registry.as_ref()

crates/wasm-pkg-common/src/metadata.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub const OCI_PROTOCOL: &str = "oci";
4141
/// Warg registry key
4242
pub const WARG_PROTOCOL: &str = "warg";
4343
/// Local filesystem key
44-
pub const LOCAL_FS: &str = "local";
44+
pub const LOCAL_PROTOCOL: &str = "local";
4545

4646
impl RegistryMetadata {
4747
/// Returns the registry's preferred protocol.

crates/wasm-pkg-common/src/package.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl PackageRef {
2323
}
2424

2525
/// Returns the namespace of the package.
26-
pub fn namespace(&self) -> &Label {
26+
pub const fn namespace(&self) -> &Label {
2727
&self.namespace
2828
}
2929

0 commit comments

Comments
 (0)