From 4f07d919310745829548e6387a45d2d05c39b7cf Mon Sep 17 00:00:00 2001 From: c0repwn3r Date: Sat, 15 Apr 2023 20:26:28 -0400 Subject: [PATCH] marge feat/tokio-sucks --- Cargo.lock | 529 +++++++++++++++++++++++++++--------------- server/Cargo.toml | 10 +- server/src/handler.rs | 22 +- server/src/main.rs | 135 ++++++++--- server/src/manager.rs | 4 +- server/src/planet.rs | 1 - server/src/timer.rs | 84 ++----- 7 files changed, 477 insertions(+), 308 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1dfb4b4e8c3f4fc10483cf7bc128ec1f25cf4f04..a1167975b44693e296652a0dd1dd0064017439f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,6 +32,137 @@ version = "0.7.2" 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" @@ -49,12 +180,6 @@ version = "1.1.0" 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" @@ -76,6 +201,27 @@ dependencies = [ "generic-array", ] +[[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" @@ -149,6 +295,15 @@ dependencies = [ "winapi", ] +[[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" @@ -235,6 +390,22 @@ dependencies = [ "typenum", ] +[[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" @@ -278,6 +449,12 @@ dependencies = [ "libc", ] +[[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" @@ -338,6 +515,21 @@ version = "0.3.28" 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" @@ -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]] @@ -419,15 +604,6 @@ dependencies = [ "libc", ] -[[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" @@ -445,53 +621,12 @@ dependencies = [ "itoa", ] -[[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" @@ -538,6 +673,24 @@ version = "1.0.6" 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" @@ -569,6 +722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", + "value-bag", ] [[package]] @@ -595,18 +749,6 @@ dependencies = [ "autocfg", ] -[[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" @@ -685,16 +827,6 @@ dependencies = [ "libm", ] -[[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" @@ -716,6 +848,12 @@ version = "0.5.0" 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" @@ -761,6 +899,22 @@ version = "0.1.0" 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" @@ -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", ] @@ -1245,101 +1398,15 @@ version = "0.1.1" 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", @@ -1394,6 +1461,16 @@ version = "0.7.6" 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" @@ -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" @@ -1422,6 +1495,82 @@ version = "0.11.0+wasi-snapshot-preview1" 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" diff --git a/server/Cargo.toml b/server/Cargo.toml index ffcb53f24c2977e7216f3d9605cf98d491d50fe4..584708c2a55818b3aa3a4574a2969a741ac06835 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -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" } diff --git a/server/src/handler.rs b/server/src/handler.rs index 746c57019fb2f2599c3d9e4bc11d38831b5ab5fa..77d1fc00069ca2a503ac5314cfeacaa01ef0409c 100644 --- a/server/src/handler.rs +++ b/server/src/handler.rs @@ -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>, remote_addr: SocketAddr, mut rx: Receiver, mut client_tx: SplitSink, Message>, mut client_rx: SplitStream>) -> Result<(), Box> { +pub async fn handle_client(mgr: ClientManager, data: Arc>, remote_addr: SocketAddr, rx: Receiver, mut client_tx: SplitSink, Message>, mut client_rx: SplitStream>) -> Result<(), Box> { 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>, 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>, 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); } } } diff --git a/server/src/main.rs b/server/src/main.rs index 2dcd85516a891bacdba0314baa782c9dec7b0a1a..0a968ac09e175f433a1389d1a809514e3eef212c 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -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,90 @@ pub mod planet; const SCALE: f64 = 1.0; +async fn handle_request(conn: TcpStream, remote_addr: SocketAddr, mgr: ClientManager, physics_data: Arc>) { + 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>) -> Result<(), Box> { + let mut peek_buf = [0u8; 9]; + let read = conn.peek(&mut peek_buf).await?; + if read == 9 && 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, remote_addr: SocketAddr, mgr: ClientManager, physics_data: Arc>) -> Result, 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 +229,7 @@ async fn handle_request(mut request: Request, remote_addr: SocketAddr, mgr } } } +*/ lazy_static! { static ref CMGR: ClientManager = ClientManager { @@ -172,7 +255,7 @@ lazy_static! { static ref PLANETS: Arc> = 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 +263,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| { - handle_request(request, remote_addr, CMGR.clone(), DATA.clone()) - } - })) - } - }); - // make earth { let mut data_handle = DATA.write().await; @@ -209,14 +280,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())); } } diff --git a/server/src/manager.rs b/server/src/manager.rs index c19ce62bb4ad0f58ee09a7b5ee10d6b8b2860b1a..e1c208989c6b3871f8f6e1922e1028957c380905 100644 --- a/server/src/manager.rs +++ b/server/src/manager.rs @@ -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 { diff --git a/server/src/planet.rs b/server/src/planet.rs index 0451ac9230c726599d29b46749ca1fee6927a923..370cd27cfc261afd0ef06228c5a8863505af6b47 100644 --- a/server/src/planet.rs +++ b/server/src/planet.rs @@ -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; diff --git a/server/src/timer.rs b/server/src/timer.rs index 7bc8982b3145d9eaa78d33743245a0e2876d1748..9d5ab614f30993254cfd9e2d9c49eea0a0ad43ae 100644 --- a/server/src/timer.rs +++ b/server/src/timer.rs @@ -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>, world_data: Arc>) { let mut pipeline = PhysicsPipeline::new(); @@ -23,95 +24,38 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc