@colyseus/tools 0.17.18 → 0.18.0

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/LICENSE CHANGED
@@ -1,6 +1,4 @@
1
- Copyright (c) 2023 Endel Dreyer
2
- Copyright (c) 2021-2022 Lucid Sight
3
- Copyright (c) 2015-2021 Endel Dreyer
1
+ Copyright (c) 2015-2026 Endel Dreyer
4
2
 
5
3
  MIT License:
6
4
 
package/README.md CHANGED
@@ -7,19 +7,33 @@
7
7
  <a href="https://npmjs.com/package/colyseus">
8
8
  <img src="https://img.shields.io/npm/dm/colyseus.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAHdElNRQfjAgETESWYxR33AAAAtElEQVQoz4WQMQrCQBRE38Z0QoTcwF4Qg1h4BO0sxGOk80iCtViksrIQRRBTewWxMI1mbELYjYu+4rPMDPtn12ChMT3gavb4US5Jym0tcBIta3oDHv4Gwmr7nC4QAxBrCdzM2q6XqUnm9m9r59h7Rc0n2pFv24k4ttGMUXW+sGELTJjSr7QDKuqLS6UKFChVWWuFkZw9Z2AAvAirKT+JTlppIRnd6XgaP4goefI2Shj++OnjB3tBmHYK8z9zAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE5LTAyLTAxVDE4OjE3OjM3KzAxOjAwGQQixQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOS0wMi0wMVQxODoxNzozNyswMTowMGhZmnkAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC">
9
9
  </a>
10
- <a href="https://github.com/colyseus/colyseus/discussions" title="Discuss on Forum">
11
- <img src="https://img.shields.io/badge/discuss-on%20forum-brightgreen.svg?style=for-the-badge&colorB=0069b8&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAHdElNRQfjAgETDROxCNUzAAABB0lEQVQoz4WRvyvEARjGP193CnWRH+dHQmGwKZtFGcSmxHAL400GN95ktIpV2dzlLzDJgsGgGNRdDAzoQueS/PgY3HXHyT3T+/Y87/s89UANBKXBdoZo5J6L4K1K5ZxHfnjnlQUf3bKvkgy57a0r9hS3cXfMO1kWJMza++tj3Ac7/LY343x1NA9cNmYMwnSS/SP8JVFuSJmr44iFqvtmpjhmhBCrOOazCesq6H4P3bPBjFoIBydOk2bUA17I080Es+wSZ51B4DIA2zgjSpYcEe44Js01G0XjRcCU+y4ZMrDeLmfc9EnVd5M/o0VMeu6nJZxWJivLmhyw1WHTvrr2b4+2OFqra+ALwouTMDcqmjMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTktMDItMDFUMTg6MTM6MTkrMDE6MDAC9f6fAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE5LTAyLTAxVDE4OjEzOjE5KzAxOjAwc6hGIwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAASUVORK5CYII=" alt="Discussion forum" />
12
- </a>
13
10
  <a href="http://chat.colyseus.io">
14
11
  <img src="https://img.shields.io/discord/525739117951320081.svg?style=for-the-badge&colorB=7581dc&logo=discord&logoColor=white">
15
12
  </a>
13
+ <a href="https://github.com/colyseus/colyseus/discussions" title="Discuss Forum">
14
+ <img src="https://img.shields.io/badge/discuss-forum-brightgreen.svg?style=for-the-badge&colorB=0069b8&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAHdElNRQfjAgETDROxCNUzAAABB0lEQVQoz4WRvyvEARjGP193CnWRH+dHQmGwKZtFGcSmxHAL400GN95ktIpV2dzlLzDJgsGgGNRdDAzoQueS/PgY3HXHyT3T+/Y87/s89UANBKXBdoZo5J6L4K1K5ZxHfnjnlQUf3bKvkgy57a0r9hS3cXfMO1kWJMza++tj3Ac7/LY343x1NA9cNmYMwnSS/SP8JVFuSJmr44iFqvtmpjhmhBCrOOazCesq6H4P3bPBjFoIBydOk2bUA17I080Es+wSZ51B4DIA2zgjSpYcEe44Js01G0XjRcCU+y4ZMrDeLmfc9EnVd5M/o0VMeu6nJZxWJivLmhyw1WHTvrr2b4+2OFqra+ALwouTMDcqmjMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTktMDItMDFUMTg6MTM6MTkrMDE6MDAC9f6fAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE5LTAyLTAxVDE4OjEzOjE5KzAxOjAwc6hGIwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAASUVORK5CYII=" alt="Discussion forum" />
15
+ </a>
16
16
  <h3>
