diff --git a/main.ts b/main.ts index a4d29b7..f3eb57b 100644 --- a/main.ts +++ b/main.ts @@ -1,5 +1,4 @@ -import { copy } from "https://deno.land/std@0.157.0/streams/conversion.ts?s=copy"; -import { Buffer } from "https://deno.land/std@0.157.0/io/buffer.ts"; +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; @@ -22,29 +21,54 @@ for await (const conn of listener) { // problem 2 async function meansToAnEnd(conn: Deno.Conn) { try { + const prices = []; for await (const query of queries(conn)) { - console.log("Query:", query); - conn.write(ByteSet.from(Uint8Array.from([0]), "big").buffer); + 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") { + console.log(conn.remoteAddr, "Pushing I:", [a1, a2]); + prices.push([a1, a2]); + } else if (queryChar == "Q") { + console.log(conn.remoteAddr, "Querying:", a1, a2); + 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(err); + console.error("Error processing query:", err); } } function queries(conn: Deno.Conn) { return { async *[Symbol.asyncIterator]() { - const b = new Uint8Array(1024); - const q = new Uint8Array(); - let bytesRead = 0; - console.debug(b.length); - while (bytesRead < QUERY_SIZE) { - const n = await conn.read(b); - bytesRead += n; - console.debug(n, b.length); + 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); } - yield q; }, }; }