@colyseus/core
Version:
Multiplayer Framework for Node.js.
64 lines (63 loc) • 1.75 kB
JavaScript
// packages/core/src/router/node.ts
import { URL } from "url";
import * as matchMaker from "../MatchMaker.mjs";
import { setResponse } from "@colyseus/better-call/node";
import { postMatchmakeMethod } from "./default_routes.mjs";
function readBody(req) {
return new Promise((resolve, reject) => {
let data = "";
req.on("data", (chunk) => {
data += chunk.toString();
});
req.on("end", () => resolve(data ? JSON.parse(data) : {}));
req.on("error", reject);
});
}
function getCorsHeaders(req, headers) {
return {
...matchMaker.controller.DEFAULT_CORS_HEADERS,
...matchMaker.controller.getCorsHeaders(headers)
};
}
function createNodeMatchmakingMiddleware() {
return async (req, res, next) => {
const url = new URL(req.url || "/", "http://localhost");
const isMatchmakeRoute = url.pathname.startsWith(`/${matchMaker.controller.matchmakeRoute}/`);
if (!isMatchmakeRoute) {
next();
return;
}
const headers = new Headers(req.headers);
const corsHeaders = getCorsHeaders(req, headers);
if (req.method === "OPTIONS") {
res.writeHead(204, corsHeaders);
res.end();
return;
}
if (req.method !== "POST") {
next();
return;
}
const match = url.pathname.match(/^\/matchmake\/(\w+)\/(.+)/);
if (!match) {
next();
return;
}
const [, method, roomName] = match;
try {
const response = await postMatchmakeMethod({
params: { method, roomName },
body: await readBody(req),
headers: req.headers,
request: { headers },
asResponse: true
});
await setResponse(res, response);
} catch {
next();
}
};
}
export {
createNodeMatchmakingMiddleware
};