Skip to content

Commit 0ad706a

Browse files
authored
Merge pull request wasmerio#428 from wasmerio/fix-tagging
fix: Publish packages and make linter happy
2 parents 71fc6b3 + 8a3324f commit 0ad706a

File tree

4 files changed

+138
-64
lines changed

4 files changed

+138
-64
lines changed

src/registry/package/mod.rs

+121-51
Original file line numberDiff line numberDiff line change
@@ -88,66 +88,136 @@ impl Wasmer {
8888
) -> Result<PublishPackageOutput, Error> {
8989
let client = Wasmer::get_client()?;
9090

91-
if wasmer_api::query::get_package_release(client, hash)
92-
.await?
93-
.is_some()
91+
let (id, hash) = if let Some(release) =
92+
wasmer_api::query::get_package_release(client, hash).await?
9493
{
95-
// The package was already published.
96-
return Ok(PublishPackageOutput {
97-
manifest: serde_wasm_bindgen::to_value(&manifest)
98-
.map_err(|e| anyhow::anyhow!("{e:?}"))?,
99-
hash: hash.to_string(),
100-
});
101-
}
94+
(release.id, release.webc_v3.map(|v| v.webc_sha256))
95+
} else {
96+
let signed_url = wasmer_api::query::get_signed_url_for_package_upload(
97+
client,
98+
Some(60 * 30),
99+
Some(format!("js-{}", random()).replace('.', "-")).as_deref(),
100+
None,
101+
None,
102+
)
103+
.await?
104+
.ok_or_else(|| anyhow::anyhow!("No signed url!"))?
105+
.url;
106+
107+
upload(bytes, &signed_url).await?;
108+
109+
let (namespace, name) =
110+
if let Some(full_name) = manifest.package.as_ref().and_then(|p| p.name.clone()) {
111+
let splits: Vec<String> = full_name.split('/').map(|s| s.to_string()).collect();
112+
(
113+
splits
114+
.first()
115+
.ok_or_else(|| anyhow::anyhow!("No namespace provided!"))?
116+
.clone(),
117+
splits.get(1).cloned(),
118+
)
119+
} else {
120+
return Err(utils::Error::Rust(anyhow::anyhow!(
121+
"No namespace provided!"
122+
)));
123+
};
124+
125+
tracing::debug!("Pushing package release...");
126+
let out = wasmer_api::query::push_package_release(
127+
client,
128+
name.as_deref(),
129+
&namespace,
130+
&signed_url,
131+
manifest.package.as_ref().map(|p| p.private),
132+
)
133+
.await
134+
.map_err(|e| anyhow::anyhow!("{e:?}"))?
135+
.ok_or_else(|| anyhow::anyhow!("Backend returned no data!"))?;
136+
if let Some(package_web) = out.package_webc {
137+
(package_web.id, package_web.webc_v3.map(|v| v.webc_sha256))
138+
} else {
139+
return Err(
140+
anyhow::anyhow!("No package identifier was found, tagging failed!").into(),
141+
);
142+
}
143+
};
144+
145+
let hash =
146+
hash.ok_or_else(|| anyhow::anyhow!("No hash given for the uploaded package!"))?;
147+
148+
if let Some(name) = manifest.package.as_ref().and_then(|p| p.name.as_ref()) {
149+
// We use a hack to deploy with unnamed packages that fills in the namespace in the
150+
// manifest, so just checking if "name" is some is not enough. The logical solution?
151+
// Another - smaller - hack!
152+
let splits = name
153+
.split('/')
154+
.filter(|v| !v.is_empty())
155+
.collect::<Vec<_>>();
156+
157+
if splits.len() <= 1 {
158+
return Ok(PublishPackageOutput {
159+
manifest: serde_wasm_bindgen::to_value(&manifest)
160+
.map_err(|e| anyhow::anyhow!("{e:?}"))?,
161+
hash,
162+
});
163+
}
102164

103-
let signed_url = wasmer_api::query::get_signed_url_for_package_upload(
104-
client,
105-
Some(60 * 30),
106-
Some(format!("js-{}", random()).replace('.', "-")).as_deref(),
107-
None,
108-
None,
109-
)
110-
.await?
111-
.ok_or_else(|| anyhow::anyhow!("No signed url!"))?
112-
.url;
113-
114-
upload(bytes, &signed_url).await?;
115-
116-
let (namespace, name) =
117-
if let Some(full_name) = manifest.package.as_ref().and_then(|p| p.name.clone()) {
118-
let splits: Vec<String> = full_name.split('/').map(|s| s.to_string()).collect();
119-
(
120-
splits
121-
.first()
122-
.ok_or_else(|| anyhow::anyhow!("No namespace provided!"))?
123-
.clone(),
124-
splits.get(1).cloned(),
125-
)
165+
let version =
166+
if let Some(version) = manifest.package.as_ref().and_then(|p| p.version.as_ref()) {
167+
version.to_string()
168+
} else {
169+
return Err(anyhow::anyhow!("No version provided!").into());
170+
};
171+
172+
let maybe_description = manifest
173+
.package
174+
.as_ref()
175+
.and_then(|p| p.description.clone());
176+
let maybe_homepage = manifest.package.as_ref().and_then(|p| p.homepage.clone());
177+
let maybe_license = manifest.package.as_ref().and_then(|p| p.license.clone());
178+
let maybe_license_file = manifest
179+
.package
180+
.as_ref()
181+
.and_then(|p| p.license_file.clone())
182+
.map(|f| f.to_string_lossy().to_string());
183+
let maybe_readme = manifest
184+
.package
185+
.as_ref()
186+
.and_then(|p| p.readme.clone())
187+
.map(|f| f.to_string_lossy().to_string());
188+
let maybe_repository = manifest.package.as_ref().and_then(|p| p.repository.clone());
189+
190+
let private = if let Some(pkg) = &manifest.package {
191+
Some(pkg.private)
126192
} else {
127-
return Err(utils::Error::Rust(anyhow::anyhow!(
128-
"No namespace provided!"
129-
)));
193+
Some(false)
130194
};
131195

132-
let out = wasmer_api::query::push_package_release(
133-
client,
134-
name.as_deref(),
135-
&namespace,
136-
&signed_url,
137-
manifest.package.as_ref().map(|p| p.private),
138-
)
139-
.await
140-
.map_err(|e| anyhow::anyhow!("{e:?}"))?
141-
.ok_or_else(|| anyhow::anyhow!("Backend returned no data!"))?;
196+
let manifest_raw = Some(toml::to_string(&manifest)?);
197+
198+
let r = wasmer_api::query::tag_package_release(
199+
client,
200+
maybe_description.as_deref(),
201+
maybe_homepage.as_deref(),
202+
maybe_license.as_deref(),
203+
maybe_license_file.as_deref(),
204+
manifest_raw.as_deref(),
205+
name,
206+
None,
207+
&id,
208+
private,
209+
maybe_readme.as_deref(),
210+
maybe_repository.as_deref(),
211+
&version,
212+
);
213+
214+
r.await?;
215+
}
142216

143217
Ok(PublishPackageOutput {
144218
manifest: serde_wasm_bindgen::to_value(&manifest)
145219
.map_err(|e| anyhow::anyhow!("{e:?}"))?,
146-
hash: out
147-
.package_webc
148-
.and_then(|p| p.webc_v3)
149-
.map(|c| c.webc_sha256)
150-
.ok_or_else(|| anyhow::anyhow!("No package was published!"))?,
220+
hash,
151221
})
152222
}
153223
}

