Release Healer Man 0.1.16

This commit is contained in:
phenom committed 2026-09-05 20:42:38 -04:00
1 parent f49e54f35f
commit b57d2b2839
89 files changed
+6055 -17

No files matched your search

+51 -2
View File
@@ -3,8 +3,10 @@ import { createServer } from "node:http";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { GameDatabaseError, openGameDatabase } from "./database.mjs";
import { createArenaService } from "./arena-service.mjs";
import { publicManastormAdminConfig } from "./manastorm-config.mjs";
import { createOnlineSessionManager } from "./online-session.mjs";
import { upgradeArenaWebSocket } from "./websocket.mjs";
const MIME_TYPES = new Map([
[".css", "text/css; charset=utf-8"], [".glb", "model/gltf-binary"],
@@ -151,6 +153,7 @@ export function createGameServer(options = {}) {
const trustProxy = String(options.trustProxy ?? process.env.TRUST_PROXY ?? "").toLowerCase() === "true";
const gameDatabase = options.database ?? openGameDatabase(options);
const onlineSessions = createOnlineSessionManager();
const arenaService = createArenaService({ database: gameDatabase });
const allowAuthRequest = createAuthLimiter();
gameDatabase.pruneExpiredSessions();
@@ -168,7 +171,7 @@ export function createGameServer(options = {}) {
response.writeHead(204, {
...cors,
"Access-Control-Allow-Headers": "Authorization, Content-Type",
"Access-Control-Allow-Methods": "GET, HEAD, POST, PUT, OPTIONS",
"Access-Control-Allow-Methods": "GET, HEAD, POST, PUT, DELETE, OPTIONS",
"Access-Control-Max-Age": "86400",
});
response.end();
@@ -264,6 +267,45 @@ export function createGameServer(options = {}) {
json(response, 200, onlineSessions.sync(account, groupSnapshot, body));
return;
}
if (url.pathname === "/api/arena/state" && request.method === "GET") {
const account = gameDatabase.authenticate(bearerToken(request));
json(response, 200, arenaService.arenaState(account.id, url.searchParams.get("characterId")));
return;
}
const arenaLoadoutMatch = /^\/api\/arena\/loadouts\/(\d+)$/.exec(url.pathname);
if (arenaLoadoutMatch && request.method === "PUT") {
const account = gameDatabase.authenticate(bearerToken(request));
const body = await readJson(request, 64 * 1024);
json(response, 200, gameDatabase.putArenaLoadout(account.id, body.characterId, arenaLoadoutMatch[1], body));
return;
}
if (arenaLoadoutMatch && request.method === "DELETE") {
const account = gameDatabase.authenticate(bearerToken(request));
const body = await readJson(request, 16 * 1024);
json(response, 200, gameDatabase.deleteArenaLoadout(account.id, body.characterId, arenaLoadoutMatch[1]));
return;
}
if (url.pathname === "/api/arena/queue" && request.method === "POST") {
const account = gameDatabase.authenticate(bearerToken(request));
const body = await readJson(request, 128 * 1024);
json(response, 201, arenaService.enqueue(account, body));
return;
}
if (url.pathname === "/api/arena/queue" && request.method === "DELETE") {
const account = gameDatabase.authenticate(bearerToken(request));
json(response, 200, arenaService.leaveQueue(account.id));
return;
}
if (url.pathname === "/api/arena/ready" && request.method === "POST") {
const account = gameDatabase.authenticate(bearerToken(request));
json(response, 200, arenaService.ready(account.id));
return;
}
if (url.pathname === "/api/arena/socket-ticket" && request.method === "POST") {
const account = gameDatabase.authenticate(bearerToken(request));
json(response, 201, arenaService.socketTicket(account.id));
return;
}
if (url.pathname === "/api/manastorm-config" && request.method === "GET") {
const current = gameDatabase.getManastormConfig();
json(response, 200, {
@@ -327,11 +369,18 @@ export function createGameServer(options = {}) {
}
});
server.on("upgrade", (request, socket, head) => {
if (!upgradeArenaWebSocket(request, socket, head, arenaService)) {
socket.end("HTTP/1.1 404 Not Found\r\nConnection: close\r\nContent-Length: 0\r\n\r\n");
}
});
server.on("close", () => {
onlineSessions.clear();
arenaService.close();
gameDatabase.close();
});
return { server, database: gameDatabase, staticDir, contentDir };
return { server, database: gameDatabase, arenaService, staticDir, contentDir };
}
if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {