├── .gitignore ├── README.md ├── Cargo.toml ├── src └── main.rs ├── static ├── index.html └── script.js └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # realtime-chatroom-rust 2 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "chat" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | rocket = { version = "0.5.0-rc.1", features = ["json"] } 10 | 11 | [dev-dependencies] 12 | rand = "0.8" 13 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] extern crate rocket; 2 | 3 | use rocket::{State, Shutdown}; 4 | use rocket::fs::{relative, FileServer}; 5 | use rocket::form::Form; 6 | use rocket::response::stream::{EventStream, Event}; 7 | use rocket::serde::{Serialize, Deserialize}; 8 | use rocket::tokio::sync::broadcast::{channel, Sender, error::RecvError}; 9 | use rocket::tokio::select; 10 | 11 | #[derive(Debug, Clone, FromForm, Serialize, Deserialize)] 12 | // #[cfg_attr(test, derive(PartialEq, UriDisplayQuery))] 13 | #[serde(crate = "rocket::serde")] 14 | struct Message { 15 | #[field(validate = len(..30))] 16 | pub room: String, 17 | #[field(validate = len(..20))] 18 | pub username: String, 19 | pub message: String, 20 | } 21 | 22 | /// Returns an infinite stream of server-sent events. Each event is a message 23 | /// pulled from a broadcast queue sent by the `post` handler. 24 | #[get("/events")] 25 | async fn events(queue: &State>, mut end: Shutdown) -> EventStream![] { 26 | let mut rx = queue.subscribe(); 27 | EventStream! { 28 | loop { 29 | let msg = select! { 30 | msg = rx.recv() => match msg { 31 | Ok(msg) => msg, 32 | Err(RecvError::Closed) => break, 33 | Err(RecvError::Lagged(_)) => continue, 34 | }, 35 | _ = &mut end => break, 36 | }; 37 | 38 | yield Event::json(&msg); 39 | } 40 | } 41 | } 42 | 43 | /// Receive a message from a form submission and broadcast it to any receivers. 44 | #[post("/message", data = "
")] 45 | fn post(form: Form, queue: &State>) { 46 | // A send 'fails' if there are no active subscribers. That's okay. 47 | let _res = queue.send(form.into_inner()); 48 | } 49 | 50 | #[launch] 51 | fn rocket() -> _ { 52 | rocket::build() 53 | .manage(channel::(1024).0) 54 | .mount("/", routes![post, events]) 55 | .mount("/", FileServer::from(relative!("static"))) 56 | } 57 | -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Rocket Rooms 6 | 7 | 8 | 9 | 10 | 11 |
12 | 29 | 30 |
31 | 32 |
33 | 39 |
40 | 41 |
42 |
43 | 45 | 47 | 48 |
49 |
50 |
51 |
52 | 53 | 54 | -------------------------------------------------------------------------------- /static/script.js: -------------------------------------------------------------------------------- 1 | let roomListDiv = document.getElementById('room-list'); 2 | let messagesDiv = document.getElementById('messages'); 3 | let newMessageForm = document.getElementById('new-message'); 4 | let newRoomForm = document.getElementById('new-room'); 5 | let statusDiv = document.getElementById('status'); 6 | 7 | let roomTemplate = document.getElementById('room'); 8 | let messageTemplate = document.getElementById('message'); 9 | 10 | let messageField = newMessageForm.querySelector("#message"); 11 | let usernameField = newMessageForm.querySelector("#username"); 12 | let roomNameField = newRoomForm.querySelector("#name"); 13 | 14 | var STATE = { 15 | room: "lobby", 16 | rooms: {}, 17 | connected: false, 18 | } 19 | 20 | // Generate a color from a "hash" of a string. Thanks, internet. 21 | function hashColor(str) { 22 | let hash = 0; 23 | for (var i = 0; i < str.length; i++) { 24 | hash = str.charCodeAt(i) + ((hash << 5) - hash); 25 | hash = hash & hash; 26 | } 27 | 28 | return `hsl(${hash % 360}, 100%, 70%)`; 29 | } 30 | 31 | // Add a new room `name` and change to it. Returns `true` if the room didn't 32 | // already exist and false otherwise. 33 | function addRoom(name) { 34 | if (STATE[name]) { 35 | changeRoom(name); 36 | return false; 37 | } 38 | 39 | var node = roomTemplate.content.cloneNode(true); 40 | var room = node.querySelector(".room"); 41 | room.addEventListener("click", () => changeRoom(name)); 42 | room.textContent = name; 43 | room.dataset.name = name; 44 | roomListDiv.appendChild(node); 45 | 46 | STATE[name] = []; 47 | changeRoom(name); 48 | return true; 49 | } 50 | 51 | // Change the current room to `name`, restoring its messages. 52 | function changeRoom(name) { 53 | if (STATE.room == name) return; 54 | 55 | var newRoom = roomListDiv.querySelector(`.room[data-name='${name}']`); 56 | var oldRoom = roomListDiv.querySelector(`.room[data-name='${STATE.room}']`); 57 | if (!newRoom || !oldRoom) return; 58 | 59 | STATE.room = name; 60 | oldRoom.classList.remove("active"); 61 | newRoom.classList.add("active"); 62 | 63 | messagesDiv.querySelectorAll(".message").forEach((msg) => { 64 | messagesDiv.removeChild(msg) 65 | }); 66 | 67 | STATE[name].forEach((data) => addMessage(name, data.username, data.message)) 68 | } 69 | 70 | // Add `message` from `username` to `room`. If `push`, then actually store the 71 | // message. If the current room is `room`, render the message. 72 | function addMessage(room, username, message, push = false) { 73 | if (push) { 74 | STATE[room].push({ username, message }) 75 | } 76 | 77 | if (STATE.room == room) { 78 | var node = messageTemplate.content.cloneNode(true); 79 | node.querySelector(".message .username").textContent = username; 80 | node.querySelector(".message .username").style.color = hashColor(username); 81 | node.querySelector(".message .text").textContent = message; 82 | messagesDiv.appendChild(node); 83 | } 84 | } 85 | 86 | // Subscribe to the event source at `uri` with exponential backoff reconnect. 87 | function subscribe(uri) { 88 | var retryTime = 1; 89 | 90 | function connect(uri) { 91 | const events = new EventSource(uri); 92 | 93 | events.addEventListener("message", (ev) => { 94 | console.log("raw data", JSON.stringify(ev.data)); 95 | console.log("decoded data", JSON.stringify(JSON.parse(ev.data))); 96 | const msg = JSON.parse(ev.data); 97 | if (!("message" in msg) || !("room" in msg) || !("username" in msg)) return; 98 | addMessage(msg.room, msg.username, msg.message, true); 99 | }); 100 | 101 | events.addEventListener("open", () => { 102 | setConnectedStatus(true); 103 | console.log(`connected to event stream at ${uri}`); 104 | retryTime = 1; 105 | }); 106 | 107 | events.addEventListener("error", () => { 108 | setConnectedStatus(false); 109 | events.close(); 110 | 111 | let timeout = retryTime; 112 | retryTime = Math.min(64, retryTime * 2); 113 | console.log(`connection lost. attempting to reconnect in ${timeout}s`); 114 | setTimeout(() => connect(uri), (() => timeout * 1000)()); 115 | }); 116 | } 117 | 118 | connect(uri); 119 | } 120 | 121 | // Set the connection status: `true` for connected, `false` for disconnected. 122 | function setConnectedStatus(status) { 123 | STATE.connected = status; 124 | statusDiv.className = (status) ? "connected" : "reconnecting"; 125 | } 126 | 127 | // Let's go! Initialize the world. 128 | function init() { 129 | // Initialize some rooms. 130 | addRoom("lobby"); 131 | addRoom("rocket"); 132 | changeRoom("lobby"); 133 | addMessage("lobby", "Bot", "Hey! Open another browser tab, send a message.", true); 134 | addMessage("rocket", "Bot", "This is another room. Neat, huh?", true); 135 | 136 | // Set up the form handler. 137 | newMessageForm.addEventListener("submit", (e) => { 138 | e.preventDefault(); 139 | 140 | const room = STATE.room; 141 | const message = messageField.value; 142 | const username = usernameField.value || "guest"; 143 | if (!message || !username) return; 144 | 145 | if (STATE.connected) { 146 | fetch("/message", { 147 | method: "POST", 148 | body: new URLSearchParams({ room, username, message }), 149 | }).then((response) => { 150 | if (response.ok) messageField.value = ""; 151 | }); 152 | } 153 | }) 154 | 155 | // Set up the new room handler. 156 | newRoomForm.addEventListener("submit", (e) => { 157 | e.preventDefault(); 158 | 159 | const room = roomNameField.value; 160 | if (!room) return; 161 | 162 | roomNameField.value = ""; 163 | if (!addRoom(room)) return; 164 | 165 | addMessage(room, "Rocket", `Look, your own "${room}" room! Nice.`, true); 166 | }) 167 | 168 | // Subscribe to server-sent events. 169 | subscribe("/events"); 170 | } 171 | 172 | init(); 173 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "async-stream" 31 | version = "0.3.5" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" 34 | dependencies = [ 35 | "async-stream-impl", 36 | "futures-core", 37 | "pin-project-lite", 38 | ] 39 | 40 | [[package]] 41 | name = "async-stream-impl" 42 | version = "0.3.5" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" 45 | dependencies = [ 46 | "proc-macro2", 47 | "quote", 48 | "syn", 49 | ] 50 | 51 | [[package]] 52 | name = "async-trait" 53 | version = "0.1.77" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" 56 | dependencies = [ 57 | "proc-macro2", 58 | "quote", 59 | "syn", 60 | ] 61 | 62 | [[package]] 63 | name = "atomic" 64 | version = "0.5.3" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" 67 | 68 | [[package]] 69 | name = "atomic" 70 | version = "0.6.0" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" 73 | dependencies = [ 74 | "bytemuck", 75 | ] 76 | 77 | [[package]] 78 | name = "autocfg" 79 | version = "1.1.0" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 82 | 83 | [[package]] 84 | name = "backtrace" 85 | version = "0.3.69" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 88 | dependencies = [ 89 | "addr2line", 90 | "cc", 91 | "cfg-if", 92 | "libc", 93 | "miniz_oxide", 94 | "object", 95 | "rustc-demangle", 96 | ] 97 | 98 | [[package]] 99 | name = "binascii" 100 | version = "0.1.4" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" 103 | 104 | [[package]] 105 | name = "bitflags" 106 | version = "1.3.2" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 109 | 110 | [[package]] 111 | name = "bitflags" 112 | version = "2.4.1" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 115 | 116 | [[package]] 117 | name = "bytemuck" 118 | version = "1.14.0" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" 121 | 122 | [[package]] 123 | name = "bytes" 124 | version = "1.5.0" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 127 | 128 | [[package]] 129 | name = "cc" 130 | version = "1.0.83" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 133 | dependencies = [ 134 | "libc", 135 | ] 136 | 137 | [[package]] 138 | name = "cfg-if" 139 | version = "1.0.0" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 142 | 143 | [[package]] 144 | name = "chat" 145 | version = "0.1.0" 146 | dependencies = [ 147 | "rand", 148 | "rocket", 149 | ] 150 | 151 | [[package]] 152 | name = "cookie" 153 | version = "0.18.0" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8" 156 | dependencies = [ 157 | "percent-encoding", 158 | "time", 159 | "version_check", 160 | ] 161 | 162 | [[package]] 163 | name = "deranged" 164 | version = "0.3.11" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 167 | dependencies = [ 168 | "powerfmt", 169 | ] 170 | 171 | [[package]] 172 | name = "devise" 173 | version = "0.4.1" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8" 176 | dependencies = [ 177 | "devise_codegen", 178 | "devise_core", 179 | ] 180 | 181 | [[package]] 182 | name = "devise_codegen" 183 | version = "0.4.1" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" 186 | dependencies = [ 187 | "devise_core", 188 | "quote", 189 | ] 190 | 191 | [[package]] 192 | name = "devise_core" 193 | version = "0.4.1" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" 196 | dependencies = [ 197 | "bitflags 2.4.1", 198 | "proc-macro2", 199 | "proc-macro2-diagnostics", 200 | "quote", 201 | "syn", 202 | ] 203 | 204 | [[package]] 205 | name = "either" 206 | version = "1.9.0" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 209 | 210 | [[package]] 211 | name = "encoding_rs" 212 | version = "0.8.33" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 215 | dependencies = [ 216 | "cfg-if", 217 | ] 218 | 219 | [[package]] 220 | name = "equivalent" 221 | version = "1.0.1" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 224 | 225 | [[package]] 226 | name = "errno" 227 | version = "0.3.8" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 230 | dependencies = [ 231 | "libc", 232 | "windows-sys 0.52.0", 233 | ] 234 | 235 | [[package]] 236 | name = "fastrand" 237 | version = "2.0.1" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 240 | 241 | [[package]] 242 | name = "figment" 243 | version = "0.10.13" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "7629b8c7bcd214a072c2c88b263b5bb3ceb54c34365d8c41c1665461aeae0993" 246 | dependencies = [ 247 | "atomic 0.6.0", 248 | "pear", 249 | "serde", 250 | "toml", 251 | "uncased", 252 | "version_check", 253 | ] 254 | 255 | [[package]] 256 | name = "fnv" 257 | version = "1.0.7" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 260 | 261 | [[package]] 262 | name = "futures" 263 | version = "0.3.30" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 266 | dependencies = [ 267 | "futures-channel", 268 | "futures-core", 269 | "futures-io", 270 | "futures-sink", 271 | "futures-task", 272 | "futures-util", 273 | ] 274 | 275 | [[package]] 276 | name = "futures-channel" 277 | version = "0.3.30" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 280 | dependencies = [ 281 | "futures-core", 282 | "futures-sink", 283 | ] 284 | 285 | [[package]] 286 | name = "futures-core" 287 | version = "0.3.30" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 290 | 291 | [[package]] 292 | name = "futures-io" 293 | version = "0.3.30" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 296 | 297 | [[package]] 298 | name = "futures-sink" 299 | version = "0.3.30" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 302 | 303 | [[package]] 304 | name = "futures-task" 305 | version = "0.3.30" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 308 | 309 | [[package]] 310 | name = "futures-util" 311 | version = "0.3.30" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 314 | dependencies = [ 315 | "futures-channel", 316 | "futures-core", 317 | "futures-io", 318 | "futures-sink", 319 | "futures-task", 320 | "memchr", 321 | "pin-project-lite", 322 | "pin-utils", 323 | "slab", 324 | ] 325 | 326 | [[package]] 327 | name = "generator" 328 | version = "0.7.5" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" 331 | dependencies = [ 332 | "cc", 333 | "libc", 334 | "log", 335 | "rustversion", 336 | "windows", 337 | ] 338 | 339 | [[package]] 340 | name = "getrandom" 341 | version = "0.2.11" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" 344 | dependencies = [ 345 | "cfg-if", 346 | "libc", 347 | "wasi", 348 | ] 349 | 350 | [[package]] 351 | name = "gimli" 352 | version = "0.28.1" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 355 | 356 | [[package]] 357 | name = "glob" 358 | version = "0.3.1" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 361 | 362 | [[package]] 363 | name = "h2" 364 | version = "0.3.22" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" 367 | dependencies = [ 368 | "bytes", 369 | "fnv", 370 | "futures-core", 371 | "futures-sink", 372 | "futures-util", 373 | "http", 374 | "indexmap", 375 | "slab", 376 | "tokio", 377 | "tokio-util", 378 | "tracing", 379 | ] 380 | 381 | [[package]] 382 | name = "hashbrown" 383 | version = "0.14.3" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 386 | 387 | [[package]] 388 | name = "hermit-abi" 389 | version = "0.3.3" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" 392 | 393 | [[package]] 394 | name = "http" 395 | version = "0.2.11" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" 398 | dependencies = [ 399 | "bytes", 400 | "fnv", 401 | "itoa", 402 | ] 403 | 404 | [[package]] 405 | name = "http-body" 406 | version = "0.4.6" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 409 | dependencies = [ 410 | "bytes", 411 | "http", 412 | "pin-project-lite", 413 | ] 414 | 415 | [[package]] 416 | name = "httparse" 417 | version = "1.8.0" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 420 | 421 | [[package]] 422 | name = "httpdate" 423 | version = "1.0.3" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 426 | 427 | [[package]] 428 | name = "hyper" 429 | version = "0.14.28" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 432 | dependencies = [ 433 | "bytes", 434 | "futures-channel", 435 | "futures-core", 436 | "futures-util", 437 | "h2", 438 | "http", 439 | "http-body", 440 | "httparse", 441 | "httpdate", 442 | "itoa", 443 | "pin-project-lite", 444 | "socket2", 445 | "tokio", 446 | "tower-service", 447 | "tracing", 448 | "want", 449 | ] 450 | 451 | [[package]] 452 | name = "indexmap" 453 | version = "2.1.0" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 456 | dependencies = [ 457 | "equivalent", 458 | "hashbrown", 459 | "serde", 460 | ] 461 | 462 | [[package]] 463 | name = "inlinable_string" 464 | version = "0.1.15" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" 467 | 468 | [[package]] 469 | name = "is-terminal" 470 | version = "0.4.10" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" 473 | dependencies = [ 474 | "hermit-abi", 475 | "rustix", 476 | "windows-sys 0.52.0", 477 | ] 478 | 479 | [[package]] 480 | name = "itoa" 481 | version = "1.0.10" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 484 | 485 | [[package]] 486 | name = "lazy_static" 487 | version = "1.4.0" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 490 | 491 | [[package]] 492 | name = "libc" 493 | version = "0.2.151" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" 496 | 497 | [[package]] 498 | name = "linux-raw-sys" 499 | version = "0.4.12" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" 502 | 503 | [[package]] 504 | name = "lock_api" 505 | version = "0.4.11" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 508 | dependencies = [ 509 | "autocfg", 510 | "scopeguard", 511 | ] 512 | 513 | [[package]] 514 | name = "log" 515 | version = "0.4.20" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 518 | 519 | [[package]] 520 | name = "loom" 521 | version = "0.5.6" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 524 | dependencies = [ 525 | "cfg-if", 526 | "generator", 527 | "scoped-tls", 528 | "serde", 529 | "serde_json", 530 | "tracing", 531 | "tracing-subscriber", 532 | ] 533 | 534 | [[package]] 535 | name = "matchers" 536 | version = "0.1.0" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 539 | dependencies = [ 540 | "regex-automata 0.1.10", 541 | ] 542 | 543 | [[package]] 544 | name = "memchr" 545 | version = "2.7.1" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 548 | 549 | [[package]] 550 | name = "mime" 551 | version = "0.3.17" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 554 | 555 | [[package]] 556 | name = "miniz_oxide" 557 | version = "0.7.1" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 560 | dependencies = [ 561 | "adler", 562 | ] 563 | 564 | [[package]] 565 | name = "mio" 566 | version = "0.8.10" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" 569 | dependencies = [ 570 | "libc", 571 | "wasi", 572 | "windows-sys 0.48.0", 573 | ] 574 | 575 | [[package]] 576 | name = "multer" 577 | version = "2.1.0" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" 580 | dependencies = [ 581 | "bytes", 582 | "encoding_rs", 583 | "futures-util", 584 | "http", 585 | "httparse", 586 | "log", 587 | "memchr", 588 | "mime", 589 | "spin", 590 | "tokio", 591 | "tokio-util", 592 | "version_check", 593 | ] 594 | 595 | [[package]] 596 | name = "nu-ansi-term" 597 | version = "0.46.0" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 600 | dependencies = [ 601 | "overload", 602 | "winapi", 603 | ] 604 | 605 | [[package]] 606 | name = "num_cpus" 607 | version = "1.16.0" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 610 | dependencies = [ 611 | "hermit-abi", 612 | "libc", 613 | ] 614 | 615 | [[package]] 616 | name = "object" 617 | version = "0.32.2" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 620 | dependencies = [ 621 | "memchr", 622 | ] 623 | 624 | [[package]] 625 | name = "once_cell" 626 | version = "1.19.0" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 629 | 630 | [[package]] 631 | name = "overload" 632 | version = "0.1.1" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 635 | 636 | [[package]] 637 | name = "parking_lot" 638 | version = "0.12.1" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 641 | dependencies = [ 642 | "lock_api", 643 | "parking_lot_core", 644 | ] 645 | 646 | [[package]] 647 | name = "parking_lot_core" 648 | version = "0.9.9" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 651 | dependencies = [ 652 | "cfg-if", 653 | "libc", 654 | "redox_syscall", 655 | "smallvec", 656 | "windows-targets 0.48.5", 657 | ] 658 | 659 | [[package]] 660 | name = "pear" 661 | version = "0.2.8" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8" 664 | dependencies = [ 665 | "inlinable_string", 666 | "pear_codegen", 667 | "yansi", 668 | ] 669 | 670 | [[package]] 671 | name = "pear_codegen" 672 | version = "0.2.8" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77" 675 | dependencies = [ 676 | "proc-macro2", 677 | "proc-macro2-diagnostics", 678 | "quote", 679 | "syn", 680 | ] 681 | 682 | [[package]] 683 | name = "percent-encoding" 684 | version = "2.3.1" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 687 | 688 | [[package]] 689 | name = "pin-project-lite" 690 | version = "0.2.13" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 693 | 694 | [[package]] 695 | name = "pin-utils" 696 | version = "0.1.0" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 699 | 700 | [[package]] 701 | name = "powerfmt" 702 | version = "0.2.0" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 705 | 706 | [[package]] 707 | name = "ppv-lite86" 708 | version = "0.2.17" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 711 | 712 | [[package]] 713 | name = "proc-macro2" 714 | version = "1.0.74" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" 717 | dependencies = [ 718 | "unicode-ident", 719 | ] 720 | 721 | [[package]] 722 | name = "proc-macro2-diagnostics" 723 | version = "0.10.1" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" 726 | dependencies = [ 727 | "proc-macro2", 728 | "quote", 729 | "syn", 730 | "version_check", 731 | "yansi", 732 | ] 733 | 734 | [[package]] 735 | name = "quote" 736 | version = "1.0.35" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 739 | dependencies = [ 740 | "proc-macro2", 741 | ] 742 | 743 | [[package]] 744 | name = "rand" 745 | version = "0.8.5" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 748 | dependencies = [ 749 | "libc", 750 | "rand_chacha", 751 | "rand_core", 752 | ] 753 | 754 | [[package]] 755 | name = "rand_chacha" 756 | version = "0.3.1" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 759 | dependencies = [ 760 | "ppv-lite86", 761 | "rand_core", 762 | ] 763 | 764 | [[package]] 765 | name = "rand_core" 766 | version = "0.6.4" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 769 | dependencies = [ 770 | "getrandom", 771 | ] 772 | 773 | [[package]] 774 | name = "redox_syscall" 775 | version = "0.4.1" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 778 | dependencies = [ 779 | "bitflags 1.3.2", 780 | ] 781 | 782 | [[package]] 783 | name = "ref-cast" 784 | version = "1.0.22" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" 787 | dependencies = [ 788 | "ref-cast-impl", 789 | ] 790 | 791 | [[package]] 792 | name = "ref-cast-impl" 793 | version = "1.0.22" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" 796 | dependencies = [ 797 | "proc-macro2", 798 | "quote", 799 | "syn", 800 | ] 801 | 802 | [[package]] 803 | name = "regex" 804 | version = "1.10.2" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 807 | dependencies = [ 808 | "aho-corasick", 809 | "memchr", 810 | "regex-automata 0.4.3", 811 | "regex-syntax 0.8.2", 812 | ] 813 | 814 | [[package]] 815 | name = "regex-automata" 816 | version = "0.1.10" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 819 | dependencies = [ 820 | "regex-syntax 0.6.29", 821 | ] 822 | 823 | [[package]] 824 | name = "regex-automata" 825 | version = "0.4.3" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 828 | dependencies = [ 829 | "aho-corasick", 830 | "memchr", 831 | "regex-syntax 0.8.2", 832 | ] 833 | 834 | [[package]] 835 | name = "regex-syntax" 836 | version = "0.6.29" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 839 | 840 | [[package]] 841 | name = "regex-syntax" 842 | version = "0.8.2" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 845 | 846 | [[package]] 847 | name = "rocket" 848 | version = "0.5.0" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "9e7bb57ccb26670d73b6a47396c83139447b9e7878cab627fdfe9ea8da489150" 851 | dependencies = [ 852 | "async-stream", 853 | "async-trait", 854 | "atomic 0.5.3", 855 | "binascii", 856 | "bytes", 857 | "either", 858 | "figment", 859 | "futures", 860 | "indexmap", 861 | "log", 862 | "memchr", 863 | "multer", 864 | "num_cpus", 865 | "parking_lot", 866 | "pin-project-lite", 867 | "rand", 868 | "ref-cast", 869 | "rocket_codegen", 870 | "rocket_http", 871 | "serde", 872 | "serde_json", 873 | "state", 874 | "tempfile", 875 | "time", 876 | "tokio", 877 | "tokio-stream", 878 | "tokio-util", 879 | "ubyte", 880 | "version_check", 881 | "yansi", 882 | ] 883 | 884 | [[package]] 885 | name = "rocket_codegen" 886 | version = "0.5.0" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "a2238066abf75f21be6cd7dc1a09d5414a671f4246e384e49fe3f8a4936bd04c" 889 | dependencies = [ 890 | "devise", 891 | "glob", 892 | "indexmap", 893 | "proc-macro2", 894 | "quote", 895 | "rocket_http", 896 | "syn", 897 | "unicode-xid", 898 | "version_check", 899 | ] 900 | 901 | [[package]] 902 | name = "rocket_http" 903 | version = "0.5.0" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "37a1663694d059fe5f943ea5481363e48050acedd241d46deb2e27f71110389e" 906 | dependencies = [ 907 | "cookie", 908 | "either", 909 | "futures", 910 | "http", 911 | "hyper", 912 | "indexmap", 913 | "log", 914 | "memchr", 915 | "pear", 916 | "percent-encoding", 917 | "pin-project-lite", 918 | "ref-cast", 919 | "serde", 920 | "smallvec", 921 | "stable-pattern", 922 | "state", 923 | "time", 924 | "tokio", 925 | "uncased", 926 | ] 927 | 928 | [[package]] 929 | name = "rustc-demangle" 930 | version = "0.1.23" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 933 | 934 | [[package]] 935 | name = "rustix" 936 | version = "0.38.28" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" 939 | dependencies = [ 940 | "bitflags 2.4.1", 941 | "errno", 942 | "libc", 943 | "linux-raw-sys", 944 | "windows-sys 0.52.0", 945 | ] 946 | 947 | [[package]] 948 | name = "rustversion" 949 | version = "1.0.14" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 952 | 953 | [[package]] 954 | name = "ryu" 955 | version = "1.0.16" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" 958 | 959 | [[package]] 960 | name = "scoped-tls" 961 | version = "1.0.1" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 964 | 965 | [[package]] 966 | name = "scopeguard" 967 | version = "1.2.0" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 970 | 971 | [[package]] 972 | name = "serde" 973 | version = "1.0.194" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" 976 | dependencies = [ 977 | "serde_derive", 978 | ] 979 | 980 | [[package]] 981 | name = "serde_derive" 982 | version = "1.0.194" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" 985 | dependencies = [ 986 | "proc-macro2", 987 | "quote", 988 | "syn", 989 | ] 990 | 991 | [[package]] 992 | name = "serde_json" 993 | version = "1.0.110" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" 996 | dependencies = [ 997 | "itoa", 998 | "ryu", 999 | "serde", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "serde_spanned" 1004 | version = "0.6.5" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" 1007 | dependencies = [ 1008 | "serde", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "sharded-slab" 1013 | version = "0.1.7" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1016 | dependencies = [ 1017 | "lazy_static", 1018 | ] 1019 | 1020 | [[package]] 1021 | name = "signal-hook-registry" 1022 | version = "1.4.1" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 1025 | dependencies = [ 1026 | "libc", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "slab" 1031 | version = "0.4.9" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1034 | dependencies = [ 1035 | "autocfg", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "smallvec" 1040 | version = "1.11.2" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" 1043 | 1044 | [[package]] 1045 | name = "socket2" 1046 | version = "0.5.5" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" 1049 | dependencies = [ 1050 | "libc", 1051 | "windows-sys 0.48.0", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "spin" 1056 | version = "0.9.8" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1059 | 1060 | [[package]] 1061 | name = "stable-pattern" 1062 | version = "0.1.0" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" 1065 | dependencies = [ 1066 | "memchr", 1067 | ] 1068 | 1069 | [[package]] 1070 | name = "state" 1071 | version = "0.6.0" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" 1074 | dependencies = [ 1075 | "loom", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "syn" 1080 | version = "2.0.46" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" 1083 | dependencies = [ 1084 | "proc-macro2", 1085 | "quote", 1086 | "unicode-ident", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "tempfile" 1091 | version = "3.9.0" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" 1094 | dependencies = [ 1095 | "cfg-if", 1096 | "fastrand", 1097 | "redox_syscall", 1098 | "rustix", 1099 | "windows-sys 0.52.0", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "thread_local" 1104 | version = "1.1.7" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 1107 | dependencies = [ 1108 | "cfg-if", 1109 | "once_cell", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "time" 1114 | version = "0.3.31" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" 1117 | dependencies = [ 1118 | "deranged", 1119 | "itoa", 1120 | "powerfmt", 1121 | "serde", 1122 | "time-core", 1123 | "time-macros", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "time-core" 1128 | version = "0.1.2" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1131 | 1132 | [[package]] 1133 | name = "time-macros" 1134 | version = "0.2.16" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" 1137 | dependencies = [ 1138 | "time-core", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "tokio" 1143 | version = "1.35.1" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" 1146 | dependencies = [ 1147 | "backtrace", 1148 | "bytes", 1149 | "libc", 1150 | "mio", 1151 | "num_cpus", 1152 | "pin-project-lite", 1153 | "signal-hook-registry", 1154 | "socket2", 1155 | "tokio-macros", 1156 | "windows-sys 0.48.0", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "tokio-macros" 1161 | version = "2.2.0" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 1164 | dependencies = [ 1165 | "proc-macro2", 1166 | "quote", 1167 | "syn", 1168 | ] 1169 | 1170 | [[package]] 1171 | name = "tokio-stream" 1172 | version = "0.1.14" 1173 | source = "registry+https://github.com/rust-lang/crates.io-index" 1174 | checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" 1175 | dependencies = [ 1176 | "futures-core", 1177 | "pin-project-lite", 1178 | "tokio", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "tokio-util" 1183 | version = "0.7.10" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 1186 | dependencies = [ 1187 | "bytes", 1188 | "futures-core", 1189 | "futures-sink", 1190 | "pin-project-lite", 1191 | "tokio", 1192 | "tracing", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "toml" 1197 | version = "0.8.8" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" 1200 | dependencies = [ 1201 | "serde", 1202 | "serde_spanned", 1203 | "toml_datetime", 1204 | "toml_edit", 1205 | ] 1206 | 1207 | [[package]] 1208 | name = "toml_datetime" 1209 | version = "0.6.5" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 1212 | dependencies = [ 1213 | "serde", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "toml_edit" 1218 | version = "0.21.0" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" 1221 | dependencies = [ 1222 | "indexmap", 1223 | "serde", 1224 | "serde_spanned", 1225 | "toml_datetime", 1226 | "winnow", 1227 | ] 1228 | 1229 | [[package]] 1230 | name = "tower-service" 1231 | version = "0.3.2" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1234 | 1235 | [[package]] 1236 | name = "tracing" 1237 | version = "0.1.40" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1240 | dependencies = [ 1241 | "pin-project-lite", 1242 | "tracing-attributes", 1243 | "tracing-core", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "tracing-attributes" 1248 | version = "0.1.27" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1251 | dependencies = [ 1252 | "proc-macro2", 1253 | "quote", 1254 | "syn", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "tracing-core" 1259 | version = "0.1.32" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1262 | dependencies = [ 1263 | "once_cell", 1264 | "valuable", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "tracing-log" 1269 | version = "0.2.0" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1272 | dependencies = [ 1273 | "log", 1274 | "once_cell", 1275 | "tracing-core", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "tracing-subscriber" 1280 | version = "0.3.18" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 1283 | dependencies = [ 1284 | "matchers", 1285 | "nu-ansi-term", 1286 | "once_cell", 1287 | "regex", 1288 | "sharded-slab", 1289 | "smallvec", 1290 | "thread_local", 1291 | "tracing", 1292 | "tracing-core", 1293 | "tracing-log", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "try-lock" 1298 | version = "0.2.5" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1301 | 1302 | [[package]] 1303 | name = "ubyte" 1304 | version = "0.10.4" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" 1307 | dependencies = [ 1308 | "serde", 1309 | ] 1310 | 1311 | [[package]] 1312 | name = "uncased" 1313 | version = "0.9.9" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" 1316 | dependencies = [ 1317 | "serde", 1318 | "version_check", 1319 | ] 1320 | 1321 | [[package]] 1322 | name = "unicode-ident" 1323 | version = "1.0.12" 1324 | source = "registry+https://github.com/rust-lang/crates.io-index" 1325 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1326 | 1327 | [[package]] 1328 | name = "unicode-xid" 1329 | version = "0.2.4" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 1332 | 1333 | [[package]] 1334 | name = "valuable" 1335 | version = "0.1.0" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 1338 | 1339 | [[package]] 1340 | name = "version_check" 1341 | version = "0.9.4" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1344 | 1345 | [[package]] 1346 | name = "want" 1347 | version = "0.3.1" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1350 | dependencies = [ 1351 | "try-lock", 1352 | ] 1353 | 1354 | [[package]] 1355 | name = "wasi" 1356 | version = "0.11.0+wasi-snapshot-preview1" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1359 | 1360 | [[package]] 1361 | name = "winapi" 1362 | version = "0.3.9" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1365 | dependencies = [ 1366 | "winapi-i686-pc-windows-gnu", 1367 | "winapi-x86_64-pc-windows-gnu", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "winapi-i686-pc-windows-gnu" 1372 | version = "0.4.0" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1375 | 1376 | [[package]] 1377 | name = "winapi-x86_64-pc-windows-gnu" 1378 | version = "0.4.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1381 | 1382 | [[package]] 1383 | name = "windows" 1384 | version = "0.48.0" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" 1387 | dependencies = [ 1388 | "windows-targets 0.48.5", 1389 | ] 1390 | 1391 | [[package]] 1392 | name = "windows-sys" 1393 | version = "0.48.0" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1396 | dependencies = [ 1397 | "windows-targets 0.48.5", 1398 | ] 1399 | 1400 | [[package]] 1401 | name = "windows-sys" 1402 | version = "0.52.0" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1405 | dependencies = [ 1406 | "windows-targets 0.52.0", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "windows-targets" 1411 | version = "0.48.5" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1414 | dependencies = [ 1415 | "windows_aarch64_gnullvm 0.48.5", 1416 | "windows_aarch64_msvc 0.48.5", 1417 | "windows_i686_gnu 0.48.5", 1418 | "windows_i686_msvc 0.48.5", 1419 | "windows_x86_64_gnu 0.48.5", 1420 | "windows_x86_64_gnullvm 0.48.5", 1421 | "windows_x86_64_msvc 0.48.5", 1422 | ] 1423 | 1424 | [[package]] 1425 | name = "windows-targets" 1426 | version = "0.52.0" 1427 | source = "registry+https://github.com/rust-lang/crates.io-index" 1428 | checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" 1429 | dependencies = [ 1430 | "windows_aarch64_gnullvm 0.52.0", 1431 | "windows_aarch64_msvc 0.52.0", 1432 | "windows_i686_gnu 0.52.0", 1433 | "windows_i686_msvc 0.52.0", 1434 | "windows_x86_64_gnu 0.52.0", 1435 | "windows_x86_64_gnullvm 0.52.0", 1436 | "windows_x86_64_msvc 0.52.0", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "windows_aarch64_gnullvm" 1441 | version = "0.48.5" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1444 | 1445 | [[package]] 1446 | name = "windows_aarch64_gnullvm" 1447 | version = "0.52.0" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" 1450 | 1451 | [[package]] 1452 | name = "windows_aarch64_msvc" 1453 | version = "0.48.5" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1456 | 1457 | [[package]] 1458 | name = "windows_aarch64_msvc" 1459 | version = "0.52.0" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" 1462 | 1463 | [[package]] 1464 | name = "windows_i686_gnu" 1465 | version = "0.48.5" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1468 | 1469 | [[package]] 1470 | name = "windows_i686_gnu" 1471 | version = "0.52.0" 1472 | source = "registry+https://github.com/rust-lang/crates.io-index" 1473 | checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" 1474 | 1475 | [[package]] 1476 | name = "windows_i686_msvc" 1477 | version = "0.48.5" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1480 | 1481 | [[package]] 1482 | name = "windows_i686_msvc" 1483 | version = "0.52.0" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" 1486 | 1487 | [[package]] 1488 | name = "windows_x86_64_gnu" 1489 | version = "0.48.5" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1492 | 1493 | [[package]] 1494 | name = "windows_x86_64_gnu" 1495 | version = "0.52.0" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" 1498 | 1499 | [[package]] 1500 | name = "windows_x86_64_gnullvm" 1501 | version = "0.48.5" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1504 | 1505 | [[package]] 1506 | name = "windows_x86_64_gnullvm" 1507 | version = "0.52.0" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" 1510 | 1511 | [[package]] 1512 | name = "windows_x86_64_msvc" 1513 | version = "0.48.5" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1516 | 1517 | [[package]] 1518 | name = "windows_x86_64_msvc" 1519 | version = "0.52.0" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" 1522 | 1523 | [[package]] 1524 | name = "winnow" 1525 | version = "0.5.31" 1526 | source = "registry+https://github.com/rust-lang/crates.io-index" 1527 | checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c" 1528 | dependencies = [ 1529 | "memchr", 1530 | ] 1531 | 1532 | [[package]] 1533 | name = "yansi" 1534 | version = "1.0.0-rc.1" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377" 1537 | dependencies = [ 1538 | "is-terminal", 1539 | ] 1540 | --------------------------------------------------------------------------------