@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 +11 -7
- package/build/index.cjs.map +2 -2
- package/build/index.mjs +4 -2
- package/build/index.mjs.map +2 -2
- package/build/loadenv.cjs +2 -0
- package/build/loadenv.cjs.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +5 -3
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.
|
|
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
|
-
|
|
47
|
+
var BunWebSockets = import("@colyseus/bun-websockets");
|
|
46
48
|
BunWebSockets.catch(() => {
|
|
47
49
|
});
|
|
48
|
-
|
|
50
|
+
var RedisDriver = import("@colyseus/redis-driver");
|
|
49
51
|
RedisDriver.catch(() => {
|
|
50
52
|
});
|
|
51
|
-
|
|
53
|
+
var RedisPresence = import("@colyseus/redis-presence");
|
|
52
54
|
RedisPresence.catch(() => {
|
|
53
55
|
});
|
|
54
|
-
|
|
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 = `/
|
|
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)(
|
|
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
|
});
|
package/build/index.cjs.map
CHANGED
|
@@ -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": "
|
|
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 = `/
|
|
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(
|
|
105
|
+
return defineServer({
|
|
106
|
+
rooms: options.rooms || {},
|
|
107
|
+
routes: options.routes,
|
|
106
108
|
...serverOptions,
|
|
107
109
|
transport: await getTransport(options)
|
|
108
110
|
});
|
package/build/index.mjs.map
CHANGED
|
@@ -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": ";AAAA,OAAO;AACP,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,SAAS;AAChB,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB;AAAA,EAIE;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AAEnC,IAAM,gBAAgB,OAAO,0BAA0B;AAAG,cAAc,MAAM,MAAM;AAAC,CAAC;AACtF,IAAM,cAAc,OAAO,wBAAwB;AAAG,YAAY,MAAM,MAAM;AAAC,CAAC;AAChF,IAAM,gBAAgB,OAAO,0BAA0B;AAAG,cAAc,MAAM,MAAM;AAAC,CAAC;AAoBtF,IAAM,eAAkE;AAAA,EACtE,eAAe;AAAA,EACf,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA;AAAA,EAEhB,SAAS;AACX;AAEe,SAAR,cAGL,SAAuE;AACvE,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,aAAa,MAAM,GAAG;AACzB,YAAM,IAAI,MAAM,0BAAqB,MAAM,2BAA2B,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC9G;AACA,QAAG,QAAQ,MAAM,MAAM,UAAa,OAAO,QAAQ,MAAM,MAAO,aAAa,MAAM,GAAG;AACpF,YAAM,IAAI,MAAM,2BAAsB,MAAM,sBAAsB,aAAa,MAAM,CAAC,SAAS;AAAA,IACjG;AAAA,EACF;AACA,SAAO;AACT;AA4BA,eAAsB,OAIlB,SACA,OAAe,OAAO,QAAQ,IAAI,QAAQ,IAAI,GAChD;AAEE,MAAI,QAAQ,IAAI,mBAAmB,QAAW;AAC1C,WAAO;AAAA,EACX;AAMA,QAAM,gBAAgB,OAAO,QAAQ,IAAI,qBAAqB,GAAG;AACjE,UAAQ;AAER,MAAI;AACJ,MAAI,cAAc;AAElB,MAAI,mBAAmB,QAAQ;AAC3B,aAAS;AAGT,QAAI,QAAQ,IAAI,mBAAmB,QAAW;AAE1C,YAAM,gBAAgB,WAAW,kBAAkB;AACnD,YAAM,kBAAkB,WAAW,oBAAoB;AAEvD,YAAM,cAAc,MAAM;AAAA,QACtB;AAAA,QACA,gBAAgB,SAAY,WAAW;AAAA,QACvC,kBAAkB,SAAY,WAAW;AAAA,MAC7C;AAGA,UAAI,gBAAgB,iBAAiB,kBAAkB;AACnD,cAAM,WAAW,MAAM,YAAY,UAAU,YAAY,QAAQ,YAAY,aAAa;AAAA,MAC9F;AAAA,IACJ;AAAA,EAEJ,OAAO;AACH,aAAS,MAAM,uBAA0C,SAAS,IAAI;AACtE,kBAAc,QAAQ;AAEtB,UAAM,QAAQ,uBAAuB,MAAM;AAC3C,UAAM,WAAW;AACjB,UAAM,QAAQ,eAAe;AAAA,EACjC;AAEA,MAAI,QAAQ,IAAI,mBAAmB,QAAW;
|
|
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);
|
package/build/loadenv.cjs.map
CHANGED
|
@@ -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": "
|
|
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.
|
|
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.
|
|
61
|
-
"@colyseus/bun-websockets": "^0.17.
|
|
62
|
-
"@colyseus/
|
|
63
|
-
"@colyseus/redis-presence": "^0.17.
|
|
64
|
-
"@colyseus/
|
|
65
|
-
"@colyseus/
|
|
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
|
-
|
|
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>(
|
|
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
|
});
|