Mucho mucho update
This commit is contained in:
@@ -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();
|
||||
Reference in New Issue
Block a user