// deno-lint-ignore-file prefer-const no-explicit-any function serveFile(filename: string) { console.log(filename) const responseText = Deno.readFileSync("../" + filename); // console.log(responseText) const response = new Response(responseText); if (filename.endsWith('.js')) { response.headers.set('content-type', 'application/javascript') } return response; } function pingHandler(m:any) { console.log("pong handler", m); return '{"type":"pong"}' } interface HelloMessage { type: string user_id: string user_name: string peer_id:string peer_name: string known_users:string[] } const userPeers:Map> = new Map(); function helloHandler(m:HelloMessage) { console.log(`Received hello from peer ${m.peer_id}:${m.peer_name}, user ${m.user_id}:${m.user_name}`); if (!userPeers.has(m.user_id)) { userPeers.set(m.user_id, new Set()); } userPeers.get(m.user_id)?.add(m.peer_id); for (const knownUserID of m.known_users) { console.log(`Adding user ${knownUserID} from peer ${[m.peer_id]}`); if (!userPeers.get(knownUserID)) { userPeers.set(knownUserID, new Set()); } userPeers.get(knownUserID)?.add(m.peer_id); } let returnValue:any = {}; for (let key of userPeers.keys()) { let peers = userPeers.get(key); if (!peers) { continue; } returnValue[key] = [...peers.keys()]; } console.log(returnValue); return JSON.stringify({type:'hello', userPeers: returnValue}); } const messageDispatch:Map)=>string> = new Map(); function connectWebsocket(request: Request) { if (request.headers.get("upgrade") != "websocket") { return new Response(null, { status: 501 }); } const { socket, response } = Deno.upgradeWebSocket(request); socket.addEventListener("open", () => { console.log("a client connected!"); }); socket.addEventListener("message", (event) => { // deno-lint-ignore no-explicit-any let message:any; try { message = JSON.parse(event.data); } catch (e) { console.error("socket.message: ", e); } console.log(message); const dispatchHandler = messageDispatch.get(message.type) if (!dispatchHandler) { console.log("Got message I don't understand: ", event.data); return; } const response = dispatchHandler(message); console.log(response); socket.send(response); }); return response; } function handler(request: Request) { // console.log(request); const url = new URL(request.url); if (url.pathname === "/ws") { return connectWebsocket(request); } if (url.pathname === "/") { return serveFile("/static/index.html") } if (url.pathname === "/sw.js") { return serveFile("static/sw.js") } if (url.pathname === "/robots).txt") { return serveFile("static/robots.txt") } if (url.pathname === "/favicon.ico") { return serveFile("static/favicon.ico") } if (url.pathname.includes("/static/")) { return serveFile(url.pathname) } // if strings.Contains(r.URL.Path, "/static/") { // log.Print("Serving static") // path := filepath.Join(root, r.URL.Path) // info, err := os.Stat(path) // if err != nil || info.IsDir() { // log.Printf("404 File not found/dir") // http.NotFound(w, r) // return // } // log.Printf("Serving") // h.ServeHTTP(w, r) // return // } return new Response("Hello, World!"); } function main() { messageDispatch.set('ping', pingHandler); messageDispatch.set('hello', helloHandler); Deno.serve({ port: 6789, cert: Deno.readTextFileSync("/etc/letsencrypt/live/ddlion.net/fullchain.pem"), key: Deno.readTextFileSync("/etc/letsencrypt/live/ddlion.net/privkey.pem"), }, handler); } main();