···
2
+
collections::HashMap,
io::{BufRead, BufReader, Write},
4
+
net::{TcpListener, TcpStream},
8
-
const CLICK: &[u8] = include_bytes!("./sound.ogg");
let ctx = AudioContext::new();
12
-
let click = Sound::load(&ctx, CLICK);
11
+
let sounds = std::fs::read_dir("sounds")
12
+
.expect("cant read sounds")
14
+
let p = f.ok()?.path();
15
+
let n = p.file_stem()?.to_string_lossy().into_owned();
18
+
Sound::load(&ctx, &std::fs::read(p).expect("can't load sound")),
21
+
.collect::<HashMap<String, Sound>>();
23
+
let handle_request = |mut stream: TcpStream| {
24
+
let mut lines = BufReader::new(&stream)
27
+
.take_while(|line| !line.is_empty());
29
+
let request_line = lines.next()?;
30
+
let query = parse_query_from_request(request_line.as_str());
31
+
let kind = query.get("kind").cloned().unwrap_or("sound");
33
+
if let Some(sound) = sounds.get(kind) {
34
+
sound.play(&ctx, PlaySoundParams::default());
37
+
// exhaust connection to not get "connection reset by peer"
38
+
lines.for_each(drop);
39
+
// this never "fails"
40
+
let response = "HTTP/1.1 200 OK\r\n\r\n";
41
+
let _ = stream.write_all(response.as_bytes());
let port = std::env::var("PORT")
···
let listener = TcpListener::bind(("0.0.0.0", port)).expect("cant bind");
for stream in listener.incoming() {
21
-
let Ok(mut stream) = stream else {
53
+
let Ok(stream) = stream else {
24
-
click.play(&ctx, PlaySoundParams::default());
25
-
// exhaust connection to not get "connection reset by peer"
26
-
BufReader::new(&stream)
29
-
.take_while(|line| !line.is_empty())
31
-
// this never "fails"
32
-
let response = "HTTP/1.1 200 OK\r\n\r\n";
33
-
let _ = stream.write_all(response.as_bytes());
56
+
handle_request(stream);
60
+
fn parse_query_from_request(request_line: &str) -> HashMap<&str, &str> {
64
+
.and_then(|path| path.split_once('?'))
68
+
.filter_map(|param| {
69
+
if let Some((key, value)) = param.split_once('=') {
71
+
} else if !param.is_empty() {
79
+
.unwrap_or_default()