Files
dandelion/deno/main.ts
bobbydigitales 26ed3bcf84 deno server
2024-10-09 08:30:28 -07:00

157 lines
3.8 KiB
TypeScript

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<string, Set<string>> = 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);
}
const peersToReturn = JSON.stringify(userPeers);
console.log(peersToReturn);
return JSON.stringify({type:'hello', userPeers: peersToReturn});
}
const messageDispatch:Map<string, (event:Record<string, never>)=>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();