commit
54c5f5c045
7 changed files with 852 additions and 0 deletions
-
1.gitignore
-
603Cargo.lock
-
12Cargo.toml
-
93src/main.rs
-
54src/msqw.rs
-
32static/index.html
-
57static/index.js
@ -0,0 +1 @@ |
|||
/target |
@ -0,0 +1,603 @@ |
|||
# This file is automatically @generated by Cargo. |
|||
# It is not intended for manual editing. |
|||
version = 3 |
|||
|
|||
[[package]] |
|||
name = "aho-corasick" |
|||
version = "0.7.18" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" |
|||
dependencies = [ |
|||
"memchr", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "atty" |
|||
version = "0.2.14" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" |
|||
dependencies = [ |
|||
"hermit-abi", |
|||
"libc", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "autocfg" |
|||
version = "1.0.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" |
|||
|
|||
[[package]] |
|||
name = "bitflags" |
|||
version = "1.3.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" |
|||
|
|||
[[package]] |
|||
name = "bytes" |
|||
version = "1.1.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" |
|||
|
|||
[[package]] |
|||
name = "cfg-if" |
|||
version = "1.0.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" |
|||
|
|||
[[package]] |
|||
name = "env_logger" |
|||
version = "0.7.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" |
|||
dependencies = [ |
|||
"atty", |
|||
"humantime", |
|||
"log", |
|||
"regex", |
|||
"termcolor", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "fnv" |
|||
version = "1.0.7" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" |
|||
|
|||
[[package]] |
|||
name = "futures-channel" |
|||
version = "0.3.17" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" |
|||
dependencies = [ |
|||
"futures-core", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "futures-core" |
|||
version = "0.3.17" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" |
|||
|
|||
[[package]] |
|||
name = "futures-sink" |
|||
version = "0.3.17" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" |
|||
|
|||
[[package]] |
|||
name = "futures-task" |
|||
version = "0.3.17" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" |
|||
|
|||
[[package]] |
|||
name = "futures-util" |
|||
version = "0.3.17" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" |
|||
dependencies = [ |
|||
"autocfg", |
|||
"futures-core", |
|||
"futures-task", |
|||
"pin-project-lite", |
|||
"pin-utils", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "h2" |
|||
version = "0.3.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" |
|||
dependencies = [ |
|||
"bytes", |
|||
"fnv", |
|||
"futures-core", |
|||
"futures-sink", |
|||
"futures-util", |
|||
"http", |
|||
"indexmap", |
|||
"slab", |
|||
"tokio", |
|||
"tokio-util", |
|||
"tracing", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "hashbrown" |
|||
version = "0.11.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" |
|||
|
|||
[[package]] |
|||
name = "hermit-abi" |
|||
version = "0.1.19" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" |
|||
dependencies = [ |
|||
"libc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "http" |
|||
version = "0.2.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" |
|||
dependencies = [ |
|||
"bytes", |
|||
"fnv", |
|||
"itoa", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "http-body" |
|||
version = "0.4.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" |
|||
dependencies = [ |
|||
"bytes", |
|||
"http", |
|||
"pin-project-lite", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "httparse" |
|||
version = "1.5.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" |
|||
|
|||
[[package]] |
|||
name = "httpdate" |
|||
version = "1.0.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" |
|||
|
|||
[[package]] |
|||
name = "humantime" |
|||
version = "1.3.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" |
|||
dependencies = [ |
|||
"quick-error", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "hyper" |
|||
version = "0.14.12" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "13f67199e765030fa08fe0bd581af683f0d5bc04ea09c2b1102012c5fb90e7fd" |
|||
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 = "indexmap" |
|||
version = "1.7.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" |
|||
dependencies = [ |
|||
"autocfg", |
|||
"hashbrown", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "instant" |
|||
version = "0.1.10" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" |
|||
dependencies = [ |
|||
"cfg-if", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "itoa" |
|||
version = "0.4.8" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" |
|||
|
|||
[[package]] |
|||
name = "lazy_static" |
|||
version = "1.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" |
|||
|
|||
[[package]] |
|||
name = "libc" |
|||
version = "0.2.101" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" |
|||
|
|||
[[package]] |
|||
name = "lock_api" |
|||
version = "0.4.5" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" |
|||
dependencies = [ |
|||
"scopeguard", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "log" |
|||
version = "0.4.14" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" |
|||
dependencies = [ |
|||
"cfg-if", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "memchr" |
|||
version = "2.4.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" |
|||
|
|||
[[package]] |
|||
name = "mio" |
|||
version = "0.7.13" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" |
|||
dependencies = [ |
|||
"libc", |
|||
"log", |
|||
"miow", |
|||
"ntapi", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "miow" |
|||
version = "0.3.7" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" |
|||
dependencies = [ |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "ntapi" |
|||
version = "0.3.6" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" |
|||
dependencies = [ |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "num_cpus" |
|||
version = "1.13.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" |
|||
dependencies = [ |
|||
"hermit-abi", |
|||
"libc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "once_cell" |
|||
version = "1.8.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" |
|||
|
|||
[[package]] |
|||
name = "parking_lot" |
|||
version = "0.11.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" |
|||
dependencies = [ |
|||
"instant", |
|||
"lock_api", |
|||
"parking_lot_core", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "parking_lot_core" |
|||
version = "0.8.5" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" |
|||
dependencies = [ |
|||
"cfg-if", |
|||
"instant", |
|||
"libc", |
|||
"redox_syscall", |
|||
"smallvec", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "pin-project-lite" |
|||
version = "0.2.7" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" |
|||
|
|||
[[package]] |
|||
name = "pin-utils" |
|||
version = "0.1.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" |
|||
|
|||
[[package]] |
|||
name = "pretty_env_logger" |
|||
version = "0.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" |
|||
dependencies = [ |
|||
"env_logger", |
|||
"log", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "proc-macro2" |
|||
version = "1.0.29" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" |
|||
dependencies = [ |
|||
"unicode-xid", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "quick-error" |
|||
version = "1.2.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" |
|||
|
|||
[[package]] |
|||
name = "quote" |
|||
version = "1.0.9" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" |
|||
dependencies = [ |
|||
"proc-macro2", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "random" |
|||
version = "0.1.0" |
|||
dependencies = [ |
|||
"hyper", |
|||
"pretty_env_logger", |
|||
"tokio", |
|||
"tokio-util", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "redox_syscall" |
|||
version = "0.2.10" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" |
|||
dependencies = [ |
|||
"bitflags", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "regex" |
|||
version = "1.5.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" |
|||
dependencies = [ |
|||
"aho-corasick", |
|||
"memchr", |
|||
"regex-syntax", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "regex-syntax" |
|||
version = "0.6.25" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" |
|||
|
|||
[[package]] |
|||
name = "scopeguard" |
|||
version = "1.1.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" |
|||
|
|||
[[package]] |
|||
name = "signal-hook-registry" |
|||
version = "1.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" |
|||
dependencies = [ |
|||
"libc", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "slab" |
|||
version = "0.4.4" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" |
|||
|
|||
[[package]] |
|||
name = "smallvec" |
|||
version = "1.6.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" |
|||
|
|||
[[package]] |
|||
name = "socket2" |
|||
version = "0.4.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" |
|||
dependencies = [ |
|||
"libc", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "syn" |
|||
version = "1.0.76" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84" |
|||
dependencies = [ |
|||
"proc-macro2", |
|||
"quote", |
|||
"unicode-xid", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "termcolor" |
|||
version = "1.1.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" |
|||
dependencies = [ |
|||
"winapi-util", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "tokio" |
|||
version = "1.11.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "b4efe6fc2395938c8155973d7be49fe8d03a843726e285e100a8a383cc0154ce" |
|||
dependencies = [ |
|||
"autocfg", |
|||
"bytes", |
|||
"libc", |
|||
"memchr", |
|||
"mio", |
|||
"num_cpus", |
|||
"once_cell", |
|||
"parking_lot", |
|||
"pin-project-lite", |
|||
"signal-hook-registry", |
|||
"tokio-macros", |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "tokio-macros" |
|||
version = "1.3.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" |
|||
dependencies = [ |
|||
"proc-macro2", |
|||
"quote", |
|||
"syn", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "tokio-util" |
|||
version = "0.6.8" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" |
|||
dependencies = [ |
|||
"bytes", |
|||
"futures-core", |
|||
"futures-sink", |
|||
"log", |
|||
"pin-project-lite", |
|||
"tokio", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "tower-service" |
|||
version = "0.3.1" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" |
|||
|
|||
[[package]] |
|||
name = "tracing" |
|||
version = "0.1.26" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" |
|||
dependencies = [ |
|||
"cfg-if", |
|||
"pin-project-lite", |
|||
"tracing-core", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "tracing-core" |
|||
version = "0.1.19" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "2ca517f43f0fb96e0c3072ed5c275fe5eece87e8cb52f4a77b69226d3b1c9df8" |
|||
dependencies = [ |
|||
"lazy_static", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "try-lock" |
|||
version = "0.2.3" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" |
|||
|
|||
[[package]] |
|||
name = "unicode-xid" |
|||
version = "0.2.2" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" |
|||
|
|||
[[package]] |
|||
name = "want" |
|||
version = "0.3.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" |
|||
dependencies = [ |
|||
"log", |
|||
"try-lock", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "winapi" |
|||
version = "0.3.9" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" |
|||
dependencies = [ |
|||
"winapi-i686-pc-windows-gnu", |
|||
"winapi-x86_64-pc-windows-gnu", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "winapi-i686-pc-windows-gnu" |
|||
version = "0.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" |
|||
|
|||
[[package]] |
|||
name = "winapi-util" |
|||
version = "0.1.5" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" |
|||
dependencies = [ |
|||
"winapi", |
|||
] |
|||
|
|||
[[package]] |
|||
name = "winapi-x86_64-pc-windows-gnu" |
|||
version = "0.4.0" |
|||
source = "registry+https://github.com/rust-lang/crates.io-index" |
|||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" |
@ -0,0 +1,12 @@ |
|||
[package] |
|||
name = "random" |
|||
version = "0.1.0" |
|||
edition = "2021" |
|||
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
|||
|
|||
[dependencies] |
|||
hyper = { version = "^0.14", features = ["full"] } |
|||
tokio = { version = "^1", features = ["full"] } |
|||
tokio-util = "^0.6.8" |
|||
pretty_env_logger = "0.4" |
@ -0,0 +1,93 @@ |
|||
use std::sync::Arc;
|
|||
|
|||
use hyper::{Body, Method, Request, Response, Server, StatusCode, service::{make_service_fn, service_fn}};
|
|||
use tokio::{fs::File, sync::Mutex};
|
|||
use tokio_util::codec::{BytesCodec, FramedRead};
|
|||
|
|||
use crate::msqw::MSQW;
|
|||
|
|||
mod msqw;
|
|||
|
|||
type GenericError = Box<dyn std::error::Error + Send + Sync>;
|
|||
type Result<T> = std::result::Result<T, GenericError>;
|
|||
|
|||
static NOTFOUND: &[u8] = b"Not Found";
|
|||
|
|||
async fn bits_api(
|
|||
pool: Arc<Mutex<MSQW>>,
|
|||
req: Request<Body>
|
|||
) -> Result<Response<Body>> {
|
|||
match (req.method(), req.uri().path()) {
|
|||
(&Method::GET, "/") => simple_file_send("static/index.html").await,
|
|||
(&Method::GET, "/index.js") => simple_file_send("static/index.js").await,
|
|||
(&Method::GET, "/bits") => api_get_bits(pool).await,
|
|||
(&Method::POST, "/zero") => api_post_zero(pool).await,
|
|||
(&Method::POST, "/one") => api_post_one(pool).await,
|
|||
_ => {
|
|||
// Return 404 not found response.
|
|||
Ok(not_found())
|
|||
}
|
|||
}
|
|||
}
|
|||
|
|||
async fn api_get_bits(pool: Arc<Mutex<MSQW>>) -> Result<Response<Body>> {
|
|||
// always return a u32
|
|||
let bits = format!("{:032b}", pool.lock().await.update());
|
|||
|
|||
let response = Response::builder()
|
|||
.status(200)
|
|||
.header("Content-Type", "application/text")
|
|||
.body(bits.into())
|
|||
.unwrap();
|
|||
|
|||
Ok(response)
|
|||
}
|
|||
|
|||
async fn api_post_zero(pool: Arc<Mutex<MSQW>>) -> Result<Response<Body>> {
|
|||
pool.lock().await.add(false);
|
|||
Ok(Response::new("OK".into()))
|
|||
}
|
|||
|
|||
async fn api_post_one(pool: Arc<Mutex<MSQW>>) -> Result<Response<Body>> {
|
|||
pool.lock().await.add(true);
|
|||
Ok(Response::new("OK".into()))
|
|||
}
|
|||
|
|||
async fn simple_file_send(filename: &str) -> Result<Response<Body>> {
|
|||
// Serve a file by asynchronously reading it by chunks using tokio-util crate.
|
|||
|
|||
if let Ok(file) = File::open(filename).await {
|
|||
let stream = FramedRead::new(file, BytesCodec::new());
|
|||
let body = Body::wrap_stream(stream);
|
|||
return Ok(Response::new(body));
|
|||
}
|
|||
|
|||
Ok(not_found())
|
|||
}
|
|||
|
|||
fn not_found() -> Response<Body> {
|
|||
Response::builder()
|
|||
.status(StatusCode::NOT_FOUND)
|
|||
.body(NOTFOUND.into())
|
|||
.unwrap()
|
|||
}
|
|||
|
|||
#[tokio::main]
|
|||
async fn main() {
|
|||
let addr = ([127, 0, 0, 1], 3000).into();
|
|||
|
|||
let pool = Arc::new(Mutex::new(MSQW::new()));
|
|||
let pool = &*Box::leak(Box::new(pool));
|
|||
|
|||
let service = make_service_fn(
|
|||
move |_| async move {
|
|||
Ok::<_, hyper::Error>(service_fn(move |req| bits_api(pool.clone(), req)))
|
|||
});
|
|||
let server = Server::bind(&addr).serve(service);
|
|||
|
|||
println!("Listening on http://{}", addr);
|
|||
|
|||
if let Err(e) = server.await {
|
|||
eprintln!("server error: {}", e);
|
|||
}
|
|||
}
|
@ -0,0 +1,54 @@ |
|||
use std::num::Wrapping;
|
|||
|
|||
// An unremarkable odd number
|
|||
const ODD: Wrapping<u64> = Wrapping(0x9f32e1cbc5e1374b);
|
|||
|
|||
pub(crate) struct MSQW {
|
|||
reservoir: u64,
|
|||
level: u8,
|
|||
accumulator: Wrapping<u64>,
|
|||
state: Wrapping<u64>,
|
|||
}
|
|||
|
|||
impl MSQW {
|
|||
pub fn new() -> Self {
|
|||
Self { accumulator: Wrapping(0), state: Wrapping(0), reservoir: 0, level: 0 }
|
|||
}
|
|||
|
|||
pub fn update(&mut self) -> u32 {
|
|||
self.accumulator += ODD;
|
|||
self.state += self.accumulator;
|
|||
self.state = self.state * self.state;
|
|||
self.state = Wrapping(self.state.0.rotate_left(32));
|
|||
|
|||
return self.state.0 as u32;
|
|||
}
|
|||
|
|||
pub fn update_xor(&mut self) -> u32 {
|
|||
self.accumulator += ODD;
|
|||
self.state ^= self.accumulator;
|
|||
self.state = self.state * self.state;
|
|||
self.state = Wrapping(self.state.0.rotate_left(32));
|
|||
|
|||
return self.state.0 as u32;
|
|||
}
|
|||
|
|||
pub fn mix(&mut self, randomness: u64) {
|
|||
self.state ^= Wrapping(randomness);
|
|||
self.update_xor();
|
|||
}
|
|||
|
|||
pub fn add(&mut self, bit: bool) {
|
|||
self.level += 1;
|
|||
|
|||
self.reservoir <<= 1;
|
|||
if bit {
|
|||
self.reservoir |= 1;
|
|||
}
|
|||
|
|||
if self.level == 64 {
|
|||
self.mix(self.reservoir);
|
|||
self.level = 0;
|
|||
}
|
|||
}
|
|||
}
|
@ -0,0 +1,32 @@ |
|||
<html> |
|||
|
|||
<head> |
|||
<meta charset="utf-8" /> |
|||
|
|||
<title>COSI Random</title> |
|||
</head> |
|||
|
|||
<body class="content"> |
|||
<h2> |
|||
Hello, welcome to COSI Random! Have a complementary bit: |
|||
<h3> |
|||
<div id="free_bit" style="height: 1em;"></div> |
|||
</h3> |
|||
</h2> |
|||
<h3>Add a bit to the entropy pool:</h3> |
|||
<button onClick="send(true)">One</button> |
|||
<button onClick="send(false)">Zero</button> |
|||
<h3> |
|||
Need a bit? Get one here: |
|||
<div id="bits" style="min-height: 1em;"></div> |
|||
</h3> |
|||
|
|||
<button onClick="get_bit(1)">Get bit</button> |
|||
<button onClick="get_bits(10)">Get bit x10</button> |
|||
<button onClick="get_bits(100)">Get bit x100</button> |
|||
<button onClick="get_bits(1000)">Get bit x1000</button> |
|||
|
|||
<script src="/index.js"></script> |
|||
</body> |
|||
|
|||
</html> |
@ -0,0 +1,57 @@ |
|||
let bits = [] |
|||
let free_bit = false; |
|||
|
|||
function sleep(ms) { |
|||
return new Promise(resolve => setTimeout(resolve, ms)); |
|||
} |
|||
|
|||
async function get_bits(n) { |
|||
for (let i = 0; i < n; i++) { |
|||
get_bit(); |
|||
await sleep(20); |
|||
} |
|||
} |
|||
|
|||
function get_bit() { |
|||
let x; |
|||
if (bits.length == 0) { |
|||
if (x != undefined && x.readyState == XMLHttpRequest.OPENED) { |
|||
return; |
|||
} |
|||
|
|||
x = new XMLHttpRequest(); |
|||
x.onreadystatechange = () => { |
|||
if (x.readyState == XMLHttpRequest.DONE && x.status == 200) { |
|||
for (let bit of x.response) { |
|||
bits.push(bit); |
|||
} |
|||
|
|||
if (!free_bit) { |
|||
document.getElementById("free_bit").innerHTML = bits.pop() |
|||
free_bit = true; |
|||
} else { |
|||
add_bit(bits.pop()) |
|||
} |
|||
} |
|||
}; |
|||
x.open('GET', "/bits"); |
|||
x.responseType = "text"; |
|||
x.setRequestHeader("Content-Type", "application/text"); |
|||
x.send(); |
|||
} else { |
|||
add_bit(bits.pop()) |
|||
} |
|||
} |
|||
|
|||
function add_bit(bit) { |
|||
document.getElementById("bits").innerHTML = document.getElementById("bits").innerHTML + " " + bit; |
|||
} |
|||
|
|||
function send(bit) { |
|||
x = new XMLHttpRequest(); |
|||
x.open('POST', bit ? "/one" : "/zero"); |
|||
x.responseType = "text"; |
|||
x.send(); |
|||
} |
|||
|
|||
get_bit(); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue