Skip to content

Commit

Permalink
Merge pull request #428 from wasmerio/fix-tagging
Browse files Browse the repository at this point in the history
fix: Publish packages and make linter happy
  • Loading branch information
syrusakbary authored Aug 7, 2024
2 parents 71fc6b3 + 8a3324f commit 0ad706a
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 64 deletions.
172 changes: 121 additions & 51 deletions src/registry/package/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,66 +88,136 @@ impl Wasmer {
) -> Result<PublishPackageOutput, Error> {
let client = Wasmer::get_client()?;

if wasmer_api::query::get_package_release(client, hash)
.await?
.is_some()
let (id, hash) = if let Some(release) =
wasmer_api::query::get_package_release(client, hash).await?
{
// The package was already published.
return Ok(PublishPackageOutput {
manifest: serde_wasm_bindgen::to_value(&manifest)
.map_err(|e| anyhow::anyhow!("{e:?}"))?,
hash: hash.to_string(),
});
}
(release.id, release.webc_v3.map(|v| v.webc_sha256))
} else {
let signed_url = wasmer_api::query::get_signed_url_for_package_upload(
client,
Some(60 * 30),
Some(format!("js-{}", random()).replace('.', "-")).as_deref(),
None,
None,
)
.await?
.ok_or_else(|| anyhow::anyhow!("No signed url!"))?
.url;

upload(bytes, &signed_url).await?;

let (namespace, name) =
if let Some(full_name) = manifest.package.as_ref().and_then(|p| p.name.clone()) {
let splits: Vec<String> = full_name.split('/').map(|s| s.to_string()).collect();
(
splits
.first()
.ok_or_else(|| anyhow::anyhow!("No namespace provided!"))?
.clone(),
splits.get(1).cloned(),
)
} else {
return Err(utils::Error::Rust(anyhow::anyhow!(
"No namespace provided!"
)));
};

tracing::debug!("Pushing package release...");
let out = wasmer_api::query::push_package_release(
client,
name.as_deref(),
&namespace,
&signed_url,
manifest.package.as_ref().map(|p| p.private),
)
.await
.map_err(|e| anyhow::anyhow!("{e:?}"))?
.ok_or_else(|| anyhow::anyhow!("Backend returned no data!"))?;
if let Some(package_web) = out.package_webc {
(package_web.id, package_web.webc_v3.map(|v| v.webc_sha256))
} else {
return Err(
anyhow::anyhow!("No package identifier was found, tagging failed!").into(),
);
}
};

let hash =
hash.ok_or_else(|| anyhow::anyhow!("No hash given for the uploaded package!"))?;

if let Some(name) = manifest.package.as_ref().and_then(|p| p.name.as_ref()) {
// We use a hack to deploy with unnamed packages that fills in the namespace in the
// manifest, so just checking if "name" is some is not enough. The logical solution?
// Another - smaller - hack!
let splits = name
.split('/')
.filter(|v| !v.is_empty())
.collect::<Vec<_>>();

if splits.len() <= 1 {
return Ok(PublishPackageOutput {
manifest: serde_wasm_bindgen::to_value(&manifest)
.map_err(|e| anyhow::anyhow!("{e:?}"))?,
hash,
});
}

let signed_url = wasmer_api::query::get_signed_url_for_package_upload(
client,
Some(60 * 30),
Some(format!("js-{}", random()).replace('.', "-")).as_deref(),
None,
None,
)
.await?
.ok_or_else(|| anyhow::anyhow!("No signed url!"))?
.url;

upload(bytes, &signed_url).await?;

let (namespace, name) =
if let Some(full_name) = manifest.package.as_ref().and_then(|p| p.name.clone()) {
let splits: Vec<String> = full_name.split('/').map(|s| s.to_string()).collect();
(
splits
.first()
.ok_or_else(|| anyhow::anyhow!("No namespace provided!"))?
.clone(),
splits.get(1).cloned(),
)
let version =
if let Some(version) = manifest.package.as_ref().and_then(|p| p.version.as_ref()) {
version.to_string()
} else {
return Err(anyhow::anyhow!("No version provided!").into());
};

let maybe_description = manifest
.package
.as_ref()
.and_then(|p| p.description.clone());
let maybe_homepage = manifest.package.as_ref().and_then(|p| p.homepage.clone());
let maybe_license = manifest.package.as_ref().and_then(|p| p.license.clone());
let maybe_license_file = manifest
.package
.as_ref()
.and_then(|p| p.license_file.clone())
.map(|f| f.to_string_lossy().to_string());
let maybe_readme = manifest
.package
.as_ref()
.and_then(|p| p.readme.clone())
.map(|f| f.to_string_lossy().to_string());
let maybe_repository = manifest.package.as_ref().and_then(|p| p.repository.clone());

let private = if let Some(pkg) = &manifest.package {
Some(pkg.private)
} else {
return Err(utils::Error::Rust(anyhow::anyhow!(
"No namespace provided!"
)));
Some(false)
};

let out = wasmer_api::query::push_package_release(
client,
name.as_deref(),
&namespace,
&signed_url,
manifest.package.as_ref().map(|p| p.private),
)
.await
.map_err(|e| anyhow::anyhow!("{e:?}"))?
.ok_or_else(|| anyhow::anyhow!("Backend returned no data!"))?;
let manifest_raw = Some(toml::to_string(&manifest)?);

let r = wasmer_api::query::tag_package_release(
client,
maybe_description.as_deref(),
maybe_homepage.as_deref(),
maybe_license.as_deref(),
maybe_license_file.as_deref(),
manifest_raw.as_deref(),
name,
None,
&id,
private,
maybe_readme.as_deref(),
maybe_repository.as_deref(),
&version,
);

r.await?;
}

Ok(PublishPackageOutput {
manifest: serde_wasm_bindgen::to_value(&manifest)
.map_err(|e| anyhow::anyhow!("{e:?}"))?,
hash: out
.package_webc
.and_then(|p| p.webc_v3)
.map(|c| c.webc_sha256)
.ok_or_else(|| anyhow::anyhow!("No package was published!"))?,
hash,
})
}
}
3 changes: 1 addition & 2 deletions src/run.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use futures::channel::oneshot;
use std::sync::Arc;
use wasm_bindgen::{prelude::wasm_bindgen, JsCast};
use wasmer_wasix::{Runtime as _, WasiEnvBuilder};
use std::sync::Arc;

