update to support websockets, update depends and gitignore

This commit is contained in:
creations 2025-02-27 11:57:09 -05:00
parent 5687fb4bec
commit 62dcb0f297
Signed by: creations
GPG key ID: 8F553AA4320FC711
4 changed files with 70 additions and 31 deletions

2
.gitignore vendored
View file

@ -1,2 +1,2 @@
/node_modules /node_modules
bun.lockb bun.lock

View file

@ -10,22 +10,22 @@
"cleanup": "rm -rf logs node_modules bun.lockdb" "cleanup": "rm -rf logs node_modules bun.lockdb"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.18.0", "@eslint/js": "^9.21.0",
"@types/bun": "^1.1.16", "@types/bun": "^1.2.4",
"@types/ejs": "^3.1.5", "@types/ejs": "^3.1.5",
"@typescript-eslint/eslint-plugin": "^8.20.0", "@typescript-eslint/eslint-plugin": "^8.25.0",
"@typescript-eslint/parser": "^8.20.0", "@typescript-eslint/parser": "^8.25.0",
"eslint": "^9.18.0", "eslint": "^9.21.0",
"eslint-plugin-prettier": "^5.2.2", "eslint-plugin-prettier": "^5.2.3",
"eslint-plugin-promise": "^7.2.1", "eslint-plugin-promise": "^7.2.1",
"eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unicorn": "^56.0.1", "eslint-plugin-unicorn": "^56.0.1",
"eslint-plugin-unused-imports": "^4.1.4", "eslint-plugin-unused-imports": "^4.1.4",
"globals": "^15.14.0", "globals": "^15.15.0",
"prettier": "^3.4.2" "prettier": "^3.5.2"
}, },
"peerDependencies": { "peerDependencies": {
"typescript": "^5.7.2" "typescript": "^5.7.3"
}, },
"dependencies": { "dependencies": {
"ejs": "^3.1.10" "ejs": "^3.1.10"

View file

@ -8,6 +8,8 @@ import {
} from "bun"; } from "bun";
import { resolve } from "path"; import { resolve } from "path";
import { webSocketHandler } from "@/WebSocketHandler";
class ServerHandler { class ServerHandler {
private router: FileSystemRouter; private router: FileSystemRouter;
@ -27,6 +29,11 @@ class ServerHandler {
port: this.port, port: this.port,
hostname: this.host, hostname: this.host,
fetch: this.handleRequest.bind(this), fetch: this.handleRequest.bind(this),
websocket: {
open: webSocketHandler.handleOpen.bind(webSocketHandler),
message: webSocketHandler.handleMessage.bind(webSocketHandler),
close: webSocketHandler.handleClose.bind(webSocketHandler),
},
}); });
logger.info( logger.info(
@ -195,29 +202,27 @@ class ServerHandler {
); );
} }
queueMicrotask(() => { const headers: Headers = response.headers;
const headers: Headers = response.headers; let ip: string | null = server.requestIP(request)?.address || null;
let ip: string | null = server.requestIP(request)?.address || null;
if (!ip) { if (!ip) {
ip = ip =
headers.get("CF-Connecting-IP") || headers.get("CF-Connecting-IP") ||
headers.get("X-Real-IP") || headers.get("X-Real-IP") ||
headers.get("X-Forwarded-For") || headers.get("X-Forwarded-For") ||
null; null;
} }
logger.custom( logger.custom(
`[${request.method}]`, `[${request.method}]`,
`(${response.status})`, `(${response.status})`,
[ [
request.url, request.url,
`${(performance.now() - request.startPerf).toFixed(2)}ms`, `${(performance.now() - request.startPerf).toFixed(2)}ms`,
ip || "unknown", ip || "unknown",
], ],
"90", "90",
); );
});
return response; return response;
} }

34
src/webSocketHandler.ts Normal file
View file

@ -0,0 +1,34 @@
import { logger } from "@helpers/logger";
import { type ServerWebSocket } from "bun";
class WebSocketHandler {
public handleMessage(ws: ServerWebSocket, message: string): void {
logger.info(`WebSocket received: ${message}`);
try {
ws.send(`You said: ${message}`);
} catch (error) {
logger.error(`WebSocket send error: ${(error as Error).message}`);
}
}
public handleOpen(ws: ServerWebSocket): void {
logger.info("WebSocket connection opened.");
try {
ws.send("Welcome to the WebSocket server!");
} catch (error) {
logger.error(`WebSocket send error: ${(error as Error).message}`);
}
}
public handleClose(
ws: ServerWebSocket,
code: number,
reason: string,
): void {
logger.warn(`WebSocket closed with code ${code}, reason: ${reason}`);
}
}
const webSocketHandler: WebSocketHandler = new WebSocketHandler();
export { webSocketHandler };