import { BufReader } from "https://deno.land/std@0.157.0/io/buffer.ts"; const PORT = 5588; type Road = number; type Dispatcher = Road[]; type Location = number; type SpeedLimit = number; type Timestamp = number; type Plate = string; type Car = Plate; type U8 = number; type U16 = number; type U32 = number; interface Camera { road: Road; location: Location; speedLimit: SpeedLimit; } interface Report { camera: Camera; car: Car; timestamp: Timestamp; } // const tEnc = new TextEncoder(); console.log(`Starting TCP listener on on 0.0.0.0:${PORT}`); function chatSession(conn: Deno.Conn) { const closeOnDisconnect = () => { console.warn("Disconnected client"); try { conn.close(); } catch (err) { console.error("Error closing client connection:", err); } }; serve(conn).catch((e) => e).finally(closeOnDisconnect); } enum MessageType { ERROR = 0x10, // Server -> Client PLATE = 0x20, // Client -> Server TICKET = 0x21, // Server -> Client } type ErrorMessage = [ string, // msg ]; type PlateMessage = [ string, // plate U32, // timestamp ]; interface TicketMessage { } type Message = ErrorMessage | PlateMessage; async function serve(conn: Deno.Conn) { const reader = new BufReader(conn); const type = await reader.peek(1); if (!type) throw new Error("failed to peek start of packet"); console.log({ type }, 0x64); // TODO: loop... } for await (const conn of Deno.listen({ port: PORT })) { console.log("Connection established:", conn.remoteAddr); chatSession(conn); console.log("Connection closed:", conn.remoteAddr); }