Mucho mucho update

This commit is contained in:
bobbydigitales
2024-11-19 19:14:00 -08:00
parent 6c692c4b9f
commit 71b5284b0f
11 changed files with 564 additions and 213 deletions

View File

@@ -5,14 +5,13 @@
// Use Deno static serving for static ✅
// Use Workers, at least for serving static files. Why not nginx? Single binary server.
import { serveDir } from "jsr:@std/http/file-server"
// import { serveDir } from "jsr:@std/http/file-server"
const memoryCache = false;
const memoryResponseMap: Map<string, Response> = new Map();
const memoryCache = true;
const filepathResponseCache: Map<string, Response> = new Map();
// deno-lint-ignore-file prefer-const no-explicit-any
async function serveFile(filename: string) {
// console.log(filename)
if (!memoryCache) {
const file = await Deno.readFile("../" + filename);
const newResponse = new Response(file);
@@ -22,9 +21,10 @@ async function serveFile(filename: string) {
return newResponse;
}
const response = memoryResponseMap.get(filename);
const response = filepathResponseCache.get(filename);
if (response) {
// console.log('serveFile: cache hit:', filename);
return response.clone();
}
@@ -36,15 +36,14 @@ async function serveFile(filename: string) {
}
console.log(`Caching: ${filename}`);
memoryResponseMap.set(filename, newResponse);
filepathResponseCache.set(filename, newResponse);
return newResponse.clone();
}
function hashIdToNumber(id: string, range: number) {
let number = 0;
let hash = 0x811c9dc5
for (let char of id) {
for (const char of id) {
if (char !== '0' && char !== '-') {
hash ^= char.charCodeAt(0);
hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
@@ -72,7 +71,7 @@ function colorID(id: string) {
function pingHandler(m: any) {
let time = Temporal.Now.zonedDateTimeISO();
const time = Temporal.Now.zonedDateTimeISO();
// console.log("ping", m);
console.log(time, `ping handler ${colorID(m.peer_id)}:${m.peer_name} ${colorID(m.user_id)}:${m.user_name}`);
return '{"type":"pong"}'
@@ -87,10 +86,21 @@ interface HelloMessage {
known_users: string[]
}
// interface PeerState {
// socket:WebSocket;
// lastSeen: number;
// }
// const peerStates:Map<string, PeerState> = new Map();
const userPeers: Map<string, Set<string>> = new Map();
const peerSockets: Map<string, WebSocket> = new Map();
const socketPeers: Map<WebSocket, string> = new Map();
// function updatePeerState(peerID:string, socket:WebSocket) {
// }
function helloHandler(m: HelloMessage, socket: WebSocket) {
console.log(`Received hello from peer ${colorID(m.peer_id)}:${m.peer_name}, user ${colorID(m.user_id)}:${m.user_name}`);
@@ -116,9 +126,9 @@ function helloHandler(m: HelloMessage, socket: WebSocket) {
let returnValue: any = {};
for (let key of userPeers.keys()) {
let peers = userPeers.get(key);
const returnValue: any = {};
for (const key of userPeers.keys()) {
const peers = userPeers.get(key);
if (!peers || peers.size === 0) {
continue;
}
@@ -170,8 +180,8 @@ function peerMessageHandler(m: PeerMessage, _socket: WebSocket) {
const messageDispatch: Map<string, (m: any, socket: WebSocket) => string | null> = new Map();
function deletePeerFromUserPeers(peerIDToDelete: string) {
for (let [userID, peers] of userPeers.entries()) {
for (let peerID of peers) {
for (const peers of userPeers.values()) {
for (const peerID of peers) {
if (peerID === peerIDToDelete) {
peers.delete(peerIDToDelete);
}
@@ -185,7 +195,7 @@ function connectWebsocket(request: Request) {
}
const { socket, response } = Deno.upgradeWebSocket(request);
socket.addEventListener("open", (event) => {
socket.addEventListener("open", () => {
console.log("New peer websocket connection");
});
socket.addEventListener("message", (event) => {
@@ -214,7 +224,7 @@ function connectWebsocket(request: Request) {
});
socket.addEventListener("close", (event: CloseEvent) => {
let peerID = socketPeers.get(socket);
const peerID = socketPeers.get(socket);
if (!peerID) {
console.log("Websocket close: couldn't find peer 🤔");
return;
@@ -229,12 +239,26 @@ function connectWebsocket(request: Request) {
}
function handler(request: Request, info: any) {
async function devServerWatchFiles() {
const watcher = Deno.watchFs("../static/");
for await (const event of watcher) {
if (event.kind === "modify") {
for (const path of event.paths) {
const cachedPath = path.replace(Deno.cwd() + '/..', '')
filepathResponseCache.delete(cachedPath);
console.log('Purging updated file:', cachedPath)
}
}
}
}
function handler(request: Request, info: any): Promise<Response> | Response {
if (request.url === "https://ddln.app/") {
return serveFile("/static/index.html")
}
console.log(info.remoteAddr.hostname, request.url, request.headers.get('user-agent'));
// console.log(info.remoteAddr.hostname, request.url, request.headers.get('user-agent'));
const url = new URL(request.url);
@@ -267,13 +291,12 @@ function handler(request: Request, info: any) {
if (url.pathname.includes("/static/")) {
return serveFile(url.pathname);
// return serveDir(request, { fsRoot: "../" });
}
return serveFile("/static/index.html")
}
function main() {
async function main() {
messageDispatch.set('ping', pingHandler);
messageDispatch.set('hello', helloHandler);
@@ -284,6 +307,8 @@ function main() {
cert: Deno.readTextFileSync("/etc/letsencrypt/live/ddlion.net/fullchain.pem"),
key: Deno.readTextFileSync("/etc/letsencrypt/live/ddlion.net/privkey.pem"),
}, handler);
await devServerWatchFiles();
}
main();
await main();