use crate::{instance::ExitCondition, utils::Error, Instance, RunOptions};

Expand Down Expand Up @@ -36,7 +36,6 @@ async fn run_wasix_inner(wasm_module: WasmModule, config: RunOptions) -> Result<
.program()
.as_string()
.unwrap_or_else(|| DEFAULT_PROGRAM_NAME.to_string());


let mut builder = WasiEnvBuilder::new(program_name).runtime(runtime.clone());
let (stdin, stdout, stderr) = config.configure_builder(&mut builder)?;
Expand Down
11 changes: 5 additions & 6 deletions src/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ impl Runtime {
)
.with_task_manager(task_manager.clone());
runtime.http_client = Arc::new(http_client);

runtime.task_manager = Some(task_manager);
runtime
}
Expand All @@ -101,11 +101,10 @@ impl Runtime {

pub(crate) fn new() -> Self {
let mut http_client = WebHttpClient::default();
http_client
.with_default_header(
http::header::USER_AGENT,
HeaderValue::from_static(crate::USER_AGENT),
);
http_client.with_default_header(
http::header::USER_AGENT,
HeaderValue::from_static(crate::USER_AGENT),
);
let http_client = Arc::new(http_client);

let module_cache = ThreadLocalCache::default();
Expand Down
16 changes: 11 additions & 5 deletions tests/registry.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ import { init, initializeLogger, Wasmer } from "..";
const pkg_name = "test-js-sdk-pkg";
const app_name = "test-js-sdk-app";


function getRandomInt(max) {
return Math.floor(Math.random() * max);
}

describe("Registry", function () {
this.timeout("60s").beforeAll(async () => {
await init({
Expand Down Expand Up @@ -259,7 +264,8 @@ describe("Registry", function () {
it("can publish named packages", async () => {
let manifest = {
package: {
name: WASMER_TEST_OWNER + "/" + pkg_name,
name: WASMER_TEST_OWNER + "/" + pkg_name + getRandomInt(1000),
version: "0.1."+ getRandomInt(10000),
},
command: [
{
Expand Down Expand Up @@ -294,7 +300,8 @@ describe("Registry", function () {
it("fails deploying apps with unpublished packages", async () => {
let manifest = {
package: {
name: WASMER_TEST_OWNER + "/" + pkg_name,
name: WASMER_TEST_OWNER + "/" + pkg_name + getRandomInt(1000),
version: "0.1."+ getRandomInt(10000),
},
command: [
{
Expand Down Expand Up @@ -343,7 +350,8 @@ describe("Registry", function () {
it("can deploy apps with user-created packages", async () => {
let manifest = {
package: {
name: WASMER_TEST_OWNER + "/" + pkg_name,
name: WASMER_TEST_OWNER + "/" + pkg_name + getRandomInt(1000),
version: "0.1."+ getRandomInt(10000),
},
command: [
{
Expand Down Expand Up @@ -487,7 +495,6 @@ describe("Registry", function () {

it("can deploy a php app", async () => {
let manifest = {
package: { name: WASMER_TEST_OWNER + "/" },
command: [
{
module: "php/php:php",
Expand All @@ -511,7 +518,6 @@ describe("Registry", function () {
};

let pkg = await Wasmer.createPackage(manifest);
await Wasmer.publishPackage(pkg);

let appConfig = {
name: app_name,
Expand Down

0 comments on commit 0ad706a

Please sign in to comment.