17
17
  Multiplayer Framework for Node.js. <br /><a href="https://docs.colyseus.io/">View documentation</a>
18
18
  </h3>
19
19
  </div>
20
20
 
21
- Colyseus is an Authoritative Multiplayer Framework for Node.js, with clients
22
- available for the Web, Unity3d, Defold, Haxe, and Cocos. ([See official clients](#%EF%B8%8F-official-client-integration))
21
+ Colyseus is an Authoritative Multiplayer Framework for Node.js, with SDKs
22
+ available for all major platforms and engines.
23
+
24
+ ## Client SDKs
25
+
26
+ | Platform | Install | Documentation | Demo |
27
+ |----------|---------|---------------|------|
28
+ | TypeScript | `npm install @colyseus/sdk` | [Getting Started](https://docs.colyseus.io/getting-started/typescript) | [PlayCanvas](https://github.com/endel/tank-battle-multiplayer/tree/master/web-playcanvas) |
29
+ | React | `npm install @colyseus/react` | [Getting Started](https://docs.colyseus.io/getting-started/react) | [R3F Lobby](https://github.com/endel/r3f-lobby-car-prototype) |
30
+ | Unity | [Download](https://github.com/colyseus/colyseus-unity3d/releases/latest/download/Colyseus_Plugin.unitypackage) | [Getting Started](https://docs.colyseus.io/getting-started/unity) | [Tank Battle](https://github.com/endel/tank-battle-multiplayer/tree/master/unity) |
31
+ | Godot | [Download](https://github.com/colyseus/native-sdk/releases?q=godot+sdk&expanded=true) | [Getting Started](https://docs.colyseus.io/getting-started/godot) | [Tank Battle](https://github.com/endel/tank-battle-multiplayer/tree/master/godot) |
32
+ | GameMaker | [Download](https://github.com/colyseus/native-sdk/releases?q=gamemaker+sdk&expanded=true) | [Getting Started](https://docs.colyseus.io/getting-started/gamemaker) | [Tank Battle](https://github.com/endel/tank-battle-multiplayer/tree/master/gamemaker) |
33
+ | Defold | See documentation → | [Getting Started](https://docs.colyseus.io/getting-started/defold) | [Tank Battle](https://github.com/endel/tank-battle-multiplayer/tree/master/defold) |
34
+ | Construct | [Download](https://www.construct.net/en/make-games/addons/111/colyseus-multiplayer-sdk) | [Getting Started](https://docs.colyseus.io/getting-started/construct3) | [Raw Demo](https://github.com/colyseus/construct3-demo) |
35
+ | Haxe | `haxelib install colyseus` | [Getting Started](https://docs.colyseus.io/getting-started/haxe) | [Tank Battle](https://github.com/endel/tank-battle-multiplayer/tree/master/haxe) |
36
+ | C / Static Libraries | [Download](https://github.com/colyseus/native-sdk/releases?q=%22Colyseus+Native+SDK+-+Static+Library%22&expanded=true) | [GitHub](https://github.com/colyseus/native-sdk) | [raylib](https://github.com/colyseus/native-sdk/tree/main/platforms/raylib) |
23
37
 
24
38
  The project focuses on providing synchronizable data structures for realtime and
25
39
  turn-based games, matchmaking, and ease of usage both on the server-side and
@@ -28,23 +42,24 @@ client-side.
28
42
  The mission of the framework is to be a standard netcode & matchmaking solution
29
43
  for any kind of project you can think of!
30
44
 
31
- ## Key features:
45
+ ## Why developers choose Colyseus:
32
46
 
33
- - WebSocket-based communication
34
- - Simple API in the server-side and client-side.
35
- - Automatic state synchronization from server-to-client (delta compressed)
36
- - Matchmaking clients into game rooms/sessions
37
- - Scale vertically or horizontally
47
+ - ⚡️ **Real-time state sync that just works** → Define your state on the server and it automatically synchronizes to all clients, delta-compressed and binary-encoded.
48
+ - ⚔️ **Built-in matchmaking** → Room-based architecture with filtering, queuing, and reconnection support out of the box.
49
+ - 📈 **Scalable** Go from 10 to 10,000+ CCU by scaling vertically or horizontally with Redis and load balancers.
50
+ - 🛡️ **Cheat-proof by design** → Authoritative server model ensures game logic runs on the server, not the client.
51
+ - 🛠️ **Use the tools you already know** → Built on Node.js and TypeScript with a simple, familiar API on both server and client.
52
+ - 💙 **Free forever** → MIT licensed, even for commercial games.
38
53
 
39
- See [public roadmap](https://github.com/colyseus/colyseus/wiki/Public-Roadmap) for future plans.
54
+ See [public roadmap](https://docs.colyseus.io/roadmap) for version 1.0.
40
55
 
41
56
  # 🚀 Quickstart
42
57
 
43
- Create a bare-bones Colyseus server by using `npm create colyseus-app@latest`:
58
+ Set up your own Colyseus server project for your game using `npm create colyseus-app@latest`:
44
59
 
45
60
  ```
46
- npm create colyseus-app@latest my-colyseus-server
47
- cd my-colyseus-server
61
+ npm create colyseus-app@latest ./my-server
62
+ cd my-server
48
63
  npm start
49
64
  ```
50
65
 
@@ -87,7 +102,7 @@ Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds
87
102
  <td align="center"><a href="https://github.com/TinyDobbins"><img src="https://avatars2.githubusercontent.com/u/20824844?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nikita Borisov</b></sub></a><br /><a href="https://github.com/colyseus/colyseus/issues?q=author%3ATinyDobbins" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=TinyDobbins" title="Code">💻</a> <a href="#business-TinyDobbins" title="Business development">💼</a> <a href="#ideas-TinyDobbins" title="Ideas, Planning, & Feedback">🤔</a></td>
88
103
  <td align="center"><a href="https://acemobe.com/"><img src="https://avatars2.githubusercontent.com/u/232101?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Phil Harvey</b></sub></a><br /><a href="https://github.com/colyseus/colyseus/commits?author=filharvey" title="Documentation">📖</a></td>
89
104
  <td align="center"><a href="https://github.com/serjek"><img src="https://avatars2.githubusercontent.com/u/18265157?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sergey</b></sub></a><br /><a href="https://github.com/colyseus/colyseus/issues?q=author%3Aserjek" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=serjek" title="Code">💻</a></td>
90
- <td align="center"><a href="https://oyed.io"><img src="https://avatars0.githubusercontent.com/u/853683?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tom</b></sub></a><br /><a href="#question-oyed" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/issues?q=author%3Aoyed" title="Bug reports">🐛</a> <a href="#ideas-oyed" title="Ideas, Planning, & Feedback">🤔</a></td>
105
+ <td align="center"><a href="https://devlsh.com"><img src="https://avatars0.githubusercontent.com/u/853683?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sophie</b></sub></a><br /><a href="#question-devlsh" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/issues?q=author%3Adevlsh" title="Bug reports">🐛</a> <a href="#ideas-devlsh" title="Ideas, Planning, & Feedback">🤔</a></td>
91
106
  <td align="center"><a href="https://github.com/supertommy"><img src="https://avatars0.githubusercontent.com/u/2236153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tommy Leung</b></sub></a><br /><a href="#mentoring-supertommy" title="Mentoring">🧑‍🏫</a></td>
92
107
  <td align="center"><a href="https://github.com/digimbyte"><img src="https://avatars2.githubusercontent.com/u/6645396?v=4?s=100" width="100px;" alt=""/><br /><sub><b>digimbyte</b></sub></a><br /><a href="https://github.com/colyseus/colyseus/commits?author=digimbyte" title="Documentation">📖</a></td>
93
108
  </tr>
package/build/loadenv.cjs CHANGED
@@ -36,7 +36,7 @@ function getNodeEnv() {
36
36
  function getRegion() {
37
37
  return (process.env.REGION || "unknown").toLowerCase();
38
38
  }
39
- function loadEnvFile(envFileOptions, log = "none") {
39
+ function loadEnvFile(envFileOptions, log = "none", override = false) {
40
40
  const envPaths = [];
41
41
  envFileOptions.forEach((envFilename) => {
42
42
  if (envFilename.startsWith("/")) {
@@ -48,7 +48,7 @@ function loadEnvFile(envFileOptions, log = "none") {
48
48
  });
49
49
  const envPath = envPaths.find((envPath2) => import_fs.default.existsSync(envPath2));
50
50
  if (envPath) {
51
- import_dotenv.default.config({ path: envPath });
51
+ import_dotenv.default.config({ path: envPath, override });
52
52
  if (log !== "none") {
53
53
  console.info(`\u2705 ${import_path.default.basename(envPath)} loaded.`);
54
54
  }
@@ -65,7 +65,7 @@ if (process.env.COLYSEUS_CLOUD !== void 0) {
65
65
  if (process.env.APP_ROOT_PATH) {
66
66
  cloudEnvFileNames.unshift(`${process.env.APP_ROOT_PATH}${process.env.APP_ROOT_PATH.endsWith("/") ? "" : "/"}.env.cloud`);
67
67
  }
68
- loadEnvFile(cloudEnvFileNames);
68
+ loadEnvFile(cloudEnvFileNames, "none", true);
69
69
  }
70
70
  if (process.env.REGION !== void 0) {
71
71
  loadEnvFile([`.env.${getRegion()}.${getNodeEnv()}`], "success");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/loadenv.ts"],
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// (overrides previous env configs)\nloadEnvFile([`.env.${getNodeEnv()}`, `.env`], 'both');\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\nif (process.env.REGION !== undefined) {\n loadEnvFile([`.env.${getRegion()}.${getNodeEnv()}`], 'success');\n}\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,YAAY,CAAC,QAAQ,WAAW,CAAC,IAAI,MAAM,GAAG,MAAM;AAGpD,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;AAEA,IAAI,QAAQ,IAAI,WAAW,QAAW;AACpC,cAAY,CAAC,QAAQ,UAAU,CAAC,IAAI,WAAW,CAAC,EAAE,GAAG,SAAS;AAChE;",
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', override: boolean = false) {\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, override });\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// (overrides previous env configs)\nloadEnvFile([`.env.${getNodeEnv()}`, `.env`], 'both');\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 // .env.cloud can override previously loaded environment variables\n loadEnvFile(cloudEnvFileNames, 'none', true);\n}\n\nif (process.env.REGION !== undefined) {\n loadEnvFile([`.env.${getRegion()}.${getNodeEnv()}`], 'success');\n}\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,WAAoB,OAAO;AAClH,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,SAAS,SAAS,CAAC;AAEzC,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,YAAY,CAAC,QAAQ,WAAW,CAAC,IAAI,MAAM,GAAG,MAAM;AAGpD,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;AAGA,cAAY,mBAAmB,QAAQ,IAAI;AAC/C;AAEA,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/build/loadenv.mjs CHANGED
@@ -19,7 +19,7 @@ function getNodeEnv() {
19
19
  function getRegion() {
20
20
  return (process.env.REGION || "unknown").toLowerCase();
21
21
  }
22
- function loadEnvFile(envFileOptions, log = "none") {
22
+ function loadEnvFile(envFileOptions, log = "none", override = false) {
23
23
  const envPaths = [];
24
24
  envFileOptions.forEach((envFilename) => {
25
25
  if (envFilename.startsWith("/")) {
@@ -31,7 +31,7 @@ function loadEnvFile(envFileOptions, log = "none") {
31
31
  });
32
32
  const envPath = envPaths.find((envPath2) => fs.existsSync(envPath2));
33
33
  if (envPath) {
34
- dotenv.config({ path: envPath });
34
+ dotenv.config({ path: envPath, override });
35
35
  if (log !== "none") {
36
36
  console.info(`\u2705 ${path.basename(envPath)} loaded.`);
37
37
  }
@@ -48,7 +48,7 @@ if (process.env.COLYSEUS_CLOUD !== void 0) {
48
48
  if (process.env.APP_ROOT_PATH) {
49
49
  cloudEnvFileNames.unshift(`${process.env.APP_ROOT_PATH}${process.env.APP_ROOT_PATH.endsWith("/") ? "" : "/"}.env.cloud`);
50
50
  }
51
- loadEnvFile(cloudEnvFileNames);
51
+ loadEnvFile(cloudEnvFileNames, "none", true);
52
52
  }
53
53
  if (process.env.REGION !== void 0) {
54
54
  loadEnvFile([`.env.${getRegion()}.${getNodeEnv()}`], "success");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/loadenv.ts"],
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// (overrides previous env configs)\nloadEnvFile([`.env.${getNodeEnv()}`, `.env`], 'both');\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\nif (process.env.REGION !== undefined) {\n loadEnvFile([`.env.${getRegion()}.${getNodeEnv()}`], 'success');\n}\n"],
5
- "mappings": ";;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;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,KAAK,QAAQ,KAAK,QAAQ,OAAO,cAAa,eAAe,WAAS,MAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC;AACxI,eAAS,KAAK,KAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,SAAS,KAAK,CAACA,aAAY,GAAG,WAAWA,QAAO,CAAC;AAEjE,MAAI,SAAS;AACT,WAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAE/B,QAAI,QAAQ,QAAQ;AAChB,cAAQ,KAAK,UAAK,KAAK,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,GAAG,WAAW,kBAAkB,GAAG;AACrC,SAAO,OAAO,EAAE,MAAM,oBAAoB,UAAU,KAAK,CAAC;AAC5D;AAGA,YAAY,CAAC,QAAQ,WAAW,CAAC,IAAI,MAAM,GAAG,MAAM;AAGpD,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;AAEA,IAAI,QAAQ,IAAI,WAAW,QAAW;AACpC,cAAY,CAAC,QAAQ,UAAU,CAAC,IAAI,WAAW,CAAC,EAAE,GAAG,SAAS;AAChE;",
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', override: boolean = false) {\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, override });\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// (overrides previous env configs)\nloadEnvFile([`.env.${getNodeEnv()}`, `.env`], 'both');\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 // .env.cloud can override previously loaded environment variables\n loadEnvFile(cloudEnvFileNames, 'none', true);\n}\n\nif (process.env.REGION !== undefined) {\n loadEnvFile([`.env.${getRegion()}.${getNodeEnv()}`], 'success');\n}\n"],
5
+ "mappings": ";;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,YAAY;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,WAAoB,OAAO;AAClH,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,KAAK,QAAQ,KAAK,QAAQ,OAAO,cAAa,eAAe,WAAS,MAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC;AACxI,eAAS,KAAK,KAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW,CAAC;AAAA,IACxD;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,SAAS,KAAK,CAACA,aAAY,GAAG,WAAWA,QAAO,CAAC;AAEjE,MAAI,SAAS;AACT,WAAO,OAAO,EAAE,MAAM,SAAS,SAAS,CAAC;AAEzC,QAAI,QAAQ,QAAQ;AAChB,cAAQ,KAAK,UAAK,KAAK,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,GAAG,WAAW,kBAAkB,GAAG;AACrC,SAAO,OAAO,EAAE,MAAM,oBAAoB,UAAU,KAAK,CAAC;AAC5D;AAGA,YAAY,CAAC,QAAQ,WAAW,CAAC,IAAI,MAAM,GAAG,MAAM;AAGpD,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;AAGA,cAAY,mBAAmB,QAAQ,IAAI;AAC/C;AAEA,IAAI,QAAQ,IAAI,WAAW,QAAW;AACpC,cAAY,CAAC,QAAQ,UAAU,CAAC,IAAI,WAAW,CAAC,EAAE,GAAG,SAAS;AAChE;",
6
6
  "names": ["envPath"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colyseus/tools",
3
- "version": "0.17.18",
3
+ "version": "0.18.0",
4
4
  "type": "module",
5
5
  "description": "Simplify the development and production settings for your Colyseus project.",
6
6
  "input": "./src/index.ts",
@@ -56,19 +56,20 @@
56
56
  "pm2": "^6.0.14",
57
57
  "mocha": "^11.7.5",
58
58
  "uwebsockets-express": "^2.0.1",
59
- "@colyseus/uwebsockets-transport": "^0.17.12",
60
- "@colyseus/core": "^0.17.29",
61
- "@colyseus/ws-transport": "^0.17.8",
62
- "@colyseus/redis-driver": "^0.17.6",
63
- "@colyseus/redis-presence": "^0.17.6",
64
- "@colyseus/bun-websockets": "^0.17.6"
59
+ "@colyseus/bun-websockets": "^0.18.0",
60
+ "@colyseus/redis-driver": "^0.18.0",
61
+ "@colyseus/core": "^0.18.0",
62
+ "@colyseus/redis-presence": "^0.18.0",
63
+ "@colyseus/uwebsockets-transport": "^0.18.0",
64
+ "@colyseus/ws-transport": "^0.18.0"
65
65
  },
66
66
  "peerDependencies": {
67
- "@colyseus/core": "0.17.x",
68
- "@colyseus/ws-transport": "0.17.x"
67
+ "@colyseus/core": "0.18.x",
68
+ "@colyseus/ws-transport": "0.18.x"
69
69
  },
70
70
  "publishConfig": {
71
- "access": "public"
71
+ "access": "public",
72
+ "tag": "next"
72
73
  },
73
74
  "apps": [
74
75
  {
package/src/loadenv.ts CHANGED
@@ -16,7 +16,7 @@ function getRegion() {
16
16
  return (process.env.REGION || "unknown").toLowerCase();
17
17
  }
18
18
 
19
- function loadEnvFile(envFileOptions: string[], log: 'none' | 'success' | 'both' = 'none') {
19
+ function loadEnvFile(envFileOptions: string[], log: 'none' | 'success' | 'both' = 'none', override: boolean = false) {
20
20
  const envPaths = [];
21
21
  envFileOptions.forEach((envFilename) => {
22
22
  if (envFilename.startsWith("/")) {
@@ -31,7 +31,7 @@ function loadEnvFile(envFileOptions: string[], log: 'none' | 'success' | 'both'
31
31
  const envPath = envPaths.find((envPath) => fs.existsSync(envPath));
32
32
 
33
33
  if (envPath) {
34
- dotenv.config({ path: envPath });
34
+ dotenv.config({ path: envPath, override });
35
35
 
36
36
  if (log !== "none") {
37
37
  console.info(`✅ ${path.basename(envPath)} loaded.`);
@@ -59,7 +59,8 @@ if (process.env.COLYSEUS_CLOUD !== undefined) {
59
59
  cloudEnvFileNames.unshift(`${process.env.APP_ROOT_PATH}${(process.env.APP_ROOT_PATH.endsWith("/") ? "" : "/")}.env.cloud`);
60
60
  }
61
61
 
62
- loadEnvFile(cloudEnvFileNames);
62
+ // .env.cloud can override previously loaded environment variables
63
+ loadEnvFile(cloudEnvFileNames, 'none', true);
63
64
  }
64
65
 
65
66
  if (process.env.REGION !== undefined) {