├── .gitignore ├── .cargo └── config ├── src ├── states.rs ├── states │ ├── completed.rs │ ├── finished.rs │ ├── crash_loop_backoff.rs │ ├── terminated.rs │ ├── image_pull_backoff.rs │ ├── error.rs │ ├── image_pull.rs │ ├── volume_mount.rs │ ├── registered.rs │ ├── running.rs │ ├── starting.rs │ └── initializing.rs ├── lib.rs └── wasi_runtime.rs ├── README.md ├── Cargo.toml ├── LICENSE ├── runtime.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /.cargo/config: -------------------------------------------------------------------------------- 1 | [target.armv7-unknown-linux-gnueabihf] 2 | linker = "arm-linux-gnueabihf-gcc" 3 | 4 | [target.aarch64-unknown-linux-gnu] 5 | linker = "aarch64-linux-gnu-gcc" 6 | -------------------------------------------------------------------------------- /src/states.rs: -------------------------------------------------------------------------------- 1 | pub(crate) mod completed; 2 | pub(crate) mod crash_loop_backoff; 3 | pub(crate) mod error; 4 | pub(crate) mod image_pull; 5 | pub(crate) mod image_pull_backoff; 6 | pub(crate) mod initializing; 7 | pub(crate) mod registered; 8 | pub(crate) mod running; 9 | pub(crate) mod starting; 10 | pub(crate) mod terminated; 11 | pub(crate) mod volume_mount; 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # krustlet-wasm3 2 | 3 | [Krustlet](https://github.com/deislabs/krustlet) provider for the [wasm3](https://github.com/wasm3/wasm3) runtime. 4 | 5 | ## Prerequisites 6 | 7 | [Install Clang 3.9](https://rust-lang.github.io/rust-bindgen/requirements.html#installing-clang-39) and [rust-bindgen](https://rust-lang.github.io/rust-bindgen) prior to running `cargo build`: 8 | 9 | ```console 10 | $ apt install llvm-dev libclang-dev clang 11 | $ cargo install bindgen 12 | ``` 13 | -------------------------------------------------------------------------------- /src/states/completed.rs: -------------------------------------------------------------------------------- 1 | use crate::PodState; 2 | use kubelet::state::prelude::*; 3 | 4 | /// Pod was deleted. 5 | #[derive(Default, Debug)] 6 | pub struct Completed; 7 | 8 | #[async_trait::async_trait] 9 | impl State for Completed { 10 | async fn next( 11 | self: Box, 12 | _pod_state: &mut PodState, 13 | _pod: &Pod, 14 | ) -> anyhow::Result> { 15 | Ok(Transition::Complete(Ok(()))) 16 | } 17 | 18 | async fn json_status( 19 | &self, 20 | _pod_state: &mut PodState, 21 | _pod: &Pod, 22 | ) -> anyhow::Result { 23 | make_status(Phase::Succeeded, "Completed") 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/states/finished.rs: -------------------------------------------------------------------------------- 1 | use crate::PodState; 2 | use kubelet::state::prelude::*; 3 | 4 | /// Pod execution completed with no errors. 5 | #[derive(Default, Debug)] 6 | pub struct Finished; 7 | 8 | #[async_trait::async_trait] 9 | impl State for Finished { 10 | async fn next( 11 | self: Box, 12 | _pod_state: &mut PodState, 13 | _pod: &Pod, 14 | ) -> anyhow::Result> { 15 | Ok(Transition::Complete(Ok(()))) 16 | } 17 | 18 | async fn json_status( 19 | &self, 20 | _pod_state: &mut PodState, 21 | _pod: &Pod, 22 | ) -> anyhow::Result { 23 | make_status(Phase::Succeeded, "Finished") 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/states/crash_loop_backoff.rs: -------------------------------------------------------------------------------- 1 | use crate::PodState; 2 | use kubelet::state::prelude::*; 3 | 4 | use super::registered::Registered; 5 | 6 | #[derive(Debug)] 7 | pub struct CrashLoopBackoff; 8 | 9 | #[async_trait::async_trait] 10 | impl State for CrashLoopBackoff { 11 | async fn next( 12 | self: Box, 13 | _pod_state: &mut PodState, 14 | _pod: &Pod, 15 | ) -> anyhow::Result> { 16 | tokio::time::delay_for(std::time::Duration::from_secs(60)).await; 17 | Ok(Transition::next(self, Registered)) 18 | } 19 | 20 | async fn json_status( 21 | &self, 22 | _pod_state: &mut PodState, 23 | _pod: &Pod, 24 | ) -> anyhow::Result { 25 | make_status(Phase::Pending, "CrashLoopBackoff") 26 | } 27 | } 28 | 29 | impl TransitionTo for CrashLoopBackoff {} 30 | -------------------------------------------------------------------------------- /src/states/terminated.rs: -------------------------------------------------------------------------------- 1 | use crate::PodState; 2 | use kubelet::state::prelude::*; 3 | 4 | /// Pod was deleted. 5 | #[derive(Default, Debug)] 6 | pub struct Terminated; 7 | 8 | #[async_trait::async_trait] 9 | impl State for Terminated { 10 | async fn next( 11 | self: Box, 12 | pod_state: &mut PodState, 13 | _pod: &Pod, 14 | ) -> anyhow::Result> { 15 | let mut lock = pod_state.shared.handles.write().await; 16 | if let Some(handle) = lock.get_mut(&pod_state.key) { 17 | handle.stop().await?; 18 | } 19 | Ok(Transition::Complete(Ok(()))) 20 | } 21 | 22 | async fn json_status( 23 | &self, 24 | _pod_state: &mut PodState, 25 | _pod: &Pod, 26 | ) -> anyhow::Result { 27 | make_status(Phase::Succeeded, "Terminated") 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "krustlet-wasm3" 3 | version = "0.1.0" 4 | authors = ["Matthew Fisher "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | anyhow = "1.0" 11 | async-trait = "0.1" 12 | chrono = { version = "0.4", features = ["serde"] } 13 | env_logger = "0.7" 14 | futures = "0.3" 15 | k8s-openapi = { version = "0.9", default-features = false, features = ["v1_17"] } 16 | kube = { version= "0.40", default-features = false, features = ["native-tls"] } 17 | kubelet = "0.5" 18 | log = "0.4" 19 | oci-distribution = "0.4" 20 | serde = "1.0" 21 | serde_derive = "1.0" 22 | serde_json = "1.0" 23 | tempfile = "3.1" 24 | tokio = { version = "0.2", features = ["fs", "stream", "macros", "io-util", "sync"] } 25 | wasm3 = { git = "https://github.com/Veykril/wasm3-rs.git", features = ["wasi"] } 26 | wat = "1.0" 27 | -------------------------------------------------------------------------------- /src/states/image_pull_backoff.rs: -------------------------------------------------------------------------------- 1 | use super::image_pull::ImagePull; 2 | use crate::PodState; 3 | use kubelet::state::prelude::*; 4 | 5 | /// Kubelet encountered an error when pulling container image. 6 | #[derive(Default, Debug)] 7 | pub struct ImagePullBackoff; 8 | 9 | #[async_trait::async_trait] 10 | impl State for ImagePullBackoff { 11 | async fn next( 12 | self: Box, 13 | _pod_state: &mut PodState, 14 | _pod: &Pod, 15 | ) -> anyhow::Result> { 16 | tokio::time::delay_for(std::time::Duration::from_secs(60)).await; 17 | Ok(Transition::next(self, ImagePull)) 18 | } 19 | 20 | async fn json_status( 21 | &self, 22 | _pod_state: &mut PodState, 23 | _pod: &Pod, 24 | ) -> anyhow::Result { 25 | make_status(Phase::Pending, "ImagePullBackoff") 26 | } 27 | } 28 | 29 | impl TransitionTo for ImagePullBackoff {} 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /src/states/error.rs: -------------------------------------------------------------------------------- 1 | use kubelet::state::prelude::*; 2 | 3 | use super::crash_loop_backoff::CrashLoopBackoff; 4 | use super::registered::Registered; 5 | use crate::PodState; 6 | 7 | #[derive(Default, Debug)] 8 | /// The Pod failed to run. 9 | // If we manually implement, we can allow for arguments. 10 | pub struct Error { 11 | pub message: String, 12 | } 13 | 14 | #[async_trait::async_trait] 15 | impl State for Error { 16 | async fn next( 17 | self: Box, 18 | pod_state: &mut PodState, 19 | _pod: &Pod, 20 | ) -> anyhow::Result> { 21 | pod_state.errors += 1; 22 | if pod_state.errors > 3 { 23 | pod_state.errors = 0; 24 | Ok(Transition::next(self, CrashLoopBackoff)) 25 | } else { 26 | tokio::time::delay_for(std::time::Duration::from_secs(5)).await; 27 | Ok(Transition::next(self, Registered)) 28 | } 29 | } 30 | 31 | async fn json_status( 32 | &self, 33 | _pod_state: &mut PodState, 34 | _pod: &Pod, 35 | ) -> anyhow::Result { 36 | make_status(Phase::Pending, &self.message) 37 | } 38 | } 39 | 40 | impl TransitionTo for Error {} 41 | impl TransitionTo for Error {} 42 | -------------------------------------------------------------------------------- /src/states/image_pull.rs: -------------------------------------------------------------------------------- 1 | use kubelet::state::prelude::*; 2 | use log::error; 3 | 4 | use crate::PodState; 5 | 6 | use super::image_pull_backoff::ImagePullBackoff; 7 | use super::volume_mount::VolumeMount; 8 | 9 | /// Kubelet is pulling container images. 10 | #[derive(Default, Debug)] 11 | pub struct ImagePull; 12 | 13 | #[async_trait::async_trait] 14 | impl State for ImagePull { 15 | async fn next( 16 | self: Box, 17 | pod_state: &mut PodState, 18 | pod: &Pod, 19 | ) -> anyhow::Result> { 20 | let client = kube::Client::new(pod_state.shared.kubeconfig.clone()); 21 | let auth_resolver = kubelet::secret::RegistryAuthResolver::new(client, &pod); 22 | pod_state.run_context.modules = match pod_state 23 | .shared 24 | .store 25 | .fetch_pod_modules(&pod, &auth_resolver) 26 | .await 27 | { 28 | Ok(modules) => modules, 29 | Err(e) => { 30 | error!("{:?}", e); 31 | return Ok(Transition::next(self, ImagePullBackoff)); 32 | } 33 | }; 34 | Ok(Transition::next(self, VolumeMount)) 35 | } 36 | 37 | async fn json_status( 38 | &self, 39 | _pod_state: &mut PodState, 40 | _pod: &Pod, 41 | ) -> anyhow::Result { 42 | make_status(Phase::Pending, "ImagePull") 43 | } 44 | } 45 | 46 | impl TransitionTo for ImagePull {} 47 | impl TransitionTo for ImagePull {} 48 | -------------------------------------------------------------------------------- /src/states/volume_mount.rs: -------------------------------------------------------------------------------- 1 | use crate::PodState; 2 | use kubelet::state::prelude::*; 3 | use kubelet::volume::Ref; 4 | use log::error; 5 | 6 | use super::error::Error; 7 | use super::initializing::Initializing; 8 | 9 | /// Kubelet is pulling container images. 10 | #[derive(Default, Debug)] 11 | pub struct VolumeMount; 12 | 13 | #[async_trait::async_trait] 14 | impl State for VolumeMount { 15 | async fn next( 16 | self: Box, 17 | pod_state: &mut PodState, 18 | pod: &Pod, 19 | ) -> anyhow::Result> { 20 | let client = kube::Client::new(pod_state.shared.kubeconfig.clone()); 21 | pod_state.run_context.volumes = 22 | match Ref::volumes_from_pod(&pod_state.shared.volume_path, &pod, &client).await { 23 | Ok(volumes) => volumes, 24 | Err(e) => { 25 | error!("{:?}", e); 26 | let error_state = Error { 27 | message: e.to_string(), 28 | }; 29 | return Ok(Transition::next(self, error_state)); 30 | } 31 | }; 32 | Ok(Transition::next(self, Initializing)) 33 | } 34 | 35 | async fn json_status( 36 | &self, 37 | _pod_state: &mut PodState, 38 | _pod: &Pod, 39 | ) -> anyhow::Result { 40 | make_status(Phase::Pending, "VolumeMount") 41 | } 42 | } 43 | 44 | impl TransitionTo for VolumeMount {} 45 | impl TransitionTo for VolumeMount {} 46 | -------------------------------------------------------------------------------- /src/states/registered.rs: -------------------------------------------------------------------------------- 1 | use log::{error, info}; 2 | 3 | use super::error::Error; 4 | use super::image_pull::ImagePull; 5 | use crate::PodState; 6 | use kubelet::container::Container; 7 | use kubelet::state::prelude::*; 8 | 9 | fn validate_pod_runnable(pod: &Pod) -> anyhow::Result<()> { 10 | for container in pod.containers() { 11 | validate_not_kube_proxy(&container)?; 12 | } 13 | Ok(()) 14 | } 15 | 16 | fn validate_not_kube_proxy(container: &Container) -> anyhow::Result<()> { 17 | if let Some(image) = container.image()? { 18 | if image.whole().starts_with("k8s.gcr.io/kube-proxy") { 19 | return Err(anyhow::anyhow!("Cannot run kube-proxy")); 20 | } 21 | } 22 | Ok(()) 23 | } 24 | 25 | /// The Kubelet is aware of the Pod. 26 | #[derive(Default, Debug)] 27 | pub struct Registered; 28 | 29 | #[async_trait::async_trait] 30 | impl State for Registered { 31 | async fn next( 32 | self: Box, 33 | _pod_state: &mut PodState, 34 | pod: &Pod, 35 | ) -> anyhow::Result> { 36 | match validate_pod_runnable(&pod) { 37 | Ok(_) => (), 38 | Err(e) => { 39 | let message = format!("{:?}", e); 40 | error!("{}", message); 41 | return Ok(Transition::next(self, Error { message })); 42 | } 43 | } 44 | info!("Pod added: {}.", pod.name()); 45 | Ok(Transition::next(self, ImagePull)) 46 | } 47 | 48 | async fn json_status( 49 | &self, 50 | _pod_state: &mut PodState, 51 | _pod: &Pod, 52 | ) -> anyhow::Result { 53 | make_status(Phase::Pending, "Registered") 54 | } 55 | } 56 | 57 | impl TransitionTo for Registered {} 58 | impl TransitionTo for Registered {} 59 | -------------------------------------------------------------------------------- /src/states/running.rs: -------------------------------------------------------------------------------- 1 | use k8s_openapi::api::core::v1::Pod as KubePod; 2 | use kube::api::{Api, PatchParams}; 3 | use kubelet::container::Status; 4 | use kubelet::state::prelude::*; 5 | use log::error; 6 | 7 | use super::completed::Completed; 8 | use super::error::Error; 9 | use crate::PodState; 10 | 11 | async fn patch_container_status( 12 | client: &Api, 13 | pod_name: &str, 14 | name: String, 15 | status: &Status, 16 | ) -> anyhow::Result<()> { 17 | // We need to fetch the current status because there is no way to merge with a strategic merge patch ere 18 | let mut container_statuses = match client.get(pod_name).await { 19 | Ok(p) => match p.status { 20 | Some(s) => s.container_statuses.unwrap_or_default(), 21 | None => { 22 | return Err(anyhow::anyhow!( 23 | "Pod is missing status information. This should not occur" 24 | )); 25 | } 26 | }, 27 | Err(e) => { 28 | error!("Unable to fetch current status of pod {}, aborting status patch (will be retried on next status update): {:?}", pod_name, e); 29 | // FIXME: This is kinda...ugly. But we can't just 30 | // randomly abort the whole process due to an error 31 | // fetching the current status. We should probably have 32 | // some sort of retry mechanism, but that is another 33 | // task for another day 34 | Vec::default() 35 | } 36 | }; 37 | match container_statuses.iter().position(|s| s.name == name) { 38 | Some(i) => { 39 | container_statuses[i] = status.to_kubernetes(name); 40 | } 41 | None => { 42 | container_statuses.push(status.to_kubernetes(name)); 43 | } 44 | }; 45 | let s = serde_json::json!({ 46 | "metadata": { 47 | "resourceVersion": "", 48 | }, 49 | "status": { 50 | "containerStatuses": container_statuses, 51 | } 52 | }); 53 | client 54 | .patch_status(pod_name, &PatchParams::default(), serde_json::to_vec(&s)?) 55 | .await?; 56 | Ok(()) 57 | } 58 | 59 | /// The Kubelet is running the Pod. 60 | #[derive(Default, Debug)] 61 | pub struct Running; 62 | 63 | #[async_trait::async_trait] 64 | impl State for Running { 65 | async fn next( 66 | self: Box, 67 | pod_state: &mut PodState, 68 | pod: &Pod, 69 | ) -> anyhow::Result> { 70 | let client: Api = Api::namespaced( 71 | kube::Client::new(pod_state.shared.kubeconfig.clone()), 72 | pod.namespace(), 73 | ); 74 | let mut completed = 0; 75 | let total_containers = pod.containers().len(); 76 | 77 | while let Some((name, status)) = pod_state.run_context.status_recv.recv().await { 78 | // TODO: implement a container state machine such that it will self-update the Kubernetes API as it transitions through these stages. 79 | if let Err(e) = patch_container_status(&client, &pod.name(), name, &status).await { 80 | error!("Unable to patch status, will retry on next update: {:?}", e); 81 | } 82 | if let Status::Terminated { 83 | timestamp: _, 84 | message, 85 | failed, 86 | } = status 87 | { 88 | if failed { 89 | return Ok(Transition::next(self, Error { message })); 90 | } else { 91 | completed += 1; 92 | if completed == total_containers { 93 | return Ok(Transition::next(self, Completed)); 94 | } 95 | } 96 | } 97 | } 98 | Ok(Transition::next(self, Completed)) 99 | } 100 | 101 | async fn json_status( 102 | &self, 103 | _pod_state: &mut PodState, 104 | _pod: &Pod, 105 | ) -> anyhow::Result { 106 | make_status(Phase::Running, "Running") 107 | } 108 | } 109 | 110 | impl TransitionTo for Running {} 111 | impl TransitionTo for Running {} 112 | -------------------------------------------------------------------------------- /runtime.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | use std::sync::Arc; 3 | 4 | use tempfile::NamedTempFile; 5 | use tokio::sync::watch::{self, Sender}; 6 | use tokio::task::JoinHandle; 7 | use wasm3::{Environment, Module}; 8 | use kubelet::container::Handle as ContainerHandle; 9 | use kubelet::container::Status as ContainerStatus; 10 | use kubelet::handle::StopHandler; 11 | 12 | pub struct Runtime { 13 | handle: JoinHandle>, 14 | } 15 | 16 | #[async_trait::async_trait] 17 | impl StopHandler for Runtime { 18 | async fn stop(&mut self) -> anyhow::Result<()> { 19 | // no nothing 20 | Ok(()) 21 | } 22 | 23 | async fn wait(&mut self) -> anyhow::Result<()> { 24 | (&mut self.handle).await??; 25 | Ok(()) 26 | } 27 | } 28 | 29 | /// A runtime context for running a wasm module with wasm3 30 | pub struct Wasm3Runtime { 31 | module_bytes: Vec, 32 | stack_size: u32, 33 | output: Arc, 34 | } 35 | 36 | impl Wasm3Runtime { 37 | pub async fn new + Send + Sync + 'static>(module_bytes: Vec, stack_size: u32, log_dir: L) -> anyhow::Result { 38 | let temp = tokio::task::spawn_blocking(move || -> anyhow::Result { 39 | Ok(NamedTempFile::new_in(log_dir)?) 40 | }) 41 | .await??; 42 | 43 | Ok(Self { 44 | module_bytes: module_bytes, 45 | stack_size: stack_size, 46 | output: Arc::new(temp), 47 | }) 48 | } 49 | 50 | pub async fn start(&mut self) -> anyhow::Result> { 51 | let temp = self.output.clone(); 52 | let output_write = tokio::task::spawn_blocking(move || -> anyhow::Result { 53 | Ok(temp.reopen()?) 54 | }) 55 | .await??; 56 | 57 | let (status_sender, status_recv) = watch::channel(ContainerStatus::Waiting { 58 | timestamp: chrono::Utc::now(), 59 | message: "No status has been received from the process".into(), 60 | }); 61 | let handle = spawn_wasm3(self.module_bytes.clone(), self.stack_size, status_sender, output_write).await?; 62 | 63 | 64 | let log_handle_factory = LogHandleFactory { 65 | temp: self.output.clone(), 66 | }; 67 | 68 | Ok(ContainerHandle::new( 69 | Runtime{handle}, 70 | log_handle_factory, 71 | )) 72 | } 73 | } 74 | 75 | /// Holds our tempfile handle. 76 | pub struct LogHandleFactory { 77 | temp: Arc, 78 | } 79 | 80 | impl kubelet::log::HandleFactory for LogHandleFactory { 81 | /// Creates `tokio::fs::File` on demand for log reading. 82 | fn new_handle(&self) -> tokio::fs::File { 83 | tokio::fs::File::from_std(self.temp.reopen().unwrap()) 84 | } 85 | } 86 | 87 | // Spawns a running wasmtime instance with the given context and status 88 | // channel. Due to the Instance type not being Send safe, all of the logic 89 | // needs to be done within the spawned task 90 | async fn spawn_wasm3( 91 | module_bytes: Vec, 92 | stack_size: u32, 93 | status_sender: Sender, 94 | _output_write: std::fs::File, //TODO: hook this up such that log output will be written to the file 95 | ) -> anyhow::Result>> { 96 | let handle = tokio::task::spawn_blocking(move || -> anyhow::Result<_> { 97 | 98 | let env = match Environment::new() { 99 | // We can't map errors here or it moves the send channel, so we 100 | // do it in a match 101 | Ok(m) => m, 102 | Err(e) => { 103 | let message = "cannot create environment"; 104 | error!("{}: {:?}", message, e); 105 | send( 106 | status_sender.clone(), 107 | name, 108 | Status::Terminated { 109 | failed: true, 110 | message: message.into(), 111 | timestamp: chrono::Utc::now(), 112 | }, 113 | &mut cx, 114 | ); 115 | return Err(e); 116 | } 117 | } 118 | 119 | let rt = env.create_runtime(stack_size).expect("cannot create runtime"); 120 | 121 | let module = Module::parse(&env, &module_bytes).expect("cannot parse module"); 122 | 123 | let mut module = rt.load_module(module).expect("cannot load module"); 124 | 125 | module.link_wasi().expect("cannot link WASI"); 126 | 127 | let func = module.find_function::<(), ()>("_start").expect("cannot find function '_start' in module"); 128 | 129 | func.call().expect("cannot call '_start' in module"); 130 | 131 | status_sender.broadcast(ContainerStatus::Terminated { 132 | failed: false, 133 | message: "Module run completed".into(), 134 | timestamp: chrono::Utc::now(), 135 | }).expect("status should be able to send"); 136 | 137 | Ok(()) 138 | }); 139 | 140 | Ok(handle) 141 | } 142 | -------------------------------------------------------------------------------- /src/states/starting.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use std::ops::Deref; 3 | use std::path::PathBuf; 4 | use std::sync::Arc; 5 | 6 | use log::{debug, info}; 7 | use tokio::sync::Mutex; 8 | 9 | use kubelet::container::{Container, ContainerKey}; 10 | use kubelet::pod::{key_from_pod, Handle}; 11 | use kubelet::provider; 12 | use kubelet::state::prelude::*; 13 | use kubelet::volume::Ref; 14 | 15 | use crate::wasi_runtime::{self, HandleFactory, Runtime, WasiRuntime}; 16 | use crate::PodState; 17 | 18 | use super::running::Running; 19 | 20 | fn volume_path_map( 21 | container: &Container, 22 | volumes: &HashMap, 23 | ) -> anyhow::Result>> { 24 | if let Some(volume_mounts) = container.volume_mounts().as_ref() { 25 | volume_mounts 26 | .iter() 27 | .map(|vm| -> anyhow::Result<(PathBuf, Option)> { 28 | // Check the volume exists first 29 | let vol = volumes.get(&vm.name).ok_or_else(|| { 30 | anyhow::anyhow!( 31 | "no volume with the name of {} found for container {}", 32 | vm.name, 33 | container.name() 34 | ) 35 | })?; 36 | let mut guest_path = PathBuf::from(&vm.mount_path); 37 | if let Some(sub_path) = &vm.sub_path { 38 | guest_path.push(sub_path); 39 | } 40 | // We can safely assume that this should be valid UTF-8 because it would have 41 | // been validated by the k8s API 42 | Ok((vol.deref().clone(), Some(guest_path))) 43 | }) 44 | .collect::>>>() 45 | } else { 46 | Ok(HashMap::default()) 47 | } 48 | } 49 | 50 | pub(crate) async fn start_container( 51 | pod_state: &mut PodState, 52 | pod: &Pod, 53 | container: &Container, 54 | ) -> anyhow::Result> 55 | { 56 | let module_data = pod_state 57 | .run_context 58 | .modules 59 | .remove(container.name()) 60 | .expect("FATAL ERROR: module map not properly populated"); 61 | let client = kube::Client::new(pod_state.shared.kubeconfig.clone()); 62 | let env = provider::env_vars(&container, pod, &client).await; 63 | let args = container.args().clone().unwrap_or_default(); 64 | let container_volumes = volume_path_map(container, &pod_state.run_context.volumes)?; 65 | 66 | let runtime = WasiRuntime::new( 67 | container.name().to_owned(), 68 | module_data, 69 | env, 70 | args, 71 | container_volumes, 72 | pod_state.shared.log_path.clone(), 73 | pod_state.run_context.status_sender.clone(), 74 | ) 75 | .await?; 76 | 77 | debug!("Starting container {} on thread", container.name()); 78 | runtime.start().await 79 | } 80 | 81 | pub(crate) type ContainerHandleMap = 82 | HashMap>; 83 | 84 | #[derive(Default, Debug)] 85 | /// The Kubelet is starting the Pod containers 86 | pub(crate) struct Starting { 87 | init_handles: Arc>, 88 | } 89 | 90 | impl Starting { 91 | pub(crate) fn new(init_handles: ContainerHandleMap) -> Self { 92 | Starting { 93 | init_handles: Arc::new(Mutex::new(init_handles)), 94 | } 95 | } 96 | } 97 | 98 | #[async_trait::async_trait] 99 | impl State for Starting { 100 | async fn next( 101 | self: Box, 102 | pod_state: &mut PodState, 103 | pod: &Pod, 104 | ) -> anyhow::Result> { 105 | let mut container_handles: ContainerHandleMap = HashMap::new(); 106 | 107 | { 108 | let mut lock = self.init_handles.lock().await; 109 | container_handles.extend((*lock).drain()) 110 | } 111 | 112 | info!("Starting containers for pod {:?}", pod.name()); 113 | for container in pod.containers() { 114 | let container_handle = start_container(pod_state, &pod, &container).await?; 115 | container_handles.insert( 116 | ContainerKey::App(container.name().to_string()), 117 | container_handle, 118 | ); 119 | } 120 | 121 | let pod_handle = Handle::new(container_handles, pod.clone(), None).await?; 122 | let pod_key = key_from_pod(&pod); 123 | { 124 | let mut handles = pod_state.shared.handles.write().await; 125 | handles.insert(pod_key, pod_handle); 126 | } 127 | info!("All containers started for pod {:?}.", pod.name()); 128 | 129 | Ok(Transition::next(self, Running)) 130 | } 131 | 132 | async fn json_status( 133 | &self, 134 | _pod_state: &mut PodState, 135 | _pod: &Pod, 136 | ) -> anyhow::Result { 137 | make_status(Phase::Pending, "Starting") 138 | } 139 | } 140 | 141 | impl TransitionTo for Starting {} 142 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | //! A custom kubelet backend that can run [WASI](https://wasi.dev/) based workloads 2 | //! 3 | //! The crate provides the [`WasiProvider`] type which can be used 4 | //! as a provider with [`kubelet`]. 5 | //! 6 | //! # Example 7 | //! ```rust,no_run 8 | //! use kubelet::{Kubelet, config::Config}; 9 | //! use kubelet::store::oci::FileStore; 10 | //! use std::sync::Arc; 11 | //! use wasi_provider::WasiProvider; 12 | //! 13 | //! async { 14 | //! // Get a configuration for the Kubelet 15 | //! let kubelet_config = Config::default(); 16 | //! let client = oci_distribution::Client::default(); 17 | //! let store = Arc::new(FileStore::new(client, &std::path::PathBuf::from(""))); 18 | //! 19 | //! // Load a kubernetes configuration 20 | //! let kubeconfig = kube::Config::infer().await.unwrap(); 21 | //! 22 | //! // Instantiate the provider type 23 | //! let provider = WasiProvider::new(store, &kubelet_config, kubeconfig.clone()).await.unwrap(); 24 | //! 25 | //! // Instantiate the Kubelet 26 | //! let kubelet = Kubelet::new(provider, kubeconfig, kubelet_config).await.unwrap(); 27 | //! // Start the Kubelet and block on it 28 | //! kubelet.start().await.unwrap(); 29 | //! }; 30 | //! ``` 31 | 32 | #![deny(missing_docs)] 33 | 34 | mod wasi_runtime; 35 | 36 | use std::collections::HashMap; 37 | use std::path::PathBuf; 38 | use std::sync::Arc; 39 | 40 | use async_trait::async_trait; 41 | use kubelet::node::Builder; 42 | use kubelet::pod::{key_from_pod, pod_key, Handle, Pod}; 43 | use kubelet::provider::{Provider, ProviderError}; 44 | use kubelet::store::Store; 45 | use kubelet::volume::Ref; 46 | use tokio::sync::mpsc::{self, Receiver, Sender}; 47 | use tokio::sync::RwLock; 48 | use wasi_runtime::Runtime; 49 | 50 | mod states; 51 | 52 | use states::registered::Registered; 53 | use states::terminated::Terminated; 54 | 55 | const TARGET_WASM32_WASI: &str = "wasm32-wasi"; 56 | const LOG_DIR_NAME: &str = "wasi-logs"; 57 | const VOLUME_DIR: &str = "volumes"; 58 | 59 | /// WasiProvider provides a Kubelet runtime implementation that executes WASM 60 | /// binaries conforming to the WASI spec. 61 | #[derive(Clone)] 62 | pub struct WasiProvider { 63 | shared: SharedPodState, 64 | } 65 | 66 | #[derive(Clone)] 67 | struct SharedPodState { 68 | handles: Arc>>>, 69 | store: Arc, 70 | log_path: PathBuf, 71 | kubeconfig: kube::Config, 72 | volume_path: PathBuf, 73 | } 74 | 75 | impl WasiProvider { 76 | /// Create a new wasi provider from a module store and a kubelet config 77 | pub async fn new( 78 | store: Arc, 79 | config: &kubelet::config::Config, 80 | kubeconfig: kube::Config, 81 | ) -> anyhow::Result { 82 | let log_path = config.data_dir.join(LOG_DIR_NAME); 83 | let volume_path = config.data_dir.join(VOLUME_DIR); 84 | tokio::fs::create_dir_all(&log_path).await?; 85 | tokio::fs::create_dir_all(&volume_path).await?; 86 | Ok(Self { 87 | shared: SharedPodState { 88 | handles: Default::default(), 89 | store, 90 | log_path, 91 | volume_path, 92 | kubeconfig, 93 | }, 94 | }) 95 | } 96 | } 97 | 98 | struct ModuleRunContext { 99 | modules: HashMap>, 100 | volumes: HashMap, 101 | status_sender: Sender<(String, kubelet::container::Status)>, 102 | status_recv: Receiver<(String, kubelet::container::Status)>, 103 | } 104 | 105 | /// State that is shared between pod state handlers. 106 | pub struct PodState { 107 | key: String, 108 | run_context: ModuleRunContext, 109 | errors: usize, 110 | shared: SharedPodState, 111 | } 112 | 113 | // No cleanup state needed, we clean up when dropping PodState. 114 | #[async_trait] 115 | impl kubelet::state::AsyncDrop for PodState { 116 | async fn async_drop(self) { 117 | { 118 | let mut handles = self.shared.handles.write().await; 119 | handles.remove(&self.key); 120 | } 121 | } 122 | } 123 | 124 | #[async_trait::async_trait] 125 | impl Provider for WasiProvider { 126 | type InitialState = Registered; 127 | type TerminatedState = Terminated; 128 | type PodState = PodState; 129 | 130 | const ARCH: &'static str = TARGET_WASM32_WASI; 131 | 132 | async fn node(&self, builder: &mut Builder) -> anyhow::Result<()> { 133 | builder.set_architecture("wasm-wasi"); 134 | builder.add_taint("NoExecute", "kubernetes.io/arch", Self::ARCH); 135 | Ok(()) 136 | } 137 | 138 | async fn initialize_pod_state(&self, pod: &Pod) -> anyhow::Result { 139 | let (tx, rx) = mpsc::channel(pod.all_containers().len()); 140 | let run_context = ModuleRunContext { 141 | modules: Default::default(), 142 | volumes: Default::default(), 143 | status_sender: tx, 144 | status_recv: rx, 145 | }; 146 | let key = key_from_pod(pod); 147 | Ok(PodState { 148 | key, 149 | run_context, 150 | errors: 0, 151 | shared: self.shared.clone(), 152 | }) 153 | } 154 | 155 | async fn logs( 156 | &self, 157 | namespace: String, 158 | pod_name: String, 159 | container_name: String, 160 | sender: kubelet::log::Sender, 161 | ) -> anyhow::Result<()> { 162 | let mut handles = self.shared.handles.write().await; 163 | let handle = handles 164 | .get_mut(&pod_key(&namespace, &pod_name)) 165 | .ok_or_else(|| ProviderError::PodNotFound { 166 | pod_name: pod_name.clone(), 167 | })?; 168 | handle.output(&container_name, sender).await 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /src/states/initializing.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | 3 | use log::{error, info}; 4 | 5 | use crate::PodState; 6 | use k8s_openapi::api::core::v1::Pod as KubePod; 7 | use kube::api::{Api, PatchParams}; 8 | use kubelet::container::{ContainerKey, Status as ContainerStatus}; 9 | use kubelet::pod::{key_from_pod, Handle}; 10 | use kubelet::state::prelude::*; 11 | 12 | use super::error::Error; 13 | use super::starting::{start_container, ContainerHandleMap, Starting}; 14 | 15 | async fn patch_init_status( 16 | client: &Api, 17 | pod_name: &str, 18 | name: String, 19 | status: &ContainerStatus, 20 | ) -> anyhow::Result<()> { 21 | // We need to fetch the current status because there is no way to merge with a strategic merge patch here 22 | let mut init_container_statuses = match client.get(pod_name).await { 23 | Ok(p) => match p.status { 24 | Some(s) => s.init_container_statuses.unwrap_or_default(), 25 | None => { 26 | return Err(anyhow::anyhow!( 27 | "Pod is missing status information. This should not occur" 28 | )); 29 | } 30 | }, 31 | Err(e) => { 32 | error!("Unable to fetch current status of pod {}, aborting status patch (will be retried on next status update): {:?}", pod_name, e); 33 | // FIXME: This is kinda...ugly. But we can't just 34 | // randomly abort the whole process due to an error 35 | // fetching the current status. We should probably have 36 | // some sort of retry mechanism, but that is another 37 | // task for another day 38 | Vec::default() 39 | } 40 | }; 41 | match init_container_statuses.iter().position(|s| s.name == name) { 42 | Some(i) => { 43 | init_container_statuses[i] = status.to_kubernetes(name); 44 | } 45 | None => { 46 | init_container_statuses.push(status.to_kubernetes(name)); 47 | } 48 | }; 49 | let s = serde_json::json!({ 50 | "metadata": { 51 | "resourceVersion": "", 52 | }, 53 | "status": { 54 | "initContainerStatuses": init_container_statuses, 55 | } 56 | }); 57 | client 58 | .patch_status(pod_name, &PatchParams::default(), serde_json::to_vec(&s)?) 59 | .await?; 60 | Ok(()) 61 | } 62 | 63 | #[derive(Debug)] 64 | pub struct Initializing; 65 | 66 | #[async_trait::async_trait] 67 | impl State for Initializing { 68 | async fn next( 69 | self: Box, 70 | pod_state: &mut PodState, 71 | pod: &Pod, 72 | ) -> anyhow::Result> { 73 | let client: Api = Api::namespaced( 74 | kube::Client::new(pod_state.shared.kubeconfig.clone()), 75 | pod.namespace(), 76 | ); 77 | let mut container_handles: ContainerHandleMap = HashMap::new(); 78 | 79 | for init_container in pod.init_containers() { 80 | info!( 81 | "Starting init container {:?} for pod {:?}", 82 | init_container.name(), 83 | pod.name() 84 | ); 85 | 86 | let handle = start_container(pod_state, pod, &init_container).await?; 87 | 88 | container_handles.insert( 89 | ContainerKey::Init(init_container.name().to_string()), 90 | handle, 91 | ); 92 | 93 | while let Some((name, status)) = pod_state.run_context.status_recv.recv().await { 94 | if let Err(e) = patch_init_status(&client, &pod.name(), name.clone(), &status).await 95 | { 96 | error!("Unable to patch status, will retry on next update: {:?}", e); 97 | } 98 | if let ContainerStatus::Terminated { 99 | timestamp: _, 100 | message, 101 | failed, 102 | } = status 103 | { 104 | if failed { 105 | // HACK: update the status message informing which init container failed 106 | let s = serde_json::json!({ 107 | "metadata": { 108 | "resourceVersion": "", 109 | }, 110 | "status": { 111 | "message": format!("Init container {} failed", name), 112 | } 113 | }); 114 | 115 | // If we are in a failed state, insert in the init containers we already ran 116 | // into a pod handle so they are available for future log fetching 117 | let pod_handle = Handle::new(container_handles, pod.clone(), None).await?; 118 | let pod_key = key_from_pod(&pod); 119 | { 120 | let mut handles = pod_state.shared.handles.write().await; 121 | handles.insert(pod_key, pod_handle); 122 | } 123 | client 124 | .patch_status( 125 | pod.name(), 126 | &PatchParams::default(), 127 | serde_json::to_vec(&s)?, 128 | ) 129 | .await?; 130 | return Ok(Transition::next(self, Error { message })); 131 | } else { 132 | break; 133 | } 134 | } 135 | } 136 | } 137 | info!("Finished init containers for pod {:?}", pod.name()); 138 | Ok(Transition::next(self, Starting::new(container_handles))) 139 | } 140 | 141 | async fn json_status( 142 | &self, 143 | _pod_state: &mut PodState, 144 | _pmeod: &Pod, 145 | ) -> anyhow::Result { 146 | make_status(Phase::Running, "Initializing") 147 | } 148 | } 149 | 150 | impl TransitionTo for Initializing {} 151 | impl TransitionTo for Initializing {} 152 | -------------------------------------------------------------------------------- /src/wasi_runtime.rs: -------------------------------------------------------------------------------- 1 | use futures::task; 2 | use log::{error, info, trace}; 3 | use std::collections::HashMap; 4 | use std::path::{Path, PathBuf}; 5 | use std::sync::Arc; 6 | use std::task::{Context, Poll}; 7 | 8 | use tempfile::NamedTempFile; 9 | use tokio::sync::mpsc::Sender; 10 | use tokio::task::JoinHandle; 11 | use wasm3::{Environment, Module}; 12 | 13 | use kubelet::container::Handle as ContainerHandle; 14 | use kubelet::container::Status; 15 | use kubelet::handle::StopHandler; 16 | 17 | pub struct Runtime { 18 | handle: JoinHandle>, 19 | } 20 | 21 | #[async_trait::async_trait] 22 | impl StopHandler for Runtime { 23 | async fn stop(&mut self) -> anyhow::Result<()> { 24 | Ok(()) 25 | } 26 | 27 | async fn wait(&mut self) -> anyhow::Result<()> { 28 | (&mut self.handle).await??; 29 | Ok(()) 30 | } 31 | } 32 | 33 | /// WasiRuntime provides a WASI compatible runtime. A runtime should be used for 34 | /// each "instance" of a process and can be passed to a thread pool for running 35 | pub struct WasiRuntime { 36 | // name of the process 37 | name: String, 38 | /// Data needed for the runtime 39 | data: Arc, 40 | /// The tempfile that output from the wasmtime process writes to 41 | output: Arc, 42 | /// A channel to send status updates on the runtime 43 | status_sender: Sender<(String, Status)>, 44 | /// The stack size to be used with the wasm3 runtime. 45 | stack_size: u32, 46 | } 47 | 48 | struct Data { 49 | /// binary module data to be run as a wasm module 50 | module_data: Vec, 51 | /// key/value environment variables made available to the wasm process 52 | env: HashMap, 53 | /// the arguments passed as the command-line arguments list 54 | args: Vec, 55 | /// a hash map of local file system paths to optional path names in the runtime 56 | /// (e.g. /tmp/foo/myfile -> /app/config). If the optional value is not given, 57 | /// the same path will be allowed in the runtime 58 | dirs: HashMap>, 59 | } 60 | 61 | /// Holds our tempfile handle. 62 | pub struct HandleFactory { 63 | temp: Arc, 64 | } 65 | 66 | impl kubelet::log::HandleFactory for HandleFactory { 67 | /// Creates `tokio::fs::File` on demand for log reading. 68 | fn new_handle(&self) -> tokio::fs::File { 69 | tokio::fs::File::from_std(self.temp.reopen().unwrap()) 70 | } 71 | } 72 | 73 | impl WasiRuntime { 74 | /// Creates a new WasiRuntime 75 | /// 76 | /// # Arguments 77 | /// 78 | /// * `module_path` - the path to the WebAssembly binary 79 | /// * `env` - a collection of key/value pairs containing the environment variables 80 | /// * `args` - the arguments passed as the command-line arguments list 81 | /// * `dirs` - a map of local file system paths to optional path names in the runtime 82 | /// (e.g. /tmp/foo/myfile -> /app/config). If the optional value is not given, 83 | /// the same path will be allowed in the runtime 84 | /// * `log_dir` - location for storing logs 85 | pub async fn new + Send + Sync + 'static>( 86 | name: String, 87 | module_data: Vec, 88 | env: HashMap, 89 | args: Vec, 90 | dirs: HashMap>, 91 | log_dir: L, 92 | status_sender: Sender<(String, Status)>, 93 | ) -> anyhow::Result { 94 | let temp = tokio::task::spawn_blocking(move || -> anyhow::Result { 95 | Ok(NamedTempFile::new_in(log_dir)?) 96 | }) 97 | .await??; 98 | 99 | // We need to use named temp file because we need multiple file handles 100 | // and if we are running in the temp dir, we run the possibility of the 101 | // temp file getting cleaned out from underneath us while running. If we 102 | // think it necessary, we can make these permanent files with a cleanup 103 | // loop that runs elsewhere. These will get deleted when the reference 104 | // is dropped 105 | Ok(WasiRuntime { 106 | name, 107 | data: Arc::new(Data { 108 | module_data, 109 | env, 110 | args, 111 | dirs, 112 | }), 113 | output: Arc::new(temp), 114 | status_sender, 115 | stack_size: 1, 116 | }) 117 | } 118 | 119 | pub async fn start(&self) -> anyhow::Result> { 120 | let temp = self.output.clone(); 121 | // Because a reopen is blocking, run in a blocking task to get new 122 | // handles to the tempfile 123 | let output_write = tokio::task::spawn_blocking(move || -> anyhow::Result { 124 | Ok(temp.reopen()?) 125 | }) 126 | .await??; 127 | 128 | let handle = self.spawn_wasm3(output_write).await?; 129 | 130 | let log_handle_factory = HandleFactory { 131 | temp: self.output.clone(), 132 | }; 133 | 134 | Ok(ContainerHandle::new( 135 | Runtime { 136 | handle, 137 | }, 138 | log_handle_factory, 139 | )) 140 | } 141 | 142 | // Spawns a running wasmtime instance with the given context and status 143 | // channel. Due to the Instance type not being Send safe, all of the logic 144 | // needs to be done within the spawned task 145 | async fn spawn_wasm3( 146 | &self, 147 | _output_write: std::fs::File, 148 | ) -> anyhow::Result>> { 149 | // Clone the module data Arc so it can be moved 150 | let data = self.data.clone(); 151 | let name = self.name.clone(); 152 | let stack_size = self.stack_size.clone(); 153 | let status_sender = self.status_sender.clone(); 154 | 155 | let handle = tokio::task::spawn_blocking(move || -> anyhow::Result<_> { 156 | let waker = task::noop_waker(); 157 | let mut cx = Context::from_waker(&waker); 158 | 159 | let env = match Environment::new() { 160 | // We can't map errors here or it moves the send channel, so we 161 | // do it in a match 162 | Ok(e) => e, 163 | Err(e) => { 164 | let message = "cannot create environment"; 165 | error!("{}: {:?}", message, e); 166 | send( 167 | status_sender.clone(), 168 | name, 169 | Status::Terminated { 170 | failed: true, 171 | message: message.into(), 172 | timestamp: chrono::Utc::now(), 173 | }, 174 | &mut cx, 175 | ); 176 | return Err(anyhow::anyhow!("{}: {}", message, e)); 177 | } 178 | }; 179 | 180 | let rt = match env.create_runtime(stack_size) { 181 | // We can't map errors here or it moves the send channel, so we 182 | // do it in a match 183 | Ok(rt) => rt, 184 | Err(e) => { 185 | let message = "cannot create runtime"; 186 | error!("{}: {:?}", message, e); 187 | send( 188 | status_sender.clone(), 189 | name.clone(), 190 | Status::Terminated { 191 | failed: true, 192 | message: message.into(), 193 | timestamp: chrono::Utc::now(), 194 | }, 195 | &mut cx, 196 | ); 197 | return Err(anyhow::anyhow!("{}: {}", message, e)); 198 | } 199 | }; 200 | 201 | let module = match Module::parse(&env, &data.module_data) { 202 | // We can't map errors here or it moves the send channel, so we 203 | // do it in a match 204 | Ok(m) => m, 205 | Err(e) => { 206 | let message = "cannot parse module"; 207 | error!("{}: {:?}", message, e); 208 | send( 209 | status_sender.clone(), 210 | name.clone(), 211 | Status::Terminated { 212 | failed: true, 213 | message: message.into(), 214 | timestamp: chrono::Utc::now(), 215 | }, 216 | &mut cx, 217 | ); 218 | return Err(anyhow::anyhow!("{}: {}", message, e)); 219 | } 220 | }; 221 | 222 | let mut module = match rt.load_module(module) { 223 | // We can't map errors here or it moves the send channel, so we 224 | // do it in a match 225 | Ok(m) => m, 226 | Err(e) => { 227 | let message = "cannot load module"; 228 | error!("{}: {:?}", message, e); 229 | send( 230 | status_sender.clone(), 231 | name.clone(), 232 | Status::Terminated { 233 | failed: true, 234 | message: message.into(), 235 | timestamp: chrono::Utc::now(), 236 | }, 237 | &mut cx, 238 | ); 239 | return Err(anyhow::anyhow!("{}: {}", message, e)); 240 | } 241 | }; 242 | 243 | match module.link_wasi() { 244 | // We can't map errors here or it moves the send channel, so we 245 | // do it in a match 246 | Ok(_) => {} 247 | Err(e) => { 248 | let message = "cannot link WASI"; 249 | error!("{}: {:?}", message, e); 250 | send( 251 | status_sender.clone(), 252 | name.clone(), 253 | Status::Terminated { 254 | failed: true, 255 | message: message.into(), 256 | timestamp: chrono::Utc::now(), 257 | }, 258 | &mut cx, 259 | ); 260 | return Err(anyhow::anyhow!("{}: {}", message, e)); 261 | } 262 | }; 263 | 264 | let func = match module.find_function::<(), ()>("_start") { 265 | // We can't map errors here or it moves the send channel, so we 266 | // do it in a match 267 | Ok(f) => f, 268 | Err(e) => { 269 | let message = "cannot find function '_start' in module"; 270 | error!("{}: {:?}", message, e); 271 | send( 272 | status_sender.clone(), 273 | name.clone(), 274 | Status::Terminated { 275 | failed: true, 276 | message: message.into(), 277 | timestamp: chrono::Utc::now(), 278 | }, 279 | &mut cx, 280 | ); 281 | return Err(anyhow::anyhow!("{}: {}", message, e)); 282 | } 283 | }; 284 | 285 | match func.call() { 286 | // We can't map errors here or it moves the send channel, so we 287 | // do it in a match 288 | Ok(_) => {} 289 | Err(e) => { 290 | let message = "unable to run module"; 291 | error!("{}: {:?}", message, e); 292 | send( 293 | status_sender.clone(), 294 | name.clone(), 295 | Status::Terminated { 296 | failed: true, 297 | message: message.into(), 298 | timestamp: chrono::Utc::now(), 299 | }, 300 | &mut cx, 301 | ); 302 | return Err(anyhow::anyhow!("{}: {}", message, e)); 303 | } 304 | }; 305 | 306 | info!("module run complete"); 307 | send( 308 | status_sender.clone(), 309 | name, 310 | Status::Terminated { 311 | failed: false, 312 | message: "Module run complete".into(), 313 | timestamp: chrono::Utc::now(), 314 | }, 315 | &mut cx, 316 | ); 317 | 318 | Ok(()) 319 | }); 320 | 321 | Ok(handle) 322 | } 323 | } 324 | 325 | fn send(mut sender: Sender<(String, Status)>, name: String, status: Status, cx: &mut Context<'_>) { 326 | loop { 327 | if let Poll::Ready(r) = sender.poll_ready(cx) { 328 | if r.is_ok() { 329 | sender 330 | .try_send((name, status)) 331 | .expect("Possible deadlock, exiting"); 332 | return; 333 | } 334 | trace!("Receiver for status showing as closed: {:?}", r); 335 | } 336 | trace!( 337 | "Channel for container {} not ready for send. Attempting again", 338 | name 339 | ); 340 | } 341 | } 342 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "Inflector" 5 | version = "0.11.4" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 8 | dependencies = [ 9 | "lazy_static", 10 | "regex", 11 | ] 12 | 13 | [[package]] 14 | name = "adler32" 15 | version = "1.0.4" 16 | source = "registry+https://github.com/rust-lang/crates.io-index" 17 | checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" 18 | 19 | [[package]] 20 | name = "aho-corasick" 21 | version = "0.7.10" 22 | source = "registry+https://github.com/rust-lang/crates.io-index" 23 | checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" 24 | dependencies = [ 25 | "memchr", 26 | ] 27 | 28 | [[package]] 29 | name = "anyhow" 30 | version = "1.0.31" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "85bb70cc08ec97ca5450e6eba421deeea5f172c0fc61f78b5357b2a8e8be195f" 33 | 34 | [[package]] 35 | name = "arc-swap" 36 | version = "0.4.6" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62" 39 | 40 | [[package]] 41 | name = "arrayref" 42 | version = "0.3.6" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 45 | 46 | [[package]] 47 | name = "arrayvec" 48 | version = "0.5.1" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" 51 | 52 | [[package]] 53 | name = "async-compression" 54 | version = "0.3.4" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "ae84766bab9f774e32979583ba56d6af8c701288c6dc99144819d5d2ee0b170f" 57 | dependencies = [ 58 | "bytes 0.5.6", 59 | "flate2", 60 | "futures-core", 61 | "memchr", 62 | "pin-project-lite", 63 | ] 64 | 65 | [[package]] 66 | name = "async-trait" 67 | version = "0.1.31" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "26c4f3195085c36ea8d24d32b2f828d23296a9370a28aa39d111f6f16bef9f3b" 70 | dependencies = [ 71 | "proc-macro2", 72 | "quote", 73 | "syn", 74 | ] 75 | 76 | [[package]] 77 | name = "atty" 78 | version = "0.2.14" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 81 | dependencies = [ 82 | "hermit-abi", 83 | "libc", 84 | "winapi 0.3.8", 85 | ] 86 | 87 | [[package]] 88 | name = "autocfg" 89 | version = "0.1.7" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 92 | 93 | [[package]] 94 | name = "autocfg" 95 | version = "1.0.0" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" 98 | 99 | [[package]] 100 | name = "base-x" 101 | version = "0.2.6" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "1b20b618342cf9891c292c4f5ac2cde7287cc5c87e87e9c769d617793607dec1" 104 | 105 | [[package]] 106 | name = "base64" 107 | version = "0.10.1" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 110 | dependencies = [ 111 | "byteorder", 112 | ] 113 | 114 | [[package]] 115 | name = "base64" 116 | version = "0.11.0" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" 119 | 120 | [[package]] 121 | name = "base64" 122 | version = "0.12.1" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" 125 | 126 | [[package]] 127 | name = "bitflags" 128 | version = "1.2.1" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 131 | 132 | [[package]] 133 | name = "blake2b_simd" 134 | version = "0.5.10" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" 137 | dependencies = [ 138 | "arrayref", 139 | "arrayvec", 140 | "constant_time_eq", 141 | ] 142 | 143 | [[package]] 144 | name = "block-buffer" 145 | version = "0.7.3" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 148 | dependencies = [ 149 | "block-padding", 150 | "byte-tools", 151 | "byteorder", 152 | "generic-array", 153 | ] 154 | 155 | [[package]] 156 | name = "block-padding" 157 | version = "0.1.5" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 160 | dependencies = [ 161 | "byte-tools", 162 | ] 163 | 164 | [[package]] 165 | name = "buf_redux" 166 | version = "0.8.4" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" 169 | dependencies = [ 170 | "memchr", 171 | "safemem", 172 | ] 173 | 174 | [[package]] 175 | name = "bumpalo" 176 | version = "3.3.0" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" 179 | 180 | [[package]] 181 | name = "byte-tools" 182 | version = "0.3.1" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 185 | 186 | [[package]] 187 | name = "byteorder" 188 | version = "1.3.4" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" 191 | 192 | [[package]] 193 | name = "bytes" 194 | version = "0.4.12" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" 197 | dependencies = [ 198 | "byteorder", 199 | "iovec", 200 | ] 201 | 202 | [[package]] 203 | name = "bytes" 204 | version = "0.5.6" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" 207 | 208 | [[package]] 209 | name = "cc" 210 | version = "1.0.53" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "404b1fe4f65288577753b17e3b36a04596ee784493ec249bf81c7f2d2acd751c" 213 | 214 | [[package]] 215 | name = "cfg-if" 216 | version = "0.1.10" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 219 | 220 | [[package]] 221 | name = "chrono" 222 | version = "0.4.19" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 225 | dependencies = [ 226 | "libc", 227 | "num-integer", 228 | "num-traits", 229 | "serde", 230 | "time 0.1.43", 231 | "winapi 0.3.8", 232 | ] 233 | 234 | [[package]] 235 | name = "cloudabi" 236 | version = "0.0.3" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 239 | dependencies = [ 240 | "bitflags", 241 | ] 242 | 243 | [[package]] 244 | name = "constant_time_eq" 245 | version = "0.1.5" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 248 | 249 | [[package]] 250 | name = "core-foundation" 251 | version = "0.7.0" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" 254 | dependencies = [ 255 | "core-foundation-sys", 256 | "libc", 257 | ] 258 | 259 | [[package]] 260 | name = "core-foundation-sys" 261 | version = "0.7.0" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" 264 | 265 | [[package]] 266 | name = "crc32fast" 267 | version = "1.2.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" 270 | dependencies = [ 271 | "cfg-if", 272 | ] 273 | 274 | [[package]] 275 | name = "crossbeam-utils" 276 | version = "0.7.2" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" 279 | dependencies = [ 280 | "autocfg 1.0.0", 281 | "cfg-if", 282 | "lazy_static", 283 | ] 284 | 285 | [[package]] 286 | name = "cty" 287 | version = "0.2.1" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "7313c0d620d0cb4dbd9d019e461a4beb501071ff46ec0ab933efb4daa76d73e3" 290 | 291 | [[package]] 292 | name = "digest" 293 | version = "0.8.1" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 296 | dependencies = [ 297 | "generic-array", 298 | ] 299 | 300 | [[package]] 301 | name = "dirs" 302 | version = "3.0.1" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff" 305 | dependencies = [ 306 | "dirs-sys", 307 | ] 308 | 309 | [[package]] 310 | name = "dirs-sys" 311 | version = "0.3.5" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" 314 | dependencies = [ 315 | "libc", 316 | "redox_users", 317 | "winapi 0.3.8", 318 | ] 319 | 320 | [[package]] 321 | name = "discard" 322 | version = "1.0.4" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" 325 | 326 | [[package]] 327 | name = "dtoa" 328 | version = "0.4.5" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" 331 | 332 | [[package]] 333 | name = "either" 334 | version = "1.6.1" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 337 | 338 | [[package]] 339 | name = "encoding_rs" 340 | version = "0.8.23" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "e8ac63f94732332f44fe654443c46f6375d1939684c17b0afb6cb56b0456e171" 343 | dependencies = [ 344 | "cfg-if", 345 | ] 346 | 347 | [[package]] 348 | name = "env_logger" 349 | version = "0.7.1" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" 352 | dependencies = [ 353 | "atty", 354 | "humantime", 355 | "log 0.4.11", 356 | "regex", 357 | "termcolor", 358 | ] 359 | 360 | [[package]] 361 | name = "fake-simd" 362 | version = "0.1.2" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 365 | 366 | [[package]] 367 | name = "flate2" 368 | version = "1.0.14" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" 371 | dependencies = [ 372 | "cfg-if", 373 | "crc32fast", 374 | "libc", 375 | "miniz_oxide", 376 | ] 377 | 378 | [[package]] 379 | name = "fnv" 380 | version = "1.0.7" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 383 | 384 | [[package]] 385 | name = "foreign-types" 386 | version = "0.3.2" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 389 | dependencies = [ 390 | "foreign-types-shared", 391 | ] 392 | 393 | [[package]] 394 | name = "foreign-types-shared" 395 | version = "0.1.1" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 398 | 399 | [[package]] 400 | name = "fuchsia-cprng" 401 | version = "0.1.1" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 404 | 405 | [[package]] 406 | name = "fuchsia-zircon" 407 | version = "0.3.3" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 410 | dependencies = [ 411 | "bitflags", 412 | "fuchsia-zircon-sys", 413 | ] 414 | 415 | [[package]] 416 | name = "fuchsia-zircon-sys" 417 | version = "0.3.3" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 420 | 421 | [[package]] 422 | name = "futures" 423 | version = "0.3.5" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" 426 | dependencies = [ 427 | "futures-channel", 428 | "futures-core", 429 | "futures-executor", 430 | "futures-io", 431 | "futures-sink", 432 | "futures-task", 433 | "futures-util", 434 | ] 435 | 436 | [[package]] 437 | name = "futures-channel" 438 | version = "0.3.5" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" 441 | dependencies = [ 442 | "futures-core", 443 | "futures-sink", 444 | ] 445 | 446 | [[package]] 447 | name = "futures-core" 448 | version = "0.3.5" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" 451 | 452 | [[package]] 453 | name = "futures-executor" 454 | version = "0.3.5" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" 457 | dependencies = [ 458 | "futures-core", 459 | "futures-task", 460 | "futures-util", 461 | ] 462 | 463 | [[package]] 464 | name = "futures-io" 465 | version = "0.3.5" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" 468 | 469 | [[package]] 470 | name = "futures-macro" 471 | version = "0.3.5" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" 474 | dependencies = [ 475 | "proc-macro-hack", 476 | "proc-macro2", 477 | "quote", 478 | "syn", 479 | ] 480 | 481 | [[package]] 482 | name = "futures-sink" 483 | version = "0.3.5" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" 486 | 487 | [[package]] 488 | name = "futures-task" 489 | version = "0.3.5" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" 492 | dependencies = [ 493 | "once_cell", 494 | ] 495 | 496 | [[package]] 497 | name = "futures-util" 498 | version = "0.3.5" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" 501 | dependencies = [ 502 | "futures-channel", 503 | "futures-core", 504 | "futures-io", 505 | "futures-macro", 506 | "futures-sink", 507 | "futures-task", 508 | "memchr", 509 | "pin-project", 510 | "pin-utils", 511 | "proc-macro-hack", 512 | "proc-macro-nested", 513 | "slab", 514 | ] 515 | 516 | [[package]] 517 | name = "generic-array" 518 | version = "0.12.3" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" 521 | dependencies = [ 522 | "typenum", 523 | ] 524 | 525 | [[package]] 526 | name = "getrandom" 527 | version = "0.1.14" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" 530 | dependencies = [ 531 | "cfg-if", 532 | "libc", 533 | "wasi", 534 | ] 535 | 536 | [[package]] 537 | name = "h2" 538 | version = "0.2.5" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" 541 | dependencies = [ 542 | "bytes 0.5.6", 543 | "fnv", 544 | "futures-core", 545 | "futures-sink", 546 | "futures-util", 547 | "http 0.2.1", 548 | "indexmap", 549 | "log 0.4.11", 550 | "slab", 551 | "tokio", 552 | "tokio-util", 553 | ] 554 | 555 | [[package]] 556 | name = "headers" 557 | version = "0.3.2" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "ed18eb2459bf1a09ad2d6b1547840c3e5e62882fa09b9a6a20b1de8e3228848f" 560 | dependencies = [ 561 | "base64 0.12.1", 562 | "bitflags", 563 | "bytes 0.5.6", 564 | "headers-core", 565 | "http 0.2.1", 566 | "mime 0.3.16", 567 | "sha-1", 568 | "time 0.1.43", 569 | ] 570 | 571 | [[package]] 572 | name = "headers-core" 573 | version = "0.2.0" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 576 | dependencies = [ 577 | "http 0.2.1", 578 | ] 579 | 580 | [[package]] 581 | name = "hermit-abi" 582 | version = "0.1.13" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" 585 | dependencies = [ 586 | "libc", 587 | ] 588 | 589 | [[package]] 590 | name = "hostname" 591 | version = "0.3.1" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" 594 | dependencies = [ 595 | "libc", 596 | "match_cfg", 597 | "winapi 0.3.8", 598 | ] 599 | 600 | [[package]] 601 | name = "http" 602 | version = "0.1.21" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" 605 | dependencies = [ 606 | "bytes 0.4.12", 607 | "fnv", 608 | "itoa", 609 | ] 610 | 611 | [[package]] 612 | name = "http" 613 | version = "0.2.1" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" 616 | dependencies = [ 617 | "bytes 0.5.6", 618 | "fnv", 619 | "itoa", 620 | ] 621 | 622 | [[package]] 623 | name = "http-body" 624 | version = "0.3.1" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" 627 | dependencies = [ 628 | "bytes 0.5.6", 629 | "http 0.2.1", 630 | ] 631 | 632 | [[package]] 633 | name = "httparse" 634 | version = "1.3.4" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" 637 | 638 | [[package]] 639 | name = "humantime" 640 | version = "1.3.0" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 643 | dependencies = [ 644 | "quick-error", 645 | ] 646 | 647 | [[package]] 648 | name = "hyper" 649 | version = "0.13.5" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14" 652 | dependencies = [ 653 | "bytes 0.5.6", 654 | "futures-channel", 655 | "futures-core", 656 | "futures-util", 657 | "h2", 658 | "http 0.2.1", 659 | "http-body", 660 | "httparse", 661 | "itoa", 662 | "log 0.4.11", 663 | "net2", 664 | "pin-project", 665 | "time 0.1.43", 666 | "tokio", 667 | "tower-service", 668 | "want", 669 | ] 670 | 671 | [[package]] 672 | name = "hyper-tls" 673 | version = "0.4.1" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "3adcd308402b9553630734e9c36b77a7e48b3821251ca2493e8cd596763aafaa" 676 | dependencies = [ 677 | "bytes 0.5.6", 678 | "hyper", 679 | "native-tls", 680 | "tokio", 681 | "tokio-tls", 682 | ] 683 | 684 | [[package]] 685 | name = "hyperx" 686 | version = "0.13.2" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "e4a94cbc2c6f63028e5736ca4e811ae36d3990059c384cbe68298c66728a9776" 689 | dependencies = [ 690 | "base64 0.10.1", 691 | "bytes 0.4.12", 692 | "http 0.1.21", 693 | "httparse", 694 | "language-tags", 695 | "log 0.4.11", 696 | "mime 0.3.16", 697 | "percent-encoding 1.0.1", 698 | "time 0.1.43", 699 | "unicase 2.6.0", 700 | ] 701 | 702 | [[package]] 703 | name = "idna" 704 | version = "0.1.5" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 707 | dependencies = [ 708 | "matches", 709 | "unicode-bidi", 710 | "unicode-normalization", 711 | ] 712 | 713 | [[package]] 714 | name = "idna" 715 | version = "0.2.0" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" 718 | dependencies = [ 719 | "matches", 720 | "unicode-bidi", 721 | "unicode-normalization", 722 | ] 723 | 724 | [[package]] 725 | name = "indexmap" 726 | version = "1.3.2" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" 729 | dependencies = [ 730 | "autocfg 1.0.0", 731 | ] 732 | 733 | [[package]] 734 | name = "input_buffer" 735 | version = "0.3.1" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754" 738 | dependencies = [ 739 | "bytes 0.5.6", 740 | ] 741 | 742 | [[package]] 743 | name = "iovec" 744 | version = "0.1.4" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 747 | dependencies = [ 748 | "libc", 749 | ] 750 | 751 | [[package]] 752 | name = "ipnet" 753 | version = "2.3.0" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" 756 | 757 | [[package]] 758 | name = "itoa" 759 | version = "0.4.5" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" 762 | 763 | [[package]] 764 | name = "js-sys" 765 | version = "0.3.39" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "fa5a448de267e7358beaf4a5d849518fe9a0c13fce7afd44b06e68550e5562a7" 768 | dependencies = [ 769 | "wasm-bindgen", 770 | ] 771 | 772 | [[package]] 773 | name = "k8s-openapi" 774 | version = "0.9.0" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "57f95fd36c08ce592e67400a0f1a66f432196997d5a7e9a97e8743c33d8a9312" 777 | dependencies = [ 778 | "base64 0.12.1", 779 | "bytes 0.5.6", 780 | "chrono", 781 | "serde", 782 | "serde-value", 783 | "serde_json", 784 | ] 785 | 786 | [[package]] 787 | name = "kernel32-sys" 788 | version = "0.2.2" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 791 | dependencies = [ 792 | "winapi 0.2.8", 793 | "winapi-build", 794 | ] 795 | 796 | [[package]] 797 | name = "krustlet-wasm3" 798 | version = "0.1.0" 799 | dependencies = [ 800 | "anyhow", 801 | "async-trait", 802 | "chrono", 803 | "env_logger", 804 | "futures", 805 | "k8s-openapi", 806 | "kube", 807 | "kubelet", 808 | "log 0.4.11", 809 | "oci-distribution", 810 | "serde", 811 | "serde_derive", 812 | "serde_json", 813 | "tempfile", 814 | "tokio", 815 | "wasm3", 816 | "wat", 817 | ] 818 | 819 | [[package]] 820 | name = "kube" 821 | version = "0.40.0" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "be34ed86dca3021a649b574a1628917d694bb75650a3b50c492e1786589a5ac6" 824 | dependencies = [ 825 | "Inflector", 826 | "base64 0.12.1", 827 | "bytes 0.5.6", 828 | "chrono", 829 | "dirs", 830 | "either", 831 | "futures", 832 | "futures-util", 833 | "http 0.2.1", 834 | "k8s-openapi", 835 | "log 0.4.11", 836 | "openssl", 837 | "pem", 838 | "reqwest", 839 | "serde", 840 | "serde_json", 841 | "serde_yaml", 842 | "static_assertions", 843 | "thiserror", 844 | "time 0.2.16", 845 | "tokio", 846 | "url 2.1.1", 847 | ] 848 | 849 | [[package]] 850 | name = "kubelet" 851 | version = "0.5.0" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "28b6650bd7fd90c809ddec1f9128445c566bad0a3368461ac483be1aa8c3b718" 854 | dependencies = [ 855 | "anyhow", 856 | "async-trait", 857 | "base64 0.12.1", 858 | "chrono", 859 | "dirs", 860 | "futures", 861 | "hostname", 862 | "http 0.2.1", 863 | "hyper", 864 | "k8s-openapi", 865 | "kube", 866 | "lazy_static", 867 | "log 0.4.11", 868 | "native-tls", 869 | "oci-distribution", 870 | "rcgen", 871 | "reqwest", 872 | "serde", 873 | "serde_json", 874 | "serde_yaml", 875 | "thiserror", 876 | "tokio", 877 | "tokio-tls", 878 | "url 2.1.1", 879 | "uuid", 880 | "warp", 881 | ] 882 | 883 | [[package]] 884 | name = "language-tags" 885 | version = "0.2.2" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 888 | 889 | [[package]] 890 | name = "lazy_static" 891 | version = "1.4.0" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 894 | 895 | [[package]] 896 | name = "leb128" 897 | version = "0.2.4" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" 900 | 901 | [[package]] 902 | name = "libc" 903 | version = "0.2.70" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" 906 | 907 | [[package]] 908 | name = "linked-hash-map" 909 | version = "0.5.3" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" 912 | 913 | [[package]] 914 | name = "log" 915 | version = "0.3.9" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" 918 | dependencies = [ 919 | "log 0.4.11", 920 | ] 921 | 922 | [[package]] 923 | name = "log" 924 | version = "0.4.11" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" 927 | dependencies = [ 928 | "cfg-if", 929 | ] 930 | 931 | [[package]] 932 | name = "match_cfg" 933 | version = "0.1.0" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" 936 | 937 | [[package]] 938 | name = "matches" 939 | version = "0.1.8" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 942 | 943 | [[package]] 944 | name = "memchr" 945 | version = "2.3.3" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" 948 | 949 | [[package]] 950 | name = "mime" 951 | version = "0.2.6" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" 954 | dependencies = [ 955 | "log 0.3.9", 956 | ] 957 | 958 | [[package]] 959 | name = "mime" 960 | version = "0.3.16" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 963 | 964 | [[package]] 965 | name = "mime_guess" 966 | version = "1.8.8" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "216929a5ee4dd316b1702eedf5e74548c123d370f47841ceaac38ca154690ca3" 969 | dependencies = [ 970 | "mime 0.2.6", 971 | "phf", 972 | "phf_codegen", 973 | "unicase 1.4.2", 974 | ] 975 | 976 | [[package]] 977 | name = "mime_guess" 978 | version = "2.0.3" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" 981 | dependencies = [ 982 | "mime 0.3.16", 983 | "unicase 2.6.0", 984 | ] 985 | 986 | [[package]] 987 | name = "miniz_oxide" 988 | version = "0.3.6" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" 991 | dependencies = [ 992 | "adler32", 993 | ] 994 | 995 | [[package]] 996 | name = "mio" 997 | version = "0.6.22" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" 1000 | dependencies = [ 1001 | "cfg-if", 1002 | "fuchsia-zircon", 1003 | "fuchsia-zircon-sys", 1004 | "iovec", 1005 | "kernel32-sys", 1006 | "libc", 1007 | "log 0.4.11", 1008 | "miow", 1009 | "net2", 1010 | "slab", 1011 | "winapi 0.2.8", 1012 | ] 1013 | 1014 | [[package]] 1015 | name = "mio-uds" 1016 | version = "0.6.8" 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" 1018 | checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" 1019 | dependencies = [ 1020 | "iovec", 1021 | "libc", 1022 | "mio", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "miow" 1027 | version = "0.2.1" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1030 | dependencies = [ 1031 | "kernel32-sys", 1032 | "net2", 1033 | "winapi 0.2.8", 1034 | "ws2_32-sys", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "multipart" 1039 | version = "0.16.1" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "136eed74cadb9edd2651ffba732b19a450316b680e4f48d6c79e905799e19d01" 1042 | dependencies = [ 1043 | "buf_redux", 1044 | "httparse", 1045 | "log 0.4.11", 1046 | "mime 0.2.6", 1047 | "mime_guess 1.8.8", 1048 | "quick-error", 1049 | "rand 0.6.5", 1050 | "safemem", 1051 | "tempfile", 1052 | "twoway", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "native-tls" 1057 | version = "0.2.4" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" 1060 | dependencies = [ 1061 | "lazy_static", 1062 | "libc", 1063 | "log 0.4.11", 1064 | "openssl", 1065 | "openssl-probe", 1066 | "openssl-sys", 1067 | "schannel", 1068 | "security-framework", 1069 | "security-framework-sys", 1070 | "tempfile", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "net2" 1075 | version = "0.2.34" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" 1078 | dependencies = [ 1079 | "cfg-if", 1080 | "libc", 1081 | "winapi 0.3.8", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "num-integer" 1086 | version = "0.1.42" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" 1089 | dependencies = [ 1090 | "autocfg 1.0.0", 1091 | "num-traits", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "num-traits" 1096 | version = "0.2.11" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" 1099 | dependencies = [ 1100 | "autocfg 1.0.0", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "oci-distribution" 1105 | version = "0.4.0" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "93339a7d7ca64c348bd8bca841dfcfcdb6f2b3f5a1cc77518b75b9ad6884d96d" 1108 | dependencies = [ 1109 | "anyhow", 1110 | "futures-util", 1111 | "hyperx", 1112 | "log 0.4.11", 1113 | "reqwest", 1114 | "serde", 1115 | "serde_json", 1116 | "tokio", 1117 | "www-authenticate", 1118 | ] 1119 | 1120 | [[package]] 1121 | name = "once_cell" 1122 | version = "1.4.0" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" 1125 | 1126 | [[package]] 1127 | name = "opaque-debug" 1128 | version = "0.2.3" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 1131 | 1132 | [[package]] 1133 | name = "openssl" 1134 | version = "0.10.30" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "8d575eff3665419f9b83678ff2815858ad9d11567e082f5ac1814baba4e2bcb4" 1137 | dependencies = [ 1138 | "bitflags", 1139 | "cfg-if", 1140 | "foreign-types", 1141 | "lazy_static", 1142 | "libc", 1143 | "openssl-sys", 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "openssl-probe" 1148 | version = "0.1.2" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" 1151 | 1152 | [[package]] 1153 | name = "openssl-sys" 1154 | version = "0.9.58" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de" 1157 | dependencies = [ 1158 | "autocfg 1.0.0", 1159 | "cc", 1160 | "libc", 1161 | "pkg-config", 1162 | "vcpkg", 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "ordered-float" 1167 | version = "2.0.0" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "9fe9037165d7023b1228bc4ae9a2fa1a2b0095eca6c2998c624723dfd01314a5" 1170 | dependencies = [ 1171 | "num-traits", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "pem" 1176 | version = "0.8.1" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "59698ea79df9bf77104aefd39cc3ec990cb9693fb59c3b0a70ddf2646fdffb4b" 1179 | dependencies = [ 1180 | "base64 0.12.1", 1181 | "once_cell", 1182 | "regex", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "percent-encoding" 1187 | version = "1.0.1" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 1190 | 1191 | [[package]] 1192 | name = "percent-encoding" 1193 | version = "2.1.0" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1196 | 1197 | [[package]] 1198 | name = "phf" 1199 | version = "0.7.24" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" 1202 | dependencies = [ 1203 | "phf_shared", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "phf_codegen" 1208 | version = "0.7.24" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" 1211 | dependencies = [ 1212 | "phf_generator", 1213 | "phf_shared", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "phf_generator" 1218 | version = "0.7.24" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" 1221 | dependencies = [ 1222 | "phf_shared", 1223 | "rand 0.6.5", 1224 | ] 1225 | 1226 | [[package]] 1227 | name = "phf_shared" 1228 | version = "0.7.24" 1229 | source = "registry+https://github.com/rust-lang/crates.io-index" 1230 | checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" 1231 | dependencies = [ 1232 | "siphasher", 1233 | "unicase 1.4.2", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "pin-project" 1238 | version = "0.4.17" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" 1241 | dependencies = [ 1242 | "pin-project-internal", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "pin-project-internal" 1247 | version = "0.4.17" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" 1250 | dependencies = [ 1251 | "proc-macro2", 1252 | "quote", 1253 | "syn", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "pin-project-lite" 1258 | version = "0.1.5" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f" 1261 | 1262 | [[package]] 1263 | name = "pin-utils" 1264 | version = "0.1.0" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1267 | 1268 | [[package]] 1269 | name = "pkg-config" 1270 | version = "0.3.17" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" 1273 | 1274 | [[package]] 1275 | name = "ppv-lite86" 1276 | version = "0.2.8" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" 1279 | 1280 | [[package]] 1281 | name = "proc-macro-hack" 1282 | version = "0.5.15" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" 1285 | 1286 | [[package]] 1287 | name = "proc-macro-nested" 1288 | version = "0.1.4" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" 1291 | 1292 | [[package]] 1293 | name = "proc-macro2" 1294 | version = "1.0.24" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" 1297 | dependencies = [ 1298 | "unicode-xid", 1299 | ] 1300 | 1301 | [[package]] 1302 | name = "quick-error" 1303 | version = "1.2.3" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1306 | 1307 | [[package]] 1308 | name = "quote" 1309 | version = "1.0.6" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" 1312 | dependencies = [ 1313 | "proc-macro2", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "rand" 1318 | version = "0.6.5" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1321 | dependencies = [ 1322 | "autocfg 0.1.7", 1323 | "libc", 1324 | "rand_chacha 0.1.1", 1325 | "rand_core 0.4.2", 1326 | "rand_hc 0.1.0", 1327 | "rand_isaac", 1328 | "rand_jitter", 1329 | "rand_os", 1330 | "rand_pcg", 1331 | "rand_xorshift", 1332 | "winapi 0.3.8", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "rand" 1337 | version = "0.7.3" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1340 | dependencies = [ 1341 | "getrandom", 1342 | "libc", 1343 | "rand_chacha 0.2.2", 1344 | "rand_core 0.5.1", 1345 | "rand_hc 0.2.0", 1346 | ] 1347 | 1348 | [[package]] 1349 | name = "rand_chacha" 1350 | version = "0.1.1" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1353 | dependencies = [ 1354 | "autocfg 0.1.7", 1355 | "rand_core 0.3.1", 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "rand_chacha" 1360 | version = "0.2.2" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1363 | dependencies = [ 1364 | "ppv-lite86", 1365 | "rand_core 0.5.1", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "rand_core" 1370 | version = "0.3.1" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1373 | dependencies = [ 1374 | "rand_core 0.4.2", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "rand_core" 1379 | version = "0.4.2" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" 1382 | 1383 | [[package]] 1384 | name = "rand_core" 1385 | version = "0.5.1" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1388 | dependencies = [ 1389 | "getrandom", 1390 | ] 1391 | 1392 | [[package]] 1393 | name = "rand_hc" 1394 | version = "0.1.0" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1397 | dependencies = [ 1398 | "rand_core 0.3.1", 1399 | ] 1400 | 1401 | [[package]] 1402 | name = "rand_hc" 1403 | version = "0.2.0" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1406 | dependencies = [ 1407 | "rand_core 0.5.1", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "rand_isaac" 1412 | version = "0.1.1" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1415 | dependencies = [ 1416 | "rand_core 0.3.1", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "rand_jitter" 1421 | version = "0.1.4" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" 1424 | dependencies = [ 1425 | "libc", 1426 | "rand_core 0.4.2", 1427 | "winapi 0.3.8", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "rand_os" 1432 | version = "0.1.3" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 1435 | dependencies = [ 1436 | "cloudabi", 1437 | "fuchsia-cprng", 1438 | "libc", 1439 | "rand_core 0.4.2", 1440 | "rdrand", 1441 | "winapi 0.3.8", 1442 | ] 1443 | 1444 | [[package]] 1445 | name = "rand_pcg" 1446 | version = "0.1.2" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 1449 | dependencies = [ 1450 | "autocfg 0.1.7", 1451 | "rand_core 0.4.2", 1452 | ] 1453 | 1454 | [[package]] 1455 | name = "rand_xorshift" 1456 | version = "0.1.1" 1457 | source = "registry+https://github.com/rust-lang/crates.io-index" 1458 | checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 1459 | dependencies = [ 1460 | "rand_core 0.3.1", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "rcgen" 1465 | version = "0.8.5" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "4974f7e96ee51fa3c90c3022e02c3a7117e71cb2a84518a55e44360135200c25" 1468 | dependencies = [ 1469 | "chrono", 1470 | "pem", 1471 | "ring", 1472 | "yasna", 1473 | ] 1474 | 1475 | [[package]] 1476 | name = "rdrand" 1477 | version = "0.4.0" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 1480 | dependencies = [ 1481 | "rand_core 0.3.1", 1482 | ] 1483 | 1484 | [[package]] 1485 | name = "redox_syscall" 1486 | version = "0.1.56" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 1489 | 1490 | [[package]] 1491 | name = "redox_users" 1492 | version = "0.3.4" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" 1495 | dependencies = [ 1496 | "getrandom", 1497 | "redox_syscall", 1498 | "rust-argon2", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "regex" 1503 | version = "1.3.7" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" 1506 | dependencies = [ 1507 | "aho-corasick", 1508 | "memchr", 1509 | "regex-syntax", 1510 | "thread_local", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "regex-syntax" 1515 | version = "0.6.17" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" 1518 | 1519 | [[package]] 1520 | name = "remove_dir_all" 1521 | version = "0.5.2" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" 1524 | dependencies = [ 1525 | "winapi 0.3.8", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "reqwest" 1530 | version = "0.10.8" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "e9eaa17ac5d7b838b7503d118fa16ad88f440498bf9ffe5424e621f93190d61e" 1533 | dependencies = [ 1534 | "async-compression", 1535 | "base64 0.12.1", 1536 | "bytes 0.5.6", 1537 | "encoding_rs", 1538 | "futures-core", 1539 | "futures-util", 1540 | "http 0.2.1", 1541 | "http-body", 1542 | "hyper", 1543 | "hyper-tls", 1544 | "ipnet", 1545 | "js-sys", 1546 | "lazy_static", 1547 | "log 0.4.11", 1548 | "mime 0.3.16", 1549 | "mime_guess 2.0.3", 1550 | "native-tls", 1551 | "percent-encoding 2.1.0", 1552 | "pin-project-lite", 1553 | "serde", 1554 | "serde_json", 1555 | "serde_urlencoded", 1556 | "tokio", 1557 | "tokio-tls", 1558 | "url 2.1.1", 1559 | "wasm-bindgen", 1560 | "wasm-bindgen-futures", 1561 | "web-sys", 1562 | "winreg", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "ring" 1567 | version = "0.16.15" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "952cd6b98c85bbc30efa1ba5783b8abf12fec8b3287ffa52605b9432313e34e4" 1570 | dependencies = [ 1571 | "cc", 1572 | "libc", 1573 | "once_cell", 1574 | "spin", 1575 | "untrusted", 1576 | "web-sys", 1577 | "winapi 0.3.8", 1578 | ] 1579 | 1580 | [[package]] 1581 | name = "rust-argon2" 1582 | version = "0.7.0" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" 1585 | dependencies = [ 1586 | "base64 0.11.0", 1587 | "blake2b_simd", 1588 | "constant_time_eq", 1589 | "crossbeam-utils", 1590 | ] 1591 | 1592 | [[package]] 1593 | name = "rustc_version" 1594 | version = "0.2.3" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1597 | dependencies = [ 1598 | "semver", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "rustls" 1603 | version = "0.17.0" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "c0d4a31f5d68413404705d6982529b0e11a9aacd4839d1d6222ee3b8cb4015e1" 1606 | dependencies = [ 1607 | "base64 0.11.0", 1608 | "log 0.4.11", 1609 | "ring", 1610 | "sct", 1611 | "webpki", 1612 | ] 1613 | 1614 | [[package]] 1615 | name = "ryu" 1616 | version = "1.0.4" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" 1619 | 1620 | [[package]] 1621 | name = "safemem" 1622 | version = "0.3.3" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 1625 | 1626 | [[package]] 1627 | name = "schannel" 1628 | version = "0.1.19" 1629 | source = "registry+https://github.com/rust-lang/crates.io-index" 1630 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" 1631 | dependencies = [ 1632 | "lazy_static", 1633 | "winapi 0.3.8", 1634 | ] 1635 | 1636 | [[package]] 1637 | name = "scoped-tls" 1638 | version = "1.0.0" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" 1641 | 1642 | [[package]] 1643 | name = "sct" 1644 | version = "0.6.0" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" 1647 | dependencies = [ 1648 | "ring", 1649 | "untrusted", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "security-framework" 1654 | version = "0.4.4" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" 1657 | dependencies = [ 1658 | "bitflags", 1659 | "core-foundation", 1660 | "core-foundation-sys", 1661 | "libc", 1662 | "security-framework-sys", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "security-framework-sys" 1667 | version = "0.4.3" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" 1670 | dependencies = [ 1671 | "core-foundation-sys", 1672 | "libc", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "semver" 1677 | version = "0.9.0" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1680 | dependencies = [ 1681 | "semver-parser", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "semver-parser" 1686 | version = "0.7.0" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1689 | 1690 | [[package]] 1691 | name = "serde" 1692 | version = "1.0.116" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5" 1695 | dependencies = [ 1696 | "serde_derive", 1697 | ] 1698 | 1699 | [[package]] 1700 | name = "serde-value" 1701 | version = "0.7.0" 1702 | source = "registry+https://github.com/rust-lang/crates.io-index" 1703 | checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" 1704 | dependencies = [ 1705 | "ordered-float", 1706 | "serde", 1707 | ] 1708 | 1709 | [[package]] 1710 | name = "serde_derive" 1711 | version = "1.0.116" 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" 1713 | checksum = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8" 1714 | dependencies = [ 1715 | "proc-macro2", 1716 | "quote", 1717 | "syn", 1718 | ] 1719 | 1720 | [[package]] 1721 | name = "serde_json" 1722 | version = "1.0.53" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" 1725 | dependencies = [ 1726 | "itoa", 1727 | "ryu", 1728 | "serde", 1729 | ] 1730 | 1731 | [[package]] 1732 | name = "serde_urlencoded" 1733 | version = "0.6.1" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" 1736 | dependencies = [ 1737 | "dtoa", 1738 | "itoa", 1739 | "serde", 1740 | "url 2.1.1", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "serde_yaml" 1745 | version = "0.8.13" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "ae3e2dd40a7cdc18ca80db804b7f461a39bb721160a85c9a1fa30134bf3c02a5" 1748 | dependencies = [ 1749 | "dtoa", 1750 | "linked-hash-map", 1751 | "serde", 1752 | "yaml-rust", 1753 | ] 1754 | 1755 | [[package]] 1756 | name = "sha-1" 1757 | version = "0.8.2" 1758 | source = "registry+https://github.com/rust-lang/crates.io-index" 1759 | checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" 1760 | dependencies = [ 1761 | "block-buffer", 1762 | "digest", 1763 | "fake-simd", 1764 | "opaque-debug", 1765 | ] 1766 | 1767 | [[package]] 1768 | name = "sha1" 1769 | version = "0.6.0" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 1772 | 1773 | [[package]] 1774 | name = "signal-hook-registry" 1775 | version = "1.2.0" 1776 | source = "registry+https://github.com/rust-lang/crates.io-index" 1777 | checksum = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" 1778 | dependencies = [ 1779 | "arc-swap", 1780 | "libc", 1781 | ] 1782 | 1783 | [[package]] 1784 | name = "siphasher" 1785 | version = "0.2.3" 1786 | source = "registry+https://github.com/rust-lang/crates.io-index" 1787 | checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" 1788 | 1789 | [[package]] 1790 | name = "slab" 1791 | version = "0.4.2" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1794 | 1795 | [[package]] 1796 | name = "smallvec" 1797 | version = "1.4.0" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" 1800 | 1801 | [[package]] 1802 | name = "spin" 1803 | version = "0.5.2" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1806 | 1807 | [[package]] 1808 | name = "standback" 1809 | version = "0.2.8" 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" 1811 | checksum = "47e4b8c631c998468961a9ea159f064c5c8499b95b5e4a34b77849d45949d540" 1812 | 1813 | [[package]] 1814 | name = "static_assertions" 1815 | version = "1.1.0" 1816 | source = "registry+https://github.com/rust-lang/crates.io-index" 1817 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1818 | 1819 | [[package]] 1820 | name = "stdweb" 1821 | version = "0.4.20" 1822 | source = "registry+https://github.com/rust-lang/crates.io-index" 1823 | checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" 1824 | dependencies = [ 1825 | "discard", 1826 | "rustc_version", 1827 | "stdweb-derive", 1828 | "stdweb-internal-macros", 1829 | "stdweb-internal-runtime", 1830 | "wasm-bindgen", 1831 | ] 1832 | 1833 | [[package]] 1834 | name = "stdweb-derive" 1835 | version = "0.5.3" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" 1838 | dependencies = [ 1839 | "proc-macro2", 1840 | "quote", 1841 | "serde", 1842 | "serde_derive", 1843 | "syn", 1844 | ] 1845 | 1846 | [[package]] 1847 | name = "stdweb-internal-macros" 1848 | version = "0.2.9" 1849 | source = "registry+https://github.com/rust-lang/crates.io-index" 1850 | checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" 1851 | dependencies = [ 1852 | "base-x", 1853 | "proc-macro2", 1854 | "quote", 1855 | "serde", 1856 | "serde_derive", 1857 | "serde_json", 1858 | "sha1", 1859 | "syn", 1860 | ] 1861 | 1862 | [[package]] 1863 | name = "stdweb-internal-runtime" 1864 | version = "0.1.5" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" 1867 | 1868 | [[package]] 1869 | name = "syn" 1870 | version = "1.0.42" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "9c51d92969d209b54a98397e1b91c8ae82d8c87a7bb87df0b29aa2ad81454228" 1873 | dependencies = [ 1874 | "proc-macro2", 1875 | "quote", 1876 | "unicode-xid", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "tempfile" 1881 | version = "3.1.0" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" 1884 | dependencies = [ 1885 | "cfg-if", 1886 | "libc", 1887 | "rand 0.7.3", 1888 | "redox_syscall", 1889 | "remove_dir_all", 1890 | "winapi 0.3.8", 1891 | ] 1892 | 1893 | [[package]] 1894 | name = "termcolor" 1895 | version = "1.1.0" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" 1898 | dependencies = [ 1899 | "winapi-util", 1900 | ] 1901 | 1902 | [[package]] 1903 | name = "thiserror" 1904 | version = "1.0.20" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" 1907 | dependencies = [ 1908 | "thiserror-impl", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "thiserror-impl" 1913 | version = "1.0.20" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" 1916 | dependencies = [ 1917 | "proc-macro2", 1918 | "quote", 1919 | "syn", 1920 | ] 1921 | 1922 | [[package]] 1923 | name = "thread_local" 1924 | version = "1.0.1" 1925 | source = "registry+https://github.com/rust-lang/crates.io-index" 1926 | checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" 1927 | dependencies = [ 1928 | "lazy_static", 1929 | ] 1930 | 1931 | [[package]] 1932 | name = "time" 1933 | version = "0.1.43" 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" 1935 | checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" 1936 | dependencies = [ 1937 | "libc", 1938 | "winapi 0.3.8", 1939 | ] 1940 | 1941 | [[package]] 1942 | name = "time" 1943 | version = "0.2.16" 1944 | source = "registry+https://github.com/rust-lang/crates.io-index" 1945 | checksum = "3a51cadc5b1eec673a685ff7c33192ff7b7603d0b75446fb354939ee615acb15" 1946 | dependencies = [ 1947 | "cfg-if", 1948 | "libc", 1949 | "standback", 1950 | "stdweb", 1951 | "time-macros", 1952 | "version_check 0.9.1", 1953 | "winapi 0.3.8", 1954 | ] 1955 | 1956 | [[package]] 1957 | name = "time-macros" 1958 | version = "0.1.0" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "9ae9b6e9f095bc105e183e3cd493d72579be3181ad4004fceb01adbe9eecab2d" 1961 | dependencies = [ 1962 | "proc-macro-hack", 1963 | "time-macros-impl", 1964 | ] 1965 | 1966 | [[package]] 1967 | name = "time-macros-impl" 1968 | version = "0.1.1" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" 1971 | dependencies = [ 1972 | "proc-macro-hack", 1973 | "proc-macro2", 1974 | "quote", 1975 | "standback", 1976 | "syn", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "tokio" 1981 | version = "0.2.22" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "5d34ca54d84bf2b5b4d7d31e901a8464f7b60ac145a284fba25ceb801f2ddccd" 1984 | dependencies = [ 1985 | "bytes 0.5.6", 1986 | "fnv", 1987 | "futures-core", 1988 | "iovec", 1989 | "lazy_static", 1990 | "libc", 1991 | "memchr", 1992 | "mio", 1993 | "mio-uds", 1994 | "pin-project-lite", 1995 | "signal-hook-registry", 1996 | "slab", 1997 | "tokio-macros", 1998 | "winapi 0.3.8", 1999 | ] 2000 | 2001 | [[package]] 2002 | name = "tokio-macros" 2003 | version = "0.2.5" 2004 | source = "registry+https://github.com/rust-lang/crates.io-index" 2005 | checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" 2006 | dependencies = [ 2007 | "proc-macro2", 2008 | "quote", 2009 | "syn", 2010 | ] 2011 | 2012 | [[package]] 2013 | name = "tokio-rustls" 2014 | version = "0.13.1" 2015 | source = "registry+https://github.com/rust-lang/crates.io-index" 2016 | checksum = "15cb62a0d2770787abc96e99c1cd98fcf17f94959f3af63ca85bdfb203f051b4" 2017 | dependencies = [ 2018 | "futures-core", 2019 | "rustls", 2020 | "tokio", 2021 | "webpki", 2022 | ] 2023 | 2024 | [[package]] 2025 | name = "tokio-tls" 2026 | version = "0.3.1" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" 2029 | dependencies = [ 2030 | "native-tls", 2031 | "tokio", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "tokio-tungstenite" 2036 | version = "0.10.1" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "b8b8fe88007ebc363512449868d7da4389c9400072a3f666f212c7280082882a" 2039 | dependencies = [ 2040 | "futures", 2041 | "log 0.4.11", 2042 | "pin-project", 2043 | "tokio", 2044 | "tungstenite", 2045 | ] 2046 | 2047 | [[package]] 2048 | name = "tokio-util" 2049 | version = "0.3.1" 2050 | source = "registry+https://github.com/rust-lang/crates.io-index" 2051 | checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" 2052 | dependencies = [ 2053 | "bytes 0.5.6", 2054 | "futures-core", 2055 | "futures-sink", 2056 | "log 0.4.11", 2057 | "pin-project-lite", 2058 | "tokio", 2059 | ] 2060 | 2061 | [[package]] 2062 | name = "tower-service" 2063 | version = "0.3.0" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" 2066 | 2067 | [[package]] 2068 | name = "tracing" 2069 | version = "0.1.21" 2070 | source = "registry+https://github.com/rust-lang/crates.io-index" 2071 | checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27" 2072 | dependencies = [ 2073 | "cfg-if", 2074 | "log 0.4.11", 2075 | "pin-project-lite", 2076 | "tracing-core", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "tracing-core" 2081 | version = "0.1.17" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" 2084 | dependencies = [ 2085 | "lazy_static", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "tracing-futures" 2090 | version = "0.2.4" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" 2093 | dependencies = [ 2094 | "pin-project", 2095 | "tracing", 2096 | ] 2097 | 2098 | [[package]] 2099 | name = "try-lock" 2100 | version = "0.2.2" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" 2103 | 2104 | [[package]] 2105 | name = "tungstenite" 2106 | version = "0.10.1" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "cfea31758bf674f990918962e8e5f07071a3161bd7c4138ed23e416e1ac4264e" 2109 | dependencies = [ 2110 | "base64 0.11.0", 2111 | "byteorder", 2112 | "bytes 0.5.6", 2113 | "http 0.2.1", 2114 | "httparse", 2115 | "input_buffer", 2116 | "log 0.4.11", 2117 | "rand 0.7.3", 2118 | "sha-1", 2119 | "url 2.1.1", 2120 | "utf-8", 2121 | ] 2122 | 2123 | [[package]] 2124 | name = "twoway" 2125 | version = "0.1.8" 2126 | source = "registry+https://github.com/rust-lang/crates.io-index" 2127 | checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" 2128 | dependencies = [ 2129 | "memchr", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "typenum" 2134 | version = "1.12.0" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" 2137 | 2138 | [[package]] 2139 | name = "unicase" 2140 | version = "1.4.2" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 2143 | dependencies = [ 2144 | "version_check 0.1.5", 2145 | ] 2146 | 2147 | [[package]] 2148 | name = "unicase" 2149 | version = "2.6.0" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 2152 | dependencies = [ 2153 | "version_check 0.9.1", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "unicode-bidi" 2158 | version = "0.3.4" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 2161 | dependencies = [ 2162 | "matches", 2163 | ] 2164 | 2165 | [[package]] 2166 | name = "unicode-normalization" 2167 | version = "0.1.12" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" 2170 | dependencies = [ 2171 | "smallvec", 2172 | ] 2173 | 2174 | [[package]] 2175 | name = "unicode-xid" 2176 | version = "0.2.0" 2177 | source = "registry+https://github.com/rust-lang/crates.io-index" 2178 | checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 2179 | 2180 | [[package]] 2181 | name = "untrusted" 2182 | version = "0.7.1" 2183 | source = "registry+https://github.com/rust-lang/crates.io-index" 2184 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 2185 | 2186 | [[package]] 2187 | name = "url" 2188 | version = "1.7.2" 2189 | source = "registry+https://github.com/rust-lang/crates.io-index" 2190 | checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 2191 | dependencies = [ 2192 | "idna 0.1.5", 2193 | "matches", 2194 | "percent-encoding 1.0.1", 2195 | ] 2196 | 2197 | [[package]] 2198 | name = "url" 2199 | version = "2.1.1" 2200 | source = "registry+https://github.com/rust-lang/crates.io-index" 2201 | checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" 2202 | dependencies = [ 2203 | "idna 0.2.0", 2204 | "matches", 2205 | "percent-encoding 2.1.0", 2206 | ] 2207 | 2208 | [[package]] 2209 | name = "urlencoding" 2210 | version = "1.1.1" 2211 | source = "registry+https://github.com/rust-lang/crates.io-index" 2212 | checksum = "c9232eb53352b4442e40d7900465dfc534e8cb2dc8f18656fcb2ac16112b5593" 2213 | 2214 | [[package]] 2215 | name = "utf-8" 2216 | version = "0.7.5" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" 2219 | 2220 | [[package]] 2221 | name = "uuid" 2222 | version = "0.8.1" 2223 | source = "registry+https://github.com/rust-lang/crates.io-index" 2224 | checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" 2225 | dependencies = [ 2226 | "rand 0.7.3", 2227 | ] 2228 | 2229 | [[package]] 2230 | name = "vcpkg" 2231 | version = "0.2.8" 2232 | source = "registry+https://github.com/rust-lang/crates.io-index" 2233 | checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" 2234 | 2235 | [[package]] 2236 | name = "version_check" 2237 | version = "0.1.5" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 2240 | 2241 | [[package]] 2242 | name = "version_check" 2243 | version = "0.9.1" 2244 | source = "registry+https://github.com/rust-lang/crates.io-index" 2245 | checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" 2246 | 2247 | [[package]] 2248 | name = "want" 2249 | version = "0.3.0" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 2252 | dependencies = [ 2253 | "log 0.4.11", 2254 | "try-lock", 2255 | ] 2256 | 2257 | [[package]] 2258 | name = "warp" 2259 | version = "0.2.4" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "df341dee97c9ae29dfa5e0b0fbbbf620e0d6a36686389bedf83b3daeb8b0d0ac" 2262 | dependencies = [ 2263 | "bytes 0.5.6", 2264 | "futures", 2265 | "headers", 2266 | "http 0.2.1", 2267 | "hyper", 2268 | "log 0.4.11", 2269 | "mime 0.3.16", 2270 | "mime_guess 2.0.3", 2271 | "multipart", 2272 | "pin-project", 2273 | "scoped-tls", 2274 | "serde", 2275 | "serde_json", 2276 | "serde_urlencoded", 2277 | "tokio", 2278 | "tokio-rustls", 2279 | "tokio-tungstenite", 2280 | "tower-service", 2281 | "tracing", 2282 | "tracing-futures", 2283 | "urlencoding", 2284 | ] 2285 | 2286 | [[package]] 2287 | name = "wasi" 2288 | version = "0.9.0+wasi-snapshot-preview1" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 2291 | 2292 | [[package]] 2293 | name = "wasm-bindgen" 2294 | version = "0.2.62" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "e3c7d40d09cdbf0f4895ae58cf57d92e1e57a9dd8ed2e8390514b54a47cc5551" 2297 | dependencies = [ 2298 | "cfg-if", 2299 | "serde", 2300 | "serde_json", 2301 | "wasm-bindgen-macro", 2302 | ] 2303 | 2304 | [[package]] 2305 | name = "wasm-bindgen-backend" 2306 | version = "0.2.62" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "c3972e137ebf830900db522d6c8fd74d1900dcfc733462e9a12e942b00b4ac94" 2309 | dependencies = [ 2310 | "bumpalo", 2311 | "lazy_static", 2312 | "log 0.4.11", 2313 | "proc-macro2", 2314 | "quote", 2315 | "syn", 2316 | "wasm-bindgen-shared", 2317 | ] 2318 | 2319 | [[package]] 2320 | name = "wasm-bindgen-futures" 2321 | version = "0.4.12" 2322 | source = "registry+https://github.com/rust-lang/crates.io-index" 2323 | checksum = "8a369c5e1dfb7569e14d62af4da642a3cbc2f9a3652fe586e26ac22222aa4b04" 2324 | dependencies = [ 2325 | "cfg-if", 2326 | "js-sys", 2327 | "wasm-bindgen", 2328 | "web-sys", 2329 | ] 2330 | 2331 | [[package]] 2332 | name = "wasm-bindgen-macro" 2333 | version = "0.2.62" 2334 | source = "registry+https://github.com/rust-lang/crates.io-index" 2335 | checksum = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" 2336 | dependencies = [ 2337 | "quote", 2338 | "wasm-bindgen-macro-support", 2339 | ] 2340 | 2341 | [[package]] 2342 | name = "wasm-bindgen-macro-support" 2343 | version = "0.2.62" 2344 | source = "registry+https://github.com/rust-lang/crates.io-index" 2345 | checksum = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" 2346 | dependencies = [ 2347 | "proc-macro2", 2348 | "quote", 2349 | "syn", 2350 | "wasm-bindgen-backend", 2351 | "wasm-bindgen-shared", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "wasm-bindgen-shared" 2356 | version = "0.2.62" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" 2359 | 2360 | [[package]] 2361 | name = "wasm3" 2362 | version = "0.1.0" 2363 | source = "git+https://github.com/Veykril/wasm3-rs.git#a3e004e3c3a6994092c1d2bfd8bd7ddd1d40e84a" 2364 | dependencies = [ 2365 | "cty", 2366 | "wasm3-sys", 2367 | ] 2368 | 2369 | [[package]] 2370 | name = "wasm3-sys" 2371 | version = "0.1.0" 2372 | source = "git+https://github.com/Veykril/wasm3-rs.git#a3e004e3c3a6994092c1d2bfd8bd7ddd1d40e84a" 2373 | dependencies = [ 2374 | "cc", 2375 | "cty", 2376 | ] 2377 | 2378 | [[package]] 2379 | name = "wast" 2380 | version = "17.0.0" 2381 | source = "registry+https://github.com/rust-lang/crates.io-index" 2382 | checksum = "5a0e1c36b928fca33dbaf96235188f5fad22ee87100e26cc606bd0fbabdf1932" 2383 | dependencies = [ 2384 | "leb128", 2385 | ] 2386 | 2387 | [[package]] 2388 | name = "wat" 2389 | version = "1.0.18" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "2b50f9e5e5c81e6fd987ae6997a9f4bbb751df2dec1d8cadb0b5778f1ec13bbe" 2392 | dependencies = [ 2393 | "wast", 2394 | ] 2395 | 2396 | [[package]] 2397 | name = "web-sys" 2398 | version = "0.3.39" 2399 | source = "registry+https://github.com/rust-lang/crates.io-index" 2400 | checksum = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642" 2401 | dependencies = [ 2402 | "js-sys", 2403 | "wasm-bindgen", 2404 | ] 2405 | 2406 | [[package]] 2407 | name = "webpki" 2408 | version = "0.21.3" 2409 | source = "registry+https://github.com/rust-lang/crates.io-index" 2410 | checksum = "ab146130f5f790d45f82aeeb09e55a256573373ec64409fc19a6fb82fb1032ae" 2411 | dependencies = [ 2412 | "ring", 2413 | "untrusted", 2414 | ] 2415 | 2416 | [[package]] 2417 | name = "winapi" 2418 | version = "0.2.8" 2419 | source = "registry+https://github.com/rust-lang/crates.io-index" 2420 | checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 2421 | 2422 | [[package]] 2423 | name = "winapi" 2424 | version = "0.3.8" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 2427 | dependencies = [ 2428 | "winapi-i686-pc-windows-gnu", 2429 | "winapi-x86_64-pc-windows-gnu", 2430 | ] 2431 | 2432 | [[package]] 2433 | name = "winapi-build" 2434 | version = "0.1.1" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 2437 | 2438 | [[package]] 2439 | name = "winapi-i686-pc-windows-gnu" 2440 | version = "0.4.0" 2441 | source = "registry+https://github.com/rust-lang/crates.io-index" 2442 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2443 | 2444 | [[package]] 2445 | name = "winapi-util" 2446 | version = "0.1.5" 2447 | source = "registry+https://github.com/rust-lang/crates.io-index" 2448 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2449 | dependencies = [ 2450 | "winapi 0.3.8", 2451 | ] 2452 | 2453 | [[package]] 2454 | name = "winapi-x86_64-pc-windows-gnu" 2455 | version = "0.4.0" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2458 | 2459 | [[package]] 2460 | name = "winreg" 2461 | version = "0.7.0" 2462 | source = "registry+https://github.com/rust-lang/crates.io-index" 2463 | checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" 2464 | dependencies = [ 2465 | "winapi 0.3.8", 2466 | ] 2467 | 2468 | [[package]] 2469 | name = "ws2_32-sys" 2470 | version = "0.2.1" 2471 | source = "registry+https://github.com/rust-lang/crates.io-index" 2472 | checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 2473 | dependencies = [ 2474 | "winapi 0.2.8", 2475 | "winapi-build", 2476 | ] 2477 | 2478 | [[package]] 2479 | name = "www-authenticate" 2480 | version = "0.3.0" 2481 | source = "registry+https://github.com/rust-lang/crates.io-index" 2482 | checksum = "8c62efb8259cda4e4c732287397701237b78daa4c43edcf3e613c8503a6c07dd" 2483 | dependencies = [ 2484 | "hyperx", 2485 | "unicase 1.4.2", 2486 | "url 1.7.2", 2487 | ] 2488 | 2489 | [[package]] 2490 | name = "yaml-rust" 2491 | version = "0.4.3" 2492 | source = "registry+https://github.com/rust-lang/crates.io-index" 2493 | checksum = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d" 2494 | dependencies = [ 2495 | "linked-hash-map", 2496 | ] 2497 | 2498 | [[package]] 2499 | name = "yasna" 2500 | version = "0.3.2" 2501 | source = "registry+https://github.com/rust-lang/crates.io-index" 2502 | checksum = "0de7bff972b4f2a06c85f6d8454b09df153af7e3a4ec2aac81db1b105b684ddb" 2503 | dependencies = [ 2504 | "chrono", 2505 | ] 2506 | --------------------------------------------------------------------------------