import { BufReader } from "https://deno.land/std@0.157.0/io/buffer.ts"; import { ByteSet } from "https://deno.land/x/bytes@1.0.3/mod.ts"; const QUERY_SIZE = 9; const PORT = 5588; const listener = Deno.listen({ port: 5588 }); console.log(`Listening on port ${PORT}`); for await (const conn of listener) { console.log("Connection established:", conn.remoteAddr); try { meansToAnEnd(conn); } catch (e) { console.error(conn.remoteAddr, e); } console.log("Connection closed:", conn.remoteAddr); } async function meansToAnEnd(conn: Deno.Conn) { try { const prices = []; for await (const query of queries(conn)) { if (query == null) break; const bs = ByteSet.from(query, "big"); const queryChar = String.fromCharCode(bs.read.uint8()); const a1 = bs.read.int32(); const a2 = bs.read.int32(); if (queryChar == "I") { prices.push([a1, a2]); } else if (queryChar == "Q") { let numMatches = 0; let sum = 0; for (const [ts, price] of prices) { if (ts < a1 || ts > a2) continue; numMatches++; sum += price; } let result = Math.floor(sum / numMatches); if (isNaN(result)) result = 0; console.log( conn.remoteAddr, `Result for ${prices.length} prices: ${sum} / ${numMatches} = ${result}`, ); const response = new ByteSet(4, "big"); response.write.int32(result); conn.write(response.buffer); } } console.log("Done!"); } catch (err) { console.error("Error processing query:", err); } } function queries(conn: Deno.Conn) { return { async *[Symbol.asyncIterator]() { const b = new Uint8Array(9); const reader = new BufReader(conn, QUERY_SIZE); try { while (await reader.readFull(b) != null) { yield b; } } catch (err) { console.error("Error receiving query:", err); } }, }; }