From 35b5d2055a08cb32a233f4113d778893d4f4b8b8 Mon Sep 17 00:00:00 2001 From: Mike Hilgendorf Date: Thu, 16 Oct 2025 16:45:42 -0500 Subject: [PATCH 1/3] fix: bump tangram client and fix compile failures --- packages/std/Cargo.lock | 16 ++--- packages/std/Cargo.toml | 4 +- packages/std/packages/std/manifest.rs | 5 +- packages/std/packages/tgcc/src/main.rs | 3 +- packages/std/packages/tgld/src/main.rs | 85 ++++++++++++++++++----- packages/std/packages/tgstrip/src/main.rs | 1 + packages/std/packages/wrapper/src/main.rs | 1 + packages/std/utils.tg.ts | 2 +- packages/std/wrap.tg.ts | 4 +- 9 files changed, 87 insertions(+), 34 deletions(-) diff --git a/packages/std/Cargo.lock b/packages/std/Cargo.lock index 6a9e2aad..2e490884 100644 --- a/packages/std/Cargo.lock +++ b/packages/std/Cargo.lock @@ -1627,7 +1627,7 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "tangram_client" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "blake3", "byte-unit", @@ -1674,7 +1674,7 @@ dependencies = [ [[package]] name = "tangram_either" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "serde", "tangram_serialize", @@ -1683,7 +1683,7 @@ dependencies = [ [[package]] name = "tangram_futures" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "dashmap", "futures", @@ -1695,7 +1695,7 @@ dependencies = [ [[package]] name = "tangram_http" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "bytes", "derive_more", @@ -1720,7 +1720,7 @@ dependencies = [ [[package]] name = "tangram_itertools" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "tangram_either", ] @@ -1728,7 +1728,7 @@ dependencies = [ [[package]] name = "tangram_serialize" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "byteorder", "bytes", @@ -1741,7 +1741,7 @@ dependencies = [ [[package]] name = "tangram_serialize_macro" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "itertools", "num", @@ -1769,7 +1769,7 @@ dependencies = [ [[package]] name = "tangram_uri" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "derive_more", "regex", diff --git a/packages/std/Cargo.toml b/packages/std/Cargo.toml index f5c233e3..3f144058 100644 --- a/packages/std/Cargo.toml +++ b/packages/std/Cargo.toml @@ -35,8 +35,8 @@ itertools = "0.14" libc = "0.2" serde = { version = "1", features = ["derive"] } serde_json = "1" -tangram_client = { default-features = false, git = "https://github.com/tangramdotdev/tangram", rev = "6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" } -tangram_serialize = { default-features = false, git = "https://github.com/tangramdotdev/tangram", rev = "6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" } +tangram_client = { default-features = false, git = "https://github.com/tangramdotdev/tangram", rev = "672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" } +tangram_serialize = { default-features = false, git = "https://github.com/tangramdotdev/tangram", rev = "672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" } tempfile = "3" tokio = { version = "1", default-features = false, features = [ "rt", diff --git a/packages/std/packages/std/manifest.rs b/packages/std/packages/std/manifest.rs index 1e367155..0968ac0e 100644 --- a/packages/std/packages/std/manifest.rs +++ b/packages/std/packages/std/manifest.rs @@ -474,7 +474,7 @@ impl Manifest { /// Collect the dependencies from a manifest. #[must_use] - pub fn dependencies(&self) -> BTreeMap> { + pub fn dependencies(&self) -> BTreeMap>> { let mut dependencies = BTreeMap::default(); // Collect the references from the interpreter. @@ -550,6 +550,9 @@ impl Manifest { } dependencies + .into_iter() + .map(|(reference, referent)| (reference, Some(referent))) + .collect() } } diff --git a/packages/std/packages/tgcc/src/main.rs b/packages/std/packages/tgcc/src/main.rs index 6c5a7d6e..323c9328 100644 --- a/packages/std/packages/tgcc/src/main.rs +++ b/packages/std/packages/tgcc/src/main.rs @@ -366,7 +366,7 @@ async fn run_proxy(environment: Environment, args: Args) -> tg::Result<()> { env: environment.env, executable, host: Some(host), - name: None, + name: Some("cc".into()), network: Some(false), mounts: None, parent: None, @@ -580,6 +580,7 @@ async fn check_in_source_tree( local_dependencies: true, locked: false, lock: false, + ..tg::checkin::Options::default() }, path, updates: vec![], diff --git a/packages/std/packages/tgld/src/main.rs b/packages/std/packages/tgld/src/main.rs index c4e323ca..f557a730 100644 --- a/packages/std/packages/tgld/src/main.rs +++ b/packages/std/packages/tgld/src/main.rs @@ -1,4 +1,4 @@ -use futures::{StreamExt as _, TryStreamExt as _}; +use futures::{StreamExt as _, TryFutureExt, TryStreamExt as _}; use itertools::Itertools; use std::{ collections::{BTreeMap, HashMap, HashSet}, @@ -20,6 +20,37 @@ fn main() { } } +trait Ext { + type T; + fn timeout( + self, + t: std::time::Duration, + msg: &str, + ) -> impl Future>; +} + +impl Ext for F +where + F: Future, +{ + type T = T; + fn timeout( + self, + t: std::time::Duration, + msg: &str, + ) -> impl Future> { + async move { + match tokio::time::timeout(t, self).await { + Ok(result) => Ok(result), + Err(elapsed) => { + eprintln!("{msg} timed out"); + Err(elapsed) + }, + } + } + } +} + fn main_inner() -> tg::Result<()> { // Read the options from the environment and arguments. let options = read_options()?; @@ -55,7 +86,11 @@ fn main_inner() -> tg::Result<()> { .enable_all() .build() .unwrap() - .block_on(create_wrapper(&options))?; + .block_on( + create_wrapper(&options) + .timeout(std::time::Duration::from_secs(30), "tgld") + .map_err(|_| tg::error!("tgld timed out")), + )??; Ok(()) } @@ -129,14 +164,12 @@ fn read_options() -> tg::Result { let mut embed = std::env::var("TGLD_EMBED_WRAPPER").is_ok(); // Get additional interpreter args, if any. - let interpreter_args = std::env::var("TGLD_INTERPRETER_ARGS") - .ok() - .map(|combined| { - combined - .split_whitespace() - .map(std::string::ToString::to_string) - .collect_vec() - }); + let interpreter_args = std::env::var("TGLD_INTERPRETER_ARGS").ok().map(|combined| { + combined + .split_whitespace() + .map(std::string::ToString::to_string) + .collect_vec() + }); // Get the max depth. let mut max_depth = std::env::var("TGLD_MAX_DEPTH") @@ -249,7 +282,10 @@ fn read_options() -> tg::Result { async fn create_wrapper(options: &Options) -> tg::Result<()> { // Create the tangram instance. let tg = tg::Client::with_env()?; - tg.connect().await?; + tg.connect() + .timeout(std::time::Duration::from_secs(1), "connect") + .map_err(|_| tg::error!("connect() timed out")) + .await??; let tg_url = tg.url(); tracing::debug!(?tg_url, "connected client"); @@ -368,7 +404,9 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> { }; Ok::<_, tg::Error>(artifact_path) })) - .await? + .timeout(std::time::Duration::from_secs(1), "collect") + .map_err(|_| tg::error!("collecting library paths timed out")) + .await?? .into_iter() .flatten(), ) @@ -395,12 +433,15 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> { local_dependencies: true, locked: false, lock: false, + ..tg::checkin::Options::default() }, path: output_path, updates: vec![], }, ) - .await? + .timeout(std::time::Duration::from_secs(30), "checkin") + .map_err(|_| tg::error!("checkin timed out")) + .await?? .try_unwrap_file() .map_err(|error| tg::error!(source = error, "expected a file"))?; @@ -432,7 +473,12 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> { options.max_depth, options.disallow_missing, ) - .await?; + .timeout( + std::time::Duration::from_secs(1), + "optimizing library paths", + ) + .map_err(|source| tg::error!(!source, "optimizing library paths timed out")) + .await??; tracing::trace!( ?library_paths, @@ -450,8 +496,10 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> { let output_artifact_id = output_file.id().clone().into(); // Create the manifest. - let mut manifest = - create_manifest(output_artifact_id, options, interpreter, library_paths).await?; + let mut manifest = create_manifest(output_artifact_id, options, interpreter, library_paths) + .timeout(std::time::Duration::from_millis(1), "create_manifest") + .map_err(|source| tg::error!(!source, "creating the manifest timed out")) + .await??; tracing::trace!(?manifest); // If requested, emebd the wrapper. @@ -465,7 +513,6 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> { }; // Write the manifest to a wrapper. - let new_wrapper_id = new_wrapper.id(); tracing::trace!(?new_wrapper_id); @@ -480,7 +527,7 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> { let key = tg::Reference::with_object(dir_with_subpath.id.clone().into()); let item = tg::Directory::with_id(dir_with_subpath.id).into(); let value = tg::Referent::with_item(item); - Ok::<_, tg::Error>((key, value)) + Ok::<_, tg::Error>((key, Some(value))) }, )) .await?, @@ -579,6 +626,7 @@ async fn checkin_local_library_path( local_dependencies: true, locked: true, lock: false, + ..tg::checkin::Options::default() }, path: library_candidate_path, updates: vec![], @@ -870,6 +918,7 @@ async fn create_library_directory_for_command_line_libraries( local_dependencies: true, locked: true, lock: false, + ..tg::checkin::Options::default() }, path: library_candidate_path.clone(), updates: vec![], diff --git a/packages/std/packages/tgstrip/src/main.rs b/packages/std/packages/tgstrip/src/main.rs index 07f35ad6..ebe72365 100644 --- a/packages/std/packages/tgstrip/src/main.rs +++ b/packages/std/packages/tgstrip/src/main.rs @@ -155,6 +155,7 @@ async fn run_proxy( ignore: false, locked: false, lock: false, + ..tg::checkin::Options::default() }, path: local_executable_path, updates: vec![], diff --git a/packages/std/packages/wrapper/src/main.rs b/packages/std/packages/wrapper/src/main.rs index f16c84b1..2e83b937 100644 --- a/packages/std/packages/wrapper/src/main.rs +++ b/packages/std/packages/wrapper/src/main.rs @@ -104,6 +104,7 @@ fn main_inner() -> std::io::Result<()> { ) = &manifest.interpreter { // Set `TANGRAM_INJECTION_IDENTITY_PATH`. + #[cfg(feature = "tracing")] tracing::trace!("SETTING IDENTITY PATH: {}", wrapper_path.display()); unsafe { std::env::set_var("TANGRAM_INJECTION_IDENTITY_PATH", wrapper_path); diff --git a/packages/std/utils.tg.ts b/packages/std/utils.tg.ts index 04591f01..1e14ca9d 100644 --- a/packages/std/utils.tg.ts +++ b/packages/std/utils.tg.ts @@ -67,7 +67,7 @@ export const env = async (arg?: tg.Unresolved) => { CONFIG_SHELL: shellExecutable, SHELL: shellExecutable, }; - const env = await std.env.arg(env_, shellEnv, { utils: false }); + const env = await std.env.arg(env_, shellEnv, { utils: false }, { WATERMARK: "3" }); const commonArg = { bootstrap, build, env, host, sdk }; let utils = [shellArtifact, shellEnv]; diff --git a/packages/std/wrap.tg.ts b/packages/std/wrap.tg.ts index a249f6c2..4aec0133 100644 --- a/packages/std/wrap.tg.ts +++ b/packages/std/wrap.tg.ts @@ -1027,7 +1027,7 @@ export namespace wrap { ); let new_file = await tg.file(bytes, { executable: true, - dependencies: file.dependencies(), + dependencies: await file.dependencies(), }); return [new_file, manifest]; @@ -2889,8 +2889,6 @@ export const testDependencies = async () => { const wrapperDependencies = await wrapper.dependencies(); console.log("wrapperDependencies", wrapperDependencies); - // return wrapper; - const bundle = tg.bundle(await tg.directory({ wrapper })); return bundle; }; From 7cf47979eb70856c56f2edff24e893f1545a49e0 Mon Sep 17 00:00:00 2001 From: Ben Lovy Date: Thu, 16 Oct 2025 17:56:45 -0400 Subject: [PATCH 2/3] use default for run arg --- packages/rust/tgrustc/src/main.rs | 14 ++------------ packages/std/packages/tgcc/src/main.rs | 12 +----------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/packages/rust/tgrustc/src/main.rs b/packages/rust/tgrustc/src/main.rs index 035174a6..cdcfe3fd 100644 --- a/packages/rust/tgrustc/src/main.rs +++ b/packages/rust/tgrustc/src/main.rs @@ -320,22 +320,12 @@ async fn run_proxy(args: Args) -> tg::Result<()> { let host = host().to_string(); let run_arg = tg::run::Arg { args: command_args, - cwd: None, - cached: None, - checksum: None, env, executable, host: Some(host), - mounts: None, - name: None, + name: Some("rustc".into()), network: Some(false), - parent: None, - remote: None, - retry: false, - stderr: None, - stdout: None, - stdin: None, - user: None, + ..Default::default() }; // Get the process output. diff --git a/packages/std/packages/tgcc/src/main.rs b/packages/std/packages/tgcc/src/main.rs index 323c9328..387f60a4 100644 --- a/packages/std/packages/tgcc/src/main.rs +++ b/packages/std/packages/tgcc/src/main.rs @@ -360,22 +360,12 @@ async fn run_proxy(environment: Environment, args: Args) -> tg::Result<()> { let host = tg::host().to_string(); let run_arg = tg::run::Arg { args, - cached: None, - checksum: None, - cwd: None, env: environment.env, executable, host: Some(host), name: Some("cc".into()), network: Some(false), - mounts: None, - parent: None, - remote: None, - retry: false, - stdout: None, - stderr: None, - stdin: None, - user: None, + ..Default::default() }; let build_directory = tg::run::run(tg, run_arg) .await? From 98a999a0d83dac19955ae19636c48468f72c9d3b Mon Sep 17 00:00:00 2001 From: Ben Lovy Date: Thu, 16 Oct 2025 17:59:57 -0400 Subject: [PATCH 3/3] bump tgrustc --- packages/rust/tgrustc/Cargo.lock | 16 ++++++++-------- packages/rust/tgrustc/Cargo.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/rust/tgrustc/Cargo.lock b/packages/rust/tgrustc/Cargo.lock index 7830f648..c03f94de 100644 --- a/packages/rust/tgrustc/Cargo.lock +++ b/packages/rust/tgrustc/Cargo.lock @@ -1555,7 +1555,7 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "tangram_client" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "blake3", "byte-unit", @@ -1602,7 +1602,7 @@ dependencies = [ [[package]] name = "tangram_either" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "serde", "tangram_serialize", @@ -1611,7 +1611,7 @@ dependencies = [ [[package]] name = "tangram_futures" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "dashmap", "futures", @@ -1623,7 +1623,7 @@ dependencies = [ [[package]] name = "tangram_http" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "bytes", "derive_more", @@ -1648,7 +1648,7 @@ dependencies = [ [[package]] name = "tangram_itertools" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "tangram_either", ] @@ -1656,7 +1656,7 @@ dependencies = [ [[package]] name = "tangram_serialize" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "byteorder", "bytes", @@ -1669,7 +1669,7 @@ dependencies = [ [[package]] name = "tangram_serialize_macro" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "itertools", "num", @@ -1681,7 +1681,7 @@ dependencies = [ [[package]] name = "tangram_uri" version = "0.0.0" -source = "git+https://github.com/tangramdotdev/tangram?rev=6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0#6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" +source = "git+https://github.com/tangramdotdev/tangram?rev=672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e#672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" dependencies = [ "derive_more", "regex", diff --git a/packages/rust/tgrustc/Cargo.toml b/packages/rust/tgrustc/Cargo.toml index bc0d2920..bc07e073 100644 --- a/packages/rust/tgrustc/Cargo.toml +++ b/packages/rust/tgrustc/Cargo.toml @@ -19,7 +19,7 @@ futures = "0.3" itertools = "0.14" serde = { version = "1", features = ["derive"] } serde_json = "1" -tangram_client = { default-features = false, git = "https://github.com/tangramdotdev/tangram", rev = "6da4e0886a6b5a3000d1efbbaf6f2c3e90808fb0" } +tangram_client = { default-features = false, git = "https://github.com/tangramdotdev/tangram", rev = "672bf6735a72f91be57d31a1c1d0ea6c3a8a7a2e" } tokio = { version = "1", default-features = false, features = [ "rt", "fs",