@colyseus/arena
Version:
Colyseus Arena Tools
1 lines • 8.3 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport http from \"http\";\nimport path from \"path\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport dotenv from \"dotenv\";\nimport { Server, ServerOptions, Transport } from \"@colyseus/core\";\n\n// try to import uWebSockets-express compatibility layer.\nlet uWebSocketsExpressCompatibility: any;\ntry {\n uWebSocketsExpressCompatibility = require('uwebsockets-express').default;\n} catch (e) {}\n\n/**\n * Do not auto-load `${environment}.env` file when using Arena service.\n */\nif (process.env.NODE_ARENA !== \"true\") {\n const envFilename = (process.env.NODE_ENV === \"production\")\n ? \"arena.env\"\n : `${process.env.NODE_ENV || \"development\"}.env`\n\n // return the first .env path found\n const envPath = [\n path.resolve(path.dirname(require?.main?.filename || process.cwd()), \"..\", envFilename),\n path.resolve(process.cwd(), envFilename)\n ].find((envPath) => fs.existsSync(envPath));\n\n if (envPath) {\n dotenv.config({ path: envPath });\n console.log(`✅ ${envFilename} loaded.`);\n } else {\n console.log(`⚠️ ${envFilename} not found.`);\n }\n}\n\nexport interface ArenaOptions {\n options?: ServerOptions,\n displayLogs?: boolean,\n getId?: () => string,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n}\n\nconst ALLOWED_KEYS: { [key in keyof ArenaOptions]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'getId': \"function\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\"\n};\n\nexport default function (options: ArenaOptions) {\n for (const option in options) {\n if (!ALLOWED_KEYS[option]) {\n throw new Error(`❌ Invalid option '${option}'. Allowed options are: ${Object.keys(ALLOWED_KEYS).join(\", \")}`);\n }\n if(typeof(options[option]) !== ALLOWED_KEYS[option]) {\n throw new Error(`❌ Invalid type for ${option}: please provide a ${ALLOWED_KEYS[option]} value.`);\n }\n }\n\n return options;\n}\n\n/**\n * Listen on your development environment\n * @param options Arena options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen(\n options: ArenaOptions,\n port: number = Number(process.env.PORT || 2567),\n) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\n\n const transport = await getTransport(options);\n const gameServer = new Server({\n ...serverOptions,\n transport,\n });\n await options.initializeGameServer?.(gameServer);\n await options.beforeListen?.();\n\n gameServer.listen(port);\n\n if (options.displayLogs) {\n const appId = options.getId?.() || \"[ Colyseus ]\";\n if (appId) {\n console.log(`🏟 ${appId}`);\n }\n\n console.log(`⚔️ Listening on ws://localhost:${port}`);\n }\n return gameServer;\n}\n\n\nexport async function getTransport(options: ArenaOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n options.initializeTransport = Server.prototype['getDefaultTransport'];\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server });\n\n if (options.initializeExpress) {\n // uWebSockets.js + Express compatibility layer.\n // @ts-ignore\n if (transport['app']) {\n if (typeof (uWebSocketsExpressCompatibility) === \"function\") {\n if (options.displayLogs){\n console.info(\"✅ uWebSockets.js + Express compatibility enabled\");\n }\n\n // @ts-ignore\n server = undefined;\n // @ts-ignore\n app = uWebSocketsExpressCompatibility(transport['app']);\n\n } else {\n if (options.displayLogs) {\n console.warn(\"\");\n console.warn(\"❌ uWebSockets.js + Express compatibility mode couldn't be loaded, run the following command to fix:\");\n console.warn(\"👉 npm install --save uwebsockets-express\");\n console.warn(\"\");\n }\n app = undefined;\n }\n }\n\n if (app) {\n // Enable CORS + JSON parsing.\n app.use(cors());\n app.use(express.json());\n\n await options.initializeExpress(app);\n\n if (options.displayLogs) {\n console.info(\"✅ Express initialized\");\n }\n }\n }\n\n return transport;\n}"],"names":[],"mappings":"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"}