diff --git a/main.ts b/main.ts index 627459f..01e0b25 100644 --- a/main.ts +++ b/main.ts @@ -1,4 +1,7 @@ -import { copy } from "https://deno.land/std@0.156.0/streams/conversion.ts"; +import * as bytes from "https://deno.land/x/bytes@1.0.3/mod.ts"; +import { JsonParseStream } from "https://deno.land/std@0.157.0/encoding/json/stream.ts"; +import { TextLineStream } from "https://deno.land/std@0.156.0/streams/delimiter.ts"; +import { writeAll, copy } from "https://deno.land/std@0.156.0/streams/conversion.ts"; const PORT = 5588 const listener = Deno.listen({ port: 5588 }) @@ -6,13 +9,64 @@ const listener = Deno.listen({ port: 5588 }) console.log(`Listening on 0.0.0.0:${PORT}`) for await (const conn of listener) { - echo(conn) + console.log('Connection established:', conn.remoteAddr) + try { + primeTime(conn) + } catch (e) { + console.error(conn.remoteAddr, e) + } + console.log('Connection closed:', conn.remoteAddr) } +// problem 2 +async function meansToAnEnd(conn) { +} + +// problem 1 +async function primeTime(conn) { + try { + for await (const request of jsons(conn)) { + console.log('Request:', request) + if (request.method == "isPrime" && typeof request.number == "number") { + const response = { + method: "isPrime", + prime: isPrime(request.number), + } + console.log('Response:', response) + const writeResult = await conn.write(new TextEncoder().encode(JSON.stringify(response) + "\n")) + console.log('Wrote:', writeResult) + } else { + await conn.write("Malformed!") + } + } + } catch (error) { + console.error("Error:", error) + } +} + +function isPrime(n) { + if (!Number.isInteger(n)) return false + for (let i = 2, s = Math.sqrt(n); i <= s; i++) if (n % i === 0) return false + return n > 1 +} + +function jsons(conn) { + const readable = conn.readable + .pipeThrough(new TextDecoderStream()) + .pipeThrough(new TextLineStream()) + .pipeThrough(new JsonParseStream()) + + return { + async *[Symbol.asyncIterator]() { + for await (const data of readable) { + yield data + } + } + } +} + +// problem 0 async function echo(conn) { await copy(conn, conn) conn.close() -} - -async function primeTime(conn) { } \ No newline at end of file