@colyseus/tools 0.17.5 → 0.17.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -26,6 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // packages/tools/src/index.ts
29
31
  var index_exports = {};
30
32
  __export(index_exports, {
31
33
  default: () => index_default,
@@ -33,7 +35,7 @@ __export(index_exports, {
33
35
  listen: () => listen
34
36
  });
35
37
  module.exports = __toCommonJS(index_exports);
36
- var import_loadenv = require("./loadenv.ts");
38
+ var import_loadenv = require("./loadenv.cjs");
37
39
  var import_os = __toESM(require("os"), 1);
38
40
  var import_fs = __toESM(require("fs"), 1);
39
41
  var import_net = __toESM(require("net"), 1);
@@ -42,16 +44,16 @@ var import_cors = __toESM(require("cors"), 1);
42
44
  var import_express = __toESM(require("express"), 1);
43
45
  var import_core = require("@colyseus/core");
44
46
  var import_ws_transport = require("@colyseus/ws-transport");
45
- const BunWebSockets = import("@colyseus/bun-websockets");
47
+ var BunWebSockets = import("@colyseus/bun-websockets");
46
48
  BunWebSockets.catch(() => {
47
49
  });
48
- const RedisDriver = import("@colyseus/redis-driver");
50
+ var RedisDriver = import("@colyseus/redis-driver");
49
51
  RedisDriver.catch(() => {
50
52
  });
51
- const RedisPresence = import("@colyseus/redis-presence");
53
+ var RedisPresence = import("@colyseus/redis-presence");
52
54
  RedisPresence.catch(() => {
53
55
  });
54
- const ALLOWED_KEYS = {
56
+ var ALLOWED_KEYS = {
55
57
  "displayLogs": "boolean",
56
58
  "options": "object",
57
59
  "rooms": "object",
@@ -104,7 +106,7 @@ async function listen(options, port = Number(process.env.PORT || 2567)) {
104
106
  await options.beforeListen?.();
105
107
  }
106
108
  if (process.env.COLYSEUS_CLOUD !== void 0) {
107
- const socketPath = `/tmp/${port}.sock`;
109
+ const socketPath = `/run/colyseus/${port}.sock`;
108
110
  await checkInactiveSocketFile(socketPath);
109
111
  await server.listen(socketPath);
110
112
  } else {
@@ -129,7 +131,9 @@ async function buildServerFromOptions(options, port) {
129
131
  serverOptions.publicAddress = cloudConfig.publicAddress;
130
132
  }
131
133
  }
132
- return (0, import_core.defineServer)(options.rooms || {}, options.routes, {
134
+ return (0, import_core.defineServer)({
135
+ rooms: options.rooms || {},
136
+ routes: options.routes,
133
137
  ...serverOptions,
134
138
  transport: await getTransport(options)
135
139
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import './loadenv.ts';\nimport os from 'os';\nimport fs from \"fs\";\nimport net from \"net\";\nimport http from 'http';\nimport cors from 'cors';\nimport express from 'express';\nimport {\n type ServerOptions,\n type SDKTypes,\n type Router,\n logger,\n Server,\n Transport,\n matchMaker,\n RegisteredHandler,\n defineServer,\n LocalDriver,\n LocalPresence\n} from '@colyseus/core';\nimport { WebSocketTransport } from '@colyseus/ws-transport';\n\nconst BunWebSockets = import('@colyseus/bun-websockets'); BunWebSockets.catch(() => {});\nconst RedisDriver = import('@colyseus/redis-driver'); RedisDriver.catch(() => {});\nconst RedisPresence = import('@colyseus/redis-presence'); RedisPresence.catch(() => {});\n\nexport interface ConfigOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n> extends SDKTypes<RoomTypes, Routes> {\n options?: ServerOptions,\n displayLogs?: boolean,\n rooms?: RoomTypes,\n routes?: Routes,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n /**\n * @deprecated getId() has no effect anymore.\n */\n getId?: () => string,\n}\n\nconst ALLOWED_KEYS: { [key in keyof Partial<ConfigOptions>]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'rooms': \"object\",\n 'routes': \"object\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\",\n // deprecated options (will be removed in the next major version)\n 'getId': \"function\",\n};\n\nexport default function <\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: Omit<ConfigOptions<RoomTypes, Routes>, '~rooms' | '~routes'>) {\n for (const option in options) {\n if (!ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid option '${option}'. Allowed options are: ${Object.keys(ALLOWED_KEYS).join(\", \")}`);\n }\n if(options[option] !== undefined && typeof(options[option]) !== ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid type for ${option}: please provide a ${ALLOWED_KEYS[option]} value.`);\n }\n }\n return options as ConfigOptions<RoomTypes, Routes>;\n}\n\n/**\n * Expose server instance and listen on the port specified\n * @param options Application options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\n/**\n * Expose server instance and listen on the port specified\n * @param server Server instance\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n server: Server<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes> | Server<RoomTypes, Routes>,\n port: number = Number(process.env.PORT || 2567),\n) {\n // Force 2567 port on Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n port = 2567;\n }\n\n //\n // Handling multiple processes\n // Use NODE_APP_INSTANCE to play nicely with pm2\n //\n const processNumber = Number(process.env.NODE_APP_INSTANCE || \"0\");\n port += processNumber;\n\n let server: Server<RoomTypes, Routes>;\n let displayLogs = true;\n\n if (options instanceof Server) {\n server = options;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // check if local driver/presence are being used (defaults)\n const isLocalDriver = matchMaker.driver instanceof LocalDriver;\n const isLocalPresence = matchMaker.presence instanceof LocalPresence;\n\n const cloudConfig = await getColyseusCloudConfig(\n port,\n isLocalDriver ? undefined : matchMaker.driver,\n isLocalPresence ? undefined : matchMaker.presence,\n );\n\n // re-setup matchMaker with Redis driver/presence\n if (cloudConfig && (isLocalDriver || isLocalPresence)) {\n await matchMaker.setup(cloudConfig.presence, cloudConfig.driver, cloudConfig.publicAddress);\n }\n }\n\n } else {\n server = await buildServerFromOptions<RoomTypes, Routes>(options, port);\n displayLogs = options.displayLogs;\n\n await options.initializeGameServer?.(server);\n await matchMaker.onReady;\n await options.beforeListen?.();\n }\n\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // listening on socket\n // const socketPath: any = `/run/colyseus/${port}.sock`;\n const socketPath: any = `/tmp/${port}.sock`;\n\n // check if .sock file is active\n // (fixes \"ADDRINUSE\" issue when restarting the server)\n await checkInactiveSocketFile(socketPath);\n\n await server.listen(socketPath);\n\n } else {\n // listening on port\n await server.listen(port);\n }\n\n // notify process manager (production)\n if (typeof(process.send) === \"function\") {\n process.send('ready');\n }\n\n if (displayLogs) {\n logger.info(`\u2694\uFE0F Listening on http://localhost:${port}`);\n }\n\n return server;\n}\n\nasync function buildServerFromOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: ConfigOptions<RoomTypes, Routes>, port: number) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n const cloudConfig = await getColyseusCloudConfig(port, serverOptions.driver, serverOptions.presence);\n if (cloudConfig) {\n serverOptions.driver = cloudConfig.driver;\n serverOptions.presence = cloudConfig.presence;\n serverOptions.publicAddress = cloudConfig.publicAddress;\n }\n }\n\n return defineServer<RoomTypes, Routes>(options.rooms || {} as RoomTypes, options.routes, {\n ...serverOptions,\n transport: await getTransport(options),\n });\n}\n\nexport async function getTransport(options: ConfigOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n // @ts-ignore\n if (typeof Bun !== \"undefined\") {\n // @colyseus/bun-websockets\n BunWebSockets.catch(() => {\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize BunWebSockets.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/bun-websockets\");\n logger.warn(\"\");\n })\n const module = await BunWebSockets;\n options.initializeTransport = (options: any) => new module.BunWebSockets(options);\n\n } else {\n // use WebSocketTransport by default\n options.initializeTransport = (options: any) => new WebSocketTransport(options);\n }\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server, app });\n\n //\n // TODO: refactor me!\n // BunWebSockets: There's no need to instantiate \"app\" and \"server\" above\n //\n if (transport['expressApp']) {\n app = transport['expressApp'];\n }\n\n if (app) {\n // Enable CORS\n app.use(cors({ origin: true, credentials: true, }));\n\n if (options.initializeExpress) {\n await options.initializeExpress(app);\n }\n\n // health check for load balancers\n app.get(\"/__healthcheck\", (req, res) => {\n res.status(200).end();\n });\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n\n return transport;\n}\n\n/**\n * Configure Redis driver/presence for Colyseus Cloud when needed.\n * Returns configured driver, presence, and publicAddress.\n */\nasync function getColyseusCloudConfig(port: number, currentDriver?: any, currentPresence?: any) {\n const useRedisConfig = (os.cpus().length > 1) || (process.env.REDIS_URI !== undefined);\n\n if (!useRedisConfig) {\n return null;\n }\n\n let driver = currentDriver;\n let presence = currentPresence;\n const publicAddress = process.env.SUBDOMAIN + \".\" + process.env.SERVER_NAME + \"/\" + port;\n\n if (!driver) {\n try {\n const module = await RedisDriver;\n driver = new module.RedisDriver(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisDriver.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-driver\");\n logger.warn(\"\");\n }\n }\n\n if (!presence) {\n try {\n const module = await RedisPresence;\n presence = new module.RedisPresence(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisPresence.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-presence\");\n logger.warn(\"\");\n }\n }\n\n return { driver, presence, publicAddress };\n}\n\n/**\n * Check if a socket file is active and remove it if it's not.\n */\nfunction checkInactiveSocketFile(sockFilePath: string) {\n return new Promise((resolve, reject) => {\n const client = net.createConnection({ path: sockFilePath })\n .on('connect', () => {\n // socket file is active, close the connection\n client.end();\n throw new Error(`EADDRINUSE: Already listening on '${sockFilePath}'`);\n })\n .on('error', () => {\n // socket file is inactive, remove it\n fs.unlink(sockFilePath, () => resolve(true));\n });\n });\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import './loadenv.ts';\nimport os from 'os';\nimport fs from \"fs\";\nimport net from \"net\";\nimport http from 'http';\nimport cors from 'cors';\nimport express from 'express';\nimport {\n type ServerOptions,\n type SDKTypes,\n type Router,\n logger,\n Server,\n Transport,\n matchMaker,\n RegisteredHandler,\n defineServer,\n LocalDriver,\n LocalPresence\n} from '@colyseus/core';\nimport { WebSocketTransport } from '@colyseus/ws-transport';\n\nconst BunWebSockets = import('@colyseus/bun-websockets'); BunWebSockets.catch(() => {});\nconst RedisDriver = import('@colyseus/redis-driver'); RedisDriver.catch(() => {});\nconst RedisPresence = import('@colyseus/redis-presence'); RedisPresence.catch(() => {});\n\nexport interface ConfigOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n> extends SDKTypes<RoomTypes, Routes> {\n options?: ServerOptions,\n displayLogs?: boolean,\n rooms?: RoomTypes,\n routes?: Routes,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n /**\n * @deprecated getId() has no effect anymore.\n */\n getId?: () => string,\n}\n\nconst ALLOWED_KEYS: { [key in keyof Partial<ConfigOptions>]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'rooms': \"object\",\n 'routes': \"object\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\",\n // deprecated options (will be removed in the next major version)\n 'getId': \"function\",\n};\n\nexport default function <\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: Omit<ConfigOptions<RoomTypes, Routes>, '~rooms' | '~routes'>) {\n for (const option in options) {\n if (!ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid option '${option}'. Allowed options are: ${Object.keys(ALLOWED_KEYS).join(\", \")}`);\n }\n if(options[option] !== undefined && typeof(options[option]) !== ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid type for ${option}: please provide a ${ALLOWED_KEYS[option]} value.`);\n }\n }\n return options as ConfigOptions<RoomTypes, Routes>;\n}\n\n/**\n * Expose server instance and listen on the port specified\n * @param options Application options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\n/**\n * Expose server instance and listen on the port specified\n * @param server Server instance\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n server: Server<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes> | Server<RoomTypes, Routes>,\n port: number = Number(process.env.PORT || 2567),\n) {\n // Force 2567 port on Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n port = 2567;\n }\n\n //\n // Handling multiple processes\n // Use NODE_APP_INSTANCE to play nicely with pm2\n //\n const processNumber = Number(process.env.NODE_APP_INSTANCE || \"0\");\n port += processNumber;\n\n let server: Server<RoomTypes, Routes>;\n let displayLogs = true;\n\n if (options instanceof Server) {\n server = options;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // check if local driver/presence are being used (defaults)\n const isLocalDriver = matchMaker.driver instanceof LocalDriver;\n const isLocalPresence = matchMaker.presence instanceof LocalPresence;\n\n const cloudConfig = await getColyseusCloudConfig(\n port,\n isLocalDriver ? undefined : matchMaker.driver,\n isLocalPresence ? undefined : matchMaker.presence,\n );\n\n // re-setup matchMaker with Redis driver/presence\n if (cloudConfig && (isLocalDriver || isLocalPresence)) {\n await matchMaker.setup(cloudConfig.presence, cloudConfig.driver, cloudConfig.publicAddress);\n }\n }\n\n } else {\n server = await buildServerFromOptions<RoomTypes, Routes>(options, port);\n displayLogs = options.displayLogs;\n\n await options.initializeGameServer?.(server);\n await matchMaker.onReady;\n await options.beforeListen?.();\n }\n\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // listening on socket\n const socketPath: any = `/run/colyseus/${port}.sock`;\n // const socketPath: any = `/tmp/${port}.sock`;\n\n // check if .sock file is active\n // (fixes \"ADDRINUSE\" issue when restarting the server)\n await checkInactiveSocketFile(socketPath);\n\n await server.listen(socketPath);\n\n } else {\n // listening on port\n await server.listen(port);\n }\n\n // notify process manager (production)\n if (typeof(process.send) === \"function\") {\n process.send('ready');\n }\n\n if (displayLogs) {\n logger.info(`\u2694\uFE0F Listening on http://localhost:${port}`);\n }\n\n return server;\n}\n\nasync function buildServerFromOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: ConfigOptions<RoomTypes, Routes>, port: number) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n const cloudConfig = await getColyseusCloudConfig(port, serverOptions.driver, serverOptions.presence);\n if (cloudConfig) {\n serverOptions.driver = cloudConfig.driver;\n serverOptions.presence = cloudConfig.presence;\n serverOptions.publicAddress = cloudConfig.publicAddress;\n }\n }\n\n return defineServer<RoomTypes, Routes>({\n rooms: options.rooms || {} as RoomTypes,\n routes: options.routes,\n ...serverOptions,\n transport: await getTransport(options),\n });\n}\n\nexport async function getTransport(options: ConfigOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n // @ts-ignore\n if (typeof Bun !== \"undefined\") {\n // @colyseus/bun-websockets\n BunWebSockets.catch(() => {\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize BunWebSockets.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/bun-websockets\");\n logger.warn(\"\");\n })\n const module = await BunWebSockets;\n options.initializeTransport = (options: any) => new module.BunWebSockets(options);\n\n } else {\n // use WebSocketTransport by default\n options.initializeTransport = (options: any) => new WebSocketTransport(options);\n }\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server, app });\n\n //\n // TODO: refactor me!\n // BunWebSockets: There's no need to instantiate \"app\" and \"server\" above\n //\n if (transport['expressApp']) {\n app = transport['expressApp'];\n }\n\n if (app) {\n // Enable CORS\n app.use(cors({ origin: true, credentials: true, }));\n\n if (options.initializeExpress) {\n await options.initializeExpress(app);\n }\n\n // health check for load balancers\n app.get(\"/__healthcheck\", (req, res) => {\n res.status(200).end();\n });\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n\n return transport;\n}\n\n/**\n * Configure Redis driver/presence for Colyseus Cloud when needed.\n * Returns configured driver, presence, and publicAddress.\n */\nasync function getColyseusCloudConfig(port: number, currentDriver?: any, currentPresence?: any) {\n const useRedisConfig = (os.cpus().length > 1) || (process.env.REDIS_URI !== undefined);\n\n if (!useRedisConfig) {\n return null;\n }\n\n let driver = currentDriver;\n let presence = currentPresence;\n const publicAddress = process.env.SUBDOMAIN + \".\" + process.env.SERVER_NAME + \"/\" + port;\n\n if (!driver) {\n try {\n const module = await RedisDriver;\n driver = new module.RedisDriver(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisDriver.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-driver\");\n logger.warn(\"\");\n }\n }\n\n if (!presence) {\n try {\n const module = await RedisPresence;\n presence = new module.RedisPresence(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisPresence.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-presence\");\n logger.warn(\"\");\n }\n }\n\n return { driver, presence, publicAddress };\n}\n\n/**\n * Check if a socket file is active and remove it if it's not.\n */\nfunction checkInactiveSocketFile(sockFilePath: string) {\n return new Promise((resolve, reject) => {\n const client = net.createConnection({ path: sockFilePath })\n .on('connect', () => {\n // socket file is active, close the connection\n client.end();\n throw new Error(`EADDRINUSE: Already listening on '${sockFilePath}'`);\n })\n .on('error', () => {\n // socket file is inactive, remove it\n fs.unlink(sockFilePath, () => resolve(true));\n });\n });\n}"],
5
+ "mappings": "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",
6
6
  "names": ["module", "options", "express", "http", "cors", "os", "net", "fs"]
7
7
  }
package/build/index.mjs CHANGED
@@ -77,7 +77,7 @@ async function listen(options, port = Number(process.env.PORT || 2567)) {
77
77
  await options.beforeListen?.();
78
78
  }
79
79
  if (process.env.COLYSEUS_CLOUD !== void 0) {
80
- const socketPath = `/tmp/${port}.sock`;
80
+ const socketPath = `/run/colyseus/${port}.sock`;
81
81
  await checkInactiveSocketFile(socketPath);
82
82
  await server.listen(socketPath);
83
83
  } else {
@@ -102,7 +102,9 @@ async function buildServerFromOptions(options, port) {
102
102
  serverOptions.publicAddress = cloudConfig.publicAddress;
103
103
  }
104
104
  }
105
- return defineServer(options.rooms || {}, options.routes, {
105
+ return defineServer({
106
+ rooms: options.rooms || {},
107
+ routes: options.routes,
106
108
  ...serverOptions,
107
109
  transport: await getTransport(options)
108
110
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import './loadenv.ts';\nimport os from 'os';\nimport fs from \"fs\";\nimport net from \"net\";\nimport http from 'http';\nimport cors from 'cors';\nimport express from 'express';\nimport {\n type ServerOptions,\n type SDKTypes,\n type Router,\n logger,\n Server,\n Transport,\n matchMaker,\n RegisteredHandler,\n defineServer,\n LocalDriver,\n LocalPresence\n} from '@colyseus/core';\nimport { WebSocketTransport } from '@colyseus/ws-transport';\n\nconst BunWebSockets = import('@colyseus/bun-websockets'); BunWebSockets.catch(() => {});\nconst RedisDriver = import('@colyseus/redis-driver'); RedisDriver.catch(() => {});\nconst RedisPresence = import('@colyseus/redis-presence'); RedisPresence.catch(() => {});\n\nexport interface ConfigOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n> extends SDKTypes<RoomTypes, Routes> {\n options?: ServerOptions,\n displayLogs?: boolean,\n rooms?: RoomTypes,\n routes?: Routes,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n /**\n * @deprecated getId() has no effect anymore.\n */\n getId?: () => string,\n}\n\nconst ALLOWED_KEYS: { [key in keyof Partial<ConfigOptions>]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'rooms': \"object\",\n 'routes': \"object\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\",\n // deprecated options (will be removed in the next major version)\n 'getId': \"function\",\n};\n\nexport default function <\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: Omit<ConfigOptions<RoomTypes, Routes>, '~rooms' | '~routes'>) {\n for (const option in options) {\n if (!ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid option '${option}'. Allowed options are: ${Object.keys(ALLOWED_KEYS).join(\", \")}`);\n }\n if(options[option] !== undefined && typeof(options[option]) !== ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid type for ${option}: please provide a ${ALLOWED_KEYS[option]} value.`);\n }\n }\n return options as ConfigOptions<RoomTypes, Routes>;\n}\n\n/**\n * Expose server instance and listen on the port specified\n * @param options Application options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\n/**\n * Expose server instance and listen on the port specified\n * @param server Server instance\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n server: Server<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes> | Server<RoomTypes, Routes>,\n port: number = Number(process.env.PORT || 2567),\n) {\n // Force 2567 port on Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n port = 2567;\n }\n\n //\n // Handling multiple processes\n // Use NODE_APP_INSTANCE to play nicely with pm2\n //\n const processNumber = Number(process.env.NODE_APP_INSTANCE || \"0\");\n port += processNumber;\n\n let server: Server<RoomTypes, Routes>;\n let displayLogs = true;\n\n if (options instanceof Server) {\n server = options;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // check if local driver/presence are being used (defaults)\n const isLocalDriver = matchMaker.driver instanceof LocalDriver;\n const isLocalPresence = matchMaker.presence instanceof LocalPresence;\n\n const cloudConfig = await getColyseusCloudConfig(\n port,\n isLocalDriver ? undefined : matchMaker.driver,\n isLocalPresence ? undefined : matchMaker.presence,\n );\n\n // re-setup matchMaker with Redis driver/presence\n if (cloudConfig && (isLocalDriver || isLocalPresence)) {\n await matchMaker.setup(cloudConfig.presence, cloudConfig.driver, cloudConfig.publicAddress);\n }\n }\n\n } else {\n server = await buildServerFromOptions<RoomTypes, Routes>(options, port);\n displayLogs = options.displayLogs;\n\n await options.initializeGameServer?.(server);\n await matchMaker.onReady;\n await options.beforeListen?.();\n }\n\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // listening on socket\n // const socketPath: any = `/run/colyseus/${port}.sock`;\n const socketPath: any = `/tmp/${port}.sock`;\n\n // check if .sock file is active\n // (fixes \"ADDRINUSE\" issue when restarting the server)\n await checkInactiveSocketFile(socketPath);\n\n await server.listen(socketPath);\n\n } else {\n // listening on port\n await server.listen(port);\n }\n\n // notify process manager (production)\n if (typeof(process.send) === \"function\") {\n process.send('ready');\n }\n\n if (displayLogs) {\n logger.info(`\u2694\uFE0F Listening on http://localhost:${port}`);\n }\n\n return server;\n}\n\nasync function buildServerFromOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: ConfigOptions<RoomTypes, Routes>, port: number) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n const cloudConfig = await getColyseusCloudConfig(port, serverOptions.driver, serverOptions.presence);\n if (cloudConfig) {\n serverOptions.driver = cloudConfig.driver;\n serverOptions.presence = cloudConfig.presence;\n serverOptions.publicAddress = cloudConfig.publicAddress;\n }\n }\n\n return defineServer<RoomTypes, Routes>(options.rooms || {} as RoomTypes, options.routes, {\n ...serverOptions,\n transport: await getTransport(options),\n });\n}\n\nexport async function getTransport(options: ConfigOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n // @ts-ignore\n if (typeof Bun !== \"undefined\") {\n // @colyseus/bun-websockets\n BunWebSockets.catch(() => {\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize BunWebSockets.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/bun-websockets\");\n logger.warn(\"\");\n })\n const module = await BunWebSockets;\n options.initializeTransport = (options: any) => new module.BunWebSockets(options);\n\n } else {\n // use WebSocketTransport by default\n options.initializeTransport = (options: any) => new WebSocketTransport(options);\n }\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server, app });\n\n //\n // TODO: refactor me!\n // BunWebSockets: There's no need to instantiate \"app\" and \"server\" above\n //\n if (transport['expressApp']) {\n app = transport['expressApp'];\n }\n\n if (app) {\n // Enable CORS\n app.use(cors({ origin: true, credentials: true, }));\n\n if (options.initializeExpress) {\n await options.initializeExpress(app);\n }\n\n // health check for load balancers\n app.get(\"/__healthcheck\", (req, res) => {\n res.status(200).end();\n });\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n\n return transport;\n}\n\n/**\n * Configure Redis driver/presence for Colyseus Cloud when needed.\n * Returns configured driver, presence, and publicAddress.\n */\nasync function getColyseusCloudConfig(port: number, currentDriver?: any, currentPresence?: any) {\n const useRedisConfig = (os.cpus().length > 1) || (process.env.REDIS_URI !== undefined);\n\n if (!useRedisConfig) {\n return null;\n }\n\n let driver = currentDriver;\n let presence = currentPresence;\n const publicAddress = process.env.SUBDOMAIN + \".\" + process.env.SERVER_NAME + \"/\" + port;\n\n if (!driver) {\n try {\n const module = await RedisDriver;\n driver = new module.RedisDriver(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisDriver.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-driver\");\n logger.warn(\"\");\n }\n }\n\n if (!presence) {\n try {\n const module = await RedisPresence;\n presence = new module.RedisPresence(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisPresence.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-presence\");\n logger.warn(\"\");\n }\n }\n\n return { driver, presence, publicAddress };\n}\n\n/**\n * Check if a socket file is active and remove it if it's not.\n */\nfunction checkInactiveSocketFile(sockFilePath: string) {\n return new Promise((resolve, reject) => {\n const client = net.createConnection({ path: sockFilePath })\n .on('connect', () => {\n // socket file is active, close the connection\n client.end();\n throw new Error(`EADDRINUSE: Already listening on '${sockFilePath}'`);\n })\n .on('error', () => {\n // socket file is inactive, remove it\n fs.unlink(sockFilePath, () => resolve(true));\n });\n });\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import './loadenv.ts';\nimport os from 'os';\nimport fs from \"fs\";\nimport net from \"net\";\nimport http from 'http';\nimport cors from 'cors';\nimport express from 'express';\nimport {\n type ServerOptions,\n type SDKTypes,\n type Router,\n logger,\n Server,\n Transport,\n matchMaker,\n RegisteredHandler,\n defineServer,\n LocalDriver,\n LocalPresence\n} from '@colyseus/core';\nimport { WebSocketTransport } from '@colyseus/ws-transport';\n\nconst BunWebSockets = import('@colyseus/bun-websockets'); BunWebSockets.catch(() => {});\nconst RedisDriver = import('@colyseus/redis-driver'); RedisDriver.catch(() => {});\nconst RedisPresence = import('@colyseus/redis-presence'); RedisPresence.catch(() => {});\n\nexport interface ConfigOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n> extends SDKTypes<RoomTypes, Routes> {\n options?: ServerOptions,\n displayLogs?: boolean,\n rooms?: RoomTypes,\n routes?: Routes,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n /**\n * @deprecated getId() has no effect anymore.\n */\n getId?: () => string,\n}\n\nconst ALLOWED_KEYS: { [key in keyof Partial<ConfigOptions>]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'rooms': \"object\",\n 'routes': \"object\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\",\n // deprecated options (will be removed in the next major version)\n 'getId': \"function\",\n};\n\nexport default function <\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: Omit<ConfigOptions<RoomTypes, Routes>, '~rooms' | '~routes'>) {\n for (const option in options) {\n if (!ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid option '${option}'. Allowed options are: ${Object.keys(ALLOWED_KEYS).join(\", \")}`);\n }\n if(options[option] !== undefined && typeof(options[option]) !== ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid type for ${option}: please provide a ${ALLOWED_KEYS[option]} value.`);\n }\n }\n return options as ConfigOptions<RoomTypes, Routes>;\n}\n\n/**\n * Expose server instance and listen on the port specified\n * @param options Application options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\n/**\n * Expose server instance and listen on the port specified\n * @param server Server instance\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n server: Server<RoomTypes, Routes>,\n port?: number,\n): Promise<Server<RoomTypes, Routes>>;\n\nexport async function listen<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(\n options: ConfigOptions<RoomTypes, Routes> | Server<RoomTypes, Routes>,\n port: number = Number(process.env.PORT || 2567),\n) {\n // Force 2567 port on Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n port = 2567;\n }\n\n //\n // Handling multiple processes\n // Use NODE_APP_INSTANCE to play nicely with pm2\n //\n const processNumber = Number(process.env.NODE_APP_INSTANCE || \"0\");\n port += processNumber;\n\n let server: Server<RoomTypes, Routes>;\n let displayLogs = true;\n\n if (options instanceof Server) {\n server = options;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // check if local driver/presence are being used (defaults)\n const isLocalDriver = matchMaker.driver instanceof LocalDriver;\n const isLocalPresence = matchMaker.presence instanceof LocalPresence;\n\n const cloudConfig = await getColyseusCloudConfig(\n port,\n isLocalDriver ? undefined : matchMaker.driver,\n isLocalPresence ? undefined : matchMaker.presence,\n );\n\n // re-setup matchMaker with Redis driver/presence\n if (cloudConfig && (isLocalDriver || isLocalPresence)) {\n await matchMaker.setup(cloudConfig.presence, cloudConfig.driver, cloudConfig.publicAddress);\n }\n }\n\n } else {\n server = await buildServerFromOptions<RoomTypes, Routes>(options, port);\n displayLogs = options.displayLogs;\n\n await options.initializeGameServer?.(server);\n await matchMaker.onReady;\n await options.beforeListen?.();\n }\n\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n // listening on socket\n const socketPath: any = `/run/colyseus/${port}.sock`;\n // const socketPath: any = `/tmp/${port}.sock`;\n\n // check if .sock file is active\n // (fixes \"ADDRINUSE\" issue when restarting the server)\n await checkInactiveSocketFile(socketPath);\n\n await server.listen(socketPath);\n\n } else {\n // listening on port\n await server.listen(port);\n }\n\n // notify process manager (production)\n if (typeof(process.send) === \"function\") {\n process.send('ready');\n }\n\n if (displayLogs) {\n logger.info(`\u2694\uFE0F Listening on http://localhost:${port}`);\n }\n\n return server;\n}\n\nasync function buildServerFromOptions<\n RoomTypes extends Record<string, RegisteredHandler> = any,\n Routes extends Router = any\n>(options: ConfigOptions<RoomTypes, Routes>, port: number) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\n\n // automatically configure for production under Colyseus Cloud\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n const cloudConfig = await getColyseusCloudConfig(port, serverOptions.driver, serverOptions.presence);\n if (cloudConfig) {\n serverOptions.driver = cloudConfig.driver;\n serverOptions.presence = cloudConfig.presence;\n serverOptions.publicAddress = cloudConfig.publicAddress;\n }\n }\n\n return defineServer<RoomTypes, Routes>({\n rooms: options.rooms || {} as RoomTypes,\n routes: options.routes,\n ...serverOptions,\n transport: await getTransport(options),\n });\n}\n\nexport async function getTransport(options: ConfigOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n // @ts-ignore\n if (typeof Bun !== \"undefined\") {\n // @colyseus/bun-websockets\n BunWebSockets.catch(() => {\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize BunWebSockets.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/bun-websockets\");\n logger.warn(\"\");\n })\n const module = await BunWebSockets;\n options.initializeTransport = (options: any) => new module.BunWebSockets(options);\n\n } else {\n // use WebSocketTransport by default\n options.initializeTransport = (options: any) => new WebSocketTransport(options);\n }\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server, app });\n\n //\n // TODO: refactor me!\n // BunWebSockets: There's no need to instantiate \"app\" and \"server\" above\n //\n if (transport['expressApp']) {\n app = transport['expressApp'];\n }\n\n if (app) {\n // Enable CORS\n app.use(cors({ origin: true, credentials: true, }));\n\n if (options.initializeExpress) {\n await options.initializeExpress(app);\n }\n\n // health check for load balancers\n app.get(\"/__healthcheck\", (req, res) => {\n res.status(200).end();\n });\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n\n return transport;\n}\n\n/**\n * Configure Redis driver/presence for Colyseus Cloud when needed.\n * Returns configured driver, presence, and publicAddress.\n */\nasync function getColyseusCloudConfig(port: number, currentDriver?: any, currentPresence?: any) {\n const useRedisConfig = (os.cpus().length > 1) || (process.env.REDIS_URI !== undefined);\n\n if (!useRedisConfig) {\n return null;\n }\n\n let driver = currentDriver;\n let presence = currentPresence;\n const publicAddress = process.env.SUBDOMAIN + \".\" + process.env.SERVER_NAME + \"/\" + port;\n\n if (!driver) {\n try {\n const module = await RedisDriver;\n driver = new module.RedisDriver(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisDriver.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-driver\");\n logger.warn(\"\");\n }\n }\n\n if (!presence) {\n try {\n const module = await RedisPresence;\n presence = new module.RedisPresence(process.env.REDIS_URI);\n } catch (e) {\n console.error(e);\n logger.warn(\"\");\n logger.warn(\"\u274C could not initialize RedisPresence.\");\n logger.warn(\"\uD83D\uDC49 npm install --save @colyseus/redis-presence\");\n logger.warn(\"\");\n }\n }\n\n return { driver, presence, publicAddress };\n}\n\n/**\n * Check if a socket file is active and remove it if it's not.\n */\nfunction checkInactiveSocketFile(sockFilePath: string) {\n return new Promise((resolve, reject) => {\n const client = net.createConnection({ path: sockFilePath })\n .on('connect', () => {\n // socket file is active, close the connection\n client.end();\n throw new Error(`EADDRINUSE: Already listening on '${sockFilePath}'`);\n })\n .on('error', () => {\n // socket file is inactive, remove it\n fs.unlink(sockFilePath, () => resolve(true));\n });\n });\n}"],
5
+ "mappings": "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",
6
6
  "names": ["options"]
7
7
  }
package/build/loadenv.cjs CHANGED
@@ -21,6 +21,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
22
  mod
23
23
  ));
24
+
25
+ // packages/tools/src/loadenv.ts
24
26
  var import_fs = __toESM(require("fs"), 1);
25
27
  var import_path = __toESM(require("path"), 1);
26
28
  var import_dotenv = __toESM(require("dotenv"), 1);
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/loadenv.ts"],
4
4
  "sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport dotenv from 'dotenv';\n\nfunction getEnvFromArgv() {\n const envIndex = process.argv.indexOf(\"--env\");\n return (envIndex !== -1) ? process.argv[envIndex + 1] : undefined;\n}\n\nfunction getNodeEnv() {\n return process.env.NODE_ENV || getEnvFromArgv() || \"development\";\n}\n\nfunction getRegion() {\n // EU, NA, AS, AF, AU, SA, UNKNOWN\n return (process.env.REGION || \"unknown\").toLowerCase();\n}\n\nfunction loadEnvFile(envFileOptions: string[], log: 'none' | 'success' | 'both' = 'none') {\n const envPaths = [];\n envFileOptions.forEach((envFilename) => {\n if (envFilename.startsWith(\"/\")) {\n envPaths.push(envFilename);\n } else {\n envPaths.push(path.resolve(path.dirname(typeof(require) !== \"undefined\" && require?.main?.filename || process.cwd()), \"..\", envFilename));\n envPaths.push(path.resolve(process.cwd(), envFilename));\n }\n });\n\n // return the first .env path found\n const envPath = envPaths.find((envPath) => fs.existsSync(envPath));\n\n if (envPath) {\n dotenv.config({ path: envPath });\n\n if (log !== \"none\") {\n console.info(`\u2705 ${path.basename(envPath)} loaded.`);\n }\n\n } else if (log === \"both\") {\n console.info(`\u2139\uFE0F optional .env file not found: ${envFileOptions.join(\", \")}`);\n }\n}\n\n// reload /etc/environment, if exists\nif (fs.existsSync(\"/etc/environment\")) {\n dotenv.config({ path: \"/etc/environment\", override: true })\n}\n\n// load .env.cloud defined on admin panel\nif (process.env.COLYSEUS_CLOUD !== undefined) {\n const cloudEnvFileNames = [\".env.cloud\"];\n\n // prepend .env.cloud file from APP_ROOT_PATH\n if (process.env.APP_ROOT_PATH) {\n cloudEnvFileNames.unshift(`${process.env.APP_ROOT_PATH}${(process.env.APP_ROOT_PATH.endsWith(\"/\") ? \"\" : \"/\")}.env.cloud`);\n }\n\n loadEnvFile(cloudEnvFileNames);\n}\n\n// (overrides previous env configs)\nloadEnvFile([`.env.${getNodeEnv()}`, `.env`], 'both');\n\nif (process.env.REGION !== undefined) {\n loadEnvFile([`.env.${getRegion()}.${getNodeEnv()}`], 'success');\n}"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,gBAAe;AACf,kBAAiB;AACjB,oBAAmB;AAEnB,SAAS,iBAAiB;AACxB,QAAM,WAAW,QAAQ,KAAK,QAAQ,OAAO;AAC7C,SAAQ,aAAa,KAAM,QAAQ,KAAK,WAAW,CAAC,IAAI;AAC1D;AAEA,SAAS,aAAa;AACpB,SAAO,QAAQ,IAAI,YAAY,eAAe,KAAK;AACrD;AAEA,SAAS,YAAY;AAEnB,UAAQ,QAAQ,IAAI,UAAU,WAAW,YAAY;AACvD;AAEA,SAAS,YAAY,gBAA0B,MAAoC,QAAQ;AACvF,QAAM,WAAW,CAAC;AAClB,iBAAe,QAAQ,CAAC,gBAAgB;AACtC,QAAI,YAAY,WAAW,GAAG,GAAG;AAC/B,eAAS,KAAK,WAAW;AAAA,IAC3B,OAAO;AACL,eAAS,KAAK,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,OAAO,YAAa,eAAe,SAAS,MAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC;AACxI,eAAS,KAAK,YAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,SAAS,KAAK,CAACC,aAAY,UAAAC,QAAG,WAAWD,QAAO,CAAC;AAEjE,MAAI,SAAS;AACT,kBAAAE,QAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAE/B,QAAI,QAAQ,QAAQ;AAChB,cAAQ,KAAK,UAAK,YAAAH,QAAK,SAAS,OAAO,CAAC,UAAU;AAAA,IACtD;AAAA,EAEJ,WAAW,QAAQ,QAAQ;AACvB,YAAQ,KAAK,+CAAqC,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,EACjF;AACJ;AAGA,IAAI,UAAAE,QAAG,WAAW,kBAAkB,GAAG;AACrC,gBAAAC,QAAO,OAAO,EAAE,MAAM,oBAAoB,UAAU,KAAK,CAAC;AAC5D;AAGA,IAAI,QAAQ,IAAI,mBAAmB,QAAW;AAC1C,QAAM,oBAAoB,CAAC,YAAY;AAGvC,MAAI,QAAQ,IAAI,eAAe;AAC7B,sBAAkB,QAAQ,GAAG,QAAQ,IAAI,aAAa,GAAI,QAAQ,IAAI,cAAc,SAAS,GAAG,IAAI,KAAK,GAAI,YAAY;AAAA,EAC3H;AAEA,cAAY,iBAAiB;AACjC;AAGA,YAAY,CAAC,QAAQ,WAAW,CAAC,IAAI,MAAM,GAAG,MAAM;AAEpD,IAAI,QAAQ,IAAI,WAAW,QAAW;AACpC,cAAY,CAAC,QAAQ,UAAU,CAAC,IAAI,WAAW,CAAC,EAAE,GAAG,SAAS;AAChE;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gBAAe;AACf,kBAAiB;AACjB,oBAAmB;AAEnB,SAAS,iBAAiB;AACxB,QAAM,WAAW,QAAQ,KAAK,QAAQ,OAAO;AAC7C,SAAQ,aAAa,KAAM,QAAQ,KAAK,WAAW,CAAC,IAAI;AAC1D;AAEA,SAAS,aAAa;AACpB,SAAO,QAAQ,IAAI,YAAY,eAAe,KAAK;AACrD;AAEA,SAAS,YAAY;AAEnB,UAAQ,QAAQ,IAAI,UAAU,WAAW,YAAY;AACvD;AAEA,SAAS,YAAY,gBAA0B,MAAoC,QAAQ;AACvF,QAAM,WAAW,CAAC;AAClB,iBAAe,QAAQ,CAAC,gBAAgB;AACtC,QAAI,YAAY,WAAW,GAAG,GAAG;AAC/B,eAAS,KAAK,WAAW;AAAA,IAC3B,OAAO;AACL,eAAS,KAAK,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,OAAO,YAAa,eAAe,SAAS,MAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC;AACxI,eAAS,KAAK,YAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,SAAS,KAAK,CAACC,aAAY,UAAAC,QAAG,WAAWD,QAAO,CAAC;AAEjE,MAAI,SAAS;AACT,kBAAAE,QAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAE/B,QAAI,QAAQ,QAAQ;AAChB,cAAQ,KAAK,UAAK,YAAAH,QAAK,SAAS,OAAO,CAAC,UAAU;AAAA,IACtD;AAAA,EAEJ,WAAW,QAAQ,QAAQ;AACvB,YAAQ,KAAK,+CAAqC,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,EACjF;AACJ;AAGA,IAAI,UAAAE,QAAG,WAAW,kBAAkB,GAAG;AACrC,gBAAAC,QAAO,OAAO,EAAE,MAAM,oBAAoB,UAAU,KAAK,CAAC;AAC5D;AAGA,IAAI,QAAQ,IAAI,mBAAmB,QAAW;AAC1C,QAAM,oBAAoB,CAAC,YAAY;AAGvC,MAAI,QAAQ,IAAI,eAAe;AAC7B,sBAAkB,QAAQ,GAAG,QAAQ,IAAI,aAAa,GAAI,QAAQ,IAAI,cAAc,SAAS,GAAG,IAAI,KAAK,GAAI,YAAY;AAAA,EAC3H;AAEA,cAAY,iBAAiB;AACjC;AAGA,YAAY,CAAC,QAAQ,WAAW,CAAC,IAAI,MAAM,GAAG,MAAM;AAEpD,IAAI,QAAQ,IAAI,WAAW,QAAW;AACpC,cAAY,CAAC,QAAQ,UAAU,CAAC,IAAI,WAAW,CAAC,EAAE,GAAG,SAAS;AAChE;",
6
6
  "names": ["path", "envPath", "fs", "dotenv"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colyseus/tools",
3
- "version": "0.17.5",
3
+ "version": "0.17.7",
4
4
  "type": "module",
5
5
  "description": "Simplify the development and production settings for your Colyseus project.",
6
6
  "input": "./src/index.ts",
@@ -57,12 +57,12 @@
57
57
  "@types/cors": "^2.8.10",
58
58
  "@types/dotenv": "^8.2.0",
59
59
  "uwebsockets-express": "^1.1.10",
60
- "@colyseus/core": "^0.17.4",
61
- "@colyseus/bun-websockets": "^0.17.4",
62
- "@colyseus/ws-transport": "^0.17.5",
63
- "@colyseus/redis-presence": "^0.17.4",
64
- "@colyseus/redis-driver": "^0.17.4",
65
- "@colyseus/uwebsockets-transport": "^0.17.5"
60
+ "@colyseus/core": "^0.17.11",
61
+ "@colyseus/bun-websockets": "^0.17.5",
62
+ "@colyseus/redis-driver": "^0.17.5",
63
+ "@colyseus/redis-presence": "^0.17.5",
64
+ "@colyseus/uwebsockets-transport": "^0.17.6",
65
+ "@colyseus/ws-transport": "^0.17.6"
66
66
  },
67
67
  "peerDependencies": {
68
68
  "@colyseus/core": "0.17.x",
package/src/index.ts CHANGED
@@ -150,8 +150,8 @@ export async function listen<
150
150
 
151
151
  if (process.env.COLYSEUS_CLOUD !== undefined) {
152
152
  // listening on socket
153
- // const socketPath: any = `/run/colyseus/${port}.sock`;
154
- const socketPath: any = `/tmp/${port}.sock`;
153
+ const socketPath: any = `/run/colyseus/${port}.sock`;
154
+ // const socketPath: any = `/tmp/${port}.sock`;
155
155
 
156
156
  // check if .sock file is active
157
157
  // (fixes "ADDRINUSE" issue when restarting the server)
@@ -193,7 +193,9 @@ async function buildServerFromOptions<
193
193
  }
194
194
  }
195
195
 
196
- return defineServer<RoomTypes, Routes>(options.rooms || {} as RoomTypes, options.routes, {
196
+ return defineServer<RoomTypes, Routes>({
197
+ rooms: options.rooms || {} as RoomTypes,
198
+ routes: options.routes,
197
199
  ...serverOptions,
198
200
  transport: await getTransport(options),
199
201
  });