Merge branch 'resource-allocation' of rtyler/otto into master
This commit is contained in:
commit
17d3b07b7f
|
@ -0,0 +1,7 @@
|
|||
|
||||
# Dramatically increases the link performance for the eventbus
|
||||
[build]
|
||||
rustflags = ["-C", "link-arg=-fuse-ld=lld"]
|
||||
|
||||
|
||||
# vim: ft=cfg
|
|
@ -302,11 +302,24 @@ dependencies = [
|
|||
"memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arc-swap"
|
||||
version = "0.4.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "arrayref"
|
||||
version = "0.3.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.4.12"
|
||||
|
@ -315,6 +328,11 @@ dependencies = [
|
|||
"nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.22"
|
||||
|
@ -381,6 +399,14 @@ dependencies = [
|
|||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.11.0"
|
||||
|
@ -391,6 +417,16 @@ name = "bitflags"
|
|||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "blake2b_simd"
|
||||
version = "0.5.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "block-buffer"
|
||||
version = "0.7.3"
|
||||
|
@ -438,6 +474,15 @@ name = "byteorder"
|
|||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "0.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "0.5.3"
|
||||
|
@ -476,9 +521,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
dependencies = [
|
||||
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "2.33.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cloudabi"
|
||||
version = "0.0.3"
|
||||
|
@ -502,11 +563,30 @@ dependencies = [
|
|||
"yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "constant_time_eq"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "copyless"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "crc32fast"
|
||||
version = "1.2.0"
|
||||
|
@ -523,6 +603,15 @@ dependencies = [
|
|||
"crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.6.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.7.0"
|
||||
|
@ -551,6 +640,36 @@ dependencies = [
|
|||
"generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dirs"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dirs"
|
||||
version = "2.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dirs-sys"
|
||||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dtoa"
|
||||
version = "0.4.4"
|
||||
|
@ -633,6 +752,24 @@ name = "fnv"
|
|||
version = "1.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "foreign-types"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foreign-types-shared"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "fuchsia-cprng"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "fuchsia-zircon"
|
||||
version = "0.3.3"
|
||||
|
@ -821,6 +958,16 @@ dependencies = [
|
|||
"winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http"
|
||||
version = "0.1.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http"
|
||||
version = "0.2.0"
|
||||
|
@ -862,6 +1009,14 @@ dependencies = [
|
|||
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "input_buffer"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iovec"
|
||||
version = "0.1.4"
|
||||
|
@ -1027,6 +1182,23 @@ dependencies = [
|
|||
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "native-tls"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "net2"
|
||||
version = "0.2.33"
|
||||
|
@ -1037,6 +1209,18 @@ dependencies = [
|
|||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nodrop"
|
||||
version = "0.1.14"
|
||||
|
@ -1092,21 +1276,74 @@ version = "0.2.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "otto-eventbus"
|
||||
name = "openssl"
|
||||
version = "0.10.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-probe"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "openssl-sys"
|
||||
version = "0.9.53"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "otto-auctioneer"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"config 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"otto-eventbus 0.1.0",
|
||||
"pretty_env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tungstenite 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "otto-eventbus"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"actix-web-actors 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"config 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"handlebars 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pretty_env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rust-embed 5.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustyline 5.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tungstenite 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1203,6 +1440,11 @@ name = "pin-utils"
|
|||
version = "0.1.0-alpha.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.6"
|
||||
|
@ -1275,6 +1517,19 @@ dependencies = [
|
|||
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.5.1"
|
||||
|
@ -1291,11 +1546,43 @@ dependencies = [
|
|||
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_os"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rdrand"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.56"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "redox_users"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.3.1"
|
||||
|
@ -1312,6 +1599,14 @@ name = "regex-syntax"
|
|||
version = "0.6.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "remove_dir_all"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "resolv-conf"
|
||||
version = "0.6.2"
|
||||
|
@ -1321,6 +1616,16 @@ dependencies = [
|
|||
"quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rust-argon2"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rust-embed"
|
||||
version = "5.2.0"
|
||||
|
@ -1338,6 +1643,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
dependencies = [
|
||||
"quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rust-embed-utils 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"shellexpand 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -1368,6 +1674,23 @@ dependencies = [
|
|||
"semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustyline"
|
||||
version = "5.0.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"utf8parse 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.2"
|
||||
|
@ -1381,11 +1704,39 @@ dependencies = [
|
|||
"winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "schannel"
|
||||
version = "0.1.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "security-framework"
|
||||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework-sys"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "0.9.0"
|
||||
|
@ -1479,6 +1830,14 @@ name = "sha1"
|
|||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "shellexpand"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.2.0"
|
||||
|
@ -1514,6 +1873,11 @@ name = "static_assertions"
|
|||
version = "0.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.11"
|
||||
|
@ -1535,6 +1899,19 @@ dependencies = [
|
|||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termcolor"
|
||||
version = "1.0.5"
|
||||
|
@ -1543,6 +1920,14 @@ dependencies = [
|
|||
"wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "textwrap"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "0.3.6"
|
||||
|
@ -1647,6 +2032,25 @@ dependencies = [
|
|||
"trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tungstenite"
|
||||
version = "0.9.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"input_buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.11.2"
|
||||
|
@ -1678,6 +2082,11 @@ name = "unicode-segmentation"
|
|||
version = "1.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.0"
|
||||
|
@ -1693,11 +2102,36 @@ dependencies = [
|
|||
"percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "utf-8"
|
||||
version = "0.7.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "utf8parse"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "vcpkg"
|
||||
version = "0.2.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "vec_map"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "void"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "walkdir"
|
||||
version = "2.2.9"
|
||||
|
@ -1789,6 +2223,11 @@ dependencies = [
|
|||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yaml-rust"
|
||||
version = "0.3.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "yaml-rust"
|
||||
version = "0.4.3"
|
||||
|
@ -1817,36 +2256,50 @@ dependencies = [
|
|||
"checksum actix_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b95aceadaf327f18f0df5962fedc1bde2f870566a0b9f65c89508a3b1f79334c"
|
||||
"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
|
||||
"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
|
||||
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||
"checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff"
|
||||
"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
|
||||
"checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9"
|
||||
"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
|
||||
"checksum async-trait 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "c8df72488e87761e772f14ae0c2480396810e51b2c2ade912f97f0f7e5b95e3c"
|
||||
"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
|
||||
"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
|
||||
"checksum awc 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d7601d4d1d7ef2335d6597a41b5fe069f6ab799b85f53565ab390e7b7065aac5"
|
||||
"checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea"
|
||||
"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491"
|
||||
"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
|
||||
"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
|
||||
"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
"checksum blake2b_simd 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b83b7baab1e671718d78204225800d6b170e648188ac7dc992e9d6bddf87d0c0"
|
||||
"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
|
||||
"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
|
||||
"checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd"
|
||||
"checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e"
|
||||
"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
|
||||
"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
|
||||
"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c"
|
||||
"checksum bytes 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10004c15deb332055f7a4a208190aed362cf9a7c2f6ab70a305fba50e1105f38"
|
||||
"checksum bytestring 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b24c107a4432e408d2caa58d3f5e763b219236221406ea58a4076b62343a039d"
|
||||
"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb"
|
||||
"checksum cc 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "f52a465a666ca3d838ebbf08b241383421412fe7ebb463527bba275526d89f76"
|
||||
"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
"checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01"
|
||||
"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
|
||||
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
|
||||
"checksum config 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "19b076e143e1d9538dde65da30f8481c2a6c44040edb8e02b9bf1351edb92ce3"
|
||||
"checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120"
|
||||
"checksum copyless 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ff9c56c9fb2a49c05ef0e431485a22400af20d33226dc0764d891d09e724127"
|
||||
"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d"
|
||||
"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
|
||||
"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
|
||||
"checksum crossbeam-channel 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "acec9a3b0b3559f15aee4f90746c4e5e293b701c0f7d3925d24e01645267b68c"
|
||||
"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
|
||||
"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
|
||||
"checksum derive_more 0.99.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2159be042979966de68315bce7034bb000c775f22e3e834e1c52ff78f041cae8"
|
||||
"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
|
||||
"checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
|
||||
"checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3"
|
||||
"checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b"
|
||||
"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
|
||||
"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
|
||||
"checksum encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)" = "87240518927716f79692c2ed85bfe6e98196d18c6401ec75355760233a7e12e9"
|
||||
|
@ -1857,6 +2310,9 @@ dependencies = [
|
|||
"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
|
||||
"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f"
|
||||
"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
|
||||
"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
|
||||
"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
||||
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
|
||||
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
|
||||
"checksum futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987"
|
||||
|
@ -1877,11 +2333,13 @@ dependencies = [
|
|||
"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
|
||||
"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
|
||||
"checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e"
|
||||
"checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0"
|
||||
"checksum http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b"
|
||||
"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
|
||||
"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
|
||||
"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
|
||||
"checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2"
|
||||
"checksum input_buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e1b822cc844905551931d6f81608ed5f50a79c1078a4e2b4d42dbc7c1eedfbf"
|
||||
"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
|
||||
"checksum ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa79fa216fbe60834a9c0737d7fcd30425b32d1c58854663e24d4c4b328ed83f"
|
||||
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
|
||||
|
@ -1903,7 +2361,9 @@ dependencies = [
|
|||
"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f"
|
||||
"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125"
|
||||
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
|
||||
"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e"
|
||||
"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
|
||||
"checksum nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce"
|
||||
"checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
|
||||
"checksum nom 5.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c618b63422da4401283884e6668d39f819a106ef51f5f59b81add00075da35ca"
|
||||
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
|
||||
|
@ -1911,6 +2371,9 @@ dependencies = [
|
|||
"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
|
||||
"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72"
|
||||
"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
|
||||
"checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585"
|
||||
"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
|
||||
"checksum openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)" = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f"
|
||||
"checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc"
|
||||
"checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1"
|
||||
"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
|
||||
|
@ -1922,6 +2385,7 @@ dependencies = [
|
|||
"checksum pin-project-internal 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "44ca92f893f0656d3cba8158dd0f2b99b94de256a4a54e870bd6922fcc6c8355"
|
||||
"checksum pin-project-lite 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f0af6cbca0e6e3ce8692ee19fb8d734b641899e07b68eb73e9bbbd32f1703991"
|
||||
"checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587"
|
||||
"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
|
||||
"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
|
||||
"checksum pretty_env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "717ee476b1690853d222af4634056d830b5197ffd747726a9a1eee6da9f49074"
|
||||
"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
|
||||
|
@ -1931,21 +2395,32 @@ dependencies = [
|
|||
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
|
||||
"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
|
||||
"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
|
||||
"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
||||
"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
||||
"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
|
||||
"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
|
||||
"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
|
||||
"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
||||
"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
|
||||
"checksum redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d"
|
||||
"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd"
|
||||
"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
|
||||
"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
|
||||
"checksum resolv-conf 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b263b4aa1b5de9ffc0054a2386f96992058bb6870aab516f8cdeb8a667d56dcb"
|
||||
"checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf"
|
||||
"checksum rust-embed 5.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b18893bdbdb0fa5bce588f5d7ab4afbd0678fc879d31535912bf39b7fbc062d6"
|
||||
"checksum rust-embed-impl 5.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50633968284cfc373661345fc6382e62b738079f045738023ebc5e445cf44357"
|
||||
"checksum rust-embed-utils 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97655158074ccb2d2cfb1ccb4c956ef0f4054e43a2c1e71146d4991e6961e105"
|
||||
"checksum rust-ini 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2"
|
||||
"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
|
||||
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
|
||||
"checksum rustyline 5.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a23cb19702a8d6afb6edb3c842386e680d4883760e0df74e6848e23c2a87a635"
|
||||
"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
|
||||
"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
|
||||
"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021"
|
||||
"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
|
||||
"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df"
|
||||
"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895"
|
||||
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
|
||||
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8"
|
||||
|
@ -1957,14 +2432,18 @@ dependencies = [
|
|||
"checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97"
|
||||
"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68"
|
||||
"checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
|
||||
"checksum shellexpand 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3a23aed0018ea07316c7826ade41e551772031cf652805f93ebc922215a44d4a"
|
||||
"checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41"
|
||||
"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
|
||||
"checksum smallvec 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecf3b85f68e8abaa7555aa5abdb1153079387e60b718283d732f03897fcfc86"
|
||||
"checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85"
|
||||
"checksum static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3"
|
||||
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||
"checksum syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "dff0acdb207ae2fe6d5976617f887eb1e35a2ba52c13c7234c790960cdad9238"
|
||||
"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
|
||||
"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
|
||||
"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
|
||||
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
||||
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
|
||||
"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865"
|
||||
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
|
||||
|
@ -1973,14 +2452,21 @@ dependencies = [
|
|||
"checksum toml 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "01d1404644c8b12b16bfcffa4322403a91a451584daaaa7c28d3152e6cbc98cf"
|
||||
"checksum trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2a7f3a2ab8a919f5eca52a468866a67ed7d3efa265d48a652a9a3452272b413f"
|
||||
"checksum trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6f90b1502b226f8b2514c6d5b37bafa8c200d7ca4102d57dc36ee0f3b7a04a2f"
|
||||
"checksum tungstenite 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a0c2bd5aeb7dcd2bb32e472c8872759308495e5eccc942e929a513cd8d36110"
|
||||
"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
|
||||
"checksum ucd-trie 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8f00ed7be0c1ff1e24f46c3d2af4859f7e863672ba3a6e92e7cff702bf9f06c2"
|
||||
"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
|
||||
"checksum unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf"
|
||||
"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
|
||||
"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
|
||||
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
|
||||
"checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61"
|
||||
"checksum utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
|
||||
"checksum utf8parse 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8772a4ccbb4e89959023bc5b7cb8623a795caa7092d99f3aa9501b9484d4557d"
|
||||
"checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168"
|
||||
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
|
||||
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
|
||||
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||
"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e"
|
||||
"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
|
||||
"checksum widestring 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effc0e4ff8085673ea7b9b2e3c73f6bd4d118810c9009ed8f1e16bd96c331db6"
|
||||
|
@ -1994,4 +2480,5 @@ dependencies = [
|
|||
"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9"
|
||||
"checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e"
|
||||
"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
|
||||
"checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992"
|
||||
"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
[workspace]
|
||||
|
||||
members = [
|
||||
"auctioneer",
|
||||
"eventbus",
|
||||
]
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
# This Procfile is intended to be used by scripts/shoreman to run a development
|
||||
# environment for Otto using locally built debug binaries
|
||||
#
|
||||
|
||||
eventbus: RUST_LOG=info ./target/debug/otto-eventbus
|
||||
auctioneer: RUST_LOG=debug ./target/debug/otto-auctioneer
|
||||
|
||||
# vim: ft=sh
|
|
@ -0,0 +1 @@
|
|||
target/
|
|
@ -0,0 +1,30 @@
|
|||
[package]
|
||||
name = "otto-auctioneer"
|
||||
version = "0.1.0"
|
||||
authors = ["R. Tyler Croy <rtyler@brokenco.de>"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
# Needed for the actor system
|
||||
actix = "~0.9.0"
|
||||
actix-rt = "~1.0.0"
|
||||
|
||||
# Needed for websockets
|
||||
tungstenite = "~0.9.2"
|
||||
url = "~2.1.0"
|
||||
|
||||
# Handling command line options
|
||||
clap = { version = "~2.33.0", features = ["yaml"] }
|
||||
# Handling configuration overlays
|
||||
config = { version = "~0.10.1", features = ["yaml"] }
|
||||
|
||||
# Logging
|
||||
log = "~0.4.8"
|
||||
pretty_env_logger = "~0.3.1"
|
||||
|
||||
# Adding the "rc" feature so we can serialize/deserialize Arc<T> and Rc<T>
|
||||
serde = { version = "~1.0.103", features = ["rc"] }
|
||||
serde_json = "~1.0.0"
|
||||
|
||||
otto-eventbus = { path = "../eventbus" }
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
/**!
|
||||
* The auctioneer main model
|
||||
*/
|
||||
extern crate actix;
|
||||
extern crate pretty_env_logger;
|
||||
extern crate tungstenite;
|
||||
use std::time::Duration;
|
||||
use std::{io, thread};
|
||||
|
||||
use actix::*;
|
||||
use log::*;
|
||||
use tungstenite::client::AutoStream;
|
||||
use tungstenite::handshake::client::Response;
|
||||
use tungstenite::*;
|
||||
use url::Url;
|
||||
|
||||
use otto_eventbus::*;
|
||||
|
||||
struct BusClient {}
|
||||
|
||||
impl Actor for BusClient {
|
||||
type Context = SyncContext<Self>;
|
||||
|
||||
fn started(&mut self, ctx: &mut Self::Context) {
|
||||
info!("Starting client");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple websocket connection function, just to allow for easy reconnections
|
||||
*/
|
||||
fn ws_connect() -> Result<(WebSocket<AutoStream>, Response)> {
|
||||
return connect(Url::parse("ws://localhost:8000/ws/").unwrap());
|
||||
}
|
||||
|
||||
#[actix_rt::main]
|
||||
async fn main() {
|
||||
pretty_env_logger::init();
|
||||
|
||||
let (mut socket, _response) = ws_connect().unwrap();
|
||||
|
||||
info!("Connected to the server");
|
||||
|
||||
/*
|
||||
* In this loop we should read the message, and then dispatch it to a handler actor immediately
|
||||
* to do "the work"
|
||||
*/
|
||||
loop {
|
||||
let msg = socket.read_message();
|
||||
let msg = match msg {
|
||||
Ok(m) => m,
|
||||
Err(e) => {
|
||||
error!("Failed to read a message off the WebSocket: {:?}", e);
|
||||
// must reconnect
|
||||
thread::sleep(Duration::from_secs(3));
|
||||
|
||||
/*
|
||||
* Ignore connection errors, they're not important since we
|
||||
* are in the retry loop anyways.
|
||||
*/
|
||||
if let Ok(recon) = ws_connect() {
|
||||
info!("Server reconnected");
|
||||
socket = recon.0;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
};
|
||||
info!("Received: {}", msg);
|
||||
}
|
||||
}
|
22
eventbus.yml
22
eventbus.yml
|
@ -8,13 +8,15 @@ heartbeat: 30
|
|||
#
|
||||
# NOTE: there is a default "all" channel which is used to broadcast information
|
||||
# to all clients.
|
||||
channels:
|
||||
# Stateful channels where clients may reconnect and pick up where they left
|
||||
# off in the channel
|
||||
stateful:
|
||||
- tasks
|
||||
- audit
|
||||
# Stateless channels are those which operate on a "pub/sub" model, if a
|
||||
# client misses a message, it's gone
|
||||
stateless:
|
||||
- all
|
||||
#
|
||||
# WARN: Channels are not merged with the default configuration, and will overwrite
|
||||
# channels:
|
||||
# stateful:
|
||||
# - audit
|
||||
# - tasks.for_auction
|
||||
# - tasks.auction
|
||||
# - tasks.bids
|
||||
# stateless:
|
||||
# - all
|
||||
# - tasks.started
|
||||
# - tasks.finished
|
||||
|
|
|
@ -4,23 +4,32 @@ version = "0.1.0"
|
|||
authors = ["R. Tyler Croy <rtyler@brokenco.de>"]
|
||||
edition = "2018"
|
||||
|
||||
[[bin]]
|
||||
name = "otto-eventbus"
|
||||
path = "src/server/main.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "otto-ebc"
|
||||
path = "src/cli.rs"
|
||||
|
||||
[dependencies]
|
||||
# Actix provides the web and websocket basis we sit on top of
|
||||
actix = "~0.9.0"
|
||||
# Grabbing an alpha version with async/await support.
|
||||
actix-web = "~2.0.0"
|
||||
# This crate provides the websocket support which we will rely on for all
|
||||
# clients
|
||||
actix-web-actors = "~2.0.0"
|
||||
actix-rt = "~1.0.0"
|
||||
actix-http = "~1.0.1"
|
||||
|
||||
handlebars = "~2.0.2"
|
||||
# Need to embed static resources into the binary for serving at runtime
|
||||
rust-embed = "~5.2.0"
|
||||
rust-embed = { version = "~5.2.0", features = ["interpolate-folder-path"] }
|
||||
|
||||
# Used for formatting times in messages
|
||||
chrono = "~0.4.10"
|
||||
chrono = { version = "~0.4.10", features = ["serde"] }
|
||||
|
||||
# Handling command line options
|
||||
#clap = { version = "~2.33.0", features = ["yaml"] }
|
||||
clap = { version = "~2.33.0", features = ["yaml"] }
|
||||
# Handling configuration overlays
|
||||
config = { version = "~0.10.1", features = ["yaml"] }
|
||||
|
||||
# Logging
|
||||
|
@ -30,3 +39,13 @@ pretty_env_logger = "~0.3.1"
|
|||
# Adding the "rc" feature so we can serialize/deserialize Arc<T> and Rc<T>
|
||||
serde = { version = "~1.0.103", features = ["rc"] }
|
||||
serde_json = "~1.0.0"
|
||||
|
||||
# Needed for websockets in cli.rs
|
||||
tungstenite = "~0.9.2"
|
||||
url = "~2.1.0"
|
||||
# Needed for the nice bits in the cli
|
||||
rustyline = "~5.0.6"
|
||||
|
||||
|
||||
[dev-dependencies]
|
||||
regex = "1"
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* The CLI is meant to be used for manual testing and verification of the eventbus only.
|
||||
*/
|
||||
|
||||
extern crate rustyline;
|
||||
|
||||
use std::io::{stdin, stdout, Write};
|
||||
use rustyline::error::ReadlineError;
|
||||
use rustyline::Editor;
|
||||
use tungstenite::*;
|
||||
use url::Url;
|
||||
|
||||
fn main() {
|
||||
let (mut socket, response) =
|
||||
connect(Url::parse("ws://localhost:8000/ws/").unwrap()).expect("Failed to connect");
|
||||
println!("Connected to the server");
|
||||
|
||||
// `()` can be used when no completer is required
|
||||
let mut rl = Editor::<()>::new();
|
||||
let history = ".otto-ebc-history";
|
||||
|
||||
if rl.load_history(history).is_err() {
|
||||
println!("No previous history");
|
||||
}
|
||||
|
||||
loop {
|
||||
let readline = rl.readline(">> ");
|
||||
match readline {
|
||||
Ok(line) => {
|
||||
if line.len() == 0 {
|
||||
let msg = socket.read_message().expect("Failed to read message");
|
||||
println!("Received: {}", msg);
|
||||
} else {
|
||||
socket.write_message(Message::Text(line));
|
||||
}
|
||||
},
|
||||
Err(ReadlineError::Interrupted) => {
|
||||
// ctrl-C
|
||||
break
|
||||
},
|
||||
Err(ReadlineError::Eof) => {
|
||||
// ctrl-D
|
||||
break
|
||||
},
|
||||
Err(err) => {
|
||||
println!("Error: {:?}", err);
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
rl.save_history(history).unwrap();
|
||||
}
|
|
@ -6,34 +6,110 @@ extern crate serde;
|
|||
extern crate serde_json;
|
||||
|
||||
use actix::Message;
|
||||
use chrono::prelude::{DateTime, Utc};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::Value;
|
||||
|
||||
pub mod bus;
|
||||
pub mod client;
|
||||
use std::sync::Arc;
|
||||
|
||||
/**
|
||||
* Default function for deserialize/serialize of times, always defaults to 1970-01-01
|
||||
*/
|
||||
fn epoch() -> DateTime<Utc> {
|
||||
use chrono::offset::TimeZone;
|
||||
return Utc.ymd(1970, 1, 1).and_hms_milli(0, 0, 1, 444);
|
||||
}
|
||||
|
||||
/**
|
||||
* The `Meta` struct contains the necessary metadata about a message which is being sent over the
|
||||
* wire
|
||||
*
|
||||
* It is not intended to carry message contents itself, but rather information about the message
|
||||
*/
|
||||
#[derive(Serialize, Deserialize, Debug, Message)]
|
||||
#[serde(tag = "command", rename_all = "camelCase")]
|
||||
#[rtype(result = "()")]
|
||||
pub enum Command {
|
||||
pub struct Meta {
|
||||
pub channel: String,
|
||||
#[serde(default = "epoch")]
|
||||
pub ts: DateTime<Utc>,
|
||||
}
|
||||
|
||||
/**
|
||||
* The Output enums are all meant to capture the types of messages which can be received from the
|
||||
* eventbus.
|
||||
*/
|
||||
#[derive(Serialize, Deserialize, Debug, Message)]
|
||||
#[serde(tag = "type", rename_all = "camelCase")]
|
||||
#[rtype(result = "()")]
|
||||
pub enum Output {
|
||||
Heartbeat,
|
||||
Message { payload: Value },
|
||||
}
|
||||
|
||||
/**
|
||||
* OutputMessage is the fully realized and serializable form of an Output
|
||||
*
|
||||
* This struct should never be constructed except by the websocket handlers just prior to writing
|
||||
* to an active websocket
|
||||
*
|
||||
* Clients should be prepared to handle each of these messages coming over the channels they
|
||||
* subscribe to.
|
||||
*/
|
||||
#[derive(Serialize, Deserialize, Debug, Message)]
|
||||
#[rtype(result = "()")]
|
||||
pub struct OutputMessage {
|
||||
pub msg: Arc<Output>,
|
||||
pub meta: Meta,
|
||||
}
|
||||
|
||||
/**
|
||||
* The Input enums are all meant to capture the types of messages that can be send to the eventbus
|
||||
* as "inputs."
|
||||
*
|
||||
*/
|
||||
#[derive(Serialize, Deserialize, Debug, Message)]
|
||||
#[serde(tag = "type", rename_all = "camelCase")]
|
||||
#[rtype(result = "()")]
|
||||
pub enum Input {
|
||||
/**
|
||||
* A Subscribe message must be sent for each channel the client wishes to subscribe to.
|
||||
*
|
||||
* These subscriptions are currently NOT durable. Once the client disconnects, subscriptions
|
||||
* will be cleared automatically
|
||||
*/
|
||||
Subscribe {
|
||||
/**
|
||||
* The client's UUID
|
||||
*/
|
||||
client: String,
|
||||
/**
|
||||
* The channel the client wishes to subscribe to
|
||||
*/
|
||||
channel: String,
|
||||
},
|
||||
/**
|
||||
* The unsubscribe message can be sent if the client wishes to stop following a specific
|
||||
* channel, but remained connected and following others.
|
||||
*/
|
||||
Unsubscribe {
|
||||
/**
|
||||
* The client's UUID
|
||||
*/
|
||||
client: String,
|
||||
/**
|
||||
* The channel the client wishes to unsubscribe from
|
||||
*/
|
||||
channel: String,
|
||||
}
|
||||
},
|
||||
/**
|
||||
* The Publish message is the most common message clients should be sending
|
||||
*
|
||||
* The `payload` is an arbitrary bit of JSON, and is not typed
|
||||
*/
|
||||
Publish { payload: Value },
|
||||
}
|
||||
|
||||
/**
|
||||
* InputMessage is the fully realized and serializable form of an Inputt
|
||||
*
|
||||
* This struct should never be constructed except by client websocket handlers just prior to
|
||||
* writing to an active websocket
|
||||
*/
|
||||
#[derive(Serialize, Deserialize, Debug, Message)]
|
||||
#[rtype(result = "()")]
|
||||
pub struct InputMessage {
|
||||
pub msg: Input,
|
||||
pub meta: Meta,
|
||||
}
|
||||
|
|
|
@ -5,11 +5,15 @@
|
|||
*/
|
||||
use actix::*;
|
||||
use actix_web_actors::ws;
|
||||
use chrono::prelude::Utc;
|
||||
use log::{error, info};
|
||||
use serde_json;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::*;
|
||||
use otto_eventbus::*;
|
||||
|
||||
/*
|
||||
* Define the Websocket Actor needed for Actix
|
||||
*
|
||||
|
@ -17,32 +21,43 @@ use std::sync::Arc;
|
|||
* keep track of this connection and its configuration
|
||||
*/
|
||||
pub struct WSClient {
|
||||
events: Addr<crate::bus::EventBus>,
|
||||
events: Addr<eventbus::EventBus>,
|
||||
}
|
||||
|
||||
impl WSClient {
|
||||
pub fn new(eb: Addr<crate::bus::EventBus>) -> Self {
|
||||
pub fn new(eb: Addr<eventbus::EventBus>) -> Self {
|
||||
Self { events: eb }
|
||||
}
|
||||
|
||||
fn handle_text(&self, text: String, ctx: &<WSClient as Actor>::Context) {
|
||||
let command = serde_json::from_str::<crate::Command>(&text);
|
||||
let command = serde_json::from_str::<InputMessage>(&text);
|
||||
|
||||
match command {
|
||||
Ok(c) => {
|
||||
// Since we have a Command, what kind?
|
||||
match c {
|
||||
crate::Command::Subscribe { client, channel } => {
|
||||
info!("Subscribing {} to {}", client, channel);
|
||||
// Sent it along to the bus
|
||||
// TODO: This should not use do_send which ignores errors
|
||||
self.events.do_send(crate::bus::Subscribe {
|
||||
to: channel,
|
||||
addr: ctx.address(),
|
||||
});
|
||||
InputMessage { msg, meta } => {
|
||||
match msg {
|
||||
Input::Publish { payload } => {
|
||||
info!("received publish: {:?}", payload);
|
||||
self.events.do_send(eventbus::Event {
|
||||
e: Arc::new(Output::Message { payload: payload }),
|
||||
channel: Arc::new(meta.channel),
|
||||
});
|
||||
}
|
||||
Input::Subscribe { client } => {
|
||||
info!("Subscribing {} to {}", client, meta.channel);
|
||||
// Sent it along to the bus
|
||||
// TODO: This should not use do_send which ignores errors
|
||||
self.events.do_send(eventbus::Subscribe {
|
||||
to: meta.channel,
|
||||
addr: ctx.address(),
|
||||
});
|
||||
}
|
||||
_ => (),
|
||||
};
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
};
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Error parsing message from client: {:?}", e);
|
||||
|
@ -52,13 +67,25 @@ impl WSClient {
|
|||
}
|
||||
|
||||
/**
|
||||
* Handle Basic eventbus messages by serializing them over to the websocket
|
||||
* Handle eventbus Output messages by serializing them over to the websocket
|
||||
*/
|
||||
impl Handler<Arc<crate::Command>> for WSClient {
|
||||
impl Handler<eventbus::Event> for WSClient {
|
||||
type Result = ();
|
||||
|
||||
fn handle(&mut self, msg: Arc<crate::Command>, ctx: &mut Self::Context) {
|
||||
ctx.text(serde_json::to_string(&msg).unwrap());
|
||||
/**
|
||||
* The `handle` function will be invoked when the WSClient actor receives a message which is
|
||||
* intended to be sent to the client via a WebSocket.
|
||||
*
|
||||
* The handler will serialize the Output, and add additional metadata for the client
|
||||
*/
|
||||
fn handle(&mut self, event: eventbus::Event, ctx: &mut Self::Context) {
|
||||
let meta = Meta {
|
||||
channel: event.channel.to_string(),
|
||||
ts: Utc::now(),
|
||||
};
|
||||
let out = OutputMessage { msg: event.e, meta };
|
||||
// TODO: error
|
||||
ctx.text(serde_json::to_string(&out).unwrap());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -70,7 +97,7 @@ impl Actor for WSClient {
|
|||
type Context = ws::WebsocketContext<Self>;
|
||||
|
||||
fn started(&mut self, ctx: &mut Self::Context) {
|
||||
let sub = crate::bus::Subscribe {
|
||||
let sub = eventbus::Subscribe {
|
||||
to: "all".to_owned(),
|
||||
addr: ctx.address(),
|
||||
};
|
|
@ -8,13 +8,15 @@ use std::sync::Arc;
|
|||
|
||||
use log::{error, info};
|
||||
|
||||
use crate::*;
|
||||
|
||||
/*
|
||||
* NOTE: I would like for the bus module not to know anything at all about the clients.
|
||||
*
|
||||
* At the moment I believe that would require a bit more type and generics surgery
|
||||
* than I am currently willing to expend on the problem
|
||||
*/
|
||||
type ClientId = Addr<crate::client::WSClient>;
|
||||
type ClientId = Addr<connection::WSClient>;
|
||||
|
||||
#[derive(Message)]
|
||||
#[rtype(result = "()")]
|
||||
|
@ -23,11 +25,11 @@ pub struct Subscribe {
|
|||
pub addr: ClientId,
|
||||
}
|
||||
|
||||
#[derive(Message)]
|
||||
#[derive(Message, Clone)]
|
||||
#[rtype(result = "()")]
|
||||
pub struct Event {
|
||||
pub e: Arc<crate::Command>,
|
||||
pub channel: String,
|
||||
pub e: Arc<crate::Output>,
|
||||
pub channel: Arc<String>,
|
||||
}
|
||||
|
||||
#[derive(Message)]
|
||||
|
@ -135,7 +137,7 @@ impl Handler<Event> for EventBus {
|
|||
|
||||
fn handle(&mut self, ev: Event, _: &mut Context<Self>) {
|
||||
let ch = Channel {
|
||||
name: ev.channel,
|
||||
name: ev.channel.to_string(),
|
||||
stateful: false,
|
||||
};
|
||||
if self.channels.contains_key(&ch) {
|
||||
|
@ -148,7 +150,11 @@ impl Handler<Event> for EventBus {
|
|||
* eventbus
|
||||
*/
|
||||
for client in clients {
|
||||
client.do_send(ev.e.clone());
|
||||
/*
|
||||
* TODO: cloning this is probably not necessary but I do not currently
|
||||
* understand how to pass references to Actors in actix.
|
||||
*/
|
||||
client.do_send(ev.clone());
|
||||
}
|
||||
}
|
||||
} else {
|
|
@ -4,6 +4,7 @@
|
|||
*/
|
||||
extern crate actix;
|
||||
extern crate actix_web;
|
||||
extern crate actix_http;
|
||||
extern crate config;
|
||||
extern crate log;
|
||||
extern crate pretty_env_logger;
|
||||
|
@ -26,12 +27,15 @@ use std::time::Duration;
|
|||
|
||||
use otto_eventbus::*;
|
||||
|
||||
pub mod connection;
|
||||
pub mod eventbus;
|
||||
|
||||
/**
|
||||
* Templates is a rust-embed struct which will contain all the files embedded from the
|
||||
* eventbus/templates/ directory
|
||||
*/
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "eventbus/templates"]
|
||||
#[folder = "$CARGO_MANIFEST_DIR/templates"]
|
||||
struct Templates;
|
||||
|
||||
/**
|
||||
|
@ -39,11 +43,11 @@ struct Templates;
|
|||
* folder at compile-time
|
||||
*/
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "eventbus/static"]
|
||||
#[folder = "$CARGO_MANIFEST_DIR/static"]
|
||||
struct Static;
|
||||
|
||||
struct AppState {
|
||||
bus: Addr<bus::EventBus>,
|
||||
bus: Addr<eventbus::EventBus>,
|
||||
// Handlebars uses a repository for the compiled templates. This object must be
|
||||
// shared between the application threads, and is therefore passed to the
|
||||
// Application Builder as an atomic reference-counted pointer.
|
||||
|
@ -76,7 +80,7 @@ async fn ws_index(
|
|||
stream: web::Payload,
|
||||
state: web::Data<AppState>,
|
||||
) -> Result<HttpResponse, Error> {
|
||||
let actor = client::WSClient::new(state.bus.clone());
|
||||
let actor = connection::WSClient::new(state.bus.clone());
|
||||
let res = ws::start(actor, &r, stream);
|
||||
trace!("{:?}", res.as_ref().unwrap());
|
||||
res
|
||||
|
@ -119,15 +123,15 @@ async fn main() -> std::io::Result<()> {
|
|||
.get::<Vec<String>>("channels.stateful")
|
||||
.expect("Failed to load `channels.stateful` configuration, which must be an array");
|
||||
|
||||
let events = bus::EventBus::with_channels(stateless, stateful).start();
|
||||
let events = eventbus::EventBus::with_channels(stateless, stateful).start();
|
||||
let bus = events.clone();
|
||||
|
||||
thread::spawn(move || loop {
|
||||
let pulse = format!("heartbeat {}", Local::now());
|
||||
trace!("sending pulse: {}", pulse);
|
||||
let event = crate::bus::Event {
|
||||
e: Arc::new(crate::Command::Heartbeat),
|
||||
channel: "all".to_string(),
|
||||
let event = eventbus::Event {
|
||||
e: Arc::new(Output::Heartbeat),
|
||||
channel: Arc::new("all".to_string()),
|
||||
};
|
||||
bus.do_send(event);
|
||||
let seconds = settings
|
||||
|
@ -154,3 +158,47 @@ async fn main() -> std::io::Result<()> {
|
|||
.run()
|
||||
.await
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
use actix_web::{test, web, App};
|
||||
|
||||
use regex::Regex;
|
||||
|
||||
/**
|
||||
* This test just ensures that the server can come online properly and render its index handler
|
||||
* properly.
|
||||
*
|
||||
* It doesn't really test much useful, but does ensure that critical failures in the eventbus
|
||||
* can sometimes be prevented
|
||||
*/
|
||||
#[actix_rt::test]
|
||||
async fn test_basic_http() {
|
||||
let events = eventbus::EventBus::with_channels(vec![], vec![]).start();
|
||||
let state = AppState {
|
||||
bus: events,
|
||||
hb: Arc::new(Handlebars::new()),
|
||||
};
|
||||
let wd = web::Data::new(state);
|
||||
let srv = test::start(move || {
|
||||
App::new()
|
||||
.app_data(wd.clone())
|
||||
.route("/", web::get().to(index))
|
||||
});
|
||||
|
||||
let req = srv.get("/");
|
||||
let mut response = req.send().await.unwrap();
|
||||
assert!(response.status().is_success());
|
||||
|
||||
let re = Regex::new(r"(v\d\.\d\.\d)").unwrap();
|
||||
|
||||
let body = response.body().await.unwrap();
|
||||
let buffer = String::from_utf8(body.to_vec()).unwrap();
|
||||
let matches = re.captures(&buffer).unwrap();
|
||||
|
||||
let version = matches.get(1).unwrap();
|
||||
assert_eq!(version.as_str(), format!("v{}", option_env!("CARGO_PKG_VERSION").unwrap_or("unknown")));
|
||||
}
|
||||
}
|
|
@ -5,5 +5,10 @@ heartbeat: 60
|
|||
channels:
|
||||
stateful:
|
||||
- audit
|
||||
- tasks.for_auction
|
||||
- tasks.auction
|
||||
- tasks.bids
|
||||
stateless:
|
||||
- all
|
||||
- tasks.started
|
||||
- tasks.finished
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
*.html
|
|
@ -24,7 +24,7 @@ endif::[]
|
|||
| link:https://github.com/rtyler/[R Tyler Croy]
|
||||
|
||||
| Status
|
||||
| Not Submitted :information_source:
|
||||
| Draft :speech_balloon:
|
||||
|
||||
| Type
|
||||
| Standards
|
||||
|
@ -36,27 +36,186 @@ endif::[]
|
|||
|
||||
== Abstract
|
||||
|
||||
[TIP]
|
||||
====
|
||||
Give a short (200 word) description of the technical issue addressed.
|
||||
|
||||
* Use present tense - describe what the proposal "does" (as if it were already done) not what it will do.
|
||||
* Do not go into technical details, those go in the Specification section.
|
||||
* Do not talk about history or why this needs to be done, that is part of Motivation section.
|
||||
====
|
||||
Fundamental to any task orchestration engine, such as Otto, is the allocation
|
||||
of resources for the execution of tasks. Matching tasks to resources is simple
|
||||
in small environments where one might have a single orchestrator and only a few
|
||||
resources, e.g. virtual machines, capable of executing tasks. More complex task
|
||||
workloads require increasingly complex approaches for efficient allocation and
|
||||
utilization of resources available to the task orchestration engine. This
|
||||
document describes the approach taken by Otto, wherein tasks are "auctioned" to
|
||||
resources or orchestrators which can maximize utilization (saturation of
|
||||
resource) while minimizing cost (time to execute task, operational expenditure
|
||||
of resource).
|
||||
|
||||
== Specification
|
||||
|
||||
[TIP]
|
||||
====
|
||||
Provide a detailed specification what is being proposed. Be as technical and
|
||||
detailed as needed to allow new or existing developers to reasonably understand
|
||||
the scope/impact of an implementation.
|
||||
Auction-based Resource Allocation requires at minimum three system components
|
||||
in order to operate properly: the Eventbus, the Auctioneer, and an
|
||||
Orchestrator. The Auctioneer manages the bidding on tasks and ultimately is
|
||||
responsible for evaluating which bid has the lowest cost to execute the task.
|
||||
Resource cost is a coupling of the underlying operational cost of the resource,
|
||||
e.g. Compute/Hour, and the Orhcestrator's estimated time to execute the task.
|
||||
|
||||
* Use present tense - describe what the proposal "does" (as if it were already done) not what it will do.
|
||||
* Do not discuss alternative designs that were rejected, those belong in the Reasoning section.
|
||||
* Avoid in-depth discussion or justification of design choices, that belongs in the Reasoning section.
|
||||
|
||||
This specification will _not_ describe the actual execution of the task, which
|
||||
may be carried out on an Agent, at the behest of an Orchestrator, or executed by
|
||||
the Orchestrator itself.
|
||||
|
||||
Tasks in the system are also _not_ generated by the Auctioneer, but are instead
|
||||
expected to be published to the Eventbus by another service.
|
||||
|
||||
|
||||
=== Auctioneer
|
||||
|
||||
Task auctions are meant to be fast, lightweight, and not 100% perfect. The
|
||||
Auctioneer plays the role of operating a quick auction for each task that it
|
||||
receives. The Auctioneers uses a configured auction duration to determine how
|
||||
much time to allow each auction to exist.
|
||||
|
||||
[NOTE]
|
||||
====
|
||||
The Auctioneer does not generate the tasks in the system, that responsibility
|
||||
is outside of the purview of this document.
|
||||
====
|
||||
|
||||
For example a task `A` arrives in `tasks.for_auction`. The Auctioneer processes
|
||||
the task and creates its internal representation for the auction before
|
||||
announcing the task auction on `tasks.auction`. The various Orchestrators
|
||||
consuming from `tasks.auction` may then consider the contents of the
|
||||
<<task-auction, auction format>> in order to determine whether they can/should create a bid,
|
||||
which they submit onto `tasks.bids`.
|
||||
|
||||
The Auctioneer listens on `tasks.bids` for bids on all open auctions, for the
|
||||
example task `A`, it would see zero or more bids for `A`. Once the configured
|
||||
auction duration elapses, the Auctioneer chooses the most cost-effective bid
|
||||
and then writes a "auction won" message into the inbox (`inbox.<clientId>`) for
|
||||
the Orchestrator whose bid won.
|
||||
|
||||
The Auctioneer maintains a list of currently "open" auctions for tasks, and
|
||||
reports via a web interface on the status of these auctions.
|
||||
|
||||
|
||||
[CAUTION]
|
||||
====
|
||||
*Reliability concern*: What happens if an Orchestrator wins a bid, but then is
|
||||
unable to actually _start_ working on the task? Should it be cancelled? How
|
||||
would the Auctioneer handle this?
|
||||
====
|
||||
|
||||
[[task-auction]]
|
||||
==== Task Auction Format
|
||||
|
||||
The format of the message announcing the task auction is described as follows:
|
||||
|
||||
[source,json]
|
||||
----
|
||||
{
|
||||
"task" : {
|
||||
"raw" : [full task definition] <1>
|
||||
"capabilities" : { <2>
|
||||
}
|
||||
},
|
||||
"auction" : {
|
||||
"starts" : "1970-01-01" <3>
|
||||
"ends" : "1970-01-01" <4>
|
||||
},
|
||||
}
|
||||
----
|
||||
<1> The full format of a task definition is not subject of this specification.
|
||||
<2> Key-value listing of <<capabilities, task capabilities>> requested for execution of the task.
|
||||
<3> The ISO-8601 formatted timestamp of when the auction was opened
|
||||
<4> The ISO-8601 formatted timestamp of when the auction will close.
|
||||
|
||||
|
||||
=== Eventbus
|
||||
|
||||
The implementation and specifics of the Eventbus are not described in this
|
||||
document. For our purposes however it is important to describe the channels
|
||||
which are required for the resource auction to operate:
|
||||
|
||||
|
||||
.Channels
|
||||
|===
|
||||
| Channel name | Stateful | Purpose
|
||||
|
||||
| `tasks.for_auction`
|
||||
| ✓
|
||||
| Tasks which have not yet been auctioned, primarily used by the Auctioneer
|
||||
|
||||
| `tasks.auction`
|
||||
| ✓
|
||||
| Tasks which are available to be bid upon by Orchestrators.
|
||||
|
||||
| `tasks.bids`
|
||||
| ✓
|
||||
| Task bids by the various Orchestrators.
|
||||
|
||||
| `inbox.<clientId`
|
||||
| ✓
|
||||
| Channel representing the private inbox of a given client. This channel is
|
||||
where rewarded bids will be dispatched.
|
||||
|
||||
| `tasks.started`
|
||||
| x
|
||||
| Informational channel for tasks which are being executed.
|
||||
|
||||
| `tasks.finished`
|
||||
| x
|
||||
| Informational channel for tasks which are finished executing.
|
||||
|
||||
|===
|
||||
|
||||
=== Orchestrator
|
||||
|
||||
The role of "Orchestrator" in the auction process can be served by a service
|
||||
whose sole responsibility is to bid and provision agents, *or* it could be
|
||||
served by an Agent itself. Standalone Orchestrators might take the form of an
|
||||
"EC2 Orchestrator" which can dynamically provision resources in AWS EC2. An
|
||||
Agent-Orchestrator, an Agent which acts as an Orchestrator, in contrast would
|
||||
be a long-lived resource, like the proverbial build machine under somebody's
|
||||
desk.
|
||||
|
||||
|
||||
Both forms of Orchestrators are responsible for determining their
|
||||
**capabilities**. These capabilities will help the Orchestrator determine
|
||||
whether or not it should bid for a certain task which is up for auction. For
|
||||
example, resources which are capable of running Docker containers would be able
|
||||
ot bid on tasks which require containers. A resource which cannot provide
|
||||
`sudo` access or admin privileges would in contrast avoid bidding on tasks
|
||||
which require escalated privileges for execution.
|
||||
|
||||
Both forms of Orchestrators should listen to the `tasks.auction` channel in
|
||||
additional to their "personal" inbox channel.
|
||||
|
||||
|
||||
[[capabilities]]
|
||||
.Suggested Capabilities
|
||||
|===
|
||||
| Capability | Values | Notes
|
||||
|
||||
| `cores`
|
||||
| `integer > 0`
|
||||
| Number of cores necessary to run the task
|
||||
|
||||
| `memory`
|
||||
| `50M` or `1G` formated strings
|
||||
| Memory necessary to run the task
|
||||
|
||||
| `docker_run`
|
||||
| `true` / `false`
|
||||
| The resource can run a Docker container.
|
||||
|
||||
| `docker_build`
|
||||
| `true` / `false`
|
||||
| The resource has a `DOCKER_SOCK` which can be used for running `docker build`.
|
||||
|
||||
| `admin`
|
||||
| `true` / `false`
|
||||
|
||||
|===
|
||||
|
||||
|
||||
|
||||
|
||||
== Motivation
|
||||
|
||||
|
|
|
@ -6,3 +6,38 @@ implementation of Otto.
|
|||
It loosely follows the process used for
|
||||
link:https://www.python.org/dev/peps/[Python Enhancement Proposals].
|
||||
|
||||
== RFCs
|
||||
|
||||
Below is the list of RFCs:
|
||||
|
||||
|
||||
|===
|
||||
| Number | Title | Status
|
||||
|
||||
|
||||
| 0001
|
||||
| link:0001-otto-systems-design.adoc[Otto System Design]
|
||||
| Not Submitted :information_source:
|
||||
|
||||
| 0002
|
||||
| link:0002-execution-manifest.adoc[Execution Manifest]
|
||||
| Not Submitted :information_source:
|
||||
|
||||
| 0003
|
||||
| link:0003-resource-auctioning.adoc[Resource allocation by auction]
|
||||
| Draft :speech_balloon:
|
||||
|
||||
|
||||
|===
|
||||
|
||||
|
||||
== Statuses
|
||||
|
||||
* Draft :speech_balloon:
|
||||
* Deferred :hourglass:
|
||||
* Accepted :ok_hand:
|
||||
* Rejected :no_entry:
|
||||
* Withdrawn :hand:
|
||||
* Final :lock:
|
||||
* Replaced :dagger:
|
||||
* Active :smile:
|
||||
|
|
|
@ -0,0 +1,130 @@
|
|||
#!/bin/bash
|
||||
|
||||
# [shoreman](https://github.com/chrismytton/shoreman) is an
|
||||
# implementation of the **Procfile** format. Inspired by the original
|
||||
# [foreman](http://ddollar.github.com/foreman/) tool for ruby, as
|
||||
# well as [norman](https://github.com/josh/norman) for node.js.
|
||||
|
||||
# Make sure that any errors cause the script to exit immediately.
|
||||
set -eo pipefail
|
||||
[[ "$TRACE" ]] && set -x
|
||||
|
||||
# ## Usage
|
||||
|
||||
# Usage message that is displayed when `--help` is given as an argument.
|
||||
usage() {
|
||||
echo "Usage: shoreman [procfile|Procfile] [envfile|.env]"
|
||||
echo "Run Procfiles using shell."
|
||||
echo
|
||||
echo "The shoreman script reads commands from [procfile] and starts up the"
|
||||
echo "processes that it describes."
|
||||
}
|
||||
|
||||
# ## Logging
|
||||
|
||||
# For logging we want to prefix each entry with the current time, as well
|
||||
# as the process name. This takes two arguments, the name of the process
|
||||
# with its index, and then reads data from stdin, formats it, and sends it
|
||||
# to stdout.
|
||||
log() {
|
||||
local index="$2"
|
||||
local format="%s %s\t| %s"
|
||||
|
||||
# We add colors when output is a terminal. `SHOREMAN_COLORS` can override it.
|
||||
if [ -t 1 -o "$SHOREMAN_COLORS" == "always" ] \
|
||||
&& [ "$SHOREMAN_COLORS" != "never" ]; then
|
||||
# Bash colors start from 31 up to 37. We calculate what color the process
|
||||
# gets based on its index.
|
||||
local color="$((31 + (index % 7)))"
|
||||
format="\033[0;${color}m%s %s\t|\033[0m %s"
|
||||
fi
|
||||
|
||||
while read -r data
|
||||
do
|
||||
printf "$format\n" "$(date +"%H:%M:%S")" "$1" "$data"
|
||||
done
|
||||
}
|
||||
|
||||
# ## Running commands
|
||||
|
||||
# When a process is started, we want to keep track of its pid so we can
|
||||
# `kill` it when the parent process receives a signal, and so we can `wait`
|
||||
# for it to finish before exiting the parent process.
|
||||
store_pid() {
|
||||
pids="$pids $1"
|
||||
}
|
||||
|
||||
# This starts a command asynchronously and stores its pid in a list for use
|
||||
# later on in the script.
|
||||
start_command() {
|
||||
bash -c "$1" 2>&1 | log "$2" "$3" &
|
||||
pid="$(jobs -p %%)"
|
||||
store_pid "$pid"
|
||||
}
|
||||
|
||||
# ## Reading the .env file
|
||||
|
||||
# The .env file needs to be a list of assignments like in a shell script.
|
||||
# Shell-style comments are permitted.
|
||||
load_env_file() {
|
||||
local env_file=${1:-'.env'}
|
||||
|
||||
# Set a default port before loading the .env file
|
||||
export PORT=${PORT:-5000}
|
||||
|
||||
if [[ -f "$env_file" ]]; then
|
||||
export $(grep "^[^#]*=.*" "$env_file" | xargs)
|
||||
fi
|
||||
}
|
||||
|
||||
# ## Reading the Procfile
|
||||
|
||||
# The Procfile needs to be parsed to extract the process names and commands.
|
||||
# The file is given on stdin, see the `<` at the end of this while loop.
|
||||
run_procfile() {
|
||||
local procfile=${1:-'Procfile'}
|
||||
# We give each process an index to track its color. We start with 1,
|
||||
# because it corresponds to green which is easier on the eye than red (0).
|
||||
local index=1
|
||||
while read line || [[ -n "$line" ]]; do
|
||||
if [[ -z "$line" ]] || [[ "$line" == \#* ]]; then continue; fi
|
||||
local name="${line%%:*}"
|
||||
local command="${line#*:[[:space:]]}"
|
||||
start_command "$command" "${name}" "$index"
|
||||
echo "'${command}' started with pid $pid" | log "${name}" "$index"
|
||||
index=$((index + 1))
|
||||
done < "$procfile"
|
||||
}
|
||||
|
||||
# ## Cleanup
|
||||
|
||||
# When a `SIGINT`, `SIGTERM` or `EXIT` is received, this action is run, killing the
|
||||
# child processes. The sleep stops STDOUT from pouring over the prompt, it
|
||||
# should probably go at some point.
|
||||
onexit() {
|
||||
echo "SIGINT received"
|
||||
echo "sending SIGTERM to all processes"
|
||||
kill $pids
|
||||
sleep 1
|
||||
}
|
||||
|
||||
main() {
|
||||
local procfile="$1"
|
||||
local env_file="$2"
|
||||
|
||||
# If the --help option is given, show the usage message and exit.
|
||||
expr -- "$*" : ".*--help" >/dev/null && {
|
||||
usage
|
||||
exit 0
|
||||
}
|
||||
|
||||
load_env_file "$env_file"
|
||||
run_procfile "$procfile"
|
||||
|
||||
trap onexit INT TERM
|
||||
|
||||
# Wait for the children to finish executing before exiting.
|
||||
wait $pids
|
||||
}
|
||||
|
||||
main "$@"
|
Loading…
Reference in New Issue