M Cargo.lock => Cargo.lock +339 -190
@@ 33,6 33,137 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]]
+name = "async-attributes"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb"
+dependencies = [
+ "async-lock",
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-global-executor"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "async-io",
+ "async-lock",
+ "blocking",
+ "futures-lite",
+ "once_cell",
+]
+
+[[package]]
+name = "async-io"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
+dependencies = [
+ "async-lock",
+ "autocfg",
+ "cfg-if",
+ "concurrent-queue",
+ "futures-lite",
+ "log",
+ "parking",
+ "polling",
+ "rustix",
+ "slab",
+ "socket2",
+ "waker-fn",
+]
+
+[[package]]
+name = "async-lock"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
+dependencies = [
+ "event-listener",
+]
+
+[[package]]
+name = "async-std"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
+dependencies = [
+ "async-attributes",
+ "async-channel",
+ "async-global-executor",
+ "async-io",
+ "async-lock",
+ "crossbeam-utils",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-lite",
+ "gloo-timers",
+ "kv-log-macro",
+ "log",
+ "memchr",
+ "once_cell",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+ "wasm-bindgen-futures",
+]
+
+[[package]]
+name = "async-task"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
+
+[[package]]
+name = "async-tungstenite"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6d2c69d237cf761215175f390021344f5530101cca8164d69878b8a1779e80c"
+dependencies = [
+ "futures-io",
+ "futures-util",
+ "log",
+ "pin-project-lite",
+ "tungstenite",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
+
+[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 50,12 181,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
-name = "base64"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
-
-[[package]]
name = "bit-vec"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 77,6 202,27 @@ dependencies = [
]
[[package]]
+name = "blocking"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
+dependencies = [
+ "async-channel",
+ "async-lock",
+ "async-task",
+ "atomic-waker",
+ "fastrand",
+ "futures-lite",
+ "log",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+
+[[package]]
name = "bytemuck"
version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 150,6 296,15 @@ dependencies = [
]
[[package]]
+name = "concurrent-queue"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
name = "cpufeatures"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 236,6 391,22 @@ dependencies = [
]
[[package]]
+name = "ctor"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb"
+
+[[package]]
name = "digest"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 279,6 450,12 @@ dependencies = [
]
[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
name = "fastrand"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 339,6 516,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
[[package]]
+name = "futures-lite"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
name = "futures-sink"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 386,22 578,15 @@ dependencies = [
]
[[package]]
-name = "h2"
-version = "0.3.16"
+name = "gloo-timers"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d"
+checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
dependencies = [
- "bytes",
- "fnv",
+ "futures-channel",
"futures-core",
- "futures-sink",
- "futures-util",
- "http",
- "indexmap",
- "slab",
- "tokio",
- "tokio-util",
- "tracing",
+ "js-sys",
+ "wasm-bindgen",
]
[[package]]
@@ 421,15 606,6 @@ dependencies = [
[[package]]
name = "hermit-abi"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
@@ 446,53 622,12 @@ dependencies = [
]
[[package]]
-name = "http-body"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
-dependencies = [
- "bytes",
- "http",
- "pin-project-lite",
-]
-
-[[package]]
name = "httparse"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
[[package]]
-name = "httpdate"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
-
-[[package]]
-name = "hyper"
-version = "0.14.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-core",
- "futures-util",
- "h2",
- "http",
- "http-body",
- "httparse",
- "httpdate",
- "itoa",
- "pin-project-lite",
- "socket2",
- "tokio",
- "tower-service",
- "tracing",
- "want",
-]
-
-[[package]]
name = "idna"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 539,6 674,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
[[package]]
+name = "js-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kv-log-macro"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
+dependencies = [
+ "log",
+]
+
+[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 569,6 722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
+ "value-bag",
]
[[package]]
@@ 596,18 750,6 @@ dependencies = [
]
[[package]]
-name = "mio"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
-dependencies = [
- "libc",
- "log",
- "wasi",
- "windows-sys 0.45.0",
-]
-
-[[package]]
name = "nalgebra"
version = "0.32.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 686,16 828,6 @@ dependencies = [
]
[[package]]
-name = "num_cpus"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
-dependencies = [
- "hermit-abi 0.2.6",
- "libc",
-]
-
-[[package]]
name = "num_threads"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 717,6 849,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc"
[[package]]
+name = "parking"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e"
+
+[[package]]
name = "parry2d-f64"
version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 762,6 900,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
+name = "polling"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4be1c66a6add46bff50935c313dae30a5030cf8385c5206e8a95e9e9def974aa"
+dependencies = [
+ "autocfg",
+ "bitflags",
+ "cfg-if",
+ "concurrent-queue",
+ "libc",
+ "log",
+ "pin-project-lite",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 1130,9 1284,10 @@ dependencies = [
name = "starkingdoms-server"
version = "0.0.1"
dependencies = [
+ "async-std",
+ "async-tungstenite",
"cargo_metadata",
"futures",
- "hyper",
"lazy_static",
"log",
"nalgebra",
@@ 1141,8 1296,6 @@ dependencies = [
"serde_json",
"simple_logger",
"starkingdoms-protocol",
- "tokio",
- "tokio-tungstenite",
"tungstenite",
]
@@ 1246,100 1399,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
-name = "tokio"
-version = "1.27.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
-dependencies = [
- "autocfg",
- "bytes",
- "libc",
- "mio",
- "num_cpus",
- "pin-project-lite",
- "socket2",
- "tokio-macros",
- "windows-sys 0.45.0",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.14",
-]
-
-[[package]]
-name = "tokio-tungstenite"
-version = "0.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54319c93411147bced34cb5609a80e0a8e44c5999c93903a81cd866630ec0bfd"
-dependencies = [
- "futures-util",
- "log",
- "tokio",
- "tungstenite",
-]
-
-[[package]]
-name = "tokio-util"
-version = "0.7.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2"
-dependencies = [
- "bytes",
- "futures-core",
- "futures-sink",
- "pin-project-lite",
- "tokio",
- "tracing",
-]
-
-[[package]]
-name = "tower-service"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
-
-[[package]]
-name = "tracing"
-version = "0.1.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
-dependencies = [
- "cfg-if",
- "pin-project-lite",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "try-lock"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
-
-[[package]]
name = "tungstenite"
-version = "0.18.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30ee6ab729cd4cf0fd55218530c4522ed30b7b6081752839b68fcec8d0960788"
+checksum = "15fba1a6d6bb030745759a9a2a588bfe8490fc8b4751a277db3a0be1c9ebbf67"
dependencies = [
- "base64",
"byteorder",
"bytes",
+ "data-encoding",
"http",
"httparse",
"log",
@@ 1395,6 1462,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
+name = "value-bag"
+version = "1.0.0-alpha.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
+dependencies = [
+ "ctor",
+ "version_check",
+]
+
+[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 1407,14 1484,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
-name = "want"
-version = "0.3.0"
+name = "waker-fn"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
-dependencies = [
- "log",
- "try-lock",
-]
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
[[package]]
name = "wasi"
@@ 1423,6 1496,82 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
+name = "wasm-bindgen"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+
+[[package]]
+name = "web-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
name = "which"
version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
M server/Cargo.toml => server/Cargo.toml +6 -4
@@ 10,13 10,15 @@ slp-description = "A StarKingdoms.TK server"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-tokio = { version = "1.27", features = ["macros", "sync", "rt-multi-thread"] }
+async-std = { version = "1.12.0", features = ["attributes"] }
+
serde = { version = "1", features = ["derive"] }
serde_json = "1"
futures = { version = "0.3", default-features = false }
-hyper = { version = "0.14", features = ["server", "http1", "http2", "tcp"] }
-tungstenite = { version = "0.18", default-features = false }
-tokio-tungstenite = { version = "0.18" }
+
+tungstenite = { version = "0.19.0", default-features = false }
+async-tungstenite = "0.21.0"
+
log = "0.4"
simple_logger = "4.1"
starkingdoms-protocol = { version = "0.1.0", path = "../protocol" }
M server/src/handler.rs => server/src/handler.rs +9 -13
@@ 4,13 4,9 @@ use std::sync::Arc;
use std::time::{Duration, SystemTime};
use futures::stream::{SplitSink, SplitStream};
use futures::{FutureExt, SinkExt, StreamExt};
-use hyper::upgrade::Upgraded;
use log::{debug, error, info};
-use nalgebra::{vector, point};
-use rapier2d_f64::prelude::{RigidBodyBuilder, RigidBodyType, ColliderBuilder, MassProperties};
-use tokio::sync::RwLock;
-use tokio::sync::mpsc::Receiver;
-use tokio_tungstenite::WebSocketStream;
+use nalgebra::vector;
+use rapier2d_f64::prelude::{RigidBodyBuilder, RigidBodyType, ColliderBuilder};
use tungstenite::Message;
use starkingdoms_protocol::goodbye_reason::GoodbyeReason;
use starkingdoms_protocol::message_s2c::{MessageS2CChat, MessageS2CGoodbye, MessageS2CHello, MessageS2CPlanetData, MessageS2CPlayersUpdate, MessageS2CPong};
@@ 18,15 14,17 @@ use starkingdoms_protocol::{MessageS2C, MessageC2S, PROTOCOL_VERSION};
use starkingdoms_protocol::state::State;
use crate::manager::{ClientHandlerMessage, ClientManager, PhysicsData, Player};
use crate::{send, recv, SCALE};
+use async_std::{sync::RwLock, channel::Receiver};
+use async_std::net::TcpStream;
+use async_tungstenite::WebSocketStream;
-pub async fn handle_client(mgr: ClientManager, data: Arc<RwLock<PhysicsData>>, remote_addr: SocketAddr, mut rx: Receiver<ClientHandlerMessage>, mut client_tx: SplitSink<WebSocketStream<Upgraded>, Message>, mut client_rx: SplitStream<WebSocketStream<Upgraded>>) -> Result<(), Box<dyn Error>> {
+pub async fn handle_client(mgr: ClientManager, data: Arc<RwLock<PhysicsData>>, remote_addr: SocketAddr, rx: Receiver<ClientHandlerMessage>, mut client_tx: SplitSink<WebSocketStream<TcpStream>, Message>, mut client_rx: SplitStream<WebSocketStream<TcpStream>>) -> Result<(), Box<dyn Error>> {
let mut state = State::Handshake;
let mut username = String::new();
let mut ping_timeout = SystemTime::now() + Duration::from_secs(10);
loop {
-
- if let Some(msg) = rx.recv().await {
+ if let Ok(msg) = rx.recv().await {
match msg {
ClientHandlerMessage::Tick => {} // this intentionally does nothing,
ClientHandlerMessage::ChatMessage { from, message } => {
@@ 140,10 138,7 @@ pub async fn handle_client(mgr: ClientManager, data: Arc<RwLock<PhysicsData>>, r
let player_body = RigidBodyBuilder::new(RigidBodyType::Dynamic)
.translation(vector![0.0, 2100.0/SCALE])
.build();
- let player_collider = ColliderBuilder::cuboid(25.0 / SCALE, 25.0 / SCALE)
- //.mass_properties(MassProperties::new(point![0.0, 0.0], 75.0, 2000.0))
- .mass(75.0)
- .build();
+ let player_collider = ColliderBuilder::cuboid(25.0 / SCALE, 25.0 / SCALE).build();
let player_handle = rigid_body_set.insert(player_body);
collider_set.insert_with_parent(player_collider, player_handle, &mut rigid_body_set);
@@ 210,6 205,7 @@ pub async fn handle_client(mgr: ClientManager, data: Arc<RwLock<PhysicsData>>, r
me.input.down = p.down_pressed;
me.input.left = p.left_pressed;
me.input.right = p.right_pressed;
+ debug!("{} {} {} {}", me.input.up, me.input.down, me.input.left, me.input.right);
}
}
}
M server/src/main.rs => server/src/main.rs +114 -28
@@ 1,23 1,21 @@
-use std::convert::Infallible;
+use std::error::Error;
use std::net::SocketAddr;
-use std::sync::Arc;
-use hyper::{Body, header, Request, Response, Server, server::conn::AddrStream, StatusCode, upgrade};
-use hyper::service::{make_service_fn, service_fn};
+use async_std::io::WriteExt;
+use async_std::sync::Arc;
+use async_std::net::{TcpListener, TcpStream};
use manager::PhysicsData;
use nalgebra::vector;
use planet::Planets;
use rapier2d_f64::prelude::{MultibodyJointSet, ImpulseJointSet, ColliderSet, RigidBodySet, NarrowPhase, BroadPhase, IslandManager, CCDSolver, IntegrationParameters};
-use tokio_tungstenite::WebSocketStream;
-use tungstenite::{handshake};
-use futures::stream::StreamExt;
use lazy_static::lazy_static;
-use log::{error, info, Level};
+use log::{error, info, Level, warn};
use serde::{Deserialize, Serialize};
-use tokio::sync::RwLock;
-use starkingdoms_protocol::{PROTOCOL_VERSION};
use crate::manager::{ClientHandler, ClientManager};
-use crate::handler::handle_client;
use crate::timer::timer_main;
+use async_std::sync::RwLock;
+use futures::StreamExt;
+use starkingdoms_protocol::PROTOCOL_VERSION;
+use crate::handler::handle_client;
pub mod handler;
pub mod manager;
@@ 28,6 26,97 @@ pub mod planet;
const SCALE: f64 = 1.0;
+async fn handle_request(conn: TcpStream, remote_addr: SocketAddr, mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData>>) {
+ match _handle_request(conn, remote_addr, mgr, physics_data).await {
+ Ok(_) => (),
+ Err(e) => {
+ error!("[{}] error in handler thread: {}", remote_addr, e);
+ }
+ }
+}
+
+async fn _handle_request(mut conn: TcpStream, remote_addr: SocketAddr, mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData>>) -> Result<(), Box<dyn Error>> {
+ let mut peek_buf = [0u8; 9];
+
+ loop {
+ let read = conn.peek(&mut peek_buf).await?;
+ if read == 9 {
+ break;
+ }
+ }
+
+ if peek_buf == *b"GET /ping" {
+ info!("[{}] incoming http connection", remote_addr);
+ let ping_resp = serde_json::to_string(&ServerPingResponse {
+ version: ServerPingResponseVersion {
+ name: env!("STK_VERSION_NAME").to_string(), // Set by build.rs
+ number: env!("STK_VERSION").to_string(), // Set by build.rs
+ protocol: PROTOCOL_VERSION,
+ },
+ players: CMGR.usernames.read().await.len() as u32,
+ description: env!("STK_SLP_DESCRIPTION").to_string(),
+ }).unwrap();
+
+ let resp_str = format!("HTTP/1.0 200 OK\nAccess-Control-Allow-Origin: *\nContent-Length: {}\n\n{}", ping_resp.len(), ping_resp);
+ let http_resp = resp_str.as_bytes();
+
+ conn.write_all(http_resp).await?;
+ info!("[{}] sent ping response (200 OK {} bytes)", remote_addr, ping_resp.len());
+ return Ok(());
+ }
+ info!("[{}] incoming websocket connection", remote_addr);
+
+ // if its not GET /ping, assume its websocket and attempt to handshake with them
+ let ws_stream = async_tungstenite::accept_async(conn).await?;
+
+ let (ws_write, ws_read) = ws_stream.split();
+
+ let (tx, rx) = async_std::channel::unbounded();
+
+ let client = ClientHandler { tx };
+
+ // Acquire the write lock in a small scope, so it's dropped as quickly as possible
+ {
+ mgr.handlers.write().await.insert(remote_addr, client);
+ }
+
+ info!("[{}] passing to client handler", remote_addr);
+
+ //forward the stream to the sink to achieve echo
+ handle_client(mgr.clone(), physics_data.clone(), remote_addr, rx, ws_write, ws_read).await?;
+
+ // clean up values left over
+ {
+ mgr.handlers.write().await.remove(&remote_addr);
+ mgr.usernames.write().await.remove(&remote_addr);
+ // remove player physics body
+ let mut data = physics_data.write().await;
+ let mut rigid_body_set = data.rigid_body_set.clone();
+ let mut island_manager = data.island_manager.clone();
+ let mut collider_set = data.collider_set.clone();
+ let mut impulse_joint_set = data.impulse_joint_set.clone();
+ let mut multibody_joint_set = data.multibody_joint_set.clone();
+ let handle = match mgr.players.read().await.get(&remote_addr) {
+ Some(s) => s.handle,
+ None => {
+ warn!("[{}] player missing from mgr.players", remote_addr);
+ return Err("Player missing from mgr.players".into());
+ }
+ };
+ rigid_body_set.remove(handle, &mut island_manager, &mut collider_set,
+ &mut impulse_joint_set, &mut multibody_joint_set, true);
+ data.rigid_body_set = rigid_body_set;
+ data.collider_set = collider_set;
+ data.island_manager = island_manager;
+ data.impulse_joint_set = impulse_joint_set;
+ data.multibody_joint_set = multibody_joint_set;
+ mgr.players.write().await.remove(&remote_addr);
+ }
+
+ Ok(())
+}
+
+/*
async fn handle_request(mut request: Request<Body>, remote_addr: SocketAddr, mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData>>) -> Result<Response<Body>, Infallible> {
match (request.uri().path(), request.headers().contains_key(header::UPGRADE)) {
//if the request is ws_echo and the request headers contains an Upgrade key
@@ 147,6 236,7 @@ async fn handle_request(mut request: Request<Body>, remote_addr: SocketAddr, mgr
}
}
}
+*/
lazy_static! {
static ref CMGR: ClientManager = ClientManager {
@@ 172,7 262,7 @@ lazy_static! {
static ref PLANETS: Arc<RwLock<Planets>> = Arc::new(RwLock::new(Planets::default()));
}
-#[tokio::main]
+#[async_std::main]
async fn main() {
simple_logger::init_with_level(Level::Debug).expect("Unable to start logging service");
@@ 180,18 270,6 @@ async fn main() {
info!("Listening on {} for HTTP/WebSocket connections", addr);
- let make_svc = make_service_fn(|conn: &AddrStream| {
- let remote_addr = conn.remote_addr();
-
- async move {
- Ok::<_, Infallible>(service_fn({
- move |request: Request<Body>| {
- handle_request(request, remote_addr, CMGR.clone(), DATA.clone())
- }
- }))
- }
- });
-
// make earth
{
let mut data_handle = DATA.write().await;
@@ 209,14 287,22 @@ async fn main() {
let mgr_timer = CMGR.clone();
let physics_data = DATA.clone();
let world_data = PLANETS.clone();
- let _timer_thread = tokio::spawn(async move {
+ let _timer_thread = async_std::task::spawn(async move {
timer_main(mgr_timer, physics_data, world_data).await;
});
- let server = Server::bind(&addr).serve(make_svc);
+ let try_socket = TcpListener::bind(&addr).await;
+
+ let listener = match try_socket {
+ Ok(l) => l,
+ Err(e) => {
+ error!("error binding to socket: {}", e);
+ std::process::exit(1);
+ }
+ };
- if let Err(e) = server.await {
- error!("error in server thread: {}", e);
+ while let Ok((stream, peer_addr)) = listener.accept().await {
+ async_std::task::spawn(handle_request(stream, peer_addr, CMGR.clone(), DATA.clone()));
}
}
M server/src/manager.rs => server/src/manager.rs +2 -2
@@ 3,8 3,8 @@ use std::net::SocketAddr;
use std::sync::Arc;
use rapier2d_f64::na::{Vector2};
use rapier2d_f64::prelude::{IntegrationParameters, PhysicsPipeline, IslandManager, BroadPhase, NarrowPhase, ImpulseJointSet, MultibodyJointSet, CCDSolver, RigidBodySet, ColliderSet, RigidBodyHandle};
-use tokio::sync::mpsc::Sender;
-use tokio::sync::RwLock;
+use async_std::sync::RwLock;
+use async_std::channel::Sender;
#[derive(Clone)]
pub struct ClientManager {
M server/src/planet.rs => server/src/planet.rs +0 -1
@@ 1,4 1,3 @@
-use log::debug;
use nalgebra::{Vector2, vector};
use rapier2d_f64::prelude::{RigidBodyHandle, RigidBodySet, ColliderBuilder, RigidBodyBuilder, ColliderSet};
use starkingdoms_protocol::planet::PlanetType;
M server/src/timer.rs => server/src/timer.rs +25 -71
@@ 1,13 1,14 @@
use std::{time::Duration, sync::Arc};
-use log::{debug, error};
-use nalgebra::{vector, point, Vector2};
+use log::{error};
+use nalgebra::vector;
use rapier2d_f64::prelude::{PhysicsPipeline};
-use tokio::{time::sleep, sync::RwLock};
+use async_std::sync::RwLock;
+use async_std::task::sleep;
use starkingdoms_protocol::player::Player;
use crate::{manager::{ClientHandlerMessage, ClientManager, PhysicsData}, SCALE, planet::Planets};
-pub const ROTATIONAL_FORCE: f64 = 200.0;
-pub const LATERAL_FORCE: f64 = 80.0;
+pub const ROTATIONAL_FORCE: f64 = 100.0;
+pub const LATERAL_FORCE: f64 = 100.0;
pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData>>, world_data: Arc<RwLock<Planets>>) {
let mut pipeline = PhysicsPipeline::new();
@@ 23,95 24,38 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData
let mut physics_data = physics_data.write().await;
let player_handle = player.handle;
let player_body = physics_data.rigid_body_set.get_mut(player_handle).unwrap();
- player_body.reset_forces(true);
- player_body.reset_torques(true);
let planets = world_data.read().await;
let grav_force = planets.gravity((player_body.translation().x, player_body.translation().y), player_body.mass());
- player_body.apply_impulse(vector![grav_force.0, grav_force.1], true);
+ player_body.add_force(vector![grav_force.0, grav_force.1], true);
let mut torque = 0.0;
- let mut left_top_thruster: f64 = 0.0;
- let mut right_top_thruster: f64 = 0.0;
- let mut left_bottom_thruster: f64 = 0.0;
- let mut right_bottom_thruster: f64 = 0.0;
if player.input.right {
torque += ROTATIONAL_FORCE;
- left_top_thruster -= 1.0;
- right_bottom_thruster += 1.0;
}
if player.input.left {
torque -= ROTATIONAL_FORCE;
- right_top_thruster -= 1.0;
- left_bottom_thruster += 1.0;
}
- //player_body.apply_torque_impulse(torque, true);
+ player_body.add_torque(torque, true);
let mut lateral = vector![0.0, 0.0];
if player.input.up {
lateral -= vector![0.0, LATERAL_FORCE];
- left_bottom_thruster -= 1.0;
- right_bottom_thruster -= 1.0;
}
if player.input.down {
lateral += vector![0.0, LATERAL_FORCE];
- left_top_thruster += 1.0;
- right_top_thruster += 1.0;
}
- left_top_thruster = LATERAL_FORCE * left_top_thruster.clamp(-1.0, 1.0);
- right_top_thruster = LATERAL_FORCE * right_top_thruster.clamp(-1.0, 1.0);
- left_bottom_thruster = LATERAL_FORCE * left_bottom_thruster.clamp(-1.0, 1.0);
- right_bottom_thruster = LATERAL_FORCE * right_bottom_thruster.clamp(-1.0, 1.0);
let rotation = player_body.rotation().clone().angle();
- let left_top_thruster = vector![
- -left_top_thruster * rotation.sin(),
- left_top_thruster * rotation.cos()
- ];
- let right_top_thruster = vector![
- -right_top_thruster * rotation.sin(),
- right_top_thruster * rotation.cos()
- ];
- let left_bottom_thruster = vector![
- -left_bottom_thruster * rotation.sin(),
- left_bottom_thruster * rotation.cos()
- ];
- let right_bottom_thruster = vector![
- -right_bottom_thruster * rotation.sin(),
- right_bottom_thruster * rotation.cos()
+
+ let lateral_rotated = vector![
+ lateral.x * rotation.cos() - lateral.y * rotation.sin(),
+ lateral.x * rotation.sin() + lateral.y * rotation.cos()
];
- let scale = SCALE as f64;
- let top_left_point = point![
- -25. / scale * rotation.cos() +25. / scale * rotation.sin(),
- -25. / scale * rotation.sin() -25. / scale * rotation.cos()
- ] + player_body.translation();
- let top_right_point = point![
- 25. / scale * rotation.cos() +25. / scale * rotation.sin(),
- 25. / scale * rotation.sin() -25. / scale * rotation.cos()
- ] + player_body.translation();
- let bottom_left_point = point![
- -25. / scale * rotation.cos() -25. / scale * rotation.sin(),
- -25. / scale * rotation.sin() +25. / scale * rotation.cos()
- ] + player_body.translation();
- let bottom_right_point = point![
- 25. / scale * rotation.cos() -25. / scale * rotation.sin(),
- 25. / scale * rotation.sin() +25. / scale * rotation.cos()
- ] + player_body.translation();
-
- player_body.add_force_at_point(
- left_top_thruster,
- top_left_point, true);
- player_body.add_force_at_point(
- right_top_thruster,
- top_right_point, true);
- player_body.add_force_at_point(
- left_bottom_thruster,
- bottom_left_point, true);
- player_body.add_force_at_point(
- right_bottom_thruster,
- bottom_right_point, true);
+
+ player_body.add_force(lateral_rotated, true);
let translation = player_body.translation();
@@ 132,7 76,12 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData
}
}
- for (_addr, client_thread) in mgr.handlers.read().await.iter() {
+ let mut to_remove = vec![];
+
+ let mut mgr_w = mgr.handlers.write().await;
+ let mgr_r = mgr_w.clone();
+
+ for (addr, client_thread) in mgr_r.iter() {
match client_thread.tx.send(ClientHandlerMessage::Tick).await {
Ok(_) => {
match client_thread.tx.send(ClientHandlerMessage::PlayersUpdate {players: protocol_players.clone()}).await {
@@ 153,8 102,13 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData
}
Err(e) => {
error!("unable to update a client thread: {}", e);
+ to_remove.push(addr);
}
}
}
+
+ for pending_removal in to_remove {
+ mgr_w.remove(pending_removal);
+ }
}
}