src/run.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use futures::channel::oneshot;
2+
use std::sync::Arc;
23
use wasm_bindgen::{prelude::wasm_bindgen, JsCast};
34
use wasmer_wasix::{Runtime as _, WasiEnvBuilder};
4-
use std::sync::Arc;
55

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

@@ -36,7 +36,6 @@ async fn run_wasix_inner(wasm_module: WasmModule, config: RunOptions) -> Result<
3636
.program()
3737
.as_string()
3838
.unwrap_or_else(|| DEFAULT_PROGRAM_NAME.to_string());
39-
4039

4140
let mut builder = WasiEnvBuilder::new(program_name).runtime(runtime.clone());
4241
let (stdin, stdout, stderr) = config.configure_builder(&mut builder)?;

src/runtime.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ impl Runtime {
8989
)
9090
.with_task_manager(task_manager.clone());
9191
runtime.http_client = Arc::new(http_client);
92-
92+
9393
runtime.task_manager = Some(task_manager);
9494
runtime
9595
}
@@ -101,11 +101,10 @@ impl Runtime {
101101

102102
pub(crate) fn new() -> Self {
103103
let mut http_client = WebHttpClient::default();
104-
http_client
105-
.with_default_header(
106-
http::header::USER_AGENT,
107-
HeaderValue::from_static(crate::USER_AGENT),
108-
);
104+
http_client.with_default_header(
105+
http::header::USER_AGENT,
106+
HeaderValue::from_static(crate::USER_AGENT),
107+
);
109108
let http_client = Arc::new(http_client);
110109

111110
let module_cache = ThreadLocalCache::default();

tests/registry.test.ts

+11-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { init, initializeLogger, Wasmer } from "..";
44
const pkg_name = "test-js-sdk-pkg";
55
const app_name = "test-js-sdk-app";
66

7+
8+
function getRandomInt(max) {
9+
return Math.floor(Math.random() * max);
10+
}
11+
712
describe("Registry", function () {
813
this.timeout("60s").beforeAll(async () => {
914
await init({
@@ -259,7 +264,8 @@ describe("Registry", function () {
259264
it("can publish named packages", async () => {
260265
let manifest = {
261266
package: {
262-
name: WASMER_TEST_OWNER + "/" + pkg_name,
267+
name: WASMER_TEST_OWNER + "/" + pkg_name + getRandomInt(1000),
268+
version: "0.1."+ getRandomInt(10000),
263269
},
264270
command: [
265271
{
@@ -294,7 +300,8 @@ describe("Registry", function () {
294300
it("fails deploying apps with unpublished packages", async () => {
295301
let manifest = {
296302
package: {
297-
name: WASMER_TEST_OWNER + "/" + pkg_name,
303+
name: WASMER_TEST_OWNER + "/" + pkg_name + getRandomInt(1000),
304+
version: "0.1."+ getRandomInt(10000),
298305
},
299306
command: [
300307
{
@@ -343,7 +350,8 @@ describe("Registry", function () {
343350
it("can deploy apps with user-created packages", async () => {
344351
let manifest = {
345352
package: {
346-
name: WASMER_TEST_OWNER + "/" + pkg_name,
353+
name: WASMER_TEST_OWNER + "/" + pkg_name + getRandomInt(1000),
354+
version: "0.1."+ getRandomInt(10000),
347355
},
348356
command: [
349357
{
@@ -487,7 +495,6 @@ describe("Registry", function () {
487495

488496
it("can deploy a php app", async () => {
489497
let manifest = {
490-
package: { name: WASMER_TEST_OWNER + "/" },
491498
command: [
492499
{
493500
module: "php/php:php",
@@ -511,7 +518,6 @@ describe("Registry", function () {
511518
};
512519

513520
let pkg = await Wasmer.createPackage(manifest);
514-
await Wasmer.publishPackage(pkg);
515521

516522
let appConfig = {
517523
name: app_name,

0 commit comments

Comments
 (0)