@colyseus/tools 0.15.0-preview.0 → 0.15.0-preview.2

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/README.md ADDED
@@ -0,0 +1,164 @@
1
+ <div align="center">
2
+ <a href="https://github.com/colyseus/colyseus">
3
+ <img src="media/header.png?raw=true" />
4
+ </a>
5
+ <br>
6
+ <br>
7
+ <a href="https://npmjs.com/package/colyseus">
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
+ </a>
10
+ <a href="http://discuss.colyseus.io" 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
+ <a href="https://discord.gg/RY8rRS7">
14
+ <img src="https://img.shields.io/discord/525739117951320081.svg?style=for-the-badge&colorB=7581dc&logo=discord&logoColor=white">
15
+ </a>
16
+ <h3>
17
+ Multiplayer Framework for Node.js. <br /><a href="https://docs.colyseus.io/">View documentation</a>
18
+ </h3>
19
+ </div>
20
+
21
+ Colyseus is an Authoritative Multiplayer Framework for Node.js, with clients
22
+ available for the Web, Unity3d, Defold, Haxe, and Cocos2d-X. ([See official clients](#%EF%B8%8F-official-client-integration))
23
+
24
+ The project focuses on providing synchronizable data structures for realtime and
25
+ turn-based games, matchmaking, and ease of usage both on the server-side and
26
+ client-side.
27
+
28
+ The mission of the framework is to be a standard netcode & matchmaking solution
29
+ for any kind of project you can think of!
30
+
31
+ You're encouraged to take a look on [some games being developed with
32
+ it](https://discuss.colyseus.io/category/5/showcase) and make your own!
33
+
34
+ > ⭐️ Enjoying Colyseus? Show your support by starring the project on GitHub ⭐️
35
+
36
+ ## What Colyseus provides to you:
37
+
38
+ - WebSocket-based communication
39
+ - Simple API in the server-side and client-side.
40
+ - Automatic state synchronization between server and client.
41
+ - Matchmaking clients into game sessions
42
+ - Scale vertically or horizontally
43
+
44
+ ## What Colyseus won't provide:
45
+
46
+ - Game Engine: Colyseus is agnostic of the engine you're using. Need Physics? Add your own logic / package.
47
+ - Database: It's up to you to configure and select which database you'd like to use.
48
+
49
+ See [roadmap](https://github.com/colyseus/colyseus/wiki/Roadmap) for our future plans.
50
+
51
+ # 🚀 Quickstart
52
+
53
+ Create a bare-bones Colyseus server by using `npm init colyseus-app`.
54
+
55
+ ```
56
+ npm init colyseus-app my-colyseus-server
57
+ cd my-colyseus-server
58
+ npm start
59
+ ```
60
+ # 🏟 Colyseus Arena: Fast & Scalable Cloud Hosting
61
+
62
+ - Looking for a fully managed solution for your Colyseus game server?
63
+ - Want to focus on game development and not on the hosting and infrastructure?
64
+ - Launching a production title and need a solution for 1,000 to 100,000+ CCUs?
65
+
66
+ If so [Colyseus Arena](https://www.colyseus.io/arena) cloud hosting is the solution you are looking for. Easily upload your existing Colyseus Server code and get started today for Free!
67
+
68
+ # 🕹️ Official Client Integration
69
+
70
+ - [JavaScript/TypeScript](https://github.com/colyseus/colyseus.js)
71
+ - [Unity](https://github.com/colyseus/colyseus-unity3d) ([unity3d.com](https://unity3d.com/))
72
+ - [Defold Engine](https://github.com/colyseus/colyseus-defold) ([defold.com](https://www.defold.com/))
73
+ - [Haxe](https://github.com/colyseus/colyseus-hx) ([haxe.org](https://haxe.org/))
74
+ - [Construct 3](https://github.com/colyseus/colyseus-construct3) ([construct3.net](https://www.construct.net/))
75
+ - [Cocos2d-x](https://github.com/colyseus/colyseus-cocos2d-x) ([cocos2d-x.org](https://cocos2d-x.org/))
76
+
77
+ # 🛠️ Tools
78
+
79
+ - [@colyseus/proxy](https://github.com/colyseus/proxy) - Proxy & Service Discovery for scaling Colyseus
80
+ - [@colyseus/monitor](https://github.com/colyseus/colyseus-monitor) - A Web Monitoring Panel for Colyseus
81
+ - [@colyseus/loadtest](https://github.com/colyseus/colyseus-loadtest) - Utility tool for load testing Colyseus
82
+
83
+ ## Tools made by the community ❤️
84
+
85
+ - [godot-colyseus](https://github.com/gsioteam/godot-colyseus): Colyseus SDK for Godot, written in GDScript (by [@gsioteam](https://github.com/gsioteam))
86
+ - [colyseus-ue4](https://github.com/charisma-ai/colyseus-ue4): Colyseus SDK for Unreal Engine 4 (by [@bensalilijames](https://github.com/bensalilijames))
87
+ - [colyseus-hxjs](https://github.com/serjek/colyseus-hxjs): Haxe externs for colyseus server (by [@serjek](https://github.com/serjek))
88
+ - [colyseus-kotlin](https://github.com/doorbash/colyseus-kotlin): Client for Java/Kotlin (by [@doorbash](https://github.com/doorbash))
89
+ - [Stencyl Extension](http://community.stencyl.com/index.php/topic,61150.0.html): [Stencyl](http://stencyl.com) extension to communicate with a Colyseus server (by [MdotEdot](http://www.stencyl.com/users/index/32424))
90
+ - [Colyseus-ObjC](https://github.com/swittk/Colyseus-ObjC): Client for Objective C (by [@swittk](https://github.com/swittk))
91
+ - [Colyseus-for-C2](https://github.com/Keevle/Colyseus-for-C2): Client for Construct 2 (by [@Keevle](https://github.com/Keevle))
92
+
93
+ # Usage examples
94
+
95
+ See the [official examples](https://github.com/colyseus/colyseus-examples) for
96
+ usage reference with the latest version of Colyseus.
97
+
98
+ - [Tech Demo: Shooting Gallery](https://github.com/colyseus/unity-demo-shooting-gallery) - Unity + Colyseus "Shooting Gallery" Tech Demo
99
+ - [Colyseus + PixiJS Boilerplate](https://colyseus-pixijs-boilerplate.herokuapp.com/) ([source-code](https://github.com/endel/colyseus-pixijs-boilerplate)) - Simplistic agar.io implementation using [PixiJS](https://github.com/pixijs/pixi.js)
100
+ - [Colyseus + BabylonJS Boilerplate](https://babylonjs-multiplayer.herokuapp.com/) ([source-code](https://github.com/endel/babylonjs-multiplayer-boilerplate)) - Bare-bones [BabylonJS](https://github.com/BabylonJS/Babylon.js) example
101
+ - [Tic Tac Toe](https://tictactoe-colyseus.herokuapp.com) ([source-code](https://github.com/endel/tic-tac-toe)) - Tic Tac Toe using [PixiJS](https://github.com/pixijs/pixi.js) and [Defold Engine](https://defold.com)
102
+ - [Collaborative Drawing Prototype](https://colyseus-drawing-prototype.herokuapp.com/) ([source-code](https://github.com/endel/colyseus-collaborative-drawing)) - Collaborative drawing using HTML5 canvas.
103
+ - (outdated: < v0.8.x): [tanx](https://playcanvas.com/project/367035/overview/tanxcolyseus), [react-example](https://github.com/endel/colyseus-react-example), [LD35 entry: dotower](http://ludumdare.com/compo/ludum-dare-35/?action=preview&uid=50958)
104
+
105
+ # Contributors
106
+
107
+ Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):
108
+
109
+ <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
110
+ <!-- prettier-ignore-start -->
111
+ <!-- markdownlint-disable -->
112
+ <table>
113
+ <tr>
114
+ <td align="center"><a href="https://github.com/halftheopposite/"><img src="https://avatars0.githubusercontent.com/u/5473864?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aymeric Chauvin</b></sub></a><br /><a href="#question-halftheopposite" title="Answering Questions">💬</a> <a href="#example-halftheopposite" title="Examples">💡</a></td>
115
+ <td align="center"><a href="https://github.com/brian-hay"><img src="https://avatars2.githubusercontent.com/u/1428000?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brian Hay</b></sub></a><br /><a href="#content-brian-hay" title="Content">🖋</a></td>
116
+ <td align="center"><a href="https://github.com/damian-pastorini"><img src="https://avatars2.githubusercontent.com/u/1211779?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Damian A. Pastorini</b></sub></a><br /><a href="#question-damian-pastorini" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/commits?author=damian-pastorini" title="Documentation">📖</a> <a href="https://github.com/colyseus/colyseus/issues?q=author%3Adamian-pastorini" title="Bug reports">🐛</a></td>
117
+ <td align="center"><a href="https://github.com/Zielak"><img src="https://avatars0.githubusercontent.com/u/625693?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Darek Greenly</b></sub></a><br /><a href="#question-Zielak" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/issues?q=author%3AZielak" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=Zielak" title="Code">💻</a></td>
118
+ <td align="center"><a href="https://github.com/Vidski"><img src="https://avatars.githubusercontent.com/u/36316706?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Rydwanski</b></sub></a><br /><a href="#question-Vidski" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/commits?author=Vidski" title="Code">💻</a></td>
119
+ <td align="center"><a href="https://github.com/drburton"><img src="https://avatars0.githubusercontent.com/u/625595?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dr. Burton</b></sub></a><br /><a href="#mentoring-drburton" title="Mentoring">🧑‍🏫</a></td>
120
+ <td align="center"><a href="https://twitter.com/endel"><img src="https://avatars3.githubusercontent.com/u/130494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Endel Dreyer</b></sub></a><br /><a href="https://github.com/colyseus/colyseus/commits?author=endel" title="Code">💻</a> <a href="https://github.com/colyseus/colyseus/commits?author=endel" title="Documentation">📖</a> <a href="#example-endel" title="Examples">💡</a></td>
121
+ </tr>
122
+ <tr>
123
+ <td align="center"><a href="https://github.com/enriqueto"><img src="https://avatars2.githubusercontent.com/u/5557196?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Enriqueto</b></sub></a><br /><a href="#business-enriqueto" title="Business development">💼</a></td>
124
+ <td align="center"><a href="https://github.com/fazriz"><img src="https://avatars0.githubusercontent.com/u/2628698?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fazri Zubair</b></sub></a><br /><a href="#question-fazriz" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/commits?author=fazriz" title="Code">💻</a> <a href="#ideas-fazriz" title="Ideas, Planning, & Feedback">🤔</a> <a href="#business-fazriz" title="Business development">💼</a></td>
125
+ <td align="center"><a href="https://twitter.com/Federkun"><img src="https://avatars2.githubusercontent.com/u/21344385?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Federico</b></sub></a><br /><a href="https://github.com/colyseus/colyseus/issues?q=author%3AFederkun" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=Federkun" title="Code">💻</a></td>
126
+ <td align="center"><a href="https://github.com/mobyjames/"><img src="https://avatars0.githubusercontent.com/u/1327007?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Jacoby</b></sub></a><br /><a href="#question-mobyjames" title="Answering Questions">💬</a> <a href="#example-mobyjames" title="Examples">💡</a> <a href="#content-mobyjames" title="Content">🖋</a></td>
127
+ <td align="center"><a href="http://wenish.github.io/portfolio/"><img src="https://avatars0.githubusercontent.com/u/18367963?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonas Voland</b></sub></a><br /><a href="#question-Wenish" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/issues?q=author%3AWenish" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=Wenish" title="Code">💻</a> <a href="#ideas-Wenish" title="Ideas, Planning, & Feedback">🤔</a> <a href="#example-Wenish" title="Examples">💡</a></td>
128
+ <td align="center"><a href="http://seiyria.com"><img src="https://avatars0.githubusercontent.com/u/763609?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kyle J. Kemp</b></sub></a><br /><a href="#question-seiyria" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/issues?q=author%3Aseiyria" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=seiyria" title="Code">💻</a> <a href="#ideas-seiyria" title="Ideas, Planning, & Feedback">🤔</a></td>
129
+ <td align="center"><a href="https://github.com/LukeWood/"><img src="https://avatars0.githubusercontent.com/u/12191303?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Luke Wood</b></sub></a><br /><a href="#question-LukeWood" title="Answering Questions">💬</a> <a href="https://github.com/colyseus/colyseus/issues?q=author%3ALukeWood" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=LukeWood" title="Code">💻</a></td>
130
+ </tr>
131
+ <tr>
132
+ <td align="center"><a href="https://github.com/doorbash"><img src="https://avatars2.githubusercontent.com/u/5982526?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Milad Doorbash</b></sub></a><br /><a href="https://github.com/colyseus/colyseus/issues?q=author%3Adoorbash" title="Bug reports">🐛</a> <a href="https://github.com/colyseus/colyseus/commits?author=doorbash" title="Code">💻</a></td>
133
+ <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>
134
+ <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>
135
+ <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>
136
+ <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>
137
+ <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>
138
+ <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>
139
+ </tr>
140
+ </table>
141
+
142
+ <!-- markdownlint-restore -->
143
+ <!-- prettier-ignore-end -->
144
+
145
+ <!-- ALL-CONTRIBUTORS-LIST:END -->
146
+
147
+ This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification.
148
+ Contributions of any kind are welcome!
149
+
150
+ # Contributing
151
+
152
+ We encourage you to contribute to Colyseus! Please check out the [Contributing
153
+ guide](.github/CONTRIBUTING.md) for guidelines about how to proceed. Join us!
154
+
155
+ Everyone interacting in Colyseus and its sub-projects' codebases, issue trackers
156
+ and chat rooms is expected to follow the [code of conduct](CODE_OF_CONDUCT.md).
157
+
158
+ # Backers / Supporters via Patreon
159
+
160
+ As of February 2021, Colyseus is owned and sponsored by [Lucid Sight](https://www.lucidsight.com/). A warm **thank you** for previous supporters of the project is forever documented in the [early supporters wiki page](https://github.com/colyseus/colyseus/wiki/Early-supporters-(2017-2021)).
161
+
162
+ # License
163
+
164
+ MIT
package/build/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import express from "express";
2
2
  import { Server, ServerOptions, Transport } from '@colyseus/core';
3
- export interface ArenaOptions {
3
+ export interface ConfigOptions {
4
4
  options?: ServerOptions;
5
5
  displayLogs?: boolean;
6
6
  getId?: () => string;
@@ -9,11 +9,11 @@ export interface ArenaOptions {
9
9
  initializeGameServer?: (app: Server) => void;
10
10
  beforeListen?: () => void;
11
11
  }
12
- export default function (options: ArenaOptions): ArenaOptions;
12
+ export default function (options: ConfigOptions): ConfigOptions;
13
13
  /**
14
14
  * Listen on your development environment
15
- * @param options Arena options
15
+ * @param options Application options
16
16
  * @param port Port number to bind Colyseus + Express
17
17
  */
18
- export declare function listen(options: ArenaOptions, port?: number): Promise<Server>;
19
- export declare function getTransport(options: ArenaOptions): Promise<Transport>;
18
+ export declare function listen(options: ConfigOptions, port?: number): Promise<Server>;
19
+ export declare function getTransport(options: ConfigOptions): Promise<Transport>;
package/build/index.js CHANGED
@@ -29,6 +29,7 @@ __export(src_exports, {
29
29
  });
30
30
  module.exports = __toCommonJS(src_exports);
31
31
  var import_fs = __toESM(require("fs"));
32
+ var import_os = __toESM(require("os"));
32
33
  var import_http = __toESM(require("http"));
33
34
  var import_path = __toESM(require("path"));
34
35
  var import_cors = __toESM(require("cors"));
@@ -40,18 +41,16 @@ try {
40
41
  uWebSocketsExpressCompatibility = require("uwebsockets-express").default;
41
42
  } catch (e) {
42
43
  }
43
- if (process.env.NODE_ARENA !== "true") {
44
- const envFilename = process.env.NODE_ENV === "production" ? "arena.env" : `${process.env.NODE_ENV || "development"}.env`;
45
- const envPath = [
46
- import_path.default.resolve(import_path.default.dirname(require?.main?.filename || process.cwd()), "..", envFilename),
47
- import_path.default.resolve(process.cwd(), envFilename)
48
- ].find((envPath2) => import_fs.default.existsSync(envPath2));
49
- if (envPath) {
50
- import_dotenv.default.config({ path: envPath });
51
- import_core.logger.info(`\u2705 ${envFilename} loaded.`);
52
- } else {
53
- import_core.logger.info(`\u26A0\uFE0F ${envFilename} not found.`);
54
- }
44
+ const envFilename = `${process.env.NODE_ENV || "development"}.env`;
45
+ const envPath = [
46
+ import_path.default.resolve(import_path.default.dirname(require?.main?.filename || process.cwd()), "..", envFilename),
47
+ import_path.default.resolve(process.cwd(), envFilename)
48
+ ].find((envPath2) => import_fs.default.existsSync(envPath2));
49
+ if (envPath) {
50
+ import_dotenv.default.config({ path: envPath });
51
+ import_core.logger.info(`\u2705 ${envFilename} loaded.`);
52
+ } else {
53
+ import_core.logger.info(`\u26A0\uFE0F ${envFilename} not found.`);
55
54
  }
56
55
  const ALLOWED_KEYS = {
57
56
  "displayLogs": "boolean",
@@ -76,6 +75,14 @@ function src_default(options) {
76
75
  async function listen(options, port = Number(process.env.PORT || 2567)) {
77
76
  const serverOptions = options.options || {};
78
77
  options.displayLogs = options.displayLogs ?? true;
78
+ const processNumber = Number(process.env.NODE_APP_INSTANCE || "0");
79
+ port += processNumber;
80
+ if (process.env.COLYSEUS_CLOUD !== void 0) {
81
+ serverOptions.publicAddress = process.env.SUBDOMAIN + "." + process.env.SERVER_NAME;
82
+ if (import_os.default.cpus().length > 1) {
83
+ serverOptions.publicAddress += "/" + processNumber + "/";
84
+ }
85
+ }
79
86
  const transport = await getTransport(options);
80
87
  const gameServer = new import_core.Server({
81
88
  ...serverOptions,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import fs from \"fs\";\nimport http from \"http\";\nimport path from \"path\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport dotenv from \"dotenv\";\nimport { logger, Server, ServerOptions, Transport } from '@colyseus/core';\n\n// try to import uWebSockets-express compatibility layer.\nlet uWebSocketsExpressCompatibility: any;\ntry {\n uWebSocketsExpressCompatibility = require('uwebsockets-express').default;\n} catch (e) {}\n\n/**\n * Do not auto-load `${environment}.env` file when using Arena service.\n */\nif (process.env.NODE_ARENA !== \"true\") {\n const envFilename = (process.env.NODE_ENV === \"production\")\n ? \"arena.env\"\n : `${process.env.NODE_ENV || \"development\"}.env`\n\n // return the first .env path found\n const envPath = [\n path.resolve(path.dirname(require?.main?.filename || process.cwd()), \"..\", envFilename),\n path.resolve(process.cwd(), envFilename)\n ].find((envPath) => fs.existsSync(envPath));\n\n if (envPath) {\n dotenv.config({ path: envPath });\n logger.info(`\u2705 ${envFilename} loaded.`);\n } else {\n logger.info(`\u26A0\uFE0F ${envFilename} not found.`);\n }\n}\n\nexport interface ArenaOptions {\n options?: ServerOptions,\n displayLogs?: boolean,\n getId?: () => string,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n}\n\nconst ALLOWED_KEYS: { [key in keyof ArenaOptions]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'getId': \"function\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\"\n};\n\nexport default function (options: ArenaOptions) {\n for (const option in options) {\n if (!ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid option '${option}'. Allowed options are: ${Object.keys(ALLOWED_KEYS).join(\", \")}`);\n }\n if(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\n return options;\n}\n\n/**\n * Listen on your development environment\n * @param options Arena options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen(\n options: ArenaOptions,\n port: number = Number(process.env.PORT || 2567),\n) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\n\n const transport = await getTransport(options);\n const gameServer = new Server({\n ...serverOptions,\n transport,\n });\n await options.initializeGameServer?.(gameServer);\n await options.beforeListen?.();\n\n gameServer.listen(port);\n\n if (options.displayLogs) {\n const appId = options.getId?.() || \"[ Colyseus ]\";\n if (appId) {\n logger.info(`\uD83C\uDFDF ${appId}`);\n }\n\n logger.info(`\u2694\uFE0F Listening on ws://localhost:${port}`);\n }\n return gameServer;\n}\n\n\nexport async function getTransport(options: ArenaOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n options.initializeTransport = Server.prototype['getDefaultTransport'];\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server });\n\n if (options.initializeExpress) {\n // uWebSockets.js + Express compatibility layer.\n // @ts-ignore\n if (transport['app']) {\n if (typeof (uWebSocketsExpressCompatibility) === \"function\") {\n if (options.displayLogs){\n logger.info(\"\u2705 uWebSockets.js + Express compatibility enabled\");\n }\n\n // @ts-ignore\n server = undefined;\n // @ts-ignore\n app = uWebSocketsExpressCompatibility(transport['app']);\n\n } else {\n if (options.displayLogs) {\n logger.warn(\"\");\n logger.warn(\"\u274C uWebSockets.js + Express compatibility mode couldn't be loaded, run the following command to fix:\");\n logger.warn(\"\uD83D\uDC49 npm install --save uwebsockets-express\");\n logger.warn(\"\");\n }\n app = undefined;\n }\n }\n\n if (app) {\n // Enable CORS + JSON parsing.\n app.use(cors());\n app.use(express.json());\n\n await options.initializeExpress(app);\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n }\n\n return transport;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAe;AACf,kBAAiB;AACjB,kBAAiB;AACjB,kBAAiB;AACjB,qBAAoB;AACpB,oBAAmB;AACnB,kBAAyD;AAGzD,IAAI;AACJ,IAAI;AACF,oCAAkC,QAAQ,qBAAqB,EAAE;AACnE,SAAS,GAAP;AAAW;AAKb,IAAI,QAAQ,IAAI,eAAe,QAAQ;AACnC,QAAM,cAAe,QAAQ,IAAI,aAAa,eACxC,cACA,GAAG,QAAQ,IAAI,YAAY;AAGjC,QAAM,UAAU;AAAA,IACd,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,SAAS,MAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,WAAW;AAAA,IACtF,YAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW;AAAA,EACzC,EAAE,KAAK,CAACC,aAAY,UAAAC,QAAG,WAAWD,QAAO,CAAC;AAE1C,MAAI,SAAS;AACT,kBAAAE,QAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC/B,uBAAO,KAAK,UAAK,qBAAqB;AAAA,EAC1C,OAAO;AACH,uBAAO,KAAK,iBAAO,wBAAwB;AAAA,EAC/C;AACJ;AAYA,MAAM,eAAwD;AAAA,EAC5D,eAAe;AAAA,EACf,WAAW;AAAA,EACX,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,gBAAgB;AAClB;AAEe,SAAR,YAAkB,SAAuB;AAC9C,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,aAAa,SAAS;AACzB,YAAM,IAAI,MAAM,0BAAqB,iCAAiC,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,GAAG;AAAA,IAC9G;AACA,QAAG,OAAO,QAAQ,YAAa,aAAa,SAAS;AACnD,YAAM,IAAI,MAAM,2BAAsB,4BAA4B,aAAa,gBAAgB;AAAA,IACjG;AAAA,EACF;AAEA,SAAO;AACT;AAOA,eAAsB,OAClB,SACA,OAAe,OAAO,QAAQ,IAAI,QAAQ,IAAI,GAChD;AACE,QAAM,gBAAgB,QAAQ,WAAW,CAAC;AAC1C,UAAQ,cAAc,QAAQ,eAAe;AAE7C,QAAM,YAAY,MAAM,aAAa,OAAO;AAC5C,QAAM,aAAa,IAAI,mBAAO;AAAA,IAC1B,GAAG;AAAA,IACH;AAAA,EACJ,CAAC;AACD,QAAM,QAAQ,uBAAuB,UAAU;AAC/C,QAAM,QAAQ,eAAe;AAE7B,aAAW,OAAO,IAAI;AAEtB,MAAI,QAAQ,aAAa;AACrB,UAAM,QAAQ,QAAQ,QAAQ,KAAK;AACnC,QAAI,OAAO;AACP,yBAAO,KAAK,cAAO,OAAO;AAAA,IAC9B;AAEA,uBAAO,KAAK,6CAAmC,MAAM;AAAA,EACzD;AACA,SAAO;AACX;AAGA,eAAsB,aAAa,SAAuB;AACtD,MAAI;AAEJ,MAAI,CAAC,QAAQ,qBAAqB;AAC9B,YAAQ,sBAAsB,mBAAO,UAAU;AAAA,EACnD;AAEA,MAAI,UAAmC,eAAAC,SAAQ;AAC/C,MAAI,SAAS,YAAAC,QAAK,aAAa,GAAG;AAElC,cAAY,MAAM,QAAQ,oBAAoB,EAAE,OAAO,CAAC;AAExD,MAAI,QAAQ,mBAAmB;AAG3B,QAAI,UAAU,QAAQ;AAClB,UAAI,OAAQ,oCAAqC,YAAY;AACzD,YAAI,QAAQ,aAAY;AACtB,6BAAO,KAAK,uDAAkD;AAAA,QAChE;AAGA,iBAAS;AAET,cAAM,gCAAgC,UAAU,MAAM;AAAA,MAE1D,OAAO;AACH,YAAI,QAAQ,aAAa;AACrB,6BAAO,KAAK,EAAE;AACd,6BAAO,KAAK,0GAAqG;AACjH,6BAAO,KAAK,kDAA2C;AACvD,6BAAO,KAAK,EAAE;AAAA,QAClB;AACA,cAAM;AAAA,MACV;AAAA,IACJ;AAEA,QAAI,KAAK;AAEL,UAAI,QAAI,YAAAC,SAAK,CAAC;AACd,UAAI,IAAI,eAAAF,QAAQ,KAAK,CAAC;AAEtB,YAAM,QAAQ,kBAAkB,GAAG;AAEnC,UAAI,QAAQ,aAAa;AACrB,2BAAO,KAAK,4BAAuB;AAAA,MACvC;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;",
6
- "names": ["path", "envPath", "fs", "dotenv", "express", "http", "cors"]
4
+ "sourcesContent": ["import fs from \"fs\";\nimport os from \"os\";\nimport http from \"http\";\nimport path from \"path\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport dotenv from \"dotenv\";\nimport { logger, Server, ServerOptions, Transport } from '@colyseus/core';\n\n// try to import uWebSockets-express compatibility layer.\nlet uWebSocketsExpressCompatibility: any;\ntry {\n uWebSocketsExpressCompatibility = require('uwebsockets-express').default;\n} catch (e) {}\n\nconst envFilename = `${process.env.NODE_ENV || \"development\"}.env`;\n\n// return the first .env path found\nconst envPath = [\n path.resolve(path.dirname(require?.main?.filename || process.cwd()), \"..\", envFilename),\n path.resolve(process.cwd(), envFilename)\n].find((envPath) => fs.existsSync(envPath));\n\nif (envPath) {\n dotenv.config({ path: envPath });\n logger.info(`\u2705 ${envFilename} loaded.`);\n} else {\n logger.info(`\u26A0\uFE0F ${envFilename} not found.`);\n}\n\nexport interface ConfigOptions {\n options?: ServerOptions,\n displayLogs?: boolean,\n getId?: () => string,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n}\n\nconst ALLOWED_KEYS: { [key in keyof ConfigOptions]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'getId': \"function\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\"\n};\n\nexport default function (options: ConfigOptions) {\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(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\n return options;\n}\n\n/**\n * Listen on your development environment\n * @param options Application options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen(\n options: ConfigOptions,\n port: number = Number(process.env.PORT || 2567),\n) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\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 // force \"publicAddress\" when deployed on \"Colyseus Cloud\".\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n serverOptions.publicAddress = process.env.SUBDOMAIN + \".\" + process.env.SERVER_NAME;\n\n // when using multiple processes\n if (os.cpus().length > 1) {\n serverOptions.publicAddress += \"/\" + processNumber + \"/\";\n }\n }\n\n const transport = await getTransport(options);\n const gameServer = new Server({\n ...serverOptions,\n transport,\n });\n await options.initializeGameServer?.(gameServer);\n await options.beforeListen?.();\n\n // listening on port\n gameServer.listen(port);\n\n if (options.displayLogs) {\n const appId = options.getId?.() || \"[ Colyseus ]\";\n if (appId) {\n logger.info(`\uD83C\uDFDF ${appId}`);\n }\n\n logger.info(`\u2694\uFE0F Listening on ws://localhost:${port}`);\n }\n return gameServer;\n}\n\n\nexport async function getTransport(options: ConfigOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n options.initializeTransport = Server.prototype['getDefaultTransport'];\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server });\n\n if (options.initializeExpress) {\n // uWebSockets.js + Express compatibility layer.\n // @ts-ignore\n if (transport['app']) {\n if (typeof (uWebSocketsExpressCompatibility) === \"function\") {\n if (options.displayLogs){\n logger.info(\"\u2705 uWebSockets.js + Express compatibility enabled\");\n }\n\n // @ts-ignore\n server = undefined;\n // @ts-ignore\n app = uWebSocketsExpressCompatibility(transport['app']);\n\n } else {\n if (options.displayLogs) {\n logger.warn(\"\");\n logger.warn(\"\u274C uWebSockets.js + Express compatibility mode couldn't be loaded, run the following command to fix:\");\n logger.warn(\"\uD83D\uDC49 npm install --save uwebsockets-express\");\n logger.warn(\"\");\n }\n app = undefined;\n }\n }\n\n if (app) {\n // Enable CORS + JSON parsing.\n app.use(cors());\n app.use(express.json());\n\n await options.initializeExpress(app);\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n }\n\n return transport;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "envPath", "fs", "dotenv", "os", "express", "http", "cors"]
7
7
  }
package/build/index.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  import fs from "fs";
2
+ import os from "os";
2
3
  import http from "http";
3
4
  import path from "path";
4
5
  import cors from "cors";
@@ -10,18 +11,16 @@ try {
10
11
  uWebSocketsExpressCompatibility = require("uwebsockets-express").default;
11
12
  } catch (e) {
12
13
  }
13
- if (process.env.NODE_ARENA !== "true") {
14
- const envFilename = process.env.NODE_ENV === "production" ? "arena.env" : `${process.env.NODE_ENV || "development"}.env`;
15
- const envPath = [
16
- path.resolve(path.dirname(require?.main?.filename || process.cwd()), "..", envFilename),
17
- path.resolve(process.cwd(), envFilename)
18
- ].find((envPath2) => fs.existsSync(envPath2));
19
- if (envPath) {
20
- dotenv.config({ path: envPath });
21
- logger.info(`\u2705 ${envFilename} loaded.`);
22
- } else {
23
- logger.info(`\u26A0\uFE0F ${envFilename} not found.`);
24
- }
14
+ const envFilename = `${process.env.NODE_ENV || "development"}.env`;
15
+ const envPath = [
16
+ path.resolve(path.dirname(require?.main?.filename || process.cwd()), "..", envFilename),
17
+ path.resolve(process.cwd(), envFilename)
18
+ ].find((envPath2) => fs.existsSync(envPath2));
19
+ if (envPath) {
20
+ dotenv.config({ path: envPath });
21
+ logger.info(`\u2705 ${envFilename} loaded.`);
22
+ } else {
23
+ logger.info(`\u26A0\uFE0F ${envFilename} not found.`);
25
24
  }
26
25
  const ALLOWED_KEYS = {
27
26
  "displayLogs": "boolean",
@@ -46,6 +45,14 @@ function src_default(options) {
46
45
  async function listen(options, port = Number(process.env.PORT || 2567)) {
47
46
  const serverOptions = options.options || {};
48
47
  options.displayLogs = options.displayLogs ?? true;
48
+ const processNumber = Number(process.env.NODE_APP_INSTANCE || "0");
49
+ port += processNumber;
50
+ if (process.env.COLYSEUS_CLOUD !== void 0) {
51
+ serverOptions.publicAddress = process.env.SUBDOMAIN + "." + process.env.SERVER_NAME;
52
+ if (os.cpus().length > 1) {
53
+ serverOptions.publicAddress += "/" + processNumber + "/";
54
+ }
55
+ }
49
56
  const transport = await getTransport(options);
50
57
  const gameServer = new Server({
51
58
  ...serverOptions,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import fs from \"fs\";\nimport http from \"http\";\nimport path from \"path\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport dotenv from \"dotenv\";\nimport { logger, Server, ServerOptions, Transport } from '@colyseus/core';\n\n// try to import uWebSockets-express compatibility layer.\nlet uWebSocketsExpressCompatibility: any;\ntry {\n uWebSocketsExpressCompatibility = require('uwebsockets-express').default;\n} catch (e) {}\n\n/**\n * Do not auto-load `${environment}.env` file when using Arena service.\n */\nif (process.env.NODE_ARENA !== \"true\") {\n const envFilename = (process.env.NODE_ENV === \"production\")\n ? \"arena.env\"\n : `${process.env.NODE_ENV || \"development\"}.env`\n\n // return the first .env path found\n const envPath = [\n path.resolve(path.dirname(require?.main?.filename || process.cwd()), \"..\", envFilename),\n path.resolve(process.cwd(), envFilename)\n ].find((envPath) => fs.existsSync(envPath));\n\n if (envPath) {\n dotenv.config({ path: envPath });\n logger.info(`\u2705 ${envFilename} loaded.`);\n } else {\n logger.info(`\u26A0\uFE0F ${envFilename} not found.`);\n }\n}\n\nexport interface ArenaOptions {\n options?: ServerOptions,\n displayLogs?: boolean,\n getId?: () => string,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n}\n\nconst ALLOWED_KEYS: { [key in keyof ArenaOptions]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'getId': \"function\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\"\n};\n\nexport default function (options: ArenaOptions) {\n for (const option in options) {\n if (!ALLOWED_KEYS[option]) {\n throw new Error(`\u274C Invalid option '${option}'. Allowed options are: ${Object.keys(ALLOWED_KEYS).join(\", \")}`);\n }\n if(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\n return options;\n}\n\n/**\n * Listen on your development environment\n * @param options Arena options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen(\n options: ArenaOptions,\n port: number = Number(process.env.PORT || 2567),\n) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\n\n const transport = await getTransport(options);\n const gameServer = new Server({\n ...serverOptions,\n transport,\n });\n await options.initializeGameServer?.(gameServer);\n await options.beforeListen?.();\n\n gameServer.listen(port);\n\n if (options.displayLogs) {\n const appId = options.getId?.() || \"[ Colyseus ]\";\n if (appId) {\n logger.info(`\uD83C\uDFDF ${appId}`);\n }\n\n logger.info(`\u2694\uFE0F Listening on ws://localhost:${port}`);\n }\n return gameServer;\n}\n\n\nexport async function getTransport(options: ArenaOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n options.initializeTransport = Server.prototype['getDefaultTransport'];\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server });\n\n if (options.initializeExpress) {\n // uWebSockets.js + Express compatibility layer.\n // @ts-ignore\n if (transport['app']) {\n if (typeof (uWebSocketsExpressCompatibility) === \"function\") {\n if (options.displayLogs){\n logger.info(\"\u2705 uWebSockets.js + Express compatibility enabled\");\n }\n\n // @ts-ignore\n server = undefined;\n // @ts-ignore\n app = uWebSocketsExpressCompatibility(transport['app']);\n\n } else {\n if (options.displayLogs) {\n logger.warn(\"\");\n logger.warn(\"\u274C uWebSockets.js + Express compatibility mode couldn't be loaded, run the following command to fix:\");\n logger.warn(\"\uD83D\uDC49 npm install --save uwebsockets-express\");\n logger.warn(\"\");\n }\n app = undefined;\n }\n }\n\n if (app) {\n // Enable CORS + JSON parsing.\n app.use(cors());\n app.use(express.json());\n\n await options.initializeExpress(app);\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n }\n\n return transport;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from \"fs\";\nimport os from \"os\";\nimport http from \"http\";\nimport path from \"path\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport dotenv from \"dotenv\";\nimport { logger, Server, ServerOptions, Transport } from '@colyseus/core';\n\n// try to import uWebSockets-express compatibility layer.\nlet uWebSocketsExpressCompatibility: any;\ntry {\n uWebSocketsExpressCompatibility = require('uwebsockets-express').default;\n} catch (e) {}\n\nconst envFilename = `${process.env.NODE_ENV || \"development\"}.env`;\n\n// return the first .env path found\nconst envPath = [\n path.resolve(path.dirname(require?.main?.filename || process.cwd()), \"..\", envFilename),\n path.resolve(process.cwd(), envFilename)\n].find((envPath) => fs.existsSync(envPath));\n\nif (envPath) {\n dotenv.config({ path: envPath });\n logger.info(`\u2705 ${envFilename} loaded.`);\n} else {\n logger.info(`\u26A0\uFE0F ${envFilename} not found.`);\n}\n\nexport interface ConfigOptions {\n options?: ServerOptions,\n displayLogs?: boolean,\n getId?: () => string,\n initializeTransport?: (options: any) => Transport,\n initializeExpress?: (app: express.Express) => void,\n initializeGameServer?: (app: Server) => void,\n beforeListen?: () => void,\n}\n\nconst ALLOWED_KEYS: { [key in keyof ConfigOptions]: string } = {\n 'displayLogs': \"boolean\",\n 'options': \"object\",\n 'getId': \"function\",\n 'initializeTransport': \"function\",\n 'initializeExpress': \"function\",\n 'initializeGameServer': \"function\",\n 'beforeListen': \"function\"\n};\n\nexport default function (options: ConfigOptions) {\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(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\n return options;\n}\n\n/**\n * Listen on your development environment\n * @param options Application options\n * @param port Port number to bind Colyseus + Express\n */\nexport async function listen(\n options: ConfigOptions,\n port: number = Number(process.env.PORT || 2567),\n) {\n const serverOptions = options.options || {};\n options.displayLogs = options.displayLogs ?? true;\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 // force \"publicAddress\" when deployed on \"Colyseus Cloud\".\n if (process.env.COLYSEUS_CLOUD !== undefined) {\n serverOptions.publicAddress = process.env.SUBDOMAIN + \".\" + process.env.SERVER_NAME;\n\n // when using multiple processes\n if (os.cpus().length > 1) {\n serverOptions.publicAddress += \"/\" + processNumber + \"/\";\n }\n }\n\n const transport = await getTransport(options);\n const gameServer = new Server({\n ...serverOptions,\n transport,\n });\n await options.initializeGameServer?.(gameServer);\n await options.beforeListen?.();\n\n // listening on port\n gameServer.listen(port);\n\n if (options.displayLogs) {\n const appId = options.getId?.() || \"[ Colyseus ]\";\n if (appId) {\n logger.info(`\uD83C\uDFDF ${appId}`);\n }\n\n logger.info(`\u2694\uFE0F Listening on ws://localhost:${port}`);\n }\n return gameServer;\n}\n\n\nexport async function getTransport(options: ConfigOptions) {\n let transport: Transport;\n\n if (!options.initializeTransport) {\n options.initializeTransport = Server.prototype['getDefaultTransport'];\n }\n\n let app: express.Express | undefined = express();\n let server = http.createServer(app);\n\n transport = await options.initializeTransport({ server });\n\n if (options.initializeExpress) {\n // uWebSockets.js + Express compatibility layer.\n // @ts-ignore\n if (transport['app']) {\n if (typeof (uWebSocketsExpressCompatibility) === \"function\") {\n if (options.displayLogs){\n logger.info(\"\u2705 uWebSockets.js + Express compatibility enabled\");\n }\n\n // @ts-ignore\n server = undefined;\n // @ts-ignore\n app = uWebSocketsExpressCompatibility(transport['app']);\n\n } else {\n if (options.displayLogs) {\n logger.warn(\"\");\n logger.warn(\"\u274C uWebSockets.js + Express compatibility mode couldn't be loaded, run the following command to fix:\");\n logger.warn(\"\uD83D\uDC49 npm install --save uwebsockets-express\");\n logger.warn(\"\");\n }\n app = undefined;\n }\n }\n\n if (app) {\n // Enable CORS + JSON parsing.\n app.use(cors());\n app.use(express.json());\n\n await options.initializeExpress(app);\n\n if (options.displayLogs) {\n logger.info(\"\u2705 Express initialized\");\n }\n }\n }\n\n return transport;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["envPath"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colyseus/tools",
3
- "version": "0.15.0-preview.0",
3
+ "version": "0.15.0-preview.2",
4
4
  "description": "Colyseus Tools for Production",
5
5
  "input": "./src/index.ts",
6
6
  "main": "./build/index.js",
@@ -43,5 +43,5 @@
43
43
  "publishConfig": {
44
44
  "access": "public"
45
45
  },
46
- "gitHead": "1d92776bafdf2df630290f0b5254bc32dff6d25c"
46
+ "gitHead": "21281895a89e9f5091ad4042c173dd165c270b98"
47
47
  }